1,线性逼近
1.1,基本原理
到目前为止,一直假定强化学习任务是在有限状态上进行的,这时的值函数其实是一个表格。对于状态值函数,其索引是状态;对于行为值函数,其索引是状态行为对。值函数迭代更新的过程实际上就是对这张表进行迭代更新,获取某一状态或行为价值的时候通常需要一个查表操作。因此,前面的强化学习算法称为表格型强化学习。
若状态空间的维数很大,如围棋(
个状态空间),此时精确获取各种
和
几乎不可能的,因为既没有足够的内存也没有足够的计算能力,这时候需要找到近似的函数
,利用函数逼近的方法对值函数进行表示:
其中,
表示引入的参数,实际通常是一个向量。通过函数近似,可以用少量的参数
来拟合实际的各种价值函数。
针对强化学习,近似函数根据输入和输出的不同,可以有以下三种架构:
- 输入状态
,输出为这个状态的近似价值
。
- 输入状态行为对
,输出当前状态行为对的近似价值
。
- 输入状态
,输出为一个向量,向量中的每一个元素是该状态下一种可能的行为价值
,如
。
在进行值函数逼近时,线性回归、神经网络等和机器学习相关的一些算法都可以拿来使用。根据所选择的逼近函数是线性函数还是非线性函数,值函数逼近又可分为线性逼近和非线性逼近。
当逼近的值函数数据结构确定时,如线性逼近选定了基函数,非线性逼近选定了神经网络的结构,那么值函数的逼近就等价于参数的逼近,值函数的更新也就等价于参数的更新。也就是说,此时的目的变成了利用试验数据来更新参数值,通过轨迹学习线性函数或神经网络的参数值。
1.2,线性逼近
所谓线性逼近指的是将值函数表示为状态或状态函数的变形组合,如:
其中,
为参数向量。
向量
称为状态
的特征分量。例如描述直升飞机状态的时候,需要描述它的飞行速度、角速度等;或者评估移动机器人的状态时,需要扫描电量、坐标等。
假设每个状态
对应于
个数,
。则对于这个
维状态空间
可以写成:
上述值函数表示虽然简单,但是忽略了不同维度特征之间的相互作用,如评估直升飞机状态好坏的时候,需要同时考虑坐标和角速度等。因此需要对函数
进行扩展,使其不仅能表示状态的特征分量,还能表示一些复杂的函数,如多项式函数、傅里叶函数等。这个时候
还是关于参数向量
的线性函数,因此还是属于线性逼近的范畴。此时
称为状态
的特征函数,或者称为基函数。
(1)多项式基函数:
阶多项式基特征
可以写成
其中,
,
为正整数,称为多项式的阶数。
为状态
的维数。上述
阶多项式包含
个特征。
【例如】一个拥有两维特征的状态
,其多项式基函数可以表示为
,或者
等。高阶多项式越复杂,函数逼近越精确,但是随着维数
的增大,其计算复杂度也是呈指数级增长。因此实际使用中,需要对特征进行筛选,选择其中的一个特征子集进行函数逼近。
(2)傅里叶基函数:一种基于时间的傅里叶级数,将周期函数表示为不同频率的正弦或余弦基函数的加权和。如果
,对于所有
和某个周期
均成立,则函数
是周期的。将周期函数写为正弦余弦函数称为傅里叶变换。
一般令
,使得特征
被定义在半
区间
上。假设每个状态
对应一个
维向量,
,且
,则
阶傅里叶余弦的第
个特征为:
其中,
,对于
和
。
相当于为
的每个维度分配了一个正整数,这个正整数属于集合
。该正整数决定了该维度上的特征频率,上述特征可以移动和缩放以适应特殊情况下的有界状态空间。事实证明,傅里叶函数在强化学习中易于使用,而且效果良好。
(3)径向基函数:径向基函数是一个取值仅仅依赖于里原点距离的实值函数,也就是
,或者还可以是到任意一点
的距离,
点称为中心点,也就是
。任意一个满足
特征的函数
都叫做径向基函数。最常用的径向基函数是高斯核函数,其形式为:
以上三种基函数均为参数
的线性函数,因此均属于线性逼近,相比于非线性逼近,线性逼近的好处是只有一个最优值,因此可以收敛到全局最优。
1.3,增量法
进行值函数逼近时,希望学到的值函数尽可能地接近真是的值函数
,近似程度常用最小二乘误差来度量:
为了使得误差最小化,采用梯度下降法,对误差求负倒数:
于是可以得到对于单个样本的更新规则:
但是,在进行逼近的过程中,并不知道逼近目标,即真实值函数
的取值。这个时候可以考虑使用任何一个无模型方法对
进行估计。 这样就可以将值函数逼近的过程看作是一个监督学习的过程,标签在蒙特卡罗方法中等价于
,在时序拆分方法中等价于
,在多步时序差分方法中等价于
。
基于蒙特卡罗方法的参数逼近:首先给定要评估的策略
,产生一条完整的轨迹:
值函数的更新实际是一个监督学习的过程,其中监督数据集中累计回报
从蒙特卡罗的轨迹中得到,回报
可以通过
求得,得到的轨迹也可以表示为如下数据集:
参数更新公式:
基于时序差分方法的参数逼近:如果考虑使用一步时序拆分方法从不完整的轨迹中学习参数值,就需要利用到自举的方法,用下一步状态的值函数更新当前状态的值函数。
方法中目标函数:
。其中,
可以用
近似。
同样,将值函数更新看作监督学习过程,则对应的数据集为:
此时,要更新的参数
,不仅出现在要估计的当前状态的值函数
中,还出现在目标值函数
中。在对
求导时,只考虑参数
对估计值函数
的影响而忽略对目标值函数
的影响,即保留
对
的导数,而忽略
对
的导数,这种方法并非完全的梯度法,只有部分梯度,称为半梯度法。
参数更新公式:
即:
基于前向
的参数逼近:考虑使用多步时序差分前向算法进行参数逼近,λ-回报
是值函数的无偏估计,对应的监督学习数据集为:
参数更新公式如下:
即:
基于后向
的参数逼近:对于后向算法,有:
这里资格迹公式与之前定义的累计型资格迹
不同,它的应用场景是表格型强化学习。在非表格型强化学习中,资格迹第二项为
。
进而:
在实际场景中,大多数情况下需要逼近行为值函数以便获取策略:
将
作用于状态和动作的联合向量上,即给状态向量增加一维用于存放动作向量,即将函数
替换为
。这样,就有了行为值函数:
对近似值和实际值采用最小二乘误差来度量,为了使误差最小,对其误差采用梯度下降法,有:
对于单个样本的更新规则:
相应地,作为逼近目标,
是未知的,可以使用蒙特卡罗、时序差分等方法进行估计。
基于蒙特卡罗的参数逼近为:
基于 Sarsa 的参数逼近为:
基于 Q-学习的参数逼近为:
其中,
为在状态
下遵循目标策略
采取的动作。
基于前向
的参数逼近为:
基于后向
的参数逼近为:
以上为应用增量法求取
的公式,当
确定了,便可求取给定状态的值函数或者行为值函数,在此基础上可确定最优策略。增量法涉及的基本方法很多,这里仅仅基于 Sarsa 的参数逼近方法为例:
假设需要逼近的行为值函数
,
为函数参数
为选定的任何一个基函数。在使用 Sarsa 方法进行逼近时,产生采样的策略和评估改进的策略都是 ε-贪心策略。在具体执行时,单个轨迹内,每进行一个时间步,都会基于这个时间步的数据对参数
进行更新。
1.4,批量法
增量法参数更新过程随机性比较大,尽管计算简单,但样本数据的利用率不高;而批量法,尽管计算复杂,但计算效率较高。
批量法是把一段时间内的数据集中起来,如给定一段经验数据集:
通过学习,找到最好的拟合函数
使得能较好地符合这段时期内所有的数据,满足损失函数最小:
对
求导,并令导数为 0,得:
同样地,可以利用蒙特卡罗、时序差分等方法对
进行近似。对上式求解,可得
。
最小乘二蒙特卡罗方法参数为:
最小乘二时序差分方法参数为:
最小乘二前向
方法参数为:
最小乘二前后
方法参数为:
如果对行为值函数进行拟合,即:
,并对数据集
应用批量法。
最小二乘蒙特卡罗方法参数为:
最小二乘Sarsa方法为:
最小二乘Q-learning方法为:
其中,
为在状态
下遵循目标策略
采取的动作。
最小乘二前向
方法参数为:
最小乘二前后
方法参数为:
上面应用批量求取
的公式,通过求取
,可确定最优策略。
以 Q-learning 的参数逼近方法为例:假设需要逼近的行为值函数:
![]()
为函数参数
为选定的任何一个基函数。
2,非线性逼近
2.1,基本概念
线性逼近是值函数或行为值函数可以表示为基函数和参数线性组合,因为基函数的个数和形式有限,且事先确定,在逼近过程中无法改变,因此其函数逼近能力非常有限,无法逼近比较复杂的函数。而通过设计合理的神经网络,对输入输出样本对进行学习,理论上可以以任意精度逼近任意复杂的非线性函数,神经网络的这一优良特性使其可以作为多维非线性函数的通用数学模型。并且现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,就不能再使用表格对值函数进行存储。值函数近似利用函数直接拟合状态值函数或状态动作值函数,减少了对存储空间的要求,有效地解决了这个问题。
为了在连续的状态空间和动作空间中计算值函数
,可以用一个
来近似计算,称为价值函数近似。
其中
分别是状态和动作的向量表示。函数
通常是一个参数为
的函数,比如神经网络,输出为一个实数,称为 Q-network。
人工神经网络又分为前馈神经网络和反馈神经网络。在前馈神经网络中,各神经元从输入层开始,接收前一级输入,并输出下一级,直至输出层。整个网络中无反馈,可用一个有向无环图表示。前馈神经网络包括单层神经网络和多层神经网络(卷积神经网络CNN属于一种特殊的多层神经网络);而反馈神经网络的结构图是有回路的,输出经过一个时间步再接入到输入层(例如,循环神经网络RNN属于反馈神经网络)。
上为一个前馈神经网络,除去输入层
,输出层
,一共包含
层,神经网络的参数用
表示,其中
表示第
层与第
层神经元之间的连接参数,
表示第
层的偏执项。则有:
令
,表示第
层神经网络的输出,则有:
。将
看成是基函数,可以看出
的参数为前
层神经网络的权值和偏执,那么基函数就是参数变化的,变化的基函数比固定的基函数有更强的函数逼近能力。
神经网络每一层都是一个线性或非线性函数,它们有各自的权重和偏置,把这些函数复合,并通过反向传播算法调节这些权重和偏执,理论上可以逼近任意形式的目标函数。和浅层网络相比,深度网络有更强的表示能力,目前深度网络已经被广泛用于强化学习中用于高维图像降维。
2.2,DQN方法
DQN算法是建立在传统强化学习方法 Q-larning 的基础上,Q-learning 是离线策略时序差分法,使用 ε-贪心策略产生数据,利用该数据对贪心策略进行评估和改进。它利用查表法对行为值函数(Q值)进行预测,迭代更新的目标是时序差分目标
。
DQN 算法在此基础上进行了如下修改:
- DQN 使用深度网络从原始数据中提取特征,近似行为值函数(Q值)。
因为状态空间很大而且连续,无法用查表法来求解每个状态的价值,因此可以考虑使用深度神经网络来表示值函数(行为值函数),参数为每层网络的权重及偏置,用
表示(神经网络参数)。对值函数进行更新等价于对参数
的更新。参数确定了,则对应状态的值函数便可以求解了。
DQN 的神经网络结构是三个卷积层和两个全连接层。输入为经过处理的4个连续的84*84图像,经过三个卷积层,两个全连接层,输出为包含一个动作的 Q 值向量。此网络将高维状态输入转换为低维动作输出,其中,高维输入指的是原始图像,低维动作指的是包含了所有动作的 Q 值向量。
- DQN 利用经历回放对强化学习过程进行训练。
在使用非线性函数逼近器(深度神经网络)近似进行值函数时,学习结果很不稳定,甚至会出现偏差。不稳定的原因有:
(1)利用数据训练神经网络的前提假设是数据之间独立同分布,而强化学习过程中,数据是智能体通过与环境交互产生的数据,相邻的数据之间高度相关。当神经网络依靠这些数据来优化时,存在严重的样本偏差。
(2)由于神经网络对于价值函数的估计值极为敏感。如果价值函数值出现波动,就会导致策略发生很大的改变,直接影响到和环境互动学习过程中收集到的新数据样本,进而影响神经网络参数产生巨大波动而导致无法收敛。例如,一个机器人在探索环境及学习的过程中,如果价值函数改变,告诉它去探索左边的环境,那么它很长时间内收集到的数据都是左边的环境的信息。如果因为波动,它又到右边去了,它很长时间内收集到的数据都是右边的环境信息。依靠这样的实验数据训练出来的网络,参数出现错乱的大幅度波动和发散。
(3)由于价值函数值的范围事前很难有正确的估计。如果在学习中突然获得了远大于历史值的回报或者损失,使用反向传播算法的神经网络会出现梯度爆炸。ci
经历回放在强化学习的计算中是这样实现的:智能体跟环境不断交互,将在环境中学习积累的数据存储到记忆库中。存储的时候,是按照时间步为单元进行存储的,如
。每一次对神经网络的参数进行更新时,利用均匀随机采样的方法从数据库中抽取数据,然后通过抽取的数据对神经网络进行训练。
因为经历回放的样本是随机抽取的,每次用于训练的样本不再是连续相关的数据,所以经历回放打破了数据间的关联,可以令神经网络的训练收敛且稳定。此外每一个样本可以被使用多次,十分适合深度神经网络的梯度学习,进而提高样本效率。
- DQN设置了单独的目标网络来处理TD偏差。
与 Q-learning 方法类似,利用神经网络对值函数进行更新时,更新的是神经网络的参数
,采用的是梯度下降法,更新公式如下:
在 TDDQN 出现之前,利用神经网络逼近值函数(Nature DQN),行为值函数
与目标值
用的是同一张网络,这样就导致数据之间存在关联性,从而使训练网络不稳定。
在TDDQN算法出现之前,更新神经网络参数时,计算TD目标的动作值函数所用的网络参数
与梯度计算中要逼近的值函数所用的网络参数相同,这样就容易导致数据间存在关联性,从而使得训练不稳定。为了解决关联性问题,TD目标计算时使用一个参数
,计算并更新动作值函数逼近的网络使用另一个参数
,在训练过程中,动作值函数逼近网络的参数
每一步更新一次,TD目标计算网络的参数
。每个固定步数更新一次。
- 原来训练网络
,用于计算原来的损失函数
中的
项,并且使用正常梯度下降方法来进行更新。
- 目标网络
,用于计算原先损失函数
中的项
,其中
表示目标网络中的参数。如果两套网络的参数随时保持一致,则仍为原先不够稳定的算法。为了让更新目标更稳定,目标网络并不会每一步都更新。具体而言,目标网络使用训练网络的一套较旧的参数,训练网络
在训练中的每一步都会更新,而目标网络的参数每隔
步才会与训练网络同步一次,即
。这样做使得目标网络相对于训练网络更加稳定。
值函数更新变为如下形式:
操作步骤:DeepMind 团队在 Atari 游戏中训练算法的过程,希望此算法可以在 Atari 游戏中完成各项具有挑战性的任务。整个算法的输入只有游戏视频的原始图像和得分,输出为当前图像下应采取的各种动作:
(1)原始图片预处理:因为该算法直接处理 Atari 游戏的原始数据,一帧是 210*160 个像素点,128色,数据量非常大,对计算能力和记忆存储量要求很高。预处理的目的就是为了减少输入量的维度,降低计算量。
- 首先,对图像的单帧进行编码,编码方法是直接对每个像素的颜色值取最大值,这样可以消除由于闪烁造成的部分图像的缺失。
- 第二步,从RGB帧中提取Y通道的数据(亮度数据),并将图像重新调整为84*84的数据。
DQN算法中的
函数,通过以上两步对当前的4帧图像进行预处理,并将它们堆叠地送入
函数。
(2)神经网络参数更新:本步骤使用神经网络训练
函数的参数
。神经网络的输入是通过函数
预处理产生 84*84*4 图像,输出对应于单个动作的预测
值。
- 神经网络第一层隐层卷积层,包括 32 个 8*8 卷积核,卷积跨度是 4,后接一个非线性激活函数;
- 第二层也是单个卷积层,含64个4*4卷积核,卷积跨度是2,后接一个非线性激活函数;
- 第三个卷积层包括64个3*3的卷积核,跨度是1,后接一个非线性激活函数;
- 最后一个隐层是全连接层,包含512个激活单元;输出层是线性全连接层,输出值是每一个可能动作的
值(对应Atari中18个动作的行为值函数)。
(3)训练:利用 DQN 算法对 Atari 2600 平台上的49个游戏进行实验。不同的游戏使用不同的网络,但是网络结构、学习算法和超参数保持一致,可见DQN方法对于不同的游戏,在仅有少量先验只是的前提下,具有足够的鲁棒性。
行为策略函数选用 ε-贪心策略,在前一百万帧数据中,ε 从 1 线性下降到 0.1,之后保持固定不变。整个实验一共训练了大约5000万帧数据,并将最近100万帧存入记忆库,用来经历回放。
遵循之前的玩 Atari 2600 游戏的算法,训练过程中也使用了简单的跳帧技术。更确切地说,智能体每经历 k 幅图像才采取一个动作,而不是每幅图像都采取动作,跳过的帧上的动作保持和最后一个动作一致。因为模拟器运行一步比智能体选取一个动作所需的计算量要少很多,故这项技术允许智能体在不显著增加运行时间的情况下粗略的计算 k 次游戏。对于所有的游戏,一般使用 k=4 。
由于每个游戏的得分范围差异很大,算法不易评估,因此操作前对训练期间的游戏回报做了调整,将回报值调整在 -1~1 之间。正面回报为 1,负面回报为 -1,回报不变为 0 。这种方式保证算法能够在多个游戏中使用相同的学习速率。对于有生命计数器的游戏,Atari 2600模拟器还会发送游戏中剩余的生命数,作为轨迹结束的标记。
所有超参数(指的是记忆库大小,折扣因子,ε-初始值等)和优化参数(网络权重
) 的选取会根据其中几个游戏的反馈信息而调整,最后所有参数在玩其他游戏的过程中会固定下来。
实验中,使用了如下少量的先验知识:视觉图像(用于输入卷积神经网络)、游戏的分数、采取的动作以及生命计数器。
(4)评估:接下来需要以专业测试人员作为参数,对训练好的DQN算法进行评估。训练好的DQN算法(也称为智能体)每次使用不同的初始条件,遵循的策略的 ε-贪心策略,其中,ε=0.05 。针对每个游戏玩30次,每次最多 5min,保存其平均回报。为避免虚假分数,智能体每隔10Hz(每隔6帧)选择一个动作,在间隔下重复上一个动作。因为10Hz是人类玩家可以选择按钮的最快速度。
专业测试人员使用与智能体相同的模拟器,并在受控条件下进行游戏。测试人员不得暂停、保存或重新加载游戏。在游戏过程中禁止输出音频,这是为了保证人类专业和智能体之间具有相同的感官输入。在真正开始评估之前,人类专业可以针对每个游戏进行2h的练习,然后进行20多次游戏,要求每次游戏最多持续5min,并对这些游戏的回报进行平均作为回报。
结果证明,在大部分的游戏中,DQN的表现远远超出了专业测试人员。
算法流程
智能体在和环境交互的过程中,观察模拟器当前的状态然后采取一系列动作,以获得回报。在每个步骤中,智能体从动作集合
中选择一个合法的动作
。这个动作被输入模拟器中,模拟器会改变内部的状态和分数。事实上,模拟器内部的状态智能体是观察不到的,智能体只能通过观察模拟器的输出图像来了解模拟器的状态,它是模拟器当前状态在屏幕上的像素值
。此外,智能体获得一个回报
,这个回报体现在屏幕的分数上。
因为智能体仅能观察到当前的屏幕像素
,从当前的屏幕状态
出发完全理解当前模拟器的状态
是不可能的,此问题属于不完美信息问题。因此,可以考虑将动作和屏幕的序列
当作
时间的状态,作为算法的输入,学习得到的最优策略。经试验,这种学习方式使得算法结果得到很大的提升。
智能体在与模拟器进行交互时,不断地学习模拟器反馈的回报并调整自己的行为,期望能够学习到一个行为,使未来回报最大。假定:未来的回报折扣因子为
,则
时刻的未来折扣回报:
,其中
是游戏结束时间。最优的行为值函数
为在状态
下采取行为
,遵循某个策略
获得的最大回报,即:
根据贝尔曼方程:
因为智能体进行游戏时,状态空间是连续的,故无法使用查表对上式的行为值函数进行求解,替代性地,通过使用神经网络来对行为值函数进行评估。本算法中分别使用了两个神经网络对两个行为值函数逼近。
DQN通过最小化以下内容进行优化:
当前行为值函数
的网络参数为
,每次得带都需要更新,以减少和目标值的均方误差。目标行为值函数
,也即 TD 目标,采用的网络参数为
,其值来自之前迭代的
值,相比于
的每步更新,
每隔指定的步数更新一次。
因为将任意长度的轨迹输入神经网络中进行训练效果并不理想,因此 DQN 算法使用
函数,将轨迹处理成固定的长度,对应的是输入网络的 4 帧图像和对应行为组成的输入特征。此算法从经历回放和设置单独的目标网络两个方面对 Q-learning 方法进行改善,使得大型神经网络更加稳定和容易收敛。
2.3,Double DQN 方法
传统的 Q-learning 和 DQN 方法都会普遍过高估计行为值函数
值,存在过优化的问题,这种过估计可能是因为环境噪声,值函数逼近过程中的最大化操作,网络不稳定或其他原因。
Q-learning 基于基函数的数值更新公式为:
DQN 更新公式为:
DDQN 更新公式为:
可以看到,不管是 Q-learning 还是 DQN,值函数的更新公式中都有最大化操作,通过一个最大化操作,选择一个行为以及对此行为进行评估。整体上使得估计的值函数比真实的值函数要大,并且误差会随着行为个数的增加而增加(误差传播)。如果这些过估计量是均匀的,那么由于我们的目的是寻找最优策略(即寻找最大值函数对应的动作),则最大值函数是保持不变的。而实际中,过估计量经常是非均匀的,这时候值函数的过估计就会影响最优决策,导致最终选择了一个次优的动作。
为了解决值函数过估计的问题,Hasselt 提出了 Double DQN 方法,将行为选择和行为评估采用不同的值函数实现(离线)。事实证明,尽管没有完全解决掉过估计问题,但在一定程度上降低了过估计的误差。
以 DQN 为例:行为选择指的是,在求 TD 目标时,首先要选取一个动作
,满足:
行为评估指的是利用
的行为值函数构建 TD 目标:
可见,在传统的 DQN 中,选择行为和评估行为用的是同一个网络参数
,以及同一个值函数:
。
DQN中的两个网络一个用来计算TD目标(可以理解为未来奖励值,主网络),另一个来用来逼近(减小和真实值函数的误差)。原本样本选择和策略更新都是使用TD目标网络参数
,现在利用逼近网络参数
进行动作选择,用TD网络参数进行更新策略。
Double DQN(DDQN)分别采用了不同的值函数来实现动作的选择和评估。传统的 DQN 架构自身就提供了两个网络:主网络和目标网络。因此可以直接使用主网络选择动作,再用目标网络进行动作评估,不必引入额外的网络。
首先使用主网络选择动作,网络参数为
:
然后使用目标网络找到这个动作对应的 Q 值,以构成 TD 目标,网络参数为
。
即
这个 Q 值在目标网络中不一定最大的,因此可以避免选到被高估的次优行为。除此之外,其他设置与 DQN 一致。实验表明,DDQN能够更精确地评估出 Q 值,在一些 Atari 2600 游戏中可获得更稳定有效的策略。
2.4,Dueling DQN 方法
价值和优势
在许多基于视觉感知的深度强化学习任务中,不同的状态行为对的值函数
是不同的,但是在某些状态下,值函数的大小与动作无关。因此,Baird 于 1993 年提出将 Q 值分解为价值(Value)和优势(Advantage)。
可理解为在该状态
下所有可能动作所对应的动作价值函数乘以该动作的概率之和。通俗的说,值函数
是该状态下所有动作值函数关于动作概率的期望。而动作值函数
是单个动作所对应的值函数,
表示当前动作值函数相对于平均值的大小。所以,优势表示的是动作值函数相比于当前状态值函数的优势。如果优势函数大于0,则说明当前动作比平均动作好,如果优势函数小于 0,则说明当前动作不如平均动作好。优势函数表明的是在这个状态下各个动作的相对好坏程度。
将
值分解为价值函数和优势函数的想法可以用驾驶汽车来说明。没有车子靠近时,选择什么动作并不会影响行车状态。这时候智能体更关注状态的价值,即行车路径和得分,而对动作优势不是很关心,因为无论向左行驶还是向右行驶,得到的回报基本一样。下面两张图表示,旁边有车靠近时,选择动作至关重要。这个时候智能体就需要关心动作优势了。黄色区域代表
和
所关注的地方。
关注于地平线上是否有车辆出现(此时动作的选择影响不大);
则更关心会立即造成碰撞的车辆,此时动作的选择很重要。
值分解为价值和优势更能刻画强化学习的过程。
Dueling DQN 会比 DQN 好的部分原因在于Dueling DQN 能更高效学习状态价值函数。每一次更新时,函数
都会被更新,这也会影响到其他动作的
值。而传统的 DQN 只会更新某个动作的
值,其他动作的
值就不会更新。因此,Dueling DQN 能够更加频繁、准确地学习状态价值函数。
Dueling DQN:竞争网络最早由 Ziyu Wang 提出,它的思路是把
网络(求取
值的神经网络)的结构显示地约束成两部分之和:跟动作无关的状态值函数
与在状态
下各个动作的优势函数
之和。
如果将深度强化学习算法 DQN 用于竞争网络,就有了 Dueling DQN。它与传统DQN唯一的区别就是网络结构。传统DQN网络模型,输入层接三个卷积层后,接两个全连接层,输出为每个动作的
值。而竞争 DQN 将卷积层提取的抽象特征分流到两个支路中(将原本的一个全连接层,变为两个全连接层)。其中上路代表状态值函数
,表示静态的状态环境本身具有的价值;下路代表依赖状态的动作优势函数
,表示选择某个行为额外带来的价值。最后这两路再聚合在一起得到每个动作的
值。
两个支路分别输出
。其中,
分别是两个全连接层参数。聚合函数负责将两个控制流合并成
函数:
但是上面一个等式包含了两个未知量,这是一个无法识别问题:给定一个
无法得到唯一的
和
(有无穷多种组合)。
在实际中,如果直接使用上述公式进行训练,效果很差,对我们的预测和评估很不利。为了解决这个问题,可以对
函数做限定:强制令所有选择贪婪动作的优势函数为
。
这样,就能得到固定的值函数:
因为对同一个状态而言,值函数是确定的,与行为无关,不随着行为的变化而变化,所以经过上述公式约束之后,得到一部分
和
可以很好地估计值函数和优势函数。
在实际中,一般使用优势函数的平均值代替上述的最优值。大量实验表明,两公式实验结果非常接近,但是很明显平均值公式比最大值公式更加简洁。
虽然平均值公式最终改变了优势函数的值,但是它可以保证该状态下在各优势函数相对排序不变的情况下,缩小
值的范围,去除多余的自由度,提高算法的稳定性。
同时需要注意的是平均值公式是网络的一部分,不是一个单独的算法步骤。与标准的 DQN 算法一样,Dueling DQN 也是端到端的训练网络,不用单独训练值函数
和优势函数
。通过反向传播方法,
, 被自动计算出来,无须任何额外的算法修改。由于 Dueling DQN 与标准 DQN 具有相同的输入和输出,因此可以使用任何 DQN 的方法来训练训练 Dueling DQN。
相对于传统的网络结构来说,Dueling DQN 将
值分解为值函数
和优势函数
这种形式,使得训练更容易,收敛速度更快。当动作的数量增加时,其优势就越明显。状态值函数
的部分只依赖于状态,和行为无关,训练起来更容易;且同一状态下,多个行为可共享一个值函数
。不同行为之间的差别只体现在优势函数
部分。这部分的收敛也可以与值函数
独立开来,使得行为之间的相对差别可以独立学习。并且优势函数的引入,避免了因为
值的量级大,而
值之间差异非常小,而引进的结果不稳定问题。
3,针对连续动作的DQN
3.1,概述
跟基于策略梯度的方法比起来,DQN 是比较稳的。策略梯度比较不稳,玩大部分游戏不能使用策略梯度。最早 DeepMind 的论文拿深度强化学习来玩雅达利的游戏,用的就是 DQN。DQN 比较容易训练的一个理由是:在 DQN 里面,你只要能够估计出Q函数,就保证你一定可以找到一个比较好的策略。也就是你只要能够估计出Q函数,就保证你可以改进策略。而估计Q函数这件事情,是比较容易的,因为它就是一个回归问题。在回归问题里面, 你可以轻易地知道模型学习得是不是越来越好,只要看那个回归的损失有没有下降,你就知道说模型学习得好不好,所以估计Q函数相较于学习一个策略是比较容易的。你只要估计Q函数,就可以保证说现在一定会得到比较好的策略。所以一般而言 DQN 比较容易操作。
DQN 其实存在一些问题,最大的问题是它不太容易处理连续动作。很多时候动作是连续的,比如我们玩雅达利的游戏,智能体只需要决定比如说上下左右,这种动作是离散的。那很多时候动作是连续的。举例来说假设智能体要做的事情是开自驾车,它要决定说它方向盘要左转几度, 右转几度,这是连续的。假设智能体是一个机器人,它身上有 50 个 关节,它的每一个动作就对应到它身上的这 50 个关节的角度。而那些角度也是连续的。所以很多时候动作并不是一个离散的东西,它是一个向量。在这个向量里面,它的每一个维度都有一个对应的值,都是实数,它是连续的。假设动作是连续的,做 DQN 就会有困难。因为在做 DQN 里面一个很重要的一步是你要能够解这个优化问题。估计出 Q函数
以后,必须要找到一个
,它可以让
最大,如下式所示:
假设
是离散的,即
的可能性都是有限的。举例来说,雅达利的小游戏里面,
就是上下左右跟开火,它是有限的,我们可以把每一个可能的动作都带到
里面算它的
值。但假如
是连续的,你无法穷举所有可能的连续动作,试试看哪一个连续动作可以让
的值最大。
3.2,对动作进行采样
采样出
个可能的
:
,一个一个带到 Q 函数里面,看谁最大。这个方法其实也不会太不高效, 因为你在运算的时候会使用 GPU,一次会把
个连续动作都丢到
函数里面,一次得到
个
值,然后看谁最大。当然这不是一个非常精确的做法,因为你没有办法做太多的采样, 所以你估计出来的
值,最后决定的动作可能不是非常的精确。
3.3,梯度上升
强化学习:随机策略梯度,AC家族,确定策略梯度_燕双嘤的博客-CSDN博客1,随机策略梯度1.1,简介前面那些值函数的方法,当值函数最优时,可以获得最优策略。最优策略是状态下,最大行为值函数对应的动作。当动作空间很大的时候,或者是动作为连续集的时候,基于值函数的方法便无法有效求解了。因为基于值函数的方法在策略改进时,需要针对每个状态行为对求取行为值函数,以便求解。这种情况下,把每一个状态行为对严格独立出来,求取某个状态下应该执行的行为是不切实际的。因此,可直接将策略参数化,利用线性函数或非线性函数表示策略,即,以寻找最优的参数,使得累计回报的期望最大...
https://blog.csdn.net/qq_42192693/article/details/123815880?spm=1001.2014.3001.5501既然要解的是一个优化问题(optimization problem),其实是要最大化目标函数(objective function),要最大化一个东西, 就可以用梯度上升。就把
当作是参数,然后要找一组
去最大化
函数,就用梯度上升去更新
的值,最后看看能不能找到一个
去最大化
函数,也就是目标函数。
当然这样子你会遇到全局最大值(global maximum)的问题, 就不见得能够真的找到最优的结果,而且这个运算量显然很大, 因为你要迭代地更新
。我们训练一个网络就很花时间了。如果你用梯度上升的方法来处理连续的问题, 等于是你每次要决定采取哪一个动作的时候,都还要做一次训练网络的过程,显然运算量是很大的。
3.4,设计网络
设计一个网络的架构,特别设计
函数,使得解
的问题变得非常容易。也就是这边的
函数不是一个一般的
函数,特别设计一下它的样子,让你要找让这个
函数最大的
的时候非常容易。
通常输入状态
是图像,可以用向量或矩阵来表示它。输入
,
函数会输出向量
、矩阵
和标量
。
函数根据输入
与
来决定输出值。到目前为止,
函数只有输入
,它还没有输入
,用
与
、
、
相互作用。
函数
可定义为:
注意一下
现在是连续的动作,所以它也是一个向量。假设你现在是要操作机器人的话,这个向量的每一个维度,可能就对应到机器人的某一个关节,它的数值就是关节的角度,所以
是一个向量。假设
和
是列向量,那么
是一个行向量。
是一个正定矩阵,因为
,其中
为下三角矩阵。
也是一个列向量。所以
值即
是标量。
假设
定义成这个样子,我们要怎么找到一个
去最大化这个
值呢?这个方案非常简单。因为
一定是正的,它前面乘上一个负号,所以第一项第一项的值越小,最终的
值就越大。因为我们是把
减掉第一项,所以第一项的值越小,最后的
值就越大。怎么让第一项的值最小呢?你直接把
代入
的值,让它变成 0,就会让第一项的值最小。
只要设
,就得到最大值。你在解这个
的问题的时候就变得非常容易。所以 DQN 也可以用在连续的情况,只是有一些局限,就是函数不能够随便乱设,它必须有一些限制。
3.5,不使用DQN
用 DQN 处理连续动作还是比较麻烦。 基于策略的方法 PPO 和基于价值的方法 DQN,这两者其实是可以结合在一起的,如下图所示,也就是演员-评论员的方法。