『ゼロから作るDeep Learning 』読書ノート(現在進行形)
0章「まえがき」
1章「Python入門」
2章「パーセプトロン」
3章「ニューラルネットワーク」
4章「ニューラルネットワークの学習」
5章「誤差逆伝播法」(今回はここ!)
4章「ニューラルネットワークの学習」では、
学習とは、データから重みパラメータの値を自動で決定すること
と定義されていた。
前回はサラッと流したが、
改めて考えれば、
一般的にいう「学習」(*1)とは、ぜんぜん意味が違うことに気づく。
機械学習も、コンピュータが勝手に学習してなんでもできるようになる、
という勘違いが一部にあり、
それがひいては、
AIはなんでもできるような話になってしまうのだが、
ここでいう学習とは極めて限定的な定義なのだ。
そして、
その定義に基づいた学習の手順は、
次の4つからなる。
1.ミニバッチ 訓練データからランダムに一部のデータを選び出す。
2.勾配の算出 ミニバッチの損失関数を減らすため、各重みパラメータの勾配を算出する。方法は、①数値微分、②誤差逆伝播法(本章で解説)
3.パラメータの更新 重みパラメータを勾配方向に微少量だけ更新する。SGD(確率的勾配降下法)を使用。
4.繰り返す 1〜3を繰り返す。
今回、この章では、
手順2の誤差逆伝播法を、
「計算グラフ」という手法を使って、ていねいに解説している。
視覚的に理解が可能という計算グラフは、
文系頭にもすんなり入ってくる。
キモである
「局所的な計算」や、
合成関数の微分の「連鎖律」が、
計算グラフではひじょうにわかりやすい。
さらに、
ニューラルネットワークの機能ごとに、
「層(レイヤ)」にまとめ、
それを、
「クラス」で実装するのもポイントだ(p10ー11に解説あり)。
なお、ここらへんの考え方は、
『オブジェクト指向でなぜつくるのか第2版」
に詳しい。
最終的に、
各種レイヤを組み合わせ、
2層のニューラルネットワークを実装する。
この膨大な(わたしにとって)コードを読み解くのは宿題にして、
レイヤとして「モジュール化」(*2)することで、
5層、10 層、20 層・・・と大きなネットワークを
まるでレゴブロックを組み立てるように、
かんたんにつくることができる、
というのはすごいと思った。
さて、
3〜5章にわたってくわしく解説されてきた
ニューラルネットワーク。
量は多いが読み返すたびに気づきがある。
何度も何度も読み返したい。