[原创]从强化学习的本质推导到PPO

前言

这篇博客很久之前就想做了,一直在拖是因为觉得自己对知识点理解还没有足够的透彻。但是每当去复盘基本概念的时候又很难理清逻辑,所以觉得即便现在半吊子水平,但是也想通过博客记录一下自己肤浅的学习心得,权当是为自己巩固和梳理一遍知识点。

这篇博客主要借鉴了UCB的Pieter Abbeel大佬在youtube上的教学视频的思路,感兴趣的小伙伴可以移步这里 (国内的小伙伴可能需要借助一些魔法工具了hhh),这个系列视频非常简短,只有六个视频,但是包含了大量的概念和理论推导,非常适合新手入门,和了解这个领域的一些基本概念,当你理清了这些基本概念再去看论文,就可以识别出来别人论文中一些新奇的概念是否来自于那些古老而优雅的数学推导了。

强化学习的本质

基本的神经网络学习目标是 m a x ∑ i = 0 ∞ P ( y i ∣ x i , θ ) max \sum^{\infty}_{i=0}P(y_i|x_i, \theta) maxi=0P(yixi,θ),其中 x i x_i xi是输入的sample, y i y_i yi是对应的输出,NN的目标是学一个最优的参数 θ \theta θ使得输入最优地映射为输出。

而强化学习的目标则解释为让智能体学会去做出一系列最优的决策,或者说让智能体学习到一个最优的策略,这个策略可以获得最大的折扣回报的期望。
G o a l : m a x π E [ ∑ t = 0 H γ t ⋅ R ( S t , A t , S t + 1 ) ∣ π ] (1) Goal: \underset{\pi}{\mathrm{max}} E[\sum^{H}_{t=0}\gamma^t \cdot R(S_t, A_t, S_{t+1})|\pi] \tag{1} Goal:πmaxE[t=0HγtR(St,At,St+1)π](1)
其中, γ \gamma γ是折扣率,数值越大代表在计算折扣回报的时候越在意当前的动作对未来的影响。大写的 S , A S, A S,A分别代表状态集合和动作集合。 π \pi π代表策略函数。需要牢记上面的这个是期望折扣回报

因为下面还要介绍一个概念叫做最优价值函数(Optimal Value Function, V ∗ V^* V),我们会发现强化学习中的这些新概念都是具有递进关系的,前面的那个期望折扣回报似乎是一个比较广泛的概念,它并没有限定在什么样的初始状态下开始进行序列决策,但是我们在进行游戏,或者在进行某一项任务的时候总是有一个初始状态的,所以对于我们来说,研究如何使用一个最优的策略函数去最大化给定初始状态的期望折扣回报更有意义,因此最优价值函数被定义为:expected sum of discounted rewards when starting from state s s s and acting optimally:
V ∗ ( s ) = m a x π E [ ∑ t = 0 H γ t ⋅ R ( S t , A t , S t + 1 ) ∣ π , s 0 = s ] (2) V^*(s)=\underset{\pi}{\mathrm{max}} E[\sum^{H}_{t=0}\gamma^t \cdot R(S_t, A_t, S_{t+1})|\pi, s_0=s] \tag{2} V(s)=πmaxE[t=0HγtR(St,At,St+1)π,s0=s](2)
P.S.:这个函数的自变量是只有初始状态 s s s m a x \mathrm{max} max是为了acting optimally

Value Iteration/价值迭代

现在假设我们的状态空间是有限的,我们应该如何计算每种状态的最优价值函数呢?

这是原始频的讲解中在这里提出的一个问题,但是在这之前我认为还缺少一个问题:

我们为什么要算每种状态的最优价值函数呢?

那显然是因为计算最优价值函数对我们是有帮助的,这个函数值代表的是某种状态下的期望折扣回报,所以在我们进行游戏或者某项任务的时候如果提前知道了这个环境中哪个状态的期望折扣回报最大或者比较大,那么我们在做动作的时候就可以倾向于让这些状态发生。比如下图的这种游戏:
在这里插入图片描述
我们让机器人做动作,去吃到右上角的钻石。机器人位于不同的方格就是不同的状态,这个游戏中显然状态空间是有限的,那么如果我们知道机器人位于每个方格时的最优价值函数,那么我们就可以在做动作的时候让机器人尽量往数值大的方格上走。
在这里插入图片描述
最终得到的最优价值函数可以用这个表格的方式展现出来,当我们处于不同的状态时,接下来应该向哪里走就显而易见了。

接下来,那我们就只需要看一下:

如何计算每种状态的最优价值函数呢?

第一个方法就是价值迭代法,公式如下:
V k + 1 ( s ) = m a x a ∑ s ′ P ( s ′ ∣ s , a ) ( R ( s , a , s ′ ) + γ V k ( s ′ ) ) (3) V_{k+1}(s)=\underset{a}{\mathrm{max}}\sum_{s'}P(s'|s,a)(R(s,a,s')+\gamma V_k(s')) \tag{3} Vk+1(s)=amaxsP(ss,a)(R(s,a,s)+γVk(s))(3)
这里的公式大家可能会发现跟前面的公式有所出入,其实只是把期望给拆开了,这个公式里的求和符号替换之前的 E E E,之前的求和符号隐含在迭代 γ V k ( s ′ ) \gamma V_k(s') γVk(s)之中。函数 V V V的下标 k k k就代表走了多少个时间步。当 k = 0 k=0 k=0的时候给定初始状态 s s s,但是你一步也走不了,自然是没有reward的,所以 V 0 ( s ) = 0 V_0(s)=0 V0(s)=0。这样我们只要知道reward知道transition model也就是那个 P ( s ′ ∣ s , a ) P(s'|s,a) P(ss,a),我们就可以从 k = 0 k=0 k=0开始逐渐去求 k → ∞ k \rightarrow \infty k的时候价值函数的值,最终会收敛到最优价值函数的值。

所以对于一个有限状态空间和动作的强化学习任务我们可以使用下面这个伪代码展示的流程去解:

Start with V0(s)=0 for all s.For k=1,...,H:For all state s in S:Vk(s) <- max Equation (3)phai_k(s) <- argmax Equation (3)

通过价值迭代我们可以获得最终的最优价值函数以及每个状态相应的最优动作。需要注意的是这里的 π ∗ ( s ) \pi^*(s) π(s)针对每个状态s都是一个固定的动作,所以对于状态空间的探索是有限的。这种情况在探索小的状态空间的时候是没有问题的,因为总共穷举出来的轨迹也是有限的。

对上面这句话的一个直觉的解释:这里的轨迹就是从初始状态开始一直到最终游戏结束这个过程中智能体所做的所有动作,经历的所有状态和所有的rewards合并到一起就是一条轨迹,我们所说的智能体在学习,其实是让它在每条轨迹中学习到新的信息,一条轨迹对于智能体的训练来说是一个sample,更多的sample自然可以让智能体探索到更广泛的空间,学到的东西理论上也越多,而不会仅仅局限于某一种环境中。

讲述到这里其实价值迭代还差一步就是

为什么这个价值迭代一定会converge?

首先我们知道:
V ∗ ( s ) = V^*(s)= V(s)=expected sum of rewards accumulated starting from state s s s, acting optimally for ∞ \infty steps.
V H ( s ) = V_H(s)= VH(s)=expected sum of rewards accumulated starting from state s s s, acting optimally for H H H steps.
然后我们用下面的公式可以表示H之后收集的折扣奖励:
r H + 1 R ( s H + 1 ) + r H + 2 R ( s H + 2 ) + . . . < = r H + 1 R m a x + r H + 2 R m a x + . . . = r H + 1 1 − r R m a x r^{H+1}R(s_{H+1})+r^{H+2}R(s_{H+2})+... <= r^{H+1}R_{max}+r^{H+2}R_{max}+...=\frac{r_{H+1}}{1-r} R_{max} rH+1R(sH+1)+rH+2R(sH+2)+...<=rH+1Rmax+rH+2Rmax+...=1rrH+1Rmax

所以当 H → ∞ H \rightarrow \infty H的时候上面这个式子趋近于0,所以H之后时间步的累积折扣奖励趋近于0,那么 V H ( s ) → V ∗ ( s ) V_H(s) \rightarrow V^*(s) VH(s)V(s)

总结

价值迭代法用于小范围state的策略探索。

Q-Value Iteration

前面讲到的最优价值函数的自变量只有一个状态,然后从这个状态开始acting optimally收集的折扣奖励作为最优价值。但是如果我们从状态s开始想尝试所有的动作,而不仅仅是尝试最优的动作(针对状态s作出的动作),这里我们就要把针对状态s作出的动作a假设为所有可能的动作,相当于我们对于每个状态不再只有一个最优价值函数,而是在该状态下每个动作都有一个价值函数,我们都可以求。

Q-value定义为:expected utility starting from s, taking action a, and (thereafter) acting optimally.

Q ∗ ( s , a ) = ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ m a x a ′ Q ∗ ( s ′ , a ′ ) ] (4) Q^*(s,a)=\sum_{s'}P(s'|s,a)[R(s,a,s')+\gamma \underset{a'}{\mathrm{max}}Q^*(s',a')] \tag{4} Q(s,a)=sP(ss,a)[R(s,a,s)+γamaxQ(s,a)](4)

相比于Optimal Value Function,Q-value可以通过相对更多的信息,比如给定一个状态及其q价值,那我们可以直接判断出那个动作下的q价值是最大的,直接作出动作。但是从价值函数是看不出来当前状态做哪个动作是最大的,你需要遍历所有的状态。

那么解决Q-value和证明其收敛性与之前的价值迭代是一样的这里不再给出具体的证明。
Q k + 1 ∗ ( s , a ) ← ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ m a x a ′ Q k ∗ ( s ′ , a ′ ) ] (5) Q^*_{k+1}(s,a) \leftarrow \sum_{s'}P(s'|s,a)[R(s,a,s')+\gamma \underset{a'}{\mathrm{max}}Q^*_k(s',a')] \tag{5} Qk+1(s,a)sP(ss,a)[R(s,a,s)+γamaxQk(s,a)](5)
在这里插入图片描述

策略迭代法

前面说到价值迭代法在做游戏的时候想要从初始状态s产生一系列最优的动作的话需要遍历所有的状态,求出其最优价值函数。

为了进一步简化价值迭代法,我们又引入了q-value迭代法,q-value中引入了针对当前状态s所作的动作a作为额外的自变量,这样我们在给定状态s的时候,就可以从q(s,a)中找到最大的那个动作a作为最优策略。

这两个方法本质上是相同的,都是需要遍历所有的动作才能找到最大的那个价值,所以policy iteration提出是为了用迭代去替代遍历

Policy iteration分为policy evaluation和policy improvement两步。其中evaluation步骤,我们用价值迭代得到当前策略下的价值函数,去评估当前的policy质量(policy evaluation):
V k π ( s ) ← ∑ s ′ P ( s ′ ∣ s , π ( s ) ) [ R ( s , π ( s ) , s ′ ) + γ V k − 1 π ( s ′ ) ] (6) V^{\pi}_k(s) \leftarrow \sum_{s'}P(s'|s,\pi(s))[R(s,\pi(s),s')+\gamma V^{\pi}_{k-1}(s')] \tag{6} Vkπ(s)sP(ss,π(s))[R(s,π(s),s)+γVk1π(s)](6)
直到其收敛。

通过这个不太准确的“最优价值函数”,我们对policy进行更新 (policy improvement):
π k + 1 ( s ) ← a r g m a x a ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ V π k ( s ′ ) ] (7) \pi_{k+1}(s) \leftarrow \underset{a}{\mathrm{argmax}} \sum_{s'}P(s'|s,a)[R(s,a,s')+\gamma V^{\pi_k}(s')] \tag{7} πk+1(s)aargmaxsP(ss,a)[R(s,a,s)+γVπk(s)](7)
这个迭代是一定会收敛的,因为只要我们的迭代次数足够多,实际上每种策略我们都可以经历一遍,也就是说最终肯定会有 π k + 1 ( s ) = π k s f o r a l l s t a t e s \pi_{k+1}(s)=\pi_k{s} for all state s πk+1(s)=πksforallstates.

所以对于任意的s,我们都可以有:
V π k ( s ) = m a x a ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ V π k ( s ′ ) ] (8) V^{\pi_k}(s) = \underset{a}{\mathrm{max}}\sum_{s'}P(s'|s,a)[R(s,a,s')+\gamma V^{\pi_k}(s')] \tag{8} Vπk(s)=amaxsP(ss,a)[R(s,a,s)+γVπk(s)](8)
这就意味着收敛时的V正是最优价值函数。

总结

总结来说,价值迭代是在迭代迭代最优价值函数的时候就对所有的动作轨迹进行尝试,直接找到最准确的对于当前状态的最优价值函数。

而策略迭代则是每一次用不太准确的最优价值函数去更新策略,一步一步的逼近真正的最优价值函数,从而得到最优策略。

两者并没有本质的区别。

Model-free → \rightarrow Q-learning

之前介绍的两种方法价值迭代策略迭代都属于model-based的方法,因为在他们的公式中都有 P ( s ′ ∣ s , a ) P(s'|s,a) P(ss,a)这一项,这个转换模型在真实的任务中我们通常是未知的,不可以求解的。

此外,前面的两种方法还受限于小尺度的状态空间和动作空间。

因此我们现在多数用的还是model-free的方法。
回忆q-value的迭代中,我们使用的是下面这个公式
Q k + 1 ∗ ( s , a ) ← ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ m a x a ′ Q k ∗ ( s ′ , a ′ ) ] (9) Q^*_{k+1}(s,a) \leftarrow \sum_{s'}P(s'|s,a)[R(s,a,s')+\gamma \underset{a'}{\mathrm{max}}Q^*_k(s',a')] \tag{9} Qk+1(s,a)sP(ss,a)[R(s,a,s)+γamaxQk(s,a)](9)
也可以写作,
Q k + 1 ∗ ( s , a ) ← E s ′ − P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ m a x a ′ Q k ∗ ( s ′ , a ′ ) ] (10) Q^*_{k+1}(s,a) \leftarrow E_{s'-P(s'|s,a)}[R(s,a,s')+\gamma \underset{a'}{\mathrm{max}}Q^*_k(s',a')] \tag{10} Qk+1(s,a)EsP(ss,a)[R(s,a,s)+γamaxQk(s,a)](10)
这是在求一个期望,所以model-free的方法就是利用sample作为期望的估计以摆脱transition model的限制。
在这里插入图片描述
上面就是tabular的q-value的伪代码,简单来讲就是对每个状态都随机sample一个动作(采用 δ \delta δ-greedy策略,也就概率发生随机采样和选取当前q-value下最优的动作)。

这里视频作者乘其为off-policy learning,我想就是这里的sample action是跟策略无关的sample,作者提到该方法可以可靠地收敛到最优的q-value,这个在理论上有原论文中两页纸的证明,视频中并没有进行讲解,我想暂时我也看不懂所以这边就当作结论线记下来。

此外,我们注意这段伪代码中的这个target其实比较熟悉,它其实就是我们之前提到过的用于更新价值网络的那个TD target,更新后的q-value就是为了更接近这个target。

但是上面这种方法只是解决了转换模型的限制,并没有适应更大的状态空间,因为它还是记录了所有状态下不同动作的q-value,所以它叫做tabular q-learning.

那么为了不用表格去存储q-value,有研究提出了parameterized Q function: Q θ ( s , a ) Q_{\theta}(s,a) Qθ(s,a),也就是用参数 θ \theta θ去"存储"所有的q值。
那么这里我们就从直接迭代优化q-value转变到了迭代优化参数 θ \theta θ,但是注意的是这里的target我们仍然用的TD target:
t a r g e t ( s ′ ) = R ( s , a , s ′ ) + γ m a x a ′ Q θ k ( s ′ , a ′ ) (10) target(s')=R(s,a,s')+\gamma \underset{a'}{\mathrm{max}}Q_{\theta_k}(s',a') \tag{10} target(s)=R(s,a,s)+γamaxQθk(s,a)(10)
参数更新:
θ k + 1 ← θ k − α ∇ θ [ 1 2 ( Q θ ( s , a ) − t a r g e t ( s ′ ) ) 2 ] ∣ θ = θ k (11) \theta_{k+1} \leftarrow \theta_{k}-\alpha \nabla_{\theta}[\frac{1}{2}(Q_{\theta}(s,a)-target(s'))^2]|_{\theta=\theta_k} \tag{11} θk+1θkαθ[21(Qθ(s,a)target(s))2]θ=θk(11)
上面这种方法其实就是DQN
在这里插入图片描述
这个图给了一个double DQN的伪代码,其基本原理其实跟前面的tabular Q-learning是一样的,只不过这里引入了经验回放和double Q network的机制。

经验回放

引入这个机制的原因其实我们可以通过对比之前tabular q-learning的伪代码的区别发现:之前的tabular模式下,每一次对Q-value的迭代是更新了所有的状态下的q值的。但是我们提出DQN就是为了解决大尺度状态空间下无法存储所有的Q-value的问题,所以自然我们不可能让所有的状态都参与到Q网络的参数更新中。

所有我们在迭代的时候会存储一些之前遇到过的transitions,就是图中的这个括号里的这些信息,它包括了从一个状态采取了一个动作然后切换到了下一个状态以及得到的奖励是多少,然后后面参数更新的时候使用一些之前的transitions。我们把之前经历的这些transitions称为经验。

还需要注意的一点是,这里用的是随机采样的一些经验去更新,而不是用前面连续几次的经验。这是因为连续的经验可能高度相关,我们要打破经验之间的关联性,避免数据过拟合某些经验,当然这只是其中一个原因。还有一个原因是作者认为之前的经验也存在价值,比如t=3时候的经验对于t=10的时候也是有价值的。

Double Q Network

而引入double q network的目的,在论文中解释为,为了避免q网络过渡估计的问题。
我们看上图的TD target的计算公式会发现其中的用的 Q − Q^{-} Q网络是比 Q Q Q网络要“慢半拍”的。
因为如果某一条经验是有噪声的,就是不太好的经验导致Q网络更新了,那这个TD target中用Q网络得到的最优动作a显然是不太靠谱的,所以用两个Q网络,其中一个网络慢于另一个更新就可以一定程度上避免这种情况发生。

总结

关于q-learning比较有经典且代表性的算法就是DDQN。DDQN主要是学习一个Q网络,它的输入是当前状态和动作输出是从当前状态开始,采取动作a之后的每一步都是optimal action的情况下所获得的折扣回报的期望,这个也是q-value的意义。网络的成本函数是缩小q-value和TD target之间的距离。

那么在训练结束后,我们就得到了最终的q function,那么在给定状态s之后,我们就可以计算那个q(s,a)是最大的从而找到针对当前状态的最优动作。

策略梯度算法

DQN通常被认为具有较高的数据效率但是训练不够稳定,并且最终确定动作用得是 a r g m a x \mathrm{argmax} argmax,这只能操作与离散的动作,对于连续的动作求极值很难。

因此研究人员想用一个简单的网络针对当下的状态直接输出动作,这个网络就叫做策略网络。
所以这个网络的输入就是当前状态,输出就是动作概率分布。

接下来我们来明确这个网络的成本函数:
假设让 τ \tau τ代表一个state-action序列 s 0 , u 0 , . . . , s H , u H s_0, u_0, ..., s_H, u_H s0,u0,...,sH,uH
R ( τ ) = ∑ t = 0 H R ( s t , u t ) R(\tau)=\sum^{H}_{t=0}R(s_t, u_t) R(τ)=t=0HR(st,ut)这个代表这个序列的奖励总和,我们称之为一条轨迹的奖励总和。
然后我们引入策略网络的目标函数:
U ( θ ) = E ( ∑ t = 0 H R ( s t , u t ) ; π θ ) U(\theta)=E(\sum^{H}_{t=0}R(s_t, u_t); \pi_{\theta}) U(θ)=E(t=0HR(st,ut);πθ)
其中 π θ \pi_{\theta} πθ代表策略网络,比如 u 0 = π θ ( s 0 ) u_0=\pi_{\theta}(s_0) u0=πθ(s0),给定一个状态 s 0 s_0 s0产生一个动作 u 0 u_0 u0
所以上面这个公式的含义就是在当前的策略网络参数下所有可能出现的轨迹的奖励总和的期望,也可以写成下面这个形式:
U ( θ ) = ∑ τ P ( τ ; θ ) R ( τ ) U(\theta)=\sum_{\tau}P(\tau;\theta)R(\tau) U(θ)=τP(τ;θ)R(τ),其中 P ( τ ; θ ) P(\tau;\theta) P(τ;θ)就是在当前的策略网络下出现轨迹 τ \tau τ的概率。所以策略网络反映的动作概率分布产生的最优轨迹概率越高则我们的目标函数就会越大,所以我们期望更新参数 θ \theta θ以最大化目标函数。

采用梯度算法更新参数:
在这里插入图片描述
从最后的这个求梯度的公式来看,显然遍历所有的轨迹是不现实的,因此通常的做法是采用经验估计的方法去近似这个梯度,如下图所示,也就是随机挑选m条轨迹求平均。
在这里插入图片描述
因为我们是最大化目标函数 U ( θ ) U(\theta) U(θ),所以使用梯度上升。那么这里的奖励R如果是大于0的,就相当于我们在提升一条带有好的奖励的轨迹,如果reward是小于0的,那么相当于把负的reward的轨迹的概率给降低。这是对这个策略梯度公式的直觉上的理解。

进一步的我们把梯度公式中的log部分拆开:
在这里插入图片描述
会发现最终梯度的计算跟transition model没有关系,因为我们是对参数求导而transition model与策略网络的参数无关,所以它的导数是0. 至此,我们明白了策略梯度算法为何属于model-free的方法。

error correct in the paper “Deep Progressive Reinforcement Learning for Skeleton-based Action Recognition”

这里我们把这个梯度带回我们目标函数的梯度公式中会发现会发现这个策略梯度公式跟上次汇报提到的策略梯度的形式很像,如下图是上次汇报中提到的那篇文章所用的策略梯度公式,我们忽略符号上的不一致,会发现差别其实只是在这篇论文中他在做经验估计的时候只用了一条轨迹,而我们前面推导的策略梯度是用了多条随机轨迹去做策略梯度的经验估计,所以它这里的公式12其实有一点问题,加号应该改成减号,正如它文字中所说的,它定义的loss function是带了负号的策略梯度,所以在参数更新公式中应该是梯度下降,这样才与通常策略梯度算法中的梯度上升是匹配的:
截图自论文“Deep Progressive Reinforcement Learning for Skeleton-based Action Recognition”

Baseline substraction and actor-critic

总结一下,策略网络以给定状态为输入,输出一个动作概率分布,训练的目标是找的一组参数 θ \theta θ让这组参数下可以获得的不同轨迹的奖励总和的期望最大,就是让这组参数下最优轨迹的概率最大。而前面介绍的策略梯度理论上已经可以用来更新网络参数,使其实现预定的目标。但是后面还有了actor-critic的结构,也就是在策略网络的基础上引入了一个价值网络。

所以这一小节,我会推导从naive的策略梯度如何到了actor-critic,这里通过了一系列比较有意思的数学推导得到了最终的结果,但是在视频中并没有进行严格的推导,所以我这里也是讲解比较intuition层面的推导逻辑。

前面的这个策略梯度有两个问题,这个梯度是sample了一条轨迹或者几条轨迹算出来的,而不是一个期望,所以会引入noise,导致这样计算的梯度方差可能比较大,也就是说它计算的不准。
第二个问题是,前面我们在intuition的层面上对策略梯度进行的解释是:增加reward大于0的轨迹的概率,减小reward小于0的轨迹的概率。这样就引入一个问题,很有可能某些任务上我的reward是没有负值的,所以这样的策略梯度对于好的轨迹的提升或者对于坏的轨迹的抑制作用就不是很明显。所以能不能我对轨迹的奖励设置一个baseline,然后我去增加大于这个baseline的轨迹的概率,然后抑制小于这个baseline的轨迹的概率,所以如下图所示我们可以得到了新的策略梯度。对于第一个问题,从直觉上理解,我们让原始的reward减去了一个baseline b相当于减小了奖励的大小,一定程度上限制了梯度的方差。(当然这里应该有更严格的数学证明,但是视频中暂时没有讲。)
在这里插入图片描述
后面还有一步操作是移除与当前动作 u t u_t ut无关的奖励项,这进一步缩小了奖励值所以进一步降低了梯度估计的方差。
在这里插入图片描述
然后我们发现下面这个公式的第一项有点像Q-value,差了个折扣率,那我们就加上折扣率,让它就边为q-value,这样括号里的值又减小了一些,那梯度估计的方差也可以变小一些。至于括号里的第二项,就更加明显了,这个就是value function价值函数。

总结一下,从基本的策略梯度到actor-critic主要经历了baseline的引入,引入baseline是为了让平均线以上的轨迹出现的概率更高同时抑制平均线一下的轨迹出现概率,避免出现奖励值只有大于0的情况下,基本的策略梯度会对所有轨迹都进行概率提升导致优秀的轨迹出现的不明显。此外,引入baseline还可以降低sample-based的策略梯度估计的方差。

引入baseline那么我们就要对baseline进行估计,这里的baseline不能与动作有关,所以baseline仅依赖与状态 s t s_t st,所以我们用价值函数充当baseline,然后把策略梯度括号里的这第一项进一步的用Q-value替代。所以我们需要一个额外的价值网络去估计价值函数,所以整个的带有价值网络的网络更新流程可以简述为下图。图中主要表示了价值网络的参数我们是通过TD target进行更新的,后面这一项是为了让更新前后的参数不要相差特别多。而策略网络的参数我们就通过前面推导的策略梯度进行更新。
在这里插入图片描述

TRPO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加拿大量子研究新动作!D-Wave与滑铁卢大学合作研究量子相干性

​ &#xff08;图片来源&#xff1a;网络&#xff09; D-Wave是量子计算系统、软件和服务的领导者&#xff0c;也是量子计算机的第一家供应商。近期&#xff0c;D-Wave宣布与滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;达成两项新合作。他们为量子计算系统建立了关键…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…

无代码集成明道云与更多应用连接

明道云是一个APaaS平台&#xff0c;可以帮助用户快速搭建个性化企业应用&#xff0c;用户不需要代码开发就能够搭建出用户体验上佳的销售、运营、人事、采购等核心业务应用&#xff0c;打通企业内部数据&#xff0c;也能够通过API和Webhook和其他系统对接。 场景描述&#xff…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明&#xff08;error 状态码&#xff09;6、简单实例,包含库文件&#xff0c;头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库&#xff0c;支…

消息队列(3) -封装数据库的操作

前言 上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整 实现封装 在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用…

uniapp实现支付宝菜单展开与收起

需求实现支付宝类似的效果&#xff1a; 思路&#xff1a; 1.首先建立展开收起按钮&#xff0c;这里使用的是uview里面的icon图标。 2.其次建立展开菜单内容&#xff0c;这里只演示了文本信息&#xff0c;后期引入首页应用。 3.最后写js逻辑&#xff0c;展开收起时改变盒子高度和…

基于STM32设计的出租车计费系统

一、项目介绍 在城市交通中&#xff0c;出租车是一种常见的交通工具。为了方便乘客和司机之间的交易&#xff0c;出租车计费系统被广泛应用于出租车行业。系统能够自动计算乘客的费用&#xff0c;提供准确、方便的计费服务&#xff0c;并且能够记录乘客的行驶数据&#xff0c;…

flink kafka消费者如何处理kafka主题的rebalance

背景&#xff1a; 我们日常使用kafka客户端消费kafka主题的消息时&#xff0c;当消费者退出/加入消费者组&#xff0c;kafka主题分区数有变等事件发生时&#xff0c;都会导致rebalance的发生&#xff0c;此时一般情况下&#xff0c;如果我们不自己处理offset&#xff0c;我们不…

django处理分页

当数据库量比较大的时候一定要分页查询的 在django中操作数据库进行分页 queryset models.PrettyNum.objects.all() #查询所有 queryset models.PrettyNum.objects.all()[0:10] #查询出1-10列 queryset models.PrettyNum.objects.filter(mobile__contains136)[0:10] …

python-opencv对极几何 StereoRectify

OpenCV如何正确使用stereoRectify函数 函数介绍 用于双目相机的立体校正环节中&#xff0c;这里只谈谈这个函数怎么使用&#xff0c;参数具体指哪些函数参数 随便去网上一搜或者看官方手册就能得到参数信息&#xff0c;但是&#xff01;&#xff01;相对关系非常容易出错&…

机器学习深度学习——池化层

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积的多输入多输出通道 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

1. Git基础知识

文章目录 Git基础知识一、集中式与分布式二、中心服务器三、工作流四、分支实现五、冲突六、Fast forward七、储藏&#xff08;Stashing&#xff09;八、SSH 传输设置九、.gitignore 文件十、Git 命令一览十一、和远端仓库交互 Git基础知识 一、集中式与分布式 Git 属于分布式…

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

【第一阶段】kotlin的when表达式

1.Java 的if /when是语句 kotlin的if/when是表达式&#xff0c;表达式是有返回值的 java中void是个关键字&#xff0c;Unit在kotlin中是个类 2.当使用when语句的时候必须有一个不满足的值即else: fun main() {var week:Int5val info when(week){1->"今天是星期一"…

Transformer学习笔记

Transformer学习笔记 前言前提条件相关介绍Transformer总体架构编码器&#xff08;Encoder&#xff09;位置编码&#xff08;Positional Encoding&#xff09;get_attn_pad_mask函数&#xff08;Padding Mask&#xff09;EncoderLayerMultiHeadAttentionScaledDotProductAttent…

项目出bug,找不到bug,如何拉回之前的版本

1.用gitee如何拉取代码 本文为转载于「闪耀太阳a」的原创文章原文链接&#xff1a;https://blog.csdn.net/Gufang617/article/details/119929145 怎么从gitee上拉取代码 1.首先找到gitee上想要拉取得代码URL地址 点击复制这里的https地址 1 ps:&#xff08;另外一种方法&…

xcode打包导出ipa

转载&#xff1a;xcode打包导出ipa 目录 转载&#xff1a;xcode打包导出ipa 第一步&#xff1a;注册苹果开发者账号 第二步&#xff1a;下载APP Uploader 第三步&#xff1a;使用xcode打包导出ipa文件&#xff0c;供其他人内测 众所周知&#xff0c;在开发苹果应用时需要使…

Leetcode31 下一个排列

解题思路&#xff1a; 算法过程的第二步&#xff0c;可以变为将[j,end]排序&#xff0c;然后从[j,end)和i进行比较&#xff0c;在区间j,end区间第一个大于nums[i]后&#xff0c;交换即可 public void nextPermutation(int[] nums) {int len nums.length - 1;for(int i len;i…

【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 &#xff1a; 插补算法 本文提供直线插补的概念基础&#xff0c;基本思路分析&#xff0c;C语言实现等&#xff0c;代码会直接贴出&#xff01; 插补算法是指在数值计算或数据处理中&#xff0c;根据已有的数据…

单例模式(C++)

定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。 应用场景 在软件系统中&#xff0c;经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器&#xff0c;提供一种…