时序差分方法求解强化学习任务——时序差分方法介绍
- 目录
- 回顾:基于价值函数的求解方法
- 动态规划方法的特点和弊端
- 蒙特卡洛方法的特点和弊端
- 时序差分方法(Temporal-Difference,TD)
目录
前面介绍了使用蒙特卡洛方法求解强化学习任务。本节针对蒙特卡洛方法的弊端,介绍时序差分方法。
回顾:基于价值函数的求解方法
在所有基于价值函数(Value Function)的强化学习任务求解方法中,有三大类基础算法。它们分别是:
- 动态规划方法(Dynamic Programming,DP)
- 蒙特卡洛方法(Monte Carlo,MC)
- 时序差分方法(Temporal-Difference,TD)
简单回顾动态规划方法(DP)和蒙特卡洛方法(MC)的特点和弊端:
动态规划方法的特点和弊端
动态规划方法:
V
π
(
s
)
=
E
π
[
G
t
∣
S
t
=
s
]
=
E
π
[
R
t
+
1
+
γ
V
π
(
S
t
+
1
)
∣
S
t
=
s
]
\begin{aligned} V_\pi(s) & = \mathbb E_\pi[G_t \mid S_t = s] \\ & = \mathbb E_\pi[R_{t+1} + \gamma V_\pi(S_{t+1}) \mid S_t =s] \\ \end{aligned}
Vπ(s)=Eπ[Gt∣St=s]=Eπ[Rt+1+γVπ(St+1)∣St=s]
该方法的特点是具有自举性(Boostrpping)。动态规划方法可以将优化目标视作贝尔曼期望方程的迭代过程,根据贝尔曼期望方程满足不动点定理 的特性,我们可以初始化状态价值函数
V
i
n
i
t
(
s
)
V_{init}(s)
Vinit(s),并构建一条序列
{
V
k
}
\{V_k\}
{Vk}:
V
k
(
s
)
=
∑
a
∈
A
(
s
)
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
V
k
−
1
(
s
′
)
]
{
V
k
}
=
{
V
i
n
i
t
(
s
)
,
V
1
(
s
)
,
.
.
.
,
V
k
(
s
)
,
V
k
+
1
(
s
)
,
.
.
.
}
\begin{aligned} V_k(s) & = \sum_{a \in \mathcal A(s)} \pi(a \mid s) \sum_{s',r}p(s',r \mid s ,a)[r + \gamma V_{k-1}(s')] \\ \{V_k\}& = \{V_{init}(s),V_1(s),...,V_{k}(s),V_{k+1}(s),...\} \\ \end{aligned}
Vk(s){Vk}=a∈A(s)∑π(a∣s)s′,r∑p(s′,r∣s,a)[r+γVk−1(s′)]={Vinit(s),V1(s),...,Vk(s),Vk+1(s),...}
其中:
V
k
(
s
)
=
(
V
k
(
s
1
)
V
k
(
s
2
)
V
k
(
s
3
)
.
.
.
V
k
(
s
∣
S
∣
)
)
(
s
1
,
s
2
,
.
.
.
s
∣
S
∣
∈
S
)
V_k(s) = \begin{pmatrix} V_k(s_1) \\ V_k(s_2) \\ V_k(s_3)\\ ...\\ V_k(s_{|\mathcal S|}) \end{pmatrix}(s_1,s_2,...s_{|\mathcal S|} \in \mathcal S)
Vk(s)=⎝⎜⎜⎜⎜⎛Vk(s1)Vk(s2)Vk(s3)...Vk(s∣S∣)⎠⎟⎟⎟⎟⎞(s1,s2,...s∣S∣∈S)
并且随着
{
V
k
}
\{V_k\}
{Vk}序列的增加
→
\to
→ 最终收敛至状态价值函数
V
π
(
s
)
V_\pi(s)
Vπ(s)。
其本质思想是:
- V k ( s ) V_k(s) Vk(s)是依据上一轮已经计算出的 V k − 1 ( s ) V_{k-1}(s) Vk−1(s)结果通过贝尔曼期望方程运算产生的新的结果。
- 策略 π \pi π对应的状态价值函数 V π ( s ) V_\pi(s) Vπ(s)在计算过程中是不可知的,通常使用迭代后的估计值 V k ( s ) V_{k}(s) Vk(s)来替代 V π ( s ) V_\pi(s) Vπ(s)。
动态规划方法的弊端也是很明显的,要求环境中的动态特性函数 p ( s ′ , r ∣ s , a ) p(s',r \mid s,a) p(s′,r∣s,a)必须是 已知 的。若状态特性函数未知 → \to → 贝尔曼期望方程无法求解,动态规划方法是无法实现的。
蒙特卡洛方法的特点和弊端
针对动态规划方法的弊端,我们回归状态价值函数定义本身,并将其作为新的优化目标。
V
π
(
s
)
=
E
π
[
G
t
∣
S
t
=
s
]
V_\pi(s) = \mathbb E_\pi[G_t \mid S_t = s]
Vπ(s)=Eπ[Gt∣St=s]
该方法的核心是 大数定律。特点是通过 蒙特卡洛方法,在情节执行过程中对回报结果(Return)进行采样,最后取样本均值逼近状态价值函数
V
π
(
s
)
V_\pi(s)
Vπ(s)。
这种方法解决了没有动态特性函数
p
(
s
′
,
r
∣
s
,
a
)
p(s',r \mid s,a)
p(s′,r∣s,a)情况下依然可以求解状态价值函数
V
π
(
s
)
V_\pi(s)
Vπ(s)。
但蒙特卡洛方法同样存在弊端:
蒙特卡洛方法的核心步骤就是对回报
G
t
G_t
Gt进行采样。以首次访问型为例,我们对某一具体状态
s
s
s的回报
[
G
t
∣
S
t
=
s
]
[G_t \mid S_t = s]
[Gt∣St=s]进行采样,根据
G
t
G_t
Gt的计算公式:
G
t
=
R
t
+
1
+
γ
R
t
+
2
+
.
.
.
+
γ
T
−
t
−
1
R
T
G_t = R_{t+1} + \gamma R_{t + 2} + ... + \gamma^{T - t - 1}R_{T}
Gt=Rt+1+γRt+2+...+γT−t−1RT
我们需要将情节从
t
t
t时刻开始,到终结状态
S
T
S_T
ST结束,其中全部的奖励结果(Reward):
R
t
+
1
,
R
t
+
2
,
.
.
.
,
R
T
R_{t+1},R_{t+2},...,R_T
Rt+1,Rt+2,...,RT全部求出后,才能得到一个
G
t
G_t
Gt样本。
即便是采到了一个 G t G_t Gt样本,根据蒙特卡洛方法要求,为保证近似结果的准确性 → \to → 需要足够多的样本执行均值操作,即便使用动量更新方式以观察 样本均值逼近目标结果的过程,但这种方式并不能减少采样次数。
综上所述:
- 获得一个回报样本 G t G_t Gt,必须至少遍历一遍情节(如果遍历了一次情节之后,发现该情节中根本没有具体状态 s s s → \to → 意味着本次遍历没有产生关于状态 s s s的回报样本)
- 即便使用增量更新方式,算法循环过程中的最小单位仍然需要遍历整个情节 这种更新方式的时间复杂度依然很高——更新延迟问题;
这里循环没有包含其他情况:
全量更新 -> 嵌套循环;并且存储样本需要消耗存储空间;
离轨策略 -> 遍历过程中因行为策略和目标策略指向的动作不同,导致情节遍历停止 -> 情节中存在样本未采出的情况(细节详见:蒙特卡洛方法求解强化学习任务——基于离轨策略的蒙特卡洛控制)
时序差分方法(Temporal-Difference,TD)
回顾蒙特卡洛方法解决预测问题,状态价值函数
V
(
S
t
)
V(S_t)
V(St)的增量式更新递归公式如下:
V
(
S
t
)
←
V
(
S
t
)
+
α
[
G
t
−
V
(
S
t
)
]
V(S_t) \gets V(S_t) + \alpha [G_t - V(S_t)]
V(St)←V(St)+α[Gt−V(St)]
其中:
[
G
t
−
V
(
S
t
)
]
[G_t - V(S_t)]
[Gt−V(St)]表示当前样本与上一步预估值的偏差结果。
- 如果当前样本 G t G_t Gt较大/偏差结果为正 → \to → 新的预估值在 G t G_t Gt的带动下增大;
- 同理,如果当前样本 G t G_t Gt较小/偏差结果为负 → \to → 新的预估值在 G t G_t Gt的带动下减小;
α \alpha α表示步长,通常表示预估值增大/减小的 幅度。
- 普通重要性采样:各样本间 无权重大小关系 → α = 1 N \to \alpha = \frac{1}{N} →α=N1( N N N表示当前 G t G_t Gt样本数量)
- 加权重要性采样:各样本间 分配不同权重 → α = ρ t : T − 1 ∑ ρ t : T − 1 \to \alpha = \frac{\rho_{t:T-1}}{\sum \rho_{t:T-1}} →α=∑ρt:T−1ρt:T−1(分母表示各样本权重和,分子表示当前样本权重)
时序差分方法就是为了克服蒙特卡洛方法中的 更新延迟 问题。
时序差分预测中,分为1步/n步后直接计算状态价值函数,本系列仅介绍基于1步情况下的时序差分方法。
核心:缩短更新延迟
TD(0)
→
\to
→ 只 前进一步 后直接计算状态价值函数,即只要当前时刻状态
S
t
S_t
St转移到下一时刻状态
S
t
+
1
S_{t+1}
St+1,就执行一次 动量更新操作。具体更新递归式为:
V
(
S
t
)
←
V
(
S
t
)
+
α
[
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
]
V(S_t) \gets V(S_t) + \alpha [R_{t+1} + \gamma V(S_{t+1}) - V(S_t)]
V(St)←V(St)+α[Rt+1+γV(St+1)−V(St)]
这里同样引用了动态规划的思想:
初始化状态价值函数向量:
V
i
n
i
t
(
s
)
=
(
V
i
n
i
t
(
s
1
)
V
i
n
i
t
(
s
2
)
V
i
n
i
t
(
s
3
)
.
.
.
V
i
n
i
t
(
s
∣
S
∣
)
)
V_{init}(s) = \begin{pmatrix} V_{init}(s_1) \\ V_{init}(s_2) \\ V_{init}(s_3)\\ ...\\ V_{init}(s_{|\mathcal S|}) \end{pmatrix}
Vinit(s)=⎝⎜⎜⎜⎜⎛Vinit(s1)Vinit(s2)Vinit(s3)...Vinit(s∣S∣)⎠⎟⎟⎟⎟⎞
在迭代过程中更新相应状态位置的结果。
以
t
t
t时刻迭代为例:当
t
t
t时刻状态
S
t
S_t
St转移到
t
+
1
t+1
t+1时刻状态
S
t
+
1
S_{t+1}
St+1:
- 系统将自动返回一个奖励 R t + 1 R_{t+1} Rt+1;
- 观察 S t + 1 S_{t+1} St+1的具体状态信息,并从状态价值函数向量中查找对应 S t + 1 S_{t+1} St+1状态的结果 → V ( S t + 1 ) \to V(S_{t+1}) →V(St+1)。
- 等式右侧的 V ( S t ) V(S_t) V(St)为上一轮产生的状态价值函数结果;
- 根据上述变量,求出当前时刻的状态价值函数更新结果 V ( S t ) V(S_t) V(St)
经过上述逻辑推导过程,时序差分方法的特点也展现出来:最大限度地保证实时更新,最短1步就可以进行更新。
因此,时序差分方法的优化目标如下:
V
π
(
s
)
=
E
π
[
R
t
+
1
+
γ
G
t
+
1
∣
S
t
=
s
]
V_\pi(s) = \mathbb E_\pi[R_{t+1} + \gamma G_{t+1} \mid S_t = s]
Vπ(s)=Eπ[Rt+1+γGt+1∣St=s]
下一节将重新介绍SARSA_基于同轨策略的时序差分控制。
相关参考:
时序差分-策略评估
深度强化学习原理、算法pytorch实战 —— 刘全,黄志刚编著
