注:笔记 来自知乎文章 深度强化学习综述(上)
Tips①:只是记录从这个文章学到的东西
Tips②:只摘选了文章中部分理论阅读整理
Tips③:重点是对文章中的一些公式进行理解,方便自己回顾
Tips④:本人也只是刚刚入门,本文如果有错误的地方,请在评论区指正,谢谢!
一、马尔可夫决策过程(MDP)
马尔可夫过程(MP)的特点是:(环境)系统下一时刻的状态只由当前时刻的状态决定,与更早时刻无关。
马尔可夫决策过程(MDP)与马尔可夫过程(MP)不同的点在于,MDP中智能体(Agent)可以执行动作(Action),从而改变自身状态和环境状态。
强化学习其实就是让智能体学会根据环境做出一个奖励最高的决策动作,也就是下图所表示的
强化学习的问题可以抽象为一个 MDP:
MDP:
{
S
,
A
,
P
,
R
a
,
γ
}
\text{MDP}:\{ S, A, P, R_a, \gamma \}
MDP:{S,A,P,Ra,γ}
其中各个属性的解释和举例如下:
-
S = { S 1 , S 2 , ⋯ , S n } S = \{ S_1, S_2, \cdots, S_n \} S={S1,S2,⋯,Sn} 表示所有状态的集合,即状态空间
s t s_t st 表示 t t t 时刻的状态
有一种特殊的状态,叫做终止状态(吸收状态) -
A = { A 1 , A 2 , ⋯ , A n } A = \{ A_1, A_2, \cdots, A_n \} A={A1,A2,⋯,An} 表示所有动作的集合,即动作空间
-
p a ( s , s ′ ) p_a(s, s') pa(s,s′) 表示状态 s s s 执行动作 a a a 后进入状态 s ′ s' s′ 的概率:
p a ( s , s ′ ) = p ( s t + 1 = s ∣ s t = s , a t = a ) p_a(s, s') = p(s_{t+1} = s | s_t = s , a_t = a) pa(s,s′)=p(st+1=s∣st=s,at=a)MDP 中的 P P P 可以理解成一个 ( n S , n A , n S ) (n_S, n_A, n_S) (nS,nA,nS) 形状的三维张量,可以称之为状态转移张量,里面任意一个元素 P [ S a ] [ A i ] [ S b ] P[S_a][A_i][S_b] P[Sa][Ai][Sb] 表示了在 S a S_a Sa 状态下 执行动作 A i A_i Ai 后转移到 S b S_b Sb 状态的概率
-
R a ( s , s ′ ) R_a(s, s') Ra(s,s′) 表示状态 s s s 执行动作 a a a 后进入状态 s ′ s' s′ 后得到的即时奖励,所以 R R R 是一个奖励函数
-
γ \gamma γ 为奖励衰减因子。
我们往往期望状态 s s s 能尽早达到我们的预期,因此 t t t 时刻的状态 s t s_t st 进入 s t + 1 s_{t+1} st+1 后得到的即时奖励将会衰减为原来的 γ t \gamma^{t} γt
个人理解 + 举例:
- MDP 更多是对 环境规则、个人期望 的描述。
- MDP 中的前三项 S 、 A 、 P S、A、P S、A、P 反应的是环境状态的可能情况、动作的可能情况、执行动作后状态迁移的概率分布,这些都是由环境规则决定的,一旦一个环境的规则确定下来,那么这些其实也是确定的。
- MDP 中的后两项
R
、
γ
R、\gamma
R、γ 反应的是个人期望,你希望得到一个什么样的最终状态、多快得到这个状态可以接受,你就要根据你的个人期望设置相应的 奖励函数
R
R
R 和 衰减因子
γ
\gamma
γ.
- 拿井字棋游戏举例,环境规则已经定好了(轮流下子,谁先
3
3
3 子连成一条直线则获胜),那么
- 状态 S S S 可以是所有你下子前的棋盘分布(也可以是稍作归纳后的棋谱)
- 动作空间 A A A 是你下子的 9 9 9 个位置
- 状态转移张量
P
P
P 则指示你,在你下子后,对方可能如何下子、使得棋盘变为何种新的状态,
P
P
P 将告知你进入各种状态的概率。
- 举个例子,第
3
3
3 回合,棋局状态
s
3
s_3
s3 如下:
◯ ◯ × ◯ × × 记为状态 S 1 % 此行注释 \def \arraystretch{2} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \\ \hline \times & \textcircled{} & \\ \hline & \times & \times \\ \hline \end{array} \qquad 记为状态 S_1 ◯×◯◯××记为状态S1
如果你在 s 3 = S 1 s_3 = S_1 s3=S1 的环境状态下做出了动作 a 3 = A 7 a_3 = A_7 a3=A7,即在从左往右、再从上往下数的第 7 7 7 个格子下 ◯ \textcircled{} ◯ 子,那么你可能得到的状态就是以下两种:
◯ ◯ × × ◯ ◯ × × 记为状态 S 2 ◯ ◯ × ◯ × ◯ × × 记为状态 S 3 \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \times \\ \hline \times & \textcircled{} & \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \qquad 记为状态 S_2 \\ \\ \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \\ \hline \times & \textcircled{} & \times \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \qquad 记为状态 S_3 \end{aligned} ◯×◯◯◯×××记为状态S2◯×◯◯◯×××记为状态S3
我们前面说过,状态转移张量 P P P 是一个三维的张量,我们假设这里状态空间有 n S n_S nS 个状态,这里动作空间有 9 9 9 个动作,那么我们的状态转移张量 P P P 的形状就是 ( n S , 9 , n S ) (n_S, 9, n_S) (nS,9,nS)
在当前状态 s 3 = S 1 s_3 = S_1 s3=S1 下,我们执行了动作 a 3 = A 7 a_3 = A_7 a3=A7,那么我们访问 P [ s 3 ] [ a 3 ] P[s_3][a_3] P[s3][a3] ,就可以得到下一状态 s 4 s_4 s4 的概率分布如下(这里我们假设对方会在所有能下子的地方随机下子):
a 3 = A 7 ⋯ S 2 S 3 ⋯ S 1 0 0.5 0.5 0 \def \arraystretch{1.6} \begin{array}{| c | c | c | c | c | } \hline a_3 = A_7 & \cdots & S_2 & S_3 & \cdots \\ \hline S_1 & 0 & 0.5 & 0.5 & 0 \\ \hline \end{array} a3=A7S1⋯0S20.5S30.5⋯0
如果你想看清 P P P 这个张量的全貌,那大概是 9 9 9 个下面这样的表的堆叠(把左上角的动作换掉):
a = A i 时 s t \ s t + 1 S 1 S 2 ⋯ S n ∑ S 1 1 S 2 1 ⋮ 1 S n 1 \def \arraystretch{1.6} \begin{array}{| c | c | c | c | c | c | } \hline a =A_i 时 s_t \; \backslash \; s_{t+1} & S_1 & S_2 & \cdots & S_n & \sum \\ \hline S_1 & & & & & 1 \\ \hline S_2 & & & & & 1 \\ \hline \vdots & & & & & 1 \\ \hline S_n & & & & & 1 \\ \hline \end{array} a=Ai时st\st+1S1S2⋮SnS1S2⋯Sn∑1111
- 举个例子,第
3
3
3 回合,棋局状态
s
3
s_3
s3 如下:
- 奖励函数
R
R
R 是你期望获胜而设置的,那你就需要在获胜时给予正的激励、平局或失败时给予负的激励。
- 比如你可以先将状态简单的划分为
S
初态
、
S
过程
、
S
获胜
、
S
平局
、
S
失败
S_{初态}、S_{过程}、S_{获胜}、S_{平局}、S_{失败}
S初态、S过程、S获胜、S平局、S失败,可以设置
R
R
R 为一个二维表如下:
R ( s t , s t + 1 ) S 初态 S 过程 S 获胜 S 平局 S 失败 S 初态 \ 0 \ \ \ S 过程 \ 0 100 − 20 − 200 S 获胜 \ \ \ \ \ S 平局 \ \ \ \ \ S 失败 \ \ \ \ \ \def \arraystretch{1.6} \begin{array}{| c | c | c | c | c | c | } \hline R(s_t, s_{t+1}) & S_{初态} & S_{过程} & S_{获胜} & S_{平局} & S_{失败} \\ \hline S_{初态} & \backslash & 0 & \backslash & \backslash & \backslash \\ \hline S_{过程} & \backslash & 0 & 100& -20 & -200 \\ \hline S_{获胜} & \backslash & \backslash & \backslash & \backslash & \backslash \\ \hline S_{平局} & \backslash & \backslash & \backslash & \backslash & \backslash \\ \hline S_{失败} & \backslash & \backslash & \backslash & \backslash & \backslash \\ \hline \end{array} R(st,st+1)S初态S过程S获胜S平局S失败S初态\\\\\S过程00\\\S获胜\100\\\S平局\−20\\\S失败\−200\\\
- 比如你可以先将状态简单的划分为
S
初态
、
S
过程
、
S
获胜
、
S
平局
、
S
失败
S_{初态}、S_{过程}、S_{获胜}、S_{平局}、S_{失败}
S初态、S过程、S获胜、S平局、S失败,可以设置
R
R
R 为一个二维表如下:
- 衰减因子
γ
\gamma
γ 是你为了尽快获胜而设置的一个奖励剩余系数
- 就拿我们之前讲状态转移张量
P
P
P 所举的 例子 来说,我们在
s
3
=
S
1
s_3 = S_1
s3=S1 状态选择了 动作
a
3
=
A
7
a_3 = A_7
a3=A7,后续有可能的状态转移如下:
◯ ◯ × ◯ × × s 3 = S 1 ( S 过程 ) → a 3 = A 7 ◯ ◯ × × ◯ ◯ × × s 4 = S 2 ( S 过程 ) → a 4 = A 6 ◯ ◯ × × ◯ ◯ ◯ × × s 5 = S 4 ( S 平局 ) ◯ ◯ × ◯ × ◯ × × s 4 = S 3 ( S 过程 ) → a 4 = A 3 ◯ ◯ ◯ × ◯ × ◯ × × s 5 = S 5 ( S 获胜 ) \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \\ \hline \times & \textcircled{} & \\ \hline & \times & \times \\ \hline \end{array} \\ s_3 = S_1(S_{过程}) \end{aligned} \qquad \xrightarrow[]{a_3 = A_7} \qquad \begin{aligned} \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \times \\ \hline \times & \textcircled{} & \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \\ s_4 = S_2(S_{过程}) \end{aligned} \qquad \xrightarrow[]{a_4 = A_6} \qquad \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \times \\ \hline \times & \textcircled{} & \textcircled{} \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \\ s_5 = S_4(S_{平局}) \end{aligned} \\ \\ \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \\ \hline \times & \textcircled{} & \times \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \\ s_4 = S_3(S_{过程}) \end{aligned} \qquad \xrightarrow[]{a_4 = A_3} \qquad \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \textcircled{} \\ \hline \times & \textcircled{} & \times \\ \hline \textcircled{} & \times & \times \\ \hline \end{array} \\ s_5 = S_5(S_{获胜}) \end{aligned} \end{aligned} ◯×◯◯××s3=S1(S过程)a3=A7◯×◯◯◯×××s4=S2(S过程)a4=A6◯×◯◯◯××◯×s5=S4(S平局)◯×◯◯◯×××s4=S3(S过程)a4=A3◯×◯◯◯×◯××s5=S5(S获胜)
如果我们在决策 a 4 a_4 a4 时能到 S 5 S_5 S5 这个获胜状态,就能获得激励 + 200 +200 +200。
然而实际上,我们在决策 a 3 a_3 a3 时,可以选择 a 3 = A 3 a_3 = A_3 a3=A3 这一更好的决策,那么我们在 t = 4 t = 4 t=4 时刻就能获胜,而不用等到 t = 5 t = 5 t=5 时刻。简单来说,我们是认为 t t t 越小,奖励越高的。
◯ ◯ × ◯ × × s 3 = S 1 ( S 过程 ) → a 3 = A 3 ◯ ◯ ◯ × ◯ × × s 4 = S 6 ( S 获胜 ) \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \\ \hline \times & \textcircled{} & \\ \hline & \times & \times \\ \hline \end{array} \\ s_3 = S_1(S_{过程}) \end{aligned} \qquad \xrightarrow[]{a_3 = A_3} \qquad \begin{aligned} \begin{aligned} \def \arraystretch{1.6} \begin{array}{| c | c | c | } \hline \textcircled{} & \textcircled{} & \textcircled{} \\ \hline \times & \textcircled{} & \\ \hline & \times & \times \\ \hline \end{array} \\ s_4 = S_6(S_{获胜}) \end{aligned} \end{aligned} ◯×◯◯××s3=S1(S过程)a3=A3◯×◯◯×◯×s4=S6(S获胜)
因此,我们需要让智能体了解到我们的期望( t t t 越小,奖励越高)。比如,我们可以设置衰减因子 γ = 0.8 \gamma = 0.8 γ=0.8,那么通过 a 3 = A 7 、 a 4 = A 3 a_3 = A_7、a_4 = A_3 a3=A7、a4=A3 的方式获胜,能得到的奖励只有 0. 8 4 × 200 = 81.92 0.8^4 \times 200 = 81.92 0.84×200=81.92,而通过 a 3 = A 3 a_3 = A_3 a3=A3 的方式获胜能得到的奖励有 0. 8 3 × 200 = 102.4 0.8^3 \times 200 = 102.4 0.83×200=102.4
通过衰减因子,智能体为了最大化奖励,就会学习怎样以最小的回合数获胜。
- 就拿我们之前讲状态转移张量
P
P
P 所举的 例子 来说,我们在
s
3
=
S
1
s_3 = S_1
s3=S1 状态选择了 动作
a
3
=
A
7
a_3 = A_7
a3=A7,后续有可能的状态转移如下:
二、智能体决策系统
在上一章节中,我们总结了:MDP 实际上是一个关于环境规则和个人期望的一个定义。
简单来说,MDP 给出了 游戏 / 仿真实验 的一个环境,并包含了我们对于这个 游戏 / 仿真实验 最终结果的一个期望。
还是下面这张图,MDP 相当于提供了环境的一个接口,它告诉我们环境是什么(状态 s t s_t st)、有哪些动作可以执行( A A A)、执行某个动作后环境会发生何种改变( P P P)、环境的改变会产生何种奖励( R R R)……
而我们强化学习的主要任务,则是训练一个智能体,让它来为我们做决策。
这个决策可以被抽象为一个函数,
{
确定性策略
a
t
=
π
(
s
t
)
不确定性策略
a
t
=
a
,
其中
π
(
a
∣
s
t
)
=
p
(
a
∣
s
t
)
,表示在状态
s
t
下按概率随机选取某个动作
\begin{cases} 确定性策略 &a_t = \pi(s_t) \\ \\ 不确定性策略 & a_t = a, \quad 其中 \; \pi(a | s_t) = p(a | s_t),表示在状态s_t下按概率随机选取某个动作 \\ \end{cases}
⎩
⎨
⎧确定性策略不确定性策略at=π(st)at=a,其中π(a∣st)=p(a∣st),表示在状态st下按概率随机选取某个动作
强化学习的目标,是为了让智能体决策出的动作,引发环境状态改变后的最终状态,能达到我们的期望。
我们在马尔可夫决策过程中定义了即时奖励函数 R ( s , s ′ ) R(s, s') R(s,s′),在这里我们再定义一个状态价值函数 V π ( s ) V_{\pi}(s) Vπ(s) ,它表示我们在状态 s s s 下一直按照策略 π \pi π 决策 直到终止状态所能获得的价值。
- 如果是确定性策略,并且每次执行一个动作进入的下一个状态是确定的,那么
V π ( s ) = ∑ t = 0 T γ t R π ( s t , s t + 1 ) V_{\pi}(s) = \sum_{t = 0}^{T} \gamma^t R_{\pi}(s_t, s_{t+1}) Vπ(s)=t=0∑TγtRπ(st,st+1) - 如果是确定性策略,并且每次执行一个动作进入的下一个状态是按概率随机的(比如下井字棋对手可能随机下子),那么
V π ( s ) = ∑ s ′ p π ( s , s ′ ) ( R π ( s , s ′ ) + γ V π ( s ′ ) ) V_{\pi}(s) = \sum_{s'} p_{\pi}(s, s')(R_{\pi}(s, s') + \gamma V_{\pi}(s')) Vπ(s)=s′∑pπ(s,s′)(Rπ(s,s′)+γVπ(s′))
简单理解就是,计算每一种可能的下一状态的奖励和后续价值,按概率加权求和(数学期望)。 - 【一般情况】如果是非确定性策略,并且每次执行一个动作进入的下一个状态是按概率随机的,那么
V π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ p a ( s , s ′ ) ( R a ( s , s ′ ) + γ V π ( s ′ ) ) V_{\pi}(s) = \sum_{a} \pi(a | s) \sum_{s'} p_{a}(s, s')(R_{a}(s, s') + \gamma V_{\pi}(s')) Vπ(s)=a∑π(a∣s)s′∑pa(s,s′)(Ra(s,s′)+γVπ(s′))
简单理解就是,计算每一种可能决策出的动作的各个后续状态的奖励和后续价值的加权求和,得到这个动作在当前状态下的价值(也就是下面要讲的动作价值 Q π ( s , a ) Q_{\pi}(s, a) Qπ(s,a)),再按决策出动作的概率加权求和(数学期望)。
特殊的情况,当到达终止状态,已经无法继续决策,不会有后续状态,也就没有价值,即终止状态的状态价值函数为0:
V
π
(
s
end
)
=
0
V_{\pi}(s_{\text{end}}) = 0
Vπ(send)=0
和状态价值函数类似,我们可以定义动作价值函数,以【一般情况】来说,有:
Q
π
(
s
,
a
)
=
∑
s
′
p
a
(
s
,
s
′
)
(
R
a
(
s
,
s
′
)
+
γ
V
π
(
s
′
)
)
V
π
(
s
)
=
∑
a
π
(
a
∣
s
)
Q
π
(
s
,
a
)
\begin{aligned} & Q_{\pi}(s, a) = \sum_{s'} p_{a}(s, s')(R_{a}(s, s') + \gamma V_{\pi}(s')) \\ \\ & V_{\pi}(s) = \sum_{a} \pi(a | s) \; Q_{\pi}(s, a) \end{aligned}
Qπ(s,a)=s′∑pa(s,s′)(Ra(s,s′)+γVπ(s′))Vπ(s)=a∑π(a∣s)Qπ(s,a)
这就是贝尔曼方程,也可以写成贝尔曼期望方程的形式:
Q
π
(
s
,
a
)
=
E
(
R
a
(
s
,
s
′
)
+
γ
V
π
(
s
′
)
∣
s
t
=
s
,
a
t
=
a
)
V
π
(
s
)
=
E
(
R
a
(
s
,
s
′
)
+
γ
V
π
(
s
′
)
∣
s
t
=
s
)
\begin{aligned} & Q_{\pi}(s, a) = E( \; R_{a}(s, s') + \gamma V_{\pi}(s') \; | \; s_t = s, \; a_t = a \; ) \\ \\ & V_{\pi}(s) = E( \; R_{a}(s, s') + \gamma V_{\pi}(s') \; | \; s_t = s \;) \end{aligned}
Qπ(s,a)=E(Ra(s,s′)+γVπ(s′)∣st=s,at=a)Vπ(s)=E(Ra(s,s′)+γVπ(s′)∣st=s)
那么如何判断策略的优劣呢,对于两个不同的策略 π \pi π 和 π ′ \pi' π′,对任意状态 s s s 都有 V π ( s ) ≥ V π ′ ( s ) V_{\pi}(s) \ge V_{\pi'}(s) Vπ(s)≥Vπ′(s),则称策略 π \pi π 优于策略 π ′ \pi' π′ .
最优动作价值函数和最优状态价值函数定义如下:
Q
∗
(
s
,
a
)
=
max
Q
π
(
s
,
a
)
V
∗
(
s
)
=
max
V
π
(
s
)
\begin{aligned} & Q^*(s, a) = \max Q_{\pi}(s, a) \\ & V^*(s) = \max V_{\pi}(s) \\ \end{aligned}
Q∗(s,a)=maxQπ(s,a)V∗(s)=maxVπ(s)
我们可以通过寻找最优动作价值函数找到最优策略:
π
∗
(
s
)
=
arg max
a
Q
∗
(
s
,
a
)
\pi^*(s) = \argmax_{a} Q^*(s, a)
π∗(s)=aargmaxQ∗(s,a)
Q ∗ ( s , a ) Q^*(s, a) Q∗(s,a) 和 V ∗ ( s ) V^*(s) V∗(s) 都满足贝尔曼最优性方程。
对于最优状态价值函数,有:
V
∗
(
s
)
=
max
∑
s
′
p
a
(
s
,
s
′
)
(
R
a
(
s
,
s
′
)
+
γ
V
∗
(
s
′
)
)
V^*(s) = \max \sum_{s'} p_{a}(s, s')(R_{a}(s, s') + \gamma V^*(s'))
V∗(s)=maxs′∑pa(s,s′)(Ra(s,s′)+γV∗(s′))
简单理解就是,要保证一个策略最优,需要保证当前状态执行的动作带来的奖励和下一状态的最优价值函数值之和最优。
对于最优动作价值函数,有
Q
∗
(
s
,
a
)
=
∑
s
′
p
a
(
s
,
s
′
)
(
R
a
(
s
,
s
′
)
+
γ
Q
∗
(
s
′
,
a
′
)
)
Q^*(s, a) = \sum_{s'} p_{a}(s, s')(R_{a}(s, s') + \gamma Q^*(s', a')) \\
Q∗(s,a)=s′∑pa(s,s′)(Ra(s,s′)+γQ∗(s′,a′))
简单理解就是,要保证一个策略最优,需要保证本次执行完动作 a a a 后,下一状态 s ′ s' s′ 执行的动作 a ′ a' a′ 是最优的。