笔记都是我自己之前写在word里的,但是图片不能直接批量复制到着csdn,我也懒得一张张传了,因为有些图我做了批注的,没法直接传.这里可以直接下载
DQN=Deep network+Q-learining
Deep network:深度神经网络(见西瓜书第五章总结)
Q-learning:强化学习的一种算法,本质是离轨策略的时序差分控制(TD)
Q-table表示的均是离散的状态以及动作。当状态空间包含连续变量时,处理无穷多的状态显然极为复杂 两种解决方法: 第一种:按区间进行划分来离散化 但是要考虑状态是多维的情况,此时就算离散化,也会导致维度爆炸 第二种:设定一个参数w,利用这个参数表示任意状态或状态-动作的价值 用V(s,w)近似V(s) 用Q(s,a,w)近似Q(s,a) 得到的这个新函数接收连续的状态作为输入,目标就是找到一个合适的函数 |
在Q-learning中,我们探讨的是有限个动作以及状态。因此可以列一个Q-table,不断更新每一个状态-动作二元组的价值,直至其收敛
Q-table相当于一个备忘录,用于存储已知的状态-动作对的价值。当遇到某种状态时,可以直接查表以获取该状态下各动作的价值 |
DQN的输入是状态s对应的向量ϕ(s)和动作 输出是该状态下所有动作价值函数Q(s, a) |
已知神经网络能拟合任何复杂度的函数,因此可以通过训练神经网络模型来得到近似正确的拟合函数 深度神经网络使用误差逆传播算法来更新各个神经元之间的连接权重与阈值 为避免陷入局部最优,采取随机梯度下降策略(SGD) 还有多启动点策略等等 SGD定义可查看西瓜书p107 (有概率跳出局部最优解) |
神经网络是一种工具,用于拟合近似正确的函数,并能够处理连续变量的状态输入。但DQN的核心思想仍然是通过贝尔曼最优动作价值方程来估计动作的价值
定义状态空间,S1~S5 定义动作空间,a1~a5 分别对应去到S1~S5 可以列出5×5的Q-table |
由下式
可得
这样就得到了Q-table的一个值,依此类推 |
在Q-learning中,我们使用Q-table来存储已知信息。但是Q-table的方式不便于存储和查找,尤其是处理连续性输入时。为了解决这个问题,我们希望找到一个函数来描述输入与输出之间的关系。这个函数我们使用神经网络来拟合。为了训练神经网络,我们需要带标记的数据集,因此引入了经验回放。在神经网络拟合的过程中,输入是状态s的特征向量和动作,输出是Q(s, a)的动作价值
经验回放(Experience Replay):经验回放是一种存储和利用经验的方法,通过存储过去的经验,并在训练时随机抽取这些经验,可以打破数据相关性,提升训练的效率
已知神经网络模型的训练方式是监督学习,即通过有正确标记的数据集训练,经验回放缓冲区存储的就是这些训练数据
训练数据为神经网络提供一个示范。当拟合的函数在新样本数据上能近似正确表达从输入到输出之间的映射关系时,模型就训练好了(模型性能的评判标准主要是泛化误差)
缓冲区的数据取出优先级跟TD error有关 |
我们知道,提升模型泛化性能的方法有很多种
1:不断重复划分训练集与测试集
2:在经验缓冲区随机抽取训练数据,而不是只选择在时刻上相邻的数据
简单来说,选取的训练数据越分散越好。如果过于集中,模型只会学到这一小部分的特征。因此,需要迫使模型找到更一般的特征,从而提升泛化性能
我们提到过,神经网络模型的训练过程是通过不断调整神经元之间的连接权重与阈值来拟合近似正确的函数,这个过程用到的算法称为误差逆传播算法
接下来讲解西瓜书第五章内容:误差逆传播算法和梯度下降策略,这两点是理解神经网络如何训练的基础
由于DQN在选择动作和评估动作时都是贪心的,这可能会导致动作价值的过高估计。下面介绍这个问题 |
回看Q-learning更新所用到的贝尔曼最优动作价值方程,Q值的更新依赖于在下一状态能得到最大回报的动作,这可能会导致Q值的乐观估计
目标Q值 |
预测Q值 |
简单解释:
根据Q值更新公式,预测Q值最后会收敛于目标Q值,且智能体会选择看起来在下一时刻动作价值最高的动作。但要注意,在一开始这些动作价值未收敛时,这些价值事实上可能是被高估或低估的。我们在这些被高估或低估的各个动作价值中选取一个最大的,这个动作价值很可能高于其真实值
由于预测Q值依赖于这些被高估的Q值,自然会得到一个过高估计的乐观值
下面介绍两种改进的DQN:Double DQN和Dueling DQN,分别从算法和结构层面进行改进
-------------------------------------------------------------------------------
Double DQN:传统DQN的训练方式很直接,就是每次在经验缓冲区中选取一个batch的数据进行训练,不断训练直到目标网络的泛化误差降低到可以接受的范围内
Double DQN设置两个神经网络,一个称为训练网络,一个称为目标网络,每隔一段时间将训练网络的参数(权重和阈值)拷贝给目标网络
Double-DQN通过设置两个神经网络,一个做动作选择,一个作价值评估,避免乐观估计的问题 |
选择动作:使用训练网络选择动作
评估动作:使用目标网络评估动作
DQN会造成乐观估计的问题,是因为动作修正和价值评估都使用同一个网络 DDQN将这两项分开,能缓解乐观估计的问题 并不是因为Target network比train network更精确,而是因为DDQN能以一种更客观的标准去评估动作价值 |
为什么Double DQN能避免过高估计的问题?直观理解如下
举个例子,首先我们已经知道动作选择时选出的动作是有偏的(因为初始状态动作价值未收敛,加上Q-learning使用的更新公式是贪心的),有偏指的是被选择的动作名义上虽然是所有动作中价值最高的,但是肯定是被高估了的 那么根据Q-learning的更新公式,选择这个被高估的动作进行预测Q值的更新,这当然会造成预测Q值的乐观估计 但是如果利用另一个网络进行价值评估,能有效地“缓解”这种过于乐观的情况。这是因为,价值评估交给了另一个新的网络去做了,在这个新的网络中,根据旧网络由贪心原则选出来的动作价值可能不是最大的,但新网络仍要选择这个旧网络的贪心动作进行价值评估,(由上面公式可看到也表达的是这个意思),那么更新Q值的时候就能缓解乐观估计 一句话:Q值更新使用的不再是贪心动作,可能是次贪心。这是为了避免乐观估计,问题的本质其实跟动作价值分布有关 |
简而言之,利用两个网络分别完成任务,能够避免乐观估计问题 |
DQN动作选择和价值评估用的都是Target network |
DDQN动作选择用的是train network,价值评估用的是Target network |
Dueling DQN:Dueling DQN的结构包含两个部分,一个是状态价值函数V(s),一个是优势函数A(s, a)
由定义可得A的代数和必定为0 |
Q:什么是优势函数A?
A:对于一个特定的状态,采取一个动作所能得到的价值与这个状态能得到的平均动作价值的差值。如果采取的动作所得到的价值比平均状态价值大,那么优势函数为正,反之为负
V和A是从Q值中提取的,在Dueling DQN中,只需根据经验缓冲区中的数据训练V和A网络。有了经过训练的V和A网络,就能计算Q值 |
Q1=状态价值V1+动作优势A1 V1是状态S1下所有动作价值Q1~Qn的期望 A1是动作1的价值Q1与所有动作Q1~Qn求和后取平均的差值 |
上面是传统DQN,下面是Dueling DQN。在传统DQN中,神经网络输出的是每种动作的 Q值 而 Dueling DQN 的Q值是由状态价值V和优势函数A确定的 即Q = A+ V |
由上可得Dueling DQN的Q值计算公式:
但是这么计算Q值会带来一个问题:比如Q1=V1+A1,这显然没错。但是Q1=V2+A3可能也成立,这样的话就无法确定V和A是否属于同一状态-动作二元组
所以对上面的式子做一个改进:
这个改进的式子的意义很巧妙 如果V和A是同一二元组,那么根据定义,被减去的这个式子应该等于0 如果V和A不是同一二元组,那么减去这个式子就能消去误差 |
Q:Dueling DQN的优势体现在什么地方,效率为什么会更高?
1:将Q值分为状态价值V和动作优势值A, 这样的分解方式使得模型能够在不依赖具体动作的情况下,评估状态的价值。从而减少了动作选择对状态价值评估的干扰
2:在某些状态下不同的动作可能有相似的价值,传统的DQN难以区分这些细微差异,而Dueling DQN通过单独评估动作优势,可以更准确地评估动作的优劣
参考资料:通过 Q-learning 深入理解强化学习 | 机器之心 (jiqizhixin.com)
强化学习(十)Double DQN (DDQN) - 刘建平Pinard - 博客园 (cnblogs.com)