为什么使用强化学习训练image caption
问题
通常 $Image\ Caption$ 会使用有监督学习进行训练,将模型预测的 $captions(sequence)$ 与样本的 $labels(sequence)$ 用极大似然估计($MLE$)进行训练,使用的损失函数是 $cross\ entropy\ loss$,但是这种训练会出现俩个问题:
(1)训练时使用的 $loss$ 和评价时使用的 $metric$
不同,使用 $cross\ entropy$ 作为 $loss$,但 $evaluate$ 时我们看重的是 $metric$,也就是 $BLEU,METEPR,ROUGE,CIDER$ 等评价指标;而且训练使用的 $log\ likelihood$ 默认给一个句子中的每个单词都赋予了相同的权重,而对于一张图像的描述来说,一些关键词可能更加重要,这也是 $CIDER$ 的思想
(2)
暴露偏差问题($exposure\ bias$),由于在产生预测单词的时候,$token$ 是一个一个产生的,后一个 $token$ 的预测会收到前面所有 $token$ 的影响,如果前面有一个 $token$ 预测的不好,那它可能会影响后面单词的生成,让后续的预测跑偏,从而得到一句不好的描述
分析
所以很显而易见的想法就是尽量使得训练和评估时的情形
一样,评估的时候看重 $CIDER$,那训练的时候就最大化 $CIDER$(或者$BLEU,METEOR,ROUGE$ 等);评估的时候每个单词都是生成的吗,那训练的时候也都是用生成的单词($Schedule\ sampling$)
可是生成 $caption$ 的时候,采样 $token$ 的操作是不可微的,无法反向传播。于是就想到了使用强化学习来解决这个问题。对于 $Image\ Caption$,应用强化学习,状态 $s$ 就是看见的图像和已生成的单词,动作 $a$ 就是下一个单词生成什么,奖励 $reward$ 就是 $CIDER$ 等评价指标
策略梯度算法
$Policy\ Gradient$ 是强化学习中的一个比较基本、经典、常用的算法,适用于每个动作 $a$ 可以从一个分布采样得到
首次将策略梯度应用在 $Image\ Caption$ 方向上的工作是 $FAIR$ 的
MIXER,还有两篇比较有名的就是
Self-critical Sequence Training for Image Captioning 和
Optimization of image description metrics using policy gradient methods 。后续也有将 $actor-critic$ 应用在机器翻译领域
SCST
现在优化目标是最大化期望奖励
$$
L_{reward}(\theta)=\mathbb{E}_{w^{s} \sim p_{\theta}}\left[r\left(w^{s}\right)\right]
\tag{1}
$$
为了方便使用后面用梯度下降更新,这里写做负的期望
$$
L(\theta)=-\mathbb{E}_{w^{s} \sim p_{\theta}}\left[r\left(w^{s}\right)\right]
\tag{2}
$$
其中,$w_s$ 是采样(预测)得到的句子序列,$w_s=(w_1^s,w_2^s,\cdots,w_T^s)$,$w_t^s$ 是 $t$ 时刻采样得到的单词,$p_\theta$ 是模型,模型的参数是 $\theta$
现在我们去求优化目标 $L(\theta)$ 关于 $\theta$ 的梯度
$$
\nabla_{\theta} L(\theta)=-\mathbb{E}_{w^{s} \sim p_{\theta}}\left[r\left(w^{s}\right) \cdot \nabla_{\theta} \log p_{\theta}\left(w^{s}\right)\right]
\tag{3}
$$
策略梯度算法的常用技巧:添加一个基线($baseline$),保证它
不依赖动作 $w^s$ (也就是句子)
$$
\nabla_{\theta} L(\theta)=-\mathbb{E}_{w^{s} \sim p_{\theta}}\left[(r\left(w^{s}\right)-b) \cdot \nabla_{\theta} \log p_{\theta}\left(w^{s}\right)\right]
\tag{4}
$$
添加 $baseline$ 的目的通常是使得 $r\left(w^{s}\right)-b$ 这一项
有正有负,理由后面讲。现在添加了这么一个值 $b$,那
会不会改变梯度的值呢?我们把这一项单独拿出来看看
$$
\begin{aligned}
\mathbb{E}_{w^{s} \sim p_{\theta}}\left[b \cdot \nabla_{\theta} \log p_{\theta}\left(w^{s}\right)\right]
&=b \cdot \mathbb{E}_{w^{s} \sim p_{\theta}}\left[\nabla_{\theta} \log p_{\theta}\left(w^{s}\right)\right] \\
&=b \cdot \mathbb{E}_{w^{s} \sim p_{\theta}}\left[\frac{\nabla_{\theta} p_{\theta}\left(w^{s}\right)}{p_{\theta}\left(w^{s}\right)} \right] \\
&=b \cdot \sum_{w_{s}} p_{\theta}\left(w^{s}\right)\left[\frac{\nabla_{\theta} p_{\theta}\left(w^{s}\right)}{p_{\theta}\left(w^{s}\right)} \right] \\
&=b \cdot \sum_{w_{s}} \nabla_{\theta} p_{\theta}\left(w^{s}\right) \\
&=b \cdot \nabla_{\theta} \sum_{w_{s}} p_{\theta}\left(w^{s}\right) \\
&=b \cdot \nabla_{\theta} 1=0
\end{aligned}
\tag{5}
$$
- $b$ 提出来
- 根据 $\frac{\nabla{f(\cdot)}}{f(\cdot)}=\nabla log f(\cdot)$,就是一个简单的对 $log$ 求导。第二行应用这个公式
- 根据期望的定义,$\begin{aligned} \mathbb{E}_{w^{s} \sim p_{\theta}}\left[f \left(w^{s}\right)\right]=\sum_{w_s}p_\theta(w^s)f(w^s) \end{aligned}$,可以得到第三行
- 分子和分母化简
- 交换梯度和求和符号,不影响含义
- 求和符号里面,是对词典里面所有单词的输出概率之和,显然为 $1$
- $1$ 对 $\theta$ 的梯度为 $0$
由此看出,$b$ 不影响梯度的值
在实际训练中,使用 $sample$ 得到的 $caption$ 来作为这个梯度的估计
$$
\nabla_{\theta} L(\theta) \approx-\left(r\left(w^{s}\right)-b\right) \nabla_{\theta} \log p_{\theta}\left(w^{s}\right)
\tag{6}
$$
下面来讲一讲为什么需要这个 $b$,通过链式法则,可以得到
$$
\nabla_{\theta} L(\theta)=\sum_{t=1}^{T} \frac{\partial L(\theta)}{\partial s_{t}} \frac{\partial s_{t}}{\partial \theta}
\tag{7}
$$
其中,$t$ 代表每个时间步,$T$ 代表终止,这里 $s_t$ 是词典大小长度的一个向量,代表在时间步 $t$ 各个单词的分数($s_t$ 也就是 $softmax$ 层的输入)
使用带基准的强化学习对第一项进行估计
$$
\frac{\partial L(\theta)}{\partial s_{t}} \approx\left(r\left(w^{s}\right)-b\right)\left(p_{\theta}\left(w_{t} \mid h_{t}\right)-1_{w_{t}^{s}}\right)
\tag{8}
$$
对于 $t$ 时刻采样得到的单词 $w_t^s$,上式的后一项是小于 $0$ 的,因为是一个概率减去 $1$;前一项 $r\left(w^{s}\right)-b > 0$ 时,(这个单词的梯度是负的),说明当前采样出的这组单词比 $baseline$ 好,我们希望它们更多的被采样;前一项 $r\left(w^{s}\right)-b < 0$,说明这组单词还没有 $baseline$ 好,那么它们会更少的被采样
添加这个 $baseline$ 还能
减少梯度的 $variance$,比如说如果 $reward$ 一直在 $100 \sim 120$ 之间,当没有 $b$ 时,每次 $SGD$ 更新,都会更新这次 $sample$ 得到的单词的分数,虽然 $reward$ 更高的分数提升的更多,但是就算 $reward$ 是 $120$,提高的幅度相对与 $100$ 的 $sample$ 来说也不大(你可以想象这样更新的模型会非常不稳定)
而如果这时候我们有一个 $baseline\ reward=110$,那这时得到 $reward=100$ 的 $sample$ 分数就会被抑制,因为 $r<baseline$,梯度为正了。一个可行的 $baseline$ 是 $\mathbb{E}[r(w_s)]$,也就是在当前模型下的平均 $reward$,这样当你 $sample$ 到了一个 $caption$ 时,你可以知道这是平均以上还是平均一下,如果平均以下,那就需要抑制,如果平均以上,那就可以提高
那么
如何来选择这个 $baseline$ ?
在 $SCST$ 论文中,用 $greedy\ decoding$ 得到的 $\hat{w}$ 的 $reward$ 作为 $baseline$
$$
\hat{w}_{t}=\arg \max _{w_{t}} p\left(w_{t} \mid h_{t}\right)
\tag{9}
$$
这样做避免了单独训练一个 $baseline\ function$,非常简单,故称为 $Self-critical$,由自己生成 $baseline$,自己跟自己作比较。在论文中,也提到了可以使用其他的 $\hat{w}$,比如说 $beam\ search$
在时间步 $t$ ,关于 $softmax$ 激活函数从模型采样得到的样本 $w^s$ 的负奖励的梯度为:
$$
\frac{\partial L(\theta)}{\partial s_{t}} \approx\left(r\left(w^{s}\right)-r(\hat{w}_{t})\right)\left(p_{\theta}\left(w_{t} \mid h_{t}\right)-1_{w_{t}^{s}}\right)
\tag{10}
$$
其中 $r(\hat{w}_{t})$ 是当前模型在测试是使用的推理函数得到的奖励
注意
(1)公式 8 中,$1_{w_{t}^{s}}$ 是词典大小长度的一个 one-hot vector
(2)刚开始用 SCST 训练模型的时候,reward 是负数,下降一点然后开始提升?
(3)SCST 方法的中心思想是将当前模型在测试时使用的推理算法获得的 REINFORCE 算法的 reward 作为 baseline,而不是学习一个对未来回报的估计值作为 baseline
(4)etc.
参考
Ruotian Luo:
https://zhuanlan.zhihu.com/p/24879932RT's Blog:
http://ruotianluo.github.io/2017/01/21/rl-image-captioning/Karpathy:
http://karpathy.github.io/2016/05/31/rl/详解策略梯度算法:
https://zhuanlan.zhihu.com/p/459827715scst笔记:
https://blog.csdn.net/sinat_26253653/article/details/78458894强化学习在Image Captioning中的应用:
https://zhuanlan.zhihu.com/p/386870451