本文主要是介绍深度强化学习算法之SAC算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
深度强化学习算法之SAC(Soft Actor Critic)算法
文章地址:
Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor
Soft Actor-Critic Algorithms and Applications代码地址:
demo1
demo2参考地址:
BLOG1
BLOG2
BLOG3
BLOG4
1、最大熵强化学习
-
一般的强化学习的目标是最大化累积奖励:
∑ t E ( s t , a t ) ∼ ρ π [ r ( s t , a t ) ] \sum_{t} \mathbb{E}_{\left(s_t, a_{t}\right) \sim \rho_{\pi}}\left[r\left(s_{t}, a_{t}\right)\right] t∑E(st,at)∼ρπ[r(st,at)] -
最大熵强化学习的目标是带熵的累积奖励:
J ( π ) = ∑ t = 0 T E ( s t , a t ) ∼ ρ π [ r ( s t , a t ) + α H ( π ( ⋅ ∣ s t ) ) ] J(\pi)=\sum_{t=0}^{T} \mathbb{E}_{(s_t, a_t) \sim \rho_{\pi}}\left[r\left(s_{t}, a_{t}\right)+\alpha H\left(\pi\left(\cdot \mid s_{t}\right)\right)\right] J(π)=t=0∑TE(st,at)∼ρπ[r(st,at)+αH(π(⋅∣st))]
其中, α \alpha α 为温度系数,决定熵相对于奖励的重要程度,从而控制策略的随机程度。
entropy可以理解为是一个值,用来衡量一个随机变量的随机性有多强。举个例子,如果对一个硬币出现正反面的变量进行加权,如果总是出现正面,那么这个变量的熵就很小;反之,如果出现正反面的加权值都接近0.5,那么就说明这个变量的熵很大。
假设 x ∼ P x \sim P x∼P, P P P 是一个分布,那么 x x x的熵 H H H的计算方式为:
H ( P ) = E P x ∼ P [ − log P ( x ) ] H(P)=\underset{x \sim P}{E_{P}}[-\log P(x)] H(P)=x∼PEP[−logP(x)]
2、从策略迭代到软策略迭代
-
策略迭代
分成两步:
- 策略评估,更新值函数,用来对策略进行评估
- 策略改进,更新策略,用上一步的值函数来知道策略提高
如上图所示,不断经过策略评估个策略提高最终找到最优策略。
-
软策略迭代
-
策略评估
对于一个固定的策略 π \pi π,soft Q-value可以用Bellman backup 算子 Γ π \Gamma^{\pi} Γπ 迭代求出来:
T π Q ( s t , a t ) ≜ r ( s t , a t ) + γ E s t + 1 ∼ p [ V ( s t + 1 ) ] \mathcal{T}^{\pi} Q\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right) \triangleq r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)+\gamma \mathbb{E}_{\mathbf{s}_{t+1} \sim p}\left[V\left(\mathbf{s}_{t+1}\right)\right] TπQ(st,at)≜r(st,at)+γEst+1∼p[V(st+1)]
其中,soft state value function 为:
V ( s t ) = E a t ∼ π [ Q ( s t , a t ) − log π ( a t ∣ s t ) ] V\left(\mathbf{s}_{t}\right)=\mathbb{E}_{\mathbf{a}_{t} \sim \pi}\left[Q\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)-\log \pi\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)\right] V(st)=Eat∼π[Q(st,at)−logπ(at∣st)] -
策略提高
在实际操作中,我们更希望策略最好可以方便处理。因此我们将策略限定在一个特定集合 Π \Pi Π当中,比如带有参数的高斯分布。为了将策略限定在集合 Π \Pi Π中,我们采用KL散度去投影新的策略:
π new = arg min π ′ ∈ Π D K L ( π ′ ( ⋅ ∣ s t ) ∥ exp ( Q π old ( s t , ⋅ ) ) Z π old ( s t ) ) \pi_{\text {new }}=\arg \min _{\pi^{\prime} \in \Pi} D_{K L}\left(\pi^{\prime}\left(\cdot \mid \mathbf{s}_{t}\right) \| \frac{\exp \left(Q^{\pi_{\text {old }}}\left(\mathbf{s}_{t}, \cdot\right)\right)}{Z^{\pi_{\text {old }}}\left(\mathbf{s}_{t}\right)}\right) πnew =argπ′∈ΠminDKL(π′(⋅∣st)∥Zπold (st)exp(Qπold (st,⋅)))
-
信息熵:可以表达数据的信息量大小
H ( p ) = H ( X ) = E x ∼ p ( x ) [ − log p ( x ) ] = − ∑ i = 1 n p ( x ) log p ( x ) H(p)=H(X)=\mathrm{E}_{x \sim p(x)}[-\log p(x)]=-\sum_{i=1}^{n} p(x) \log p(x) H(p)=H(X)=Ex∼p(x)[−logp(x)]=−i=1∑np(x)logp(x)
或者
H ( p ) = H ( X ) = E x ∼ p ( x ) [ − log p ( x ) ] = − ∫ p ( x ) log p ( x ) d x H(p)=H(X)=\mathrm{E}_{x \sim p(x)}[-\log p(x)]=-\int p(x) \log p(x) d x H(p)=H(X)=Ex∼p(x)[−logp(x)]=−∫p(x)logp(x)dx
KL散度(相对熵): 表示两个概率分布之间差异的非对称性度量,相对熵等价于两个概率分布的信息熵。
D K L ( p ∥ q ) = ∑ i = 1 N [ p ( x i ) log p ( x i ) − p ( x i ) log q ( x i ) ] D_{K L}(p \| q)=\sum_{i=1}^{N}\left[p\left(x_{i}\right) \log p\left(x_{i}\right)-p\left(x_{i}\right) \log q\left(x_{i}\right)\right] DKL(p∥q)=i=1∑N[p(xi)logp(xi)−p(xi)logq(xi)]
结合以上两个步骤,最终得到软策略迭代算法,但只适用于离散动作和状态空间,想要处理连续的动作和状态空间,接下来引入SAC算法。
3、SAC算法
-
Value Network
本来根据上面公式,值函数和Q函数是有关系的,因此我们没有必要去估计值函数,但是在实际操作中发现用单独的网络估计值函数可以稳定训练,它的loss是:
J V ( ψ ) = E s t ∼ D [ 1 2 ( V ψ ( s t ) − E a t ∼ π ϕ [ Q θ ( s t , a t ) − log π ϕ ( a t ∣ s t ) ] ) 2 ] J_{V}(\psi)=\mathbb{E}_{\mathbf{s}_{t} \sim \mathcal{D}}\left[\frac{1}{2}\left(V_{\psi}\left(\mathbf{s}_{t}\right)-\mathbb{E}_{\mathbf{a}_{t} \sim \pi_{\phi}}\left[Q_{\theta}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)-\log \pi_{\phi}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)\right]\right)^{2}\right] JV(ψ)=Est∼D[21(Vψ(st)−Eat∼πϕ[Qθ(st,at)−logπϕ(at∣st)])2]
其梯度可以用一个无偏的估计器:
∇ ^ ψ J V ( ψ ) = ∇ ψ V ψ ( s t ) ( V ψ ( s t ) − Q θ ( s t , a t ) + log π ϕ ( a t ∣ s t ) ) \hat{\nabla}_{\psi} J_{V}(\psi)=\nabla_{\psi} V_{\psi}\left(\mathbf{s}_{t}\right)\left(V_{\psi}\left(\mathbf{s}_{t}\right)-Q_{\theta}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)+\log \pi_{\phi}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)\right) ∇^ψJV(ψ)=∇ψVψ(st)(Vψ(st)−Qθ(st,at)+logπϕ(at∣st))
其中的动作是从现在的策略中采样而不是replay buffer。
-
Soft-Q Network
soft Q函数参数可以通过最小化soft Bellman residual来得到:
J Q ( θ ) = E ( s t , a t ) ∼ D [ 1 2 ( Q θ ( s t , a t ) − Q ^ ( s t , a t ) ) 2 ] J_{Q}(\theta)=\mathbb{E}_{\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right) \sim \mathcal{D}}\left[\frac{1}{2}\left(Q_{\theta}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)-\hat{Q}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)\right)^{2}\right] JQ(θ)=E(st,at)∼D[21(Qθ(st,at)−Q^(st,at))2]
其中, Q ^ ( s t , a t ) = r ( s t , a t ) + γ E s t + 1 ∼ p [ V ψ ˉ ( s t + 1 ) ] \hat{Q}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)=r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)+\gamma \mathbb{E}_{\mathbf{s}_{t+1} \sim p}\left[V_{\bar{\psi}}\left(\mathbf{s}_{t+1}\right)\right] Q^(st,at)=r(st,at)+γEst+1∼p[Vψˉ(st+1)]
其中, V ψ ˉ V_{\bar{\psi}} Vψˉ 是Deep Q Network中的目标值网络(target value network)。Q函数的梯度:
∇ ^ θ J Q ( θ ) = ∇ θ Q θ ( a t , s t ) ( Q θ ( s t , a t ) − r ( s t , a t ) − γ V ψ ˉ ( s t + 1 ) ) \hat{\nabla}_{\theta} J_{Q}(\theta)=\nabla_{\theta} Q_{\theta}\left(\mathbf{a}_{t}, \mathbf{s}_{t}\right)\left(Q_{\theta}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)-r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)-\gamma V_{\bar{\psi}}\left(\mathbf{s}_{t+1}\right)\right) ∇^θJQ(θ)=∇θQθ(at,st)(Qθ(st,at)−r(st,at)−γVψˉ(st+1))
-
Policy Network
策略参数可以通过最小化KL散度来获得:
J π ( ϕ ) = E s t ∼ D [ D K L ( π ϕ ( ⋅ ∣ s t ) ∥ exp ( Q θ ( s t , ⋅ ) ) Z θ ( s t ) ) ] J_{\pi}(\phi)=\mathbb{E}_{\mathbf{s}_{t} \sim \mathcal{D}}\left[\mathrm{D}_{\mathrm{KL}}\left(\pi_{\phi}\left(\cdot \mid \mathbf{s}_{t}\right) \| \frac{\exp \left(Q_{\theta}\left(\mathbf{s}_{t}, \cdot\right)\right)}{Z_{\theta}\left(\mathbf{s}_{t}\right)}\right)\right] Jπ(ϕ)=Est∼D[DKL(πϕ(⋅∣st)∥Zθ(st)exp(Qθ(st,⋅)))]这里我们使用 reparameterization trick来采样动作:
a t = f ϕ ( ϵ t ; s t ) \mathbf{a}_{t}=f_{\phi}\left(\epsilon_{t} ; \mathbf{s}_{t}\right) at=fϕ(ϵt;st)
其中, ϵ t \epsilon_{t} ϵt 为高斯分布, f f f是一个关于 ϕ \phi ϕ 的表达式,整理得到:
J π ( ϕ ) = E s t ∼ D , ϵ t ∼ N [ log π ϕ ( f ϕ ( ϵ t ; s t ) ∣ s t ) − Q θ ( s t , f ϕ ( ϵ t ; s t ) ) ] J_{\pi}(\phi)=\mathbb{E}_{\mathbf{s}_{t} \sim \mathcal{D}, \epsilon_{t} \sim \mathcal{N}}\left[\log \pi_{\phi}\left(f_{\phi}\left(\epsilon_{t} ; \mathbf{s}_{t}\right) \mid \mathbf{s}_{t}\right)-Q_{\theta}\left(\mathbf{s}_{t}, f_{\phi}\left(\epsilon_{t} ; \mathbf{s}_{t}\right)\right)\right] Jπ(ϕ)=Est∼D,ϵt∼N[logπϕ(fϕ(ϵt;st)∣st)−Qθ(st,fϕ(ϵt;st))]
∇ ^ ϕ J π ( ϕ ) = ∇ ϕ log π ϕ ( a t ∣ s t ) + ( ∇ a t log π ϕ ( a t ∣ s t ) − ∇ a t Q ( s t , a t ) ) ∇ ϕ f ϕ ( ϵ t ; s t ) \begin{aligned} &\hat{\nabla}_{\phi} J_{\pi}(\phi)=\nabla_{\phi} \log \pi_{\phi}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right) \\ &\quad+\left(\nabla_{\mathbf{a}_{t}} \log \pi_{\phi}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)-\nabla_{\mathbf{a}_{t}} Q\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)\right) \nabla_{\phi} f_{\phi}\left(\epsilon_{t} ; \mathbf{s}_{t}\right) \end{aligned} ∇^ϕJπ(ϕ)=∇ϕlogπϕ(at∣st)+(∇atlogπϕ(at∣st)−∇atQ(st,at))∇ϕfϕ(ϵt;st)
4、第二篇文章改进
前面的SAC中,我们只是人为给定一个固定的temperature α \alpha α 作为entropy的权重,但实际上由于reward的不断变化,采用固定的temperature并不合理,会让整个训练不稳定,因此,有必要能够自动调节这个temperature。当policy探索到新的区域时,最优的action还不清楚,应该调到temperature 去探索更多的空间。当某一个区域已经探索得差不多,最优的action基本确定了,那么这个temperature就可以减小。
构造一个带约束的优化问题,让平均的entropy权重是有限制的,但是在不同的state下entropy的权重是可变的,即
max π 0 : T E ρ π [ ∑ t = 0 T r ( s t , a t ) ] s.t. E ( s t , a t ) ∼ ρ π [ − log ( π t ( a t ∣ s t ) ) ] ≥ H ∀ t \max _{\pi_{0: T}} \mathbb{E}_{\rho_{\pi}}\left[\sum_{t=0}^{T} r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)\right] \text { s.t. } \mathbb{E}_{\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right) \sim \rho_{\pi}}\left[-\log \left(\pi_{t}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)\right)\right] \geq \mathcal{H} \forall t π0:TmaxEρπ[t=0∑Tr(st,at)] s.t. E(st,at)∼ρπ[−log(πt(at∣st))]≥H∀t
J ( α ) = E a t ∼ π t [ − α log π t ( a t ∣ s t ) − α H ‾ ] J(\alpha)=\mathbb{E}_{\mathbf{a}_{t} \sim \pi_{t}}\left[-\alpha \log \pi_{t}\left(\mathbf{a}_{t} \mid \mathbf{s}_{t}\right)-\alpha \overline{\mathcal{H}}\right] J(α)=Eat∼πt[−αlogπt(at∣st)−αH]
为了更快速稳定的训练,引入了两个Q网络,然后每次选择Q值小的一个作为target Q值。
总结来说:
- 去掉了Value Netowrk;
- 用两个Q Network;
- 将熵的系数 α \alpha α 作为一个变量,在程序中自动调节。
5、代码实现
文章1:
文章2:
这篇关于深度强化学习算法之SAC算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!