bohemia日記

おうちハックとか画像処理、DeepLearningなど

人工知能や機械学習プロジェクトを進める際に気をつけること

こんにちは。ぼへみあです。

先日、Developers Summit 2017に行ってきました。 去年は登壇していましたが、今年は訳あってHololense体験コーナーで「Hololenseスゴイやろ」ってドヤ顔してましたが、セッションも少しだけ見てきました。

機械学習や人工知能系のセッションは、ブームのせいかどこも人がいっぱいでした。 特に気になったのは、「AI礼賛時代にエンジニアはいかにしてサバイブすべきか」というセッションでした。

speakerdeck.com

特に、機械学習をサービスに導入しようとするプロジェクトの陥りがちなポイントに触れられていて、共感したと同時にとても参考になりました。

そこで本記事では、当該セッションの内容に自分の経験を加えて、機械学習プロジェクトのコツを述べたいと思います。

ゆるく小さく始める

人工知能がブームになって、「よーし、ウチも人工知能やるぞー」となり、上から命が下り、大々的にやり始めるなんてことがあるかもしれません。そこで「5月末まで予算とったので、それまでによろしく」と言われ、「この精度までどれくらいでできそう?見積もりだして」
と言われても、

「やってみないと分からない」

としか答えられません。

というのも、機械学習を使ったプロジェクトは、精度を高めるために様々な手法を試し、データセットを作っては修正したり、パラメータチューニングしたりと、実験や検証を重ねていく必要があります。これはどちらかというと、研究開発に近いもので、一般的なシステム開発を想定して進めるとうまくいきません。

ですので、「いつまでに」「どれくらいの精度で」を厳しく追及されたり、目標に置かれると、それを機械学習をやる人は苦しくなってしまいます。やってみないと分からないことが多すぎるのですから。

なので初めはゆるく小さく始めるのが良いと思います。
「普段使っているこのデータで、機械学習使ってみたらこんなことできそう」
というアイデアがあれば、マネージャーは厳しく追及せずにゆるくやらせてあげる形が理想です。 予想以上の成果をあげることもあれば、思ったよりうまくいかないこともあります。機械学習とはそういうものです。

https://3.bp.blogspot.com/-0g2xeYplnE8/WCqd0vK4OuI/AAAAAAAA_oA/wVKoDCnM5h4dROFIdYJeZ_Y3ueTuqAlOQCLcB/s500/kids_hashiru.png

学習を再現できるようにドキュメント等を残すこと

機械学習で作成したモデルは、定期的なチューニングや改良が必要になります。その時に、最初に学習させた状態が分からないと、0からやり直す羽目になります。

例えば、カメラ映像を監視して、犬か猫が写り込んでないか判別するサービスを考えます。
最初の開発者は、犬と猫とその他の3分類の画像データセットを作り、ディープラーニングで検出モデルを作りました。*1
精度も良く、実環境でも問題がなかったので、サービスに組み込みました。

問題はこの後です。こんなことが起こりえます。

①実環境の変化
運用を始めてからしばらく経ち、今までは写り込んでこなかった種類の犬や猫が出てきました。 その新しい種類の犬猫は、写り込んでもうまく検出できていないようです。モデルを改良する必要がありそうです。

②ニーズの変化
使っているうちに、新たなニーズが出てきます。犬と猫の他にも、鳥と人を検出したいそうです。 現状だと、何か他のものを検出しても、その他に分類されてしまうので、改良したいそうです。

しかし当時の開発者は、機械学習ができることを評価されて他社に引き抜かれてしまったので、もういません。
学習済みモデルとそれを動かす周辺のソースコードはあるものの、学習に使ったデータセットや採用したハイパーパラメータなどの情報はありません。

学習状況が再現できれば、そこからデータセットの作り直しやわずかななパラメータチューニングで済むはずでした。 機械学習が分かる人がいなくとも、学習に使用した情報を引き渡せば、軽微なモデルチューニングとして外部委託できたかもしれません。

しかし学習状況を再現できなければ、ゼロからです。

ですので、学習モデル生成に携わった人は、学習済みモデルだけでなく、少なくとも以下の情報を残しておくべきです。

  • 学習に使用したソースコード
  • パラメータチューニングの実験結果
  • 採用したパラメータ
  • 採用したデータセット

また外部に機械学習プロジェクトを委託した場合にも、これらを納品してもらうべきです。

まとめると、
実環境の変化や新たなニーズの発生などで、定期的にモデルをチューニングする必要があります。 機械学習だからといって、状況に応じて勝手に学習してくれるなんてことは(よほど工夫しない限り)ありえません。
ソースが残っていればなんとかなる一般的なシステム開発に比べ、機械学習が絡むプロジェクトは動くソースコードがあってもなんともなりません。学習を再現できるようにドキュメントやソースコードを残しましょう。

https://1.bp.blogspot.com/-ty3ZjpBoyLg/WJmwlFExzfI/AAAAAAABBho/S-93NK6P5rs8XqU8fJLKXQ4RWvXoe3NAwCLcB/s400/boroboro_komonjo_tate.png https://4.bp.blogspot.com/-0Rz1rpJmOXw/V8jqYWtsdOI/AAAAAAAA9eE/48HyKYDJNLoIkfCMa8c_CC6LG45AdC3hgCLcB/s400/computer_cloud_storage.png

付け加えると、機械学習に関わったエンジニアが辞めないように、ちゃんと評価してあげることが重要です。 ドキュメントやソースコードでは伝えられない知見がたくさんあります。特に機械学習では、対象となるデータのドメインの特性を良く理解していないとうまくいきません。
また、機械学習エンジニアというのはまだまだ希少です。微積や線形代数、統計解析などの数学の上に機械学習が成り立っているため、一朝一夕で身につくものではありません。どこも機械学習できる人を欲しがると思いますので、簡単に転職しちゃいます。機械学習が重要性を増していく中、時間をかけて身につけた機械学習のスキルを持ったエンジニアを評価をし、辞めさせないことはとても大事だと思います。 *2

*1:IMAGENETで学習されたR-CNNモデルとかGoogle Vision API使えばいいのでは、という疑問は忘れてください

*2:某会社では、評価シートにないから、機械学習や深層学習のスキルはエンジニアの評価に全く影響しないと言われました