今回は、ディープラーニングにおける「学習」について整理する。

 簡単に言うと学習とは、正解の分かっている「学習データ」をニューラルネットワークに入れ、正解になるようにニューロンのパラメーターを調節していくことだ。

 まず初期状態として、ネットワーク内の全てのニューロンの重みやバイアスといったパラメーターが、全てゼロであるとする。全てゼロなので、出力もゼロになっている。ここに学習データを入力層として入れる。このとき、出力は、正解として望む値になっていなければならない。ある1つの出力層のニューロンを正解に近づけるためには、そのニューロンから見て、入力層までのニューロンの個々の重みとバイアスを調整していく。

 これだと漠然としすぎているので、学習データのうち1つを入れたとき、正解は分かっているので、それを目標値とする。すると、その時点の出力層のニューロンの出力値と目標値との差が誤差であり、この誤差が最小になるように調整する必要があるわけだ。逆に言うと、ほかの出力層のニューロンは、不正解を示す状態になっている必要がある。こうしたニューラルネットワークの現時点での「誤差」(正解との隔たり)を表現する必要がある。1つのパラメーターに集約するのは、主に計算の都合である。全体の状態を1つのパラメーターで表現できる方が、以後の計算が行いやすいからだ。

 学習とは、この誤差パラメーターを最小にするということだ。本来の意味としてはゼロにすることが望ましいが、前回説明したようなシグモイドニューロンでは、出力は0~1の間の値で、出力層のニューロンは、個々の正解の確からしさを表現していることになる。例えば「犬と猫の画像認識ニューラルネットワーク」ならば、出力層には、画像が犬である確率を示すニューロンとネコであることを示すニューロンがある。

 ユーザーが望むのは犬の画像を入れれば「犬ニューロン」の出力が大きくなって、高い値を示し、ネコニューロンは低い値を示すことだ。このため例えば、正解として犬の画像なら犬ニューロンが0.5よりも大きな値に、ネコニューロンは0.5よりも小さな値にするという目標を立てることになる。もちろん、犬の画像を見せたときに0.9などの大きな値を示すのは構わないとすると、正解の範囲は広く、結果として誤差パラメーターは最小値であればよく、必ずしもゼロになる必要はないと考えられる。

 実際には、誤差パラメーターとして「コスト関数」と呼ばれるものを定義する。コスト関数は、統計などでいう「平均2乗誤差」の式だ。

図1●求める正解(例えば、ある出力が0.5以上など)を定めれば、現在の値(初期値に全てゼロを使い学習データを入力)との誤差を算出できる。計算的な理由から誤差を1つの式で表現する
図1●求める正解(例えば、ある出力が0.5以上など)を定めれば、現在の値(初期値に全てゼロを使い学習データを入力)との誤差を算出できる。計算的な理由から誤差を1つの式で表現する
[画像のクリックで拡大表示]

 さらに、個々のニューロンに関しては、入力と出力の間には予め定義した関係があり、入力から出力までを一連の連立方程式で表現できる。

図2●全てのニューロンの入力と出力には、あらかじめ定義した関係があり、入力から出力までを一連の連立方程式で表現できる。これと、コスト関数が最小という条件を組み合わせて方程式を解く。解法は数値演算的に行い、コスト関数が最小になるようにニューロンの重みやバイアス値をわずかに変えながら計算を繰り返していく
図2●全てのニューロンの入力と出力には、あらかじめ定義した関係があり、入力から出力までを一連の連立方程式で表現できる。これと、コスト関数が最小という条件を組み合わせて方程式を解く。解法は数値演算的に行い、コスト関数が最小になるようにニューロンの重みやバイアス値をわずかに変えながら計算を繰り返していく
[画像のクリックで拡大表示]

 構成されたニューラルネットワークの出力側から入力層までのニューロンの接続を見ていくことで、コスト関数は結局多数の連立方程式となる。コスト関数が最小値になるように方程式を解いていくのが「学習」である。ただし、この方程式は、人がやるように式を変形して解くことはできない。複雑な連立方程式なので、人手による代数学的な方法は困難なのである。