はじめに
深澤 (@qluto) です。
LayerXの機械学習グループでは、今年8月から9月にかけて、初のサマーインターンシップを開催しました。参加者のスケジュールに合わせた柔軟なプログラムで、3週間という短期間ながら、機械学習技術を核とした機能開発に取り組んでいただきました。
インターンシップの運営を通じて、機械学習エンジニアリングにおける特有の課題や、その解決方法について多くの学びがありました。本記事では、その経験を踏まえ、現役の機械学習エンジニアや学生の皆さん、そしてLLM(大規模言語モデル)のような非決定的な振る舞いをする機械学習モデルをプロダクトに組み込もうとしているソフトウェアエンジニアの方々に向けて、効率的な開発手法や課題解決のポイントを共有したいと思います。
解決すべき課題の見極めの重要性
LLMが脚光を浴びているように、機械学習で実現可能なことは飛躍的に増えています。しかし、その広範な可能性の中で「誰の」「どんな課題」を解決するのかを明確にすることが、プロジェクトの成功には不可欠です。
たとえば、LLMを用いてユーザーの問い合わせ対応を自動化する場合でも、対象となるユーザー層や具体的なニーズを深く理解しなければ、効果的な解決策を提供することはできません。技術そのものに目を奪われるのではなく、解決すべき課題を的確に見極め、その課題に最適な技術を選択する姿勢が求められます。
適切な課題設定が行われれば、その後の技術選定や開発プロセスもスムーズに進みます。逆に、課題の見極めが不十分だと、リソースを無駄に消費し、期待する成果を得られないリスクが高まります。
インターンシップ期間中に出たアイディアの一つとして、LLMによる合成データ生成の話がありました。確かにLLMによる合成データは研究も盛んであり、ピッタリ課題にはまれば大きな成果につながり得ます。ただ、その時は固有表現抽出タスクを扱っており、実際に課題の第一仮説だったのはデータセット内の固有表現のバリエーション不足でした。
これを解消するのに最も確実で安く早い方法は、外部データベースにある固有表現リストと単純なスクリプトによってデータの一部を差し替えた合成データを用意することでした。
To make great products: do machine learning like the great engineer you are, not like the great machine learning expert you aren’t.
Rule #1: Don’t be afraid to launch a product without machine learning.
やや古い文章ではありますが、Rules of Machine Learning: Best Practices for ML Engineering というガイド冒頭にはこのように書かれています。 偉大な機械学習の専門家としてではなく、偉大なエンジニアとして機械学習を取り扱うべきであり、その第一歩目には機械学習抜きでプロダクトを作ることを恐れるなとまで言っています。 LLMが誰でも自由に使えるようになった今、この判断の閾値はグッと下がったとは思います。 ただ、ハードコーディングされたごくごく簡単なパターンマッチングで実現したいことのほとんどがカバーでき、それから外れてしまう例外に関してもさほど課題にならないのであれば、LLMを使うことは開発者の独りよがりとすら言えてしまいます。
この考えをまずは出発点としながら、本当に解決すべき課題は誰のどんな課題なのか、それに見合った妥当なアプローチは何なのかを見極めるところを踏み外さないのが何より大事だと考えています。
不確実性を下げるための仮説構築
今回のサマーインターンシップでは3週間、弊機械学習グループで普段回しているスプリントサイクルだと2週間。定常的なリリースサイクルだと1週間。小規模なモデルの学習サイクルであれば1日。実際に開発に取り組む中ではリソースの制約やリズムが常に存在します。 その中でうまく不確実性を下げ、提供価値を確かなものにするためには、重要な課題に対する仮説を構築し、その検証を通じて次の行動を明確にすることが重要です。
良い仮説とは、結果がどうであれ次のステップを定める指針となるものです。たとえば、「エラー分析をしたところ、学習データの中にノイズとなるようなデータが多く含まれていることが分かった。データの前処理を改善すればモデルの精度が向上しそうだ」という仮説を立てた場合、その検証結果に応じて、前処理の方法を確定するか、別の要因を検討するかが決まります。この場合、モデルの安定性は増しても精度が上がるところまではいかないかもしれません。であれば、次に心当たりがある部分への施策を打てば良いわけです。何の見当もない行き当たりばったりの進め方であれば、うまくいかなかった時に路頭に迷ってしまいかねません。
インターンシップ開催期間中には、毎日の終わりごろに夕会と称して今日の成果と明日取り組むことを話す場を設けていました。弊グループでは初のインターンシップだったこともあり、最初はこの場の型めいたものが特になかったのですが、ぼんやり議論が発散してしまったり、インターン生にも、次に取り組むことについて思いつく手立てを挙げてもらったがはてどうしよう……という感じで引き締まった議論になりにくかったという課題がありました。
「現状 / 今ある課題に対して考えられる仮説 / 仮説に対するアクション」を夕会前に考えてもらった上で話し始めるようにするといった工夫を行うようにし、モデルの性能が高くないのは何故だろう、そのために突き止めるべきはなんだろうということにお互い思索をめぐらせられることで、できるだけ引き締まった議論が進むようにしていました。
これは機械学習モデルに向き合うときだけの話ではなく、エンジニアリング一般にも通用する話です。 ソフトウェア開発においてバグに向き合うときのトラブルシューティング時は、発生箇所の特定、発生原因の切り分けを素早く進めていくのが大事だと身をもって知っている人は多いかと思いますが、それと同じ話です。
このような仮説検証のサイクルを繰り返すことで、不確実性を段階的に減らし、効率的な意思決定が可能となります。重要なのは、仮説が正しいか間違っているかではなく、その検証を通じてプロジェクトを前進させることです。
フィードバックサイクルを短縮するための工夫
モデルの性能に関するピンポイントな仮説を立てることは難しい場合も多いので、「打席に立つ回数をできる限りあげればその分あたりをつかむ可能性が上げられるはず」という環境づくりも非常に効果的になってきます。実際のところ、弊グループで現在進行中のプロジェクトでは、モデリング施策を素早く投入できるようにすることを第一に据えています。
ソフトウェア開発において、ひとつの関数に対する単体テストであれば、実装した内容の検証サイクルは数秒で済みます。 より統合的なテストであれば数分、人の目や一連の操作やデータ投入を伴ったQAとなると日単位にまで達するかもしれません。
大量のデータを伴った機械学習モデルの学習となると、それだけで数時間から数日(LLMであればそれこそ数ヶ月)の計算時間を要します。何の工夫もなければ、些細なミス一つで大量の時間を犠牲にしてしまうリスクを背負ったままです。
今回のインターンシップ期間は機械学習モデルを中心に据えた上で3週間という期間だったので、素早く検証が進められることがことさら大事でした。データ変換時のバグを修正するのに毎回全体の処理を回していては無の待ち時間が何回も発生してしまっているという状況を隣の席からキャッチし、まずはデータを削って処理する、デバッガで処理状況を確認する、欠損値やnullの存在を確認してからデバッグにあたるなど、細かいけれどもチリつもで大事になってくる工夫をおすすめしていました。
また、大量の計算時間がかかる学習は、業務時間終了時に投入できていると最大限時間を使いきれるので良いといったことも、改めて口にする機会となっていたように思います。
こういった課題を解決するためのさまざまな工夫については、すでによくまとまっている資料があるので、それを紹介します。 取り上げられている具体的技術内容はやや古いかもですが、このスライドに書いてあることのエッセンスは今もこの先も変わらないでしょう。
モデル性能の劣化を検知するメトリクス設計
機械学習モデルはプロダクトの機能を果たすための一部品として収まり、実際のプロダクト上のユーザの振る舞いによって初めて期待通りのものが開発できたかがわかる……といった状況にもなりやすいです。リリース後もデータの分布が時間と共に変化し(データドリフト)、リリース当初の性能が発揮できない状況も自ずと発生しがちです。
モデルの性能を安定的に評価し、劣化を早期に検知するためには、適切なメトリクス設計が欠かせません。
- 固定された検証データの使用: 一貫した評価を行うために、検証データセットを固定し、異なるモデルや実験条件でも比較可能にする
- データドリフトのモニタリング: 本番環境でのデータドリフトを検知するためのモニタリング機能を実装し、モデルの再学習や調整のタイミングを判断する
- リアルタイムメトリクスの導入: モデルの予測結果やユーザーの反応をリアルタイムで収集・分析し、問題の早期発見と対応を可能にする
これらの取り組みにより、モデルの性能劣化によるリスクを最小限に抑えることができます。
今回の3週間というインターンシップ期間ではこの手の性質の話にまで踏み込むことはなかったのですが、今後弊グループで中長期インターンシップを行う際にはこのことも意識をしたいなと考えています。
おわりに
機械学習エンジニアリングにおける課題解決のポイントと、効率的な開発手法について解説しました。 手練の機械学習エンジニアにとっては基礎的な話ですが、全て息を吸うように完璧にできているかという自己点検として有意義ですし、こういった性質の問題領域に新たに飛び込んでくる人たちにエッセンスをうまく受け渡して行きたいので書き起こしてみました。
冒頭に書いた通り、技術の可能性が広がる一方で、適切な課題設定や仮説構築、不確実性を下げるための工夫が、これまで以上に重要になっています。
非決定的なモデルを扱う際には、データの変化やモデルの不確実性を念頭に置き、定量的なメトリクスによる評価とリスク管理を徹底することが求められます。また、フィードバックサイクルを短縮し、迅速な意思決定と改善を行うための工夫も欠かせません。
大学での科学技術論文の執筆プロセスは、これまで述べてきた思考法やスキルを身につける絶好の機会です。
- 課題設定の重要性: 研究テーマの選定は、その後の研究成果を大きく左右する。適切な課題設定が、研究の方向性と意義を明確にする
- 仮説検証のプロセス: 仮説を立て、その検証を通じて新たな知見を得るプロセスは、不確実性を下げるための基本的な方法である
- 結果の定量的評価: 実験結果を客観的なデータとして収集・分析し、結論を導くスキルは、実務で運用する機械学習モデルの評価にも直結する
- リスク管理と計画性: 研究計画の策定やリスクの予見と対策は、プロジェクトマネジメントにおいて重要な能力である
大学での研究や論文執筆を通じて得られるスキルや思考法は、実務においても大いに活かせます。
現役の機械学習エンジニアやソフトウェアエンジニアの皆さん、そしてこれから社会に出る学生の皆さんが、これらのポイントを活かしてさらなる飛躍を遂げられることを願っています。