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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。

当エントリは「Machine Learning Advent Calendar 2017」の22日目のエントリです。

今回は、具体的な手法の話ではなく概念的な部分になりますが、機械学習におけるオンライン学習とバッチ学習の話を書きたいと思います。

オンライン学習・バッチ学習とは

バッチ学習

機械学習の手法を解説する時には、バッチ学習が前提となっていることが多いです。 バッチ学習は学習対象となるデータを全てまとめて一括で処理する方法になります。

一般的な教師あり学習を行う時の流れとして

  1. 現在weightの値で予測する
  2. 予測した値を元に損失関数を計算する
  3. 最適関数でweightの値を更新する

という流れとなっていました。

例えば、2日目で紹介したロジスティック回帰では、

1のプロセス以下を求めます。

\[ \hat{y} = \frac{1}{1 + \exp(-{\bf w}^T{\bf x})} \]

次に2のプロセスとして、クロスエントロピーの損失関数を利用していました。

\[ L = \frac{1}{m} (-\sum^{m}_{i} y_i \log(\sigma({\bf w}^T{\bf x}_i)) + (1 -y_i) \log(1-\sigma({\bf w}^T{\bf x}_i)) + \eta || {\bf w}||^2) \]

最適化にはこれを微分したものでweigthの値を計算する最急勾配方を使って収束するまで計算しています。

\[ \frac{\partial L}{\partial {\bf w}_n} = -\frac{1}{m} (\sum^{m}_{i}\sigma(-{\bf w}^T{\bf x}){\bf x}_i + \eta {\bf w}_n) \\ {\bf w}_n = {\bf w}_n - \alpha \frac{\partial L}{\partial {\bf w}_n} \]

この時、損失関数と最適化手法を見ていただくとわかるかと思いますが、学習に使う全てのデータこの計算を行っています。 そのため、例えばモデルの更新が必要になった際は、都度学習に必要なデータを集めてモデルを作り直す必要があります。

モデルの更新には必要なデータを全て揃える必要があり、学習にも全体を処理するための時間とメモリが必要になります。

参考 : 機械学習におけるモデルの更新とは

機械学習では、モデルの更新という作業が必要になります。 機械学習を行う際はログデータなど、これまでのユーザの行動によって生成されたものを学習データとして扱うことが多くあります。 ユーザの行動は常に一定というわけではなく、世の中の変化や趣味嗜好の変化などによって日々変化していくものです。

そのため、モデルを作成した時と、現在では状況に大きな変化が生じているため、正確な予測ができなくなってしまうという状況が生じます。 それに対処するために、日々新しく取得したデータを元に機械学習モデルも更新を行ってその変化に追従する必要があります。

また、ユーザの行動変化によってこれまでうまくいっていたやり方では対応できなくなたっため、取得するデータや抽出する特徴量、機械学習の手法などを変更する必要性が生じる場面もあります。

オンライン学習

バッチ学習に対して、オンライン学習とは学習データが入ってくるたびにその都度、新たに入ってきたデータのみを使って学習を行うものになります。 大きな違いとして、学習を行う際に1からモデルを作り直すのではなく、そのデータによる学習で今あるモデルのパラメータを随時更新していくと流れになります。

例えば、先ほどのロジスティック回帰であれば、

\[ l = -y \log(\sigma({\bf w}^T{\bf x})) + (1 -y) \log(1-\sigma({\bf w}^T{\bf x})) + \eta || {\bf w}||^2 \]

のように新たに入ってきたデータxとその正解ラベルyの組み合わせに対してその一件のみで損失関数を計算して、一度だけ

\[ {\bf w}_n = {\bf w}_n - \alpha \frac{\partial l}{\partial {\bf w}_n} \]

でパラメータwの更新を行います。

このように一件のデータに対して、損失関数を計算してその値を微分したものでweightの値を更新する最適化手法を確率的勾配降下法(SGD)といいます。

このSGDはDeep Learningなんかでもミニバッチとして利用されてたりする手法なので覚えておいて損はないと思います。

オンライン学習の特徴

さて、バッチ学習と比較した際のオンライン学習の特徴を見ていきましょう。

  • 1回の学習あたりのコストが低い
    • 1回の学習あたり1件のデータしか使わないので非常に軽いです
  • 学習データを全て蓄えておく必要がない
    • これも1件のデータしか使わない故です
    • ただし、データがないと同じ結果の再現もできないので注意してください
  • ユーザ行動の変化にすぐに対応できる
    • 例えば季節性のイベントなどに即座に対応可能な仕組みが実現できます
    • また、突発的な盛り上がりに対しても、その話題がホットなうちに対応可能です
  • 外れ値などノイズの影響を受けやすい
    • バッチ学習であれば事前にデータを確認して対処していたなどの状況を拾ってしまう可能性があります
  • 最新のデータの影響を受けやすい
    • 「ユーザ行動の変化にすぐに対応できる」の裏返しですが、新しいパターンのみを拾ってしまい、これまでできていたことができなくなっているという状況が起こりやすくなります

また、Deep Learningの文脈ではバッチ学習と異なり、都度目的関数の形が変わるので局所解に落ちづらいという性質もあると言われているようです。

おわりに

今回は、オンライン学習とバッチ学習について書かせていただきました。

概念的な部分のみの話になっているため、イマイチよくわからないといった方もいるかもしれません。 多くのバッチ学習はオンライン学習でも使えますので、 最後に記載した特徴などと合わせてどのような場面で利用できるかを考えてみるのもいいかと思います。

明日は、オンライン学習の手法である『CW』の予定です。 お楽しみに!