Goalist Developers Blog

一般化がいつも重要!(これも一般化なのかな)

チナパです! 早速ですが、A few useful things to know about machine learning - Pedro Domingos

https://homes.cs.washington.edu/~pedrod/papers/cacm12.pdf

f の続きをしたいと思います!以前、この論文にまとめられてる分類器の3つの部分(表現、評価、改善)について書きましたので、気になる方はこちらで読んでみてください!

developers.goalist.co.jp

その続きには、まず一般化について説明したいと思います!

一般化が全て!

学校・社会では「一般化」はあんまり良いイメージを持ってないかも知れません。例えば、数学がいやな友達が「インド人みんな二桁乗算できるじゃん!」ということに対していつも「それはただ一般化だよ!人はそれぞれ!」みたいに強く否定することもあります。そんな状況には確かに、一般化の弱点が明確に見えますが、その限られた視点を使って「すべての一般化が悪い」という結論にたどり着くのも…

人間も使ってる重要な道具

一般化は完璧ではありませんが、人間が持つ思考道具のとても重要な一つです。なぜなら、世界の「すべて」を経験していない限り、新しい状況に入ってしまう時には一般化を無くして他に頼る物が心細い。中学生が高校に行く時にも、大学生が社会人になった時にも、今までの経験から学んだことを新しく入る場所にもちろん使おうとします。完璧ではないが、人間が新しい状況で素早く活躍し、新しい学びを作ることができる理由は一般化にあると思います。

その力は今になってパソコンも使うとしています。

機械学習も今まで見たデータを「経験」として生かして、見たことがない新しい(似ているかも知れない)問題を解決しようとしています。

機械学習のモデルを作る時に、データ・サイエンティストあるいはAIエンジニアとしての責任はモデルが一般化の力を身につけるように作ることです。

どうやって一般化できるモデルが作れます?

作る方法の前に、確認の方法があるのが重要です。

まずはですね、学習データ、バリデーションデータと評価データをそれぞれ持ちましょう。

学習データの精度は「このモデルがパターンを見つけられるかどうか」をわかるためには便利ですが、実際のモデルの良さが分かりません。言い換えましょう。学習データでの精度が低ければ、「モデルが良くない」のが分かりますが、学習データでの精度が100%でも、「モデルが良い」を言い切れません。

人間の学生が教科書の通りの言葉を繰り返しても本当のコンセプトが理解できているのが言い切れないことと同じです。そのために、教科書・学習データと異なるものに対しての評価が必要です。これは「テストデータ」と言います。

このように、学習データ(教科書)とテストデータ(試験)が全く同じような物ではないことによって、一般化の確認ができたかどうかが分かるはず…よね?

そうですね、、、、まだです。

その理由を知るために、まず、実践的な状況を想像しましょう。

現実はこうですよ

研究者Aくんがモデルを作ろうとしています。データを100件持っているとしましょう。上記のように、ちゃんと持ってるデータを学習データ(90件)とテストデータ(10件)に分けてます。ここまでよし。

Round 1:いくつかのフィーチャを使って、学習させます。 結果:テストしたら40%なので、もっかい!

Round 2:フィーチャをちょっと改善して、新しいのを作成し、学習させます。 結果:テストしたら41%なので、もっかい!

Round 3:モデルをちょっと変換して、フィーチャも編集して、学習させます。 結果:テストしたら50%なのでよし、がもっかい!

1ヶ月後

Round 21:何回も何回もモデルとフィーチャーを編集して、学習させました。 結果:テストしたら93%なのでやった!90%以上だし、すごい!

と思ってます。

お試しで他の人に使わせてみたら、

「え?」

友達がやってみたら、80%ぐらいの正答率しか出てこない。しかも、微妙に二つのクラスに混乱するのが多い。

何が行われたのでしょう?

絶望の原因をしっかり把握しましょう

ここで、確かに、学習の時に別なデータを利用して、評価の時に別なデータを利用したためにそこでオーバーフィッティング(一般化できないこと)がそんなに見えなかったが、テスト結果に応じてのモデル編集自体を何度も、行なったため、テストデータに特に合いそうなモデルを作ってしまいました。

そこで、本当の状況を知らず、みんなに「90%以上!」と自慢してた….絶望的。

一般化を確認するための理想的なプロセス

学習するたびに毎回一般化の確認を含まなくても良いですが、最終的にいくつかの検討できるモデルの中で、実際に使いたい時にこのような形で一般化の確認ができます。

学習データとテストデータを分ける

全てのデータをまず二つに分ける。例えば、8割・2割で学習とテストデータを作りましょう。(割合に多少融通が利きます)

ここのテストデータを一旦放置して、残っている学習データをさらに8割・2割に分けましょう。今回の2割は「クロスバリデーションデータ」と言います。

クロスバリデーションデータを使う

学習して→クロスバリデーションデータで評価しましょう。 何度も編集しても、このクロスバリデーションに対しての評価が高くなっていっても、まだ一度も利用されてないテストデータが残ってます。

クロスバリデーションデータはずっと同じデータでもなくても良いです。

学習データとテストデータと学習データをシャッフル

テストデータを使わずに、一般化ができていると確認したい場合に、クロスバリデーションデータと学習データを混ぜて、もう一回ランダムで分け直しましょう。

例:最初に1-64まで、が学習データとして、

65-80がクロスバリデーションとして使っていた場合、にシャッフルして

1-16までをクロスバリデーションに使い、今度学習データを17-80まで使って、

それぞれの状態の評価には変動が激しくないと確認できます。

テストデータで評価

モデル修正が色々満足した時に、やっとテストデータを利用して、公開できる評価を今までみていない、ランダムのはずのデータに対して得られます。

まとめ

この度、一般化について詳しく説明いたしました。これで、一般化がなんで重要なのか、そして、一般化できないモデルの騙されない方法をいくつか使えるようになりましたかな!

では、また今度!

チナパ。