ITと哲学と

IT系エンジニアによる技術と哲学のお話。

ML Strategy(2)

CouseraのDeepLearningのコースの受講メモ.

機械学習プロジェクトを進めて行くための戦略についてpart2.

Error Analysis

エラーを手動で分析してより良いモデルに育てて行くための知見をえる.

Carring out error analysis

モデルの能力が,人の能力に届かない範囲では,手動によるエラー分析が有効. モデルが分類に失敗したものを人がチェックして,どんな時に失敗しているかを分析する.

例えば,猫画像判定のアプリを考える.

猫画像判定システムの精度が90%あり,10%のエラーが残っているとする. エラーの中から1つの画像を見てみると,犬の画像を猫として判定していた. 犬の画像を大量に教師データとして取り入れると,この問題は解決できる可能性があるが,この問題に時間をかけることが有意義かどうか?

これに答えるのがErrorAnalysisである.

誤判定した中から,100サンプル程度ランダムに取り出して,その中に犬の画像がどれくらい含まれているかを見てみる.その結果,100個中2個であれば,これを改善したとしてもあまり効果はない. 100個中80個が犬であればこれを解決することはモデルの精度向上に大きな影響を及ぼすだろう.

このように,取り組むべき問題がクリアできた時,最大でどの程度精度が改善するか?といった指標をceilingと表現する.

Cleaning up incorrectly labeled data

全てのラベルが正しいわけではない.ラベルづけにミスっているケースもある. ラベルにミスが含まれていることがわかった時,これを付け直すか?という問題.

基本的に,DeepLearningなどのアルゴリズムは,ランダムなトレーニングセットのエラーに対しては堅牢なので,あまり気にする必要はない.エラー率があまりにも大きくて,データ数が少ないような場合は問題になるが,十分なデータがあり,許容できるエラー率であればモデルの精度に大きな影響はない.

Dev/TestセットにおけるエラーについてはErrorAnalysisをしてその影響を確認できる. 例えば,モデルの精度が90%でエラー率が10%のモデルについて,ラベルミスが0.6%であればそれは問題ないと言える. もしもこれが,モデルの精度が98%でエラー率が2%の状態で,ラベルミスが0.6%あると,問題になるケースがある. パラメータチューニングの際に,A(誤差率2.1%)とB(誤差率1.9%)の比較をしてどちらを採用するか決めなくてはいけないが,この際に,ラベルミスが0.6%あると,どちらがより良いパラメータなのかということを正しく判断できなくなるためである.

この場合は,Dev/Test双方のラベルづけを再度行う必要がある. なお,Dev/Testは同じ源からデータを得たいので,ラベルを修正するのであれば双方について同時に行うこと.

Build your first system quickly, then iterate

MLシステムを作る上では,まず簡単に作って,ブラッシュアップして行くような進め方が良い. まず,簡単に作って,その後にDev/Testセットを作ってメトリクスを決め,Bias/Variance AnalysisとErrorAnalysisを行って次に行うべき方向性を決める.

Mismatched traiging and dev/test set

Training and testing on different distributions

実際にシステムを動作させる環境から得られるインプットの他にも,例えば画像認識などのタスクであればネット上から画像をダウンロードしてきてそれを教師データとして活用することも可能になる.

その場合に教師データとDev/Testデータをどのように作って行ったら良いかというお話.

全部混ぜて,そこから教師データとDevデータとTestデータに分けるような方法はあまりよろしくない. 特にDevデータとTestデータはパラメータチューニングの際の意思決定に使われるものなので,可能な限り実環境で得られるデータに近しい必要がある.

なので,まずは必要なだけのDevデータとTestデータを可能な限り実環境から得られるデータで構成してしまう.そしてあまりのデータとネットから落としてきたデータを一緒に教師データとして扱うといった方法が良い.Dev/Testはあくまで同じ源から得られるようにしたいので注意.

Bias and Variance with mismatched data distributions

Bias/Variance Analysisを行う際に,データソースの違いが気になる.

例えば,HumanLevelのエラー率が0%だとして,TrainingErrorが1%でDevErrorが10%のシステムがあるとする. 一見するとHighVarinaceの問題のようにも見えるが,TrainingSetとDevSetが別の情報源からきているとすると,その影響がどの程度なのか?という疑問が持ち上がる.

これを解決するために,新たに「Training-Dev」というデータセットを作成する. これは,Trainingセットと同じ源から得られたデータのうち,学習には使われないデータのこと. Trainingセットを作った後で,そこからランダムに一部のデータをTraining-Devセットとしてあげると良い.

TraingErrorが1%でTraining-DevErrorが9%でDevErrorが10%だとすると,これはHigh Varianceの問題である.

TraingErrorが1%でTraining-DevErrorが1.5%でDevErrorが10%だとすると,これはデータミスマッチの問題である.

TraingErrorが10%でTraining-DevErrorが11%でDevErrorが12%だとすると,これはHigh Biasの問題である.

TraingErrorが10%でTraining-DevErrorが11%でDevErrorが20%だとすると,これはHigh BiasでかつHigh Varianceな問題である.

Addressing data mismatch

データミスマッチの問題にどうアプローチしていくか,確実な方法はないが,試すべき方法はある.

まずはErrorAnalysisを行って,TraingデータとDevデータの違いを探してみる. 例えばDevデータはよりノイズが強いとかそんな情報がわかるとよい.

これがわかったら,TrainingデータをよりDevデータに近づけるための努力を行う. いくつか方法はあるが,例えばDevデータと同じ環境でデータを大量に確保するとか,データ合成を行って擬似的にTrainingデータをDevデータに近づけるなどする.

データの確保は難しいケースが多いので,データ合成は手軽に試せるのでおすすめ.

データ合成する際には,合成するデータのバリエーションに注意が必要で,バリエーションが少ないとoverfittingを引き起こしてしまうリスクがある点に注意すること.

Learning from multiple tasks

Transfer learning

転移学習について.

同一のインプットを受けて,異なるタスクを行うモデルを効率よく学習するための仕組みとして転移学習は有効.

例えば,画像をインプットに,猫を判別するようなタスクがあったとする. このために,画像を大量にインプットし,モデルを学習する. この学習したモデルの浅い層は画像のエッジを検出したり,平面を検出したりといったプリミティブな表現を獲得している.深い層ではこれを活用して猫の顔を認識するような動きになる.

このモデルを,例えば画像をインプットに骨折しているかどうかを判定するようなタスクに応用することができる. 浅い層はそのまま用いて,深い層を再度学習させることで,骨折を判定させるモデルに転移する.

骨折診断するための画像郡であっても,猫の画像を判定するための画像郡であっても,画像としてのプリミティブな特徴は変わらないことから,こんなことができるわけである.

はじめに,浅い層を学習する過程をpre-trainingと呼ぶ. 次に深い層を学習させる過程をFineTuningと呼ぶ.

転移学習は以下の条件の時に効果を発揮する.

  • タスクAとタスクBが同じinputを持つこと(双方画像であるとか)
  • タスクBよりタスクAのデータが大量に存在していること.Aが少ないとあまり効果がない
  • タスクAの学習で得られた低レイヤーの特徴がタスクBにおいて有用であること

Multi-task learning

複数のタスクを同時に行うモデル. 車載カメラにおいて,「歩行者を検知する」「標識を検知する」と言ったタスクを,それぞれ個別のモデルではなくまとめて1つのモデルで行うようなイメージ.

こうすることで低レイヤーを共通して使いまわせるため,効率が良い. 4つのタスクを1つのモデルで実現したいとした時,教師データの正解データとして,必ずしも各教師全てに4つの判定結果が入っている必要はない.

「歩行者の検知」「標識の検知」「信号の検知」「別の車の検知」の4タスクを実施したいとして,とある教師データの正解が「歩行者の検知:yes」「標識の検知:no」「信号の検知:?」「別の車の検知:?」と言ったようにデータに欠損が生じていた場合は,?については無視してあげれば良いので,学習に用いることは可能である.

Multi-task Learningは以下の条件の時に効果を発揮する.

  • 低レイヤーが共通して使いまわせること
  • 各タスクのデータ量が同じくらいであること
  • 十分に大きなネットワークを学習させられること

実践的には,転移学習はたくさん使われているケースがあるが,Multi-taskLearningが使われるケースはあまりない.

End-to-end deep learning

What is end-to-end deep learning?

音声の自動書き起こしタスクを考える.

これまでの世界では,音声をまず,音声特徴に変換し,それをもとに音素を割り出し,さらにそこから単語を得てそれを元に書き起こし結果を得ると言ったpipeLineタスクを行っていた.

これを,直接音声の波形から書き起こし結果をえると言ったものがEnd-to-end DeepLearningである.

データ量が十分に大きい時にはこのアプローチが可能になる.データ量がそこまで大きくないときはEnd-to-endは難しいため,タスクの分割を検討する必要がある.

例えば,画像認識のよる入室管理システムのようなものを作る時,画像全体から特定の人が写っているかを識別するのはなかなか難しい. そこで,まずは顔がある場所を反転し,その顔がある場所の中から特定の人物かどうかを判定するようなタスクを行う.

こうすることで,困難な問題が2つのステップに分割される.

Whether to use end-to-end deep learning

End-to-endの利点と欠点は以下の通り.

利点

手作りの特徴量が不要であり,データを食わせればなんとかなる.

欠点

データが大量に必要になる. 機械学習のプロジェクトにおいて,手作りの特徴量をモデルに注入することは精度をあげるためにかなり有効なアプローチだが,End-to-endのアプローチではそれができない. データ量が十分にあれば手作りの特徴量は不要になるので問題ないが,データ量が得られないとこれが問題になる.

データ量はかなり大事な要素である.