サービスに機械学習技術(例えばSVM)を入れる際に、「この機械学習技術は本番サービスに投入しても大丈夫なものか?」を考える基準がまとまっていると人に説明するときに便利だなとふと思ったのでまとめてみました。散々言われ尽くされている話だとは思います。
前提
機械学習がプロダクトの主要な武器になる(例えば最近話題になっているGoogle翻訳におけるNMT)ものではなく、サービスにデータがまずあり、機械学習でデータを活用することにより、そのサービスを支えていくようなものを前提に考えています(例えばCGMサービスのスパム判定)。また、投稿内容は私個人の意見であり、所属組織を代表するものではありませんとお断りしておきます。
考慮に入る採用基準
予測精度
- state-of-the-artである必要は必ずしもないが、それに大幅には負けない程度の予測精度が出る
- 学習データが同じで数%劣っている程度ならば、複雑なモデルにせずとも学習データを増やせば同じ予測精度まで行けることも多いため
(コードの)メンテナンスの容易性
- 理論の学習コストが低く、新しい人員がきてもメンテナンスしやすい
- ちゃんと学ぶには高級な数学が必要...なものは厳しい
- ある程度の線形台数、微積の知識(要言語化)さえ抑えておけばOKくらいのものだとよい
- なおかつ、実装するときにはパーセプトロンくらい簡単だとさらによい
- 例えば一時期のノンパラベイズとかはエンジニアに勉強してくれというのは辛い
計算オーダー
学習時
- 学習データを大規模化しても動く
- めっちゃメモリがないと学習できないような計算オーダーだと厳しい
- オンラインでモデルを更新できるか、バッチでも早く終わるものを選定したい
予測時
- kNNのような分類時に全学習データを持っておく必要があるものはメモリもdecodeのスピードも厳しい
- 計算機の管理維持コスト的にはこちらのほうが大きいかもしれない
挙動のコントロールのしやすさ/予測説明性の容易さ
- 間違い方に一貫性があるならば
- なぜ合っているか分からないモデルよりはマシ
- どういう特徴量を追加すれば精度が上がりそうか、どういうデータを追加すれば精度が上がりそうか検討を付けられる
- 例えば線形回帰モデルならば、係数の大きさを見ればモデルがなぜその値を出したのか大雑把に検討が付く
チューニングの必要性
- ハイパーパラメータの数が多い or ハイパーパラメータに対して精度が大きく変わるとチューニング地獄になる
- 局所最適解にしか到達しないモデルは初期値を色々割り振って学習させないといけないため、同様にチューニング地獄になりがち
その他
- 主要な言語でライブラリ実装がある
- (パフォーマンス要件等により)最悪自前実装することになったとしても、再現が取りやすい
まとめ
以上のことを考慮すると、現実的に問題なさそうなのはこんなところに落ち着きそう。無難ではある。よく聞くけど、自分で試したことがあまりないものは(?)を付けています。自分が使ったことがあるor周りで使われるのをある程度聞いたことがある範囲なので、抜けがまだまだあると思います。
- 回帰: 線形回帰、SVR、Random Forest含む決定木関連の手法(?)
- 分類: SVM、ロジステック回帰、Naive Bayes、パーセプトロン、Random Forest含む決定木関連の手法(?)
- 構造学習: CRF、HMM、構造化パーセプトロン(MIRA等の派生を含む。参考)
中でも非線形性も扱えて大域的最適解に行ってくれるSVMは安心感がある。