文章目录
课前QA
- 怎么看待 AI 读取玩家操作指令:可以简单读取一下,让 AI 更智能,但不能给太高权限(收集所有信息)
- AI行为的预算:AI 可以低频地更新底层的行为(比如1s一次),高频地更新细节的行为,根据权重和优先级调整,比如单机的ai时间预算可以比较高
- 能不能将 AI 计算用网络服务器计算:可以,专门计算 AI的服务器或者分布式计算都可以,但是需要信息上传的时间,分布式还需要上传多份
一,层次任务网络(Hierarchical Tasks Network,HTN)
层次任务网络是经典的游戏 AI 技术。
- 上一课的行为树更像是一个无脑的反应机器,其根据设定功能行为,是有构的;
- 而HTN是从任务或目标出发,把目标分为几个步骤,步骤内可以包含不同选项,并根据自身状态选择合适的行为一次完成步骤,完全类似人的思考过程,可以更好地表达 AI 自身的意志和驱动力。
1.1 HTN Framework
World State :AI 对世界的主观认知(而不是真实世界的客观描述),反馈到Planner
Sensors :传感器、感知器,从游戏中抓取状态
HTN Domain:层次化树状 task
Planner :制定的计划 task
plan runner:执行计划,在 task 结束后更新 World State
1.2 HTN Task Types
1.2.1 Primitive Task基本任务
primitive task 一般表示一个具体的动作或行为。见上图左,每个 primitive task 都有 precondition( world state properties)、action 以及 effects (改变properties)三个要素。
1.2.2 Compound Task符合任务
见上图右,compound task 由很多method构成,每个method都有自己的precondition;我们把这些方法按照一定的优先级组织起来并且在执行时按照优先级高到低的顺序进行选择(更像||的逻辑)。每个method还可以包含其它的 primitive task 或者 compound task,当方法内所有的 task 都执行完毕则表示任务完成。(感觉是行为树的拓展包装)
1.3 Planning
接下来就可以进行规划了,我们从 root task 出发不断进行展开逐步完成每个任务。
- 从 root task 开始检查 precondition,选择一个满足条件的 compound task
- 对这个当前指向的 compound task 展开在这个展开的 task 中,先把 world state 拷贝一份,然后检查 precondition,如果满足,就假设这个 task 里的 action 全部可以执行成功,并把其 effect 修改到拷贝的 world state里(带着目的预测)。如果执行时发现不能成功执行,再层层返回false,去选择下一个task
- 重复第二步直到没有 task 为止
最后输出的plan里就只有Primitive Task,再把plan交给runner执行
- Run plan:依次执行 task,直到所有 task 都成功或者有一个 task 失败(游戏时动态的,可能决策时可以,执行到这里时又不行了)
1.4 Replan
- 需要重新计划的情况: 1. 在Run plan时有task执行失败,就需要重新计划;2. 计划成功执行完后,或者没有task时,需要计划下一步动作;3. world state被修改后被sensor感应到时,也需要重新计划
1.5 总结
- 优点:HTN 和 BT 非常相似,但是是BT的高阶版本,但HTN更加灵活、符合人的直觉、也更易于设计师进行掌握;可以带着目的预测,任务计划也更长程
- 缺点:由于用户行为不可预测,因此task很容易失败或满足不了precondition;并且world state与任务effect影响对设计师是挑战(比如忘记设置某个条件;或者如果 task 链路过长但是环境变化很快,那么 AI 的行为就会变化很快,看上去振动一样)
二,目标导向行为规划Goal-Oriented Action Planning(GOAP)
GOAP方法更加自动化,并且不同于向前planning,GOAP是backward planning;因此和前面介绍过的方法相比 GOAP 一般会更适合动态的环境。-----虚幻的EQS就是基于GOAP
2.1 GOAP Structure
GOAP 的整体结构与 HTN 非常相似,只是 domain 被替换为 goal set 和 action set。
在HTN中,所谓“目标Goal”是几个task集合成的,写在注释里的;而在GOAP中“目标”有非常严格的数学定义,可以数学表达;并且在HTN中的计划,而在GOAP中应该叫“规划”
2.1.1 Goal Set
goal set 表示 AI 所有可以达成的目标。在 GOAP 中需要显式地用相应的状态来定义。
Goal有Precondition、Priority优先级、States状态集合三个属性,状态集合就是用来描述目标的。
2.1.2 Action Set
action set 类似 primitive task ,它表示 AI 可以执行的行为,它包含precondition、effct和cost三个属性。其中cost是由开发者定义的代价权重,用于排序优先级(代价低的优先)
action set 没有树状结构,所以要用 cost 来选 action
2.2 Backward Planning
GOAP在规划时会从目标来Backward倒推所需要执行的动作,反向规划是一种类似人类的思考方式:
1.在优先级排序的目标序列中选取第一个precondition已经满足的目标goal。
2. 然后查询实现目标需要满足的状态state,筛选目前world state中没有满足的state,存入“待满足state”堆栈。
3. 依次获取堆栈里的state,并找到其满足其对应的action,加入plan堆栈
4. 如果action也有未满足的state需求,也把这些state加入存入“待满足state”堆栈,(递归),直到所有的状态需求都得到了满足。
GOAP 中除了“能够达成目标”以外,最核心的点就在于如何选择最小代价路径达成目标,包括选择目标和选择action。这个问题可以转换为路径规划为题,可以用代价图来求解。
2.3 Build States-Action-Cost Graph
有向图里的节点是state 的组合,起点是 goal 的 states,终点是当前states;不同节点之间的有向边表示可以执行的动作,边的权重则是动作的代价。
这样整个规划问题就等价于在有向图上的最短路径问题。
这里可以通过上节课提过的A* 算法来求解(用未满足状态的个数来进行启发式计算???),这样不能保证找到最优的最短路,但也因此带给游戏更多真实性
2.4 GOAP 总结
- 优点:比起HTN更加动态灵活(HTN容易导致precondition与effect混乱),并更够解耦 AI 的目标与行为
- 缺点:比BT、FSM、HTN都慢(HTN最快),并且state与action的定义非常复杂
三,蒙特卡洛树搜索Monte Carlo Tree Search(MCTS)
上边的方法听起来都是程序设定好的行为,和真正的AI没啥关系,接下来就会讲到机器学习驱动的ai了。不过先介绍一下本节的蒙特卡洛树搜索方法作为过渡,它介于设定程序与真AI之间。AlphaGo 就是基于 MCTS 来实现的。
MCTS是一种自动plannning的方法,表现更多样。思路是在进行决策时首先模拟成千上万种可行的动作,然后从这些动作中选择最好的那个来执行(就像下围棋一样)。
MCTS 的核心是 Monte Carlo方法(Monte Carlo method),它指出定积分可以通过随机采样的方法来进行估计。
3.1 States and Actions
以围棋为例,MCTS 会根据当前棋盘上的状态来估计落子的位置(也根据规则来,不是纯随机)。
从数学的角度来看,我们把棋盘上棋子的位置称为状态(state),同时把落子的过程称为行为(action)。这样就形成了有向图中的一个step,如下图。
如果把数以百万计的模拟落子行为表现在图里,就会形成一个行为树(state space/tree),并在这个行为树中计算最优解。并且每走一步,都会重建这个行为树(优化:以下一步的节点重建树,重用一些node),以确保未来都是最优解
3.2 Simulation 的基础概念
模拟(simulation)是 MCTS 中的重要一环,指的是AI利用当前的default policy策略快速地完成整个游戏过程。
default policy 相当于预先存好的棋谱,根据这个棋谱我可以立即查到胜率,然后根据策略多次模拟计算胜率(赢得次数/模拟总次数)。
(就算根据策略路径模拟到win的结果,但实际也不一定能赢。)
- Backpropagate:当一条路径模拟结果是失败后,会把结果从下向上传递来更新整个决策分支上的胜率
3.3 Iteration Steps迭代
- 选择一个最有希望,且没有被完全展开的节点,
- 展开它,
- 并进行探索模拟
- 更新胜率
但这样推演需要的算力太大了,如下图,才4步就有这么多。因此需要一些优化。
3.3.1 Selection — Expandable Node
优先选择可拓展的节点,也就是可能性没有穷尽的 node。这里需要在两种策略中找到平衡:
- exploitation开发 :选择胜率高的节点
- exploration探索:选择模拟次数少的节点
这两种策略的权衡也是机器学习中的重点,更是我们人生选择需要权衡的地方~
那么怎么平衡呢?用UCB来评估:
- 上界置信区间UCB (Upper Confidence Bounds) 这里还增加了一个常数C方便调整:
C 增大,访问少的更多被选中
C 减小,胜率高的更多被选中,更保守
- 应用方法:每次都从根节点开始,层层寻找 UCB 最大的子节点,直到子节点还没模拟出结果(可拓展)
3.3.2 Expansion and Simulation
对找到的节点探索时可以模拟一次或者一组,然后把模拟的结果自下而上进行更新。
迭代结束条件:超过规定次数或者内存不够时就结束
- 然后只需要回到根节点选择一个最优的子节点进行执行即可。选择策略:
- max child 找 Q 最大(赢得次数最多)
- robust child 找 N 最大(模拟次数最多->因为在选择模拟节点是已经用UCB筛选过了)
- max-robust child 找 Q 和 N 最大,如果没有就继续拓展树
- secure child 综合考虑 Q 和 N–>下界置信区间LCB(Lower Confidence Bounds)
3.3 MCTS 总结
- 优点:表现更多样化(有随机数),全自动决策,适合搜索空间巨大的决策问题
- 缺点:计算复杂度大所以难以用在实时游戏中,并且复杂游戏中也难以定义状态和行为
- MCTS适合回合制、行动导致的数值反馈明显的游戏
四,机器学习基础Machine Learning Basic
- 为什么游戏ai需要机器学习
之前的游戏 AI 的行为的所有 action 都是设计师设计好的,但是深度学习得到的 action 可能是设计师意想不到的,可以提供无限可能性和更多新鲜感。尽管目前基于机器学习的游戏 AI 技术大多还处于试验阶段,但已经有一些很优秀的项目值得借鉴和学习,包括 DeepMind 的 AlphaStar 以及 OpenAI 的 Five 等。
- machine learning 的四种类型: 1. Supervised Learning监督学习:本质是分类器,是从标注数据总学习分类(有猫、没猫)2. Unsupervised Learning无监督学习:本质是聚类,是从无标注数据中学习分类3. Semi-supervised Learning半监督学习:从大量无标注数据一小点有标注数据中学习分类4. Reinforcement Learning强化学习:在reward激励函数和反馈函数的相互作用下,自己学习形成合理的策略policy。
强化学习是游戏 AI 技术的基础,其难点在于激励经常是滞后的导致难以学习。
4.1 Markov Decision Process(MDP)马尔可夫决策过程
它是强化学习的理论基础。在 MDP中智能体对环境的感知称为状态(state),环境对于智能体的反馈称为奖励(reward)。MDP 的目标是让智能体通过和环境不断的互动来学习到如何在不同的环境下进行决策,这样的一个决策函数称为策略(policy)。
- MDP 数学模型
- 环境是变化的,从某一个状态到另一个状态是有概率失败的,所以用𝑝 (𝑠′ |𝑠, 𝑎) 表达采取动作 a 后状态从 s 转到 s’ 的概率
- 决策(Policy)中可能有多种行为,𝜋 (𝑎 |𝑠) = 𝑃 (𝐴𝑡 = 𝑎 |𝑆𝑡 = 𝑠) 是在状态 s 下采取行为 a 的概率
- 在计算总reward时,因为策略是不靠谱的,所以认为在第一步时得到的奖励是一定的,但在后续的steps中得到的奖励就要逐步乘以一个系数,如 G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 … … G_t = R_{t+1} + γR_{t+2}+γ^2R_{t+3}…… Gt=Rt+1+γRt+2+γ2Rt+3……「马尔科夫过程核心:把事情变成离散的step by step」
- 后续再根据概率、reward的数学模型,用比如梯度优化法,去优化policy
五,Build Advanced Game AI
在游戏中构建ai决策最重要的事构建游戏的Observation,也就是能够定量化表达游戏中所有的状态,使之可以被电脑感知,在此基础上再利用ai进行决策。
- 深度强化学习(deep reinforcement learning, DRL)决策过程 1. State:对世界状态的描述,如资源,友军,敌人,血量等2. Action:直接对游戏对象做出操作,也有模拟人类操作的(鼠标点击等)3. Reward:大到胜负,小到各种动作奖励4. NN design:神经网络的拓补结构和选型及结构,根据游戏机制不同5. Training Strategy:神经网络的训练策略
5.1 State
s
t
a
t
e
=
m
a
p
+
g
a
m
e
s
t
a
t
i
s
t
i
c
s
+
u
n
i
t
s
+
p
l
a
y
e
r
d
a
t
a
state = map + game statistics + units + player data
state=map+gamestatistics+units+playerdata
智能体可以直接从游戏环境获得的信息包括地图、统计数据、场景中的单位以及资源数据等。
- Maps
Heights高地
Visibility: fog of war视野:战争迷雾
Creep
Entity owners
Alerts警报
Pathable可寻路
Buildable可建造
- Units Information一帧中每个unit块中的信息
5.2 Actions
在 AlphaStar 中智能体的行为还取决于当前选中的单位。
5.3 Rewards
奖励函数的设计对于模型的训练以及最终的性能都有着重要的影响。
在 AlphaStar 中使用了非常简单的奖励设计,智能体仅在获胜时获得+1的奖励;并判断相同情况下 AI 的操作和人类的操作的比较,如果不一样就给惩罚(在AlphaStar中这个操作相关的反馈总体在-1~1之间,有自己的权重)。
而在 OpenAI Five (dota)中则采用了更加复杂的奖励函数,与打塔、受伤害、杀英雄等等都相关,这样就可以让ai有各种行为倾向。
5.4 NN architectures
上图是 AlphaStar体系结构图,其中使用了不同种类的神经网络来处理不同类型的输入数据,
- 对于定长输入(比如资源数量、等级等)使用了 MLP(Multi-Layer Perception);
- 对于图像数据(比如2d 地图、可走可建造图)使用了 ResNet(属于卷积神经网络CNN);
- 对于非定长的序列(比如场上的不同种类的敌人数量)使用了 Transformer;
- 这些encoder之后一起放到 LSTM (Long-Short Term Memory)进行处理,LSTM可以记忆历史数据并反馈到策略中
- 最后再逐操作模块decoder。 「有些游戏还有Raycast数据(模拟人的视角)、Mesh数据等需要处理」
5.5 Training Strategy
如果一个空白模型暴力去学习以上这些复杂的逻辑内容去做决策,那需要的算力、时间、金钱都难以承受。因此就需要一定的训练策略,比如先将大量人类操作行为投入,用监督学习的方式先训练出一个差不多的策略模型,再去优化。
比如AlphaStar 的训练过程中首先使用了监督学习的方式来从人类玩家的录像中进行学习,然后再用强化学习的方法来进行自我训练(自己的自己的变种、旧版本等去打,相当于双手互搏),来寻找全局最优解(而不是局部最优解)。
- 强化学习or监督学习?
试验结果分析表明基于监督学习训练的游戏 AI 其行为会比较接近于人类玩家,但基本无法超过人类玩家的水平;而基于强化学习训练的 AI 则可能会有超过玩家的游戏水平,不过需要注意的是使用强化学习可能需要非常多的训练资源。
因此对于游戏AI到底是使用监督学习还是使用强化学习进行训练需要结合实际的游戏环境进行考虑。对于奖励比较密集的环境可以直接使用强化学习进行训练,而对于奖励比较稀疏的环境则推荐使用监督学习。
5.6 Hybrid混合策略
在控制一些宏观行为的时候可以使用神经网络,在控制细节行为的时候可以用设计师配置的行为树等等
版权归原作者 我要吐泡泡了哦 所有, 如有侵权,请联系我们删除。