策略梯度法的思路
之前我们是用表格的形式来表达策略,现在我们同样可以用函数来表达策略。之前学的所有的方法都是被称为 value-based,接来下学的叫 policy-based 。接下来我们来看一下 策略梯度法的思路。之前学的的策略全都是用表格来表示的,如下:
现在,我们把表格改成函数,那么
π
π
π 的写法也会发生改变,如下:
其中,
θ
θ
θ 是一个向量可以用来表示
π
π
π 这个函数里边的参数。
用表格与函数表示不同之处还在于获取一个 action 的概率。 表格形式直接通过索引查表,而用函数会稍微麻烦一点,不能直接去索引了,需要计算对应的 π ( a ∣ s , θ ) π(a|s,\theta) π(a∣s,θ)
用表格与函数表示不同之处还在于更新策略的方式。表格中直接通过修改表格中的值就可以了。当用参数化函数表示时,策略 π π π 只能通过修改参数 θ \theta θ 去更新策略。
.
策略梯度法的思路:
用函数表示时,我们会建立某些标量的目标函数
J
(
θ
)
J(\theta)
J(θ),通过优化目标函数使得策略
π
π
π 达到最优,如下:
标量的目标函数的选取
上面我们知道要建立一个标量的目标函数,那么这个标量的目标函数是什么呢?通常,我们常用两大类标量的目标函数。
第一个是状态值平均值,或者简单地称为平均值,其实就是 state value 的一 个加权平均,如下:
v
ˉ
\bar v
vˉ 是 state value 的加权平均
d
(
s
)
d(s)
d(s) 代表了状态
s
s
s 被选中的概率
以上的形式我们还可以写成一种更简洁形式,就是两个向量的内积:
.
那么,我们怎么去选择 d ( s ) d(s) d(s) 呢?我们分两种情况 ,一是 d d d 和 π π π 没有关系;而是 d d d 和 π π π 有关系。
当 d d d 和 π π π 没有关系时,我们分别用 d 0 d_0 d0 和 π ˉ 0 \bar π_0 πˉ0 表示,同样的我们可以采取均匀分布 d 0 ( s ) = 1 / ∣ S ∣ = 1 / n d_0(s)=1/|S|=1/n d0(s)=1/∣S∣=1/n ,如果某一状态比较重要,那么我们可以将其权重提高。
当
d
d
d 和
π
π
π 有关系时,常用的方法选择平稳分布,如下:
.
第二个是即时奖励平均值 ,就是即时奖励的一 个加权平均,如下:
上面是 reward 的第一种形式,我们经常会看到 reward 的另外一种形式,如下:
其中,我们假设遵循给定的策略并生成一个轨迹,得到一系列的奖励
(
R
t
+
1
,
R
t
+
2
,
…
…
)
(R_{t+1},R_{t+2},……)
(Rt+1,Rt+2,……) ;在跑了无穷多步之后,
s
0
s_0
s0 已经不重要了,所以最后把
s
0
s_0
s0 去掉了
.
上面我们介绍了两种标量的目标函数的选取方式,接下来我们对这两个标量做进行进一步的总结:
1、他们都是策略
π
π
π 的函数
2、策略
π
π
π 是一个函数的形式,它的参数是
θ
\theta
θ ,不同的
θ
\theta
θ 会得到不同的值
3、可以通过找到最优的
θ
\theta
θ 去最大化标量的值
4、
r
ˉ
π
\bar r_π
rˉπ 与
v
ˉ
π
\bar v_π
vˉπ 是等价的,对其中一个做优化的时候另外也进行了优化。在折扣系数
γ
<
1
γ<1
γ<1 是,有
r
ˉ
π
=
(
1
−
γ
)
v
ˉ
π
\bar r_π=(1-γ)\bar v_π
rˉπ=(1−γ)vˉπ
策略梯度求解
得到一个策略标量后,计算出其梯度。然后,应用基于梯度的方法进行优化,其中,梯度计算是最复杂部分之一。那是因为,首先,我们需要区分不同的 v ˉ π \bar v_π vˉπ , r ˉ π \bar r_π rˉπ , v ˉ π 0 \bar v_π^0 vˉπ0 ;其次,我们需要区分折扣和未折扣。梯度的计算,这里我们就做比较简要的介绍。
J
(
θ
)
J(\theta)
J(θ) 可以是
v
ˉ
π
\bar v_π
vˉπ ,
r
ˉ
π
\bar r_π
rˉπ ,
v
ˉ
π
0
\bar v_π^0
vˉπ0 ;
η
η
η 是分布概率或权重
"=” 可以表示严格相等、近似或与成正比
v
ˉ
π
\bar v_π
vˉπ ,
r
ˉ
π
\bar r_π
rˉπ ,
v
ˉ
π
0
\bar v_π^0
vˉπ0 相应的梯度公式如下:
.
梯度公式分析:
上面的式子我们可以写成如下形式:
S 服从 η 分布 S服从η分布 S服从η分布 ; A 服从 π ( A ∣ S , θ ) 分布 A服从π(A|S,\theta)分布 A服从π(A∣S,θ)分布
为什么我们需要这样一个式子呢?这是因为真实的梯度含有期望
E
E
E ,而期望
E
E
E 是不知道的,所以我们可以通过采样来近似来做优化,如下:
补充说明:
因为要计算
l
n
π
(
a
∣
s
,
θ
)
lnπ(a|s,\theta)
lnπ(a∣s,θ),所以要求
π
(
a
∣
s
,
θ
)
>
0
π(a|s,\theta)>0
π(a∣s,θ)>0 ,怎么确保所有的
π
π
π 对所有的
a
a
a 全都是大于0呢?使用 softmax function 进行归一化,如下:
那么,
π
π
π 的表达形式如下:
h
(
s
,
a
,
θ
)
h(s,a,\theta)
h(s,a,θ) 是另一个函数,通常由神经网络得到。
梯度上升和REINFORCE
梯度上升算法的基本思路是,真实的梯度有期望 E E E ,所以用随机的梯度来代替真实梯度,但还有一个 q π ( s , a ) q_π(s,a) qπ(s,a) 即策略 π π π 所对应的真实的 action value 是不知道的,同样的我们用一个方法来近似或者对 q π q_π qπ 进行采样,方法是与MC结合——reinforce ,如下:
.
我们是用随机的梯度来代替真实梯度,那么我们怎么对随机变量
(
S
,
A
)
(S,A)
(S,A) 采样呢?首先对
S
S
S 采样,因为
S
服从
η
分布
S服从η分布
S服从η分布 它要求大量的数据,在现实中等难以达到平稳的状态,所以在实际当中一般是不太考虑的。那怎么对
A
A
A 采样呢?因为
A
服从
π
(
A
∣
S
,
θ
)
分布
A服从π(A|S,\theta)分布
A服从π(A∣S,θ)分布 ,因此,在
s
t
s_t
st 应该根据策略
π
(
θ
)
π(\theta)
π(θ) 对
a
t
a_t
at 进行取样。所有这里的策略梯度属于 on-policy 算法。
算法理解
要求
α
β
t
\alpha\beta_t
αβt 较小,可以发现
β
t
\beta_t
βt 能够平衡算法发 探索 和 数据利用。因为
β
t
\beta_t
βt 与
q
t
(
s
t
,
a
t
)
q_t(s_t,a_t)
qt(st,at) 成正比,因此,当
q
t
(
s
t
,
a
t
)
q_t(s_t,a_t)
qt(st,at) 较大时
β
t
\beta_t
βt 也会比较大,意味着
π
t
(
s
t
,
a
t
)
π_t(s_t,a_t)
πt(st,at) 有较大的概率被选择。
β
t
\beta_t
βt 与
π
(
a
t
∣
s
t
,
θ
t
)
π(a_t|s_t,\theta_t)
π(at∣st,θt) 成反比,因此,当
β
t
\beta_t
βt 较大时
π
(
a
t
∣
s
t
,
θ
t
)
π(a_t|s_t,\theta_t)
π(at∣st,θt) 会比较小,意味着如果之前我选择
π
t
(
s
t
,
a
t
)
π_t(s_t,a_t)
πt(st,at) 的概率是比较小的,下一时刻给它更大的概率去选择它。
当
β
t
>
0
\beta_t>0
βt>0 时,这是
π
(
a
t
∣
s
t
,
θ
)
π(a_t|s_t,θ)
π(at∣st,θ) 梯度上升算法,有:
当
β
t
<
0
\beta_t<0
βt<0 时,这是
π
(
a
t
∣
s
t
,
θ
)
π(a_t|s_t,θ)
π(at∣st,θ) 梯度下降算法,有:
.
reinforce 算法
用
q
t
(
s
t
,
a
t
)
q_t(s_t,a_t)
qt(st,at) 去近似代替
q
π
(
s
t
,
a
t
)
q_π(s_t,a_t)
qπ(st,at) ,
q
t
(
s
t
,
a
t
)
q_t(s_t,a_t)
qt(st,at) 是用蒙特卡洛的方法求得,即就是从
(
s
t
,
a
t
)
(s_t,a_t)
(st,at) 出发得到一个 episode ,然后把这个episode 的 return 赋给
q
t
q_t
qt,这种就是 reinforce 算法。
.
reinforce 算法,其伪代码如下:
在进行第
k
k
k 次迭代时,先选定一个初始的
s
t
a
t
e
state
state 根据当前的策略
π
(
θ
k
)
π(\theta _k)
π(θk) 和环境进行交互就得到一个 episode ,针对这个episode 当中的每一个元素我们要过一遍。然后对每一个元素进行操作,分为两步。第一步是做 value update,就是用蒙特卡洛的方法去估计
q
t
q_t
qt ,从
(
s
t
,
a
t
)
(s_t,a_t)
(st,at) 出发把后边所得到的所有的 reward 相加。接下来就是 policy update ,将得到的
q
t
q_t
qt 代到公式里去更新
θ
t
θ_t
θt ,最后把最后所得到的
θ
T
θ_T
θT 作为一个新的
θ
k
θ_k
θk 进行迭代更新。