機械学習案件は本運用乗せきってからが本当の勝負、みたいなところあるので気をつけて

機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて』を読みました。
つまづきから得られた知見の共有は貴重だと思います :thumbsup:

実際、機械学習とか最適化とか自律的なシステムの開発は、罠が多いです。
研究や試作では成功していても、様々な事情により実用化できず消えていくものを沢山見てきました。
そのため、本運用に乗せてユーザの受け入れも上々というところまで辿りつければ、それはそれは本当に喜ばしいことなのですが、そこから始まる試練も色々とあったりします :ghost:

ということで、運用後に体験したり見聞きしたことをいくつか、私も共有してみたいと思います。
ちなみに私の開発経験は、研究用シミュレータの受託とWebバックエンドの内製です :upside_down:

いつの間にか、精度が落ちてるみたいなんですけど?

入力に無効値や不正値が紛れこんでいた。

データは生き物です。クレンジングやバリデーションを作りこんでも、いずれ予期せぬことは起こります。
センサが壊れた、ユーザにハックされた、外部サービスが仕様変更した、などなど。
汚れたデータを学習すると、もちろん性能は落ちていきます。

データの遅延が大きくなっていた。

発生したデータはなる早で学習して活用したいものですね。
用途によって、発生から1時間後には活用したい、などの期限も存在するでしょう。
しかし、データを流しつづけていると、ストレージが圧迫されたり、流量がバーストしたりします。
いっそバッチが突き抜けるなどシステム障害が起これば検知しやすいのですが、そうでない場合、学習単体はうまくいってるのに推定値が役に立たないという事態が起きます。

データ量が少なくなっていた。

残念ながら、ユーザが離れたり、台風が来たり、障害が起きたり、などの理由でビッグデータがスモールになることがあります。
データが少なすぎると、いかに機械学習といえど頑張りようがありません。

サービス環境が変わった。

Deep Blue、ponanza、AlphaGo。
トッププロを倒したソフトウェアの活躍から分かるとおり、彼らはゲームで無類の強さを発揮します。
ただ現実世界をゲームとみなした時、そのルールが大きく変わることもよくある話です。たとえるならば、盤が広がったり、駒が降ってきたり、ちゃぶ台をひっくり返されたりします。ぎゃあ。

学習したモデルが更新されていない。

これはシステム障害なのですが、検知を漏らすとそのまま見落とされがちです。
古いモデルでも、しばらくはそこそこの精度で動いてしまうからですね。同じように、学習データが更新されてないとか、利用側が参照しそこねてるとかのパターンもあります。

暴発したので、今すぐどうにかしてください!

誤差を増幅させるようなフィードバックループができていた。

推定値を利用することで、次の学習データに影響を大きく与えるような場合に起こります。
たとえば、SNSで話題のニュースを要約して投稿するボットを考えましょう。うっかりフェイクニュースを学習して投稿したら、ボットの投稿がさらにバズってSNSでますます話題になり、より信憑性のある情報として学習してしまうかもしれません。

他のアルゴリズムとチキンレースをしていた。

株式市場の異常な急落を引き起こしたりするやつです。下がるから売る、売るから下がる、をアルゴリズムトレードが一斉に始めてしまうのですね。
恒常性のある系ならば揺り戻しが入るはずですが、機械はそれより速く目にも留まらぬうちに何かを崩壊させてしまう危険性があります。

特定のセグメントだけ異常な推定値を叩きだしていた。

最適化の対象としている全体誤差の値は低いままなのに、どこかで泣きを見るユーザが生まれたりします。
それをサービスとして諦められるのであれば良いのですが、ビジネスインパクトの大きいユーザが貧乏くじを引いた時なんかは厄介ですね。

ロギングや前処理にこっそり改修が入っていた。

機械学習の中身を知らない開発者が、別目的で改修した場合に起こりがちです。
ステージング環境で気づくべきなのですが、機械学習は同じ入力に対して同じ出力を返すとは限らないため自動テストしづらく、見落とされがちです。

原因よく分からないし再現すらできない。

とりあえず暴発前のモデルを使いつづけるか、涙を飲んで止めましょう。

そういえば、最近使われてないような♪

ユーザが飽きた。

人は新しいものに過度な期待をし、やがて幻滅してしまう習性があります。
サービスとして目新しさ以外の魅力が乏しかった場合、いずれ化けの皮は剥がれてしまうでしょう。

使い方に暗黙のコツがあった。

人は自分が無意識にできることは、他の人もできると仮定してしまう習性があります。
初期のユーザは、受け入れテストに参加したりレクチャーを受けたりしているうちに自然とコツを掴むものですが、えてして後続のユーザにはそのような機会がないものです。

ブラックボックスが敬遠された。

人はたとえ自分より優れていても、仕組みがよく理解できないものを怖がる習性があります。
丁寧に説明しようと、客観的なデータがあろうと、ダメな時はダメです。所詮、人と機械は分かり合えないのか……。

もうメンテできないので、潰しましょう☆

設計者や開発者がいなくなった。

あるある~。それなりにドキュメントは残っているのに、読める人がいないこともあるあるです。せつなさ炸裂~。

ハイパーパラメータのチューニングつらい。

いわゆる秘伝のタレだよね。ここもベイズ最適化とかできるとカッコイイよね。開発リソース足りないよね。

別機能とデータフローが絡み合いまくってる。

最悪、潰すことすらできないまであるとか何とか。我らがスパゲッティ・モンスターに祈りませう。

「俺たちの戦いはこれからだ!」

ええと、「こんなんやってられっか」なんて、げんなりしないでくださいね :sweat_drops:
べつに機械学習とか関係なく、どんなシステムであろうと障害は日々起こりうるものですし、全てに備えることはできません。
現実そこそこ上手く動くようにトレードオフを取りつづけるのが、エンジニアの仕事だと私は信じています。
それに、どれだけ手が掛かろうと机上の数式がよちよち動いた時は、とても可愛いものですからね。

ではでは。われわれ人間を必要としない真の人工知能が生まれるその日まで、精進していきましょう :muscle: