Deep Reinforcement Learning深度强化学习
Reinforcement Learning就是强化学习,最著名的应用就是Alpha Go。
有人认为AI=Deep Learning + Reinforcement Learning。
那么强化学习具体是什么呢?我们以下面的例子讲解:
有两个物体:机器Agent和环境Environment,Agent从Environment观察到的一切东西统称为状态State,Agent对Environment的改变称为行动Action,Environment根据Action传达给Agent的叫做反馈Reward。
比如下面机器把水杯打碎,又把水擦干净。
再以围棋为例,棋手就是Agent,棋局就是Environment,落子就是Action,输赢结果就是Reward。
但大多数情况,由于无法预测最后的胜负,因此Reward可能为0。
与监督学习对比。
监督学习要数据告诉机器该怎么做。但很多时候(比如围棋),人也不知道正确做法是什么。
而强化学习就不怕这个问题,机器会根据最后的结果自己学习如何做。
强化学习还可以运用于对话机器人。但面临一个问题:如何获得反馈?围棋有输赢,对话可没有。
目前没有太好的办法,只好让人来主观判断一段话将的好不好。
强化学习的难点
- Reward可能会延迟。有些Action不会在短期产生结果,但在长期来看很重要。
- Agent的行为会影响看到的数据,因此要让Agent会自己探索不同的Action。
Policy-based
Policy-based就是学一个Actor。所谓Actor,就是一个Function。机器观察到的state就是输入,做出的Action就是输出。而Environment对机器的Reward可以用来找出最好的Function。
我们知道,找一个Function有三个步骤:
首先,我们要决定模型,比如说模型是一个NN。输出就是选择不同Action的几率。
然后,我们要决定如何评价一个Function。设Actor为
π
θ
(
s
)
π_θ(s)
πθ(s)。我们
π
θ
(
s
)
π_θ(s)
πθ(s)玩一遍这个游戏就可以知道Total Reward:
R
θ
R_θ
Rθ,我们要最大化
R
θ
R_θ
Rθ。
但由于Actor和游戏本身有随机性,因此每次
R
θ
R_θ
Rθ每次会不一样。因此我们需要最大化的是
R
θ
R_θ
Rθ的期望值。
设
τ
=
{
s
1
,
a
1
,
r
1
,
s
2
,
a
2
,
r
2
,
.
.
.
,
s
T
,
a
T
,
r
T
}
τ=\{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}是一轮游戏的流程,
θ
θ
θ是当前的参数,则
τ
τ
τ出现的几率是
P
(
τ
∣
θ
)
P(τ|θ)
P(τ∣θ)。
枚举所有可能的
τ
τ
τ,即可算出最终分数的期望值。
但实际上不可能真的穷举,我们只能让
π
θ
(
s
)
π_θ(s)
πθ(s)玩N轮游戏,得到
τ
1
,
τ
2
,
.
.
.
τ
N
τ^1,τ^2,...τ^N
τ1,τ2,...τN,计算这些情况下的
R
θ
R_θ
Rθ平均值,近似看为期望值
R
ˉ
θ
\bar R_θ
Rˉθ。
最后第三步,找出最好的Function。方法还是Gradient Descent。
我们要找到一组参数
θ
∗
θ^*
θ∗来最大化
R
ˉ
θ
\bar R_θ
Rˉθ,还是老样子求微分即可。
注意:每次只对
P
(
τ
∣
θ
)
P(τ|θ)
P(τ∣θ)求微分,然后进行一点变形,变成求
▽
l
o
g
P
(
τ
∣
θ
)
▽logP(τ|θ)
▽logP(τ∣θ)。
最后我们得到
▽
l
o
g
P
(
τ
∣
θ
)
=
∑
t
=
1
T
▽
l
o
g
P
(
a
t
∣
s
t
,
θ
)
▽logP(τ|θ)=\sum_{t=1}^{T}{▽logP(a_t|s_t,θ)}
▽logP(τ∣θ)=∑t=1T▽logP(at∣st,θ),即在当前参数
θ
θ
θ和观察到
s
t
s_t
st时,做出Action
a
t
a_t
at的概率求log和。
这也是很符合直觉的。当我们在某一情况下采取了某一行动,发现结果是好的,那我们当然会增加这个几率。反之会降低这个几率。
我们观察到
▽
l
o
g
P
(
a
t
n
∣
s
t
n
,
θ
)
=
▽
P
(
a
t
n
∣
s
t
n
,
θ
)
P
(
a
t
n
∣
s
t
n
,
θ
)
▽logP(a^n_t|s^n_t,θ)=\frac{▽P(a^n_t|s^n_t,θ)}{P(a^n_t|s^n_t,θ)}
▽logP(atn∣stn,θ)=P(atn∣stn,θ)▽P(atn∣stn,θ),为什么要除以
P
(
a
t
n
∣
s
t
n
,
θ
)
P(a^n_t|s^n_t,θ)
P(atn∣stn,θ)呢?因为我们发现,有但Action可能会出现多次,就算他的回报可能不是很好,但积少成多最后机器就会选择这个Action,尽管实际上一些这个Action并不怎么样。而真正很好的Action可能很难出现,但这才是通关的关键。因此我们要除以
P
(
a
t
n
∣
s
t
n
,
θ
)
P(a^n_t|s^n_t,θ)
P(atn∣stn,θ)来消除出现次数对Gradient Descent的影响。
但有一个问题:在理想情况下,Reward比较小的Action出现几率会越来越小(就算他的Reward是正的),只有Reward相对大的Action几率才会变大。但由于我们是对每个Action进行抽样,有可能某些Action没被抽样到(比如那些Reward很大的Action),这样就会让那些Reward很小但是正的Action几率变大。这是不利于游戏的。
所以我们可以设一个基准值
b
b
b,只有Reward超过
b
b
b的Action几率才会增加。
还存在一个问题,我们看下图的例子。
在原始公式中,一个
τ
τ
τ周期内的所有Action所乘上的权重都是相同的(
R
(
τ
)
R(τ)
R(τ))。这似乎是反直觉的:一个周期内有那么多Action,他们有好有坏,为什么权重相同呢?而且,有时候在周期内某个Action影响力可能很大,从而掩盖了其他Action的影响力,让其他Action“躺赢”或者“背锅”显然是不合适的。
因此,我们重新设计公式:我们让每个Action的权重改为从这个Action到结束的Reward和,即:每个Action只对自己之后的事情负责,因为之前的事情和他没什么关系。这显然是符合直觉的。
我们还可以在再进一步,加入一组权重
γ
x
γ^x
γx表示距离为
x
x
x的两个Action互相之间的影响。一般来说
γ
<
1
γ<1
γ<1并且随着距离增大而减小。毕竟距离越远彼此之间越没啥关系。
我们将权重这一项统记为
A
θ
(
s
t
,
a
t
)
A^θ(s_t,a_t)
Aθ(st,at)。
Critics-based
相比于Policy,Critics的评价方法很不一样:他有一个状态评价函数
V
π
V^π
Vπ,输入是Environment的一个状态State,然后根据Actor也就是
π
π
π的情况,输出从当前这个状态开始到结束,一共能获得多少期望的Reward,记为
V
π
(
s
)
V^π(s)
Vπ(s)。
比如打砖块时,
V
π
V^π
Vπ会输出从现在到结束大概能得多少分。
比如下围棋,
V
π
V^π
Vπ会输出现在的局势下双方胜率是多少。
那么,如何做这个
V
π
V^π
Vπ呢?一般有两种办法。
第一种,蒙特卡洛法。先观察
π
π
π玩很多次游戏。然后看到一个state后将结果尽量向某一局游戏结果贴合。
第二种,时序查分算法。我们只需要知道从状态
s
a
s_a
sa到状态
s
b
s_b
sb需要做Action
a
a
a,获得Reward
r
r
r。那我们就可以训练一个Network,让
V
π
(
s
b
)
−
V
π
(
s
a
)
V^π(s_b)-V^π(s_a)
Vπ(sb)−Vπ(sa)尽可能接近
r
r
r。