※『Practical Developers ――機械学習時代のソフトウェア開発
[ゲームアプリ/インフラ/エッジ編]』解説より。
機械学習(machine learning、ML)は歴史のある概念で、ディープラーニング(deep learning、深層学習)の登場で一気に浸透しました。そのようななか、サービスやソフトウェアエンジニアリングにおける問題の捉え方やアプローチも大きく様変わりしてきたと実感されている方も多いのではないでしょうか。たとえば、かつての開発ではパラメーターをいろいろと変えながら解法や望む結果を探るような手法は積極的にはとられませんでした。しかし、機械学習では、種々のステップにおける試行錯誤は精度の向上などに欠かせないほどで、新たに学ぶ人にとっては、もはやこれが自然なアプローチになりつつあるようです。
今、機械学習の研究は、成熟してきたものが続々と実サービスへ本格投入される段階にさしかかってきました。今後もこのトレンドは続くと言われています。この「機械学習」という新しいコンポーネントがシステムに加わることになると、どのような変化があるでしょうか。たとえば、
- 大量のデータが必要
- モデル(ネットワーク)作成に時間がかかる
- 学習済みモデルの中身は解釈できない
- 想定外の実行結果とその対策
- モデルは変わる、複数ある、バージョン管理の問題
- 精度と速度における考え方
といった機械学習機能自体に直結した、あるいはごく近い部分での変化がまず浮かぶかもしれません。
一方、「機械学習」と言うと、その機能自体、アルゴリズム部分に注目を集めますが、実サービスに適用された時のアルゴリズム自体に関するコードの割合や検討項目は、他のコンポーネントと比べて比較的小さいことが多いものです。機械学習コンポーネントが動くシステムの側から見てみると、たとえば、
- クライアントとの通信において、機械学習機能を提供するAPIが大量のリクエストに耐えることができるようなインフラやリソース管理、そのモニタリングを行う
- 提供するサービスの品質を一定担保するために、機械学習に使用するデータが学習のたびに変わることのないようにチェック/管理する。予測結果が大きく変わってないかを自動で検証する
- サービス向上のために、新たなモデルを手軽にデプロイできる設計、依存性の削減
などが必要になります。このような新機能に向けた工夫は求められますが、システム側から捉えた開発の根本の部分は大きく変わらないことも見えてきます。
これまでエンジニアが培い、蓄積してきたノウハウを十二分に活用しつつ、新たな価値を生み出せる領域という面を持つ機械学習。次々と登場する強力な研究成果とともに進化する、機械学習システムの開発は幅広いエンジニアにとって魅力のある分野の一つではないでしょうか。