养过狗的朋友都有体会:教小狗接飞盘,靠的不是写一份《接飞盘操作手册》。你只需要把它带到后院,扔出飞盘,它叼回来就丢一块肉干,叼偏了就没得吃。几个星期后,这只狗自己学会了判断飞盘轨迹、调整奔跑路线。游戏开发里的 NPC 行为,过去也靠“写手册”——程序员手工敲几千行状态机代码,把巡逻、警戒、追击一条条列出来。行为稍微复杂一点,代码量就爆炸。Unity ML-Agents 的出现,相当于把“训狗”搬进了游戏引擎:你搭一个训练场(Unity 场景),设计好零食规则(奖励信号),调好训练节奏(超参数),然后让 PPO 或 SAC 算法替你扮演训犬师,把一只什么都不会的“电子小狗”训练成能独当一面的游戏 NPC。这篇教程会陪你走完从搭环境、发奖励、调参数,到训练部署的全过程。

岗位关联

理解 ML-Agents 的训练链路,能让你把「奖励设计」和「调参」这两门手艺从实验室搬到游戏工业流水线——这是游戏 AI 工程师与强化学习工程师的核心竞争力之一。

目录
  1. 可视化演示
  2. 框架组成:训犬工具箱四件套
  3. 环境搭建:给旺财布置训练场
  4. 奖励设计:零食的发放学问
  5. 参数调节:调节训犬节奏
  6. PPO 算法:稳健型训犬教练
  7. SAC 算法:好奇型训犬教练
  8. 训练部署:从后院到赛场
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Unity ML-Agents强化学习训练流程、奖励信号设计与PPO/SAC算法对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

RL训练流程 环境交互 策略更新 Obs→Act→Rwd→Update 循环训练

框架组成:训犬工具箱四件套

训狗之前,你得先置办一套行头:项圈、口令、训练场地、计时哨。Unity ML-Agents 也是一套“训犬工具箱”,四件套缺一不可。第一件是 Agent(智能体),它就相当于小狗旺财本身——挂在 NPC 身上,负责看、听、迈腿。第二件是 Brain(决策器),也就是旺财的“大脑”,决定“看到什么就做什么”。第三件是 Academy(环境总控),它像训练场管理员,负责按节拍推进训练、到期重置场地、统一调度所有 Agent。第四件是编辑器集成——Unity 编辑器就是训犬师的观察窗,训练过程实时可见。

在 ML-Agents 里,Agent 通过环境拿到观测,把观测交给 Brain 决策,决策结果变成动作返回环境。你可以把这条回路理解成旺财的日常:眼睛看到飞盘(观测)→ 大脑判断要跑(决策)→ 四条腿冲出去(动作)。训练算法要优化的,就是“看到什么就做什么”这张映射表——也就是策略。

策略可以被写成概率形式:在某个状态下,做出每个动作的概率各是多少。刚出生的旺财这张表是乱的,训练就是在反复修正这张表。

四件套各司其职,训犬师才算有了开工的工具。工具箱备齐了,下一步就是布置训练场——场地布置得好不好,直接决定旺财能不能学会叼球。

πθ(at∣st)\displaystyle \pi_\theta(a_t | s_t)
这个式子定义了“智能体的策略”:给定当前观测 s_t,选择动作 a_t 的概率由参数 θ 控制。ML-Agents 训练的本质就是不断更新 θ。
  1. 策略符号 π这是一张“条件反射表”,给定一个场景,输出每个动作的概率。就像旺财看到球时,“去叼”的概率是 0.9,“原地趴下”的概率是 0.1。
    π\pi
  2. 参数 θ神经网络的权重,也就是这张“条件反射表”上的旋钮。训练过程就是在拧这些旋钮。
    θ\theta
  3. 状态 s_tt 时刻智能体看到的全部信息,比如自身速度、与目标的距离。
    sts_t
  4. 动作 a_tt 时刻智能体的选择,比如向左、向右、跳跃。
    ata_t
  5. 条件竖线 |表示“在……条件下”,整体读作“在状态 s_t 下选择动作 a_t 的概率”。
    at∣sta_t | s_t

环境搭建:给旺财布置训练场

训练场的布置决定了旺财能看见什么、能做什么。场地太小,它学不会追远球;障碍太乱,它永远找不到球。ML-Agents 里的“训练场”就是 Unity 场景本身:地面要有 Collider,Agent 要有初始位置,目标要有明确摆放。你还要在场景里想清楚一件事——旺财需要“看见”和“能做”什么,这对应两个关键概念:观测空间(Observation Space)和动作空间(Action Space)。

观测空间就是“旺财的视野清单”。它不需要看到整个世界的颜色,只需要拿到与任务相关的信息,比如与球的相对位置、自身速度、朝向角度。动作空间则是“旺财的能力清单”:离散动作像“左转/右转/前进”,连续动作像“方向盘转角 0 到 1 之间的任意值”。除了直接写进脚本的观测,你还可以给 Agent 挂传感器——Raycast 传感器像胡须一样探测前方障碍,Camera 传感器像眼睛一样拍摄画面,这些都属于环境配置的一部分。

训练场的“物理规则”决定了旺财迈出一步之后世界会变成什么样。这一过程在强化学习里被抽象成状态转移方程:

训练场布置完毕后,旺财在其中每走一步都会产生一个结果。但如何让它知道“这一步走对了”?这就需要下一节的核心手艺:设计零食。

st+1=f(st,at)\displaystyle s_{t+1} = f(s_t, a_t)
公式说明:环境是一个函数 f:给定当前状态 s_t 和动作 a_t,环境计算出下一时刻的状态 s_{t+1}。在 Unity 里,f 就是物理引擎和场景脚本。
  1. 下一时刻状态 s_{t+1}旺财一步迈出之后,它和球的新位置、新速度。
    st+1s_{t+1}
  2. 环境动力学 f负责“算账”的规则,在 Unity 中由物理引擎、碰撞器和脚本共同实现。场地重力、摩擦系数都由它说了算。
    ff
  3. 状态与动作的组合 (s_t, a_t)当前状态和动作是环境“算账”的输入,缺一不可。
    (st,at)(s_t, a_t)
  4. 等号的含义这个式子是“只读”的——训练初期你无法修改 f,只能通过修改 s_t 或 a_t 来影响结果。
    ==

奖励设计:零食的发放学问

训犬最核心的手艺是发零食:叼对了给肉干,叼偏了没得吃。在 ML-Agents 中,零食就是奖励信号,它是智能体唯一的“学习目标”——奖励设计得好不好,直接决定旺财是学成还是学废。最常见的两种策略是稀疏奖励和奖励塑形。

稀疏奖励只在任务最终完成时给一个大奖,比如“球进筐 +1”。它简单纯粹,旺财学会的是“真正叼到球”,而不是耍小聪明。但缺点是探索困难:在空旷的大训练场里,旺财可能逛了几百圈都碰不到一次奖励,学习进程极其缓慢。奖励塑形(Reward Shaping)则是把大任务拆成中间步骤,比如“每靠近球 1 米 +0.1”。它像撒了一路的零食屑,引导旺财一步步逼近目标,训练速度明显加快,但要小心它学会“在原地磨蹭刷分”这种钻空子的行为。

无论哪种策略,奖励的数值尺度都要克制。奖励值过大会让梯度剧烈震荡,过小又会被噪声淹没。在强化学习中,智能体追求的是一段时间的累计回报,而回报不是简单相加,未来的奖励要打折扣:

理解了奖励的“总价值”,你心里就有了一杆秤。接下来要解决的是训练节奏问题:同样一只旺财,怎么练才能又快又稳地学会?

Gt=∑k=0∞γkrt+k+1\displaystyle G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1}
公式说明:从 t 时刻开始的累计回报 G_t,是未来每一步即时奖励 r 的加权和,越遥远的奖励被折扣因子 γ 压得越轻。
  1. 累计回报 G_t从 t 时刻起,旺财所有“零食”经过打折后的总和,它是智能体真正想要最大化的东西。
    GtG_t
  2. 即时奖励 r_{t+k+1}未来第 k 步拿到的单次奖励,可能是正数也可能负数。
    rt+k+1r_{t+k+1}
  3. 折扣因子 γ取值 0 到 1 之间,像零食的“保鲜期”——越遥远的奖励越不值得期待。γ 越接近 1,旺财越有长远眼光;γ 越小,它越只顾眼前。
    γk\gamma^k
  4. 求和符号把从当前时刻往后的所有“打折零食”一份份加起来,得到一袋零食的总价值。
    ∑k=0∞\sum_{k=0}^{\infty}

参数调节:调节训犬节奏

同样的旺财,训犬师每天练三次、每次十五分钟,一个月就能上台表演;如果一天狂练十小时,旺财反而学废了。训练参数就是训犬师的节奏表,ML-Agents 中常见的可调旋钮有四个。第一个是学习率(Learning Rate),它决定每次根据经验调整策略的幅度——相当于每次口令纠正的力度,太大了容易矫枉过正,太小了进步缓慢。第二个是批次大小(Batch Size),即每轮训练一次性“看”多少条经验再决定怎么调整,类似训犬师是看完一整天的录像再总结,还是看一条改一次。

第三个是缓冲容量(Buffer Size),相当于旺财的记忆库能装下多少条历史经验,记忆量越大,对经验的利用越充分,但内存开销也越高。第四个是训练步数(Max Steps),即总训练量,它和奖励曲线配合使用:当奖励曲线趋于平缓甚至下降时,就该考虑停止训练了,而不是盲目加练。

这些旋钮最终都作用在同一个动作上——更新策略参数。强化学习的参数更新遵循梯度上升的思路:

节奏调好了,接下来要选一位“训犬教练”来实际执行训练。ML-Agents 内置了两位风格迥异的教练——PPO 和 SAC,它们各有各的看家本领。

θ←θ+α∇θJ(θ)\displaystyle \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)
公式说明:每次更新时,参数 θ 沿着目标函数 J(θ) 的梯度方向走一小步,步长由学习率 α 控制。
  1. 目标函数 J(θ)衡量“当前策略平均能拿多少回报”的指标,是训练的指挥棒。
    J(θ)J(\theta)
  2. 梯度 ∇J(θ)指向“回报提升最快方向”的箭头,相当于训犬师看完录像后给出的改进建议。
    ∇θJ(θ)\nabla_\theta J(\theta)
  3. 学习率 α每次改进迈多大步子。α 大是“大刀阔斧”,α 小是“小步慢跑”。
    α\alpha
  4. 更新箭头 ←把梯度建议按比例施加到旧参数上,完成一步“朝更好的方向挪动”。
    θ←θ+α∇θJ(θ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)

PPO 算法:稳健型训犬教练

老王训犬的风格是循循善诱:每次只纠正一小步,绝不推翻重来。PPO(近端策略优化)就是这样的稳健教练,它是 ML-Agents 的默认算法,适合绝大多数训练任务。PPO 的根基是策略梯度——沿着“让好动作更可能发生”的方向调整策略。但传统的策略梯度有个毛病:一步迈太大,策略容易崩坏,就像老王如果哪次发火把旺财骂狠了,旺财可能连“坐下”都不敢做了。

PPO 的杀手锏是“裁剪目标”(Clipped Objective):它计算新旧策略在一个动作上的概率比值,如果这个比值想冲出允许的区间(通常设为 1±0.2),就把它硬截回来。这相当于给训犬师戴上了一个限速器——无论今天的训练成果多诱人,每次口令修正的幅度都不能超过安全范围。同时,PPO 还会用优势估计(Advantage Estimation)判断“这一步比平时好多少”,用“好多少”而不是“绝对值”来指导更新,就像表扬旺财“这次比昨天快了两秒”,而不是机械地说“你跑了五秒”。

PPO 的裁剪目标公式长这样:

有了 PPO 这位稳健教练在旁把关,旺财每一步都走得踏实。不过游戏里还有些任务需要更多“灵气”——比如让角色在起伏地形上保持平衡,这时候就得请出另一位风格迥异的教练。

LCLIP(θ)=Et[min⁡(rt(θ)A^t,  clip⁡(rt(θ),1−ϵ,1+ϵ)A^t)]\displaystyle L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \; \operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]
公式说明:用新旧策略比值 r_t(θ) 和优势估计 Â_t 的乘积来衡量更新方向,再用 clip 和 min 双重保险,把每次更新的幅度限制在 1±ε 内。
  1. 概率比值 r_t(θ)新旧策略下同一个动作的概率之比,表示“新口令下这个动作的概率是旧口令的几倍”。
    rt(θ)r_t(\theta)
  2. 优势估计 Â_t表示“这一手比平时好多少”。正数说明该鼓励,负数说明该减少。
    A^t\hat{A}_t
  3. 裁剪函数 clip把比值强行限制在 1−ε 到 1+ε 之间,相当于给训练师戴上限速器,防止单次更新过猛。
    clip⁡(rt(θ),1−ϵ,1+ϵ)\operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)
  4. 取最小值 min同时考虑“原比值”和“裁剪后比值”,取更保守的一侧,保证策略永远不冒进。
    min⁡(⋅,⋅)\min(\cdot, \cdot)

SAC 算法:好奇型训犬教练

小陈训犬的风格和王老完全不同:他让旺财自由发挥,鼓励它大胆尝试新动作,哪怕十次里有八次失败也没关系,只要偶尔试出好招就赚了。SAC(软演员-评论家)就是这样的好奇型教练,特别适合动作空间是连续值的任务,比如控制角色的四肢力度、飞行器的转向角度。SAC 的核心思想是“最大熵强化学习”——在争取高回报的同时,尽量让策略保持随机性,也就是保留“意外惊喜”的可能。

熵(Entropy)可以理解为策略的“意外程度”:如果旺财每次都走同一条路,熵很低;如果它今天试左边、明天试右边,熵就很高。SAC 在目标函数里显式加了一项“熵奖励”,于是旺财不仅为了零食而学习,还为“多尝试新鲜事”而学习。为了保证训练稳定,SAC 采用经验回放(Replay Buffer)——旺财把每天的经历存进记忆库,训练时随机抽取一批“老黄历”反复回味,而不是只看当下这一条路。

SAC 的策略更新目标里,除了 Q 值(对某个状态下某个动作的长期价值估计),还加入了熵项,并由温度系数 α 调节好奇心的强弱:

旺财在两位教练的调教下已经本领初成。但学得好不等于上场表现好——从训练场到正式游戏,还有最后一段路要走。

Lπ=Es∼D[Ea∼π[αlog⁡π(a∣s)−Q(s,a)]]\displaystyle \mathcal{L}_\pi = \mathbb{E}_{s \sim \mathcal{D}} \left[ \mathbb{E}_{a \sim \pi} \left[ \alpha \log \pi(a|s) - Q(s,a) \right] \right]
公式说明:SAC 在最大化长期价值 Q(s,a) 的同时,还希望动作的熵 log π(a|s) 尽量大,α 决定了“好奇心”和“实际收益”之间的平衡。
  1. 状态动作价值 Q(s,a)表示“在状态 s 下做出动作 a,之后长期能拿多少回报”,是评论家对这一步的评分。
    Q(s,a)Q(s,a)
  2. 对数概率 log π(a|s)度量“这个选择有多意外”。概率越小,这个值的绝对值越大,代表越需要被鼓励尝试。
    log⁡π(a∣s)\log \pi(a|s)
  3. 温度系数 α好奇心的旋钮。α 调大等于告诉旺财“多试新花样”,α 调小等于“专注吃老本”。
    α\alpha
  4. 期望 E在经验回放库 D 中随机抽取一批样本求平均,抹平单条经验的噪声,让训练更平稳。
    Es∼D\mathbb{E}_{s \sim \mathcal{D}}

训练部署:从后院到赛场

训好的旺财,是时候送去参加比赛了。训练部署就是“送旺财上赛场”的过程。首先是训练启动:在命令行执行 mlagents-learn 命令,指定训练配置文件和场景名称,Unity 编辑器会自动进入训练模式。训练过程中,编辑器里能看到一群旺财同时在训练场里奔跑——ML-Agents 支持并行训练多个 Agent 实例,大大加快数据采集速度。

训练结束后不能急着上线。你需要准备一个“评估场景”——和训练场不完全一样的关卡,检验旺财是真的学会了“追球”这门通用技能,还是仅仅背下了训练场的地图。评估通过后,把训练出的模型导出为 .onnx 文件,放进 Unity 的 Runtime 推理组件中,NPC 就能在游戏里直接运行这个模型,替代原来手写的行为树。此时项目组还需要持续做性能监控:观察推理耗时是否超标、内存占用是否合理,以及线上奖励曲线是否稳定。

监控环节常看的一个指标是最近 N 个回合的平均回报,它比单回合回报更能反映真实水平:

从后院到赛场,旺财完成了从“啥都不会的电子小狗”到“独当一面的 NPC”的蜕变。这条完整的训练链路——搭环境、发奖励、调参数、选算法、做部署——正是 ML-Agents 给游戏 AI 开发带来的最大价值。

Rˉe=1N∑i=1NRi\displaystyle \bar{R}_e = \frac{1}{N} \sum_{i=1}^{N} R_i
公式说明:把最近 N 个回合的总回报求平均,抹平单回合的随机毛刺,用来判断模型是否在稳定发挥。
  1. 单回合回报 R_i第 i 局游戏里旺财拿到的总零食数,是衡量一局表现的总分。
    RiR_i
  2. 回合数 N统计窗口的大小,通常取最近几十到几百个回合。
    NN
  3. 求平均把 N 个回合的回报加总后除以 N,用来平滑掉运气带来的波动,看清真实趋势。
    1N∑i=1N\frac{1}{N} \sum_{i=1}^{N}

AI 应用场景

游戏 NPC 智能行为训练

阶段:数据采集与训练

解决的问题:传统做法用手写有限状态机(FSM)和行为树控制 NPC,巡逻、警戒、追击、回防每一条分支都要人工编码,NPC 行为僵化且代码量巨大。ML-Agents 让策划像训犬一样“训”NPC:只需要提供观测(是否看到玩家、距离多远)、动作(巡逻方向、追击速度)和奖励(发现玩家 +1、成功驱赶 +2),PPO 算法就能自动收敛出流畅的 NPC 行为。

具体案例:某动作游戏项目用 ML-Agents 训练敌方守卫。早期版本守卫只会沿固定路径巡逻,玩家卡墙角就能无伤通关。接入 PPO 后,训练 200 万步,守卫学会了根据玩家脚步声探头、包抄和掩护,测试人员反馈“像真人玩家在操作”。

自动化游戏测试与难度调优

阶段:模型评估与超参数调优

解决的问题:关卡测试依赖 QA 人工跑图,费时费力且主观。ML-Agents 可以训练“AI 玩家”自动闯关,并输出平均奖励曲线作为难度指标——曲线爬得慢说明关卡太难,曲线陡升说明太简单,从而精准定位“劝退关卡”。

具体案例:一家休闲游戏工作室在跑酷关卡特训 AI 玩家,通过监控每关的平均奖励曲线,发现第三关的奖励在 5 万步后仍不上升,于是把障碍间距放宽 20%,曲线立刻回升,玩家流失率下降 11%。

角色连续动作控制

阶段:策略训练与模型部署

解决的问题:让角色在崎岖地形上行走、起跳、保持平衡,手写动画状态机加物理调试极其痛苦。这类任务动作空间是连续的(每条腿的力度、关节角度),SAC 的最大熵特性鼓励大胆探索,特别适合在连续控制中寻找自然动作。

具体案例:某开放世界项目用 SAC 训练动物 NPC 的四足行走,观测输入为关节角度和身体倾斜角,动作输出为四腿关节力矩。训练 800 万步后,模型导出的 .onnx 让 NPC 能在草地、斜坡和碎石路上自适应步态,运行时 CPU 开销仅 2%。

Python 演示

python80 行
"""极简策略梯度: 模拟 ML-Agents 用奖励驱动 NPC 学会追球."""import numpy as np  class FetchTrack:    """一维训练场: 小狗从 0 出发, 球在 5 处, 够到球 +1, 跌出边界结束."""     def __init__(self):        self.pos = 0.0        self.ball = 5.0     def reset(self):        self.pos = 0.0        return np.array([self.pos, self.ball, self.ball - self.pos, 1.0])     def step(self, act):        self.pos += 0.5 if act == 1 else -0.5        reward = 0.0        done = False        if self.pos <= -2.0:            done = True        elif self.pos >= self.ball:            reward = 1.0            done = True        obs = np.array([self.pos, self.ball, self.ball - self.pos, 1.0])        return obs, reward, done  class NPCBrain:    """策略梯度大脑: 线性策略 + 逻辑回归式二选一."""     def __init__(self, dim=4, lr=0.05, gamma=0.99):        self.w = np.random.randn(dim) * 0.1        self.lr = lr        self.gamma = gamma     def prob_right(self, obs):        return 1.0 / (1.0 + np.exp(-float(obs @ self.w)))     def act(self, obs):        p = self.prob_right(obs)        return 1 if np.random.rand() < p else 0, p     def train(self, episode):        """用折扣回报做向导, 顺着回报提升方向微调权重."""        returns = []        g = 0.0        for _, _, _, r in reversed(episode):            g = r + self.gamma * g            returns.insert(0, g)        returns = np.array(returns)        baseline = returns.mean()        for (obs, act, p, _), adv in zip(episode, returns - baseline):            grad = obs * (act - p)            self.w += self.lr * adv * grad        return returns.mean()  def run_episode(env, brain):    obs = env.reset()    episode = []    total = 0.0    while True:        act, p = brain.act(obs)        obs, r, done = env.step(act)        episode.append((obs, act, p, r))        total += r        if done:            break    return episode, total  if __name__ == "__main__":    env = FetchTrack()    brain = NPCBrain()    for ep in range(300):        episode, _ = run_episode(env, brain)        avg = brain.train(episode)        if ep % 60 == 0:            print("episode %d avg_return %.2f" % (ep, avg))
目的:用纯 NumPy 实现一个极简策略梯度智能体,在一维轨道上学会“向右追球”,直观演示 ML-Agents 中“奖励驱动行为学习”的核心原理。
  1. obs = np.array([self.pos, self.ball, self.ball - self.pos, 1.0])构造观测向量:位置、球的位置、差值、常量偏置,对应 ML-Agents 中的观测空间设计。
  2. self.pos += 0.5 if act == 1 else -0.5动作空间只有“向右/向左”两个离散动作,对应 ML-Agents 的离散动作配置。
  3. reward = 1.0只有叼到球才给奖励,这是典型的稀疏奖励设置。
  4. g = r + self.gamma * g从回合末尾倒推累计折扣回报,对应正文中的累计回报公式。
  5. baseline = returns.mean()计算平均回报作为基线,让智能体只看“比平时好多少”,这就是优势估计的雏形。
  6. grad = obs * (act - p)策略梯度的近似方向,告诉参数“把好动作的概率往上推”。
  7. self.w += self.lr * adv * grad沿梯度方向微调权重,对应参数更新公式中的学习率 α。

常见误区

误区“我把每次正确动作的奖励都调成 +100,旺财动力更足,肯定学得更快吧?”

正解恰恰相反。奖励数值过大相当于每天都给旺财一整只烤鸡,它很快就“餍足”了——对应的梯度会变得巨大,训练曲线剧烈震荡甚至直接发散。奖励的本质是“信号”而非“剂量”,重要的是相对大小关系,不是绝对值。ML-Agents 中应把奖励控制在合理范围,再用奖励塑形做分层引导。

为何常见:直觉上“奖励越大动力越足”,这是把人做事的动机简单类比到梯度计算上,忽视了数值过大会破坏优化稳定性。

误区“旺财在训练场里百分百能叼到球,直接放到正式关卡里肯定也没问题。”

正解训练环境与部署环境几乎必然存在差异——障碍物位置、光照、目标分布稍有变化,模型表现就可能断崖式下跌,这叫分布偏移。正确做法是准备独立的评估场景验证泛化能力,并在训练时加入随机化(随机出生点、随机障碍),让旺财见过足够多“世面”。

为何常见:人容易把“考试分数高”等同于“实际能力强”,忽视了训练场景只是一张有限的考卷。

误区“反正训练不用花钱,把 max_steps 调到最大,练它个天荒地老准没错。”

正解训练过度会让模型过拟合当前场景——奖励曲线可能先升后降,旺财背下了训练场的每一块石头,换个场地就失灵。正确做法是同时监控奖励曲线和策略熵值:奖励提升变缓、熵值过低时就应该停止训练,并定期在评估场景上检验。

为何常见:“熟能生巧”的朴素直觉在强化学习中并不总是成立,过拟合正是“练过头”的典型代价。

误区“稀疏奖励多省事,我只要在通关时加个 +1,让旺财自己慢慢试出来不就行了。”

正解在复杂任务中,稀疏奖励会制造“探索荒漠”——训练场太大、奖励太远,旺财可能几万步都碰不到一次零食,永远学不会。这时需要用奖励塑形提供中间引导,或者引入课程学习,先学简单子任务再逐步加大难度。

为何常见:我们低估了随机探索在巨大状态空间里的绝望,以为“多试几次总能撞上”,实际上撞上的概率趋近于零。

面试题

Q1. 在 Unity ML-Agents 中,负责“感知环境并执行动作”的组件是?

单选题 · easy

  • A.Academy 环境总控
  • B.Agent 智能体组件← 正确答案
  • C.Brain 决策器大脑
  • D.Sensor 传感器模块

答案:B。Agent 就像小狗本体,负责在环境中感知观测、做出动作并接收奖励;Brain 负责决策,Academy 负责训练调度,Sensor 只是 Agent 的感知配件。记不住时想想“狗本体 vs 狗脑子”的分工。

Q2. 折扣因子 γ 越接近 1,说明什么?

单选题 · easy

  • A.智能体越只顾眼前零食
  • B.智能体越看重远期回报← 正确答案
  • C.训练速度一定会变慢
  • D.奖励信号一定越稀疏

答案:B。γ 像零食的“保鲜期”:γ 越小远期奖励越不值钱,旺财只顾眼前;γ 越接近 1,远期奖励几乎不打折,旺财越有长远眼光。它并不直接决定训练速度或奖励稀疏程度。

Q3. ML-Agents 训练完成后,导入 Unity Runtime 推理的模型格式是?

单选题 · easy

  • A..prefab 格式
  • B..onnx 格式← 正确答案
  • C..cs 脚本格式
  • D..json 配置格式

答案:B。训练产物是神经网络权重文件,导出为 ONNX(.onnx)后由 Unity 的 Runtime 推理组件加载。.prefab 是预制体、.cs 是脚本、.json 是配置,都不承载训练好的模型参数。

Q4. PPO 中 clip(裁剪)操作的主要作用是?

单选题 · mid

  • A.加快神经网络推理速度
  • B.压缩训练数据的内存占用
  • C.限制策略更新的幅度← 正确答案
  • D.增加动作的探索随机性

答案:C。裁剪操作把新旧策略比值限制在 1±ε 区间内,就像给训犬师戴上限速器,防止单次更新步子太大导致策略崩坏。它不负责推理速度、内存或探索随机性。

Q5. 奖励塑形(Reward Shaping)是指?

单选题 · mid

  • A.只给最终成功的大奖励
  • B.为中间步骤添加引导小奖励← 正确答案
  • C.提高所有奖励的数值
  • D.用惩罚代替所有奖励

答案:B。奖励塑形是在稀疏奖励基础上,为中间过程添加小的引导奖励,像撒一路零食屑引导旺财靠近目标,缓解“探索荒漠”。只给最终大奖是稀疏奖励本身,加数值和惩罚都不是塑形的定义。

Q6. 关于 SAC 与 PPO 的区别,下列说法正确的是?

单选题 · mid

  • A.SAC 使用策略裁剪更新
  • B.SAC 通过最大熵鼓励探索← 正确答案
  • C.PPO 必须使用经验回放
  • D.SAC 只支持离散动作

答案:B。SAC 的核心是最大熵——在追求回报的同时奖励策略的随机性,天然鼓励探索;策略裁剪是 PPO 的招牌,经验回放是 SAC 的特点而非 PPO 必需,SAC 擅长的是连续动作控制。

Q7. 训练时发现奖励曲线剧烈震荡、迟迟不收敛,最可能的原因是?

单选题 · hard

  • A.训练步数设置过少
  • B.学习率设置过大← 正确答案
  • C.观测维度不够丰富
  • D.场景渲染分辨率太低

答案:B。学习率过大等于每次口令纠正都用力过猛,参数在最优解附近来回横跳,表现为曲线剧烈震荡。训练步数少通常表现为曲线没来得及上升,渲染分辨率不影响强化学习训练。

Q8. 以下哪些属于 ML-Agents 训练参数调节的范畴?

多选题 · mid

  • A.学习率大小设置← 正确答案
  • B.批次大小设置← 正确答案
  • C.场景灯光颜色
  • D.缓冲容量设置← 正确答案

答案:ABD。学习率、批次大小、缓冲容量都是训练超参数,直接影响策略更新的步幅和样本利用方式;场景灯光属于渲染表现,与训练参数无关,就像训犬时的场地装修不影响零食规则。

Q9. 训练智能体时,观测空间可以包含哪些信息?

多选题 · mid

  • A.自身与目标的相对距离← 正确答案
  • B.自身当前速度向量← 正确答案
  • C.玩家键盘按键历史
  • D.射线传感器探测结果← 正确答案

答案:ABD。观测空间是“旺财的视野清单”,只包含与任务决策相关的信息:相对距离、速度、传感器结果都直接影响动作选择;玩家在键盘上的输入属于游戏操作层,不在 NPC 的观测范围内。

Q10. 关于“给智能体的观测越多越好”这一说法,下列说法正确的是?

多选题 · extreme

  • A.更多观测总是提升训练效果
  • B.无关观测会增加学习难度← 正确答案
  • C.观测维度过高可能拖慢收敛← 正确答案
  • D.观测应只包含任务关键信息← 正确答案

答案:BCD。观测并非多多益善,无关信息就像让旺财盯着天上的云练接飞盘,只会干扰策略学习、拖慢收敛。正确做法是只保留任务关键信息,这也是环境搭建中设计观测空间的核心原则。