详解策略梯度算法
Posted 行者AI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解策略梯度算法相关的知识,希望对你有一定的参考价值。
本文首发于行者AI
引言
根据智能体学习的不同,可将其分为Value-based方法、Policy-based方法以及Actor-Critic方法。之前我们介绍的Q-learning、Saras和DQN都是基于价值去学习,虽然这种强化学习方法在很多领域都获得较多的应用,但是它的局限性也是比较明显。首先这类算法基本上都是处理离散动作,建立简单的Q表,很难对连续动作进行处理,更无法建立庞大的Q表;其次基于价值的方法使用值函数去近似Q值,虽然可以较高效率地解决连续状态空间的问题,但动作依然只是离散的,动作选择的策略也是不会变化的,通常是一个确定性的策略,但有些实际问题需要的最优策略并不是确定性的,而是随机策略,比如石头剪刀布,如果按照一种确定性策略出拳,那么当别人抓住规律时,你就会输。所以我们需要引入一个新的方法去解决以上问题,比如策略梯度的方法。
1. 蒙特卡罗
再讲解策略梯度算法(Policy Gradient,简称PG)前,大家可以先了解一下蒙特卡罗算法,首先我们来看一个小故事:
在火影时代,还是下忍的鸣人为了提升自己的能力,从木叶忍者任务中心接了一个C级任务,在做任务的时候,突然被一个戴面具的人困在幻境中。类似迷宫的幻境(出口是光之门,可以理解为带光的门),鸣人怎么走都出不去,这个幻境虽然有很多出口,但只有最近的出口通过光之门才能走出幻境,其他的出口虽然有光之门,但是过不去。有可能鸣人对数学方面也颇有造诣,他用自己学习的禁术多重影分身之术,分出很多个分身(假设足够多,不要问作为下忍的鸣人查克拉够不够,在危急时刻,他可以向体内的九尾借啊),然后开始对每一个分身交代任务:
注意: 分身都从起点出发,每走一步,都会得到相应的查克拉补充或降低能量(奖励,有正有负)。且每一个分身面对分叉路口的选择都是平均选择。忽略奖励的折扣因子。
- 你们每个人都需要找到一个出口,不论远近,且途中每走一步都需要将自己所经过的路径和得到查克拉的多少记录到卷轴上;
- 记录走过的这条路径获得的总查克拉,原路返回到出发点;
- 将你们每个人得到的总奖励进行平均,最终结果汇报给我,作为当前出发点的值。
- 然后将出发点换成下一步可以选择的出发地,重复1~3。
鸣人拿到所有路口的值后,每遇到一个分叉路口就选择值最大的那个路口,最终鸣人成功的走出了幻境。
上面的故事其实是类似蒙特卡罗算法,具体如下;
蒙特卡罗算法是基于采样的方法,给定策略 π \\pi π,让智能体与环境进行交互,就会得到很多条轨迹。 每条轨迹都有对应的回报,我们把每条轨迹的回报进行平均,就可以知道某一个策略下面对应状态的价值。这句话拆分开来可以对应上述故事:
- 蒙特卡罗是基于采样的方法。(对应故事中鸣人的分身足够多)
- 需要给定一个策略 π \\pi π(对应故事中每个分身遇到分叉路口都是平均选择)
- 智能体与环境进行交互,得到很多轨迹。(对应故事中每一个分身在幻境中找出口的过程,每个分身对应一条轨迹)
- 每条轨迹都有对应的回报。(对应故事中每个分身得到的总奖励)
- 将每条轨迹的回报进行平均,就得到对应状态的价值了。(对应鸣人将每个分身的总奖励进行平均)
2. 策略梯度算法
2.1 介绍
在强化学习中,有三个组成部分:演员(actor)、环境和奖励函数。其中环境和奖励函数不是我们可以控制的,在开始学习之前就已经事先给定。演员里会有一个策略,它用来决定演员的动作。策略就是给定一个外界输入,它会输出演员现在应该要执行的动作。我们唯一可以做的就是调整演员里面的策略,使得演员可以得到最大的奖励。
当我们将深度学习与强化学习相结合时,策略π就是一个网络,用 θ \\theta θ表示 π \\pi π的参数。举上面幻境的例子,输入就是当前分身所在的分叉路口,假设可以向上,向下,向左走,经过策略网络后,输出就是三个动作可以选择的概率。然后演员就根据这个概率的分布来决定它要采取的动作,概率分布不同,演员采取的动作也不同。简单来说,策略的网络输出是一个概率分布,演员根据这个分布去做采样,决定实际上要采取的动作是哪一个。
其实PG就是蒙特卡罗与神经网络结合的算法,PG不再像Q-learning、DQN一样输出Q值,而是在一个连续区间内直接输出当前状态可以采用所有动作的概率。
我们之前在讲解基于价值的方法中,使用价值函数近似将Q表更新问题变成一个函数拟合问题,相近的状态得到相近的输出动作,如下式,通过更新参数w使得函数f逼近最优Q值。
Q
(
s
,
a
)
≈
f
(
s
,
a
,
w
)
Q(s, a) \\approx f(s, a, w)
Q(s,a)≈f(s,a,w)
在PG算法中,因为策略是一个概率,不能直接用来迭代,所以我们采取类似的思路,将其转化为函数形式,如下式所示,这时我们的目的则是使用带有
θ
\\theta
θ参数的函数对策略进行近似,通过更新参数
θ
\\theta
θ,逼近最优策略。
π
(
a
∣
s
)
≈
π
θ
(
s
,
a
)
=
P
(
a
∣
s
,
θ
)
π(a|s)≈πθ(s,a)=P(a|s,θ)
π(a∣s)≈πθ(s,a)=P(a∣s,θ)
现在有了策略函数,我们的目标当然是优化它,那么该如何知道优化后的策略函数的优劣呢。大家肯定会想到需要一个可以优化的目标函数,我们让这个目标函数朝着最大值的方向去优化,它的主要作用就是用来衡量策略的好坏程度。
2.2 算法内容
首先,我们可以把环境看成一个函数,这个函数一开始就先吐出一个状态,假如这个状态是游戏的画面,接下来演员看到这个游戏画面 s 1 s_1 s1以后,选择了 a 1 a_1 a1这个动作。环境把 a 1 a_1 a1当作它的输入,再吐出 s 2 s_2 s2,也就是吐出新的游戏画面。演员看到新的游戏画面,再采取新的动作 a 2 a_2 a2。环境再看 a 2 a_2 a2,再吐出 s 3 s_3 s3。这个过程会一直持续到环境觉得应该要停止为止。
在一场游戏中,演员通过与环境的不断交互最终结束,根据上述的说明,可以得到一条轨迹,表示为
τ
\\tau
τ,其中
s
s
s表示状态,
a
a
a表示行动,
s
1
s_1
s1,
a
1
a_1
a1表示演员在状态1的时候选择了动作1,后面的以此类推。如下式所示。
τ
=
s
1
,
a
1
,
s
2
,
a
2
,
⋯
,
s
t
,
a
t
\\tau=\\left\\s_1, a_1, s_2, a_2, \\cdots, s_t, a_t\\right\\
τ=s1,a1,s2,a2,⋯,st,at
那么假设当前演员的策略网络参数是
θ
\\theta
θ,我们就可以计算这一条轨迹发生的概率。它取决于两部分,环境的动作和智能体的动作,如下式所示,它就表示一条轨迹产生后所发生的概率。
p
θ
(
τ
)
=
p
(
s
1
)
p
θ
(
a
1
∣
s
1
)
p
(
s
2
∣
s
1
,
a
1
)
p
θ
(
a
2
∣
s
2
)
p
(
s
3
∣
s
2
,
a
2
)
⋯
=
p
(
s
1
)
∏
t
=
1
T
p
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
\\beginaligned p_\\theta(\\tau) &=p\\left(s_1\\right) p_\\theta\\left(a_1 \\mid s_1\\right) p\\left(s_2 \\mid s_1, a_1\\right) p_\\theta\\left(a_2 \\mid s_2\\right) p\\left(s_3 \\mid s_2, a_2\\right) \\cdots \\\\ &=p\\left(s_1\\right) \\prod_t=1^T p_\\theta\\left(a_t \\mid s_t\\right) p\\left(s_t+1 \\mid s_t, a_t\\right) \\endaligned
pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,a2)⋯=p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)
环境的动作是指环境的函数内部的参数或内部的规则长什么样子,它是无法控制的,提前已经写好,
p
(
s
t
+
1
∣
s
t
,
a
t
)
p\\left(s_t+1 \\mid s_t, a_t\\right)
p(st+1∣st,at) 代表环境。智能体的动作是指能够自己控制,
p
θ
(
a
t
∣
s
t
)
p_\\theta\\left(a_t \\mid s_t\\right)
pθ(at∣st)代表智能体,给定一个状态
s
t
s_t
st,演员要采取什么样的动作
a
t
a_t
at会取决于演员的参数
θ
\\theta
θ,所以这部分是演员可以自己控制的。随着演员的动作不同,每个同样的轨迹,它就会有不同的出现的概率。
除了环境跟演员以外,还有奖励函数。给它输入 s 1 s_1 以上是关于详解策略梯度算法的主要内容,如果未能解决你的问题,请参考以下文章