目次
はじめに
AIエバンジェリストの浅田です。
AI、とくにディープラーニングなどの機械学習における学習プロセスは、人生で物事を上手に行うための心得に通じるものがあると感じます。
自分はアピリッツに中途でジョインして、この4月で丸10年となりますが、自分の過去を振り返った時に、これらの考え方を自分が初心者の頃に魂に刻んでおけば、今よりうまくエンジニア人生を送れていたと思います。そこで、AIの学習処理の概要について軽く触れつつ、自戒の念を込めてそれらについて書いてみたいと思います。
機械学習の学習プロセスの概要
まず、ディープラーニングの機械学習における学習プロセスを簡単に書くと以下のようになります。
- 達成すべき「指標」を決める
- 現在の「状態」と達成すべき「指標」との「差分」を確認する
- 「差分」を改善するための「計画」を考える
- 「計画」にしたがって「実行」する
- 指標を達成するまで繰り返す
端的に言ってしまえばPDCAを回すという当たり前のような話なわけですが、これを徹底的に行っていることが、AIが価値を発揮していることにつながっているわけです。AIは様々なタスクをこなせるようになっていますが、やっていることの原理はシンプルですね。
では、それぞれの項目からどんな知見が引き出せるか見ていきましょう。
達成すべき「指標」を決める
機械学習の文脈で言えば、学習に使用するデータの用意、解決すべき問題の定義、そして達成すべき精度の設定になります。最終的な成果を決める重要な部分です。
人生で言えば理想とする「あるべき姿」を思い描くといったところでしょうか。どんなエンジニアになりたいか、何をできるようになりたいか、何を達成したいのか、というビジョンが具体的であればあるほど、後続のプロセスが容易になります。
自戒的な意味合いで述べると、自分がエンジニアになろうと思った理由の一つに、当時見た映画「ソードフィッシュ」の主人公がかっこよかったからといったような、あまり具体的ではない動機がありました。あまり明確なエンジニア像ではなかったので、当然目指すべき方向性はあやふやでした。
とはいえ、自分のケースは極端だとしても、論語に「五十にして天命を知る」という言葉があるように、最初から明確にあるべき姿を規定するのはかなり難しい部分でもあるかと思います。それにフィクションであれノンフィクションであれ、憧れは強い原動力になるかと思います。
現在の「状態」と達成すべき「指標」との「差分」を確認する
機械学習の文脈で言えば、「損失関数」の設定にあたります。損失関数とはAIの予測がどれぐらい外れているのかを評価するための仕組みです。関数というとイメージしにくいかと思いますが、要は計算可能な数学的表現ということです。この関数が弾き出す数値を小さくしていくことが、学習の目的になります。
人生で言えば理想とする姿と現在の状態との差分についての状況分析(自己分析)ということになるでしょう。まずは「自分に何ができていなくて、何をできるようになる必要があるか」を正確に認識することが重要になります。これができれば、努力した結果ちゃんと目標に近づけているのかどうかをチェックできるようになります。
「差分」を改善するための「計画」を考える
機械学習の文脈で言えば、「最適化関数」の設定にあたります。最適化関数とは、前段の損失関数によって認識できた損失(つまり、理想の状態との差分)を小さくしていくためのアルゴリズム(計算手順)です。
人生で言えば「今の自分と理想の自分との差分をどう埋めていくか」を考えていくことにあたるかと思います。この方向性を誤ると、間違った方向に努力してしまうか、非効率的な努力をしてしまうことになります。
個人的な話ですが、何かを始めようとした時に、体系的な学習を済ましてから取り掛かろうとする癖があります。これは悪癖だと思います。体系的な学習をすること自体は重要です。ただ、体系的な学習を済ましてから取り掛かろうとするのはかなり非効率的です。体系的な学習が済んだと判断するのは難しいですし、時間的なオーバーヘッドも大きいです。概要部分をざっと掴むことを優先し、あとは実践を通して学ぶというのが一番効率がいいように思います。要は「習うより慣れろ」ということですね。そして体系的な学習も並行して行うのがベストかと思います。
「計画」にしたがって「実行」する
機械学習の文脈で言えば、最適化関数のアルゴリズムに従って、新しい方法(パラメータ)で予測を実行してみるということになります。最適化関数の選択が適切であれば、損失関数の結果(つまり、現在の状態と理想の状態との差分)は前回より改善される可能性が高くなります。「可能性が高くなる」と書いたのは、実際には複雑な条件が絡み合ってくるので計算通りに改善されないケースもあります。ただ、その結果によって次の最適化関数で改善する指針を得ることができます。
人生で言えば、実際にアクションを起こすターンになります。ここまでのプロセスは頭の中での計算でしかないので、実際にやってみると思った通りにいかないということもあるでしょう。面白そうだと思っていたことが実際にやってみるとそうでもなかったり、あるいはその逆に、興味をもてなさそうなことが実際にやってみると面白かったりすることもあります。いずれにしても、貴重なフィードバックを得ることができます。
自分が就活生だったころはインターン制度は今ほど一般的ではありませんでした。最近はインターンで業務の一旦を経験できるので、非常にメリットのあることだと感じます。
指標を達成するまで繰り返す
機械学習では、状況の変更(最適化関数によるパラメータの更新)と状況の評価(損失関数による損失の計算)を、目的の指標を達成するまで繰り返します。機械学習においては、一回のサイクル(エポックなどと表現されることもあります)で目標を達成できることはまずありません。数十、数百回の試行を繰り返すことになります。
目指すべき姿が明確で、それを達成する適切な方法がわかれば、あとはそれを最後までやり遂げるだけです。ただ、人間の場合、この「最後までやり遂げる」というのが一番難しいのではないでしょうか。機械学習の場合、まさに機械的に繰り返すことができますが、人間はそう単純ではないと思います。成果をなかなか感じられなければやる気も減退します。なので、モチベーションを保つ方法を見つけることが重要になります。
モチベーションがどこからくるかは人それぞれだと思いますが、個人的には「楽しさ」から来るものが一番強いと思います。「好きこそものの上手なれ」というやつですね。至言だと思います。
自分の場合は本屋さんの技術書のコーナーで新しい技術の本がたくさん並んでいるのを見ると、言葉では言い表せない「ときめき」のようなものを感じます。新しいものを「学ぶ・知る」ということが好きなのだと思います。そういう気持ちを忘れないでいたいものです。
失敗することも必要
こんな話があります。
10個の画像があります。そのうち9個は「りんご」の画像で、1個が「みかん」の画像です。これらの画像をランダムに見せられた時に90パーセントの精度で「りんご」を検出する仕組みを作る一番簡単な方法はなんだと思いますか?
答えは「常に『りんご』だと判定するようにする」です。
これはAIの世界でいうところの「データによるバイアス」の典型例です。良くも悪くもAIはデータから学習してしまうので、何も考えずに上記のデータから学習させると、高確率で「りんご」と答えてしまうAIになります。なので、AIの学習に使うデータはなるべく偏りがないようにすることが重要なのです。データが50:50の状態で90パーセントの精度を目指すために学習すると、「りんご」と「みかん」を区別するために本質的な特徴を捉えるようになり、結果的によりロバスト(堅牢)なAIになります。
AIが学習するのはデータですが、人間が学習するのは経験です。先ほどの例になぞらえるなら、うまくいった事例しか経験してなければ、なぜうまくいったのかを本質的に認識することは難しくなります。なので、成功体験も重要ですが失敗するということも同じように重要だと思います。大抵の失敗はリカバリーが効きますし、長い目でみれば成功確率も上げることになると思います。
おわりに
変化の激しい時代です。Webアプリケーションを構成する流行りの技術スタックも数年単位でガラっと変わってしまいます。生成AIの登場によって、さらに変化は加速しようとしています。そんな中で理想とする「あるべき姿」が変わっていくことも当然あるかと思います。「リスキリング」という言葉もよく聞きますし、むしろ変化していくことが普通の世の中になっていくのかも知れません。
私自身も元々アピリッツに転職する時には「Webエンジニアになりたい」という思いで転職してきましたが、この10年でWebエンジニア、クラウドエンジニア、AIエンジニア、と目指すべきエンジニア像が変化してきましたし、今後もまた変化していく可能性はあります。いずれにしても、変化を厭わず、学び続けることが重要なのだろうと思います。
なお、アピリッツは様々な職種のポストがありますし、今までなかった職種やポストが新設されたりもしてもいます。そんな環境なので「あるべき姿」が変わっていったとしても、受け入れられる懐の深さがあるのも魅力の一つかと思います。