Unity ML-Agents #2 様々な学習
2025/10/15
はじめに
この記事は前回からの続きです.開発環境や環境構築,学習環境作成についてはUnity ML-Agents #1 環境構築とはじめての学習をご覧ください.
今回は書籍4章の「さまざまな学習方法」の部分でつまづいたところ・注意することを共有します.
2025/10/15時点では,まだ4章の内容を終えていないので,途中までの内容となります.
様々な学習
SAC,Discreteではつまづく部分はありませんでした.学習結果は前回のRollerBallとほぼ変わらなかったです.
Visual Observationは学習が長すぎて実際学習できているのかよくわからないです.今後学習ができるようになったらまたここに追記しようと思います.
Raycast Observation
ここが一番困りました.
というのも,
- だいたいどんな挙動になってほしいのかはイメージできるけれど,それが正しいかわからない
- 書籍に書いてあることだけしてもイメージ通りの挙動にならない
という問題がありました.なので,これから書くことが本当に著者の想定通りかどうかはわからないですが,多分こういうことなんじゃないかと思って書きます.
書籍のとおりに実装すると多分こうなると思います.

書籍では ”「前進,後進,左回転,右回転」で移動する” と記述があったので,転がる挙動は間違った挙動だと思います.
これを改善するには,RaycastAgentのInspectorを変更する必要があります.
Rigidbody/Constrains/Freeze RotationのXとZのチェックボックスにチェックを入れます.
これで転がらなくなると思います.

この状態で学習をさせると,

こうなりました.多分これであってると思います.
この後もこのプロジェクトをもとに別の学習も行うのでこのプロジェクトもエクスポートすることをお勧めします.
セルフプレイ
ここでも説明不足と思われるような部分がありました.
すべてのオブジェクトとスクリプトを書き終えた後,global変数を指定する手順が抜けています.
- 2つのオブジェクト
ScoreAreaのGame Managerの項目にGameManagerのスクリプトを設定します - 2つのオブジェクト
ScoreAreaのAgentIdにはそれぞれのPingPongAgentとは逆のIdを指定します(例えば手前側のPingPongAgentのAgentIdが0なら手前側のScoreAreaは1にする) - 2つのオブジェクト
ScoreAreaのTeamIdにそれぞれのAgentIdと同じIdを指定します - オブジェクト
GameManagerのAgentsに2つのElementを作ります.2つのPingPongAgentをそれぞれに設定します
これらをしないと,ゲームとして成り立たせることができません.
学習した結果を片方のPingPongAgentに適応させて遊んでみました.奥がAIです.

学習不足かたまに失敗するときもありますが,おおむねはじき返してきます.
Curiosity
ここでは,書籍そのままやってもうまくいかない部分がありました.
そのまま実行すると,レーザーの発射部分が壁に埋まって壁を検知できなくなり,うまく学習できなくなってしまいました.
その対策としていろいろやってみたのですが,これであってるのかどうかはよくわかりません.
- 壁を分厚くする
- オブジェクト
RaycastAgent/SphereにSphereColliderを追加する.
これで何とか学習してくれました.
結果がこちらです.

学習が足りないのか方法が間違っているのかわかりませんが,後ろ向きに進んでいます.なんとか一周できてるというような感じです.
ここから先はまだ勉強中です.
これから追記していく予定です.
Discussion