原文:https://arxiv.org/abs/1805.09461?context=stat.ML
Policy Grandient(PG)
在强化学习中,代理通过特定的策略采取行为,不同应用的策略都不同。例如:在文本概括任务中,策略就是语言模型 ,给出 输出 。
现在假设我们的代理是个 RNN,它采取不连续的行为。RNN 的输出层通常使用 softmax 函数,并从该层产生输出。
在 Teacher Forcing 的训练方法中,我们根据策略采取行为。在我们序列结束或看到句子结束标志(EOS)时候,我们比较策略产生的行为()和真实行为的值(),基于评价标准就能观察到一个奖励。
我们的目标就是找到参数以最大化期望的奖励,于是我们把损失函数定义为奖励期望的负数:
是 时刻的行为, 为这个采样序列的奖励。
实际上,我们只用单个样本去估计了这个期望,所以上面损失函数的导数变成下面这样:
根据链式法则,我们写成这样:
其中 是 softmax 函数的输入。所以,损失 对于 的梯度:
其中 是 的 1-of- 表示, 是一个基线的奖励,它可以是任何值,因为它不依赖与RNN的参数。
这个式子类似于多分类逻辑回归的梯度。在逻辑回归中,交叉熵梯度是预测和实际输出 1-of- 表示之间的差:
我们注意到(15)中,我们用到了模型产生的输出,而(16)全是用真实值去计算梯度。
基线奖励()的目的是使模型采取奖励 的行为,而不鼓励 的行为。由于我们只使用一个样本去计算损失的梯度,这个基线还将减少梯度估计量的方差。如果基线不依赖于模型的参数 ,(15)将会是损失梯度的无偏估计量。下面证明一下添加基线奖励 对于损失的期望没有任何影响:
这个算法叫做 REINFORCE,它是一个解决 seq2seq 问题的策略梯度算法。这个模型的一个问题就是每个时间步只使用一个样本来训练模型,所以模型会存在高方差的问题。为了缓解该问题,我们每次训练都用 N 个行为序列的样本,通过平均 N 个序列来更新梯度:
其中 。
解决模型高方差问题的另一个方法就是 SC(Self-Critic)模型。它没有使用样本去估计基线,而是使用模型推导阶段通过贪心搜索获得的输出作为基线。因此,我们使用模型的采样输出作为 ,并使用最终输出分布的贪心选择获得 ,上标 表示贪心选择。通过这种方式,REINFORCE 模型的损失为:
REINFORCE 算法的训练、测试步骤
输入:输入序列 ,真实值序列 ,并且最好有个与训练的策略 。
输出:采用 REINFORCE 训练过的策略。
训练步骤
while 尚未收敛 do:
- 选择 batch = 个输入序列 和输出序列 。
- 采样 个完整的行为序列:。
- 观察序列的奖励并且计算基线奖励 。
- 根据(18)计算损失。
- 更新网络参数:。
end while
测试步骤
for batch 个输入和输出序列 和 do:
- 使用训练过的模型和 采样输出 。
- 使用性能度量指标,例如: 来评估模型。
end for
reinforce算法这个方法的第二个问题就是,我们在行为采样完成后才能看到奖励,这种特性在大多数 seq2seq 模型中都不是很好。如果能中途看到部分奖励,而且奖励不太好,我们就能够去选择更好的行为了。但是 REINFORCE 做不到这点。所以,这个模型经常产生很差的结果,并且要花更多时间去收敛。这个问题在模型刚随机初始化的时候最严重。为了缓解这个问题,Ranzato et al.建议采用交叉熵预训练,再逐渐替换成REINFORCE损失。
另一个解决 REINFORCE 算法高方差的方法就是使用重要性抽样(importance sampling )。其基本思想就是从旧模型而不是当前模型采样序列来计算损失。
网友评论