Policy Gradient和Q-learning可以说是model-free RL的两大阵营。前者是off-line, on-policy的方法,后者是on-line, off-policy的方法。前者是策略迭代,关心的是策略网络的参数;后者是值迭代,关心的是值网络的输出。随着RL的不断发展,这两类方法在不断交错领跑的过程中交汇融合。
本文重点介绍Policy Gradient的方法,从其“初心”出发,通过一步步推导来讲述新的算法。
Policy Gradient
如果你已经了解了DQN,也许会想到这样一个问题:为什么一定要用值函数来做决策(当然这个想法也是很自然的),为什么不绕过值函数直接用神经网络来表示策略呢?
知乎上有关于这个问题的讨论。
让我们再退一步,我们想要的东西到底是什么呢?其实就是让我们采取策略的期望收益最大化:
θ
∗
=
a
r
g
m
a
x
θ
E
τ
∼
p
θ
(
τ
)
r
(
τ
)
\theta^{*} = \underset{\theta}{argmax}E_{\tau \sim p_{\theta}(\tau)}r(\tau)
θ∗=θargmaxEτ∼pθ(τ)r(τ)
τ \tau τ表示一条当前策略所影响的样本轨迹, p θ ( τ ) p_{\theta}(\tau) pθ(τ)是样本轨迹 τ \tau τ出现的概率。
来进一步写一下
r
(
τ
)
r(\tau)
r(τ)和
p
θ
(
τ
)
p_{\theta}(\tau)
pθ(τ)的展开式。
r
(
τ
)
=
∑
t
r
(
s
t
,
a
t
)
r(\tau) = \sum_{t}r(s_{t}, a_{t})
r(τ)=t∑r(st,at)
p
θ
(
τ
)
=
p
(
s
1
)
∏
t
π
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
p_{\theta}(\tau) = p(s_{1}) \prod_{t}\pi_{\theta}(a_{t}|s_{t})p(s_{t+1}|s_{t}, a_{t})
pθ(τ)=p(s1)t∏πθ(at∣st)p(st+1∣st,at)
注意,这里的 τ \tau τ和 t t t的含义不同, τ \tau τ是样本轨迹, t t t是样本轨迹上的时间。仔细看 p θ ( τ ) p_{\theta}(\tau) pθ(τ)我们就会发现,将概率展开以后实际上我们的策略可以影响的只有 π θ ( a t ∣ s t ) \pi_{\theta}(a_{t}|s_{t}) πθ(at∣st),也就是在状态 s t s_{t} st下采取动作 a t a_{t} at的概率。这就是我们策略的数学表示。
REINFORCE
现在我们就可以再向前走一步,按照机器学习的一般思路,我已经定义好了我的目标函数
J
(
θ
)
J(\theta)
J(θ),如果可以求出它的梯度
▽
θ
J
(
θ
)
\triangledown_{\theta}J(\theta)
▽θJ(θ),我们就可以进行梯度下降了。为了求梯度,我们将
J
(
θ
)
J(\theta)
J(θ)改写成积分的形式:
J
(
θ
)
=
E
τ
∼
p
θ
(
τ
)
r
(
τ
)
=
∫
p
θ
(
τ
)
r
(
τ
)
d
τ
J(\theta) = E_{\tau \sim p_{\theta}(\tau)}r(\tau) =\int p_{\theta}(\tau)r(\tau)d\tau
J(θ)=Eτ∼pθ(τ)r(τ)=∫pθ(τ)r(τ)dτ
▽
θ
J
(
θ
)
=
∫
▽
θ
p
θ
(
τ
)
r
(
τ
)
d
τ
=
∫
p
θ
(
τ
)
▽
θ
l
o
g
p
θ
(
τ
)
r
(
τ
)
d
τ
=
E
τ
∼
p
θ
(
τ
)
▽
θ
l
o
g
p
θ
(
τ
)
r
(
τ
)
\triangledown_{\theta}J(\theta) = \int \triangledown_{\theta}p_{\theta}(\tau)r(\tau)d\tau = \int p_{\theta}(\tau) \triangledown_{\theta}\mathrm{log}p_{\theta}(\tau)r(\tau)d\tau = E_{\tau \sim p_{\theta}(\tau)}\triangledown_{\theta}\mathrm{log}p_{\theta}(\tau)r(\tau)
▽θJ(θ)=∫▽θpθ(τ)r(τ)dτ=∫pθ(τ)▽θlogpθ(τ)r(τ)dτ=Eτ∼pθ(τ)▽θlogpθ(τ)r(τ)
这里用到一个小技巧, ▽ θ p θ ( τ ) = p θ ( τ ) ▽ θ p θ ( τ ) p θ ( τ ) = p θ ( τ ) ▽ θ l o g p θ ( τ ) \triangledown_{\theta}p_{\theta}(\tau) = p_{\theta}(\tau) \frac{\triangledown_{\theta}p_{\theta}(\tau)}{p_{\theta}(\tau)} =p_{\theta}(\tau) \triangledown_{\theta} \mathrm{log}p_{\theta}(\tau) ▽θpθ(τ)=pθ(τ)pθ(τ)▽θpθ(τ)=pθ(τ)▽θlogpθ(τ),这样做的目的是把 p θ ( τ ) p_{\theta}(\tau) pθ(τ)重新拿到外边来,就可以再写成期望的形式了。
现在公式中的自变量仍然是 τ \tau τ,实际应用中我们不可能直接对 τ \tau τ求导,因此我们再把 p θ ( τ ) p_{\theta}(\tau) pθ(τ)带进来看看能不能把 τ \tau τ替换为我们可以操作的 s t , a t s_{t}, a_{t} st,at
▽ θ l o g p θ ( τ ) = ▽ θ l o g p ( s 1 ) + ∑ t ▽ θ l o g π θ ( a t ∣ s t ) + ∑ t ▽ θ l o g p ( s t + 1 ∣ s t , a t ) = ∑ t ▽ θ l o g π θ ( a t ∣ s t ) \triangledown_{\theta} \mathrm{log}p_{\theta}(\tau) = \triangledown_{\theta} \mathrm{log}p(s_{1}) + \sum_{t} \triangledown_{\theta} \mathrm{log} \pi_{\theta}(a_{t} | s_{t}) + \sum_{t} \triangledown_{\theta} \mathrm{log}p(s_{t+1} | s_{t}, a_{t}) = \sum_{t}\triangledown_{\theta} \mathrm{log} \pi_{\theta}(a_{t} | s_{t}) ▽θlogpθ(τ)=▽θlogp(s1)+t∑▽θlogπθ(at∣st)+t∑▽θlogp(st+1∣st,at)=t∑▽θlogπθ(at∣st)
▽ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ▽ θ l o g π θ ( a t ∣ s t ) ] [ ∑ t r ( s t , a t ) ] \triangledown_{\theta}J(\theta) = E_{\tau \sim p_{\theta}(\tau)}[\sum_{t}\triangledown_{\theta} \mathrm{log} \pi_{\theta}(a_{t} | s_{t})][\sum_{t}r(s_{t}, a_{t})] ▽θJ(θ)=Eτ∼pθ(τ)[t∑▽θlogπθ(at∣st)][t∑r(st,at)]
于是,我们也就得到了我们的第一个算法REINFORCE:
- 用参数为 θ \theta θ的策略 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ(a∣s)采样N条样本轨迹 τ i \tau_{i} τi,每条轨迹都是独立的样本
- 估计梯度
▽ θ J ( θ ) = 1 N ∑ n = 1 N ∑ t = 1 T [ ▽ θ [ l o g π θ ( a t , n ∣ s t , n ) r ( τ n ) ] ] \triangledown_{\theta}J(\theta) = \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} [\triangledown_{\theta} [\mathrm{log} \pi_{\theta}(a_{t,n} | s_{t,n})r(\tau_{n})]] ▽θJ(θ)=N1∑n=1N∑t=1T[▽θ[logπθ(at,n∣st,n)r(τn)]]
在这里我们还要使用一个重要的技巧: ▽ θ J ( θ ) = 1 N ∑ i [ ∑ t [ ▽ θ l o g π θ ( a t ∣ s t ) ∑ t r ( s t , a t ) ] \triangledown_{\theta}J(\theta) = \frac{1}{N} \sum_{i} [\sum_{t} [ \triangledown_{\theta} \mathrm{log} \pi_{\theta}(a_{t} | s_{t}) \sum_{t}r(s_{t}, a_{t})] ▽θJ(θ)=N1∑i[∑t[▽θlogπθ(at∣st)∑tr(st,at)]——在下一部分有详细推导。原理其实就是我们执行[ r ( τ n ) + b r(\tau_{n})+b r(τn)+b]来代替 r ( τ n ) r(\tau_{n}) r(τn)不会对 ▽ θ J ( θ ) \triangledown_{\theta}J(\theta) ▽θJ(θ)的结果产生影响,前提是b和 π θ ( a t , s t ) \pi_{\theta}(a_{t}, s_{t}) πθ(at,st)没有任何关系。 - 更新参数 θ ← θ + α ▽ θ J ( θ ) \theta \leftarrow \theta + \alpha \triangledown_{\theta} J(\theta) θ←θ+α▽θJ(θ)
- 重复上述步骤
一个popular的选项对于 π θ ( a ∣ s ) \pi_{\theta}(a | s) πθ(a∣s)来说,是高斯策略模型,即策略参数 π \pi π是由均值 μ \mu μ和方差 σ 2 \sigma^{2} σ2构成的。
π θ ( a ∣ s ) → π ( a ∣ s , μ , σ ) = 1 σ 2 π e x p ( − ( a − μ T ϕ ( s ) ) 2 2 σ 2 ) \pi_{\theta}(a | s) \rightarrow \pi(a | s, \mu, \sigma) = \frac{1}{\sigma \sqrt{2 \pi}} \mathrm{exp} (-\frac{(a-\mu^{T} \phi(s))^2}{2 \sigma^2}) πθ(a∣s)→π(a∣s,μ,σ)=σ2π1exp(−2σ2(a−μTϕ(s))2)
此处,
ϕ
(
s
)
\phi (s)
ϕ(s)表示基函数(the basis function)
▽
μ
l
o
g
π
(
a
∣
s
,
μ
,
σ
)
=
a
−
μ
T
ϕ
(
s
)
σ
2
ϕ
(
s
)
\triangledown_{\mu} \mathrm{log} \pi (a | s, \mu, \sigma) = \frac{a - \mu^{T} \phi(s)}{\sigma^{2}} \phi(s)
▽μlogπ(a∣s,μ,σ)=σ2a−μTϕ(s)ϕ(s)
▽
σ
l
o
g
π
(
a
∣
s
,
μ
,
σ
)
=
(
a
−
μ
T
ϕ
(
s
)
)
2
−
σ
2
σ
3
\triangledown_{\sigma} \mathrm{log} \pi (a | s, \mu, \sigma) = \frac{(a - \mu^{T} \phi(s))^2 - \sigma^2}{\sigma^{3}}
▽σlogπ(a∣s,μ,σ)=σ3(a−μTϕ(s))2−σ2
Actor-Critic
REINFORCE方法有很多缺点,首先它的效率非常低,一个重要原因是方差非常大。 ∑ t r ( s t , a t ) \sum_{t}r(s_{t}, a_{t}) ∑tr(st,at)是每一次仿真的结果,如果效果好了就会对这一次仿真的所有决策奖励,效果不好了就会全部惩罚,这显然是有问题的。
让我们再来好好看一下 ▽ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ▽ θ l o g π θ ( a t ∣ s t ) ] [ ∑ t r ( s t , a t ) ] \triangledown_{\theta} J (\theta) = E_{\tau \sim p_{\theta}(\tau)} [\sum_{t} \triangledown_{\theta} \mathrm{log} \pi_{\theta}(a_{t}|s_{t})][\sum_{t}r(s_{t}, a_{t})] ▽θJ(θ)=Eτ∼pθ(τ)[∑t▽θlogπθ(at∣st)][∑tr(st,at)]
如果
t
2
>
t
1
t_{2} > t_{1}
t2>t1,
π
θ
(
a
t
2
∣
s
t
2
)
\pi_{\theta}(a_{t_{2}}|s_{t_{2}})
πθ(at2∣st2)理论上是不会对
∑
t
=
0
t
1
r
(
s
t
,
a
t
)
\sum_{t=0}^{t_{1}}r(s_{t}, a_{t})
∑t=0t1r(st,at)产生影响的,因此,上个式子可以改进成为:
▽
θ
J
θ
(
θ
)
=
E
τ
∼
p
θ
(
τ
)
[
∑
t
▽
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
∑
t
′
=
t
r
(
s
t
′
,
a
t
′
)
]
=
E
τ
∼
p
θ
(
τ
)
[
∑
t
▽
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
Q
(
s
t
,
a
t
)
]
\triangledown_{\theta}J_{\theta}(\theta) = E_{\tau \sim p_{\theta}(\tau)}[\sum_{t} \triangledown_{\theta}\mathrm{log}\pi_{\theta}(a_{t}|s_{t})\sum_{t'=t}r(s_{t'},a_{t'})] = E_{\tau \sim p_{\theta}(\tau)}[\sum_{t} \triangledown_{\theta}\mathrm{log}\pi_{\theta}(a_{t}|s_{t})Q(s_{t}, a_{t})]
▽θJθ(θ)=Eτ∼pθ(τ)[t∑▽θlogπθ(at∣st)t′=t∑r(st′,at′)]=Eτ∼pθ(τ)[t∑▽θlogπθ(at∣st)Q(st,at)]
实际上, Q t = ∑ t ′ = t r ( s t ′ , a t ′ ) Q_{t} = \sum_{t'=t}r(s_{t'}, a_{t'}) Qt=∑t′=tr(st′,at′)和我们对Q-value的定义非常接近了,都是从时刻 t t t开始到结束时的reward收益。
我们已经减小一些方差了,能不能再减小吗?对于随机变量
X
X
X,其方差
D
X
=
E
X
2
−
(
E
X
)
2
DX = EX^{2} - (EX)^{2}
DX=EX2−(EX)2,如果
E
X
2
EX^{2}
EX2比较小的话,那么方差就会小了。自然就想到给
r
(
τ
)
r(\tau)
r(τ)减去一个值,即
r
(
τ
)
←
r
(
τ
)
−
b
r(\tau) \leftarrow r(\tau) - b
r(τ)←r(τ)−b,选择合适的
b
b
b(比如
1
N
∑
i
r
(
τ
i
)
\frac{1}{N}\sum_{i}r(\tau_{i})
N1∑ir(τi)),那么方差就会变小了。方差小了,结果会不会变呢?
答案是不变的,我们来证明一下:
E
[
▽
θ
l
o
g
π
θ
(
τ
)
b
]
=
∫
π
θ
(
τ
)
▽
θ
l
o
g
π
θ
(
τ
)
b
d
τ
=
∫
▽
θ
π
θ
(
τ
)
b
d
τ
=
b
∫
▽
θ
π
θ
(
τ
)
d
τ
=
b
▽
θ
∫
π
θ
(
τ
)
d
τ
=
b
▽
θ
1
=
0
E[\triangledown_{\theta} \mathrm{log} \pi_{\theta}(\tau)b] = \int \pi_{\theta}(\tau) \triangledown_{\theta} \mathrm{log} \pi_{\theta}(\tau) b d\tau = \int \triangledown_{\theta} \pi_{\theta}(\tau)bd\tau = b \int \triangledown_{\theta} \pi_{\theta}(\tau)d\tau = b \triangledown_{\theta} \int \pi_{\theta}(\tau)d\tau = b\triangledown_{\theta}1 = 0
E[▽θlogπθ(τ)b]=∫πθ(τ)▽θlogπθ(τ)bdτ=∫▽θπθ(τ)bdτ=b∫▽θπθ(τ)dτ=b▽θ∫πθ(τ)dτ=b▽θ1=0
所以只要 b b b本身是与 τ \tau τ无关的,那么我们就可以这样做!上面的证明是以 τ \tau τ为自变量的,其实当我们用 Q t Q_{t} Qt时一样可以推出这个结果。
b
b
b的选取就成为了新出现的问题。理论上可以推出一个最优的
b
b
b,不过应用中我们会用
V
t
V_{t}
Vt估计
b
b
b。也就是说用另外的一个网络来估计
Q
(
s
t
,
a
t
)
Q(s_{t}, a_{t})
Q(st,at),
V
t
=
E
a
t
∼
π
θ
(
a
t
∣
s
t
)
Q
(
s
t
,
a
t
)
V_{t} = E_{a_{t} \sim \pi_{\theta}(a_{t} | s_{t})}Q(s_{t}, a_{t})
Vt=Eat∼πθ(at∣st)Q(st,at),这样就有:
▽
θ
J
(
θ
)
=
E
τ
∼
p
θ
(
τ
)
[
∑
t
▽
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
]
\triangledown_{\theta}J(\theta) = E_{\tau \sim p_{\theta}(\tau)}[\sum_{t} \triangledown_{\theta} \mathrm{log}\pi_{\theta}(a_{t} | s_{t})]
▽θJ(θ)=Eτ∼pθ(τ)[t∑▽θlogπθ(at∣st)]
Actor-Critic是一个算法框架,这里给出其中一种算法流程:
- 用参数为 θ \theta θ的策略 π θ ( a ∣ s ) \pi_{\theta}(a | s) πθ(a∣s)采样N个状态转移
Reference:
https://blog.csdn.net/Pony017/article/details/81146374
https://www.cnblogs.com/wangxiaocvpr/p/6623078.html