Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制
在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用。
这篇博客所介绍的文章所考虑的是生成caption时的与视觉信息无关的词的问题,如“the”、“of”这些词其实和图片内容是没什么关系的;而且,有些貌似需要视觉特征来生成的词,其实也可以直接通过语言模型来预测出来,例如“taking on a cell”后生成“phone”。
所以作者设计了一个自适应注意力机制,使得模型在生成每个词时,可以决定模型需要关注图像还是只需要依靠语言模型;如果需要关注图像,再通过spatial attention来决定关注图像的哪个区域。中间那一行的概率值越大,就表明越需要图像特征。
Adaptive Attention 论文阅读笔记
[1] Knowing When to Look - Adaptive Attention via A Visual Sentinel for Image Captioning
这篇文章主要的idea是解码器在生成一个词时,图像特征有时候并不需要,单纯依靠语言模型就可以predict一个很合适的词。
1. encoder-decoder框架
下面还是不厌其烦地过一遍encoder-decoder框架,主要是为了为全文统一记号……
给定训练集的图像 I 和对应的描述句子 $y=\{y_1,...,y_T\}$ ,模型的训练目标是最大化似然
$$\theta^*=\arg\max_{\theta}\sum_{(I,y)}\log p(y|I;\theta)$$
(1)encoder:CNN
CNN来提取图像特征早已经成为了标配。本文的模型使用ResNet提取 k 个区域特征
$$A = \{\textbf a_1,...,\textbf a_k\},\quad \textbf a_i\in\mathbb R^{1024}$$
然后得到全局(global)图像特征
$$\textbf a^g=\frac1k\sum_i\textbf a_i$$
使用ReLU激活函数,将图像特征变换为 d 维向量
$$\textbf v_i=\text{ReLU}(W_a\textbf a_i)$$
$$\textbf v^g=\text{ReLU}(W_b\textbf a^g)$$
最后就可以得到
$$V=[\textbf v_1,...,\textbf v_k]\in\mathbb R^{d\times k},\quad\textbf v_i\in\mathbb R^d$$
(2)decoder:LSTM
将句子的概率拆解(省略了模型参数的依赖)
$$\log p(y|I)=\sum_{t=1}^T\log p(y_t|y_1,...,y_{t-1},I)$$
建模在 t 时刻生成词 $y_t$ 的条件概率,通常情况下都是选择RNN:
$$\log p(y_t|y_1,...,y_{t-1},I)=f(\textbf h_t,\textbf c_t)$$
f 是非线性函数,$\textbf h_t$ 是当前时刻的隐状态;$\textbf c_t$ 是当前时刻输入到decoder的视觉上下文向量:如果不使用attention机制时,它就是encoder计算出的编码向量,与时间 t 无关;如果使用attention机制,则是由attention机制计算出来(也就是上一篇博客的 $\textbf z_t$ ,由encoder的编码向量和decoder在上一时刻的隐状态共同决定)。
隐状态通过LSTM建模:
$$\textbf h_t=\text{LSTM}(\textbf x_t,\textbf h_{t-1},\textbf m_{t-1})\in\mathbb R^d$$
其中 $\textbf x_t=[\textbf w_t;\textbf v^g]$ 是输入信息,这里使用的是上一时刻生成的词的词向量 $\textbf w_t$ 和图像特征 $\textbf v^g$ 的拼接(concatenate),$\textbf m_{t-1}$ 是上一时刻的细胞状态。
到这里还没介绍函数 f 究竟是什么,就是普通的一层Softmax?不急,下面介绍attention时再说。
2. spatial attention机制
抛开具体任务,概括地说attention机制在seq2seq中的作用的话,其目的就是得到一个与时刻 t 相关的向量(用来取代encoder的与时刻无关的编码向量)来输入给decoder,这个向量需要反映出在解码器在时刻 t 生成一个词时对输入序列的不同部分(这里就是不同的图像区域)的关注程度的差别。用一个函数 $f_{\text{att}}$ 来表示attention机制耦合两方面信息的方式,然后就可以用Softmax得到这 k 个区域在时刻 t 被分配的权重:
$$\textbf z_t=f_{\text{att}}(V,\textbf h_t)=\textbf w_h^{\top}\tanh(W_vV+W_g\textbf h_t\textbf 1^{\top})$$
$$\boldsymbol\alpha_t=\text{softmax}(\textbf z_t)=[\alpha_{t1},...,\alpha_{tk}]$$
本文的模型中,$f_{\text{att}}$ 使用的形式是 $\textbf w_h^{\top}\tanh(W_vV+W_g\textbf h_t\textbf 1^{\top})$ 。有了权重,就可以计算出视觉上下文向量 $\textbf c_t$ :
$$\textbf c_t=\sum_{i=1}^k\alpha_{ti}\textbf v_i$$
看到这基本上可以感觉到,这个attention机制和上篇博客介绍的那篇论文里的soft attention很像,但是有细微的差别,比如这里用的隐状态是当前时刻 t 的而不是上一个时刻的。作者画了个图示意了两个机制的区别:
作者解释道,使用当前时刻的隐状态这一idea来自于ResNet的启发。作者将 $\textbf c_t$ 视作当前时刻隐状态 $\textbf h_t$ 的残差信息,其起到的作用是削减生成词时的不确定性,为 $\textbf h_t$ 补充信息。用当前时刻隐状态而不用上一时刻的这种套路,我似乎在机器翻译的文献中也见到过。
3. Adaptive Attention机制
下面这个图就是adaptive attention的示意图。相比于刚才的attention,多了一个 $\textbf s_t$ 。下面就来看看,它究竟是什么,起到了什么作用,怎么求得的。
(1)decoder已知信息 vs. attention得到的视觉上下文信息
下面就是本文的核心,自适应注意力机制。之前提到,本文的关注点就在于decoder所生成的那些与图片无关的词(如介词),或者貌似有关、但是可以直接用语言模型预测出来的词。直接用attention机制的话,是无法确定什么时候可以不依赖图像信息而直接用语言模型来生成一个词的。
作者提出了一个visual sentinel(视觉哨兵)的概念,是decoder已经知道的信息的隐式表示。与此对应地,attention机制所得到的视觉上下文向量 $\textbf c_t$ 可以看作是decoder在当前时刻从图像特征里了解到的“新”信息。
decoder的memory(细胞状态,$\textbf m_t$ )存储了长时和短时的视觉和语言学信息。这篇论文的模型从里面抽取一个新的成分——视觉哨兵 $\textbf s_t$,使得模型能够在不需要图片信息时不再关注图像特征。基于此,作者扩展了LSTM:
$$\textbf g_t=\sigma(W_x\textbf x_t+W_h\textbf h_{t-1})$$
有了门控,就可以对LSTM的细胞单元进行如下计算,抽取出视觉哨兵:
$$\textbf s_t=\textbf g_t\odot \tanh(\textbf m_t)$$
换句话说,普通版本的LSTM使用输出门控 $\textbf o_t$ 从细胞单元提取出了隐状态 $\textbf h_t=\textbf o_t\odot \tanh(\textbf m_t)$ ,这里又提取出了新的成分,也就是视觉哨兵。
那么,如何利用这个视觉哨兵向量呢?要知道,视觉哨兵向量是decoder已经知道的信息的隐式表示,而此前的attention机制所得到的视觉上下文向量 $\textbf c_t$ 可以看作是decoder从图像特征里了解到的信息。接下来就是把两者进行一个trade-off,sentinel gate $\beta_t$ 用来决定是否去关注图像特征的门控。线性加权是无敌的!
$$\hat{\textbf c}_t=\beta_t\textbf s_t+(1-\beta_t)\textbf c_t$$
$\beta_t$ 取值在 0 到 1 之间,当 $\beta_t=1$ 时就表示此时的decoder完全不需要图像信息。作者把 $1-\beta_t$ 称为 visual grounding probability。
(2)trade-off 系数的自适应求解
所谓的“自适应”,大概就是说这个 $\beta_t$ 可以计算出来,而不是手工指定。作者是这样做的:
$$\textbf z_t=f_{\text{att}}(V,\textbf h_t)=\textbf w_h^{\top}\tanh(W_vV+W_g\textbf h_t\textbf 1^{\top})$$
$$\hat z_t=f_{\text{att}}(\textbf s_t,\textbf h_t)=\textbf w_h^{\top}\tanh(W_s\textbf s_t+W_g\textbf h_t)\in\mathbb R$$
$$\hat{\boldsymbol\alpha}_t=\text{softmax}([\textbf z_t;\hat{ z}_t])\in\mathbb R^{k+1}$$
$$\beta_t=\hat{\alpha}_{t,k+1}$$
$[\textbf z_t;\hat{ z}_t]$ 是指拼接操作,在向量 $\textbf z_t$ 的基础上又加了一个元素 $\hat{ z}_t$ 。不妨概括一下,写成比较简单的样子:我把 $[\textbf z_t;\hat{ z}_t]$ 记作 $\hat{\textbf z}_t$ ,就有
$$\hat{\textbf z}_t=f_{\text{ada-att}}(V,\textbf h_t,\textbf s_t)$$
$$\hat{\boldsymbol\alpha}_t=\text{softmax}(\hat{\textbf z}_t)\in\mathbb R^{k+1}$$
换句话说,$\beta_t$ 就是使用向量 $\hat{\boldsymbol\alpha}_t$ 的最后一个元素,满足取值在 0 到 1 之间。那么attention这个模块的输出再重写一遍就是:
$$\textbf c_t=\sum_{i=1}^k\hat{\alpha}_{ti}\textbf v_i$$
$$\hat{\textbf c}_t=\beta_t\textbf s_t+(1-\beta_t)\textbf c_t$$
(3)解码方式
现在,该有的信息都有了,回答一下刚才留的那个问题,也就是LSTM输出了隐状态后,如何计算生成的词。传统的方式就是用Softmax,利用的信息包括隐状态、上一时刻的词向量、attention得到的向量。这里大同小异:
$$\textbf p_t=\text{softmax}(W_p(\hat{\textbf c}_t+\textbf h_t))$$
4. 实验与例子
这里不再介绍实验细节了,回来跑一下这篇文章的代码感受一下。总之就是,纵向比较的话,加入了视觉哨兵的自适应attention机制后效果要好于不加;横向比较的话,在这个论文在2016年11月放到arXiv时(现在已经被2017CVPR接收了),是state-of-the-art的效果。即便现在来看,其在COCO排行榜上的排名也是非常高的(JLu_CXiong的那个结果)。
Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制的更多相关文章
- Multimodal —— 看图说话(Image Caption)任务的论文笔记(一)评价指标和NIC模型
看图说话(Image Caption)任务是结合CV和NLP两个领域的一种比较综合的任务,Image Caption模型的输入是一幅图像,输出是对该幅图像进行描述的一段文字.这项任务要求模型可以识别图 ...
- Multimodal —— 看图说话(Image Caption)任务的论文笔记(二)引入attention机制
在上一篇博客中介绍的论文"Show and tell"所提出的NIC模型采用的是最"简单"的encoder-decoder框架,模型上没有什么新花样,使用CNN ...
- 学习笔记TF060:图像语音结合,看图说话
斯坦福大学人工智能实验室李飞飞教授,实现人工智能3要素:语法(syntax).语义(semantics).推理(inference).语言.视觉.通过语法(语言语法解析.视觉三维结构解析)和语义(语言 ...
- (CV学习笔记)看图说话(Image Captioning)-1
Background 分别使用CNN和LSTM对图像和文字进行处理: 将两个神经网络结合: 应用领域 图像搜索 安全 鉴黄 涉猎知识 数字图像处理 图像读取 图像缩放 图像数据纬度变换 自然语言处理 ...
- [看图说话]在VMware Workstation 9中安装Mac OS X 10.8 Mountain Lion
本文环境: CPU:Intel Core i7 920: OS:Windows 7: 内存:8G: 玩Hackintosh各有各的理由,不管什么理由,利用虚拟机安装Mac OS X都是一个可行的办法. ...
- [看图说话] 基于Spark UI性能优化与调试——初级篇
Spark有几种部署的模式,单机版.集群版等等,平时单机版在数据量不大的时候可以跟传统的java程序一样进行断电调试.但是在集群上调试就比较麻烦了...远程断点不太方便,只能通过Log的形式,进行分析 ...
- 看图说话,P2P 分享率 90% 以上的 P2P-CDN 服务,来了!
事情是这样的:今年年初的时候,公司准备筹划一个直播项目,在原有的 APP 中嵌入直播模块,其中的一个问题就是直播加速服务的选取. 老板让我负责直播加速的产品选型,那天老板把我叫到办公室,语重心长地说: ...
- 看图说话:关于BI那点事儿
[编者按]BI=DW+数据挖掘+业务分析+社会学?BI三部曲:管数据.看数据.源数据.BI有三种放法:技术部.业务部和独立部门.BI的工作=20%数据平台+30%数据支持+50%数据应用.
- Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署
基于Logstash跑通Kafka还是需要注意很多东西,最重要的就是理解Kafka的原理. Logstash工作原理 由于Kafka采用解耦的设计思想,并非原始的发布订阅,生产者负责产生消息,直接推送 ...
随机推荐
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- js基础回顾-数据类型和typeof怎么用
js的基本数据类型有六种,undefined.null.number.string.boolean.object. 未定义 空 数字 字符串 布尔 ...
- ActiveMQ 学习第二弹
经历了昨天的初识 ActiveMQ,正好今天下班有点事耽搁了还没法回家,那就再学习会 ActiveMQ 吧!现在官网的文档没啥好看的了,毕竟是入门学习,太深奥的东西也理解不了.然后看官网上有推荐书籍& ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
- JS问题笔记——模拟Jq底层实现工厂模式
<script type="text/javascript"> (function (window,undefined){ function _$(arguments) ...
- php调用java
PHP调用JAVA方式 1. 背景 在开发招商银行信用卡分期付款功能过程中,在支付成功之后需要对银行的返回数据进行签名验证,因签名加密方式招商银行是不提供的,只提供了相应的JAVA验证类测试例 ...
- 【原创】源码角度分析Android的消息机制系列(一)——Android消息机制概述
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.为什么需要Android的消息机制 因为Android系统不允许在子线程中去访问UI,即Android系统不允许在子线程中更新UI. 为什 ...
- 宿主机共享文件夹给不同Linux虚拟机的方法
一.Windows/Linux宿主机共享文件夹给VMWare中的Linux虚拟机 1.能安装vmware tools1)在vmware的ubuntu中安装vmware tools2)在vmware中开 ...
- document事件及例子
一.关于鼠标事件:onclick:鼠标单击触发 ondbclick:鼠标双击触发 onmouseover:鼠标移上触发 onmouseout:鼠标离开触发 onmousemove:鼠标移动触发 二.关 ...
- 由SpringMVC中RequetContextListener说起
零.引言 RequetContextListener从名字结尾Listener来看就知道属于监听器. 所谓监听器就是监听某种动作,在其开始(初始化)和结束(销毁)的时候进行某些操作. 由此可以猜测:该 ...