约 22 分钟技术学习游戏引擎

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. 基本交互

强化学习系统由智能体与环境构成。每一步交互通常包含:

  1. 环境向智能体提供观察或状态。
  2. 智能体依据策略选择动作。
  3. 环境执行动作并转移到新状态。
  4. 环境返回奖励。
  5. 智能体利用经验更新策略。

可以把这一过程概括为:

$$ 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] $$

七、把游戏转化为可学习的问题

课件以复杂即时战略游戏为例,将深度强化学习系统的设计拆分为五个核心问题:

  1. State:智能体能够观察什么。
  2. Action:智能体能够执行什么。
  3. Reward:系统希望它优化什么。
  4. Neural Network Design:如何处理不同结构的输入并输出动作。
  5. 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. 收集并清洗人类对局数据。
  2. 通过监督学习得到初始策略。
  3. 将策略放入对手池开始自博弈。
  4. 根据胜负与辅助奖励更新策略。
  5. 保存历史检查点并寻找策略弱点。
  6. 反复扩充对手分布,提升整体鲁棒性。

训练系统本身已接近一个大型分布式工程项目,需要环境并行、样本存储、模型版本管理、评估和故障恢复等配套设施。

十四、从训练到游戏引擎运行

1. 训练与推理分离

机器学习游戏 AI 通常包含两个环境:

  • 训练环境:大规模并行运行游戏或简化模拟器,更新模型参数。
  • 运行环境:游戏发布后加载已训练模型,只执行前向推理。

正式游戏一般不会在玩家设备上持续训练,因为训练会消耗大量算力,也会使行为难以复现和测试。

2. 引擎侧接口

部署策略网络时,游戏引擎需要提供稳定的数据边界:

  1. 从 Gameplay 世界收集合法观察。
  2. 把观察编码成模型输入。
  3. 执行模型推理。
  4. 解码动作并检查合法性。
  5. 将动作提交给现有移动、战斗和技能系统。
  6. 在模型超时或输出非法时使用回退逻辑。

策略网络不应绕过 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 状态,通常应由权威端运行并同步结果。

十八、关键设计原则

  1. 先定义 AI 能看到什么、能做什么,再选择算法。
  2. 奖励函数必须服务于真实玩法目标,而不是方便统计的代理指标。
  3. 训练环境与正式游戏规则必须保持一致。
  4. 模型输出必须经过合法性检查,不能绕过 Gameplay 系统。
  5. 用监督学习提供合理起点,用自博弈扩展能力边界。
  6. 用历史对手和多样策略防止遗忘与过拟合。
  7. 根据输入结构选择网络,而不是用一个网络强行处理所有数据。
  8. 优先把机器学习用于玩家最能感受到价值的局部问题。
  9. 为模型准备回退策略、版本绑定、日志和回放。
  10. 把训练成本、推理预算和维护难度视为架构的一部分。

十九、复习要点

  • 机器学习包括监督学习、无监督学习、半监督学习和强化学习。
  • 强化学习通过智能体与环境交互,优化长期累计回报。
  • MDP 由状态、动作、转移、奖励和折扣因子组成。
  • 复杂游戏的真正难点往往是状态、动作和奖励的建模,而不只是选择某个算法。
  • RTS 动作是多部分结构化决策,通常需要多个输出头逐步生成。
  • 标量、实体、空间图像和历史信息分别适合 MLP、Transformer、CNN/ResNet 和 LSTM。
  • 监督预训练让策略先学会合理行为,强化学习和自博弈再提升长期表现。
  • 对手池与历史版本可以增加训练多样性,降低策略遗忘。
  • 训练通常在独立集群中完成,正式游戏只加载模型进行推理。
  • 传统 AI 与机器学习是互补关系;混合架构往往更可控、更经济。

二十、参考资料