Fixed point理论是 Banach Space 中重要的理论工具。它常被用来讨论某个空间解的存在性,并由此发展出通过迭代的方式进行问题求解的算法。在[1]中,Fixed Piont理论处于整个算法的核心位置,是以分布式Bellman方程代替期望值Bellman方程的理论基础。本文将分成两个部分浅析之:第一部分 Fixed Point的迭代算法介绍;第二部分 Distributional 算法的不动点解析。
一、Fixed Point的迭代算法
首先要回顾以下 Fixed Point 原理,首先要给出的是收缩映射(Contraction)的定义[2]。
Definition 4.13(原书【2】的编号,下同)
A function
f
:
X
→
Y
f:X\to Y
f:X→Y between metric spaces is called a contraction if there exists a real number
α
\alpha
α with
0
≤
α
<
1
0\le \alpha \lt 1
0≤α<1, such that :
d
Y
(
f
(
x
1
)
,
f
(
x
2
)
)
≤
α
d
X
(
x
1
,
x
2
)
d_Y(f(x_1), f(x_2))\le \alpha d_X(x_1, x_2)
dY(f(x1),f(x2))≤αdX(x1,x2)
[简析]
所谓收缩(Contraction),指的是映射
f
f
f 的一个属性,映射前
x
1
,
x
2
∈
X
x_1,x_2\in X
x1,x2∈X 的距离
d
X
(
x
1
,
x
2
)
d_X(x_1, x_2)
dX(x1,x2) 大于映射后的距离
d
Y
(
f
(
x
1
)
,
f
(
x
2
)
)
d_Y(f(x_1), f(x_2))
dY(f(x1),f(x2))。这里要注意的是,原像空间
X
X
X 的测度定义可以与像空间
Y
Y
Y 的测度定义不同。
如上定义,若原像空间
X
X
X 与像空间
Y
Y
Y 相同,而且测度定义不变,且
X
X
X 是Banach 空间(即完备的赋范空间,Complete Normed Space),则有如下不动点定理:
Theorem 4.8 (Banach Fixed-Point Theorem)
If
X
X
X is a complete non-empty metric spaces and
f
:
X
→
X
f:X\to X
f:X→X is a contraction
, then
f
f
f has a unique fixed-point
x
0
∈
X
x_0\in X
x0∈X,
f
(
x
0
)
=
x
0
f(x_0)=x_0
f(x0)=x0。
Banach空间是一种特殊的非空、完备的测度空间(metric space),Fixed-Point Theorem 能够保证任意在Banach空间的contraction函数都有且只有一个
固定点(a unique fixed-point)。任取一个初始点
x
1
x_1
x1,经contraction映射后得到
x
2
x_2
x2,再将
x
2
x_2
x2 代入映射得到
x
3
x_3
x3,如此迭代,得到序列
{
x
n
}
n
≥
1
\{x_n\}_{n\ge 1}
{xn}n≥1,此序列收敛于
x
0
x_0
x0,即
x
n
→
x
0
x_n\to x_0
xn→x0。若求解问题可以转换成在banach空间内不动点问题,就可以通过此迭代方法进行求解。这便是 fixed point 的迭代算法。以下通过一个例子进行说明。
例:线性方程组求解的迭代算法
考虑线性方程组:
∑
i
=
1
n
a
k
i
x
i
=
b
k
(
k
=
1
,
2
,
⋯
 
,
n
)
(
1.1
)
\sum^n_{i=1} a_{ki}x_{i} = b_k \quad (k=1,2,\cdots,n)\qquad(1.1)
i=1∑nakixi=bk(k=1,2,⋯,n)(1.1)
写成矩阵形式为
A
x
=
b
\mathbf A\mathbf x=\mathbf b
Ax=b,其中
A
\mathbf A
A 是
n
×
n
n\times n
n×n 矩阵,
x
=
(
x
1
,
x
2
,
⋯
 
,
x
n
)
T
\mathbf x=(x_1, x_2,\cdots,x_n)^T
x=(x1,x2,⋯,xn)T,
b
=
(
b
1
,
b
2
,
⋯
 
,
b
n
)
T
\mathbf b=(b_1,b_2,\cdots,b_n)^T
b=(b1,b2,⋯,bn)T,于是有:
A
x
=
b
⇒
x
=
(
I
n
−
A
)
x
+
b
(
1.2
)
\mathbf A\mathbf x=\mathbf b\Rightarrow \mathbf x=(\mathbf I_n-\mathbf A)\mathbf x + \mathbf b\qquad(1.2)
Ax=b⇒x=(In−A)x+b(1.2)
其中,
I
n
\mathbf I_n
In 是
n
×
n
n\times n
n×n 单位矩阵。考虑算子(operator)
F
=
I
n
−
A
F=\mathbf I_n- \mathbf A
F=In−A,有
x
=
F
x
+
b
\mathbf x = F\mathbf x+\mathbf b
x=Fx+b
算子
F
b
x
=
F
x
+
b
F_b \mathbf x= F\mathbf x+\mathbf b
Fbx=Fx+b,则有
x
=
F
b
x
\mathbf x= F_b\mathbf x
x=Fbx,这便是一个不动点问题。其中,
F
F
F 是线性算子,而
F
b
F_b
Fb 是非线性算子,而 Banach Fixed Point 并不要求必须是线性算子,若
F
F
F 是收缩算子,则
F
b
F_b
Fb 也是收缩算子,这是因为:
d
(
F
b
x
,
F
b
y
)
=
∥
F
b
x
−
F
b
y
∥
=
∥
F
x
−
F
y
∥
=
d
(
F
x
,
F
y
)
(
1.3
)
d(F_b\mathbf x,F_b\mathbf y)=\Vert F_b\mathbf x- F_b\mathbf y\Vert=\Vert F\mathbf x- F\mathbf y\Vert = d(F\mathbf x,F\mathbf y)\qquad(1.3)
d(Fbx,Fby)=∥Fbx−Fby∥=∥Fx−Fy∥=d(Fx,Fy)(1.3)
由
x
=
F
b
x
\mathbf x= F_b\mathbf x
x=Fbx,又
R
n
\mathbb R^n
Rn 是一个Banach Space,若
F
F
F 是收缩算子,则符合Banach Fixed-Point Theorem的要求,则在
R
n
\mathbb R^n
Rn 中存在唯一一个不动点。现在的焦点集中在:
F
F
F 是否收缩算子?这由 Banach Space 的范数(Norm)定义决定。考虑两种情况:
Case 1:
在
R
n
\mathbb R^n
Rn 上取
l
∞
l_{\infty}
l∞ 为范数,即:
∥
x
∥
=
max
1
≤
k
≤
n
∣
x
∣
\Vert \mathbf x\Vert = \max_{1\le k\le n} \vert \mathbf x\vert
∥x∥=1≤k≤nmax∣x∣
于是,对于任意
n
×
n
n\times n
n×n矩阵
C
C
C 与
n
×
1
n\times 1
n×1 矢量
x
,
y
\mathbf x, \mathbf y
x,y 有:
∥
C
x
−
C
y
∥
=
max
1
≤
k
≤
n
∣
∑
i
=
1
n
c
k
,
i
(
x
i
−
y
i
)
∣
≤
max
1
≤
k
≤
n
[
∑
i
=
1
n
∣
c
k
,
i
∣
⋅
∣
x
i
−
y
i
∣
]
≤
max
1
≤
k
≤
n
[
∑
i
=
1
n
∣
c
k
,
i
∣
]
⋅
max
1
≤
k
≤
n
∣
x
i
−
y
i
∣
=
max
1
≤
k
≤
n
[
∑
i
=
1
n
∣
c
k
,
i
∣
]
∥
x
−
y
∥
\Vert C\mathbf x-C\mathbf y\Vert=\max_{1\le k\le n}\left| \sum_{i=1}^n c_{k,i}(x_i-y_i)\right| \le \max_{1\le k\le n}\left[ \sum_{i=1}^n |c_{k,i}|\cdot |x_i-y_i|\right] \\ \ \\ \le \max_{1\le k\le n}\left[ \sum_{i=1}^n |c_{k,i}|\right] \cdot \max_{1\le k\le n}|x_i-y_i| = \max_{1\le k\le n}\left[ \sum_{i=1}^n |c_{k,i}|\right] \Vert \mathbf x- \mathbf y\Vert
∥Cx−Cy∥=1≤k≤nmax∣∣∣∣∣i=1∑nck,i(xi−yi)∣∣∣∣∣≤1≤k≤nmax[i=1∑n∣ck,i∣⋅∣xi−yi∣] ≤1≤k≤nmax[i=1∑n∣ck,i∣]⋅1≤k≤nmax∣xi−yi∣=1≤k≤nmax[i=1∑n∣ck,i∣]∥x−y∥
因此,如果以下不等式成立:
max
1
≤
k
≤
n
[
∑
i
=
1
n
∣
c
k
,
i
∣
]
<
1
(
1.4
)
\max_{1\le k\le n}\left[ \sum_{i=1}^n |c_{k,i}|\right] \lt 1\qquad(1.4)
1≤k≤nmax[i=1∑n∣ck,i∣]<1(1.4)
则
C
C
C 就是一个收缩算子,回到
F
=
I
n
−
A
F=\mathbf I_n- \mathbf A
F=In−A 算子,要使
F
F
F 为收缩,则必须:
max
1
≤
k
≤
n
[
∑
i
=
1
n
∣
−
a
k
,
i
+
δ
k
,
i
∣
]
<
1
(
1.5
)
\max_{1\le k\le n}\left[ \sum_{i=1}^n |-a_{k,i}+\delta_{k,i}|\right] \lt 1 \qquad(1.5)
1≤k≤nmax[i=1∑n∣−ak,i+δk,i∣]<1(1.5)
其中,
a
k
,
i
a_{k,i}
ak,i 是矩阵
A
A
A 的k行,i列元素,
δ
k
,
i
\delta_{k,i}
δk,i 是矩阵
I
n
I_n
In 的k行,i列元素。满足这个要求的
A
x
=
b
A\mathbf x=\mathbf b
Ax=b,可用迭代的方法求解。
Case 2:
取
l
2
l_2
l2 范数,有
∥
x
∥
=
∑
i
=
1
n
x
k
2
\Vert \mathbf x \Vert = \sum_{i=1}^n x_k^2
∥x∥=i=1∑nxk2
对于任意
n
×
n
n\times n
n×n矩阵
C
C
C 与
n
×
1
n\times 1
n×1 矢量
x
\mathbf x
x 积的范数有,
∥
C
x
∥
2
=
∑
i
=
1
n
(
c
k
x
)
2
(
1.6
)
\Vert C\mathbf x \Vert^2 = \sum_{i=1}^n (\mathbf c_k \mathbf x)^2\qquad(1.6)
∥Cx∥2=i=1∑n(ckx)2(1.6)
其中
c
k
\mathbf c_k
ck 是矩阵
C
C
C 的第k行,则
c
k
x
\mathbf c_k \mathbf x
ckx 是两个矢量的标准内积,于是有:
(
c
k
x
)
2
=
∥
c
k
x
∥
2
≤
∥
c
k
∥
2
⋅
∥
x
∥
2
(\mathbf c_k \mathbf x)^2=\Vert \mathbf c_k \mathbf x\Vert^2\le \Vert \mathbf c_k\Vert^2\cdot\Vert \mathbf x\Vert^2
(ckx)2=∥ckx∥2≤∥ck∥2⋅∥x∥2,因此
∥
C
x
∥
2
=
∑
i
=
1
n
(
c
k
x
)
2
≤
∑
i
=
1
n
∥
c
k
∥
2
⋅
∥
x
∥
2
∥
C
x
∥
≤
[
∑
i
=
1
n
∥
c
k
∥
2
]
∥
x
∥
(
1.7
)
\Vert C\mathbf x \Vert^2 = \sum_{i=1}^n (\mathbf c_k \mathbf x)^2\le \sum_{i=1}^n \Vert \mathbf c_k\Vert^2\cdot\Vert \mathbf x\Vert^2 \\ \ \\ \Vert C\mathbf x \Vert \le \left[\sqrt {\sum_{i=1}^n \Vert \mathbf c_k\Vert^2} \right]\Vert \mathbf x\Vert \qquad(1.7)
∥Cx∥2=i=1∑n(ckx)2≤i=1∑n∥ck∥2⋅∥x∥2 ∥Cx∥≤[i=1∑n∥ck∥2]∥x∥(1.7)
由上我们得知,若要使
F
F
F(或
F
b
F_b
Fb)收缩,在
l
2
l_2
l2 范数下,必须:
∑
i
=
1
n
(
−
a
k
,
i
+
δ
k
,
i
)
2
<
1
(
1.8
)
\sum_{i=1}^n (-a_{k,i}+\delta_{k,i})^2 \lt 1 \qquad(1.8)
i=1∑n(−ak,i+δk,i)2<1(1.8)
小结,上述两种情况(Case 1和Case 2)范数定义不同,得到的对算子
F
F
F 的要求不一样,但迭代过程是相同的,其实在迭代过程中,若满足要求,则不需要理会范数的定义。以下给出一个例子(二元一次方程组):
[
0.5
0.2
0.3
0.5
]
[
x
1
x
2
]
=
[
0.1
0.7
]
\left[ \begin{array}{cc}\\0.5 & 0.2 \\ 0.3 & 0.5 \end{array}\right]\left[ \begin{array}{c}\\x_1 \\ x_2 \end{array}\right] = \left[ \begin{array}{c}\\0.1 \\ 0.7 \end{array}\right]
[0.50.30.20.5][x1x2]=[0.10.7]
求解过程用numpy实现如下:
import numpy as np
import matplotlib.pyplot as plt
# 直接通过求逆矩阵的方法求解
A = np.array([[0.5, 0.2],[0.3, 0.5]])
A_inv = np.linalg.inv(A)
b = [[0.1],[0.7]]
x = np.matmul(A_inv, b) # x=array([[-0.47368421], [ 1.68421053]])
# 用迭代的方法求解
k = 30
x = np.array([[0.3],[0.1]])
x_arr = []
x_arr.append(x)
for i in range(k):
C = np.identity(2)-A
x = np.matmul(C,x)+b
x_arr.append(x)
for p in x_arr:
plt.scatter(p[0,0], p[1,0])
print(x_arr[-1])
plt.text(x_arr[-1][0,0]+0.03,x_arr[-1][1,0],'[%2.2f, %2.2f]'%(x_arr[-1][0,0],x_arr[-1][1,0]))
plt.show()
图1 用迭代法求解方程
上述二元一次方程组满足case1和case2对矩阵A的要求,用迭代的方法求出的数值与矩阵求逆的方法的相同。当矩阵A的维数大时,迭代方法要比求逆方法有优势,它不仅计算量小,速度快,而且有很强的鲁棒性。
二、Distributional Bellman算法的不动点解析
在增强学习(Reinforcement Learning)中,Bellman Equation占着极其重要的地位,传统 Bellman Equation 可以写成如下形式:
Q
(
x
,
a
)
=
E
R
(
x
,
a
)
+
γ
E
Q
(
x
′
,
a
′
)
(
2.1
)
Q(x,a)=\mathbb E R(x,a)+\gamma\mathbb E Q(x',a')\qquad(2.1)
Q(x,a)=ER(x,a)+γEQ(x′,a′)(2.1)
式中,
Q
(
x
,
a
)
Q(x,a)
Q(x,a) 是状态
x
x
x 下,采取行动
a
a
a 的总收益(价值函数),
R
(
x
,
a
)
R(x,a)
R(x,a) 是当前回报,
γ
\gamma
γ 是折扣,
E
\mathbb E
E 表示取随机量的期望。该方程反映的是总收益与随机量期望间的关系,但有时候均值并不能很好地反映实际分布,例如:具有两个模式的双峰分布,均值就在两个波谷之间。若能直接估计出总收益、当前回报等随机变量的分布,则岂不更好?《A Distributional Perspective on Reinforcement Learning》1所阐述的思想就是基于此出发点的。[1]将公式(2.1)的
E
\mathbb E
E 拿掉,变成了:
Q
(
x
,
a
)
=
D
R
(
x
,
a
)
+
γ
Q
(
x
′
,
a
′
)
(
2.2
)
Q(x,a)\overset{D}{=} R(x,a)+\gamma Q(x',a')\qquad(2.2)
Q(x,a)=DR(x,a)+γQ(x′,a′)(2.2)
式中,
=
D
\overset{D}{=}
=D 表示随机变量分布的相等,(2.2)表示当下“状态-行为”总收益的分布
Q
(
x
,
a
)
Q(x,a)
Q(x,a) 和当前回报
R
(
x
,
a
)
R(x,a)
R(x,a) 与考虑折扣的下一“状态-行为”的总收益
γ
Q
(
x
′
,
a
′
)
\gamma Q(x',a')
γQ(x′,a′) 的和相同。公式(2.1)与公式(2.2)的形式很相似,但意义却有巨大不同,公式(2.1)反映的是值(value)之间的关系,而公式(2.2)反映的是随机变量分布(distribution)之间的关系。[1]指出Q分布构成一个Banach 空间
Q
\mathbb Q
Q,在
Q
\mathbb Q
Q中定义Wasserstein metric 以衡量各分布(
U
,
V
∈
Q
U,V\in \mathbb Q
U,V∈Q )之间距离:
d
p
(
F
,
G
)
:
=
inf
U
,
V
∥
U
−
V
∥
p
(
2.3
)
d_p(F,G):=\inf_{U,V} \Vert U-V \Vert_p\qquad(2.3)
dp(F,G):=U,Vinf∥U−V∥p(2.3)
式中,F、G 分别是随机变量 U、V 的 c.d.f(cumulative distribution function, 累积分布函数)。再取
d
p
d_p
dp 的上界,得到
d
ˉ
p
\bar d_p
dˉp:
d
ˉ
p
(
Q
1
,
Q
2
)
:
=
sup
d
p
(
Q
1
(
x
,
a
)
,
Q
2
(
x
,
a
)
)
(
2.4
)
\bar d_p(Q_1, Q_2):=\sup d_p(Q_1(x,a),Q_2(x,a))\qquad(2.4)
dˉp(Q1,Q2):=supdp(Q1(x,a),Q2(x,a))(2.4)
以此
d
ˉ
p
\bar d_p
dˉp 为空间
Q
\mathbb Q
Q 的范数,[1]证明了算子
T
π
:
Q
→
Q
\mathcal T^{\pi}:\mathbb Q\to\mathbb Q
Tπ:Q→Q 是收缩的:
T
π
Q
(
x
,
a
)
=
D
R
(
x
,
a
)
+
γ
P
π
Q
(
x
,
a
)
(
2.5
)
\mathcal T^{\pi}Q(x,a)\overset{D}{=} R(x,a)+\gamma P^{\pi}Q(x,a)\qquad(2.5)
TπQ(x,a)=DR(x,a)+γPπQ(x,a)(2.5)
其中
P
π
P^{\pi}
Pπ 是状态转换算子,它表示现状态-行为总收益到NEXT状态-行为总收益的转换概率:
P
π
Q
(
x
,
a
)
=
D
Q
(
x
′
,
a
′
)
x
′
∼
P
(
⋅
∣
x
,
a
)
,
a
′
∼
π
(
⋅
∣
x
′
)
(
2.6
)
P^{\pi}Q(x,a)\overset{D}{=} Q(x',a')\\ \ \\ x'\sim P(\cdot | x,a),\ a'\sim \pi(\cdot|x') \qquad(2.6)
PπQ(x,a)=DQ(x′,a′) x′∼P(⋅∣x,a), a′∼π(⋅∣x′)(2.6)
式中,
x
′
x'
x′ 表示Next状态,它服从给定(x,a)下的P分布,
a
′
a'
a′服从在
x
′
x'
x′下采取行为的概率分布
π
\pi
π。
综上,考虑迭代过程:
Q
n
+
1
=
T
π
Q
n
,
∀
Q
0
∈
Q
Q_{n+1}=\mathcal T^{\pi}Q_n,\ \forall \ Q_0\in \mathbb Q
Qn+1=TπQn, ∀ Q0∈Q ,它必收敛于算子
T
π
\mathcal T^{\pi}
Tπ 的不动点,该不动点即是所需搜索的最优
Q
∗
(
x
,
a
)
Q^*(x,a)
Q∗(x,a) 分布。
[3]给出了一个pytorch实现例子,大致流程如下(还可参考我的另一篇博客[4]):
图2 distributional dqn 处理流程
该方案由两个网络构成:Net 和 Target-Net,这两个网络分别代表迭代过程(
Q
n
+
1
=
T
π
Q
n
,
∀
Q
0
∈
Q
Q_{n+1}=\mathcal T^{\pi}Q_n,\ \forall \ Q_0\in \mathbb Q
Qn+1=TπQn, ∀ Q0∈Q)中的
Q
n
+
1
Q_{n+1}
Qn+1 和
Q
n
Q_{n}
Qn,图2的处理步骤如下:
- Net 接受Transition 采样中的当前状态 x。其中,一个Transition包含(x,a,r,x’)
,分别表示当前状态x、采取行动a,当前回报r,Next状态x’; - Net 输出的Q分布—— Z ( x , a ) Z(x,a) Z(x,a),它由N个 [ V m i n , V m a x ] [V_{min},V_{max}] [Vmin,Vmax] 离散分布构成,一般在 [ V m i n , V m a x ] [V_{min},V_{max}] [Vmin,Vmax]上可以分为51个间隔,称为C51。N对应actions的数量,也即一个action对应一条分布,即图中一条 a i a_i ai 分布;
- 从输出中选取Transition中a对应的分布,作为后续交叉熵计算所需分布 Z ( x , a ) Z(x,a) Z(x,a);
- 将 Transition 中Next状态 x’ 作为Target-Net的输入,得到下一状态价值分布 Z ( x ′ , a ′ ) Z(x',a') Z(x′,a′),其组成也如2步骤的输出一样,因为Net的网络结构与Target-Net的结构是一样的;
- 从 Z ( x ′ , a ′ ) Z(x',a') Z(x′,a′)中选取期望最大的那一个 a ∗ a^* a∗对应的分布—— Z ( x ′ , a ∗ ) Z(x',a^*) Z(x′,a∗);
- 计算 r + γ Z ( x ′ , a ∗ ) r+\gamma Z(x',a^*) r+γZ(x′,a∗) 分布函数在 [ V m i n , V m a x ] [V_{min},V_{max}] [Vmin,Vmax] 上的投影 Z ′ ( x , a ) = P r o j [ V m i n , V m a x ] ( r + γ Z ( x ′ , a ∗ ) ) Z'(x,a)=Proj_{[V_{min},V_{max}]}(r+\gamma Z(x',a^*)) Z′(x,a)=Proj[Vmin,Vmax](r+γZ(x′,a∗)),其中 r 是Transition中的当前回报, Z ′ ( x , a ) Z'(x,a) Z′(x,a)便是不动点迭代 Q n + 1 = T π Q n Q_{n+1}=\mathcal T^{\pi}Q_n Qn+1=TπQn 算法中的 Q n + 1 Q_{n+1} Qn+1;
- 用交叉熵定义 Z ′ ( x , a ) Z'(x,a) Z′(x,a)与 Z ( x , a ) Z(x,a) Z(x,a)的距离,通过SGD(统计梯度下降)优化Net的参数,使 Z ( x , a ) Z(x,a) Z(x,a)逼近 Z ′ ( x , a ) Z'(x,a) Z′(x,a),上述的pytorch实现中通过 target_net_sync=1000,设置梯度学习循环次数;
- 用学习后的Net 同步 Target-Net,实现不动点算法的迭代,即: Q n + 1 = T π Q n , such that Q 0 → Q 1 → ⋯ → Q n → Q n + 1 ⋯ Q_{n+1}=\mathcal T^{\pi}Q_n,\ \text{such that }Q_0\to Q_1\to\cdots\to Q_n\to Q_{n+1}\cdots Qn+1=TπQn, such that Q0→Q1→⋯→Qn→Qn+1⋯
- 最后收敛,得到 Q ∗ ( x , a ) Q^*(x,a) Q∗(x,a)分布。
以上方法,用多层神经网络作为分布函数的逼近工具,通过SGD方法优化网络,是典型的deep learning方法,另外,distributional Bellman算法还根据不动点理论,构建迭代学习框架,让deep learning成为整个框架的一部分,有机地将基础算法与deep learning融合起来,既扩展了deep learning使用的范围,也为未来搭建更复杂的系统提供了思路。
参考文献:
1、A Distributional Perspective on Reinforcement Learning,https://arxiv.org/abs/1707.06887
2、A Primer on Hilbert Space Theory:Linear Spaces, Topological Spaces, Metric Spaces, Normed Spaces, and Topological Groups,Carlo Alabiso,Springer International Publishing Switzerland 2015
3、《Deep Reinforcement Learning Hands-On》https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On/blob/master/Chapter07/07_dqn_distrib.py
4、《A Distributional Perspective on Reinforcement Learning》的理解:https://blog.csdn.net/StreamRock/article/details/86605272
1 ↩︎