?

Log in

No account? Create an account

Previous Entry Share Next Entry
画像解析を実サービスに使う難しさ
karino2
仕事もあと二週間を切り、そろそろ残った時間で出来ない事も増えてきて終わりを意識してまとめる段階になってきた。

今回の仕事は勉強目的では最初の一ヶ月くらいでだいたいやりたい事はやった感じがあり、残りの二ヶ月はアウトプット的な事を期待したい時期だったのだが、振り返るといまいちぱっとしない。

画像解析の実サービスのリリースに向けて筋道をつけるくらいで精一杯だった。
三ヶ月も働くのだから、これにプラスして一つくらい論文になりそうな事をやって論文を書く筋道をつけるくらいの事までやりたいなぁ、と思っていたのだが。

なんでそういう結果となったのか、いろいろと考えた。
最初は自分の実力不足的な事をいろいろと考えて、そこにはそれなりに反省すべき所もあり、その辺の話はまた別にそのうち書きたい。

ただ、最近はどうもそういう事だけじゃなくて、そもそも画像解析のサービスを作る、というのは、この位かかる物なんじゃないかな、と思い始めている。

もともと「この位はやりたいな」と思う時には、そのタスクの内容について、なんとなく必要な時間みたいなのは心の中で見積もっているのだと思う。で、この心の中の「この位で出来るだろう」という感覚が、実態と結構ずれていたんじゃないか。

そもそもデータ分析を実務に持っていくのは結構いろいろ難しい、という事は理解していたつもりだった。
前回レコメンドでは実サービスに載せていたし、その時ちゃんと片付けるまで5ヶ月くらいかかっている。
同じペースで働いていたらそもそも三ヶ月ではここまでも来ていなくても不思議では無い

ただ、二回目なのともう少し始める前の段階で前回よりはいろいろうまくやったので、前回と同じくらいで片付く仕事なら、それにもう一つ位大きめの事をやりつつ片付けられるくらいの判断で居たし、そこは今振り返ってもそれなりに合理的に思う。
この考えで間違っていたのは、レコメンド系でだいたい考えた規模感というか掛かる時間みたいなので、画像解析系のモデルをサービスまで持っていくコストを考えた所だったんじゃないか。

もともと画像解析に限らず、機械学習系の機能を実サービスに持っていくのは、従来のサービス開発とは大きく違う所がある。
あらかじめは、何が出来るのか良く分からない、という所だ。
だからこれまでのように作りたい物を考えて作っていくのでは無く、やりたそうな事で使えそうな当たりをうろちょろして、偶然行けそうなのに当たったらそれをサービスにする、みたいなやり方にならざるを得ない。
この「やりたそうな事のあたり」の範囲がどの位広いかで、どの位当初考えていた物に近い所に着地出来るか、というのが決まる気がする。

デモでちょっと面白い動きをする所までは結構簡単に行くのだが、それを実際のサービスに載せようとすると、従来のサービスの感覚で機能を考えた時には全然ダメなケースが大量に出てきて使い物にならない。
だから、まずそもそも、サービス側の仕様的な部分で、ある程変な動きを許容するように考える必要がある。
見せ方として、変な動きをしてもユーザーが納得出来るように見せる。
これは実際に使われているサービスだと大変うまくやっている。

一方でやっぱりサービス側の仕様的な所の妥協の余地にも限界はあって、どうしてもここは譲れない、みたいなラインも必要。
ここを頑張らないとちょっと面白い動きはしても、結局使わない物になってしまう。
この頑張りの部分が「JSFを使えばこんなに簡単に以前のペットショップの例が書けます」みたいなデモ的な事と、実際のサービスで必要な物とのギャップを埋める部分に対応していて、ここが結構大変なのはこれまでの開発とそんなに感覚は違わない気がする。
そこはこれまでの経験に前回の仕事で学んだ範囲の補正でまぁまぁ正しく把握出来ていた気がする。

画像解析系が予想よりも難しかったのは、理解しがたい挙動をする度合いがリコメンドより大きい、という所だった。
XGBoostだって変な動きするけど、Inception v3とかの方がよっぽど変な動きをする。
そしてこの度合いはしばしば、実際のサービスでは使い物にならない位変な動きをする。
バグなのかどうかも良く分からない。
この凄く予測不能な動きをする物を抱え込んで実サービスを作る、という事を、良く理解出来ていなかった気がする。

自分の考えだと現時点で画像分析をサービスに組み込むべきか?と問われたら、多くの場合で「組み込むべきだ」と思っている。
凄く多くのケースで実際にとても便利なサービスを作るポテンシャルがあり、大抵のサービスで使いみちがある位多様な使いみちがあると思う。
ただ、多様な使いみちがあるけれど、一方で出来ない物も凄く多い。
ちょうど有理数は無限個あるけれど、実数の方がずっと多い、みたいな話に似ていると思う。
適当にえいっとダーツを投げると、必ず実数の方にあたる。偶然有理数に当たる事は無い
ただ有理数も十分に広い範囲に無限にある。
だから従来の開発とは違う物、と割り切って今の世代に合わせて、多くのサービスに組み込んで行けば良いと思う。

ただ、実際にどういう事が出来そうかを自分らの興味のあるドメインで当たりをつけるだけで、普通に二人月とか掛かる事を覚悟しておく必要はある気がする。
ここを自分は見誤っていた。

なお、この当たりをつける段階でやった事の進捗とかは、全く管理出来る感じじゃない。
優秀な人がリーダーとなってシステマティックに下々の人々にやらせる、みたいなのも出来そうに無い気がする。
ぱっと見良さそうなデモから実サービスまでの間を埋めるのも、従来よりは大分難度が上がる上に、この「ちょうど良い」所のぱっと見良さそうなデモまでたどり着くのも結構大変だ。
既存のいかにも流行ってる話題にそっくりな例であっても、「ちょっとだけ」問題設定を変えるだけで全く予測不能な振る舞いをするので、パクるのも全然出来ない。

この辺の不確定さ、難しさは、「これからはディープラーニングだ!」とか煽ってる人達は、まるで無いかのように振る舞うが、実際に実務でやるなら凄く重要な要素に思う。
しかもこの難しさは、従来のレコメンドなどの機械学習のモデルよりも大分手強くなっている。
まだまだ我々の対応出来る範囲だが、大分やり方や考え方は変える必要がある。