機械学習(3) - スタンフォード大学の講義から

こんにちは。馬場です。
ブログさぼっている間に、講義はとうとうラスト10週目に突入です!

が、今回は第5週、第6週の講義の内容を紹介します。

9. ニューラルネットワーク

前回ニューラルネットワークがどのようなモデルなのか、説明していました。今回は学習データよりモデルを計算する方法について説明しています。まずは、尤度関数です。ベースはロジスティック回帰の尤度関数と同じなのですが、それが組み合わせているので、強烈なΣ祭りとなっていました。思わず面食らったのでここでは紹介しません!

 次に、尤度関数の値が最小になるようなパラメータΘの算出方法について、説明していました。要は学習データの数だけ、フォワードプロパゲーションとバックプロパゲーションを繰り返すのですが、ここでAndrew先生。
 

今までのアルゴリズムよりかなりごちゃごちゃしているので、今からその心を教えます。

といって、説明を始めました。

例えばロジスティック回帰のパラメータを計算する場合。最初はランダムにとった仮のパラメータで式を作成し確率を計算します。その結果と正解との差分を算出し、その差分が小さくなるようにパラメータを微調整します。ニューラルネットワークでも同様に、まずはランダムにとった仮のパラメータで式を構成し確率を計算します。これがフォワードプロパゲーションです。正解との差分を計算してその差分が小さくなるようにパラメータを修正していきます。これがバックプロパゲーションです。ニューラルネットワークはこのフォワードプロパゲーションとバックプロパゲーションを繰り返して最適なパラメータを取得します。

まあ、そう考えると、式は複雑そうにみえて、やっていることは地道というか自然な感じですね。納得。
その後は、細かいトピックとして、2点のお話をしています。

  • gradient checking : 実装が正しいか確認するための手法。偏微分を近似して値を確認する。
  • 初期パラメータの取り方:今までと同じように0行列で初期化すると先にすすまない。ので、ランダムな数で初期化すること

そして、実際にニューラルネットワークでモデルをつくる場合の注意点として、数点教えてくれました。

  • 隠れ層の数。まずはひとつでやってみたらいい。もちろんもっとあった方が複雑なモデルが作成できる
  • 各隠れ層のユニットの数はそろえた方がいい
  • 各層のユニットの数は多いほどいい。ただし計算コストがあがるのでそこはトレードオフ。

最後に、車の自動運転の例を紹介していました。
まず実際に車を運転しながら、2秒に1回車前方の地面の写真とそのときのハンドルの方向を記録して、学習データを作成します。
次にこの学習データを用いてニューラルネットワークで仮説を構築します。
最後に自動運転を実行します。1秒間に10回、地面の写真を撮影し、それを入力データとしてハンドルを適切な方向に動かす様子を動画で紹介していました。20年近く前の実験でしたが、上手に運転していました。

というわけで、2週にわたったニューラルネットワークの講義が終了しました。Andrew先生。

ニューラルネットワーク、特にバックプロバケーションは難しくて、今までの回帰と比べても計算の意図が直感的にわかりづらい。
が、きっちり飲み込めなくても、ニューラルネットワーク自体は強力だし、このモデルを利用することができるし、僕もときどき混乱するから、難しいと感じても無理はないよ!

確かに難しかった。
ただ、いままでと違ってある意味モデルや仮説の形がイメージできなくても、入力と出力データさえ用意して放り込めばそこそこの精度で答えを出してくれる、というのはまさに「機械」学習という感じでした。

現実は、まあ「ニューラルネットワークを適用さえすれば、機械が勝手に。。」というほどうまくいかないと思いますが、人間の大事な役割は入力と出力を何にするか決めることかな、と感じました。

10. 機械学習の応用

機械学習のアルゴリズムの精度を低い場合、改善するにはおおよそ以下の方法があります。
   

  • データをもっと集める
  • 変数を減らす
  • 変数を増やす
  • 多項式にする(モデルを複雑にする)
  • 正則化項を調整する

ただ、実際にチューニングを実行する前に、評価をして問題を見極めることが大切です。学習データを

  1. モデル作成のための学習データ
  2. パラメータを評価するためのデータ(検定データ)
  3. モデルを評価するためのデータ

に分け、1. で作成したモデルで、2.のデータを入力データとして予測し、エラー率を測定しつつ、パラメータを調整。
最後に3. でモデルを評価する。という方法です。

この評価をすればアルゴリズムの精度が悪い場合に、その原因が高バイアスなのか、過学習なのかが判断できます。高バイアスの場合は、 学習データのエラーも検定データのエラーも両方高いはずです。対して、過学習の場合は、 学習データのエラー率は低いものの、検定データのエラー率は高くなるでしょう。

また、アルゴリズムの評価をする場合、学習曲線を見てみるのも効果的です。学習曲線とは、データ数とそのときのエラー率をプロットしたグラフです。データを増やした場合、よいモデルの場合、学習データとの尤度は高くなるが、検定結果はよくなります。バイアスが高い場合は、学習データが増えても、エラー率が下がりません。過学習の場合は、学習データのエラー率と検定データのエラー率に大きな差があります。ただ、過学習の場合は学習データ数を増やすと、良いモデルに近づきます。

各対策方法がどの場合に有効か、まとめます。

  • 過学習に有効
    • 学習データを増やす
    • 変数を減らす
    • λ(正則化パラメータ)を大きくする
  • 高バイアスに有効
    • 変数増やす
    • 多項式にする(モデルを複雑にする)
    • λ減らす

11. 機械学習システムのデザイン

 この節ではスパムフィルタリングシステムの構築を例に機械学習システムの設計ポイントについて解説していました。
 スパムフィルタリングシステムで、思ったような成果が得られない場合、以下のような改善方法があります。

  • データをもっと集める
  • もっとよい変数を選ぶ(例:メール本文からだけでなくメールヘッダからも情報を取得する、など)
  • 変数をもっと細かく設定する(例:メール本文のNGワードに対して活用なども考慮して判定するようにする、など)
  • 違うアルゴリズムを適用する(例:ロジスティック回帰ではなくニューラルネットワークにする、など)

いずれにしろ、まずは単純なアルゴリズムで仮説を作成し、クロスバリデーションや学習曲線による評価を実施することをお勧めしていました。エラーになったデータ=うまく判定できなかったデータの定性分析も非常に効果がある、と言っていました。

またクラス分けが「歪んでいる」場合(skewed classes)の評価指標についても言及していました。 
クラス分けの問題で、一方が他方より圧倒的に多い場合はエラー率という指標ではモデルの善し悪しをうまく計れません。
例えば、がんがあるかどうか判定するような場合です。99%(あるいはもっと)の人は現在健康で、1%の人だけ腫瘍があります。このような場合、何も予測せずに全員に「がんはありません」と判断をしてもエラー率は1%、と良い結果になってしまいます。

こういう場合は、適合率/再現率という指標を使いましょう。
適合率は真の正解データのうち正解と予測できたものの割合、再現率は正解と予測できたもののうち真に正解だったものの割合です。適合率 は「がんがあるのに見逃しちゃった」という状況が多いときに、再現率 は「間違って健康な人にがん宣告しちゃった」状況が多いときに、低くなります。どちらもダメージ大きいのでさけたいですよね。

基本的にデタラメなモデルでない限り、適合率が良くなれば再現率が悪くなり、再現率が良くなれば適合率が下がります。予測するモデルによって、適合率/再現率、どちらの事象を重く見るか判断し、モデルの善し悪しの判断の参考にすればよいです。ただ、もし適合率も再現率もそこそこよいものを、という場合は、それぞれの調和平均を取得して指標としたら良いでしょう。これをF-scoreといいます。

感想

繰り返しになりますが、ニューラルネットワークの機械的な感じは、本当に機械学習の名にふさわしいなあ、と感じました。
とはいいつつも、「エラーの定性分析も大事」と強調したりと、本当に実際に活用するためのコツをいろいろ教えてくれるのでよい講義だなあ、と思いました。

次回はSVM、そのあと教師なし学習に突入です。

Comments are closed, but you can leave a trackback: Trackback URL.