17 DeepLearning 誤差逆伝播法の実装

17.1 ニューラルネットワークの学習の全体図

学習手順は下記のようになる。

前提

ニューラルネットワークは、適応可能な重みとバイアスがあり、この重みとバイアスを訓練データに適応するように調整することを「学習」と呼ぶ。ニューラルネットワークの学習は次の4つの手順で行う。

ステップ1(ミニバッチ)

訓練データの中からランダムに一部のデータを選び出す。

ステップ2(勾配の算出)

各重みパラメータに関する損失関数の勾配を求める。

ステップ3(パラメータの更新)

重みパラメータを勾配方向に微小量だけ更新する。

ステップ4(繰り返す)

ステップ1、ステップ2、ステップ3を繰り返す。

誤差逆伝播法を使用するのは、ステップ2の勾配の算出である。数値微分のみを使用する順方向の勾配の算出法は簡単に実装できる反面、計算に多くの時間がかかる。よって、誤差逆伝播法を用いる。

17.2  誤差逆伝播法に対応した
ニューラルネットワークの実装

TwoLayerNet クラスのインスタンス変数

インスタンス変数 説明
params ニューラルネットワークのパラメータを保持するディクショナリ変数。params[‘W1’]は1層目の重み、params[‘b1’]は1層目のバイアス。
params[‘W2’]は2番目の重み、params[‘b2’]は2層目のバイアス。
layers ニューラルネットワークのレイヤを保持する順番付きディクショナリ変数。layers[‘Affine1’],layers[‘Relu1’],layers[‘Affine2’]といったように順番付きディクショナリで各レイヤを保持する。
lastLayer ニューラルネットワークの最後のレイヤ。この例では、SoftMaxWithLossレイヤ。

TwoLayerNet クラスのメソッド

メソッド 説明
__init__(self,input_size, hidden_size, output_size, weight_init_std) ニューラルネットワークのパラメータを保持するディクショナリ変数。params[‘W1’]は1層目の重み、params[‘b1’]は1層目のバイアス。
params[‘W2’]は2番目の重み、params[‘b2’]は2層目のバイアス。
predict(self, x) ニューラルネットワークのレイヤを保持する順番付きディクショナリ変数。layers[‘Affine1’],layers[‘Relu1’],layers[‘Affine2’]といったように順番付きディクショナリで各レイヤを保持する。
loss(self, x, t) 損失関数の値を求める。引数のxは画像データ、tは正解ラベル
accuracy(self, x, t) 認識精度を求める。
numerical_gradient(self, x, t) 重みパラメータに対する勾配を数値微分によって求める。(順伝播 参考として載せるのみで使用しない。)
gradient(self, x, t) 重みパラメータに対する勾配を誤差逆伝播法によって求める。

OrderedDict()についてはPythonのOrderedDictの使い方を参照。

two_layer_net.py

train_neuralnet.py

出力は下図のようになる。

こちらのgithubにフルコードがあります。