はじめに
近年、ニューラルネットワークは分類精度の高さや様々なタスクへの応用が可能であることから、幅広い領域で使われています。私の場合、セキュリティ領域でニューラルネットワークを用いています。
ところが、ニューラルネットワークはその複雑な構造から、誤った使い方をされてしまうことがあります。誤った使い方を防ぐためには、その基礎理論を学ぶことが重要だと私は考えています。私の場合、なっとく!ディープラーニングという本を通じて、ニューラルネットワークの理論を学んできました。
本記事では、本書で学んだ勾配降下法という手法について説明します。本記事より詳しい内容を確認したい方は、本書の第8章をご覧ください。
勾配降下法
勾配降下法とは、最適化問題を解く方法の一つです。ニューラルネットワークにおいては、モデルの出力と真のラベル間の損失関数を最小にするようなパラメータを推定することが求められます。このとき、勾配降下法が使われます。 勾配降下法の基本的なパラメータ更新式は、(1)式のようになります。
です。ただし、は更新後のパラメータ、は更新前のパラメータ、は学習率、は損失関数です。 によって更新の方向が、によって更新の大きさが決まります。なお、今回の実装においては損失関数は二乗誤差とします。
色々な勾配降下法
勾配降下法は、一回の更新に用いるデータの個数や、データの選び方に応じて名前が変わります。各手法の名前をまとめたものが、表1です。
実装
表1に記載の勾配降下法をJuliaで実装しました。 github.com
正確にエポック数などを揃えて比較したわけではないですが、1回の更新に用いるデータの個数が多い(=バッチサイズが大きい)ほど学習にかかる時間が短いように感じました。
まとめ
本記事では様々な勾配降下法を「1回の更新に用いるデータの個数」と「1回の更新に用いるデータの選択の仕方」の2観点を用いて整理しました。また、Juliaでこれらの勾配降下法を実装し、バッチサイズが大きいほど学習にかかる時間が短くなることを確認しました。