文章目录
一、什么是强化学习
强化学习的流程可以用上面这张图来说明:智能体(Agent)对环境进行观测,然后根据观测结果(Observation / State)采取相应的动作(Action),动作作用于环境(Environment)之后,环境就会产生相应的变化,这样智能体就可以再一次得到新的观测结果,同时环境也会给智能体一个反馈(Reward)表明这个动作是好的还是不好的。强化学习就是想办法找到一个策略能够最大化总的反馈(Total reward)。
比较成功的应用,如:AlphaGo,下围棋时,它的Observation就是棋盘的情况,根据棋局的形式采取一个Action下一步棋。然后根据Environment的反馈情况,得到一个Reward和新的Observation,再进行下一次的分析和动作。
通过上述围棋的例子,我们不难发现,Environment是由系统本身决定的,Observation本质上也只是通过某种转换由Environment变动过来的,在这个例子中,可以是一个视觉神经网络,将棋局转换成数学矩阵。同时,有一个好的 Agent(策略生成) 也很重要,它决定了实际的Action,在没有深度学习之前,用过一些类似于表格的形式,根据局势进行查表,决定怎么下一步怎么走。这种方式本质上也是一种有监督学习。但围棋这个数学组合很难穷举,但有了Reinforcement Learning就不同了,通过一个通用的神经网络来分析形势。这也是Supervised Learning和Reinforcement Learning的差异。
而Reward这个变量就比较特殊,虽然也是和Environment有关系,但也是由人为定义的一些规则来决定的,比如围住了对方的棋子,得1分;被围住得-1分,没有棋子数量变动为0分。所以如何从一个定义好的Reward规则也很重要。这里的Reward设定也有它的弊端,即得分为0的情况是比较常见的,得分或扣分的情况是比较少见的,所以它的Reward是比较稀疏。
二、强化学习的应用
Supervised Learning的方法在某些问题也不适用,比如在聊天机器人(Chatbot)训练时,上一个人的提问,没有完全对应的答案。
而利用Reinforcement Learning的思想,虽然对话没有像围棋一样有明确的得分Reward规则,但我们可以train两个Chatbot互相对话,人为定义一个规则:“通过查看对话记录,来评判是好是坏”。
还有一个比较常见的应用:电子游戏,OpenAI也有对应的python游戏环境,可以用于强化学习的训练。
比如上述的Video Game就来自于gym。左上角是分数,中间是需要打击的目标,玩家可以左右移动,开火。转换到RL中就是三个Action。
gym中的游戏Environment已经转换成矩阵给到用户,可以直接给到Agent,得到Action。像这个游戏中击杀一个外星人,可以得到5分。当采取一个Action之后,Environment也会发生变化(通常都是随机的),这样我们又进入了下个Action生成的阶段。
当游戏进行了N次这样的循环之后,当采取了某次Action- α T \alpha_T αT之后,游戏进入了终止状态,这时候得到了一个总的Reward。那么这一整个游戏过程,我们称为episode,通常我们以一个episode和它对应总的Reward为一个训练数据。为什么这么做呢?
这里就要回到我们上面提到Reward设计的弊端了,有时候Reward的规则往往会导致Agent没法得到即时的奖励,但这又是无法避免的。在现实生活中,这种问题比较常见,比如下棋中,短期的诱敌牺牲可能为后期的胜利做铺垫。所以Reward的delay是很常见的,所以我们在训练的时候也需要将这种情况考虑进去。
其次Agent作为一个小白,如果仅以即时奖励为优化目标,那么在alien游戏中,它只有开火才能得分,那么训出来的Agent就只会开火。
三、强化学习的分类
强化学习的方法分为两大块,一个是Policy-based的方法,一个是Value-based的方法
- **Policy-based:**训练一个做策略的的Actor
- **Value-based:**训练一个评价的Critic
两个方法各有各的好处,也有对应的弊端,而后出来了一个Actor-Critic的方法,是将两个方法结合起来,有点类似于CV中的GAN(对抗生成式网络),而著名的Alpha Go则是几种方法的大杂烩,甚至还有Model-based的方法,它是擅长预测未来会发生的事情,一般在棋类中遇到的比较多。而电子游戏中的用的比较少(比较难穷举未来可能会发生的情况)
四、如何训练强化学习
Policy-Based
以Policy-Based的方法为例子,首先我们要明确,我们所需要的是什么,刚刚上面的介绍说到了,Environment是外界环境,而Reward是由人为制定的规则或环境本身所产生的。那么实际上,我们能控制的只有Agent本身,那么用深度学习实现Agent,思路就很明确了,我们只需要优化一个模型,使得它的输入为Observation,输出为实际的Action即可。这个Agent的输出可以是一种行为的汇总(Actor)或是一种策略(Policy)。
训练分三步走,1、确定方法是什么,2、确定方法的好坏,3、选择最好的方法。用神经网络的当作Actor的方式,就可以用深度学习的方式训练它。
Define function
如上述例子所示,将神经网络作为一个Actor,它的输入是游戏画面,输出则为三个action的概率,根据概率最大值做对应的策略。如果用查表的方式去做强化学习(把所有可能的情况都穷举),这个方法在游戏中是不可能的,尤其是MOBA类的游戏,可能性太多了。用神经网络替代的最大好处就是泛化性强。
Goodness of Function
如何确定一个Actor是好还是不好呢?最直接的方法就是让这个Actor去玩游戏,每一轮迭代得到一个奖励 r t r_t rt,将所有的 r t r_t rt累加起来就是总的奖励 R θ R_\theta Rθ,其中 θ \theta θ为一个网络的参数。即使 θ \theta θ的参数完全相同,由于Actor本身带有随机性和Environment的变化, R θ R_\theta Rθ总是有可能不一样。所以我们是希望去使得 R θ R_\theta Rθ的值越大越好,也即 R θ R_\theta Rθ的期望值 R ‾ θ \overline{R}_\theta Rθ越大越好。
我们将一次探索(episode)的过程称为trajectory -
τ
\tau
τ(即
s
1
,
a
1
,
r
1
.
.
.
s
T
,
a
T
,
r
T
{s_1, a_1, r_1 ... s_T, a_T, r_T}
s1,a1,r1...sT,aT,rT的集合),如果我们用一个Actor去玩游戏,每一个
τ
\tau
τ都有其可能出现的概率记作
P
(
τ
∣
θ
)
P(\tau|\theta)
P(τ∣θ),那么我们就可以
R
‾
θ
\overline{R}_\theta
Rθ的公式写出来:
R
‾
θ
=
∑
t
R
(
τ
)
P
(
τ
∣
θ
)
≈
1
N
∑
n
=
1
N
R
(
τ
n
)
\overline{R}_\theta = \sum_tR(\tau)P(\tau|\theta) \approx \dfrac{1}{N}\sum_{n=1}^N R(\tau^n)
Rθ=t∑R(τ)P(τ∣θ)≈N1n=1∑NR(τn)
实际上,穷举所有的
τ
\tau
τ也不可能。但我们可以进行有限次的尝试:用这个Actor玩N次游戏,某个
τ
\tau
τ出现的次数特别多,那对应的Probability会越高,在采样的时候也会更容易被选中。最后我们将N次的Reward求和取平均,就得到了最终的
R
‾
θ
\overline{R}_\theta
Rθ,不难发现,我们尝试的次数越多,其覆盖的情况就越全面,
R
‾
θ
\overline{R}_\theta
Rθ则越准。
Pick the best function
按照前文所表述,我们的优化目标是 R ‾ θ \overline{R}_\theta Rθ,所以接下来我们可以用梯度上升的方式去找一个最好的 θ \theta θ,其实这一块就和深度学习的梯度下降优化刚好反过来了。
梯度上升的过程推导如上图所示,这一块主要是一些数学的证明,这边只做简单的解释,如果不想看的话可以直接跳过。
首先
R
(
τ
)
R(\tau)
R(τ)是外界环境所决定的,这个变量本身就推不出来,算是个黑盒子,所以不可微分,我们可以不理它。
∇
P
(
τ
∣
θ
)
\nabla P(\tau|\theta)
∇P(τ∣θ)上下同乘一个
P
(
τ
∣
θ
)
P(\tau|\theta)
P(τ∣θ),可得:
∇
R
‾
θ
=
∑
t
R
(
τ
)
P
(
τ
∣
θ
)
∇
P
(
τ
∣
θ
)
P
(
τ
∣
θ
)
=
R
(
τ
)
P
(
τ
∣
θ
)
∇
l
o
g
P
(
τ
∣
θ
)
≈
1
N
∑
n
=
1
N
R
(
τ
n
)
∇
l
o
g
P
(
τ
n
∣
θ
)
\begin{aligned} \nabla \overline{R}_\theta &= \sum_tR(\tau)P(\tau|\theta) \nabla \dfrac{P(\tau|\theta)}{P(\tau|\theta)} \\ & =R(\tau)P(\tau|\theta) \nabla logP(\tau|\theta) \\ & \approx \dfrac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla logP(\tau^n|\theta) \end{aligned}
∇Rθ=t∑R(τ)P(τ∣θ)∇P(τ∣θ)P(τ∣θ)=R(τ)P(τ∣θ)∇logP(τ∣θ)≈N1n=1∑NR(τn)∇logP(τn∣θ)
为什么会等于下面这一项呢?这是个数学定理。最后结果约等于加权所有的Reward取平均,再乘上计算
l
o
g
P
(
τ
n
∣
θ
)
logP(\tau^n|\theta)
logP(τn∣θ)。
那么现在问题就转变成,如何计算 l o g P ( τ n ∣ θ ) logP(\tau^n|\theta) logP(τn∣θ)了。
如上图所示,我们将 P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)拆分开,其中:
p ( s 1 ) p(s_1) p(s1)是指游戏刚开始时,碰上 s 1 s_1 s1的概率;
p ( a 1 ∣ s 1 , θ ) p(a_1|s_1,\theta) p(a1∣s1,θ)是指环境为 s 1 s_1 s1且用 θ \theta θ生成策略时,得到 a 1 a_1 a1的概率;
p ( r 1 , s 2 ∣ s 1 , a 1 ) p(r_1, s_2|s_1,a_1) p(r1,s2∣s1,a1)是指环境为 s 1 s_1 s1时,采用了 a 1 a_1 a1的动作,得到了 r 1 r_1 r1奖励且环境由 s 1 s_1 s1转变为 s 2 s_2 s2的概率;
后面的几项以此类推。
那么从图上可以看除,黄色的两项和Actor是无关的,红色的那项是和Actor有关的。
P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)分解完之后,继续加上 l o g log log项,无非就是相乘变相加。 l o g p ( s 1 ) logp(s_1) logp(s1)和 l o g p ( r t , s t + 1 ∣ s t , a t ) logp(r_t,s_{t+1}|s_t, a_t) logp(rt,st+1∣st,at)都和Actor无关,我们都可以忽略。
所以整个式子最后可以简化成:
1
N
∑
n
=
1
N
∑
t
=
1
T
n
R
(
τ
n
)
∇
l
o
g
p
(
a
t
n
∣
s
t
n
,
θ
)
\dfrac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla logp(a^n_t|s^n_t,\theta)
N1n=1∑Nt=1∑TnR(τn)∇logp(atn∣stn,θ)
这个式子可以理解为:在某次玩游戏的过程中,即
τ
n
\tau^n
τn的情况下,遇到
s
t
n
s_t^n
stn采取了
a
t
n
a_t^n
atn的行为,得到一个
R
(
τ
n
)
R(\tau^n)
R(τn),如果它是正的,那我们希望它出现的概率
p
(
a
t
n
∣
s
t
n
)
p(a^n_t|s^n_t)
p(atn∣stn)越大越好,反之越小越好。
这里再次强调一下,虽然 ∇ l o g p ( a t n ∣ s t n , θ ) \nabla logp(a^n_t|s^n_t,\theta) ∇logp(atn∣stn,θ)这一项是某个时刻下采取了一个action的概率微分,但它是需要乘上总的Reward作为系数。如果是拿当下得到的reward,那么它每次都只会选择目前能得到reward的action,这样训练出来的network是非常**“短视”,没有“大局观”**
回过来再细说一下为什么要对
p
(
a
t
n
∣
s
t
n
,
θ
)
p(a^n_t|s^n_t,\theta)
p(atn∣stn,θ)取对数呢?根据前面图片的定理,有:
∇
l
o
g
p
(
a
t
n
∣
s
t
n
,
θ
)
=
∇
p
(
a
t
n
∣
s
t
n
,
θ
)
p
(
a
t
n
∣
s
t
n
,
θ
)
\nabla logp(a^n_t|s^n_t,\theta) = \dfrac{\nabla p(a^n_t|s^n_t,\theta)}{ p(a^n_t|s^n_t,\theta)}
∇logp(atn∣stn,θ)=p(atn∣stn,θ)∇p(atn∣stn,θ)
这个式子就更好解释了,现在我们按照上图假设:总共四次
τ
\tau
τ,其中采取了action b有3次,得到的reward是1,采取action a有1次,得到的reward是2。理论上我们应该多采样action a,因为它得到的reward是更高的。但实际上,action b出现的次数比较多,它的概率会更高,实际采样的时候会偏向于action b。那么在优化的时候我们就应该除一个
p
(
a
t
n
∣
s
t
n
,
θ
)
p(a^n_t|s^n_t,\theta)
p(atn∣stn,θ),相当于做一次normalization,给reward更高的action a更多优化空间。
这边其实还有一个细节需要注意,当Environment给到的Reward都是非负值时,需要加上一项,降低其baseline。按照刚刚normalization的优化思路,它会让a、b、c出现的概率更均衡,这是理想的思路。但实际优化过程中,我们做的是有限次数的采样,可能就只采样到b、c,而a压根就没采样到,network根本不知道a表现如何,a的几率会越变越小。
所以我们减去一个 b b b值(是个超参数),当实际得到的Reward大于这个baseline,你才能让它优化,小于baseline,就应该让它减少。
以上内容为李宏毅老师课程中的总结。