前の記事で何とか損失関数まで理解できたのですが、それだけではまだ関数を定義しただけで、ちゃんと値(損失)を収束させないと答えを求めたことにはなりません。
で、今回はその答えの求め方のお話です。
どうやって値を収束させるのか
損失関数の説明は省くとして、最終的には値を収束させなくてはいけません。
このグラフだと、損失が最小となる「m」を求めます。
いきなり答えが求まるわけではなく、少しづつ調整しながら損失を確認し、より小さくなるように調整していきます。
この「少しづつ調整しながら」の部分がミソなのですが、偉い人たちがいろいろ考えてくれた知恵を使わせていただきます。
- バッチ勾配降下法
- 確率的勾配降下法
- ミニバッチ勾配降下法
代表的な手法はこんな感じなのですが、これの実装方法で、さらにいろいろアルゴリズムがあったりします。
細かい話はしませんが、値の正確さと収束までの早さがポイントとなります。
TensorFlowの実装
TensorFlowでも、こんなにいっぱい用意してくれています。
- tensorflow.train.Optimizer
- tensorflow.train.GradientDescentOptimizer
- tensorflow.train.AdadeltaOptimizer
- tensorflow.train.AdagradOptimizer
- tensorflow.train.AdagradDAOptimizer
- tensorflow.train.MomentumOptimizer
- tensorflow.train.AdamOptimizer
- tensorflow.train.FtrlOptimizer
- tensorflow.train.ProximalGradientDescentOptimizer
- tensorflow.train.ProximalAdagradOptimizer
- tensorflow.train.RMSPropOptimizer
全部理解するのはしんどいので、チュートリアルで使用している「AdamOptimizer」と「GradientDescentOptimizer」だけ知っていればとりあえずはいいかなと。
「AdamOptimizer」はAdamアルゴリズム、「GradientDescentOptimizer」は急速降下法になります。
使い方はどちらも同じで、初期値として学習率を指定し、値を最小化するため「minimize()」関数に損失関数を渡します。
コードはそれぞれ、こんな感じになります。
train_step = tensorflow.train.AdamOptimizer(1e-4).minimize(cross_entropy)
train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
※本当はもっといっぱい引数があるのですが、そのあたりはTensorFlowのマニュアルを見てね!
使用するアルゴリズムの取り換えは簡単ですが、学習率をいくつにすればいいのかは試行錯誤... ^^;
ということで、この処理を実行すると、自動的に損失関数の値が小さくなるように、重みパラメータを調整してくれます。
これが「誤差逆伝播」となります。
もっと詳しく知りたいときは
勾配降下法のアルゴリズムに関しての難しいお話はこのかたの記事を読むのがよさそうです