ニューラルネットワークと学習

次の図は3層の多層パーセプトロンを示すものである。この図では、入力層と出力層は3つのノードを持ち、隠れ層は2つのノードを持つ。そして、層の間の接続はそれぞれの重みをもち、信号の伝達は矢印で示される方向だけに行われる。

3層の多層パーセプトロンの例

2層目の出力Y1とY2の計算は、それぞれの入力に重みを掛けて総和をとるので、次の上側の図のようになる。そして、下の図は、2層目の出力を入力として3層目の出力を計算する式である。

上は2層目の出力の計算、下は3層目の出力を計算するベクトルと行列の積

この多層パーセプトロンが望むような動作をするためには、重みWに適切な値を設定してやる必要がある。この設定のやり方が学習で、次の図に示すように、ある画像を入力して出力Zを計算し、正解(教師データ)Z'と差を小さくするように各入力の重みW1とW2を調整していく。

出力Zが正解Z'と近くなるように,重みW1とW2を調整して行く

重みの調整には勾配降下法が用いられる。次の図は横軸が重みの値で、縦軸が誤差である。重みと誤差の関係が、この図のようになっている場合、現在の重みの値から重みを減少させれば誤差は小さくなる。

重みと誤差の関係がこの図のようになっている場合は、重みの値を減らせば誤差が減る

重みと誤差の関係の全貌は分からないのであるが、現在の重みの値の所で誤差カーブの傾きが負なら重みを増やせば誤差は減り、誤差カーブの傾きが正なら重みを減らせば誤差が減る。このように現在の値の場所での誤差カーブの傾きに応じて重みを調整して行く方法を勾配降下法という。

現在の重みの値のところで誤差カーブの傾きを求め、傾きが負なら重みを増やし、正なら重みを減らせば誤差が減る

なお、この図では、Wは1つの変数で書かれているが、前に挙げた多層パーセプトロンの図でも12個の重みがある。勾配降下法では、これらすべての重みのそれぞれに対する誤差カーブの傾きを求めて、それぞれの重みを調整していく。

そして、重みの調整量は傾きに依存するが、それだけではなく、傾きに学習率という値を掛ける。そして、学習が進んで誤差が小さくなると、この学習率を小さくしていく。

重みの調整量は学習率を掛けて調整し、誤差が小さくなると学習率を小さくして行く

誤差カーブが下向きに突のカーブであれば良いが、次の図のように上向きに突の部分があると、次の図のように、勾配降下法ではゴールと書かれたローカルミニマムにつかまってしまい本当の最適解には到達できないということが起こり得る。

誤差カーブに上向きに突の部分があると、局所解に捕まって最適解にならないことが起こり得る

前述のように、重みの調整のためには、現在の重みの値における誤差カーブの傾きを求める必要がある。このやり方は、次の図に示すように、まず、出力の誤差を最終の層Nにフィードバックして誤差値のYに対する傾きΔYを求め、Yの重みWに対する傾きΔWとYの入力Xに対する傾きΔXを求める。YはWとXの積の和であるので、これは簡単に求めることができる。

次に、層Nの前の(この図では)層2の出力が層Nの入力に繋がっているので、層2の出力が分かる。そして、層2の出力YのXとWに対する傾きは、層Nの場合と同様に、簡単に求めることができる。

このように出力層から入力層に向かって影響を伝播させていくので、このやり方は逆伝播(Backward Propagation)と呼ばれている。

そして、層1のWに対する出力の傾きに層2の入力Xに対する出力の傾きを掛けると、層1のWに対する層2の出力Yの傾きが求められ、さらに層Nの入力Xに対する出力の傾きを掛けると、層1のWに対する層Nの出力の傾きが求まる、というように、すべての層の重みWに対する誤差の傾きを計算することができる。

出力層から入力層まで逆方向に影響を伝えて、各層の重みWに対する出力の傾きと入力Xに対する出力の傾きを求める

この重みの調整を教師画像1枚ごとに行うのが基本であるが、教師画像が多い場合には計算が大変である。そのため、数10~数100枚の画像を一まとめにして、その重みに対する傾きの平均値を使って調整を行うという方法が採られる。この一まとめの単位をミニバッチと呼ぶ。

また、1枚の教師画像についての計算は、行列×ベクトルの計算になり、メモリアクセスの回数が多くてGPUの演算能力をフルに発揮できないが、ミニバッチにすると、行列×行列の計算となってGPUの演算性能が上がるというメリットがある。

数十~数百枚程度の画像をミニバッチとしてまとめて計算し、その平均値で重みへのフィードバックを行う

次回は2月24日に掲載予定です。