今回は、ディープラーニングにおける「学習」について整理する。
簡単に言うと学習とは、正解の分かっている「学習データ」をニューラルネットワークに入れ、正解になるようにニューロンのパラメーターを調節していくことだ。
まず初期状態として、ネットワーク内の全てのニューロンの重みやバイアスといったパラメーターが、全てゼロであるとする。全てゼロなので、出力もゼロになっている。ここに学習データを入力層として入れる。このとき、出力は、正解として望む値になっていなければならない。ある1つの出力層のニューロンを正解に近づけるためには、そのニューロンから見て、入力層までのニューロンの個々の重みとバイアスを調整していく。
これだと漠然としすぎているので、学習データのうち1つを入れたとき、正解は分かっているので、それを目標値とする。すると、その時点の出力層のニューロンの出力値と目標値との差が誤差であり、この誤差が最小になるように調整する必要があるわけだ。逆に言うと、ほかの出力層のニューロンは、不正解を示す状態になっている必要がある。こうしたニューラルネットワークの現時点での「誤差」(正解との隔たり)を表現する必要がある。1つのパラメーターに集約するのは、主に計算の都合である。全体の状態を1つのパラメーターで表現できる方が、以後の計算が行いやすいからだ。
学習とは、この誤差パラメーターを最小にするということだ。本来の意味としてはゼロにすることが望ましいが、前回説明したようなシグモイドニューロンでは、出力は0~1の間の値で、出力層のニューロンは、個々の正解の確からしさを表現していることになる。例えば「犬と猫の画像認識ニューラルネットワーク」ならば、出力層には、画像が犬である確率を示すニューロンとネコであることを示すニューロンがある。
ユーザーが望むのは犬の画像を入れれば「犬ニューロン」の出力が大きくなって、高い値を示し、ネコニューロンは低い値を示すことだ。このため例えば、正解として犬の画像なら犬ニューロンが0.5よりも大きな値に、ネコニューロンは0.5よりも小さな値にするという目標を立てることになる。もちろん、犬の画像を見せたときに0.9などの大きな値を示すのは構わないとすると、正解の範囲は広く、結果として誤差パラメーターは最小値であればよく、必ずしもゼロになる必要はないと考えられる。
実際には、誤差パラメーターとして「コスト関数」と呼ばれるものを定義する。コスト関数は、統計などでいう「平均2乗誤差」の式だ。
さらに、個々のニューロンに関しては、入力と出力の間には予め定義した関係があり、入力から出力までを一連の連立方程式で表現できる。
構成されたニューラルネットワークの出力側から入力層までのニューロンの接続を見ていくことで、コスト関数は結局多数の連立方程式となる。コスト関数が最小値になるように方程式を解いていくのが「学習」である。ただし、この方程式は、人がやるように式を変形して解くことはできない。複雑な連立方程式なので、人手による代数学的な方法は困難なのである。