Unity ML-Agents无法学习简单赛车任务,求训练配置优化建议
多人赛车游戏ML-Agents训练失效问题分析与优化建议
问题背景
- 多人赛车玩法,操控球形赛车,车辆自动加速且有最高速度限制
- 仅提供两种核心控制:刹车(按住持续减速)、Boost(短时间加速至更高速度,持续2秒,冷却10秒)
- 赛道设围墙,速度过快或撞墙过猛会导致车辆掉落,掉落1秒后从最近checkpoint重生;赛道遍布Unity盒碰撞体类型的checkpoint触发器
当前ML-Agents配置
核心目标
- 尽快完成赛道并避免掉落;单轮次为完成一圈赛道或最多2500步(正常完成一圈需少于2000步)
动作空间
- 单离散分支,包含刹车、Boost、无操作三种动作
- Boost触发后进入状态,1.5秒后自动退出,冷却10秒;刹车持续输入保持刹车状态,且会直接取消Boost状态
奖励惩罚机制
- 惩罚项:掉落扣1分;通过弯道未掉落扣0.5分;0.2ms内重复刹车(spam操作)扣0.01分;Boost后1秒内刹车取消扣0.5分;每步扣0.001分(鼓励快速完成)
- 奖励项:通过checkpoint时奖励
0.1×(归一化速度平方)
观测输入
- 归一化速度、Boost取消惩罚激活状态、Spam Boost/Brake惩罚激活状态、车辆状态(独热编码)、前方弯道难度(独热编码)、弯道方向(独热编码)、弯道距离(归一化)、赛道位置检测射线、弯道检测射线
训练配置代码
behaviors: Race: trainer_type: ppo hyperparameters: batch_size: 512 buffer_size: 102400 learning_rate: 3.0e-4 beta: 5.0e-4 epsilon: 0.2 lambd: 0.99 num_epoch: 5 learning_rate_schedule: linear network_settings: normalize: false hidden_units: 128 num_layers: 2 reward_signals: extrinsic: gamma: 0.99 strength: 1.0 gail: gamma: 0.99 strength: 0.05 demo_path: Assets/ML-Agents/Demos/LegoV7.demo behavioral_cloning: strength: 0.5 demo_path: Assets/ML-Agents/Demos/LegoV7.demo max_steps: 4000000 time_horizon: 64 summary_freq: 50000 threaded: true
训练困境
尝试1-50层堆叠观测、有无演示数据(演示数据共12000步)等多种配置,先在简单赛道训练200万步,再迁移至较难赛道训练400万步后,AI仍无法完成一圈,核心问题包括:
- 不会在弯道前主动刹车,频繁因速度过快掉落
- Boost使用逻辑混乱,几乎一冷却就触发,完全不结合赛道场景
问题诊断
奖励信号逻辑失衡
- 存在逻辑矛盾:"通过弯道未掉落扣0.5分"反向惩罚了安全行为,严重误导AI决策
- 惩罚权重不匹配风险等级:Boost后刹车取消的惩罚(0.5分)与掉落惩罚(1分)接近,但实际掉落的后果远严重于取消Boost
- checkpoint奖励仅与速度挂钩,未结合路径合理性,导致AI盲目追求高速而忽略赛道边界
- 每步惩罚(0.001分)力度太弱,无法有效驱动AI优先完成赛道
观测信息不足或冗余
- 独热编码的弯道难度、方向无法提供连续的场景细节(如弯道曲率、转向角度),AI无法精准判断减速时机
- 未明确将Boost冷却剩余时间、当前刹车状态纳入观测,AI无法感知动作的持续影响与可用状态
- 堆叠观测层数跨度太大:50层导致观测空间冗余,增加网络学习难度;1层则无法捕捉Boost冷却、刹车持续效果等时序依赖
演示数据与训练策略冲突
- 行为克隆(BC)强度设为0.5过高,限制AI自主探索更优策略;GAIL强度0.05过低,无法有效利用演示数据的行为模式
- 演示数据仅12000步,覆盖的关键场景(如弯道前刹车、Boost合理使用时机)不足,无法提供有效参考
动作空间设计局限
- 单离散分支的刹车动作无法区分减速幅度,AI难以精准控制弯道前的减速力度
- 未区分Boost的瞬时触发特性与刹车的持续状态特性,AI无法理解动作的不同影响模式
优化建议
1. 重构奖励惩罚机制
- 修正逻辑错误:移除"通过弯道未掉落扣0.5分"的惩罚,改为通过弯道且保持安全速度奖励0.3-0.5分
- 调整惩罚权重:将掉落惩罚提升至-5分,Boost后刹车取消惩罚降至-0.2分,强化核心风险规避优先级
- 优化checkpoint奖励:改为
0.1×(归一化速度平方 × 赛道方向匹配度),其中赛道方向匹配度为当前车头朝向与赛道最优路径方向的余弦值,引导AI兼顾速度与路径正确性 - 加大每步惩罚力度:改为每步扣0.005分,强化"快速完成"的目标导向
2. 优化观测输入
- 替换独热编码:将弯道难度、方向改为连续归一化值(如弯道曲率、转向角度),让AI精准感知弯道特征
- 补充关键状态:加入Boost冷却剩余时间(归一化)、当前刹车激活状态至观测输入
- 调整堆叠观测层数:建议使用4-8层堆叠,既捕捉动作的时序影响,又避免冗余
- 优化射线检测:增加3-5条不同角度的弯道边界检测射线,让AI提前感知弯道位置与危险距离
3. 调整演示数据与训练策略
- 降低行为克隆强度:将BC强度设为0.1-0.2,保留演示引导性的同时给AI足够探索空间
- 提升GAIL强度:设为0.2-0.3,强化演示数据的行为模式学习
- 扩充演示数据:录制至少30000步包含关键场景的演示(如不同难度弯道前的刹车操作、Boost合理使用时机),覆盖更多赛道场景
4. 动作空间与训练配置优化
- 优化动作分支:将刹车改为连续动作(0-1的刹车力度),Boost保持离散触发,让AI精准控制减速幅度;若坚持离散动作,可拆分刹车为"轻刹车""重刹车""无刹车"三个选项
- 调整超参数:
- 将
hidden_units改为256,num_layers改为3,增强网络对复杂场景的拟合能力 - 将
time_horizon提升至128,让AI捕捉更长时间的时序依赖(如Boost的10秒冷却周期) - 关闭
threaded改为单线程训练,确保训练过程稳定性
- 将
5. 分阶段训练策略
- 第一阶段:在极简单赛道(直线+平缓弯道)训练100万步,目标是让AI学会"不掉落""合理使用Boost"
- 第二阶段:在中等难度赛道训练200万步,引入弯道前刹车的奖励引导,强化路径规划能力
- 第三阶段:迁移至目标赛道训练,确保单人模式稳定完成一圈后,再加入多人对抗元素
内容的提问来源于stack exchange,提问作者Saifullah
相关产品推荐
相关产品推荐

