1. Reinforcement Learning (强化学习)简介
1.1 什么是强化学习
强化学习是一种机器学习方法,它训练智能体在环境中采取行动,以最大化累积奖励。智能体通过试错与环境互动,学习哪些行动会带来奖励(正反馈),哪些行动会导致惩罚(负反馈)。通过不断地学习和调整策略,智能体逐渐学会如何在特定环境中做出最优决策,以达到最终目标。与监督学习不同,强化学习不需要预先标注的数据,而是通过与环境的互动自主学习。
强化学习的应用非常广泛,比如:
-
游戏AI: 训练AI玩各种游戏,例如围棋、Atari游戏等。
-
机器人控制: 控制机器人完成各种任务,例如行走、抓取物体等。
-
自动驾驶: 训练汽车在复杂环境中安全行驶。
-
推荐系统: 根据用户的历史行为推荐商品或服务。
-
金融交易: 制定交易策略以最大化利润。
在强化学习应用于《太空侵略者》游戏的场景中,智能体扮演控制母舰的角色,通过操纵虚拟摇杆与外星入侵者进行对抗。游戏主机构成智能体所处的环境,负责模拟外星人的攻击行为。智能体的观测信息来源于游戏画面的实时呈现。智能体的输入为当前游戏画面的图像,输出则为一系列可执行的动作指令。
例如,当智能体执行“向右移动”的动作时,该动作本身并不能直接消灭外星人,因此获得的即时奖励为零。执行动作后,游戏画面随之更新,产生新的观测信息,智能体将基于此新的观测结果决定下一步的动作。
若智能体执行“开火”动作并成功击落一个外星人,则获得相应的奖励,假设击落一个外星人得 5 分,则该动作的奖励值为 5。智能体在游戏过程中持续执行动作并接收相应的奖励反馈。强化学习的目标是训练智能体,使其在游戏过程中获得的累积奖励总和最大化。
与传统的机器学习范式相仿,强化学习亦遵循一套类似的框架。机器学习通常包含以下三个核心步骤:首先,构建一个参数化的函数模型,该模型中包含待学习的未知变量;其次,定义一个损失函数,用于衡量模型预测结果与真实值之间的差异;最后,通过优化算法调整模型中的未知变量,以最小化损失函数,从而获得最优的模型参数。强化学习同样遵循类似的步骤,但其具体内涵有所不同。
第一步:定义函数模型
在强化学习框架中,智能体是构成决策主体的核心要素,其功能可类比于机器学习中的函数模型。策略网络本质上是一个复杂的函数,以游戏为例,其输入为游戏画面的像素信息,输出则是针对每个可执行动作的评分。
策略网络的架构设计具有一定的灵活性,其基本原则是能够接收游戏画面作为输入,并输出相应的动作评分。例如,若输入为静态图像,则可采用卷积神经网络(CNN)进行特征提取和处理;若需考虑游戏过程中连续的时序信息,即不仅关注当前时刻的画面,还要考虑之前所有帧的历史信息,则可采用循环神经网络(RNN)或Transformer等序列模型。
如图所示,策略网络接收游戏画面作为输入后,输出各个动作的评分,例如“左移”得分为 0.7,“右移”得分为 0.2,“开火”得分为 0.1。分类网络通常在最后一层使用softmax函数,将每个类别的原始评分转换为概率分布,使得所有类别的概率之和为 1。
智能体最终采取何种动作取决于各个动作的评分。一种常见的做法是将这些评分视为概率分布,并根据此概率分布进行随机采样,从而决定实际执行的动作。原因在于引入随机性有助于提升智能体的表现。虽然智能体可以总是选择评分最高的动作(例如上述示例中的“左移”),但通常采用基于概率的随机采样策略。这种策略的优势在于,即使面对相同的游戏画面,智能体每次执行的动作也可能略有不同。在许多博弈类游戏中,随机性至关重要。以“石头剪刀布”为例,如果智能体始终选择“石头”,则很容易被对手预测并击败。而引入随机性则可以提高智能体的策略多样性,使其更难以被预测,从而提升胜率。
第二步:定义损失函数
强化学习的第二个关键步骤是定义目标函数,该目标函数驱动智能体学习最优策略。在强化学习中,我们旨在最大化智能体在一个回合(episode)中获得的累积奖励,该累积奖励亦称为回报(return)。仍旧以游戏为例,这一交互过程持续进行,智能体不断根据当前状态选择动作并接收相应的即时奖励,直至游戏结束。从游戏开始到结束的完整交互序列构成一个回合。
在一个回合中,智能体会执行一系列动作,每个动作都会产生一个即时奖励。将这些即时奖励累加起来,便得到该回合的总奖励,即回报。强化学习的目标是最大化期望回报,即找到一个策略,使得智能体在所有可能的回合中获得的平均回报最大。
需要明确的是,回报与损失的概念有所不同。在传统的监督学习中,损失函数旨在衡量模型预测与真实值之间的差距,其目标是最小化损失。而在强化学习中,我们关注的是最大化回报。为了在形式上与损失函数保持一致,有时会将负回报视为损失,此时目标则变为最小化负回报。简而言之,最大化回报等价于最小化负回报。
此外,需要区分即时奖励和回报。即时奖励是指智能体执行某个动作后立即从环境中获得的反馈,而回报则是指在一个回合中所有即时奖励的累积总和。回报是对智能体在一个回合内的整体表现的评估,是强化学习算法优化的直接目标。
第三步:进行优化
智能体与环境的交互是强化学习的核心过程。环境首先输出一个观测值,该观测值随即作为智能体的输入。智能体基于此输入输出一个动作,该动作又反过来成为环境的输入。环境接收到该动作后,更新其状态并输出新的观测值。此交互过程持续进行,直至满足预设的终止条件。在过程中,所有状态和动作的有序序列构成一条轨迹。
在智能体与环境的交互过程中,会产生相应的奖励。奖励可视为一个函数,其表示形式多样。在某些简单情境中,智能体采取的动作可以直接决定奖励值。然而,更常见的情况是,奖励的确定需要同时考虑动作和观测。例如,在射击游戏中,仅执行“开火”动作并不一定能得分,只有当子弹击中目标时才会获得奖励。因此,奖励函数通常定义为状态和动作的函数。奖励函数的输入为一个动作和一个状态,输出为相应的奖励值。一个回合的总奖励,即回报,是该回合中所有即时奖励的累加和。
强化学习的目标是最大化回报,相应的优化问题转化为寻找一组网络参数,使得回报值最大化。一种常用的优化方法是梯度上升。然而,强化学习的优化过程与传统的监督学习存在显著差异,并非简单的优化问题。
首要挑战在于智能体输出的随机性。在游戏的例子中,动作是通过采样生成的,即使输入相同的观测值,每次生成的动作也可能不同。若将环境、智能体和奖励视为一个整体网络,则该网络并非一个确定性网络,其内部存在随机层,导致每次输出都具有不确定性。
另一挑战源于环境和奖励函数的黑盒特性及其潜在的随机性。例如,当环境为游戏机时,其内部运行机制通常是未知的。虽然在许多游戏中,奖励的确定性规则是预先设定的(即给定观测和动作即可确定对应的奖励),但在某些强化学习问题中,奖励本身也可能具有随机性。例如,在一些游戏中,即使执行相同的动作,游戏机的响应也可能不同。又如下围棋,即使智能体在相同的位置落子,对手的后续应对也可能各有不同。环境和奖励的这种随机性使得强化学习的优化问题变得更为复杂,难以采用传统的优化方法。
强化学习的核心问题是如何找到一组网络参数,以最大化回报。这与生成对抗网络的思想存在某种相似性。在训练生成器时,生成器与判别器对接,通过调整生成器的参数,力求使判别器的输出最大化。在强化学习中,智能体类似于生成器,环境和奖励则类似于判别器,我们的目标是调整智能体的参数,以最大化其从环境中获得的回报(类似于判别器的输出)。然而,与生成对抗网络不同的是,生成对抗网络中的判别器也是一个神经网络,因此可以使用梯度下降等方法来训练生成器。而在强化学习中,环境和奖励并非神经网络,无法直接应用传统的梯度下降方法进行优化。这正是强化学习与传统机器学习方法的主要区别之一。
1.2 Policy Gradient (策略梯度)
在阐述策略梯度(Policy Gradient)方法之前,我们首先探讨如何引导执行者(actor)的输出,使其在接收到特定观测值时采取期望的行为。一种直观的方法是将此过程类比为分类问题。具体而言,当观察到某个画面时,我们期望执行者输出特定的动作。基于此,我们可以计算执行者输出与真实标签(ground truth)之间的交叉熵(cross-entropy)损失。
通过调整模型参数θ,并最小化该损失函数,便可使执行者学习到在特定游戏画面下执行相应动作的能力。
反之,若要避免执行者采取某种特定行为,只需将损失函数的定义取反,即在交叉熵前乘以负号即可。
基于上述将行为控制类比为分类问题的思路,我们可以进一步构建训练执行者(actor)参数所需的总体损失函数。具体来说,我们可以收集一系列数据,这些数据包含观测值和对应的期望行为。然后,基于这些数据,我们可以定义一个损失函数,用于衡量执行者的输出与期望行为之间的差距。通过最小化该损失函数,我们可以训练执行者,使其在给定观测值的情况下采取更接近期望的行为。
更进一步,我们可以将行为的“好坏”程度进行细化,不再局限于简单的二元划分(好或不好),而是使用连续的数值来表示。这意味着,对于每一个输入(观测值)和输出(行为),我们可以赋予一个浮点数(float)值,该值表示该行为在该观测下的优劣程度。
接下来,一个很自然的问题是:我们如何获取这一系列观测值以及与其对应的期望行为呢?我们接下来通过解决方案迭代的方式来讲述这个问题。
解决方案版本 0 - 即时奖励
我们首先会很自然地想到,可以让执行者(actor)与环境进行交互。如果执行者执行某个动作后获得了奖励(reward),我们就认为这个行为是好的,并倾向于再次采取这个行为;如果没有获得奖励,我们就认为这个行为不好,并倾向于避免采取。
然而,这种方法存在一个明显的缺陷,即“短视”。在序列决策问题中,例如强化学习所研究的问题,智能体需要在一系列时间步骤中做出决策。每个时间步骤中,智能体根据当前的环境状态选择一个动作。该动作执行后,会改变环境的状态,并产生一个奖励信号。新的环境状态又会影响智能体在下一个时间步骤中可以采取的动作。因此,行为之间存在着明显的依赖关系。很多时候,为了获得更大的长期回报,我们需要采取一些短期内没有奖励甚至可能带来负面奖励的必要步骤。
解决方案版本 1 - 累积奖励
我们可以用未来所有的奖励相加即可得到累积奖励 ,用以评估动作的优劣。累积奖励 定义为从时间点 开始,将 一直累加到 :
例如,以下是 、 和 的具体定义:
动作 的好坏并不完全由即时奖励 决定,而是取决于执行 后所导致的所有后续奖励,即 。因此,动作的价值 等于累积奖励 。这种累积奖励的评估方式可以解决版本 0 的问题。例如,在游戏中右移可能没有直接奖励,但如果右移后能够瞄准并击中外星人,其累积奖励会是正值,因此右移可以被视为一个合理的动作,即使它本身没有即时收益。
然而,版本 1 也存在不足。如果游戏时间很长,将远期奖励 完全归因于初始动作 可能并不合理。因为当智能体采取动作 时,首先直接影响的是 ,然后才逐步影响 和 。若游戏过程极为漫长,动作 对最终奖励 的实际贡献可能极低。
解决方案版本 2 - 折扣累积奖励
我们可以引入一个折扣因子 。折扣因子是一个小于 1 的值,例如 0.9 或 0.99,用于减小远期奖励对当前累积奖励的影响。新的累积奖励公式如下:
例如,以下是 的具体定义::
使用折扣因子可以对时间上更接近动作 的奖励赋予更高的权重,而对较远的奖励赋予较低权重。
解决方案版本 3 - 减去基线的折扣累积奖励
由于“好”或“坏”是相对概念,在某些游戏中,每次行动都会提供一个最低分,例如 10 分。然而,这种奖励即使是正数,也可能反映的是较差的表现。因此,奖励的评估需要相对化。使用