今回もよろしくお願いします!
引き続き「音響モデル」について学びます。
第6回では、現在主流になりつつある
深層学習モデルについて説明します。
この記事は主に、
- NN(ニューラルネットワーク)
- MLP(多層パーセプトロン)
- RNN(再帰型ニューラルネットワーク)
- DNN(深層学習)
- LSTM(長・短期記憶)
という言葉が出てきます。
1. ニューラルネットワークについて
深層学習を理解するためにはまず、その基本構造であるニューラルネットワーク(Neural Network; NN)について理解する必要があります。
本シリーズは音声認識に関する基礎知識を記載しています。そのため、ニューラルネットワークについても詳しい解説(特に数式)は省略した簡単な説明となります。(ニューラルネットワークや深層学習の仕組みについて記事がある場合はリンクを貼ります。)
ニューラルネットワークについて、以下の2点の特徴を説明していきます。
- MLP構造
- 学習方法
1.1 MLP(多層パーセプトロン)構造
ニューラルネット(神経網)という技術は、機械の計算処理を向上させるため、人間や動物の脳の構造を取り入れようとする試みの中で生まれました。(実際の脳神経とは厳密には異なるため「人工ニューラルネットワーク」と呼ばれることもあります)
では、ニューラルネットワークの構造と簡単な計算について説明します。
このニューラルネットワークの構造は多層パーセプトロン(multi-layer perceptron;MLP) と呼びます。比較的単純な構造なので、MLPを例としてニューラルネットワークを簡単に説明します。
<ニューラルネットワークの構造>
- 上のような図(○(丸)はユニット、→(矢印)をエッジと呼ぶ)で構成される構造
- ユニットの行は層と呼ぶ
- ユニットの層は入力層、隠れ層、出力層に分類される(入力層、出力層は1層のみ)
- 入力、出力は一方向に行われる
- 各ユニットには活性化関数が設定される
- 入力に対してユニットが活性化(発火)すると出力する
1.2 MLPの学習方法
ニューラルネットワークの構造で紹介した活性化関数は、ユニットへ入力されたデータを次のユニットへ出力するかどうかを判断するための計算を行います。
活性化関数の計算には重み(バイアス、パラメータ) があります。より精度の良い出力にするため、重みを変更する処理は「学習」と呼びます。MLPの学習は訓練データを用いて行われる「教師あり学習」によって重みを変更していきます。
教師データは簡単に説明すると、入力データに正解(正しい出力)のラベルが付加されたデータです。従って、入力データを正しく出力できたかどうか答え合わせをし、精度の誤差から各ユニットの重みを調整します。
1.3 ニューラルネットワークを用いた音声認識
ニューラルネットワーク(NN)という技術が生まれてから、音声認識に適用する試みは数多く行われました。NNの技術は、音声認識のこれまでの技術に比べある部分の実験では良い精度となりました。深層学習という技術が登場するまで、NNモデルそのものだけでなく、NNはHMMに追加することで精度向上に利用されることもありました。
ここで、NNを用いた音声認識の具体的な一例を挙げます。
再帰型ニューラルネットワーク(Recurrent neural network; RNN)
音声は時系列信号であり、フレームごとの特徴ベクトルで表現されます。そして、隣接する音声フレームの間には強い相関があります。つまり、音声データは時間による関係が重要であるということです。ところが、従来のHMMは切り取る音声フレームの長さ(窓関数による切り出しです。第2回記事参照)をなるべく小さくする必要があります。よって、単語の長さ程度の時間に渡る相関を表現できません。RNNは、長時間に渡る音声の相関をそのまま入力として用いるために考案されたモデルです。
RNNは、あるユニット間に有向な閉路(ループ)を持つNNの総称です。RNNでは、ある時刻の出力は過去のすべての時刻の入力に依存しています。隠れ層の閉路によって、時間によって隠れ層の深さを変えることが出来ました。
時間遅れニューラルネットワーク(Time-delay neural network; TDNN)
TDNNは、複数時刻の音声フレーム(音素)をまとめて入力します。ある音声フレームの特徴量を計算してから、ニューラルネットワークに入力するまでに遅れがあるため、このような名前となっています。
TDNNは、2次元スペクトログラム画像を入力とし、2段階のユニット層を経て出力を行うNNモデルです。(この画像から認識を行うNNモデルは一般的にCNNと呼ばれますが、ここでは説明しません。補足するか記事作成するかは未定)
TDNNは3音素の識別実験において、識別率が当時のHMMの識別率93.7%を上回る98.5%となりました。しかし、
- 音声を事前に、人手で音素ごとに切り出したデータでないと入力できない(識別できない)
- 連続音素認識へ拡張できない
という問題から、実用性がないとして音声認識の主流技術とはなりませんでした。しかし、この技術が応用され、深層学習による高精度の音声認識を可能にしました。
2 深層学習を用いた音声認識
深層学習とは、深層ニューラルネットワーク(Deep Neural Network; DNN)構造を持つモデルによる識別技術です。DNNは、隠れ層を2つ以上持つMLP構造を指します。
NNは、ユニット数が増える程計算量が増加します。ユニットごとの活性化関数の処理やエッジの数も増えるからです。しかし、近年になって計算機技術の進歩、大規模データベースが整備されました。結果として、NNの規模を大きくしても計算が追いつくようになりました。そして、DNNは従来のHMMをはるかに上回る性能を上げました。
2.1 ニューラルネットワークの問題と改善
深層ニューラルネットワークは、NNでの音声認識の際問題となった部分に対策しつつ、性能を上げる応用的な技術です。では、NNにはどのような問題が起きていたのでしょうか。
NNの段階で層を増やすことは、計算量の増加以外にも問題がありました。 勾配消失と呼ばれる問題です。
- 勾配消失 隠れ層を増やしていくと、教師データによる重みの更新において、下の層に行くに従い伝播される誤差が小さくなってしまうという問題です。誤差が小さくなってしまうと、下の層のユニットほど精度の良い計算が出来なくなります。
DNNを実現するには、この重みの更新をより正確に行う必要がありました。
DNNでは、勾配消失の問題を軽減するため、事前学習と呼ばれる手法によって重みの初期化を行います。また、最近ではReLU関数を活性化関数として用いるのが主流の対策となっています。
DNNのための事前学習
DNNでは、隠れ層の数を増やしていきます。しかし、隠れ層を増やすと教師データが伝播しなくなってしまいます。そこで、単層のニューラルネットワークを構築し、学習を行い、それを積み重ねるという方法が用いられるようになりました。これが事前学習です。
DNNのための活性化関数
また、最近主流になっている、ReLU関数の適用についても説明します。ReLU関数は、活性化関数の一種です。
上でも説明したとおり、活性化関数はユニットへ入力されたデータを次のユニットへ出力するかどうかを判断するための計算を行う関数です。
ユニットから次のユニットへデータを出力する仕組みが元の発想であるニューロンの活性化の役割を持つため、活性化関数と呼ばれます。
代表的な関数としてステップ関数、シグモイド関数があります。違いを見るためにこれらの関数についても少し説明しますね。
ステップ関数
見た目が階段(ステップ)のように見えることから、ステップ関数と呼ばれています。
とてもわかりやすいですね。
0を超えたら1を出力し、それ以外は0を出力する関数です。
シグモイド関数
ステップ関数の出力が0か1かしかないという部分を改良するため適用された関数がシグモイド関数です。ニューラルネットワークで非常に良く用いられています。
シグモイド関数は下の図のように表されます。
先ほどと違い、0以下の値でも出力があることがわかりますね。
そして、ステップ関数と比べて形が滑らかです。つまり、連続値を出力することが出来ます。
ステップ関数が0か1のどちらかの値しか返さないのに対して、シグモイド関数は0.731...や0.880...など、実数を出力します。
ステップ関数は入力が小さくても0を超えた時点で必ず1を返すため、その入力値がどの程度大きいのかがわかりませんでした。
シグモイド関数は入力が大きいほど1に限りなく近い値を出力します。これにより、入力値の重要度(1に近いほど重要な入力である)がわかるようになったのです。
ステップ関数よりも画期的であるため、ニューラルネットワークの歴史において、シグモイド関数は古くから利用されて来ました。
ReLU関数
そして、最近ではReLU(Rectified Linear Unit)関数が主流となりました。まずは図を載せます。
ステップ関数、シグモイド関数との大きな違いとして、値の上限が1ではないことがあります。
ReLU関数は、入力が0を超えていれば、入力をそのまま出力し、0以下ならば0を出力する関数です。
シグモイド関数より簡単になり、プログラムもとてもシンプルにできる様になりました。こちらのほうが主流となったのは、逆伝播に強いという利点があるからです!
シグモイド関数は、入力値が0以下の値でも出力がありました。これは、ステップ関数より滑らかな値を表現できる代わりに、学習時の逆伝播では0以下の入力値の際も下流に信号を出力してしまいます。
また、ステップ関数、シグモイド関数は入力値を0から1の間の値に変換して出力していました。
結果として入力値との誤差が発生すると下流のユニットの値が不安定になってしまいます。
一方ReLU関数は、順伝播時に入力が0より大きい場合、逆伝播ではそのままの値を上流から下流へ流します。また、入力が0以下であれば逆伝播では下流への信号はそこでストップします。
誤差が発生しないため、勾配消失の対策としてよい効果を発揮できるのです。
意外とシンプルなものの方が良い結果が出ることもあるんですね。
この事前学習という手法と新たな活性化関数の適用、計算機の性能向上によって、DNNは従来のHMM以上の精度をあげることが出来る様になりました。
では、音声認識に用いられる深層学習モデルの一例を以下に紹介します。
LSTM(長・短期記憶)
長・短期記憶(Long Short-term Memory; LSTM)は、RNNの応用で、過去の時刻における入力の影響を減衰させず、長時間に渡って現象をモデル化できる様になりました。LSTMではメモリユニットと呼ばれる要素を基本単位としており、それをRNNの隠れ層のユニットに置き換えて用いています。
(メモリがM、5つのユニット(A, B, I, F, O), 3つのゲート(入力ゲート、忘却ゲート、出力ゲート)と、それらの結合から構成されます。)
RNNのユニットに対応しているのがAで、時刻tの下層からの出力と、時刻t-1の隠れ層におけるほかのメモリユニットからの出力をある結合重みで重み付けた信号が入力されます。
それぞれのゲートによってモデルの制御を行っています。入力ゲートでは入力データをメモリへ入力するかどうかを制御します。忘却ゲートでは、メモリMにおいて前時刻の状態をどの程度記憶するかを制御しています。また、出力ゲートでは、出力を制御する機能をもちます。
この構造によって、音声データを状態ごとに分割する作業が必要なくなり、時系列データの特性を活かしたデータとして入力することが可能になりました。音声データがよりそのままの状態に近いため、精度も向上しました。
まとめ
『深層学習は、ニューラルネットワークを応用したモデルであり、計算技術の向上によってより良い精度を上げられた。DNNによって、音声データをよりよい精度で認識できるようになった』 という記事でした。
機械学習プロフェッショナルシリーズ「音声認識」, 篠田浩一, 講談社
IT Text 音声認識システム(改定2版) , 川原達也, オーム社
[参考サイト] - 音声処理で参考になったサイトまとめ
次回について
さて、「音声認識の基礎」シリーズについてはここで終了です。
次回からはこれまでの知識を実際に活用して、音声認識プログラムを構築してみたいと思います! プログラミング言語はPythonです。
引き続き、よろしくお願いします!