顺序以周博磊老师强化学习纲要课程为主,增加王树森老师强化学习基础的知识补充,和蘑菇书的知识补充,作为学习记录
第四章:价值函数近似
主要内容包括:
- 价值函数近似基本原理介绍(Value Function Approximation, VFA)
- 线性价值函数近似(在预测和控制方面的应用)
- 非线性价值函数近似(主要是DQN的介绍)
一、价值函数近似基本原理的介绍:
- 引入原因:
- 之前是问题更多是少量状态的RL问题,所以可以用Qtable,即用表格形式存储每个状态s下动作a取得的奖励(这里的少量如悬崖行走问题的4*16,mountain car问题的1600等)
- 实际强化问题大多是大规模状态的问题,包括本身状态量巨大,或是连续状态空间,状态量无穷(这里的大量如国际象棋10^47 围棋10^170次方,事实上所有可观测宇宙的原子个数也只有10^80)
- 在解决问题的过程中,我们所用到的奖励函数R(ModelFree没有)、策略函数π、状态价值函数V和动作价值函数Q都与状态有关。
- 当状态数量过大时,价值函数的计算就十分困难,出现维度灾难(即在涉及向量的计算问题中,随着维数增加,计算量会随指数倍增长,事情变得不可控)
- 导致结果:在前一章ModelFree中基于Q表格(Lookup Table)提出的的解决方法就不再适用,需要研究如何将ModelFree方法应用到这种大规模状态情况。
- 引出解决大规模马尔可夫过程问题的方法:函数近似
- 不再使用表格形式,而是通过函数近似的方法代替真实的价值函数(使用带参数的近似函数)
- 优势:从已知状态泛化到未知状态,避免学习、存储每一个状态信息,使用插值方法估计没有出现过的状态(不需要对所有状态得到观测)
- 参数w可以使用MC(蒙特卡洛采样)或TD learning方法实现近似估计
- 函数近似的多种方法:
- 线性特征(Linear feature representations)(设计特征再进行线性叠加)
- 神经网络(Neural networks)(有效的拟合函数)
- 决策树(Decision trees)
- 近邻取样(Nearest neighbors)
- 主要介绍前两类,因为前两类可微分,这种性质方便我们优化相关参数(使用梯度下降更新)
- 参数优化(以价值函数的优化为例)(本章最重要的内容就是对梯度增量中的近似函数进行优化)
- 由于某些原因需要极小化(极大化)目标函数(损失函数)J(w)
- 这里我们需要极小化的损失函数J(w)如下,这里使用了均方误差(自定义的):(在已知当前给定状态s时的真正价值Vπ的情况下,希望我们所拟合的函数能够在不断更新后逐渐接近真实值,也就是说状态时定值,通过对参数的优化来极小化函数)
- 可能存在的误区:已知的价值函数真实值(orcle)的状态是有限的,而我们希望通过优化自己估计的价值函数,从而得到更多的状态对应价值。
- 使用梯度下降的方式对参数进行优化
- 梯度在数学中
- 单变量函数,梯度就是函数的微分,代表切线斜率
- 多变量函数,梯度是一个向量,向量有方向,梯度的方向指出了函数在给定点的上升最快的方向(参数其实也是一个向量)(只知道方向不知道长度)
- 目标:通过迭代优化参数找到目标函数的最小值或收敛到最小值
- 方法:对于可微分的函数来说,由于梯度的方向是函数变化最快的方向,找到给定点的梯度,再通过我们所设定的步长,可以得到参数如何变化能让函数值下降最快。
- 结果:通过反复求梯度,就能到达局部最小值(对于只有一个最值的函数,局部最小值即全局最小值)
- 公式中:负号表示向梯度相反的方向前进,即梯度下降 ;α称为学习率或步长,控制每一步的距离,避免错过最低点;1/2是为了求偏导时消去2不影响结果
- 缺点:受学习率影响很大;对于有多个极值的函数来说,它永远不能保证全局最优性,只能保证局部最低
- 梯度在数学中
- 状态s的描述
- 输入状态,提取对应的特征向量作为状态进行后续运算
- 具体特征是人为设定的,基于要解决的问题设计自己需要的特征
- 车的位置、速度、加速度
- cart的位置、速度、木杆角度、旋转角速度
- 将特征作为状态的函数表示状态,输入给价值函数、策略函数等,得到对应值
二、线性模型拟合价值函数
- 策略评估的函数近似(策略评估就是预测当前状态的价值)
- 已知orcle
- 相关函数变形
- 近似价值函数:(特征的线性叠加,对特征向量和参数进行线性组合)
- 需要最小化的损失函数:
- 梯度更新增量:(这个形式只有线性模型才适用)
-
线性模型的优势:对于线性模型来说,随机梯度下降的结果会接近全局最优解,即我们得到的局部最优解几乎就是全局最优解(找到最佳拟合价值函数的模型)
- 特殊的特征定义:Table Lookup Feature
- one-hot vector:向量中只有一个位置的值是1,即当前状态对应位置元素,其他值都是0
- 此时的线性模型:
- 于是此时的拟合价值函数就是:(wk即参数)
- 相关函数变形
- model-free预测的近似(无oracle)
- 不知道真实价值V^π(s),只有来自环境的回报(重点区别在于梯度增量的计算)
- 回顾:(oracle 真实标签)
- model-free预测的目的是,给定一个策略,估计对于每个状态它的价值
- 方法:MC、TD来估计价值函数
- 维护一个个lookup table来存储V/Q的估计值
- 方法:将函数近似同时放入model-free 预测的循环中
- 优化价值函数
- 利用优化好的价值函数优化价值函数的近似(优化参数)
- 对比:
- 已知真实价值:
- MC方法代替真实价值
- TD target代替真实价值:
- 两种方法的对比:
- 对于MC方法:
- 回报Gt对于真实价值来说是无偏的(即均值等于真实值)
- 对于线性和非线性的价值函数近似都可以收敛
- 对于TD方法:
- TD target对于真实价值来说是有偏的(因为自身包含正在优化大参数,不够准确,不是真实的梯度)(又称为semi-gradient)
- 在线性的价值函数近似可以达到、接近整体最优解
- 对于MC方法:
- 已知orcle
- 控制部分的函数近似:
- 控制部分包括策略评估(预测)和策略优化,将动作价值函数进行函数近似,就可以适用于更大规模的状态情况
- 动作价值函数也可以以相同的方式进行函数近似
- 已知orcle
- 相关函数表示
- 动作价值函数近似:
- 损失函数:
- 梯度增量:
- 线性模型拟合:
- 状态的特征表示:
- 动作价值函数近似:
- 梯度增量:
- 相关函数表示
- 未知orcle
- MC方法:
- Sarsa TD target:
- Q-learning TD target:
- 具体算法:(Sarsa算法与semi-gradient Sarsa算法的对比)
- 强调无模型状态
- 通过更新参数的方法更新函数,强调大数据的拟合
- 关于收敛(关于两种TD方法Sarsa与Q-learning)
- 当存在价值函数估计时,由于梯度中存在需要优化的参数本身,梯度并不是很准确
- 更新过程中,有两个近似过程(Bellman backup与价值函数近似),会引入很多噪声
- 结果:使用off-policy或使用非线性函数近似时收敛过程很不稳定,价值函数估计不准确
- 控制算法的收敛性:
- 状态较少时都可以收敛(小规模MDP可以找到最优解)
- 线性特征拟合前两者可以找到近似最优解,Qlearning很难找到最优解
- 近似函数选择非线性函数(神经网络)都很难保证得到最优解
- 题外话1:强化学习的死亡三角(Deadly Triad)
- 最重要的三点不确实因素:
- 函数估计:利用函数近似价值函数,利用近似会引入误差
- Bootstarpping(自举):基于之前的估计值进一步估计 (主要发生在TD方法中)
- Off-policy 训练:两个policy导致采集数据与实际优化数据不同,也引入了不确定因素
- 题外话2:由单步优化变为块优化(Batch优化)
-
前述方法都是单步优化,实际效率很低
-
保存一个training batch,直接优化batch中的所有样本,实现函数拟合
-
具体方法:
-
前提:存在一个数据库保存了一系列样本(pair)
-
根据方法的不同(MC、TD)选择对应target(替换不同v),优化参数w,使其对每个pair都达到极小化(这个是一次优化)
-
可能数据过大无法全部计算,则对数据库进行随机采样,利用采样数据对w进行迭代优化(这个是一次抽一部分,迭代优化)
-
这种方式与直接优化数据集的效果是一样的
-
-
三、非线性函数拟合
- 对比:
- 线性模型:人为确定表示状态的特征向量,线性价值函数将其进行线性叠加,然后就用于估计v值,计算损失函数,得到梯度表达式,对于Model-free则使用MC或TD方法将真实价值进行替换
- 前述方法是线性模型,需要人为确定对应特征向量才能良好工作,但这件事情其实很困难
- 存在非线性函数拟合,可以将特征提取与价值函数学习结合,神经网络是常用的非线性函数拟合方法
- 神经网络介绍
- 神经网络是多层参数叠加函数,神经网络内部有许多网络层,将其一层一层叠加起来,最终得到想要的输出。
- 使用链式法则优化参数(后向传播)
- 后向传播介绍
- 解决神经网络在训练模型时的参数更新问题,对权重进行优化,使得神经网络能够学习到从任意输入到输出的准确映射
- 梯度的意义在于,它在一定程度上表示了这个参数对整体结果的一个影响情况
- 就像链式求导,对每个参数的求导都会变成多个求导的乘积
- 卷积神经网络:每一层都是由卷积层叠加起来的
- 强化学习与深度学习的结合:深度强化学习(Deep Reinforcement Learning)
- 主要特点:使用神经网络实现RL中函数的拟合(动作/状态价值函数,环境模型等)
- 一般使用SGD(随机梯度下降)实现参数优化
- 挑战:过多的模型参数需要优化;Deadly Triad(收敛问题,得到的解与最优解并不一致)
- DQN(Deep Q-Network)
- 出现时间:2015年DeepMind发表论文:Human-level control through deep reinforcement learning,提出了用神经网络拟合Q函数,在Atari游戏中取得了近似于人的表现能力,其实拟合的是最优动作价值函数Qstar
- 主要思想:
- 使用卷积神经网络拟合Q函数(由于DQN是Q-learning方法与深度学习结合的产物,所以神经网络拟合的其实是最佳动作价值函数即Qstar函数)
- 将游戏界面作为输入(连续4帧像素级别的图像)
- 输出是18个操作(所有动作的分数)
- 奖励是游戏的分数增减
- 内部是两层卷积网络和一层全连接将输入变为输出
- Qlearning中存在的问题:
- 样本之间相关性过高,导致学习比较困难(从像素级别来说,连续的每个画面之间的区别其实是很小的)
- 高估问题(最大化和自举)
- 解决方法和DQN的优化方法:
- 经验回放:experience replay(2个优势) 相关性和经验的重复利用避免 浪费
- target network(自举)、Double DQN(最大化)
- 经验回放:experience replay
- 重复利用经验避免浪费;打破序列顺序消除相关性
- 使用replay buffer(容器)存储不同游戏环境里的sample(在王树森老师的视频中将其称为transition,具体buffer中存放多少transition由具体应用决定)
- 存在特定网络为容器中填充内容
- 为了训练网络:每次从中随机采样,并用其计算TD target ,再用target进行随机梯度下降更新参数w
- 随机采样降低了相关度,更有利于学习(以及对经验的重复利用)
- 这也是随机梯度下降的主要思想,通过每次随机采样的数据对参数进行更新,当数据过大时,就可以在不采样使用完全部数据的情况下,得到一个误差范围内可接受的梯度值。
- 对经验回放的改进:Prioritized Experience Replay(优先经验回放)
- 主要思想:用非均匀抽样代替均匀抽样
- transition的重要性各不相同,比如超级玛丽中正常关卡和Boss关卡,后者更加稀缺也更加重要,transition需要被充分利用
- 可以使用TD error的绝对值表示重要性(即价值的真实值-价值函数近似值,因为训练的DQN由于不熟悉场景,预测的值就会偏离真实值(或估计的真实值)导致TD error的绝对值大)
- 给重要的transition更高的权重
- 非均匀抽样的两种方法:
- 抽样概率正比于TD error
- 抽样概率反比于rank(t)(是TD error的序号)
- 原理相同:TDerror越大,transition被抽样的概率越大
- 非均匀抽样可能导致预测有偏差
- 原因:概率由 TD error决定,不同的transition的重要性不同
- 解决:均匀抽样:所有的transition有相同的学习率;非均匀抽样:不同的transition应当设定不同的学习率
- 对于抽样概率较大的transition,它的学习率应当比较小
- β是个超参数,建议一开始值设定较小,最终逐渐接近1
- 流程:
- 对于刚获得的transition,不知道它的TD error,所以先将其TD error设为最大,获得最高优先级,以便下一次被选中
- 每一次从buffer中采样时,也要同时更新TD error,即每一次需要更新它的选中概率
- 高估问题的产生原因(使用TD算法,会导致DQN高估真实的动作价值)
- 高估并不是DQN自身的属性,而是由Qlearning算法造成的,因此解决高估就需要对Qlearning算法进行优化
- 原因一:计算TD target会存在最大化,它会导致高估
- 这里的最大化是指在计算Qlearning的TDtarget时使用的最大化函数
- 已知我们在估计动作价值函数时会存在误差,即使我们认为误差是无偏的,即加入均值为0的噪声,最大化函数仍然会使我们所计算得到的值是大于或等于实际值的(这里存在一个我不会证明的数学原理)
- 原因二:bootstropping:使用自己的估计去进一步估计自己
- 从上式可知,我们希望我们所估计的值会进一步靠近计算的yt(因为它一半基于真实值一半基于估计值)
- 因此,在逐次计算中高估现象会越来越严重
- 真正问题:高估问题的真正危害在于:非均匀的高估
- 使用动作价值函数对动作进行打分,这其实是一种相对的比较
- 因此,如果是绝对的高估,反而不会影响动作的最终选择
- 但由于采样时的选择,以及所有的transition在buffer中出现频率也是不同的,这导致高估是非均匀的
- 非均匀的高估会对动作选择产生影响
- 解决方法:
- 切断自举:使用target network
- 避免最大化造成高估:double DQN
- target network(Fixed target)
- 目的:为了使训练更加稳定(使用另一个神经网络计算TD target而不是正要学习的网络自己)
- 理解:
- 猫要追上老鼠
- 两个都是即时更新,会产生奇怪的优化轨迹,导致训练不稳定
- 修复方法:降低老鼠的移动频率,让猫有足够的时间接近target,使训练更有效
- 方法:计算TD target的网络的参数w^−的更新与实际参数w存在时间差,w^−的更新慢于w(对于右边的target使用专门的target network进行更新)(为了方便更新,它的神经网络结构与DQN完全相同,只有参数不同)
- 流程:
- 从replay buffer中取tuples
- 计算target:注意这里的w已经不是同一个w了
- 更新w
- Double DQN
- 目的:在target network的基础上做出进一步的改进,缓解最大化造成的高估
- 方法:将TD target的计算过程进行进一步的拆分:
- 对比:
- Qlearning中使用target network后:
- 使用Double DQN后:
- 原因:由于此时选择的最优动作,并不一定是在target network参数下的最优动作,因此可以缓解最大化造成的高估
- 题外话:Sarsa算法中自举的问题仍然存在,但根据公式可知Sarsa中并不存在最大化造成高估的问题,因此Sarsa中只需要target network即可
- 关于高估问题参考了博主UQI-LIUWJ的理解,感谢分享