作为一个新手,写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程,希望对大家能有所帮助。这个系列后面会不断更新,希望自己在2021年能保证平均每日一更的更新速度,主要是介绍强化学习的基础知识,后面也会更新强化学习的论文阅读专栏。本来是想每一篇多更新一点内容的,后面发现大家上CSDN主要是来提问的,就把很多拆分开来了(而且这样每天任务量也小一点哈哈哈哈偷懒大法)。但是我还是希望知识点能成系统,所以我在目录里面都好按章节系统地写的,而且在github上写成了书籍的形式,如果大家觉得有帮助,希望从头看的话欢迎关注我的github啊,谢谢大家!另外我还会分享深度学习-基础知识专栏以及深度学习-论文阅读专栏,很早以前就和小伙伴们花了很多精力写的,如果有对深度学习感兴趣的小伙伴也欢迎大家关注啊。大家一起互相学习啊!可能会有很多错漏,希望大家批评指正!不要高估一年的努力,也不要低估十年的积累,与君共勉!
TRPO实现策略上的单调提升(Monotonic Improvement with TRPO )
TRPO主要是针对我们前面提到的自然梯度法进行了两个方面的改进:1、用共轭梯度法简化求逆矩阵的高复杂度。 2、对KL divergence做的approximation中可能存在的约束违反的问题做了预防。
首先先来看第一个问题:
我们知道共轭梯度法可以用来求解
A
x
=
g
A x=g
Ax=g 这样的问题,而参数更新量也可以表示成这样的形式:
I
π
old
Δ
π
=
∇
π
L
π
old
(
π
;
θ
old
)
I_{\pi_{\text {old }}} \Delta \pi=\nabla_{\pi} L_{\pi_{\text {old }}}\left(\pi ; \theta_{\text {old }}\right)
Iπold Δπ=∇πLπold (π;θold )
幸运的是,在共轭梯度法的计算过程中我们只需要矩阵
A
A
A 参与运算,这样我们就不需要计算逆矩阵了。而且在共功梯度法的每一轮迭代中,它只参与了一次计算, 就是在计算的优化步长这一步:
α
k
=
r
k
T
r
k
p
k
T
A
p
k
\alpha_{k}=\frac{r_{k}^{T} r_{k}}{p_{k}^{T} A p_{k}}
αk=pkTApkrkTrk
虽然我们节省了一定的计算时间,但是我们依然要计算出矩阵
A
,
A,
A, 这个矩阵对深层神经网络这样复杂的模型来说同样是难以计算的,因此我们仍然需要找方法进行化简。幸运的是,矩阵
A
A
A 同旁边的方向向量
p
p
p 进行乘法会得到一个向量,这是简化算法的突破口。矩阵和向量乘积的结果的每一个元素都是由两个向量得到的,对应的计算公式为
(
A
p
)
[
i
]
=
∑
j
=
1
N
(
∂
∂
π
i
∂
∂
π
j
f
(
π
)
)
[
i
,
j
]
×
p
[
j
]
(A p)[i]=\sum_{j=1}^{N}\left(\frac{\partial}{\partial \pi_{i}} \frac{\partial}{\partial \pi_{j}} f(\pi)\right)[i, j] \times p[j]
(Ap)[i]=j=1∑N(∂πi∂∂πj∂f(π))[i,j]×p[j]
对于我们现在要解决的问题来说,求导和求和是可以互换的,所以得到
=
∂
∂
π
i
(
∑
j
=
1
N
∂
∂
π
j
f
(
π
)
[
j
]
×
p
[
j
]
)
=\frac{\partial}{\partial \pi_{i}}\left(\sum_{j=1}^{N} \frac{\partial}{\partial \pi_{j}} f(\pi)[j] \times p[j]\right)
=∂πi∂(j=1∑N∂πj∂f(π)[j]×p[j])
这样一来,我们先进行小括号内部的计算然后对结果进行求导,这样整体的复杂度将会大大降低。原本的二阶求导变成了求两次一阶导数,运算量得到了大幅降低,运算速度得到了很大的提升。解决了这个大问题,我们就可以使用共轭梯度法完成对优化方向的求解,令
∇
π
L
π
old
(
π
;
θ
old
)
\nabla_{\pi} L_{\pi_{\text {old }}}\left(\pi ; \theta_{\text {old }}\right)
∇πLπold (π;θold ) 表 示残差,令
1
N
∑
n
=
1
N
I
π
old
(
s
)
\frac{1}{N} \sum_{n=1}^{N} I_{\pi_{\text {old }}}(s)
N1∑n=1NIπold (s) 为共功梯度法的
A
,
A,
A, 就可以完成对优化方向
s
s
s 的计算。
接下来我们来解决第二个问题:对KL divergence做的approximation中可能存在的约束违反的问题做了预防。这是这个问题可以通过确定更新的最大步长来决定:由于有约束条件的存在,优化的最大步长一定存在, 这样约束条件相当于为我们划定了一个置信区域 ( Trust Region ),以保证我们的优化满足策略提升的要求。前面我们利用共轭梯度法求出了方 向
s
,
s,
s, 现在令最大步长为
β
,
\beta,
β, 也就是说,参数更新的最大值为
β
s
\beta s_{}
βs。 我们前面提到了问题的约束:
1
N
∑
n
=
1
N
[
1
2
Δ
θ
T
I
π
o
l
d
Δ
θ
]
⩽
ϵ
\frac{1}{N} \sum_{n=1}^{N}\left[\frac{1}{2} \Delta \theta^{\mathrm{T}} \boldsymbol{I}_{\pi_{\mathrm{old}}} \Delta \theta\right] \leqslant \epsilon
N1n=1∑N[21ΔθTIπoldΔθ]⩽ϵ
使用
β
s
\beta s
βs 代替
Δ
θ
,
\Delta \theta,
Δθ, 就可以得到
1
N
∑
n
=
1
N
[
1
2
(
β
s
)
T
I
π
o
l
d
(
s
)
(
β
s
)
]
=
1
2
β
2
1
N
∑
n
=
1
N
[
s
T
I
π
o
l
d
(
s
)
]
⩽
ϵ
\frac{1}{N} \sum_{n=1}^{N}\left[\frac{1}{2}(\beta s)^{\mathrm{T}} \boldsymbol{I}_{\pi_{o l d}}(s)(\beta \boldsymbol{s})\right]=\frac{1}{2} \beta^{2} \frac{1}{N} \sum_{n=1}^{N}\left[s^{\mathrm{T}} I_{\pi_{\mathrm{old}}}(s)\right] \leqslant \epsilon
N1n=1∑N[21(βs)TIπold(s)(βs)]=21β2N1n=1∑N[sTIπold(s)]⩽ϵ
将公式进行整理,可以得到
β
⩽
2
ϵ
1
N
∑
n
=
1
N
s
T
I
π
o
l
d
\beta \leqslant \sqrt{\frac{2 \epsilon}{\frac{1}{N} \sum_{n=1}^{N} s^{\mathrm{T}} \boldsymbol{I}_{\pi_{\mathrm{old}}}}}
β⩽N1∑n=1NsTIπold2ϵ
这样我们就知道了满足约束条件下的最大步长。与前面的方法类似,这里同样可 以将 Fisher 信息矩阵和右边的方向向量相乘,这样可以用两个一阶导计算代替本的 二阶导计算,方法和前面介绍的类似。
最后,我们使用 backtrack 的线搜索方法找到满足优化条件的合适步长,也就是找 到一个
π
(
θ
)
=
π
(
θ
old
+
Δ
θ
)
,
\pi(\theta)=\pi\left(\theta_{\text {old }}+\Delta \theta\right),
π(θ)=π(θold +Δθ), 使得它比
π
old
\pi_{\text {old }}
πold 产生足够的提升。具体方法为 : 先尝试以
β
\beta
β 为步长的情况下,策略提升是否可以满足,如果已经满足则步长选择结束; 如果无法满 足,则将步长减少一半,再进行测试,直到满足为止。如下图所示:
最后我们附上TRPO的伪码:
上一篇:强化学习的学习之路(四十六)2021-02-15自然梯度法实现策略上的单调提升(Monotonic Improvement with Natural gradient descent)
下一篇:强化学习的学习之路(四十八)2021-02-17 GAE(Generalized Advantage Estimation)