强化学习算法的基本思想(直觉)
众所周知,强化学习是能让智能体实现某个具体任务的强大算法。
强化学习的基本思想是让智能体跟环境交互,通过环境的反馈让智能体调整自己的策略,从反馈中学习,不断学习来得到最优的策略(即以最优的方式实现某个具体任务)。
形式化强化学习的直觉(将算法的直觉变成可以量化的数学形式)
经过大量的研究,人们探索出一种适用于实现强化学习这个目标的数学框架——马尔科夫决策过程。
其实这个框架也不复杂,通过理解强化学习的思想,想想就知道起码得有这些简单的东西:
- 智能体的动作(肯定要行动,才能达成某个任务的目的)
- 环境的状态(智能体要根据环境状态决定自己要怎么样行动)
- 环境的反馈(智能体每次行动完,需要得到反馈才能知道自己的行动好还是不好)
仅仅从直觉上看差不多是这三个,因为直觉还是比较抽象的,要带入实际的案例才会发现还缺少哪些东西。
比如随便想想,下围棋的时候,是不是从下棋一开始到胜利都全部被智能体接管了,所以在这个过程中智能体需要连续进行行动,那么问题就来了,我定义只有下棋最终胜利的那一步行动才有奖励(正反馈),其余行动都没有奖励,这个定义很合理吧,但是在这个过程中每一步都没有奖励,也就相当于没有反馈,那智能体还怎么学习呢?
所以这个时候又要靠直觉思考一下,虽然围棋在胜利前每一步都没有奖励,但是这并不代表每一步都没有价值,如果是一个围棋高手,他下的每一步棋都是为了最后的胜利而铺垫的,可以说每一步棋的价值都很大。所以直觉上想通了,怎么把直觉转化为数学上可以精确量化的定义呢?
其实可以使用累积奖励作为该行动的价值,具体就是从当前状态出发,一直按照某个决策行动下去,到最后游戏结束得到的奖励总和,公式很简单就是
G
(
S
t
)
=
Σ
k
=
t
R
k
+
1
G(S_t) = \Sigma_{k=t} R_{k+1}
G(St)=Σk=tRk+1,即表示从时刻t开始,棋盘状态为S,该时刻的状态按照智能体的策略一直执行下去,到最终游戏结束,得到的奖励累计之和,就用这个表示当前状态S的价值。不过实操起来还是有问题,第一,我希望以尽可能短的步数赢下比赛,而这个公式似乎没有对于步数的惩罚,1000步赢下比赛和100赢下比赛的奖励总和是一样的,所以要进行修正,这里我们引入一个折扣因子
γ
∈
[
0
,
1
]
\gamma \in [0, 1]
γ∈[0,1],每走一步就要将当前行动得到的奖励乘以
γ
\gamma
γ,这样步数越多,最后得到的奖励越少,公式是:
G
(
S
t
)
=
Σ
k
=
0
γ
k
R
t
+
k
+
1
G(S_t) = \Sigma_{k=0} \gamma^kR_{t+k+1}
G(St)=Σk=0γkRt+k+1。
这样看起来就很完美了是吧?还没完,这个累加公式看起来很不错,但是缺少了关键的信息,这个公式是把每次行动后跳到一个状态时得到的奖励进行折扣累加,但是我怎么知道从一个状态做出行动后会跳到哪一个动作呢?假设t时刻,环境处于状态
S
t
S_t
St,智能体进行行动
A
t
A_t
At之后,环境变成什么样子了?即我想知道某个状态执行某个动作之后,跳转到下一个状态这之间的映射关系,即
S
t
+
1
=
f
(
S
t
,
A
t
)
S_{t+1} = f(S_t, A_t)
St+1=f(St,At)这个函数具体是什么样子,不过这个函数映射的形式是确定性的,就是说
S
t
S_t
St和
A
t
A_t
At确定了之后,
S
t
+
1
S_{t+1}
St+1也就唯一确定了,但很多情况往往是不确定的,比如你每学期你的状态都是摆烂,然后考试前你的行动都是通宵复习,但有时候你挂科了,有时候你及格了,还有时候你满分了,这就是不确定的,这是有概率的,当然在及格边缘的概率更大,所以我们定义这个环境变换的映射情况就叫做状态转移概率,即
P
(
S
t
+
1
∣
S
t
,
A
t
)
P(S_{t+1} \mid S_t,A_t)
P(St+1∣St,At)。当然对于游戏来说都是一般都是确定的,概率直接为1或者0就行。
总结一下,马尔科夫决策模型包含以下几个东西:
- S S S:环境状态的集合
- A A A:智能体动作的集合
- r ( s , a ) r(s,a) r(s,a):每个状态下行动后得到奖励函数,人为定义
- P ( s ′ ∣ s , a ) P(s'\mid s, a) P(s′∣s,a) :环境的状态转移概率
- γ \gamma γ:折扣因子
马尔科夫决策过程终于写完了,啰啰嗦嗦写了一大堆,强化学习的思想直觉两句话就搞定,把强化学习的思想形式化需要写这么多,看来直觉是不负责任的,将直觉转化成数学才是负责任的,难的东西。终于知道为什么有的论文明明很简单的方法,却能写那么多页了,因为将直觉形式化、数学化这中间有很多细节需要商榷和讨论。
不过这还只是强化学习算法的前提框架,在这个框架下各种算法的挖掘才是大头。
利用马尔科夫决策过程提供的抽象框架来真正得到最优决策
写累了,前面说一大堆,其实最后都是为了能够求解出智能体针对某个具体任务的最优决策。有了前面的基础,后面的求解算法其实没那么复杂了,我也写累了,所以这部分直接精简逻辑,让最本质的东西呈现出来,很简单。
我们想得到最优策略,这只是直觉上,还是那句话,形式化到数学上,其实就是最大化累计奖励。从某个状态出发,智能体进行一系列的决策已经得到了最大的累计奖励,再也没有别的决策能得到比这个决策更大的累计奖励了,所以自然该决策就是最优决策。
现在这个圈子内把这个累计奖励直接叫做回报(Return),用
G
t
G_t
Gt表示从t时刻(或者从某个状态开始)一直到结束得到的累计奖励,那么随便游戏从什么时候什么状态开始,我都希望该智能体的决策能够得到最大化的回报。
π
\pi
π代表的是智能体的策略,更具体一点,就是在状态
s
s
s下采取行动
a
a
a的策略,同样,策略一般也是用一个概率分布表示,即
π
(
a
∣
s
)
\pi(a \mid s)
π(a∣s)。前面说到用累计奖励作为状态的价值,其实就是用某个状态的回报作为该状态的价值,不过因为回报
G
t
G_t
Gt其实是一个随机变量,由状态转移概率
p
(
s
′
∣
s
,
a
)
p(s'|s,a)
p(s′∣s,a)和
π
(
a
∣
s
)
\pi(a |s)
π(a∣s)这两个分布决定,所以不好直接量化状态的价值,不过随机变量的期望是一个确定的值,可以作为量化的标准,所以很自然的,某个状态s的价值就可以化为这样一个状态价值函数:
v
π
(
s
)
=
E
(
G
t
∣
S
t
=
s
)
v_{\pi}(s) = E(G_t|S_t=s)
vπ(s)=E(Gt∣St=s),这个方程表示从t时刻开始,环境的状态是
s
s
s,在这个给定的条件下,
G
t
G_t
Gt(回报)的期望就是状态s的价值。
那现在其实就秀一下数学推理能力,把
v
π
(
s
)
=
E
(
G
t
∣
S
t
=
s
)
v_{\pi}(s) = E(G_t|S_t=s)
vπ(s)=E(Gt∣St=s)这个公式展开,然后经过三四步推理,很容易就能得到(推理要注意条件期望怎么展开怎么求,这一步有点绕,不过小心点还是很容易就能推出来):
v
π
(
s
)
=
E
[
R
t
+
1
+
γ
v
π
(
s
′
)
]
v_{\pi}(s) = E[R_{t+1} + \gamma v_{\pi}(s')]
vπ(s)=E[Rt+1+γvπ(s′)]这就是贝尔曼方程,即当前状态
s
s
s的价值可以用下一个状态
s
′
s'
s′的价值来表示。贝尔曼最优方程就是价值最大的那个
v
π
∗
=
m
a
x
π
v
(
s
)
v_{\pi}^* = max_{\pi}v(s)
vπ∗=maxπv(s)。
那这个时候不要忘记我们的初心,我们如果得到了最大的
v
(
s
)
v(s)
v(s),代表当前的策略是最优的策略,但这个最优的策略我怎么形式化表示出来呢?换句话说,处于状态
s
s
s时,我要选择什么样的动作a呢?显然在状态s下,我要选择价值最大的那个
a
a
a,这个价值最大是不是很熟悉,同理我们也可以定义状态-动作函数
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a),那这个
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)等于什么呢?还是跟之前一样的,还是用累计奖励呗!
q
π
(
s
,
a
)
=
E
[
R
t
+
1
+
γ
q
π
(
s
′
,
a
′
)
∣
S
t
=
s
,
A
t
=
a
]
q_{\pi}(s,a) = E[R_{t+1}+\gamma q_{\pi}(s',a') | S_t=s,A_t=a]
qπ(s,a)=E[Rt+1+γqπ(s′,a′)∣St=s,At=a]直观来看
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)与
v
π
(
s
)
v_{\pi}(s)
vπ(s)应该满足这样的关系:在状态s下,智能体可以有多个动作可以选择:
a
1
,
a
2
,
.
.
.
a_1,a_2,...
a1,a2,...,所以
v
π
(
s
)
v_{\pi}(s)
vπ(s)应该是
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)关于a的期望,即:
v
π
(
s
)
=
Σ
a
∈
A
π
(
a
∣
s
)
q
π
(
s
,
a
)
v_{\pi}(s) = \Sigma_{a \in A}\pi(a|s)q_{\pi}(s,a)
vπ(s)=Σa∈Aπ(a∣s)qπ(s,a)
言归正传,我要得到最优策略的形式化表述,其实就是希望在每个状态下面采取价值最大的那个行动,即希望找到
q
π
∗
(
s
,
a
)
=
m
a
x
π
q
(
s
,
a
)
q_{\pi}^*(s,a) = max_{\pi}q(s,a)
qπ∗(s,a)=maxπq(s,a)。那么根据
v
π
(
s
)
v_{\pi}(s)
vπ(s)和
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)的关系,其实可以推导出来
q
π
(
s
,
a
)
=
R
s
a
+
γ
Σ
s
′
∈
S
P
s
s
′
a
v
π
(
s
′
)
q_{\pi}(s,a) = R_s^a+\gamma \Sigma_{s'\in S}P_{ss'}^av_{\pi}(s')
qπ(s,a)=Rsa+γΣs′∈SPss′avπ(s′)。那其实问题就解决了,找到最优的
v
π
∗
=
m
a
x
π
v
(
s
)
v_{\pi}^* = max_{\pi}v(s)
vπ∗=maxπv(s)就行了。
那该怎么求解
v
π
∗
v_{\pi}^*
vπ∗呢? 其实就是解方程,先列好方程:
v
π
(
s
)
=
m
a
x
π
Σ
a
π
(
a
∣
s
)
q
π
(
s
,
a
)
,
v_{\pi}(s) = max_{\pi}\Sigma_a \pi (a|s)q_{\pi}(s,a),
vπ(s)=maxπΣaπ(a∣s)qπ(s,a),仔细观察这个方程,其实会发现要求右边式子的最大值,其实就是求在给定各种
q
1
,
q
2
,
q
3
.
.
.
q_1,q_2,q_3...
q1,q2,q3...的情况下,
π
(
a
∣
s
)
\pi (a|s)
π(a∣s)的概率如何分配能够使得右边式子达到最大值,那么显然我让具有最大
q
(
s
,
a
)
q(s,a)
q(s,a)值的对应的概率为1,其余概率为0,就能得到右边式子的最大值,所以对应解得
π
(
a
∣
s
)
=
{
0
,
a
≠
a
r
g
m
a
x
a
q
(
s
,
a
)
1
,
a
=
a
r
g
m
a
x
a
q
(
s
,
a
)
,
\pi (a|s) = \{^{1,\ a=argmax_aq(s,a)} _{0,\ a\not= argmax_aq(s,a)},
π(a∣s)={0, a=argmaxaq(s,a)1, a=argmaxaq(s,a),好了,
π
(
a
∣
s
)
\pi (a|s)
π(a∣s)的取值解决了,这个方程还需要解决的是
v
(
s
)
v(s)
v(s)如何求解,这个需要进一步抽象出来,现在把s看成是一个向量,表示所有可能的状态,那么就可以列这样一个方程:
v
(
s
)
=
m
a
x
π
(
r
π
+
γ
P
π
v
(
s
)
)
v(s) = max_{\pi}(r_{\pi}+\gamma P_{\pi}v(s))
v(s)=maxπ(rπ+γPπv(s)),所以这个方程具有这样的形式
v
=
f
(
v
)
v=f(v)
v=f(v),容易证明这个方程满足压缩映射定理,于是可以利用压缩映射定理的性质:存在
f
(
v
∗
)
=
v
∗
f(v^*) = v^*
f(v∗)=v∗,且
v
∗
v^*
v∗唯一,存在一个序列
v
k
v_k
vk,满足
v
k
+
1
=
f
(
v
k
)
v_{k+1} = f(v_k)
vk+1=f(vk),且当
k
→
∞
k \to \infin
k→∞时,
v
k
→
v
∗
v_k \to v^*
vk→v∗。所以通过随机初始化一个
v
0
v_0
v0然后不断迭代就能得到最终的方程的解
v
∗
v^*
v∗,不过需要注意的是,每次迭代过程中都需要带入前面求解的
π
(
a
∣
s
)
\pi (a|s)
π(a∣s),即每次迭代都要计算一次
π
(
a
∣
s
)
\pi (a|s)
π(a∣s)和对应的
v
k
v_k
vk。
至于上述求解出来的
v
∗
v^*
v∗是否真的就比所有的
v
π
v_{\pi}
vπ都要大,这个还需要通过一些数学步骤证明一下,这里就不再证明了,只要知道这个求解出来的价值就是最优的价值,对应的策略就是最优策略就行了。
上述的一个求解过程其实就是值迭代算法,对应的还有策略迭代算法,其实就是在值迭代的的过程中,策略
π
\pi
π暂时是固定的,一直通过高斯赛德迭代法求解当前策略的一个价值,等价值
v
π
(
s
)
v_{\pi}(s)
vπ(s)计算出来后,再利用
π
(
a
∣
s
)
=
{
0
,
a
≠
a
r
g
m
a
x
a
q
(
s
,
a
)
1
,
a
=
a
r
g
m
a
x
a
q
(
s
,
a
)
,
\pi (a|s) = \{^{1,\ a=argmax_aq(s,a)} _{0,\ a\not= argmax_aq(s,a)},
π(a∣s)={0, a=argmaxaq(s,a)1, a=argmaxaq(s,a),改进策略,改进完之后再固定该策略,然后再重复上述迭代。策略迭代算法相当于一个大的迭代里面包了一个小的迭代,而值迭代算法只有一个大的迭代。