这里贴上一篇好的知乎回答:https://zhuanlan.zhihu.com/p/25239682
接下来就是WYY博主的边学边整理的笔记了~
第一部分:DRL的基础知识
DRL(Deep Reinforcement Learning)分为model-based和model-free两种方法。Model of the environment:model是对真实世界(environment)的模拟,model建模的是agent采样action后环境的反应。RL中,使用model和planning的方法被称为model-based,反之不使用model而是通过try-and-error学习policy的方法被称为model-free。本文范畴即是model-free。其中model-free中有Value-based和Policy-base两种主要的方法,由于我接下来的工作需要用到Value-based中的DQN算法,所以我主要学习这种算法,关于其他的,大家可以看上面的知乎中的链接,写的很好。
深度强化学习的四元组是:状态、动作、奖励和策略,最不好理解的便是“策略(policy)”, Policy是指Agent是在状态s时,所要做出action的选择。policy可以视为在Agent感知到环境s后到动作a的一个mapping。如果策略是随机的,policy是根据每个动作概率选择动作;如果策略是确定性的,policy则是直接根据状态s选择出动作。(好啦,看了上面的话,不仅没有搞清楚什么是策略,反而把策略和动作搞混了,不要紧,再继续看一下下面的,或许会清晰一些)
奖励,是指智能体和环境交互之后,环境给智能体的反馈,即这个动作是好还是坏。智能体的目标并不是当前奖励最大,而是平均累计回报最大。
Value function(值函数)是策略在某状态下的长期期望收益。与之类似的一个函数是Q函数,在某状态下,采取某动作的长期期望收益。
继续看,强化学习最重要的基础是MDP(Markov Decision Process)马尔可夫决策过程。马儿最明显的一个特征是,在某状态下,采取某动作之后的奖励,只跟当前的状态和动作有关,与历史状态无关(如果跟历史状态有关,就把这个状态封装到当前状态就好了)。❤Bellman等式:
❤ MC、TD方法:
Monte-Carlo method适用于“情节式任务”(情节任务序列有终点,与“情节式任务”相对应的是“连续型任务”)。Q(s,a)就是整个序列的期望回报。MC增量更新中的Monte-Carlo error:
TD(Time Difference) method,是Monte-Carlo和Dynamic Programming 方法的一个结合。相比MC方法,TD除了能够适用于连续任务外,和MC的差异从下图可以清楚看到。MC需要回退整个序列更新Q值,而TD只需要回退1步或n步更新Q值。因为MC需要等待序列结束才能训练,而TD没有这个限制,因此TD收敛速度明显比MC快,目前的主要算法都是基于TD。下图是TD和MC的回退图,很显然MC回退的更深。
知乎文章作者举的这个例子特别好:
直观理解MC error和TD error的差异,假设RL的任务要预估的是上班的"到公司时长",状态是目前的位置,比如“刚出门”“到地铁了”“到国贸站了”...。MC方法需要等到真正开到公司才能校验“刚出门”状态时预估的正确性,得到MC error;而TD则可以利用“刚出门”和“到地铁了”两个状态预测的差异的1-step TD error来迭代。
1-step TD error:
n-steps TD error:
error:
事实上,MC error可以视为一个情节任务的max-step TD error。另外,一般来说,在TD error中,n越大,用到的真实回报信息更多,收敛也会越快。
第二部分.DRL:from Q-learning to DQN
Q-learning是一种TD方法,也是一种Value-based的方法。所谓Value-based方法,就是先评估每个action的Q值(Value),再根据Q值求最优策略的方法。强化学习的最终目标是求解policy,因此Value-based的方法是一种“曲线救国”。Q-learning算法的核心就是我们前面Bellman optimality equation,即:
Q-learning是RL的很经典的算法,但有个很大的问题在于它是一种表格方法,也就是说它根据过去出现过的状态,统计和迭代Q值。一方面Q-learning适用的状态和动作空间非常小;另一方面但如果一个状态从未出现过,Q-learning是无法处理的。也就是说Q-learning压根没有预测能力,也就是没有泛化能力。
为了能使得Q-learning能够带有预测能力,熟悉机器学习的同学很容易想到这就是一个回归问题啊!用函数拟合Q:
模型有很多种选择,线性的或非线性的。传统的非深度学习的函数拟合更多是人工特征+线性模型拟合。这几年伴随着深度学习最近几年在监督学习领域的巨大成功,用深度神经网络端到端的拟合Q值,也就是DQN,似乎是个必然了。
deepmind 在2013年的 Playing Atari with Deep Reinforcement Learning 提出的DQN算是DRL的一个重要起点了,也是理解DRL不可错过的经典模型了。网络结构设计方面,DQN之前有些网络是左图的方式,输入为S,A,输出Q值;DQN采用的右图的结构,即输入S,输出是离线的各个动作上的Q值。之所以这样,左图方案相对右图最大的缺点是对于每个state,需要计算次前向计算,而右图则只需要一次前向计算即可,因此左图的前向计算成本与action的数量成正比。
先写这么多,回来再继续写。不能赶,要保证理解和质量。
因为DQN本身是个回归问题,模型的优化目标是最小化1-step TD error的平方loss,梯度的计算也很直接了,见下图。
DQN最终能够取得成功的一方面是采用了DNN网络进行Q值的函数拟合,end-to-end的模型训练。更重要的是引入了以下两个点:
(1)Experience Replay: Deep Learning取得重大进展的监督学习中,样本间都是独立同分布的。而RL中的样本是有关联的,非静态的(highly correlated and non-stationary),训练的结果很容易难以收敛。Experience Replay机制解决这个问题思路其实很简单,构建一个存储把样本都存储下来,通过随机采样去除相关性。(当然没有天下免费的午餐,这种方法也有弊端,比如off-policy受到了限制,也不是真正的online-learning,具体在A3C部分会展开分析)
(2)separate Target Network:原始的Q-learning中,在1-step TD return,样本标签y使用的是和训练的Q-network相同的网络。这样通常情况下,能够使得Q大的样本,y也会大,这样模型震荡和发散可能性变大。而构建一个独立的慢于当前Q-Network的target Q-Network来计算y,使得训练震荡发散可能性降低,更加稳定。
另外,TD-error也被clip到[-1,1]区间,增加模型的稳定性。部分思路和我们后续分享的的TRPO算法的置信区间相关。
我们前面提到的两种方法都以依赖于 Q-Table,但是其中存在的一个问题就是当 Q-Table 中的状态比较多,可能会导致整个 Q-Table 无法装下内存。因此,DQN 被提了出来,DQN 全称是 Deep Q Network,Deep 指的是通的是深度学习,其实就是通过神经网络来拟合整张 Q-Table。
DQN 能够解决状态无限,动作有限的问题;具体来说就是将当前状态作为输入,输出的是各个动作的 Q 值。以 Flappy Bird 这个游戏为例,输入的状态近乎是无限的(当前 bird 的位置和周围的水管的分布位置等),但是输出的动作只有两个(飞或者不飞)。实际上,已经有人通过 DQN 来玩这个游戏了,具体可参考这个DeepLearningFlappyBird
所以在 DQN 中的核心问题在于如何训练整个神经网络,其实训练算法跟 Q-Learning 的训练算法非常相似,需要利用 Q 估计和 Q 现实的差值,然后进行反向传播。
这里放上提出 DQN 的原始论文Playing atari with deep reinforcement learning中的算法流程图
原博客链接:https://www.cnblogs.com/shixiangwan/p/11351782.html
详细的DQN算法:
补充一个我自己画的图:
发现了一个写的很好的:
上面的算法跟 Q-Learning 最大的不同就是多了Experience Replay这个部分,实际上这个机制做的事情就是先进行反复的实验,并将这些实验步骤获取的 sample 存储在 memory 中,每一步就是一个 sample,每个sample是一个四元组,包括:当前的状态,当前状态的各种action的 Q 值,当前采取的action获得的即时回报,下一个状态的各种action的Q值。拿到这样一个 sample 后,就可以根据上面提到的 Q-Learning 更新算法来更新网络,只是这时候需要进行的是反向传播。
Experience Replay 机制的出发点是按照时间顺序所构造的样本之间是有关的(如上面的ϕ(st+1)会受到ϕ(st)的影响)、非静态的(highly correlated and non-stationary),这样会很容易导致训练的结果难以收敛。通过 Experience Replay 机制对存储下来的样本进行随机采样,在一定程度上能够去除这种相关性,进而更容易收敛。当然,这种方法也有弊端,就是训练的时候是 offline 的形式,无法做到 online 的形式。
除此之外,上面算法流程图中的 aciton-value function 就是一个深度神经网络,因为神经网络是被证明有万有逼近的能力的,也就是能够拟合任意一个函数;一个 episode 相当于 一个 epoch;同时也采用了ϵ−greedyϵ−greedy策略。
后续关于DQN有三个主要改进点:
(1)Double Q-Network:思路并不新鲜,仿照Double Q-learning,一个Q网络用于选择动作,另一个Q网络用于评估动作,交替工作,解决upward-bias问题,效果不错。三个臭皮匠顶个诸葛亮么,就像工作中如果有double-check,犯错的概率就能平方级别下降。Silver15年论文Deep Reinforcement Learning with Double Q-learning
(2)Prioritized replay:基于优先级的replay机制,replay加速训练过程,变相增加样本,并且能独立于当前训练过程中状态的影响。这个replay权重还是和DQN error(下图)有关,Silver16年论文PRIORITIZED EXPERIENCE REPLAY。
(3)Dueling network:在网络内部把Q(s,a) 分解成 V(s) + A(s, a),V(s)与动作无关,A(s, a)与动作相关,是a相对s平均回报的相对好坏,是优势,解决reward-bias问题。RL中真正关心的还是策略的好坏,更关系的是优势,另外在某些情况下,任何策略都不影响回报,显然需要剔除。ICML 2016 Best Paper:DUELING NETWORK ARCHITECTURES FOR DEEP REINFORCEMENT LEARNING 。Dueling Network网络架构如下,Dueling Network把网络分成一个输出标量V(s)另一个输出动作上Advantage值两部分,最后合成Q值。非常巧妙的设计,当然还是end-to-end的,效果也是state-of-art。Advantage是一个比较有意思的问题,A3C中有一个A就是Advantage。
上面提到的 DQN 是最原始的的网络,后面Deepmind 对其进行了多种改进,比如说 Nature DQN 增加了一种新机制separate Target Network,就是计算上图的yjyj的时候不采用网络QQ, 而是采用另外一个网络(也就是 Target Network)Q'Q′, 原因是上面计算yjyj和 Q 估计都采用相同的网络QQ,这样使得QQ大的样本,yy也会大,这样模型震荡和发散可能性变大,其原因其实还是两者的关联性较大。而采用另外一个独立的网络使得训练震荡发散可能性降低,更加稳定。一般Q'Q′会直接采用旧的QQ, 比如说 10 个 epoch 前的QQ.
除此之外,大幅度提升 DQN 玩 Atari 性能的主要就是 Double DQN,Prioritised Replay 还有 Dueling Network 三大方法;这里不详细展开,有兴趣可参考这两篇文章:DQN从入门到放弃6 DQN的各种改进和深度强化学习(Deep Reinforcement Learning)入门:RL base & DQN-DDPG-A3C introduction。
第三部分、Policy-Based method:概率输出&连续动作空间
DQN虽然在Atari游戏问题中取得了巨大的成功,但适用范围还是在低维、离散动作空间。DQN是求每个action的,在连续空间就不适用了,原因如下:
(1) 如果采用把连续动作空间离散化,动作空间则会过大,极难收敛。而且每个动作空间划分成很多个离散动作无法做到fine-tuning,划分本身也带来了信息损失。
(2)即便是有些DQN的变种如VAE能够给出连续动作的方案,DQN的第二个问题是只能给出一个确定性的action,无法给出概率值。而有些场景,比如围棋的开局,只有一种走法显然太死板了,更多例子不再介绍了。
从另外一个角度看,DQN是Value-based方法,上一节讲到了Value-based的方法还是在间接求策略。一个自然的逻辑是为什么我们不直接求解Policy?这就是Policy Gradient方法了。
Deep Q-learning
2013年,DeepMind 在 NIPS workshop上提出了 Deep Q-learning,主要工作是能让 AI 从像素输入学会完 Atari游戏,后来进行了一些改进后上了 2015 年的 nature 封面。
如果状态空间是连续的,动态规划的状态数就是无限的,所以我们用深度学习网络去拟合这个 Q 函数,这就是 DQN。
通常 DQN 的实现中,会把收集的(状态、动作、执行动作后的状态和奖励)存在内存中,训练的时候多次使用,称为 memory replay。
注意到每个(状态,动作)的 Q 值要拟合 (当前得到的奖励加上(执行动作后的新状态,新动作)的 Q 值),一个函数拟合自己可能引入额外的噪声,所以通常使用一个延迟更新的函数 Q' 来求新的 Q 值,称为 target network。
DQN的控制空间,至少必须是离散的。
因为算法优化Q网络的时候用的Bellman Equation里面有一个求max的函数。
离散空间还能遍历一下找到max,连续空间这个过程非常耗时。
所以…离散空间DQN才适用。
连续空间请搜索DDQN,哈哈。
发现了更好的一个博客:https://blog.csdn.net/qq_16234613/article/details/80268564
写的可真是太好了!