【强化学习经典算法理解】
强化学习经典算法理解以及常存在的误区问题
强化学习经典算法理解
1. 策略梯度
1. 策略梯度(policy gradient,PG)
- 策略梯度:采样的数据只会用一次,我们采样这些数据, 更新完模型以后,我们要重新采样数据,才能去更新参数。 ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( R ( τ n ) − b ) ∇ log p θ ( a t n ∣ s t n ) \nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}\left(R\left(\tau^{n}\right)-b\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) ∇Rˉθ≈N1n=1∑Nt=1∑Tn(R(τn)−b)∇logpθ(atn∣stn)
- 策略梯度 = { MC 蒙特卡洛 − − > REINFORCE 算法 TD 时序差分 − − > 演员-评论员化 算法 \text{策略梯度}=\left\{\begin{matrix}\text{MC 蒙特卡洛} -- >\text{ REINFORCE 算法}\\\text{TD 时序差分}-- >\text{ 演员-评论员化 算法}\end{matrix}\right. 策略梯度={MC 蒙特卡洛−−> REINFORCE 算法TD 时序差分−−> 演员-评论员化 算法
1.1 REINFORCE 算法 和 演员-评论员化 算法
- 策略梯度 → \to → 采用 MC 蒙特卡洛方法 得到 → \to → REINFORCE 算法 → \to → REINFORCE 用的是回合更新的方式,它在代码上的处理上是先获取每个步骤的奖励,然后计算每个步骤的未来总奖励 G t G_t Gt,将每个 G t G_t Gt 代入 ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n G t n ∇ log π θ ( a t n ∣ s t n ) \nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} G_{t}^{n} \nabla \log \pi_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) ∇Rˉθ≈N1n=1∑Nt=1∑TnGtn∇logπθ(atn∣stn)
- 策略梯度 → \to → 采用 TD 时序差分 得到 → \to → 演员-评论员化 算法 → \to → ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n Q n ( s t n , a t n ) ∇ log π θ ( a t n ∣ s t n ) \nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} Q^{n}\left(s_{t}^{n}, a_{t}^{n}\right) \nabla \log \pi_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) ∇Rˉθ≈N1n=1∑Nt=1∑TnQn(stn,atn)∇logπθ(atn∣stn)
- 相比蒙特卡洛方法一个回合更新一次,时序差分方法是每个步骤更新一次,即每走一步,更新一次,时序差分方法的更新频率更高。时序差分方法使用 Q Q Q 函数来近似地表示未来总奖励 G t G_t Gt。
1.2 实际策略梯度
- 实际在做策略梯度的时候,我们并不是给整个轨迹 τ \tau τ 一样的分数,而是将每一个状态-动作对分开计算。 实际更新梯度的过程可写为 E ( s t , a t ) ∼ π θ [ A θ ( s t , a t ) ∇ log p θ ( a t ∣ s t ) ] \mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta}}\left[A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] E(st,at)∼πθ[Aθ(st,at)∇logpθ(at∣st)]我们用演员 θ \theta θ 采样出 s t s_{t} st 与 a t a_{t} at , 采样出状态-动作的对, 我们会计算这个状态-动作对的优势 (advantage) A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) ,就是它有多好。 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 即用累积奖励减去基线,这一项就是估测出来的。它要估测的是,在状态 s t s_{t} st 采取动作 a t a_{t} at 是好的还是不好的。接下来在后面乘 ∇ log p θ ( a t n ∣ s t n ) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) ∇logpθ(atn∣stn) ,也就是如果 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 是正的,就要增大概率;如果是负的,就要减小概率。
- 我们可以通过重要性采样把同策略变成异策略,从 θ \theta θ 变成 θ ′ \theta^{\prime} θ′ 。所以现在 s t s_{t} st、 a t a_{t} at 是 θ ′ \theta^{\prime} θ′ 与环境交互以后所采样到的数据。但是训练时,要调整的参数是模型 θ \theta θ 。因为 θ ′ \theta^{\prime} θ′ 与 θ \theta θ 是不同的模型,所以我们要有一个修正的项。这个修正的项,就是用重要性采样的技术,把 s t s_{t} st、 a t a_{t} at 用 θ \theta θ 采样出来的概率除以 s t s_{t} st、 a t a_{t} at 用 θ ′ \theta^{\prime} θ′ 采样出来的概率。 E ( s t , a t ) ∼ π θ ′ [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) ∇ log p θ ( a t ∣ s t ) ] \mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(s_{t}, a_{t}\right)}{p_{\theta^{\prime}}\left(s_{t}, a_{t}\right)} A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] E(st,at)∼πθ′[pθ′(st,at)pθ(st,at)Aθ(st,at)∇logpθ(at∣st)]这里:假设 A θ ( s t , a t ) A^{\theta}(s_{t}, a_{t}) Aθ(st,at) 和 A θ ′ ( s t , a t ) A^{\theta'}(s_{t}, a_{t}) Aθ′(st,at) 可能是差不多的。
2. 深度 Q 网络
2.1 技巧一:目标网络
- 我们在学习 Q Q Q 函数的时候,也会用到时序差分方法的概念。我们现在收集到一个数据,比如在状态 s t s_{t} st 采取动作 a t a_{t} at 以后,得到奖励 r t r_{t} rt ,进入状态 s t + 1 s_{t+1} st+1 。根据 Q Q Q 函数,我们可知 Q π ( s t , a t ) = r t + Q π ( s t + 1 , π ( s t + 1 ) ) Q_{\pi}\left(s_{t}, a_{t}\right)=r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) Qπ(st,at)=rt+Qπ(st+1,π(st+1))所以我们在学习的时候, Q Q Q 函数输入 s t s_{t} st、 a t a_{t} at 得到的值,与输入 s t + 1 s_{t+1} st+1、 π ( s t + 1 ) \pi\left(s_{t+1}\right) π(st+1) 得到的值之间,我们希望它们相差 r t r_{t} rt, 这与时序差分方法的概念是一样的。
- 如图所示, Q π ( s t , a t ) Q_{\pi}\left(s_{t}, a_{t}\right) Qπ(st,at) 是网络的输出, r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 是目标, 目标是会变动的。当然如果我们要实现这样的训练,其实也没有问题,就是在做反向传播的时候, Q π Q_{\pi} Qπ 的参数会被更新,我们会把两个更新的结果加在一起(因为它们是同一个模型 Q π Q_{\pi} Qπ,所以两个更新的结果会加在一起)。但这样会导致训练变得不太稳定,因为假设我们把 Q π ( s t , a t ) Q_{\pi}\left(s_{t}, a_{t}\right) Qπ(st,at) 当作模型的输出,把 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 当作目标,我们要去拟合的目标是一直在变动的,这是不太好训练的。
- 所以我们会把其中一个 Q Q Q 网络,通常是把图右边的 Q Q Q 网络固定住。在训练的时候,我们只更新左边的 Q Q Q 网络的参数,而右边的 Q Q Q 网络的参数会被固定。因为右边的 Q Q Q 网络负责产生目标,所以被称为目标网络。因为目标网络是固定的,所以现在得到的目标 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 的值也是固定的。我们只调整左边 Q Q Q 网络的参数,它就变成一个回归问题。我们希望模型输出的值与目标越接近越好,这样会最小化它的均方误差(mean square error)。
- 在实现的时候,我们会把左边的 Q Q Q 网络更新多次,再用更新过的 Q Q Q 网络替换目标网络。但这两个网络不要一起更新,一起更新,结果会很容易不好。一开始这两个网络是一样的,在训练的时候,我们会把右边的 Q Q Q 网络固定住,在做梯度下降的时候,只调整左边 Q Q Q 网络的参数。我们可能更新 100 次以后才把参数复制到右边的网络中,把右边网络的参数覆盖,目标值就变了。
2.2 技巧二:探索
- 探索有两个方法:
- 方法一: ε \varepsilon ε- 贪心
- 方法二:玻尔兹曼探索(Boltzmann exploration)
2.2.1 玻尔兹曼探索(Boltzmann exploration)
- 在玻尔兹曼探索中, 我们假设对于任意的 s s s、 a a a, Q ( s , a ) ⩾ 0 Q(s, a) \geqslant 0 Q(s,a)⩾0, 因此 a a a 被选中的概率与 e Q ( s , a ) / T e^{Q(s, a) / T} eQ(s,a)/T 呈正比, 即 π ( a ∣ s ) = e Q ( s , a ) / T ∑ a ′ ∈ A A Q ( s , a ′ ) / T \pi(a \mid s)=\frac{\mathrm{e}^{Q(s, a) / T}}{\sum_{a^{\prime} \in A} \mathrm{~A}^{\mathrm{Q}\left(s, a^{\prime}\right) / T}} π(a∣s)=∑a′∈A AQ(s,a′)/TeQ(s,a)/T 其中, T > 0 T>0 T>0 称为温度系数。如果 T T T 很大,所有动作几乎以等概率选择(探索); 如果 T T T 很小, Q Q Q 值大的动作更容易被选中 (利用); 如果 T T T 趋于 0 , 我们就只选择最优动作。
2.3 技巧三:经验回放
2.4 目标网络与行为网络之间的关系以及运行机制 ⋆ \star ⋆
- 目标网络和行为网络的目标作用不同,它们有不同的角色:
-
行为网络:行为网络( Q Q Q 网络)会根据目标值来调整自己的参数。目标值 y y y 是根据当前状态 s t s_{t} st 和动作 a t a_t at 来计算的,它表示一个理想的 Q Q Q 值(即通过行为网络做出的Q值预测应该尽量接近这个目标值)。行为网络的参数是通过梯度下降来调整,使得它对当前状态-动作对的 Q Q Q 值能够更准确地匹配目标值 y y y。
-
目标网络:目标网络(Target network)是用来生成一个相对稳定的目标值,它并不直接参与训练过程的梯度更新。在计算损失时,目标网络提供了一个相对固定且稳定的目标值 y y y,它的作用是作为当前 行为网络( Q Q Q 网络)提供计算目标值所需的 max a Q ′ ( s t + 1 , a ) \max_{a}Q' (s_{t+1},a) maxaQ′(st+1,a),即下一个状态 s t + 1 s_{t+1} st+1 下所有动作的最大Q值。目标网络输出的值 Q ′ ( s t + 1 , a ) Q' (s_{t+1},a) Q′(st+1,a) 是用来计算 TD 误差 的目标。
- 运行机制:
- 目标网络: 目标网络的参数是固定的(直到周期性更新),它仅用于计算目标值。对于一个给定的下一个状态 s t + 1 s_{t+1} st+1,目标网络计算出下一个状态所有可能动作的 Q Q Q 值,并选择最大的那个 Q Q Q 值 max a Q ′ ( s t + 1 , a ) \max_{a}Q' (s_{t+1},a) maxaQ′(st+1,a),计算出目标值 y = r t + γ max a Q ′ ( s t + 1 , a ) y=r_t+\gamma \max_{a}Q' (s_{t+1},a) y=rt+γmaxaQ′(st+1,a)
- 行为网络:行为网络的任务是调整它的参数。行为网络根据当前使得对于当前状态-动作对 ( s t , a t ) (s_{t},a_t) (st,at),并计算该状态-动作对的 Q Q Q 值 Q ( s t , a t ; θ ) Q(s_{t},a_t;\theta ) Q(st,at;θ),然后让其尽量接近目标值 y y y。然后通过最小化损失函数 L ( θ ) = ( y − Q ( s t , a t ; θ ) ) 2 L(\theta)=(y-Q(s_{t},a_t;\theta ))^2 L(θ)=(y−Q(st,at;θ))2 来更新行为网络的参数,每次训练都会根据经验回放池中随机抽取的一批数据进行更新。
- 参数更新:
- 问题:行为网络是通过最小化损失函数 L ( θ ) = ( y − Q ( s t , a t ; θ ) ) 2 L(\theta)=(y-Q(s_{t},a_t;\theta ))^2 L(θ)=(y−Q(st,at;θ))2 进行更新参数,那么目标网络是怎么进行参数更新的呢?
答案:目标网络参数更新: 目标网络的参数通常不会在每次训练时进行更新。相反,目标网络的参数 每隔一段时间(例如,隔 N N N 步)才会从行为网络中复制过来。
- 硬更新:每隔 N N N 步,直接将行为网络的参数复制到目标网络。
- 软更新:在每次训练中,目标网络的参数会以某个比例 τ \tau τ 更新为行为网络的参数,即: θ ′ ← τ θ + ( 1 − τ ) θ ′ \theta' \gets \tau \theta +(1-\tau)\theta ' θ′←τθ+(1−τ)θ′其中, θ ′ \theta' θ′ 是目标网络的参数, θ \theta θ 是行为网络的参数, τ \tau τ 通常为一个小值,如 0.001,表示逐渐接近。
- 问题:目标网络的参数每隔 N N N 步进行更新,在这 N N N 步之内,目标网络的目标值 y y y 都是不变的,那么,行为网络在这 N N N 步之内是怎么更新的?只有 Q ( s t , a t ; θ ) Q(s_{t},a_t;\theta ) Q(st,at;θ) 在改变吗?
答案:1:在目标网络每隔 N N N 步更新的情况下,在这 N N N 步之内,目标值 y y y 是固定的,因为目标网络的参数在这段时间内没有更新。2:行为网络在这 N N N 步内会不断根据目标值 y y y 更新自己的参数,但是目标值 y y y 不会变化,只有行为网络的 Q Q Q 值 Q ( s t , a t ; θ ) Q(s_{t},a_t;\theta ) Q(st,at;θ) 会随着训练逐渐逼近目标值 y y y 。3:只有当目标网络更新时,目标值 y y y 才会发生变化,接下来行为网络会根据新的目标值继续进行训练。
总结
- 目标网络 的作用是计算目标值 y = r t + γ max a Q ′ ( s t + 1 , a ) y=r_t+\gamma \max_{a}Q' (s_{t+1},a) y=rt+γmaxaQ′(st+1,a),提供一个稳定的估计作为行为网络学习的目标。
- 行为网络 会通过最小化损失函数 L ( θ ) L(\theta) L(θ) 来更新自己的参数,使得它的 Q Q Q 值预测能够尽量接近目标值 y y y。
3. 双深度 Q 网络(double DQN,DDQN)
- 在 DQN(Deep Q-Network)和 Double DQN(Double Deep Q-Network)中,网络结构的基本组成是相似的,但它们在计算目标值时的方法有所不同。下面详细说明两者的网络结构和工作机制:
3.1 DQN
- 目标值计算: 在 DQN 中,目标值 y y y 的计算方式如下: y = r + γ max a ′ Q target ( s ′ , a ′ ) y = r + \gamma \max_{a'} Q_{\text{target}}(s', a') y=r+γa′maxQtarget(s′,a′)其中: r r r 是即时奖励, γ \gamma γ 是折扣因子, Q target ( s ′ , a ′ ) Q_{\text{target}}(s', a') Qtarget(s′,a′) 是目标Q网络在下一个状态 s ′ s' s′ 对所有可能动作 a ′ a' a′ 的估计Q值
3.2 Double DQN
- Double DQN 的核心改进在于如何计算目标值 y y y,以减少 DQN 中可能出现的 Q Q Q 值高估问题。具体计算方式如下: y = r + γ Q target ( s ′ , arg max a ′ Q main ( s ′ , a ′ ) ) y = r + \gamma Q_{\text{target}}(s', \arg\max_{a'} Q_{\text{main}}(s', a')) y=r+γQtarget(s′,arga′maxQmain(s′,a′))这里的步骤是:
- 动作选择:使用主 Q Q Q 网络选择在下一个状态 s ′ s' s′ 下的最优动作: a max = arg max a ′ Q main ( s ′ , a ′ ) a_{\text{max}} = \arg\max_{a'} Q_{\text{main}}(s', a') amax=argmaxa′Qmain(s′,a′)
- 动作评估: 使用目标 Q Q Q 网络评估这个动作的 Q Q Q 值: Q target ( s ′ , a max ) Q_{\text{target}}(s', a_{\text{max}}) Qtarget(s′,amax)
- 计算目标值: 将即时奖励和折扣后的 Q Q Q 值相加,得到目标值: y = r + γ Q target ( s ′ , a max ) y = r + \gamma Q_{\text{target}}(s', a_{\text{max}}) y=r+γQtarget(s′,amax)
总结
- 网络数量: 无论是 DQN 还是 Double DQN,基本上都包含两个网络:一个主 Q Q Q 网络和一个目标 Q Q Q 网络。
- Double DQN 的区别: Double DQN 并没有减少网络的数量,它依然使用主 Q Q Q 网络和目标 Q Q Q 网络两个网络。 区别在于 Double DQN 在计算目标值时,动作的选择由主 Q Q Q 网络决定(即找到最优动作),而动作的评估由目标 Q Q Q 网络执行。这种方式有效地减少了DQN中可能出现的Q值高估问题,从而提升了学习的稳定性和效果。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)