前言:这篇笔记的内容按照强化学习部分正常的Learning Map来说,是应该放在PPO、Q-Learning等算法前面的,所以在标题这里加了一个(补),代表这篇笔记是后来补发的(学习的时候把笔记记到纸质本子上了…现在相当于誊写一遍,当然也有些当时没想到的或者手写起来不方便的内容)
强化学习的应用场景
以下内容来自: LeeML-Notes.(这个网站上面也是关于李宏毅老师这门课程的相关笔记,但关于强化学习这里就只有一节课的内容,我在这一节的个人笔记也加入了一些自己听课的时候遇到的一些问题和关于课程的内容的个人理解)
在Reinforcement Learning里面会有一个Agent跟一个Environment。这个Agent会有Observation看到世界种种变化,这个Observation又叫做State,这个State指的是环境的状态,也就是你的machine所看到的东西。所以在这个Reinforcement Learning领域才会有这个XXX做法,我们的state能够观察到一部分的情况,机器没有办法看到环境所有的状态,所以才会有这个partial of state 这个想法,这个state其实就是Observation。machine会做一些事情,它做的事情叫做Action,Action会影响环境,会跟环境产生一些互动。因为它对环境造成的一些影响,它会得到Reward,这个Reward告诉它,它的影响是好的还是不好的。
以游戏Space Invader为例,游戏的目标是操纵屏幕下方的飞船,开火击杀屏幕上方所有的外星舰艇。现在我们让一个machine来玩这个游戏。需要注意的是,在玩游戏这个任务中,machine看到的observation就是游戏画面 (images or pixels) 。
如图所示,游戏有一个初始画面,我们将这个Observation称为 s 1 s_1 s1。machine看到这个画面,决定要采取的Action,它在整局游戏中能采取的Action只有三个:
- Left(向左移动)
- Right(向右移动)
- Fire(开火)
machine得到的Reward即为游戏屏幕左上角的分数。现在假设它采取的Action是Right(这个Action称为
a
1
a_1
a1),由于采取这个Action它没有击杀任何舰艇,故得到的Reward
r
1
=
0
r_1=0
r1=0。Action会影响环境,故machine又看到了一个新的Observation,称其为
s
2
s_2
s2。假设machine看到
s
2
s_2
s2采取的Action
a
2
a_2
a2是Fire,再假设它的这次开火成功地击杀了一架外星舰艇,那此时他就得到了Reward
r
2
=
5
r_2=5
r2=5,并看到了一个新的Observation
s
3
s_3
s3。(需要注意的是,游戏中也有一些和machine完全无关的事件发生,如外星舰艇也会攻击玩家操作的飞船,而这些事件的发生是完全随机或者交由Environment决定的,即Environment本身也具有一些随机性)
上述的这个过程一直进行下去,直到当machine采取了某个Action
a
T
a_T
aT,获得了Reward
r
T
r_T
rT之后,游戏进入了一个最终状态,即导致游戏结束的状态(如未能躲避敌方舰艇的攻击被击杀)。
我们称这上述的整个从游戏开始到游戏结束的过程为一个Episode,显然,我们希望machine能达到的目标是在每个Episode中获得尽量大的cumulative reward(累计分数或者累计回报),这就需要machine不断地玩这个游戏来学习如何在被击杀之前击杀掉足够多的敌方舰艇。
强化学习的两个难点:
- Reward Delay(延迟回报)
在Space invader这个游戏中,飞船开火击杀敌方舰艇能够得到reward,但开火之前的位置移动对于能够击杀获得分数也是十分重要的。Left 和 Right 这两个Action,虽然不能得到即时的Reward,但它们能够决定将来的Fire Action能不能得到Reward。 - Agent‘s actions affect the subsequent data it receives
Agent采取的Action会影响到它接下来看到的Observation。这告诉我们machine需要学会Exploration,比如如果一个machine只会Left和Right操作而从来不开火,它就永远不知道Fire可能能够拿到Reward。
Outline of RL
RL的方法统统都可以分为两大类,一种是Policy-based方法,另一种是Value-based方法。在Policy-based方法中我们训练的是一个主要完成任务的Actor;在Value-based方法中我们训练的是不完成任务的一个Critic。两种方法的交集被称为Actor-Critic方法。
(下面的笔记内容都是Policy-based方法了,有关Value-based的内容在Q-Learning一节都介绍过了)
Policy-based 方法
Policy-based当中我们训练的是完成任务的Actor,Actor实际上是一个function:
A
c
t
o
r
=
π
(
O
b
s
e
r
v
a
t
i
o
n
)
Actor = \pi(Observation)
Actor=π(Observation)
看到上面这个式子,显然这个function的输入就是machine看到的Observation,输出则是Actor采取的Action
(有些文献中也将Actor称为Policy)
在学习DL的时候我们知道,解决DL问题一般都是三个步骤:定义函数集合、定义函数的好坏指标、根据对函数好坏的定义选择最优的函数。现在我们同样通过这三个步骤来剖析Policy-based方法。
定义函数集合:NN as actor
在Policy-based方法中,函数集合就是neural network,即Actor可以就是一个neural network。这个network的输入是以vector或matrix表示的machine看到的Observation,输出一般是一个n维的vector v v v(n为machine能够采取的Action数), v v v 的每一个元素代表采取这个Action的概率(Probability of taking the action)
定义函数的好坏
在RL问题中,定义Actor好坏的步骤一般是这样的:
给定一个包含参数
θ
\theta
θ 的网络作为actor,记为
π
θ
(
s
)
\pi_\theta(s)
πθ(s) ,让它去完成一个Episode,根据“强化学习的应用场景”一节当中的介绍,我们知道它会经历如下的过程:
将它在整个Episode中得到的总回报记为
R
θ
R_\theta
Rθ,显然有
R
θ
=
∑
t
=
1
T
r
t
R_\theta = \sum\limits_{t = 1}^T {{r_t}}
Rθ=t=1∑Trt
同样显然的是,我们希望这个
R
θ
R_\theta
Rθ越大越好。
然而,由于游戏(或者说Environment)有随机性的存在,即使用同样的actor玩同一个游戏,每个Episode最后得到的
R
θ
R_\theta
Rθ也不会是相同的。(其实还有另外一个原因,因为actor作为一个neural network,它的输出是一个vector,这个vector代表actor在这一步采取每个Action的可能性,也就是说即使是同样的actor,同样的Observation,采取的Action也不会完全相同)
所以我们期望的不是某一个Episode的总Reward越大越好,而是将
R
θ
R_\theta
Rθ视为一个随机变量,在进行很多个Episode之后(或者说进行了容量很大的抽样之后),得到的
R
θ
R_\theta
Rθ的期望值越大越好。我们将这个期望值记作
R
ˉ
θ
{\bar R_\theta }
Rˉθ,则
R
ˉ
θ
{\bar R_\theta }
Rˉθ就是一个衡量function好坏的指标。
问题来了,如何计算
R
ˉ
θ
{\bar R_\theta }
Rˉθ?
假设一场游戏可以视为一个状态-行动-回报序列(trajectory),我们将这个序列记为
τ
\tau
τ ,即
τ
=
{
s
1
,
a
1
,
r
1
,
s
2
,
a
2
,
r
2
,
.
.
.
,
s
T
,
a
T
,
r
T
}
\tau = \{{s_1},{a_1},{r_1},{s_2},{a_2},{r_2},...,{s_T},{a_T},{r_T}\}
τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT}
且
R
(
τ
)
=
∑
n
=
1
N
r
n
R(\tau) = \sum \limits^N_{n=1} r_n
R(τ)=n=1∑Nrn
接下来,我们就像理解
R
ˉ
θ
{\bar R_\theta }
Rˉθ的定义那样,将每个Episode都理解为一次抽样(Sampling),但这次抽样的个体不是
R
θ
R_\theta
Rθ ,而是
τ
\tau
τ 。抽样时每个个体
τ
\tau
τ 都有各自被抽取的可能性(可能相等,也可能不相等),而这个可能性是取决于actor的参数
θ
\theta
θ 的,我们将这个可能性记为
P
(
τ
∣
θ
)
P(\tau | \theta)
P(τ∣θ),表示当actor的参数为
θ
\theta
θ时,
τ
\tau
τ这个过程出现的几率。
理解了上面这段话,我们就能将
R
ˉ
θ
\bar R_\theta
Rˉθ重新表示为
R
ˉ
θ
=
∑
τ
R
(
τ
)
P
(
τ
∣
θ
)
\bar R_\theta = \sum \limits_\tau R(\tau)P(\tau|\theta)
Rˉθ=τ∑R(τ)P(τ∣θ)实际操作时要穷举所有的
τ
\tau
τ是不可能的,所以一般的做法是让actor
π
θ
\pi_\theta
πθ 玩N场游戏,得到N个序列
τ
\tau
τ
{
τ
1
,
τ
2
,
.
.
.
,
τ
N
}
\{\tau^1,\tau^2,...,\tau^N\}
{τ1,τ2,...,τN}这相当于从
P
(
τ
∣
θ
)
P(\tau |\theta)
P(τ∣θ)这个可能性当中进行N次抽样。当N足够大的时候就可以认为
R
ˉ
θ
=
∑
τ
R
(
τ
)
P
(
τ
∣
θ
)
≈
1
N
∑
n
=
1
N
R
(
τ
n
)
\bar R_\theta = \sum \limits_\tau R(\tau)P(\tau|\theta) \approx {1 \over N}\sum\limits^N_{n=1} R(\tau^n)
Rˉθ=τ∑R(τ)P(τ∣θ)≈N1n=1∑NR(τn)这样就完成了
R
ˉ
θ
{\bar R_\theta }
Rˉθ的计算。
选择最优的Function
在学习DL的时候我们知道选择最优函数最简单的方法就是Gradient Descent,当然这里由于我们期望的是最大值,故应该使用的是Gradient Ascent,大同小异。让我们用数学语言重新描述现在的问题:
θ
∗
=
arg
max
θ
R
ˉ
θ
{\theta ^*} = \arg \mathop {\max }\limits_\theta {\bar R_\theta }
θ∗=argθmaxRˉθ
R
ˉ
θ
=
∑
τ
R
(
τ
)
P
(
τ
∣
θ
)
\bar R_\theta = \sum \limits_\tau R(\tau)P(\tau|\theta)
Rˉθ=τ∑R(τ)P(τ∣θ)
使用Gradient Ascent来解决这个问题,即
- 选择初始值 θ 0 \theta^0 θ0
- θ 1 ← θ 0 + η ∇ R ˉ θ 0 \theta^1 \leftarrow \theta^0+\eta\nabla{\bar R_{\theta^0}} θ1←θ0+η∇Rˉθ0
- θ 2 ← θ 1 + η ∇ R ˉ θ 1 \theta^2 \leftarrow \theta^1+\eta\nabla{\bar R_{\theta^1}} θ2←θ1+η∇Rˉθ1
- …
其中,
θ
=
{
w
1
,
w
2
,
.
.
.
,
b
1
,
.
.
.
}
\theta = \{w_1,w_2,...,b_1,...\}
θ={w1,w2,...,b1,...}
∇
R
ˉ
θ
=
[
∂
R
ˉ
θ
/
∂
w
1
,
∂
R
ˉ
θ
/
∂
w
2
,
.
.
.
,
∂
R
ˉ
θ
/
∂
b
1
,
.
.
.
]
T
\nabla{\bar R_{\theta}} = [\partial{\bar R_\theta}/\partial{w_1},\partial{\bar R_\theta}/\partial{w_2},...,\partial{\bar R_\theta}/\partial{b_1},...]^T
∇Rˉθ=[∂Rˉθ/∂w1,∂Rˉθ/∂w2,...,∂Rˉθ/∂b1,...]T
梯度的具体计算过程如下:在
R
ˉ
θ
\bar R_\theta
Rˉθ的计算式中,显然
R
(
τ
)
R(\tau)
R(τ)是和
θ
\theta
θ 无关的,因此也不需要对它做微分,即:(下面的公式我能截图就截图了,公式编辑器用着太痛苦了)
为了让
P
(
τ
∣
θ
)
P(\tau|\theta)
P(τ∣θ)出现在这个式子当中的分子位置(后面会讲原因),需要做如下操作:
由于
故
∇
R
ˉ
θ
\nabla{\bar R_{\theta}}
∇Rˉθ也可以与下面这个式子划等号:
又因为当我们从
P
(
τ
∣
θ
)
P(\tau|\theta)
P(τ∣θ)这个可能性中进行足够多的N次抽样时
∑
τ
R
(
τ
)
P
(
τ
∣
θ
)
≈
1
N
∑
n
=
1
N
R
(
τ
n
)
\sum \limits_\tau R(\tau)P(\tau|\theta) \approx {1 \over N}\sum\limits^N_{n=1} R(\tau^n)
τ∑R(τ)P(τ∣θ)≈N1n=1∑NR(τn),因此丄式约等于
接下来,问题的中心点就在于如何求解
l
o
g
P
(
τ
n
∣
θ
)
logP(\tau^n|\theta)
logP(τn∣θ)的梯度,根据对
τ
\tau
τ的定义可以知道
对上式两端取对数,相乘变相加,即
显然上式右端只有第二项和
θ
\theta
θ有关,故
我们将上述所有式子结合起来得到
∇
R
ˉ
θ
\nabla{\bar R_{\theta}}
∇Rˉθ的表示式:
这个式子的意思是:
当在一个Episode的序列
τ
n
\tau_n
τn中,若machine在状态
s
t
n
s^n_t
stn下采取了
a
t
n
a^n_t
atn的Action,最终导致这个Episode的Reward
R
(
τ
n
)
R(\tau^n)
R(τn)为正,则要调整
θ
\theta
θ的值让machine在状态
s
t
n
s^n_t
stn下采取Action
a
t
n
a^n_t
atn的几率提高;
反之,若machine在状态
s
t
n
s^n_t
stn下采取了
a
t
n
a^n_t
atn的Action,最终导致这个Episode的Reward
R
(
τ
n
)
R(\tau^n)
R(τn)为负,则要调整
θ
\theta
θ的值让machine在状态
s
t
n
s^n_t
stn下采取Action
a
t
n
a^n_t
atn的几率降低。
(怎么调整?当然通过
θ
n
e
w
←
θ
o
l
d
+
η
∇
R
ˉ
θ
o
l
d
\theta^{new} \leftarrow \theta^{old}+\eta\nabla{\bar R_{\theta^{old}}}
θnew←θold+η∇Rˉθold调整啦~)
需要注意的是,虽然在
∇
R
ˉ
θ
\nabla{\bar R_{\theta}}
∇Rˉθ的最终表示式里的最后一项是在某一个时间点t的状态采取对应Action的概率,但前面相乘的还是整个Episode的Reward,而不是这一步Action所得到的即时Reward。(这个问题也很好理解,如果相乘的是即时Reward的话,因为只有开火能得到即时Reward,最后训练出来的Actor就是一个不会左右移动的无情开火机器)
Q:为什么对几率的对数取梯度?不能直接对几率去梯度吗?
(待解决)
Tips:Baseline的使用
Q:我们最后是根据
R
(
τ
n
)
R(\tau^n)
R(τn)的正负来调整
θ
\theta
θ,但如果在某个游戏当中,所有的Reward都是正数该怎么解决?(Space invader其实就属于这种情况,因为这个游戏的分数永远不会是负值)
A:使用如下的式子来计算
∇
R
ˉ
θ
\nabla{\bar R_{\theta}}
∇Rˉθ:
除了给
R
(
τ
n
)
R(\tau^n)
R(τn)减去一个b以外没有其他的不同,这个b让
R
(
τ
n
)
R(\tau^n)
R(τn)的值有正有负,我们将它成为Baseline,Baseline的值是自己定义的)