Games104学习笔记(21)
GAMES104:游戏引擎 Gameplay 玩法系统:高级 AI(下)
课程:GAMES104《现代游戏引擎:从入门到实践》
第 17 讲(下):游戏引擎 Gameplay 玩法系统:高级 AI
本地视频时长:约 1 小时 09 分钟
一、本讲概览
上一部分介绍了 HTN、GOAP 和 MCTS 等规划方法:设计者先明确状态、动作和规则,再由算法搜索计划。本部分进一步讨论机器学习,尤其是强化学习在游戏 AI 中的应用。
核心变化是:AI 的行为不再完全由设计者逐条编写,而是通过数据或与环境交互来学习策略。这提高了系统处理复杂局面和产生多样行为的潜力,但也带来了训练成本、可解释性、稳定性和可控性方面的新问题。
本讲以 AlphaStar 一类复杂即时战略游戏 AI 为主要案例,串联以下内容:
- 机器学习的基本分类。
- 强化学习与马尔可夫决策过程。
- 游戏状态、动作和奖励的建模。
- 面向不同输入类型的神经网络结构。
- 监督学习、自博弈和对抗训练。
- 传统 AI 与机器学习 AI 的混合架构。
二、学习目标
- 区分监督学习、无监督学习、半监督学习和强化学习。
- 理解强化学习中智能体、环境、状态、动作、奖励和策略的关系。
- 掌握马尔可夫决策过程的基本数学表达。
- 理解复杂游戏中状态空间、动作空间和奖励函数为何难以设计。
- 了解 MLP、CNN、ResNet、LSTM、Transformer、Attention 等模块在游戏 AI 中的分工。
- 理解监督预训练、自博弈和对抗训练组成的训练流程。
- 认识机器学习方案的工程成本,并理解混合 AI 架构的价值。
三、为什么游戏 AI 需要机器学习
1. 传统方法依赖人工知识
有限状态机、行为树、HTN、GOAP 等方法都需要设计者显式提供领域知识:
- 有哪些状态。
- 什么条件下允许执行某个动作。
- 动作会产生什么效果。
- 任务如何分解。
- 不同行为的优先级或代价是什么。
这类方法可控、可解释,也便于设计师调试。但随着游戏世界、单位数量和交互规则增加,人工规则会迅速膨胀。设计者很难穷举玩家可能制造的所有局面,也很难为每种局面编写自然且多样的应对方式。
2. 机器学习的价值
机器学习尝试从数据或交互经验中获得行为规律,使 AI 能够:
- 在高维、复杂的游戏状态中提取有效信息。
- 学习难以手工描述的局部操作或局势评估。
- 面对大量组合情况时生成更多行为可能性。
- 通过训练不断改进,而不必为每个局面手写规则。
但“能够学习”不等于“自动解决全部问题”。开发者仍然需要设计输入、动作、奖励、训练流程和安全边界。机器学习把大量工作从“编写行为规则”转移到了“定义学习问题并管理训练系统”。
四、机器学习的四种基本类型
| 类型 | 学习信号 | 典型目标 | 游戏中的可能用途 |
|---|---|---|---|
| 监督学习 | 带标签样本 | 学习输入到正确输出的映射 | 模仿玩家操作、局势分类、行为预测 |
| 无监督学习 | 无标签数据 | 发现数据内部结构 | 玩家聚类、行为模式发现、表示学习 |
| 半监督学习 | 少量标签与大量无标签数据 | 利用无标签数据改善模型 | 标签昂贵时的行为识别或内容分析 |
| 强化学习 | 环境返回的奖励 | 学习长期累计回报最大的策略 | 战斗决策、资源调度、复杂博弈 |
监督学习回答的是“面对这个输入,人类示范的答案是什么”;强化学习回答的是“采取什么动作,长期结果最好”。复杂游戏 AI 往往不会只使用其中一种方法,而是先通过监督学习获得合理初始策略,再使用强化学习继续优化。
五、强化学习:智能体与环境的闭环
1. 基本交互
强化学习系统由智能体与环境构成。每一步交互通常包含:
- 环境向智能体提供观察或状态。
- 智能体依据策略选择动作。
- 环境执行动作并转移到新状态。
- 环境返回奖励。
- 智能体利用经验更新策略。
可以把这一过程概括为:
$$ s_t \xrightarrow{\pi(a_t \mid s_t)} a_t \xrightarrow{\text{environment}} (r_{t+1}, s_{t+1}) $$
其中:
- $s_t$ 表示时刻 $t$ 的状态。
- $a_t$ 表示智能体执行的动作。
- $r_{t+1}$ 表示环境在动作后返回的奖励。
- $\pi(a_t \mid s_t)$ 表示在状态 $s_t$ 下选择动作 $a_t$ 的概率。
2. 试错搜索
强化学习通常没有逐步提供的标准答案。智能体必须通过试错发现哪些动作有助于获得更高回报。
这会形成探索与利用之间的矛盾:
- 探索:尝试尚不确定的动作,以发现更好的策略。
- 利用:选择当前已知效果最好的动作,以稳定获得回报。
探索不足可能过早停留在次优策略;探索过多则会导致训练效率低、行为不稳定。
3. 延迟奖励
游戏中的动作不仅影响当前奖励,也可能改变很久以后的局面。例如,早期牺牲经济换取兵力,可能在数分钟后才体现价值。
因此,强化学习面对一个关键问题:最终胜负应该归功或归咎于之前的哪些动作。这就是信用分配问题,也是长时序游戏比短回合任务更难训练的重要原因。
六、马尔可夫决策过程
1. MDP 的组成
强化学习通常用马尔可夫决策过程描述。一个 MDP 可写为:
$$ \mathcal{M} = \langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle $$
其中:
| 符号 | 含义 |
|---|---|
| $\mathcal{S}$ | 状态集合 |
| $\mathcal{A}$ | 动作集合 |
| $P$ | 状态转移概率 |
| $R$ | 奖励函数 |
| $\gamma$ | 折扣因子 |
2. 状态
状态是智能体用来决策的信息表达。在理想的马尔可夫状态中,当前状态已经包含预测未来所需的信息:
$$ P(s_{t+1} \mid s_t, a_t)
P(s_{t+1} \mid s_0, a_0, \ldots, s_t, a_t) $$
真实游戏中的智能体往往只能得到局部观察,例如战争迷雾下看不到对手全部信息。这时,单帧观察并不等于完整状态,系统通常需要通过历史信息或循环网络形成内部记忆。
3. 状态转移
状态转移模型描述在状态 $s$ 执行动作 $a$ 后到达状态 $s’$ 的概率:
$$ P(s’ \mid s, a)
P(S_t = s’ \mid S_{t-1} = s, A_{t-1} = a) $$
游戏中的随机伤害、命中率、玩家行为和多智能体互动,都可能使相同动作产生不同结果。
4. 策略
策略是从状态到动作概率分布的映射:
$$ \pi(a \mid s) = P(A_t = a \mid S_t = s) $$
策略可以是确定性的,也可以是随机的。随机策略能保留探索能力,也能避免 AI 在相同局面中永远做出完全相同的动作。
5. 累计回报
智能体优化的不是单步奖励,而是长期累计回报:
$$ G_t
R_{t+1}
- \gamma R_{t+2}
- \gamma^2 R_{t+3}
- \cdots $$
也可写成:
$$ G_t
\sum_{k=0}^{\infty} \gamma^k R_{t+k+1} $$
折扣因子满足 $0 \leq \gamma \leq 1$。较小的 $\gamma$ 更重视近期收益;较大的 $\gamma$ 更重视长期结果,但也会使训练中的信用分配更加困难。
学习目标可概括为寻找最大化期望回报的策略:
$$ \pi^*
\arg\max_{\pi} \mathbb{E}_{\pi}[G_t] $$
七、把游戏转化为可学习的问题
课件以复杂即时战略游戏为例,将深度强化学习系统的设计拆分为五个核心问题:
- State:智能体能够观察什么。
- Action:智能体能够执行什么。
- Reward:系统希望它优化什么。
- Neural Network Design:如何处理不同结构的输入并输出动作。
- Training Strategy:如何组织数据、对手和训练阶段。
这五项不是相互独立的。状态表达决定网络能看到什么,动作表达决定它能做什么,奖励决定它想做什么,而训练策略决定它能否真正学会。
八、状态与观察的设计
1. 观察不等于完整世界
部署在游戏中的策略网络通常接收可观察信息,而不是直接读取全部内部状态。输入可分为:
- 标量特征:资源数量、时间、人口、科技等级等。
- 单位特征:类型、生命值、位置、阵营、当前命令等。
- 环境信息:地形、可见性、障碍物和区域控制。
- 图像或空间特征:主画面、深度图、小地图、影响力图等。
- 历史信息:之前的观察、动作和事件。
输入必须遵守游戏规则。如果本应受战争迷雾限制的 AI 直接读取敌方全部信息,它获得的不是“智能”,而是不公平的信息优势。
2. 状态抽象的取舍
状态表达过少,策略无法区分关键局面;状态表达过多,会增加网络规模、训练难度和数据需求。
工程上应优先提供与决策直接相关、含义稳定的结构化特征,而不是简单地把引擎中的所有数据暴露给模型。状态接口本身就是 AI 系统设计的一部分。
九、复杂动作空间
即时战略游戏中的一个动作往往不是单个离散按钮,而是由多个部分组成:
- 做什么:移动、攻击、建造或使用技能。
- 对谁执行:选择一个或多个己方单位。
- 目标是谁:敌方单位、资源或建筑。
- 在哪里执行:地图中的目标点。
- 何时执行:立即执行或延迟若干步。
- 是否排队:加入已有命令队列或覆盖当前命令。
因此,可以把动作理解为结构化元组:
$$ a_t
(a_t^{\text{type}}, a_t^{\text{selected}}, a_t^{\text{target-unit}}, a_t^{\text{target-point}}, a_t^{\text{delay}}, a_t^{\text{queued}}) $$
若把所有组合直接展开为一个巨大离散集合,动作数量会爆炸。实际系统通常使用多个输出头分阶段预测动作类型、单位选择和目标位置,并使用掩码排除当前状态下不合法的动作。
动作接口还应尽量贴近玩家可执行的操作,以限制 AI 的操作速度和信息优势,使训练结果更符合真实玩法。
十、奖励函数
1. 终局奖励
最直接的设计是只根据胜负给奖励,例如:
$$ R_{\text{terminal}}
\begin{cases} +1, & \text{胜利} \ -1, & \text{失败} \end{cases} $$
这种奖励与最终目标一致,但反馈极其稀疏。对于持续很长时间的对局,智能体很难判断早期某个动作与最终胜负之间的关系。
2. 辅助奖励与伪奖励
为了提高训练效率,可以加入局部奖励,例如经济发展、单位存活、资源交换效率或行为与人类策略统计的接近程度。
可将总奖励概括为:
$$ R_t
R_t^{\text{game}}
- \lambda R_t^{\text{aux}} $$
其中 $R_t^{\text{game}}$ 来自游戏胜负,$R_t^{\text{aux}}$ 是辅助奖励,$\lambda$ 控制二者权重。
辅助奖励能够为训练提供更密集的信号,但也可能把代理引向错误目标。例如,如果只奖励单位数量,AI 可能大量生产无用单位而忽视胜利。因此,奖励塑形必须持续检查是否与真实玩法目标一致。
十一、神经网络如何对应游戏数据
复杂游戏的观察包含不同类型的数据,通常不能全部交给同一种网络结构处理。
| 输入或需求 | 常用结构 | 作用 |
|---|---|---|
| 固定长度标量向量 | MLP | 处理资源、时间、人口等全局特征 |
| 数量可变的实体集合 | Transformer、Attention | 建模单位之间的关系 |
| 图像和小地图 | CNN、ResNet | 提取空间局势与局部模式 |
| 长期历史与内部记忆 | LSTM | 在部分可观察环境中保留上下文 |
| 从实体集合中选择目标 | Pointer Network、Attention | 输出被选择的单位或目标 |
| 多部分结构化动作 | 多个解码头 | 分别预测动作类型、目标和位置 |
1. 编码器
编码器把不同来源的观察转换到统一的特征空间:
- Scalar Encoder 使用 MLP 编码全局标量。
- Entity Encoder 使用 Transformer 编码数量可变的单位。
- Spatial Encoder 使用 CNN 或 ResNet 编码小地图等空间信息。
这些编码结果汇合到核心网络,形成当前局势的内部表示。
2. 记忆核心
在战争迷雾等部分可观察环境中,当前画面无法表示全部历史。LSTM 可以把之前的重要信息保存在隐状态中,并学习哪些信息应被记住或遗忘。
其意义不是简单保存所有历史,而是形成一个可供决策使用的内部状态,例如记住敌方单位最后出现的位置、之前侦察到的科技路线或已经下达的长程命令。
3. 解码器
解码器将内部表示转换为具体动作。复杂策略网络通常包含:
- 动作类型输出。
- 延迟时间输出。
- 命令排队输出。
- 单位选择输出。
- 目标单位输出。
- 目标位置输出。
- 价值估计输出。
不同动作分量之间具有依赖关系。例如,先判断是“移动”还是“攻击”,才能确定后续需要输出地图位置还是目标单位。因此,解码过程通常是条件化的,而不是完全独立地一次输出所有结果。
十二、监督学习预训练
1. 从人类示范开始
若策略从随机行为开始探索复杂游戏,绝大多数对局都没有意义,学习效率极低。AlphaStar 一类系统先使用人类对局进行监督学习,让策略模仿合理操作。
监督学习阶段可最小化人类动作分布与模型动作分布之间的差异。课件使用 KL 散度表达这种距离:
$$ D_{\mathrm{KL}}(P \parallel Q)
\sum_x P(x) \log \frac{P(x)}{Q(x)} $$
其中 $P$ 可理解为人类决策分布,$Q$ 为模型策略分布。减小 KL 散度,意味着模型输出逐渐接近人类示范。
2. 策略条件
复杂游戏存在多种打法。训练数据可附带一个策略摘要 $z$,例如开局建造顺序或整体战略,使模型学习:
$$ \pi(a_t \mid o_t, z) $$
同一个局面在不同策略条件下,可以产生不同动作分布。这有助于保留打法多样性,而不是把所有示范平均成一种模糊策略。
3. 监督学习的局限
模仿学习只能学习数据中已有的行为,并可能复制人类玩家的错误。它也不保证长期胜率最优。因此,监督学习通常负责提供一个可用起点,之后再通过强化学习和自博弈寻找更强策略。
十三、自博弈与对抗训练
1. 自博弈
让智能体与自己或历史版本对战,可以不断生成与当前能力相匹配的训练数据。对手随着策略升级而变强,训练难度也随之上升。
但如果始终只与最新版本对战,双方可能围绕少数打法循环,产生策略遗忘或剪刀石头布式的非传递关系。
2. 对手池
AlphaStar 式训练维护多个智能体和历史检查点,形成联赛式训练环境。不同角色承担不同目标:
| 角色 | 主要目的 |
|---|---|
| Main Agent | 提升整体强度与鲁棒性 |
| League Exploiter | 寻找整个历史对手池的弱点 |
| Main Exploiter | 专门寻找当前主智能体的弱点 |
| Historical Agents | 保留旧策略,防止遗忘并增加对手多样性 |
训练对手可以来自当前版本、过去版本、其他分支策略或人类策略。这样做的目标不是只打败单一对手,而是形成面对多种战术都较稳定的策略。
3. 训练流程
完整流程可以概括为:
- 收集并清洗人类对局数据。
- 通过监督学习得到初始策略。
- 将策略放入对手池开始自博弈。
- 根据胜负与辅助奖励更新策略。
- 保存历史检查点并寻找策略弱点。
- 反复扩充对手分布,提升整体鲁棒性。
训练系统本身已接近一个大型分布式工程项目,需要环境并行、样本存储、模型版本管理、评估和故障恢复等配套设施。
十四、从训练到游戏引擎运行
1. 训练与推理分离
机器学习游戏 AI 通常包含两个环境:
- 训练环境:大规模并行运行游戏或简化模拟器,更新模型参数。
- 运行环境:游戏发布后加载已训练模型,只执行前向推理。
正式游戏一般不会在玩家设备上持续训练,因为训练会消耗大量算力,也会使行为难以复现和测试。
2. 引擎侧接口
部署策略网络时,游戏引擎需要提供稳定的数据边界:
- 从 Gameplay 世界收集合法观察。
- 把观察编码成模型输入。
- 执行模型推理。
- 解码动作并检查合法性。
- 将动作提交给现有移动、战斗和技能系统。
- 在模型超时或输出非法时使用回退逻辑。
策略网络不应绕过 Gameplay 规则直接修改世界。它负责做决定,真正的动作仍由引擎中经过验证的系统执行。
3. CPU 还是 GPU
AI 推理运行在 CPU 还是 GPU,取决于模型规模、单位数量、更新频率和目标平台:
- 小模型、少量智能体或低频决策可放在 CPU。
- 大型视觉模型、批量智能体或高吞吐推理更适合 GPU。
- 训练通常更依赖 GPU 或专用加速硬件。
部署时还要考虑帧预算。AI 不一定每一帧都重新决策,可以降低更新频率、批量处理多个智能体,或在后台任务线程中执行推理。
十五、混合 AI 架构
机器学习能力强,但训练和维护成本高,也不适合替代所有传统逻辑。更实用的方案是把 DNN、有限状态机和行为树组合起来。
1. 传统系统包裹学习模块
由 FSM 或行为树控制整体流程,只把难以手工编写的局部问题交给神经网络,例如:
- 船只在复杂水域中的局部导航。
- 一场局部战斗的胜率或局势评分。
- 微操目标选择。
- 某个特殊角色的自然行为。
这种方式边界清晰,容易设置回退逻辑,也便于设计师控制。
2. 学习系统调用传统模块
也可以让神经网络负责宏观决策,再调用成熟的传统系统执行:
- 网络决定战术目标。
- 行为树完成具体动作序列。
- 寻路系统负责移动。
- 动画、物理和技能系统保证动作合法。
这能避免让模型重复学习已经有可靠算法解决的问题。
3. 选择“人味”最重要的部分
课件强调,机器学习成本很高,应把它放在最能改善玩家感受的环节,而不是追求全系统神经网络化。
判断一个模块是否值得使用机器学习,可以考虑:
- 手写规则是否已经足够可靠。
- 玩家是否能明显感知行为的自然度和多样性。
- 是否存在足够数据或可并行的训练环境。
- 是否能够定义与玩法目标一致的奖励。
- 是否能接受训练、推理和调试成本。
十六、传统规划与机器学习的关系
| 维度 | HTN、GOAP、行为树等 | 机器学习与强化学习 |
|---|---|---|
| 知识来源 | 设计者显式编写 | 从数据和交互中学习 |
| 可解释性 | 较强 | 通常较弱 |
| 行为控制 | 容易精确控制 | 需要通过数据、奖励和约束间接控制 |
| 复杂状态处理 | 依赖人工抽象 | 擅长高维输入和复杂模式 |
| 调试方式 | 检查状态、条件和节点 | 检查数据、奖励、分布与模型输出 |
| 成本位置 | 规则制作和维护 | 数据、训练、算力和模型维护 |
| 适合场景 | 规则明确、确定性要求高 | 难以手工描述、组合空间巨大的问题 |
两者并非互斥。规划系统可以提供高层目标和安全边界,学习模型负责局部评估或动作选择;学习模型也可以输出目标,再由传统系统完成合法执行。
十七、工程风险与约束
1. 可控性
游戏 AI 的目标不是无条件获胜,而是创造合适的玩家体验。训练出的最优策略可能无聊、压迫感过强,甚至利用游戏漏洞。因此必须设置信息、操作速度、动作合法性和难度边界。
2. 可解释性与调试
传统行为树可以直接看到当前节点,神经网络却很难解释为何选择某个动作。工程系统需要记录:
- 模型版本。
- 输入特征摘要。
- 各动作概率。
- 最终选中的动作。
- 价值估计和奖励。
- 随机种子与对局回放。
这些数据是复现异常行为的基础。
3. 分布变化
游戏规则、单位数值或地图发生变化后,旧模型面对的数据分布也会改变。即使接口没有报错,策略性能仍可能显著下降。因此模型版本必须与游戏数据版本绑定,并在更新后重新评估。
4. 训练成本
大规模自博弈需要大量并行环境和算力。课件以 AlphaStar 为例强调了其高昂成本。商业项目必须评估投入是否能转化为玩家可感知的提升。
5. 确定性与网络同步
在线游戏需要考虑推理结果是否可复现、模型运行是否跨平台一致,以及 AI 应在服务器还是客户端执行。若模型直接影响权威 Gameplay 状态,通常应由权威端运行并同步结果。
十八、关键设计原则
- 先定义 AI 能看到什么、能做什么,再选择算法。
- 奖励函数必须服务于真实玩法目标,而不是方便统计的代理指标。
- 训练环境与正式游戏规则必须保持一致。
- 模型输出必须经过合法性检查,不能绕过 Gameplay 系统。
- 用监督学习提供合理起点,用自博弈扩展能力边界。
- 用历史对手和多样策略防止遗忘与过拟合。
- 根据输入结构选择网络,而不是用一个网络强行处理所有数据。
- 优先把机器学习用于玩家最能感受到价值的局部问题。
- 为模型准备回退策略、版本绑定、日志和回放。
- 把训练成本、推理预算和维护难度视为架构的一部分。
十九、复习要点
- 机器学习包括监督学习、无监督学习、半监督学习和强化学习。
- 强化学习通过智能体与环境交互,优化长期累计回报。
- MDP 由状态、动作、转移、奖励和折扣因子组成。
- 复杂游戏的真正难点往往是状态、动作和奖励的建模,而不只是选择某个算法。
- RTS 动作是多部分结构化决策,通常需要多个输出头逐步生成。
- 标量、实体、空间图像和历史信息分别适合 MLP、Transformer、CNN/ResNet 和 LSTM。
- 监督预训练让策略先学会合理行为,强化学习和自博弈再提升长期表现。
- 对手池与历史版本可以增加训练多样性,降低策略遗忘。
- 训练通常在独立集群中完成,正式游戏只加载模型进行推理。
- 传统 AI 与机器学习是互补关系;混合架构往往更可控、更经济。