Coursera MachineLearning 10週目 まとめ

MachineLearning

機械学習界隈で評判高いCourseraのMachineLearningを受講したので、講義内容を個人的にまとめてみたいと思います。
10週目は、大規模な機械学習(Large Scale Machine Learning)についてです。AIブームに併せて、ビックデータという単語もよく耳にするようになりました。このビックデータをどう扱うかとういうお話です。


 

Learning With Large Datasets

機械学習のシステムで高いパフォーマンスを得たい時の選択肢として、低いバイアスの学習アルゴリズムを使用し、大量のデータサンプルで学習させる。 というものがありました。
(バイアスが大きいとアンダーフィットしますし、データサンプルが少ないとオーバーフィット傾向になり新たなデータサンプルをうまく分類できなくなります)

紛らわしい単語を分類するために作成されたアルゴリズムの精度を、いくつかのモデルで比較したところ、どのモデルでもデータ数が多ければ多いほど正確に分類ができるようになる。という結果が得られたそうです。


(出典:Andrew Ng, Coursera Machine Learning Week 10)

勝者は最も良いアルゴリズムを持つものではなく、最も多くのデータを持っているものだ。
(It’s not who has the best algorithm that wins. It’s who has the most data.)
と、よく言われるのだとか。

大量のデータを扱うことは、メリットばかりではなくデメリットも勿論あります。
具体的には、計算コスト面です。データの増加に伴い計算コストも上がっていく…なんとなく予想はできますね。\(m\) = 100,000,000 と聞くととんでもない数字のように思えますが、今日ではそこまで珍しくないデータ量だそうです。

なのでデメリットも考慮に入れ、すべてのデータ数を使用して学習を始めさせる前に、もっと少ないデータ数ではダメなのか?と考えてみることが大事なのだそうです。
(すべてのデータは使用せずに100,000,000 の中からランダムに1,000 個をピックアップする、という方法でも優れた結果が得られるかもしれません。私たちの目的は、正しくデータを分類することができるモデルを開発することであって、大量のデータを使用して機械学習を行うことではありません。データ1,000個以上使用しても精度がそれほど向上しない、頭打ちになるようであれば、無駄に計算コストをかけて学習させる必要はないということです。)

精度の向上が期待できるかどうかを確かめる具体的な方法は、[6週目]で学習した方法が使えそうです。
(\(m\) = 1,000 として、training set , cross validation set からLearning curvesを描いてみます。high varianceであると判断できたなら、ピックアップするデータサンプルを増やす方向に検討を進める。high bias なら、データサンプルを増やしても著しい改善は期待できない。というものでした)

確率的最急降下法(Stochastic Gradient Descent)

多くの学習アルゴリズム(線形回帰、ロジスティック回帰、ニューラルネットワークなど)にとって、アルゴリズムを導出する基本の流れは…

  1. 仮説関数を作る。
  2. 目的関数を作る。
  3. 最急降下法などで、目的関数を最小化するパラメーターθを求める。

となります。

これまで行ってきた最急降下法は、バッチ最急降下法とも呼ばれ、一度に全てのサンプルデータをチェックする方法でした。しかし、バッチ最急降下法で先ほどの例のようなデータ数(\(m\) = 100,000,000)を扱うとなると、莫大な計算コストになってしまいます。(それぞれのポイントでパラメーター\(θ\)をアップデートする度に、100,000,000回誤差を計算することになります)

それを受けて考え出された方法が、確率的最急降下法(Stochastic Gradient Descent)です。
パラメーター\(θ\)をアップデートする(iteration)ごとに、全てのサンプルデータをチェックするのではなく、1つだけに絞る方法です。iteration時の式がバッチ最急降下法のと微妙に異なります。(微分項を一つのデータのみで計算するという違いによるもの)

  1. data set(データ数\(m\))をランダムにシャッフルして並び替える。

  2. 1番目のデータのみを使用して目的関数を最小化するようなパラメーター\(θ\)を計算・更新。次は2番目のデータのみを使用して、その次は3番目のデータのみを使用して…と、\(m\)まで繰り返していく。

  3. ②を複数回繰り返す。
    1〜10回程度繰り返します。\(m\)が大きければ1回でもOKとのこと。

バッチ最急降下法では概ね最小値(Global Minimum)への最短のルートを進み、収束していきます。しかし確率的最急降下法は、でたらめなルートを進み、収束することなく最小値と思われるポイントでうろちょろ動き回ることになります。

各更新に1つのデータしか使っていないのでこれは仕方ないですね。

講義内では線形回帰を例に挙げて解説していますが、最急降下法で学習するアルゴリズムになら適用できる手法です。(線形回帰でもロジスティック回帰でもニューラルネットワークでもOK!)

Mini-Batch Gradient Descent

最急降下法と確率的最急降下法の間に位置する方法として、 Mini-Batch Gradient Descentというものもあります。

確率的最急降下法は、パラメーター\(θ\)の更新に1つのサンプルのみを使用していましたが、この方法では
\(b\) = mini batch size を定義し、その値の数だけ更新に使用します。
\(b\) = 10, \(m\) = 1000 であれば、各iterationで10個のサンプルを使用して合計100回更新するということです。

●収束しているかどうかを確認するには?

バッチ最急降下法では、目的関数が各iterationで減少していることを確認していましたが、\(m\)数が増えるとそうもいきません。(目的関数の計算には、データセット全てを使用します。この確認方法をそのまま適用すると、”計算コスト”は高いままとなってしまいます。)
ビックデータを扱う際には、確率的最急降下法を使用して、別の方法で収束を確認するようにしましょう。
以下のように目的関数を定義します。

そして、横軸:iteration数 , 縦軸:\(cost(θ,(x^{(i)}, y^{(i)}))\)の平均値 のグラフをプロットします。

\((x^{(i)}, y^{(i)})\)を使用して\(θ\)をアップデートする直前で\(cost(θ,(x^{(i)}, y^{(i)}))\)を計算し、1000イテレーション分の\(cost(θ,(x^{(i)}, y^{(i)}))\)の平均値をプロット、その続きの1000イテレーション分の\(cost(θ,(x^{(i)}, y^{(i)}))\)の平均値をプロット…と繰り返して、グラフを作成していきます。(1000はあくまでも例で、5000回などでも良いそうです)

プロットしたグラフが平坦になっていることを確認できれば、収束したのでは?となりますよね
学習率\(α\)(learning rate) を小さくするすると、所要時間は増えますが、最小値付近でうろちょろする時の距離が短くなるので、最終的に少しだけ結果が良くなります。
ばらつきが大きく収束しているようには見えない場合は、平均値の計算に使用するサンプル数が少ない可能性があります。今回の場合だと、1000から5000に増やしてみるといいかもしれません。
またグラフが上昇するようであれば発散していると考えらるので、学習率をより小さい値に変更することを検討しましょう。

オンライン学習(Online Learning)

大規模な機械学習の一例です。連続的な流れのある、絶えず流入しているようなデータが存在している場合に、それらをアルゴリズムに学習させていきます。

通販サイト等、ビジネスを目的としたWebサイトでは、様々なユーザーが訪れ、そして去っていきます。
そういった次々と訪れる連続的なデータサンプルをアルゴリズムに学習させ、ユーザーの嗜好をつかむことで、良いWebサイトを構築する(tweak the web page drum up interest)手がかりを得ることができます。コンバージョンを上げるためにも必要なことですね。

そのwebサイトで達成したいことが達成できた場合を\(y = 1\) とした場合、\(y = 1\) となるような確率を考えます。

\(x\):ユーザーの特徴を捉えた、何らかの特徴量。

達成したいことが「新規ユーザの獲得」の場合…
特徴量に、サイト側が提示するような変数(何らかのサービスであれば料金など)を含めておくと、高確率で \(y = 1\) になり利益も得ることができるような最適な料金を知ることができます。最適な価格を提案し、新規ユーザー獲得の確度を上げることができますね。

これらは、ロジスティック回帰やニューラルネットワークを使用すれば実現できそうです。
先ほどの確率的最急降下法と同じ要領で、あるデータ\((x^{(i)}, y^{(i)})\)の目的関数を最小にする\(θ\)を求めます。
オンライン学習の場合、あるユーザーのデータ\((x^{(new)}, y^{(new)})\)を使用して、目的関数を最小にする\(θ\)を求めるのですが、一度使用したデータを再度使用することはありません。最新のユーザーの傾向を掴むためにも、次々と訪れる新規ユーザーのデータを使用していきます。

マップリデュースとデータ並列処理(Map Reduce and Data Parallelism)

大規模なデータを扱う際には、一台のPCではとても無理だ…となる状況も起こり得ます。
そのような場合はデータを分割し、並列処理を行います。


\((x^{(1)}, y^{(1)})\) ~ \((x^{(m)}, y^{(m)})\) をいくつかに分割し、別々のPCで処理します。(それぞれ担当分の最急降下法の項を計算する)
得られた計算結果をマスターサーバーに集約させて合計し、出力します。


 

いよいよ最終週、11週目は、アプリケーション例として Photo OCR(Photo Optical Character Recognition) について学習します。画像内の文字や数字を認識して識別する課題に対して、機械学習をどのように使われるのでしょうか。

コメント

タイトルとURLをコピーしました