交叉熵(cross-entropy)是model-free,policy-based,on-policy的强化学习方法。也就是说:
不对环境建模
估计智能体的策略
需要从环境中获得新的数据
我们举个例子,注意不同episode的
o
i
,
a
i
,
r
i
o_i,a_i,r_i
oi,ai,ri是不同的,为了简单起见,取
γ
=
1
\gamma=1
γ=1
每一个单元格都代表了智能体在episode中的每一步。由于环境的随机性和智能体根据概率分布抽样选择动作的方式,某些episode会比其他的更好。cross-entropy的核心是扔掉不好的episode,然后训练出更好的。步骤如下:
- 在环境中跑N个episode
- 计算每个episode的总奖励,并确定奖励边界,通常,我们把奖励边界定义为episode奖励排名的50%或70%
- 抛弃所有奖励在边界值以下的episode
- 使用剩余的episode训练神经网
- 从第1步重新开始,直到结果令我们满意为止
这就是cross-entropy方法的描述。神经网络学习如何重复动作,从而获得更大的回报,不断地将边界变得越来越高。尽管这种方法简单,但它在简单环境中表现良好,易于实现,并且对超参数变化非常鲁棒,是一种理想的baseline方法。
可以尝试一下用cross-entropy方法解决gym中CartPole-v0这个环境的控制问题
cross-entropy方法的数学原理
cross-entropy的基础是重要性采样定理(importance sampling theorem):
E
x
∼
p
(
x
)
[
H
(
x
)
]
=
∫
x
p
(
x
)
H
(
x
)
d
x
=
∫
x
q
(
x
)
p
(
x
)
q
(
x
)
H
(
x
)
d
x
=
E
x
∼
q
(
x
)
[
p
(
x
)
q
(
x
)
H
(
x
)
]
\mathbb{E}_{x\sim p\left( x \right)}\left[ H\left( x \right) \right] =\int_x{p\left( x \right) H\left( x \right) dx}=\int_x{q\left( x \right) \frac{p\left( x \right)}{q\left( x \right)}H\left( x \right) dx}=\mathbb{E}_{x\sim q\left( x \right)}\left[ \frac{p\left( x \right)}{q\left( x \right)}H\left( x \right) \right]
Ex∼p(x)[H(x)]=∫xp(x)H(x)dx=∫xq(x)q(x)p(x)H(x)dx=Ex∼q(x)[q(x)p(x)H(x)]
在RL中,
H
(
x
)
H(x)
H(x)是通过某种策略
x
x
x获得的奖励值,
p
(
x
)
p(x)
p(x)是所有policy的概率分布。我们不想通过搜索所有可能的策略来最大化return;相反,我们采用这样的方法:用
q
(
x
)
q(x)
q(x)近似
p
(
x
)
H
(
x
)
p(x)H(x)
p(x)H(x),找到一个最佳的
q
(
x
)
q(x)
q(x)使return最大化,这个时候的
q
(
x
)
q(x)
q(x)就是我们所需要的policy。
那怎么刻画
q
(
x
)
q(x)
q(x)近似
p
(
x
)
H
(
x
)
p(x)H(x)
p(x)H(x)的程度呢?可以用Kullback-Leibler(KL)散度刻画两个概率分布的距离,如下所示:
K
L
(
p
1
(
x
)
∣
∣
p
2
(
x
)
)
=
E
x
∼
p
1
(
x
)
[
ln
p
1
(
x
)
p
2
(
x
)
]
=
E
x
∼
p
1
(
x
)
[
ln
p
1
(
x
)
]
−
E
x
∼
p
1
(
x
)
[
ln
p
2
(
x
)
]
KL\left( p_1\left( x \right) ||p_2\left( x \right) \right) =\mathbb{E}_{x\sim p_1\left( x \right)}\left[ \ln \frac{p_1\left( x \right)}{p_2\left( x \right)} \right] =\mathbb{E}_{x\sim p_1\left( x \right)}\left[ \ln p_1\left( x \right) \right] -\mathbb{E}_{x\sim p_1\left( x \right)}\left[ \ln p_2\left( x \right) \right]
KL(p1(x)∣∣p2(x))=Ex∼p1(x)[lnp2(x)p1(x)]=Ex∼p1(x)[lnp1(x)]−Ex∼p1(x)[lnp2(x)]
我们现在要对这个函数进行优化,注意优化变量是
p
2
(
x
)
p_2(x)
p2(x)。KL的第一项称为熵,它与
p
2
(
x
)
p_2(x)
p2(x)无关,在优化过程中可以忽略。第二项称为交叉熵(cross-entropy),这是深度学习中非常常见的优化目标。
其实交叉熵就是
− 真 值 ∗ l n ( 估 计 值 ) -真值*ln(估计值) −真值∗ln(估计值)
结合这两个公式,我们可以得到一个迭代算法,不断将
q
(
x
)
q(x)
q(x)逼近
p
(
x
)
H
(
x
)
p(x)H(x)
p(x)H(x)
q
i
+
1
(
x
)
=
arg
min
q
i
+
1
(
x
)
−
E
x
∼
q
i
(
x
)
p
(
x
)
q
i
(
x
)
H
(
x
)
ln
q
i
+
1
(
x
)
q_{i+1}\left( x \right) =\underset{q_{i+1}\left( x \right)}{\arg\min}-\mathbb{E}_{x\sim q_i\left( x \right)}\frac{p\left( x \right)}{q_i\left( x \right)}H\left( x \right) \ln q_{i+1}\left( x \right)
qi+1(x)=qi+1(x)argmin−Ex∼qi(x)qi(x)p(x)H(x)lnqi+1(x)
这种优化方法是一种通用的cross-entropy,但是放在RL中,可以大大简化这个式子,首先,待优化的
q
(
x
)
q(x)
q(x)就是
π
(
a
∣
s
)
\pi \left( a|s \right)
π(a∣s),
H
(
x
)
H(x)
H(x)更是可以简化成指示函数:reward大于阈值返回1,否则返回0。于是迭代算法简化成:
π
i
+
1
(
a
∣
s
)
=
arg
min
π
i
+
1
−
E
z
∼
π
i
(
a
∣
s
)
[
R
(
z
)
>
ψ
i
]
ln
π
i
+
1
(
a
∣
s
)
\pi _{i+1}\left( a|s \right) =\underset{\pi_{i+1}}{\arg\min}-\mathbb{E}_{z\sim \pi_i\left( a|s \right)}\left[ R(z) > \psi_i \right] \ln \pi _{i+1}\left( a|s \right)
πi+1(a∣s)=πi+1argmin−Ez∼πi(a∣s)[R(z)>ψi]lnπi+1(a∣s)
严格地说,公式中的所有概率分布函数还应满足概率的公理,但是在我们写程序的时候softmax函数已经帮我们解决了这个问题。