上一章我们介绍用蒙特卡洛(MC)方法解决Model-Free的强化学习问题时,核心关键就是利用多次的累积回报去逼近状态价值 v π ( s ) v_{\mathrm\pi}\left(s\right) vπ(s)或状态-行为值 q π ( s , a ) {\mathrm q}_{\mathrm\pi}\left(\mathrm s,\mathrm a\right) qπ(s,a)。即如下公式:
- v ( s t k ) ← v ( s t k − 1 ) + 1 α [ G t k − v ( s t k − 1 ) ] v\left(s_t^k\right)\leftarrow v\left(s_t^{k-1}\right)+\frac1\alpha\left[G_t^k-v\left(s_t^{k-1}\right)\right] v(stk)←v(stk−1)+α1[Gtk−v(stk−1)] (1)
- q ( s t k , a t k ) ← q ( s t k − 1 , a t k − 1 ) + 1 α [ G t k − q ( s t k − 1 , a t k − 1 ) ] q\left(s_t^k,a_t^k\right)\leftarrow q\left(s_t^{k-1},a_t^{k-1}\right)+\frac1\alpha\left[G_t^k-q\left(s_t^{k-1},a_t^{k-1}\right)\right] q(stk,atk)←q(stk−1,atk−1)+α1[Gtk−q(stk−1,atk−1)] (2)
其中
G
t
k
=
r
t
+
1
k
+
γ
r
t
+
2
k
+
⋯
=
∑
m
=
0
∞
γ
m
r
t
+
m
+
1
k
G_t^k=r_{t+1}^k+\gamma r_{t+2}^k+\cdots=\sum_{m=0}^\infty\gamma^mr_{t+m+1}^k
Gtk=rt+1k+γrt+2k+⋯=∑m=0∞γmrt+m+1k,为累积回报,是在第
k
k
k个完整过程中产生的。
但这就带来了一个问题,那就是采用MC时,需要完整的过程。但是,很多时候,完整过程是很难得到的。因此,蒙特卡洛方法就有可能导致学习的效率低下(例如一次完整过程非常漫长),甚至无法学习(没有最终状态),那么如何解决这一问题呢?
时序差分算法基本思想
首先,我们可以回顾一下动态规划算法解决Model-Based问题时的思路,具体公式如下:
- v π ( s ) = ∑ a ∈ A π ( a ∣ s ) [ r s a + γ ∑ s ′ ∈ S P s s ′ a v π ( s ′ ) ] v_{\mathrm\pi}\left(s\right)=\sum_{a\in A}\mathrm\pi\left(\mathrm a\left|\mathrm s\right.\right)\left[\mathrm r_{\mathrm s}^{\mathrm a}+\mathrm\gamma\sum_{\mathrm s'\in\mathrm S}\mathrm P_{\mathrm{ss}'}^{\mathrm a}{\mathrm v}_{\mathrm\pi}\left(\mathrm s'\right)\right] vπ(s)=∑a∈Aπ(a∣s)[rsa+γ∑s′∈SPss′avπ(s′)]
其中使用到了下一个状态的价值函数
v
π
(
s
′
)
{\mathrm v}_{\mathrm\pi}\left(\mathrm s'\right)
vπ(s′),并通过迭代方法最终使状态价值函数和状态-行为值函数都收敛。
那么我们能不能借助这个思想,对上面的公式(1)和(2)进行一定的改造呢?
我们从
G
t
k
G_t^k
Gtk的公式入手:
- G t k = r t + 1 k + γ r t + 2 k + γ 2 r t + 3 k + ⋯ = r t + 1 k + γ ( r t + 2 k + γ r t + 3 k + ⋯ ) = r t + 1 k + γ G t + 1 k \mathrm G_{\mathrm t}^{\mathrm k}=\mathrm r_{\mathrm t+1}^{\mathrm k}+\mathrm{γr}_{\mathrm t+2}^{\mathrm k}+\mathrm\gamma^2\mathrm r_{\mathrm t+3}^{\mathrm k}+\cdots\\\;\;\;\;=\mathrm r_{\mathrm t+1}^{\mathrm k}+\mathrm\gamma\left(\mathrm r_{\mathrm t+2}^{\mathrm k}+\mathrm{γr}_{\mathrm t+3}^{\mathrm k}+\cdots\right)\\\;\;\;\;=\mathrm r_{\mathrm t+1}^{\mathrm k}+\mathrm{γG}_{\mathrm t+1}^{\mathrm k} Gtk=rt+1k+γrt+2k+γ2rt+3k+⋯=rt+1k+γ(rt+2k+γrt+3k+⋯)=rt+1k+γGt+1k
同时,考虑 v π ( s ) = E π [ G t ∣ s t = s ] v_\pi\left(s\right)=E_\pi\left[G_t\left|s_t=s\right.\right] vπ(s)=Eπ[Gt∣st=s],则有如下关系:
- v π ( s ) = E π [ G t ∣ s t = s ] = E π [ r t + 1 + γ G t + 1 ∣ s t = s ] = E π [ r t + 1 + γ v π ( s t + 1 ) ∣ s t = s ] v_\pi\left(s\right)=E_\pi\left[G_t\left|s_t=s\right.\right]\\\;\;\;\;\;\;\;\;\;=E_\pi\left[r_{t+1}+\gamma G_{t+1}\left|s_t=s\right.\right]\\\;\;\;\;\;\;\;\;\;=E_\pi\left[r_{t+1}+\gamma v_\pi\left(s_{t+1}\right)\left|s_t=s\right.\right] vπ(s)=Eπ[Gt∣st=s]=Eπ[rt+1+γGt+1∣st=s]=Eπ[rt+1+γvπ(st+1)∣st=s]
那么,在公式(1)和(2)中,我们用 r t + 1 k + γ v ( s t + 1 k − 1 ) r_{t+1}^k+\gamma v\left(s_{t+1}^{k-1}\right) rt+1k+γv(st+1k−1)或 r t + 1 k + γ q ( s t + 1 k − 1 , a t + 1 k − 1 ) r_{t+1}^k+\gamma q\left(s_{t+1}^{k-1},a_{t+1}^{k-1}\right) rt+1k+γq(st+1k−1,at+1k−1)代替 G t k G_t^k Gtk,那么就可以得到如下公式:
- v ( s t k ) ← v ( s t k − 1 ) + 1 α [ r t + 1 k + γ v ( s t + 1 k − 1 ) − v ( s t k − 1 ) ] v\left(s_t^k\right)\leftarrow v\left(s_t^{k-1}\right)+\frac1\alpha\left[r_{t+1}^k+\gamma v\left(s_{t+1}^{k-1}\right)-v\left(s_t^{k-1}\right)\right] v(stk)←v(stk−1)+α1[rt+1k+γv(st+1k−1)−v(stk−1)] (3)
- q ( s t k , a t k ) ← q ( s t k − 1 , a t k − 1 ) + 1 α [ r t + 1 k + γ q ( s t + 1 k − 1 , a t + 1 k − 1 ) − q ( s t k − 1 , a t k − 1 ) ] q\left(s_t^k,a_t^k\right)\leftarrow q\left(s_t^{k-1},a_t^{k-1}\right)+\frac1\alpha\left[r_{t+1}^k+\gamma q\left(s_{t+1}^{k-1},a_{t+1}^{k-1}\right)-q\left(s_t^{k-1},a_t^{k-1}\right)\right] q(stk,atk)←q(stk−1,atk−1)+α1[rt+1k+γq(st+1k−1,at+1k−1)−q(stk−1,atk−1)] (4)
上面这个公式看起来挺麻烦的,其实道理很简单,就是参照动态规划的方法,将原来蒙特卡洛方法中全过程的累积回报 G t k G_t^k Gtk,变成了环境的实时奖励 r t + 1 k r_{t+1}^k rt+1k与下一状态的状态函数 v ( s t + 1 k − 1 ) v\left(s_{t+1}^{k-1}\right) v(st+1k−1)或状态-行为值 q ( s t + 1 k − 1 , a t + 1 k − 1 ) q\left(s_{t+1}^{k-1},a_{t+1}^{k-1}\right) q(st+1k−1,at+1k−1)的和。
这样,就避免了蒙特卡洛算法中必须要全过程累积回报的缺点,使得能够在过程中利用两步信息就学习。
时序差分中的策略求解
虽然时序差分借鉴了动态规划的思想,但其解决的是Model-Free问题,因此无法利用状态转移概率从状态价值直接求解得到状态-行为值。所以,在策略求解中,时序差分与蒙特卡洛方法一样,都是采用经验平均直接对状态-行为值进行优化,最终求得最优状态-行为价值和最优策略。
但是与蒙特卡洛方法利用完整状态序列进行学习不一样的是,时序差分是在过程中进行学习【利用公式(4)更新】的。
由公式(4)可以看出,在更新过程中,需要三个值,即:
- q ( s t k − 1 , a t k − 1 ) q\left(s_t^{k-1},a_t^{k-1}\right) q(stk−1,atk−1)
- r t + 1 k r_{t+1}^k rt+1k
- q ( s t + 1 k − 1 , a t + 1 k − 1 ) q\left(s_{t+1}^{k-1},a_{t+1}^{k-1}\right) q(st+1k−1,at+1k−1)
上面三个值中, r t + 1 k r_{t+1}^k rt+1k是直接环境给的。那么关于剩下两个如何取值,就诞生了两种方法。一个是采用同一策略的on-policy【一般翻译为同轨策略】,另一个是采用不同策略的off-policy【一般翻译为离轨策略】,下面我们直接从算法层面讲这两种方法的不同。
on-policy与SARSA
首先算法应随机初始化 Q ( s , a ) Q\left(s,a\right) Q(s,a),其中终止状态 Q = 0 Q=0 Q=0,然后对于一个完整的Episode,算法如下:
- 初始化 s s s;
- 在 s s s下,使用 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy策略,从所有 Q ( s , a ) Q\left(s,a\right) Q(s,a)中选择行动 a a a;
- 执行动作 a a a,得到 r r r和 s ′ s' s′;
- 在 s ′ s' s′下,使用 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy策略,从所有 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′)中选择行动 a ′ a' a′;
- 利用公式 Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q\left(s,a\right)\leftarrow Q\left(s,a\right)+\alpha\left[r+\gamma Q\left(s',a'\right)-Q\left(s,a\right)\right] Q(s,a)←Q(s,a)+α[r+γQ(s′,a′)−Q(s,a)]进行更新;
- 令 s ← s ′ s\leftarrow s' s←s′, a ← a ′ a\leftarrow a' a←a′;
- 若 s s s是终止状态,则结束;否则跳到第3步。
为什么说SARSA是on-policy的呢?大家请看第4、5、6步,这里用来计算目标值的策略 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′)和生成行动 a ′ a' a′的策略是同一个策略,即 Q Q Q更新前就生成了下一个action。
off-policy与Q-Learning
同样对于一个完整的Episode,算法如下:
- 初始化 s s s;
- 在 s s s下,使用 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy策略,从所有 Q ( s , a ) Q\left(s,a\right) Q(s,a)中选择行动 a a a;
- 执行动作 a a a,得到 r r r和 s ′ s' s′;
- 使用贪婪策略,找到最大的 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′);
- 利用公式 Q ( s , a ) ← Q ( s , a ) + α [ r + γ ⋅ m a x Q ( s ′ , a ′ ) − Q ( s , a ) ] Q\left(s,a\right)\leftarrow Q\left(s,a\right)+\alpha\left[r+\gamma\cdot maxQ\left(s',a'\right)-Q\left(s,a\right)\right] Q(s,a)←Q(s,a)+α[r+γ⋅maxQ(s′,a′)−Q(s,a)]进行更新;
- 令 s ← s ′ s\leftarrow s' s←s′;
- 若 s s s是终止状态,则结束;否则跳到第2步。
为什么说Q-Learning是off-policy的呢?大家请看第5、6步,这里是用来计算目标值的策略 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′),再往后看,更新后策略已经发生了变化,再从7——>2后生成新的action,这就说明生成目标值的策略和生成行动的策略不是一个策略,即 Q Q Q更新后才生成下一个action。
由上面SARSA和Q-Learning的具体算法可以看出,他们的区别主要在于更新的方式不同:
- SARSA使用 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy策略,选择 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′)以及对应的 a ′ a' a′,进行更新并继续执行;
- Q-Learning则使用贪婪策略,找到最大的 Q ( s ′ , a ′ ) Q\left(s',a'\right) Q(s′,a′)进行更新,而 a ′ a' a′则还是使用 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy策略进行选择,并继续执行。
根据 ε ‐ g r e e d y \varepsilon‐greedy ε‐greedy的公式:
- π ( a ∣ s ) = { 1 − ε + ε m i f a ∗ = arg max a ∈ A q ( s , a ) ε m e l s e \mathrm\pi\left(\mathrm a\left|\mathrm s\right.\right)=\left\{\begin{array}{l}1-\varepsilon+\frac\varepsilon m\;\mathrm{if}\;\mathrm a\ast=\arg\max_{\mathrm a\in\mathrm A}\mathrm q\left(\mathrm s,\mathrm a\right)\\\frac\varepsilon m\;\mathrm{else}\end{array}\right. π(a∣s)={1−ε+mεifa∗=argmaxa∈Aq(s,a)mεelse
可知,其实就是SARSA在值更新时有一定概率使用了其他的值,而Q-Learning则直接使用了最大值,即两者使用的更新模式是不一样的。
小结
时序差分算法为强化学习提供了很多重要的思路,但无论是SARSA或者Q-Learning都有一个很明显的问题,就是需要维护 Q ( s , a ) Q\left(s,a\right) Q(s,a),很多情况下,这个Q表会非常大,以至于算法根本无法实现。
- 那么,有没有什么办法能够近似的去表示或者拟合状态价值函数 v π ( s ) v_\pi\left(s\right) vπ(s)或状态-行为值函数 q π ( s , a ) q_\pi\left(s,a\right) qπ(s,a)呢?
深度神经网络的出现,为这一问题提供了可行的方法。后面,我们将详细介绍相关方法,并正式开启我们的深度强化学习之旅。