大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
最近想做个汇总,所以这里简单写一下。
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+γmaxa′Q(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+γmaxa′Q(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[(yi−Q(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+γmaxa′Q−(s′,a′∣θ−)这里 Q − Q^- Q−就是目标网络。每过一定时间步就会将 θ \theta θ赋值给 θ − \theta^- θ−。伪代码如下:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186356.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...