前回はChainクラスについて書きました。Chainクラスを使えば、訓練データを与えることで損失関数をパラメータで微分した値が求まります。
次にやりたいことは、微分値を元にしてパラメータの更新を行うことです。(パラメータの推定がニューラルネットワークの鍵)
optimizersオブジェクトは、パラメータを更新して最適化するという処理をやってくれます。
#optimizers
例えば、確率的勾配降下法(SGD)でパラメータを最適化するとします。
model = MyChain()
optimizer = optimizers.SGD()
optimizer.setup(model)
最適化アルゴリズムとしてSGDを選択してあげたoptimizersに対して、setupメソッドの引数に、Chainオブジェクトを渡しています。
そして、「ひとつの訓練データのバッチ(x, y)を与えると、パラメータが1回更新される」という処理は
model.zerograds() #勾配を初期化
loss = model(x, y) #順方向に計算して誤差を算出
loss.backward() #勾配の計算(微分)
optimizer.update() #パラメータの更新
と書くことができます。パラメータの更新がたったの1行で表現できます。
これらの処理をループさせれば、最適なパラメータに近づけることができます。
#Chainerの基本オブジェクトの紹介まとめ
今回でChainerの基本オブジェクトの紹介はおしまいです。
Chainerの提供してくれるオブジェクトを使うことでニューラルネットワークの構築に必要な面倒臭い計算をライブラリに任せることができます。
現在、深層学習の勉強中の身で、至らない点やおかしな点が数多くあったと思います。
また勉強していく過程で修正、加筆していけたらと思っています。
次回からは、これらのオブジェクトを使って実際に学習させてみた様子などを書いていきたいと思います。
#参考
山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習~複雑なNNの実装方法~ オーム社