これは TECHSCORE Advent Calendar 2018 の4日目の記事です
こんにちは、馬場です。年齢なのかなんなのか、エンジニアリングのステージにたどり着く前の、おおきくぼんやりとした仕事を任されることが増えた、2018年はそんな一年でした。このふんわりを言語化できるようにならないとなあ、と思いつつ、何か考える上でのフレームワークみたいなものがないものかともがいていたらこの記事にたどり着きました。"Machine Learning Problem Framing " ......ここに解があるはず?!読んでみます。
はじめに
まずは、このコースの目的が「機械学習の問題を定められるようにする」ことだと言っています。機械学習が解くべき問題、他のプログラムで解いた方がいい問題を実例をあげて解説していくようです。楽しみ。
一般的な機械学習の問題
はじめに、「教師あり学習」や「ラベル」「特徴量」などの用語や、代表的な機械学習の問題(分類、回帰、クラスタリング... ) について簡単に説明しています。そして、機械学習の適用事例として「Gmailのスマートリプライ」「Youtubeの[次の動画]」「Tensorflowできゅうりの仕分け」をあげてます。
さて、ここで読者への質問が3つありました。
- これらの機械学習システムは、どんなユーザの問題を解決したのか?
- これらのシステムのアウトプットはどんなもの?
- それぞれどんなデータソースを利用したの?
2の質問で、私は「きゅうりの仕分け」事例の答えとして「各きゅうりの分類ラベル」と回答しました。しかし、Googleさんの回答例は「きゅうりを正しい分類箱に入れるためのロボットアームの向き」でした。本当に課題解決する機械学習システムを設計するためには、「何を推論するか」定めるだけでは不十分で、プログラムなどで実現可能な処理まで想定しないといけないいうことです。この「推論をゴールにしてはいけない」ということは以降繰り返し述べられることで、Problem Framing で考慮すべき重要なポイントのようです。
機械学習に取り組むときの心構え
"機械学習をするならば、我々の課題への取り組み方を変えなければならない。数学的なものからより自然科学的なものになっている。つまり、実験し、結果を統計的に(論理ではなく)分析・解釈するのである。
Peter Norvig - Google Research Director
コンピュータサイエンスでは、問題は理論をつみあげて解きプログラムで記述することが求められていましたが、機械学習においてはこのような考え方や取り組み方を変えないといけない、ということです。そのために、機械学習で最初にとりくむのは「実験の設計」だと言っています。
- 不確実なことに慣れましょう
- 科学的手法:機械学習では実験を繰り返して繰り返して繰り返して課題解決するモデルを得る
- 実験のゴールを決める
- 仮説をたてる
- データを集める
- 仮説を検証する
- 結果を分析する
- 結論を得る
- 仮説を改良して繰り返す
機械学習向きの問題
機械学習は万能ではなく、解決できる問題に向き・不向きがあります。ここでは機械学習向きの問題がなにか、解説しています。
- ユースケースが明確
- 問題からはじめよ、ソリューションからはじめるな
- 伝統的なプログラミングで解くのが難しい場合にのみ機械学習を導入せよ
- データを見るのは、問題の理解を深めてから!
- データ探索したくなるけど、問題の理解が浅いと仮説はみえてこないよ
- 問題に関わるログが手に入ること
- タスクのために収集したデータ、問題に近いデータが一番有益
- 特徴量の説明力
- 説明力のありそうな特徴量から試す
- 予測 vs 決定
- 「決定」とは、モデルの出力によりプロダクトが実行する処理をさす
- 機械学習は決定するほうが得意 / インサイトを与えるのは不得意
- データがいっぱいあってなにか「面白い」ことを発見したいのなら、機械学習ではなく統計的アプローチの方が理にかなっているよ
機械学習には難しい問題
逆に以下のような問題は不向きだと。クラスタリング... 面白いですね。
- クラスタリング : そのクラスタがどういう意味があるのか人が見極めないといけないから
- 異常検知 : ヒューリスティックな異常判定を機械学習システムとして取り入れるのは難しい
- 因果関係の推論:相関はみれるけど
- データがない場合
機械学習にとりかかる前に
そして、機械学習の問題を定義してデータを見る前に、いまいちど機械学習のアウトプットでどのような「決定」を行うのか、洞察を深めることを提案しています。
- 簡潔で明確なところからはじめよう
- 機械学習モデルがやることを一文で簡潔に記述する
- 理想的な結果はなに?
- この段階では定性的でOK
- 機械学習システムを導入した場合にこうなってほしい、という理想的な状態・結果を定義する
- 成否の指標は?
- 理想的な結果を測れる定量的な指標を定めよう
- この指標は測定可能?
- どうやって測定するか?
- いつ測定できるか?
- 新しい機械学習システムが成功か失敗か、わかるのにどれくらいかかる?
- 失敗のシナリオが他にないか?
- 指標がよくても問題を解決していないようなケースがないか?
- 機械学習モデルのアウトプットは何にする?
- 良いアウトプットの特徴
- 機械が提供可能で、明瞭な定義をもつ定量的なもの
- 理想的な結果につながるようなアウトプット
- 学習データ用にアウトプットデータを獲得できるもの: 教師学習はラベルが必要。データからアウトプットが作れないとだめです
- アウトプットの活用
- 機械学習システム・プロダクトはどのタイミングでモデルのアウトプットを利用する?
- モデルを呼び出すときにアクセス可能なデータは?
- 待ち時間はどれくらい許されるの?
- ↑この答えによって、利用可能な特徴量やアルゴリズムが決まる
- 機械学習システム・プロダクトはどのタイミングでモデルのアウトプットを利用する?
- 良いアウトプットの特徴
- 悪い目的
- 「ここを目的にしたら理想的な結果からずれていく」ような指標があればあげておく
- ヒューリスティクス
- 機械学習ではなくルールベースでシンプルに解決できる方法がないか?
- 実際に採用しなくてもベースラインになるよ
問題を「機械学習の問題」に定義しなおす
さて、ここまで徹底的にサービスに実装可能な機械学習の問題か、吟味した結果、やはり「これは機械学習で解決するべき問題」と判断したら、あともう一息、モデルの設計を行います。
- 問題を記述する
- シンプルなことからはじめる
- 2値分類 か 回帰にならないか?
- 単純なモデルの方が実装しやすいぞ
- 良いベースラインになるからな
- ラベル付けされたデータがあるかどうか確認する
- モデルのためのデータを設計する
- データがどこからくるのか確認する
- 簡単に取得できる入力データがあるか探してみる
まとめ
いかがでしたか。本当に最初の最初から徹底的に、この機械学習システムをどのプロダクトのどのシーンでどのように利用するのか、考え抜け、ということでした。さすが、機械学習システムと技術的負債の論文を書いたGoogleさんです。さらに、記事の内容が、決定につながる機械学習の問題定義とモデル設計の二つのフレームワークにまとめられているのもいいですね。次はこのあたりからせめていこうと思いました。とはいうものの、課題の探索に近道はないんだなあ、と... 現場からは以上です。