不用重参数化技巧的SAC

不能直接求梯度的原因

SAC算法的目标函数:

(1)Jπ(ϕ)=Est∼D,at∼πϕ[logπϕ⁡(at|st)−1αQθ(st,at)]

如果按照机器学习通常的做法,就是将期望里的项目(即中括号里的项)对ϕ进行求导,然后对采样的样本取平均值。但这样是不对的,因为采样的过程at∼πϕ是和参数ϕ相关的,有待优化的参数,因此前面那种方法求的导不等于原始目标函数对ϕ的梯度。

注:策略梯度方法从来都不是直接能拿一个目标函数去自动求梯度,都是先用公式推出一个策略梯度来

使用REINFORCE的方法对策略梯度进行推导

(2)∇Jπ(ϕ)=Est∼D[∇ϕ∑atπϕ(at|st)(logπϕ⁡(at|st)−1αQθ(st,at))](3)=Est∼D[∑at[∇ϕπϕ(at|st)⋅(logπϕ⁡(at|st)−1αQθ(st,at))+πϕ(at|st)⋅∇ϕπϕ(at|st)πϕ(at|st)]](4)=Est∼D[∑at∇ϕπϕ(at|st)⋅(logπϕ⁡(at|st)−1αQθ(st,at)+1)](5)为了利用at∼πϕ采样,再改写(6)=Est∼D[∑atπϕ(at|st)∇ϕπϕ(at|st)πϕ(at|st)⋅(logπϕ⁡(at|st)−1αQθ(st,at)+1)](7)=Est∼D,at∼πϕ[∇log⁡πϕ(at|st)⋅(logπϕ⁡(at|st)−1αQθ(st,at)+1)]

上式中的+1可以去掉,因为∑at∇ϕπϕ(at|st)=∇ϕ∑atπϕ(at|st)=∇ϕ1=0

也可以将+1换成其他和a无关的量,不会影响梯度,相当于带baseline的梯度算法,例如:

(8)∇Jπ(ϕ)=Est∼D,at∼πϕ[∇log⁡πϕ(at|st)⋅(logπϕ⁡(at|st)−1αQθ(st,at)−1αVθ(st))]

经实验,重参数化和非重参数化的方法从性能和运算开销上基本一致,但剪不剪去上边的baseline效果差不少。

使用重参数技巧的SAC

使用重参数化技巧的原因

SAC的actor以state为输入,以μ和σ为输出,即根据状态s建立高斯分布,然后随机采样动作a∼N(μ,σ2),因为是随机采样,导致不能计算梯度∂a/∂μ和∂a/∂σ,所以采用重参数化技巧,即先采样一个常数ξ∼N(μ,σ2),然后a=μ+ξ⋅σ,则a仍然服从分布N(μ,σ2),且对μ和σ可导。

另外,由于式8中期望的at是从高斯策略N(μϕ(st),σϕ(st))中采样的,如果这个高斯分布很扁平的话,会导致梯度估计值方差很大,不利于学习。

因此,可以借鉴VAE中的Reparameterization Trick来减少方差,使学习更稳定。即:

(9)at=μϕ(st)+ϵσϕ(st)