在上一篇博客中介绍的论文“Show and tell”所提出的NIC模型采用的是最“简单”的encoder-decoder框架,模型上没有什么新花样,使用CNN提取图像特征,将Softmax层之前的那一层vector作为encoder端的输出并送入decoder中,使用LSTM对其解码并生成句子。模型非常直观,而且比常规的encoder-decoder框架还要简单一点(图像特征只在开始时刻输入了decoder,此后就不输入了),但是训练的过程非常讲究,因此取得了2015COCO任务的第一名。

attention机制的引入

对于seq2seq任务来说,在没有attention机制的时候,decoder在不同的时刻对接收到的信息进行解码并生成单词时,所接收到的encoder vector都是相同的。但是实际上,在生成不同的词时,所应“关注”的信息是不一样的:比如说想把“我爱自然语言处理”翻译成“I love NLP”时,生成“love”这个词的时候,模型应该更加关注“爱”这个词。attention机制就是为了实现在生成一个词时去关注当前所“应该”关注的显著(salient)信息这一目的,手段就是对输入信息的各个局部赋予权重。这篇博客介绍了在自动文摘任务中,引入attention的比较早期的工作。

Show, Attend and Tell 论文阅读笔记

[1] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

      这篇文章提出了在传统的encoder-decoder框架中结合注意机制的方法,这种结合attention机制的seq2seq学习,已经成为了机器翻译领域里的 state-of-the-art 。

本文的caption模型中,在解码的每个时刻都会接收由attention机制所计算出的编码向量。作者首先指出,此前的工作使用CNN在分类之前的最后一层vector表示作为图像特征的缺点是丢失了能够使caption变得更丰富的一些信息(NIC那篇论文也提到在分类数据集上预训练的CNN抛弃了诸如颜色等对分类没有帮助的特征),因此这里使用 low-level 的表示。随后指出这项工作使用两种attention:“soft” deterministic attention 和 “hard” stochastic attention,通过 $\phi$ 函数来控制。

1. 模型结构

(1)encoder:卷积特征

在encoder端,模型使用CNN来提取 L 个 D 维vector,每一个都对应图像的一个区域:

$$a=\{ \textbf{a}_1,...,\textbf{a}_L \},\quad\textbf{a}_i\in\mathbb{R}^D$$

与此前的工作使用Softmax层之前的那一层vector作为图像特征不同,本文所提取的这些vector来自于 low-level 的卷积层,这使得decoder可以通过选择所有特征向量的子集来选择性地聚焦于图像的某些部分。这个样子就有点像NLP里的seq2seq任务了,这里的输入从词序列转变成了图像区域vector的序列。

(2)decoder:LSTM

用RNN来解码并生成词序列,已经是再熟悉不过的套路了,实在是不想再赘述了,但是文中提到了几个比较有意思的点。

模型生成的一句caption被表示为各个词的one-hot编码所构成的集合时:

$$y=\{ \textbf{y}_1,...,\textbf{y}_C \},\quad\textbf{y}_i\in\mathbb{R}^K$$

其中 K 是词表大小,C 是句子长度。

LSTM的数学模型如下(省略偏置,本文所有关于神经网络的式子都省略了偏置):

$$\begin{pmatrix}\textbf{i}_t \\\textbf{f}_t \\\textbf{o}_t \\\textbf{g}_t \\\end{pmatrix}=\begin{pmatrix}\sigma\\ \sigma\\ \sigma\\ \tanh \end{pmatrix}T_{D+m+n, n} \ \begin{pmatrix}E\textbf{y}_{t-1}\\ \textbf{h}_{t-1}\\ \hat{\textbf z}_t \end{pmatrix}$$

$$\textbf{c}_t=\textbf{f}_t \odot \textbf{c}_{t-1} + \textbf{i}_t \odot \textbf{g}_t$$

$$\textbf{h}_t = \textbf{o}_t \odot \tanh(\textbf{c}_t)$$

第一个式子实际上是四个式子,分别得到输入门、遗忘门、输出门和被输入门控制的候选向量。其中,三个门控由sigmoid激活,得到的是元素值皆在 0 到 1 之间的向量,可以将门控的值视作保留概率;候选向量由tanh激活,得到的是元素值皆在 -1 到 1 之间的向量。$T_{s,t}$ 代表的是从 $\mathbb R^s$ 到 $\mathbb R^t$ 的映射。

最右边括号里的三个量是四个式子共有的三个输入量:$E\textbf y_{t-1}$ 是look-up得到词 $y_{t-1}$ 的 m 维词向量;$\textbf h_{t-1}$ 是上一时刻的隐状态;$\hat{\textbf z}_t\in\mathbb R^D$ 是LSTM真正意义上的“输入”,代表的是捕捉了特定区域视觉信息的上下文向量,既然它和时刻 t 有关,就说明它是一个动态变化的量,在不同的时刻将会捕捉到与本时刻相对应的相关图像区域。这个量将由attention机制计算得到,后面会详细介绍。相比之下,在上篇博客所介绍的NIC模型中,解码过程除了在首个时刻输入了图像特征之外,随后并不存在这个输入,而本文的模型则与标准的encoder-decoder框架一样,将encoder端得到的信息在每一时刻都输入decoder。

第二个式子是更新旧的细胞状态,element-wise 的运算表示三个门控将对各自控制的向量的每个元素做“取舍”:0 到 1 分别代表完全抛弃到完全保留。

第三个式子是得到隐状态。值得注意的是,作者给出了隐状态和细胞状态的初始值的计算方式,使用两个独立的多层感知机,感知机的输入是各个图像区域特征的平均:

$$\textbf c_0=f_{\text{init,c}}(\frac1L\sum_{i=1}^L\textbf a_i)$$

$$\textbf h_0=f_{\text{init,h}}(\frac1L\sum_{i=1}^L\textbf a_i)$$

有了隐状态,就可以计算词表中各个词的概率值,那么取概率最大的那个作为当前时刻生成的词,并将作为下一时刻的输入。其实就是个全连接层:

$$p(\textbf{y}_t|\textbf{a}, \textbf y_1,...,\textbf y_{t-1}) \propto \exp (L_o (E \textbf{y}_{t-1} + L_h \textbf{h}_t + L_z \hat{\textbf{z}}_t))$$

2. attention机制

下面就是重头戏,本文提出的两种attention机制。

通过attention机制计算出的 $\hat{\textbf z}_t$ 被称为 context vector,是捕捉了特定区域视觉信息的上下文向量。

首先需要明确,attention要实现的是在解码的不同时刻可以关注不同的图像区域,进而可以生成更合理的词。那么,在attention中就有两个比较关键的量,一个是和时刻 t 相关,对应于解码时刻;另一个是输入序列的区域 $\textbf a_i$,对应图像的一个区域。

实现这种机制的方式就是在时刻 t ,为输入序列的各个区域 i 计算出一个权重 $\alpha_{ti}$ 。因为需要满足输入序列的各个区域的权重是加和为一的,使用Softmax来实现这一点。至于Softmax需要输入的信息,则如上所讲,需要包含两个方面:一个是被计算的区域 $\textbf a_i$ ,另一个就是上一时刻 t-1 的信息 $\textbf h_{t-1}$ :

$$e_{ti}=f_{\text{att}}(\textbf a_i,\textbf h_{t-1})$$

$$\alpha_{ti}=\frac{\exp(e_{ti})}{\sum_{k=1}^L\exp(e_{tk})}$$

式中的 $f_{\text{att}}$ 是耦合计算区域 i 和时刻 t 这两个信息的打分函数。文中使用多层感知机,也算是最常用的了,我觉得是因为内积太简单,而双线性的参数太多,索性用最简单粗暴的 MLP 。但是我也看过一些paper里面用好几次attention时用不一样的打分函数。

现在,有了权重,就可以计算 $\hat{\textbf z}_t$ 了:

$$\hat{\textbf z}_t=\phi(\{\textbf a_i\},\{\alpha_{ti}\})$$

这个函数 $\phi$ 就代指文中提出的两种attention机制,对应于将权重施加到图像区域到两种不同的策略。

(1)Stochastic “Hard” Attention

首先介绍文中提出的第一种attention机制,hard attention。

在 hard attention 机制中,权重 $\alpha_{ti}$ 所扮演的角色是图像区域 $\textbf a_i$ 在时刻 t 被选中作为输入decoder的信息的概率,有且仅有一个区域会被选中。为此,引入变量 $s_{t,i}$ ,当区域 i 被选中时取值为 1 ,否则为 0 。那么有

$$\hat{\textbf z}_t=\sum_{i}s_{t,i}\textbf a_i$$

这里面还尚未解决的问题就是 $s_{t,i}$ 怎么求。在本文中,将 $s_t$ 视作隐变量,为参数是 $\{\alpha_i\}$ 的多元贝努利分布(贝努利分布就是两点分布):

$$p(s_{t,i}=1|s_{j<t},\textbf a)=\alpha_{t,i}$$

为了使用极大似然估计,需要将隐变量 marginalize out,然后用marginal log-likelihood的下界(variational lower bound)来作为目标函数 $L_s$ ,这一思路就是EM算法的思路:

$$\begin{aligned}\log p(\textbf y|\textbf a)&=\log\sum_sp(s|\textbf a)p(\textbf y|s,\textbf a)\\&\geq \sum_sp(s|\textbf a)\log p(\textbf y|s,\textbf a)\end{aligned}$$

$$L_s=\sum_sp(s|\textbf a)\log p(\textbf y|s,\textbf a)$$

式中的 $\textbf y$ 是为图像 $\textbf a$ 生成的一句caption(由一系列one-hot编码构成的词序列)。不等号那里是琴生不等式(Jensen,我一直叫琴生,因为好听~~)。

对目标函数求梯度:

$${\partial L_s \over \partial W} = \sum_s p(s | \mathbf{a}) \left[ {\partial \log p(\mathbf{y} | s, \mathbf{a}) \over \partial W} + \log p(\mathbf{y} | s, \mathbf{a}) {\partial \log p(s | \mathbf{a}) \over \partial W} \right]$$

用 N 次蒙特卡洛采样(可以简单理解为抛硬币)来近似:

$$\overset{\sim}{s}_t \sim \mathrm{Multinoulli}_L (\{ \alpha_i \})$$

$${\partial L_s \over \partial W} \approx {1 \over N} \sum_{n=1}^N p(\overset{\sim}{s}^n | \mathbf{a}) \left[ {\partial \log p(\mathbf{y} | \overset{\sim}{s}^n, \mathbf{a}) \over \partial W} + \log p(\mathbf{y} | \overset{\sim}{s}^n, \mathbf{a}) {\partial \log p(\overset{\sim}{s}^n | \mathbf{a}) \over \partial W} \right]$$

另外,在蒙特卡洛方法估计梯度时,可以使用滑动平均来减小梯度的方差。在第 k 个mini-batch时,滑动平均被估计为先前对数似然伴随指数衰减的累积和

$$b_k=0.9b_{k-1}+0.1\log p(\textbf y|\overset{\sim}{s}_k,\textbf a)$$

为进一步减小方差,引入多元贝努利分布的熵 $\mathbb H[s]$ ;而且对于一张给定图片,0.5的概率将 $\overset{\sim}{s}$ 设置为它的期望值 $\alpha$ 。这两个技术提升了随机算法的robustness(在控制领域音译为鲁棒性,CS领域一般叫健壮性吧)。最终的学习规则为

$$\begin{aligned}{\partial L_s \over \partial W} \approx {1 \over N} \sum_{n=1}^N p(\overset{\sim}{s}^n | \mathbf{a}) &[ {\partial \log p(\mathbf{y} | \overset{\sim}{s}^n, \mathbf{a}) \over \partial W}\\& + \lambda_r (\log p(\mathbf{y} | \overset{\sim}{s}^n, \mathbf{a}) - b) {\partial \log p(\overset{\sim}{s}^n | \mathbf{a}) \over \partial W} \\&+ \lambda_e {\partial \mathbb H[\overset{\sim}{s}^n] \over \partial W} ]\end{aligned}$$

其中的两个系数是超参数。实际上,这个规则等价于REINFORCE:attention选择的一系列action的reward是与在采样attention轨迹下目标句子的对数似然成比例的。

(2)Deterministic “Soft” Attention

相比之下,在 soft attention 机制中,权重 $\alpha_{ti}$ 所扮演的角色是图像区域 $\textbf a_i$ 在时刻 t 的输入decoder的信息中的所占的比例。既然这样,就将各区域 $\textbf a_i$ 与对应的权重 $\alpha_{t,i}$ 做加权求和就可以得到 $\hat{\textbf z}_t$ :

$$\mathbb E_{p(s_t|a)}[\hat{\textbf z}_t]=\sum_{i=1}^L\alpha_{t,i}\textbf a_i$$

这就和机器翻译中非常标准的end-to-end训练非常像了,整个模型光滑、可微,利用反向传播来进行end-to-end的训练。

论文里还介绍了更多细节,比如分析了解码过程的一些情况;强迫使图像的每个区域在整个解码过程中的权重之和都相等(这种做法在目标函数中体现为一个惩罚项),来使图像的各个区域都对生成caption起到贡献;增加一个跟时间有关的维度因子可以让模型的注意力集中在图像的目标上。

3. 实验与例子

这里就不介绍模型本身以外的细节了。从结果上看,当使用BLEU作为指标时,几个数据集上都是hard attention的效果好过soft attention;而当使用Meteor作为指标时,情况相反。在论文的最后作者给出了很多对比hard attention和soft attention的展示的例子,下面摘取一例。

参考:

[1] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

[2] http://www.cosmosshadow.com/ml/神经网络/2016/03/08/Attention.html

[3] http://www.cnblogs.com/alexdeblog/p/3564317.html

转载于:https://www.cnblogs.com/Determined22/p/6914926.html

Multimodal —— 看图说话(Image Caption)任务的论文笔记(二)引入attention机制相关推荐

  1. Neurons字幕组 | 2分钟带你看懂李飞飞论文:神经网络是怎样给一幅图增加文字描述,实现“看图说话”的?(附论文下载)

    Neurons字幕组出品 翻译|智博校对|龙牧雪 时间轴|虫2后期| Halo 项目管理|大力 Neurons字幕组 第四期作品震撼来袭! Neurons字幕组源自英文单词Neuron,一个个独立的神 ...

  2. 超详细!“看图说话”(Image Caption)项目实战

    超详细!基于pytorch的"看图说话"(Image Caption)项目实战 0.简介 1.运行环境 1.1 我的环境 1.2 建立环境 2.理论介绍 3.运行项目 3.1 项目 ...

  3. Image caption——图像理解——看图说话综述(2015-2018)

    本文章没有太多公式,仅仅讲述个人理解,主要怎对入门人士.文中定有许多错误,希望大家能相互交流. Image caption顾名思义,即可让算法根据输入的一幅图自动生成对应的描述性文字.有点类似于看图说 ...

  4. 对Image caption的一些理解(看图说话)

    1. 背景 ​ 在计算机视觉中,图像分类和目标检测任务是比较成熟的领域,已经应用到实际的产品领域.而"看图说话"要实现的功能是,给定一张图像,计算机能告诉我们图片的内容,显然,这会 ...

  5. Transformer与看图说话

    本项目来使用Transformer实现看图说话,即Image Caption任务.相关涉及的知识点有:迁移学习.EfficientNet.Transformer Encoder.Transformer ...

  6. 谷歌发布最新看图说话模型,可实现零样本学习,多类型任务也能直接上手

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 谷歌新推 ...

  7. 看图说话:从图片到文字

    文章目录 模型整体结构 比较翻译模型和看图说话 编码器模型 解码器模型 训练和评估 了解数据集 了解pack_padded_sequence函数和pad_packed_sequence函数 对梯度进行 ...

  8. CNN+LSTM:看图说话

    看图说话--CNN和LSTM的联合应用 https://blog.csdn.net/xinzhangyanxiang/article/details/79117869 看图说话是深度学习波及的领域之一 ...

  9. 人工智能导论—看图说话微表情识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86178106 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. python while循环语句-Python While 循环语句
  2. python开发_python中的range()函数
  3. 拼接图像亮度均匀调整_液晶拼接屏如何才能达到更好的显示效果
  4. CF803G-Periodic RMQ Problem【离散化,线段树,ST表】
  5. 知道接口地址 如何传数据_如何选显示器连接线?四种主流接口要知道
  6. 斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!
  7. 反射的妙用-类名方法名做参数进行方法调用实例demo
  8. 图书管理系统html_你的毕业设计是 XX 管理系统吗?
  9. 债券收益率预测模型_股债收益率模型看A股估值 股债收益率模型(EYBY)是一个经典的股市估值模型,其基本思想是将“股票收益率”(EY)与“债券收益率”(BY)进行对比... - 雪球...
  10. excel如何把顺序倒过来_excel表格数据前后顺序颠倒-求助:怎样使excel的数据顺序倒过来...
  11. docker 部署zookeeper脚本错误(services.zoo.environment.0 must be a string)
  12. 指纹识别-传感器原理
  13. 37手游基于云平台的大数据建设实践
  14. 【历史上的今天】5 月 23 日:Java 正式发布;晶体管的共同发明者出生
  15. 45 | chmod命令
  16. 平面上的点——Point类 (VI)
  17. 简练网软考知识点整理-项目风险审计及风险评估
  18. html中meta的写法规范,HTML代码meta标签的charset 属性写法及用法
  19. 一部以中国现实为大背景的英国科幻电影《未来密码46》
  20. 嵌入式项目实战——基于QT的视频监控系统设计(三)

热门文章

  1. centos 安装mysql5.6.20_Linux学习15-CentOS安装mysql5.6环境
  2. Android Studio出现cannot resolve symbol httpclient解决方法
  3. 鸿蒙官网什么样,鸿蒙系统推广,结果会怎么样?
  4. php频繁执行sql,php - 一条SQL执行多次 sum 特别慢
  5. java写数据库连接_JAVA写简单的数据库连接池
  6. 20220323:双边沿触发器趣解
  7. Zigbee 学习计划——第2天——熟悉CC2530的基本例程
  8. SpringBoot实战(十三):Spring Boot Admin 动态修改日志级别
  9. 这些假脸实在太逼真了!英伟达造出新一代GAN,生成壁纸级高清大图毫无破绽...
  10. 爆料:学术生涯遭重创,才是压垮张首晟教授的最后一根稻草