1.はじめに
NTTドコモ サービスイノベーション部の阿部です. 普段はデータ活用・AI活用を社内で促進することをミッションとして,データ分析や考察をするAIエージェントなどの技術検証と開発をしています. 本記事ではGemini CLIとUnityを使って,強化学習を直感的に理解しようとした経験談を記載します. 本件は業務外の個人的な興味としての取り組みとなっております.
2.ゴール
Unity上で強化学習を実装することで,強化学習を直感的に理解することをゴールとします.せっかくなのでGemini CLIで実装することで,現時点でのGemini CLIでの限界点も探れたらと考えています.
3.開発環境構築
Unityも強化学習もほぼ未経験の状態から始めます.Unityの解説動画は無数にありますが,まずはGeminiだけでどこまで実装できるか検証してみます. ひとまずGemini CLIを入れます.

今回はUnityのML-Agents*1を使用してみます.ML-Agentsは,Unity上でNPCの行動制御やシミュレーションを実装するためのパッケージです.Unityでのシーンや学習の設計をサポートするもので,機械学習モデル自体は構築する必要があります.
せっかくなので,Unity内の環境構築でもGeminiを使ってみます.
Gemini CLIでも理解・設計しやすいオブジェクト構成がよいと思ったので,ボールの上で少しでも長い時間落ちないようにバランスをとり続けるエージェントを構築します.
余談ですが,最初はランダムな水が入ったペットボトルを綺麗に1回転させるペットボトルフリップを手指のエージェントに学習させることを検討しましたが,強化学習するには手指の関節が多すぎたのと,ローポリで掴めるペットボトルの蓋を用意するだけで力尽きたのでやめました.

エディタ上で,RollerAgent(親),Body(胴体),4本の足(Leg_FR, Leg_FL...)とBall(ボール)でオブジェクトを構成しました. これをGemini CLIに対して,自然言語で要件を伝えます.

Project内に新規ソースコードを自動で作成してくれますが,Hierarchyの階層設計やInspectorの詳細設定などは指示出しに留まり,実装自体には人の手が必要でした.ただ,これは時間が解決してくれるような気がしました.
4.強化学習の実装
今回は,エージェントやロボットを連続値で制御する際に,高精度な学習が期待できるSoft Actor-Critic(SAC)*2を用いて,強化学習を実装します.
従来の強化学習では,時刻における報酬を
,方策
に従った場合の期待値を
とおくと,目的関数
を次の式で表すことができます.
上記では,将来にわたって得られる報酬の合計値を最大化することを目指しています.
今回採用したSACは,上記に加えて行動のばらつきも同時に最大化することを目指します.
時刻における報酬を
,方策のエントロピー(行動の多様性)を
,報酬とエントロピーのバランスを調整する温度パラメータを
,これらの方策
に基づく期待値を
とおくと,SACが最大化する目的関数
は,次の式で示すことができます.
行動のばらつきの最大化とは,長期的に考えたときに,報酬が最大化する可能性があるルートを可能な限りキープしておくようなイメージです. 今回のタスクの場合,エージェントの大ジャンプによって落下判定をもらわない状態が長時間続いてしまうような事態を防ぐはたらきがあります.
上記を踏まえて,報酬を以下の5点で設計しました.
- エージェントのBody部がfallHeight以上の場合,0.1秒ごとに+0.1,1.0秒ごとに+0.3の報酬
- 報酬の合計が+24.0(10秒間)に達した場合,+3.0の報酬
- エージェントのBody部が2.0m以下に達した場合,-1.0の報酬を与えてエピソードを終了
- エージェントの脚が4本全て床に接触した場合,-1.0の報酬を与えてエピソードを終了
- エージェントとボールが6.0m以上離れた状態が2.0秒継続すると,-1.0の報酬を与えてエピソードを終了
観測情報には,エージェントとボールの位置座標に加えて傾き,角速度,各脚の回転を含めています. 冒頭の10万ステップはエージェントをランダムに動かし,多様なデータを収集することで,以降の学習に活かしてもらうためです. 学習用のコードはGeminiに書かせましたが,Jointの剛性や減衰をエピソード単位で初期化したり,(今回は強化学習の全体像理解がゴールのためSACに限定しましたが)SAC以外のアルゴリズムとしてProximal Policy Optimization*3を用いた実装の提案など,初手からしっかりと回答・実装してくれていたので,Unity×強化学習における知見もかなりインプットされている印象を持ちました.

真球は難易度が高いため,少し潰しました.ちなみにエージェントは4.0m弱あります.
5.評価
エピソード毎の報酬グラフを図示します.薄い青色が実際の報酬曲線で,濃い青色が200エピソードで平均した移動平均線です.

6,000エピソードまで学習を進めてみました.3,400エピソードあたりまではランダムに足を動かし,以降はそれまでのエピソードを基に学習を進めています.が,2.3前後で頭打ちになっているようです.エピソード終了時に-1.0されることを考慮すると,およそ2.5秒で転んでいることがわかります.うーん.
原因としては,関節の無い4本足の制御というタスク自体の難易度が高いことに加え,オブジェクトのパラメータ(足の摩擦係数やジョイントの可動域など)がまだまだ完璧に調整できていないことが挙げられます.
6.まとめ
6-1.感想
ユーザが最低限の要件やコンポーネントを用意したとしても,Gemini CLIだけではまだまだ綺麗な実装は難しいと思いました. ただ,開発環境の構築や強化学習の報酬設計となるAgent.cs,補助スクリプトの作成においては,Unity初心者でも経験者でも頼もしい存在だと思います.個人的にはHierarchyやInspectorの操作と設定に指示出ししてくれた点が,なんとなく考えていた構想をざっくりと形にしながら,Unityにも慣れることができたためありがたかったです. 一方で,Unityを普段から触っているユーザであれば,Inspector設定まで完遂してほしいと思いそうですが,ここは前述の通り時間が解決してくれると思いました. さらに学習の質を高めるための検討は,エディタ画面を見ながら人の手で泥臭くパラメータを調整し,試行錯誤する必要があります.
6-2.得られた知見
今回はUnityでの実装を通じて
- 強化学習の設計やアルゴリズムの一例を直感的に理解する
- Gemini CLIを用いた実装と設計の限界点を探る
ことをゴールとしていました.上記2点に関する結論としては
- SACを強化学習における一例として実装し,設計→実装→学習→評価のフローを視覚的かつ直感的に理解できた
- Gemini CLIを用いた実装は,現時点では強化学習の設計等のVibe Codingに近い使い方が主となり,Unity内の設計はファイル情報を参照した指示出しに限定されている
となります.
7.おわりに
ユーザが手作業で開発していく要素が急激に減ったわけではありませんが,Gemini CLIがUnity開発への参入障壁を下げていることは事実だと思います. ほんの数時間で強化学習の設計とUnityの基本構成を学びながら,複数のエージェントが動くところまで持っていけたのは良い経験になりました.
せっかくなのでもう少し強化学習を勉強しながら,綺麗な報酬曲線を描いてくれるところまで調整してみようかなと思いました. ゆくゆくはペットボトルも1回転させたいです.
*2:T. Haarnoja, A. Zhou, P. Abbeel, and S. Levine, “Soft actor-critic: Off-policy maximum entropy deep reinforcement learning with a stochastic actor,” in Proceedings of the 35th International Conference on Machine Learning, vol. 80 of Proceedings of Machine Learning Research (PMLR), pp. 1861–1870, Jul 2018.
*3:J. Schulman, F. Wolski, P. Dhariwal, A. Radford, and O. Klimov, “Proximal policy optimization algorithms,” arXiv preprint arXiv:1707.06347, Aug 2017.