11.2 バッチ学習とオンライン学習

ここまで, モデルのパラメータを得るため, 一度に全ての訓練データを利用する方法を前提としてきました. これをバッチ学習といいます. 一方で, データの一部を使い逐次更新しながら最適化を進めるアルゴリズムも考案されています. このようなアルゴリズムを利用した学習をオンライン学習と言います. バッチ学習は全てのデータを一度に使用することから, それを一度に読み込むメモリが必要になりますが, オンライン学習は一部を少しづつ読み込むため, メモリをさほど要求しません (よって, 計算資源を多く要求するディープニューラルネットワークの学習でよく使われます). また, 逐次新しいデータを取り込んでパラメータを更新するという使い方もできます (warm starting). 一方で, 少数のデータから学習するため適切に使わなければ過学習しやすいという側面もあります.

(ヒント): つまり SGD はバッチ学習に比べてバリアンスの大きな方法であり, アンサンブル学習との組み合わせで改善する余地があるかもしれません.

11.2.1 SGD と代表的な派生アルゴリズム

オンライン学習では確率的勾配降下法 (Stochastic Gradient Descent; SGD) というアルゴリズムがよく使われます. アルゴリズム自体はとてもシンプルで, 以下の式に従ってパラメータ \(\boldsymbol{\theta}\) を更新します.

\[\begin{align} \boldsymbol{\theta}^{(t+1)} &= \boldsymbol{\theta}^{(t)} - \eta^{(t)} \nabla_{\boldsymbol{\theta}}E(\boldsymbol{\theta}^{(t)}) \tag{11.1} \end{align}\]

\(\nabla_{\boldsymbol{\theta}}E(\boldsymbol{\theta}^{(t)})\) は, 誤差関数をパラメータで微分した勾配ベクトルを意味します. つまり SGD は誤差関数が微分できる形なら基本的に計算できます. そしてすでに書いたように, この誤差関数の勾配を計算するのに, 訓練データ全体ではなく全体のごく一部だけを使います. これは1件だけの場合もあれば, 数十-数百件の場合もあります (ミニバッチ学習). そのため, バッチ学習と比べると正確ではありませんが, \(\eta^{(t)}\) を調整することでバッチ学習に近い答えを得られることが経験的に分かっています. この \(\eta^{(t)}\)学習率 (learning rate, or step size) と呼ばれます. つまり, 式 (11.1) を見れば分かるように, それまでの学習結果 \(\boldsymbol{\theta}^{(t)}\) に, 新たに勾配を元にした値を足して更新しているため, 学習率は新しく学習した結果をどれくらい重視するかということを意味します. よってゼロならば全く反映されませんし, 逆に 1 など大きな値ならば学習結果が蓄積しにくくなります. 学習率は最適化計算の収束の速さに影響するハイパーパラメータですが, どのような値が適切かはデータしだいです. しかしながら, 経験的に 0 より大きく 0.3 未満くらいの範囲の小さな値が使われることが多いようです.

SGD を使う際に重要な問題となるのは学習率 \(\eta^{(t)}\) の設定です. scikit-learn の SGDClassifier クラスでは, 学習率は一定, 線形減少, あるいは指数減少的に減らすといった簡単なもののみです. しかし, 現在はより効率的に学習を進めるために学習中に学習率を適応的に変動させるアルゴリズムが多く提案されています. よって, 現在では学習率の初期値以外は自動的に決定されるような実装を使うことが多いです.[よって, 先ほどの学習率の「相場」は適切な値を選ぶ判断材料としてはさほど有意義ではないでしょう.]

11.2.2 モメンタム法

SGD にモメンタム (慣性) の要素を追加したものです (Bengio, Boulanger-Lewandowski, and Pascanu 2013). 以下のように, 更新式は過去の勾配ベクトルの影響を引きずります.

\[\begin{align} m^{(t)} &= \mu m^{(t-1)} + \nabla_{\boldsymbol{\theta}}E(\boldsymbol{\theta}^{(t)}) \notag\\ \boldsymbol{\theta}^{(t+1)} &= \boldsymbol{\theta}^{(t)} - m^{(t)} \notag \end{align}\]

\(\mu\) は慣性パラメータと呼ばれ, 0-1 の範囲で指定できますが, 0.9 など 1 に近い値で効果があることが多いとされています. さらにこれを拡張した Nesterov Accelarated Gradient (NAG) あるいはネステロフ法 (Нестеров 1983) と呼ばれる方法は, 以下のような式で更新します.

\[\begin{align} m^{(t)} &= \mu m^{(t-1)} + \eta^{(t)} \nabla_{\boldsymbol{\theta}}E(\boldsymbol{\theta}^{(t)} + \mu m^{(t)})\\ \boldsymbol{\theta}^{(t+1)} &= \boldsymbol{\theta}^{(t)} - \alpha m^{(t)} \notag \end{align}\]

バッチ学習では試行ごとの勾配の値は比較的緩やかに変化しますが, オンライン学習ではデータ自体が変わるため, 大きく変動することがあります. モメンタム項はこの変化を平滑にすることで, 学習結果の分散を緩和する効果があるとされています. NAG は1つ前のデータの勾配だけでなく, 現在のデータの勾配もモメンタムに追加することで, より収束の方向を安定させ収束を早める効果があるとされています.

11.2.3 AdaGrad

Adaptive Gradient Algrorithm; AdaGrad (Duchi, Hazan, and Singer 2011) は, 学習率を適応的に変動させる SGD バリエーションの代表例です. AdaGrad では学習率を以下のように勾配の2乗の累積値を使って変化させます. つまり, 基本的に初期値 \(\eta^{(0)}\) さえ決めればあとは自動的に調整してくれるということになります.

\[\begin{align} \mathbf{G}^{(t+1)} &= \mathbf{G}^{(t)} + \mathrm{diag}\left[\nabla E(\boldsymbol{\theta}^{(t)})^2\right]\\ \eta^{(t)} &= \eta_{0}(\mathbf{G}^{(t)})^{-1} \notag \end{align}\]

また, AdaGrad はこの自動調整のために勾配の2乗を使うという方法から, 更新式が \(\boldsymbol{\theta}\) の次元ごとのスケールに対して不変である, という特徴があります. つまり, 学習率は1つでも, 更新のペースは特徴量ごとのスケールに合わせてパラメータごとに異なってきます. ここから, 特徴量ごとにスケールに差がある場合でも最適化しやすいため, スパースモデルの学習に向いているとされています.

lightning モジュールでは scikit-learn に準じた API で AdaGrad が使えます. しかし, 最近のディープラーニング人気に伴い色々考案されたSGDのバリエーションのみを用意しているPythonモジュールはありません. それらを利用したい場合, いずれかのディープラーニングフレームワークを使うのが良いかも知れません.

さらに, AdaGrad は学習率の減衰が早すぎるとして, さらに直近の勾配の重みを調整できるように, 以下のような更新式を使う RMSprop が提案されています.

\[\begin{align} \mathbf{s}^{(t)} &= \beta \mathbf{s}^{(t-1)} + (1 - \beta)\nabla E(\boldsymbol{\theta}^{(t)}) \otimes \nabla E(\boldsymbol{w}^{(t)}) \notag \\ \boldsymbol{\theta}^{(t+1)} &= \boldsymbol{\theta}^{(t)} - \eta \nabla E(\boldsymbol{\theta}^{(t)})\otimes \sqrt{\mathbf{s}^{(t)}+\varepsilon\mathbf{I}}^{-1} \notag \end{align}\]

\(\beta\) は 0-1 の範囲で指定できますが, 1 に近い値にするという前提の方法です.

なお, RMSProp にさらにモメンタムの要素を追加した ADADELTA (Zeiler 2012) や Adam (Kingma and Ba 2015) というアルゴリズムも存在します.

11.2.4 SGD のバリエーションからどれを選ぶべきか

これは決定的な基準がない問題です. しかし, これらの違いはすべてパラメータ更新の設定のしかたであり, 主な違いは最適化計算の収束が早くなるかどうかにのみ影響すると考えれば良いでしょう. もちろん, アルゴリズムによっては局所解に陥りやすいなどの差異もありますが, 我々の業務では「真値を見つけること」「乱数シード値やいくつかの条件を変えても同じ値に収束する安定性・再現性を担保すること」は必ずしも必須ではありません. 許容できる誤差の範囲で収束し, なおかつモデルの性能が十分であることが確認できているのなら, あとは時間がかかり過ぎなければ気にする必要はあまりありません.

そしてどのアルゴリズムが実際に適しているかは, モデルとデータに依存します. 経験的・理論的に分かっていることも多いですが, 完全な原則というものはありません. 例えば, 既に書いたように AdaGrad は調整すべきパラメータが少なくスパースなモデルにも有効だとされています. 加えて個人的な経験的では, ロジスティック回帰のような単純な誤差関数であれば AdaGrad などでも十分であることが多いです. 一方でニューラルネットワークの学習では, RMSprop や ADADELTA などがより好まれる傾向があります. さらに, 過学習の可能性を考えれば, 予測モデルの学習においては単に訓練データに対する最適解を見つけることが良いとは限りません. 学習の早期打ち切り (early stopping) などの併用が必要なこともあるかもしれません.

オンライン学習と SGD に関する研究は膨大で, ここでは全てを取り上げることはできません. より広範な話題への入り口として (海野, 岡野原, and 得居 2015) などを参考にしてください. たとえば計算負荷の観点から SGD の並列化についての解説があります.

参考文献一覧

Bengio, Yoshua, Nicolas Boulanger-Lewandowski, and Razvan Pascanu. 2013. “Advances in Optimizing Recurrent Networks.” In 2013 IEEE International Conference on Acoustics, Speech and Signal Processing, 8624–28. Vancouver, BC, Canada: IEEE. https://doi.org/10.1109/ICASSP.2013.6639349.
Duchi, John, Elad Hazan, and Yoram Singer. 2011. “Adaptive Subgradient Methods for Online Learning and Stochastic Optimization.” J. Mach. Learn. Res. 12 (July): 2121–59.
Kingma, Diederik P., and Jimmy Ba. 2015. “Adam: A Method for Stochastic Optimization.” In International Conference on Learning Representations.
Zeiler, Matthew D. 2012. ADADELTA: An Adaptive Learning Rate Method.” Arxiv.
Нестеров, Юрый Е. 1983. “Метод Решения Задачи Выпуклого Программирования Со Скоростью Сходимости \(O\bigl(\frac1{k^2}\bigr)\).” Докл. АН СССР 269 (3): 543–47.
海野裕也, 岡野原大輔, and 得居誠也. 2015. オンライン機械学習. 機械学習プロフェッショナルシリーズ. 東京: 講談社.