はじめに
現在オライリー社のゼロから作るDeepLearningを読みながら勉強しています。
今まで読んだ技術書で一番分かりやすい(今までそんなに量読んでないですがw)のですが
後半に行くと難しいなあと思うことが増えてきたので自分用に一旦整理。
5章の誤差逆伝播法のところまでです。
ざっくり流れ
サンプルと同じTwoLayerNet(入力層1,隠れ層1,出力層1の場合でサンプルのMNISTを使う)場合
データ読み込み
訓練データ&テストデータの入力用&正解データを読み込み
ミニバッチ
訓練データの中から一部のデータをランダムに取り出す
ここでは60000個のデータから100個取り出して同時に処理する(重複あり,np.random.choiceの第二引数をreplace=Falseにすると重複なし)
というのを10000回繰り返す
パラメータ用意
ディレクショナリ配列paramを宣言
Wは重み、
bはバイアス
Wは0~1のランダムな数(ガウス分布)
bは0を格納
形状(一次元目、二次元目の数)はそれぞれ
'W1' = 入力層の数,隠れ層の数
'b1' = 隠れ層の数
'W2' = 隠れ層の数,出力層の数
'b2' = 出力層の数
レイヤの生成
逆伝播時のために順番付きディレクショナリ配列layerを作成
クラスには順伝播時、逆伝播時の関数が用意されている
順伝播時は宣言した順番通りに処理、逆伝播時は逆の順序で処理する
'Affine1' = アフィン計算クラス(入力層→隠れ層の内積 + バイアス)
'Relu1' = Relu関数(Affine1にRelu関数で計算)
'Affine2' = アフィン計算クラス(隠れ層→出力層の内積 + バイアス)
変数lastLayer = ソフトマックス関数&損失関数を求めるSoftmax-with-Lossクラス
フォワード処理
Affine1 → Relu1 → Affine2 → Softmax-with-Loss
勾配の計算
Softmax-with-Lossで算出された誤差を使用して
重みとバイアスに対する勾配を計算
数値微分もしくは誤差逆伝播法で求める
パラメータの更新
重みとバイアスのパラメータを勾配方向に微小量だけ更新する
params -= 勾配 * 学習率
繰り返し
フォワード処理に戻って繰り返す
損失関数をグラフで表したりする際はこの時に配列に値を格納する