Q学习和深度Q学习(DQN)论文笔记

最近想做个汇总,所以这里简单写一下。

Q学习(Q-learning)

强化学习中有个很重要的递归关系,贝尔曼方程(Bellman Equation):
Q π ( s t , a t ) = E [ r + γ E [ Q π ( s t + 1 , a t + 1 ) ] ] Q^\pi(s_t,a_t)=E[r+\gamma E[Q^\pi(s_{t+1},a_{t+1})]] Qπ(st,at)=E[r+γE[Qπ(st+1,at+1)]]
这个公式实际上也揭露了状态的马尔科夫性质,也就是下一个状态只与当前状态有关。强化学习中大多数方法都是基于这个公式,Q学习也一样。Q学习的更新公式如下:
Q ( s , a ) = Q ( s , a ) + α [ r + γ m a x a ′ Q ( s , a ) − Q ( s , a ) ] Q(s,a)=Q(s,a)+\alpha[r+\gamma max_{a'}Q(s,a)-Q(s,a)] Q(s,a)=Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]
可以看见不同于贝尔曼方程中使用下一个状态的期望来估计当前Q值,Q学习中使用的是下一个状态的最大Q值来估计当前状态Q值。这是由于强化学习的agent目标是最大化累积奖赏,也就是Q值。但是这会带来的问题是 高估 。这篇文章是没有涉及解决这个问题的,Sutton的书中提到的解决方法是Double Q-learning,结合深度学习就是DDQN,我们组老师也在17年IJCAI发了一篇解决这个问题的文章Weighted Double Q-learning。下面是Q-learning和Double Q-learning的算法:
在这里插入图片描述
在double Q-learning中会定义两个Q函数,选择动作时是在两者之和的基础上进行 ϵ − g r e e d y \epsilon-greedy ϵgreedy选择,在更新时这两个函数是交互使用的,若一个Q1更新则Q2则作为max评估,这样在一定程度上可以解决 高估 问题。(简单理解就是因为Q2下的max并不是Q1下的max)
在这里插入图片描述

深度Q学习(DQN)

DQN中使用神经网络来作为Q值的逼近函数。权重和偏置用 θ \theta θ 表示。损失函数表示为: L ( s , a ∣ θ i ) ≈ ( r + γ m a x a ′ Q ( s ′ , a ∣ θ i ) − Q ( s , a ∣ θ i ) ) 2 L(s,a|\theta_i)\approx (r+\gamma max_{a'}Q(s',a|\theta_i)-Q(s,a|\theta_i))^2 L(s,aθi)(r+γmaxaQ(s,aθi)Q(s,aθi))2
梯度更新公式:
θ i + 1 = θ i + α   ▽ θ L ( θ i ) \theta_{i+1}=\theta_i+\alpha\ \bigtriangledown_\theta L(\theta_i) θi+1=θi+α θL(θi)
但是若使用相同的网络来生成下一个目标Q值和估计当前Q值,会导致振荡性甚至发散。还有就是,深度学习要求样本之间相互独立且同分布,但强化学习样本并不满足这个条件。因此DQN中使用三个技巧来来解决这一系列问题:经验回放,目标网络和自适应性学习率调整方法。(事实上当使用函数逼近时(比如神经网络作为逼近函数),强化学习会表现的不稳定甚至发散,主要原因是:序列观察值之间具有关性,对于Q网络的微小更新会导致策略明显的变化,以及action value Q(s,a)和target action value r + γ m a x Q ( s ′ , a ′ ) r+\gamma max Q(s',a') r+γmaxQ(s,a)之间的关联性。这三点都是一定会存在的问题,不可比避免的。DQN中使用的经验回放主要是一定程度上打破序列之间的相关性,而目标网络是解决Q值和目标Q值之间的相关性的(原文Human-level control through deep reinforcement
learning第四段)。但是对于第二个原因,并由和好的解决,所以可以朝着这个方向拓展。)
经验回放,是指在Agent与环境交互过程中,经验会以 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)的形式存放在经验池D中,每次训练会从D中随机抽样出一批数据来进行训练,这样就可以在一定程度上消除样本之间的相关性。目标网络是指,DQN中使用两个网络,一个网络是当前网络,与环境交互,并不断更新。另一个网络是目标网络,它并不与环境交互,也不在每个时间步进行更新,而是每隔一定时间步才会更新,每次更新都是把当前网络参数直接赋值给它。
具体的操作是每此训练时,比如第 i i i次迭代,一个小批量经验(minibatch)经验 e t = ( s t , a t , r t , s t + 1 ) e_t=(s_t,a_t,r_t,s_{t+1}) et=(st,at,rt,st+1)会从经验池中随机抽样出来。损失函数定义为: L i ( θ i ) = E ( s , a , r , s ′ ) ∼ D [ ( y i − Q ( s , a ∣ θ i ) ) 2 ] L_i(\theta_i)=E_{(s,a,r,s')\sim D}[(y_i-Q(s,a|\theta_i))^2] Li(θi)=E(s,a,r,s)D[(yiQ(s,aθi))2]其中 y i = r + γ m a x a ′ Q − ( s ′ , a ′ ∣ θ − ) y_i=r+\gamma max_{a'}Q^-(s',a'|\theta^-) yi=r+γmaxaQ(s,aθ)这里 Q − Q^- Q就是目标网络。每过一定时间步就会将 θ \theta θ赋值给 θ − \theta^- θ。伪代码如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值