学習のやり方

この重みの変更であるが、重みを変えると、出力がどれだけ変わるかという傾きを計算し、誤差が小さくなるように重みを変更する。こう書くと簡単であるが、重みの数は、ニューロンの数の100倍のオーダーである。また、1つの重みの変更だけで誤差を最小にしようとすると、他の重みの出番が無くなってしまうという過剰な変更になり、他の画像ではうまく行かなくなってってしまう。このため、それぞれの重みの変更量は、誤差を最小にする値の1/10000とかいう小さい学習率を掛けて適用し、これを繰り返して、全体として誤差を小さくしていく。また、学習が進むに連れて学習率を下げるということも行われる。

学習では、重みの変更に対する誤差の減少の傾きを計算し、誤差が小さくなるように重みを変更する

1つの画像の学習でも大量の重みの変更を計算する必要があるが、学習には数万~数百万枚の画像を使うので、全体の計算量は膨大で、GPUを使っても何日も掛かる場合がある。

これを高速化するため、通常は、画像を1枚ずつ処理するのではなく、32画像とか1024画像をまとめ、全画像の誤差の傾きの平均値を使って重みを変更するという方法が使われる。

1画像ずつ処理すると、この処理はマトリクス×ベクトルの計算であるが、このようにまとめて処理すると、マトリクス×マトリクスの計算となり、処理性能が上がる。このように入力データをまとめたものをミニバッチと呼ぶ。

マトリクス×ベクトルの計算が,32~1024画像を一まとめにしてミニバッチとして処理すると、マトリクス×マトリクスの計算になり、効率が上がる

ニューラルネットワークによる画像認識では、次の図のように、元の画像の比較的小さな領域(例えば11×11ピクセル)のデータをLayer 1のニューロンに入力する。そして、例えばx方向に4ピクセルずらせた小領域の画像を、Layer 1のx方向の隣のニューロンに入力し、同様にy方向に4ピクセルずらせた小領域の画像をy方向に隣接したニューロンに入力するというやり方でLayer 1の全部のニューロンに入力を接続する。

各層の厚みは、その層のニューロンが出力するベクトルの要素数を表している。ディープラーニング躍進の始まりとなった2012年のImageNetコンペで優勝したAlexNetの場合、Layer 1の入力ベクトルは3要素であるが、出力ベクトルは48要素になっている。Layer 2は、Layer 1の5×5の小領域のデータを入力とし、128要素のLayer 2の出力ベクトルを生成するという形になっている。

そして、次の図のように、このようなニューロン層を重ねてネットワークを作る。

ニューラルネットワークは、下層からの出力の小領域を、上の層の1つのニューロンに接続する。この出力はベクトルで、要素数が各層の厚みで表現されている

学習のためには、この画像は何を表しているかという正解(教師)を教えてやることが必要で、正解に近づくように重みを変更して行く。