本文大致以show attent and tell 为讲解模板。
图像描述的概念,在这里就不多概述了,用通俗的话就是--看图说话。而这篇文章虽然不是现在的最优模型,但是由于第一次将注意力机制引入到图像描述的模型中来,因此它的意义非常的重要。
引人了注意力机制(Attention mechanism,)--它能够让encode-decode模型能够像人一样,重点关注图像的某一个区域进行准确的描述。如下图所示:
模型在每一次生成一个单词的时候,知道关注的区域,这样就能够更加准确的生成描述了。(以前的方法很粗暴,将图像编码为一个固定、定长的向量,然后输入给后面的解码模型解码,这样虽然获得了全局的图像信息,但是在每一次生成句子单词的时候,肯定会注意力不集中。)
概念
编码-解码(encode-decode):在这里编码器主要是一个CNN,将图像输入给一个CNN之后得到一个编码向量。然后再把这个编码向量交给解码器-RNN。毕竟,处理图像是CNN的强项,处理序列文字是RNN的强项嘛。所以图像描述说的encode-decode可以等价于CNN-RNN。在机器翻译模型中,encode-decode用的都是RNN。
编码:
编码的任务就是输入一副图像给CNN,从而得到一个包含图像信息的 编码。
在使用注意力机制的图像描述网络中,图像编码向量不再是固定定长的一维向量,因此利用预训练的CNN模型会去除顶层的全连接层和池化层,选择利用三维的特征图(通道数,长度,宽度)。下图
利用一个预选量的ResNet,去除顶层的全连接和池化层。得到一个(2048,14,14)的编码。
解码:
解码的目的就是利用CNN得到的图像编码,一步一步的将其‘翻译’成句子。
如果没有利用注意力机制的话,就是直接将上图得到的编码(2048,14,14)做一个简单的平均,得到一个定长的编码向量,然后输入给RNN作为它的隐藏状态,然后生成描述。
如果利用了注意力机制:
先说一下注意力机制:
注意力(Attention): 注意力机制就是为了计算权重。这个权重的作用就是,在每一个时间步生成下一个单词的时候,可以依据这些权重的加权平均,得到应该关注的图像区域的重要性(关注度)。
拿最上面的那个图来说,当模型生成 a large 的时候 下一步对于 飞机 那个区域的关注权重更高,因为我们知道 a large airplane 更符合逻辑。
一个感性的注意力机制的运行过程:借助先前已经得到的解码输出 和 编码图像(c, H,W),通过几个神经网路计算得到 H*W个权重分布。这些权重分布可以理解为,每个像素上的权重,就是生成下一个单词说关注的位置区域的概率。
所以,如果利用了注意力机制,那么CNN得到的是一个(3,H,W)的编码,然后注意力网络通过利用输出的信息然后结合这个图像编码,然后计算出在每一个像素区域上的权重分布。然后通过这个权重分布,将全部像素做一个加权平均。(每一个像素点上的权重,乘以 对应位置的像素,然后求和),下图来自论文:
汇总
将CNN ,RNN 和注意力机制汇总一下:
首先 把图像输入给 CNN,得到一个图像编码。(可以将这个编码,转换一个作为RNN的初始隐藏层的初始化)
利用之前得到的信息(也就是RNN的隐藏状态) 和 图像编码 在注意力网路中求出 权重分布
利用先前的信息(也就是隐藏状态)和注意力权重 通过一个softmax得到词汇表中每一个单词,作为下一个单词的概率分数。--也就是一个多分类问题。
损失函数
负的对数似然估计(交叉熵):因为等价于一个分类问题,输出的类别大小就等于词汇表的大小。因此用交叉熵。
束搜索
-------未完待续-----------
参考1:Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
参考2:https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning#some-more-examples