强化学习 SAC算法 对数概率推导
先上原论文:
首先对公式 ( 20 ) (20) (20) 做推导。
公式
(
20
)
(20)
(20) 的数据流应该是这样的:
s
→
π
(
u
∣
s
)
→
u
→
a
=
tanh
(
u
)
→
a
\mathbf{s}\rightarrow \pi(\mathbf{u}|\mathbf{s}) \rightarrow \mathbf{u}\rightarrow \mathbf{a}=\tanh(\mathbf{u})\rightarrow \mathbf{a}
s→π(u∣s)→u→a=tanh(u)→a
求
a
\mathbf{a}
a 的概率密度,我们先可以这样写出
a
\mathbf{a}
a 的分布函数表达式:
P
r
A
(
a
)
=
P
r
(
A
≤
a
)
(
A
表示随机变量
,
a
表示
A
的某个观察值
,
也就是实际产生的“
a
c
t
i
o
n
”
)
=
P
r
(
tanh
(
U
)
≤
a
)
(
带入
tanh
函数
,
将随机变量
A
用
U
的函数来表示
)
=
P
r
(
U
≤
tanh
−
1
(
a
)
)
(
求解
P
r
里面的不等式
,
tanh
的反函数用
tanh
−
1
表示
)
=
F
U
(
tanh
−
1
(
a
)
)
(
根据分布函数的定义
,
化简这个表达式
)
(1)
\begin{align*} Pr_{A}(a) &= Pr(A\le a) \\ &\ (A表示随机变量,a表示A的某个观察值,也就是实际产生的“action”) \\ &= Pr(\tanh(U)\le a) \\ &\ (带入\tanh 函数,将随机变量A用U的函数来表示) \\ &= Pr(U\le\tanh^{-1}(a)) \\ &\ (求解Pr里面的不等式,\tanh 的反函数用\tanh^{-1}表示) \\ &= F_{U}(\tanh^{-1}(a)) \\ &\ (根据分布函数的定义,化简这个表达式) \\ \end{align*}\tag{1}
PrA(a)=Pr(A≤a) (A表示随机变量,a表示A的某个观察值,也就是实际产生的“action”)=Pr(tanh(U)≤a) (带入tanh函数,将随机变量A用U的函数来表示)=Pr(U≤tanh−1(a)) (求解Pr里面的不等式,tanh的反函数用tanh−1表示)=FU(tanh−1(a)) (根据分布函数的定义,化简这个表达式)(1)
求
a
\mathbf{a}
a 的概率密度,我们可以由
a
\mathbf{a}
a 的分布函数求导得到:
p
(
A
)
=
d
P
r
A
(
a
)
d
a
=
d
F
U
(
tanh
−
1
(
a
)
)
d
a
(
代入
(
1
)
中的表达式
)
=
d
F
U
(
tanh
−
1
(
a
)
)
d
tanh
−
1
(
a
)
⋅
d
tanh
−
1
(
a
)
d
a
(
对表达式做链式求导
)
=
d
F
U
(
u
)
d
u
⋅
d
u
d
a
(
这是因为
a
=
tanh
(
u
)
,
则
u
=
tanh
−
1
(
a
)
)
=
p
(
U
)
⋅
(
det
d
a
d
u
)
−
1
(
左边一部分根据概率密度函数的定义
,
右边一部分根据:
)
(
“反函数的导数等于原函数导数的倒数”
)
(
另外
,
向量对向量求导得到的结果是矩阵形式
,
因为
a
=
tanh
(
u
)
)
(
是逐个对应元素做计算
,
那么得到的矩阵就是一个对角阵
)
(
最后的结果是:原函数的导数的对角阵的逆
)
=
μ
(
u
∣
s
)
⋅
∣
det
d
a
d
u
∣
−
1
(2)
\begin{align*} p(A) &= \frac{\mathbf{d}Pr_{A}(\mathbf{a})}{\mathbf{d}\mathbf{a}} \\ &= \frac{\mathbf{d}F_{U}(\tanh^{-1}(\mathbf{a}))}{\mathbf{d}\mathbf{a}} \\ &\ (代入(1)中的表达式) \\ &= \frac{\mathbf{d}F_{U}(\tanh^{-1}(\mathbf{a}))}{\mathbf{d}\tanh^{-1}(\mathbf{a})}\cdot\frac{\mathbf{d}\tanh^{-1}(\mathbf{a})}{\mathbf{d}\mathbf{a}} \\ &\ (对表达式做链式求导) \\ &= \frac{\mathbf{d}F_{U}(\mathbf{u})}{\mathbf{d}\mathbf{u}}\cdot\frac{\mathbf{d}\mathbf{u}}{\mathbf{d}\mathbf{a}} \\ &\ (这是因为\mathbf{a}=\tanh(\mathbf{u}),则\mathbf{u}=\tanh^{-1}(\mathbf{a})) \\ &= p(U)\cdot\big(\det\frac{\mathbf{d}\mathbf{a}}{\mathbf{d}\mathbf{u}}\big)^{-1} \\ &\ (左边一部分根据概率密度函数的定义,右边一部分根据:) \\ &\ (“反函数的导数等于原函数导数的倒数”) \\ &\ (另外,向量对向量求导得到的结果是矩阵形式,因为\mathbf{a}=\tanh(\mathbf{u})) \\ &\ (是逐个对应元素做计算,那么得到的矩阵就是一个对角阵) \\ &\ (最后的结果是:原函数的导数的对角阵的逆) \\ &= \mu(\mathbf{u}|\mathbf{s})\cdot \big|\det\frac{\mathbf{d}\mathbf{a}}{\mathbf{d}\mathbf{u}}\big|^{-1} \\ \end{align*}\tag{2}
p(A)=dadPrA(a)=dadFU(tanh−1(a)) (代入(1)中的表达式)=dtanh−1(a)dFU(tanh−1(a))⋅dadtanh−1(a) (对表达式做链式求导)=dudFU(u)⋅dadu (这是因为a=tanh(u),则u=tanh−1(a))=p(U)⋅(detduda)−1 (左边一部分根据概率密度函数的定义,右边一部分根据:) (“反函数的导数等于原函数导数的倒数”) (另外,向量对向量求导得到的结果是矩阵形式,因为a=tanh(u)) (是逐个对应元素做计算,那么得到的矩阵就是一个对角阵) (最后的结果是:原函数的导数的对角阵的逆)=μ(u∣s)⋅
detduda
−1(2)
我们得到了论文的公式
(
20
)
(20)
(20) ,但是后面导数的对角阵的逆还需要进一步处理。
y
=
tanh
(
x
)
=
sinh
(
x
)
cosh
(
x
)
y
′
=
cosh
2
(
x
)
−
sinh
2
(
x
)
cosh
2
(
x
)
=
1
−
tanh
2
(
x
)
其中,
[
cosh
(
x
)
]
′
=
sinh
(
x
)
,
[
sinh
(
x
)
]
′
=
cosh
(
x
)
\begin{align*} y&=\tanh(x)=\frac{\sinh(x)}{\cosh(x)}\tag{3} \\ y^{\prime}&=\frac{\cosh^{2}(x)-\sinh^{2}(x)}{\cosh^{2}(x)} \\ &= 1-\tanh^{2}(x)\tag{4} \\ &其中,[\cosh(x)]^{\prime}=\sinh(x),[\sinh(x)]^{\prime}=\cosh(x) \end{align*}
yy′=tanh(x)=cosh(x)sinh(x)=cosh2(x)cosh2(x)−sinh2(x)=1−tanh2(x)其中,[cosh(x)]′=sinh(x),[sinh(x)]′=cosh(x)(3)(4)
得到了这样一个等式之后,我们可以把这个等式用到向量之间:
∣
det
d
a
d
u
∣
−
1
=
∣
d
a
1
d
u
1
⋱
d
a
n
d
u
n
∣
−
1
=
∣
1
−
tanh
2
(
u
1
)
⋱
1
−
tanh
2
(
u
n
)
∣
−
1
=
1
(
1
−
tanh
2
(
u
1
)
)
⋯
(
1
−
tanh
2
(
u
n
)
)
(5)
\begin{align*} &\ \ \ \ \big|\det\frac{\mathbf{d}\mathbf{a}}{\mathbf{d}\mathbf{u}}\big|^{-1} \\ &= \begin{vmatrix} \frac{\mathbf{d}a_{1}}{\mathbf{d}u_{1}} & & \\ & \ddots & \\ & & \frac{\mathbf{d}a_{n}}{\mathbf{d}u_{n}} \end{vmatrix}^{-1} \\ &= \begin{vmatrix} 1-\tanh^{2}(u_{1}) & & \\ & \ddots & \\ & & 1-\tanh^{2}(u_{n}) \end{vmatrix}^{-1} \\ &=\frac{1}{( 1-\tanh^{2}(u_{1}))\cdots(1-\tanh^{2}(u_{n}))} \end{align*}\tag{5}
detduda
−1=
du1da1⋱dundan
−1=
1−tanh2(u1)⋱1−tanh2(un)
−1=(1−tanh2(u1))⋯(1−tanh2(un))1(5)
最后计算对数概率密度:
log
π
(
a
∣
s
)
=
log
μ
(
u
∣
s
)
+
log
1
(
1
−
tanh
2
(
u
1
)
)
⋯
(
1
−
tanh
2
(
u
n
)
)
(
把公式
(
5
)
带进来并根据对数等式拆分
)
=
log
μ
(
u
∣
s
)
−
log
(
1
−
tanh
2
(
u
1
)
)
−
⋯
log
(
1
−
tanh
2
(
u
n
)
)
(
根据对数等式拆分
)
=
log
μ
(
u
∣
s
)
−
∑
i
=
1
n
log
(
1
−
tanh
2
(
u
i
)
)
(
化简一下
)
(6)
\begin{align*} \log\pi(\mathbf{a}|\mathbf{s}) &= \log\mu(\mathbf{u}|\mathbf{s})+\log\frac{1}{( 1-\tanh^{2}(u_{1}))\cdots(1-\tanh^{2}(u_{n}))} \\ &\ (把公式(5)带进来并根据对数等式拆分) \\ &= \log\mu(\mathbf{u}|\mathbf{s}) - \log( 1-\tanh^{2}(u_{1}))-\cdots\log( 1-\tanh^{2}(u_{n})) \\ &\ (根据对数等式拆分) \\ &= \log\mu(\mathbf{u}|\mathbf{s}) -\sum\limits_{i=1}^{n}\log(1-\tanh^{2}(u_{i})) \\ &\ (化简一下) \\ \end{align*}\tag{6}
logπ(a∣s)=logμ(u∣s)+log(1−tanh2(u1))⋯(1−tanh2(un))1 (把公式(5)带进来并根据对数等式拆分)=logμ(u∣s)−log(1−tanh2(u1))−⋯log(1−tanh2(un)) (根据对数等式拆分)=logμ(u∣s)−i=1∑nlog(1−tanh2(ui)) (化简一下)(6)
最后我想说的是:
-
这就是为什么在SAC的策略更新代码中,计算重采样之后的概率密度,还要再加上一串很奇怪的项。
这一串很奇怪的项就是公式 ( 6 ) (6) (6) 的第二项。
-
一般是重采样之后通过 tanh ( ) \tanh() tanh() 计算实际作用于环境的动作,然后对这个动作按元素做平方计算,最后用数字1减去这个平方计算值(内含广播机制),然后与前面的重采样直接计算的概率密度相减!
-
为什么会有 ϵ \epsilon ϵ 小量?我认为这是因为公式 ( 5 ) (5) (5) 的除法导致的。小量一般是10的-7次方,其实是忽略不计的。
OK,清楚了,撒花~~~