[译]Show, attend and tell: 深度学习进行语义理解的的细节[上]


你们是如何与外星人交流的?
如何将自己的语言教会他们?
我们教孩子们学习的方法正确吗?


你们是如何与外星人交流的? 如何将自己的语言教会他们? 我们教孩子们学习的方法正确吗? 是的,我们通过将各种不同的物体展示给他们并告诉他们物体的名字来教会他们。

将图片和文字的信息结合起来, 这就是自动图像标注的目标。

这是一个宽泛而又棘手的问题,为此前人已经做出了几十年的努力。仅凭一篇博客是无法将这一领域的问题全部归纳清楚的,就像仅阅读标题和看这幅图片的内容是截然不同的。但是在这里,我们可以做出尝试。


标注图片

如果你的目的仅仅是使用一个目前通用的图像标注系统,那么事情变得很简单了,因为Google已经有基于Tensorflow的开源的图像标注代码im2txt。如果你使用Torch/lua,那么Karpathy的NeuralTalk2对你来说是一个入门的好开端,他们的代码也已经在Github上面开源了。但是你必须要知道的是,Google在这方面已经做了大量的工程实践来使得系统适合实际的应用,所以基于TensorFlow的实现更推荐你来使用。

在这篇博客中,我们将讨论现阶段图像标注领域中涉及到的最先进的理论以及应用基础。尽管在许多领域计算机几乎已经达到了与人类齐平的表现(e.g. 图像分类语音识别人脸识别)。然而,在自动图像标注领域,尽管已经有了几十年的研究,但是标注水平距离人类还差得很远。但是深度学习在物体识别,定位以及细粒度属性识别领域的高速发展对图像标注问题的准确率带来了前所未有的提升。早期的方法涉及通过图像检索来发现语义相似的图像,从索引数据库传送最相关的描述。但是显而易见,他们的应用范围是十分受限的。

目前的图像标注方法可以被分成三种:

  1. 第一类方法检测对象和属性,然后从包含那些对象的短语中合并图像的描述。
  2. 第二类方法将图像和对应的标注嵌入在相同的向量空间中。对于给定的查询,检索最接近嵌入空间中的图像的标注,并且修改这些标注以生成给定图像的新标注。然而,这些方法无法产生给定测试图像的新描述,因为来自最相似图像的描述用于突出标注。
  3. 第三类方法直接生成以输入图像和先前生成的词汇为条件的图像标注序列。因此,它们可以产生在训练数据中可能从未出现的词的新颖组合。这已经成为图像标注领域中最先进的算法中经常采用的标准方法。下面我们将着重阐述这种方法。

循环神经网络(RNN)为解锁方法

对于图像标注任务,模型被用于对给定的图像产生正确的标注序列。这可以被转化成寻找使得如下对数概率获得最大值的标注序列:

$$
\log p\left( S | I\right) =\sum _{t=0}^{N}\log p\left( S_{t}|S_{0},S_{1},\ldots S_{t-1}\right) \tag{公式 1}
$$

在上式中:

  • S 是最终生成的标注,
  • \( S_{t} \)是在位置t的标注(\(t_{th}\) word)

输出单词的概率取决于先前生成的单词和输入图像,因此在方程中对这些变量进行调节。训练数据由数千个图像和与每个图像相关联的标注组成。训练数据中的标注由人手动书写。训练阶段包括找到在训练集中使得图像的标注概率最大化的模型参数。

在概率图模型中,对于这种密集连接的节点变量,其中每个节点依赖于所有其他节点,由于指数级的可能的配置数目,训练在计算上变得不可行。循环神经网络(RNN)提供了一种使用固定大小的隐藏向量来执行对先前变量的调节的平滑方法。

隐藏向量的作用如同前馈神经网络一样,被用来预测下一个输出的单词。

$$
p\left( S_{t}|S_{0},S_{1},\ldots S_{t-1}\right) = p\left(S_{t}|I, h_{t} \right) \tag{公式 2}
$$

所以在步骤t,可变数量节点的复杂条件被一个简单的向量\(h_{t}\)所取代。然后为了做出在时间t的预测,上式用一个全连接层来对所有单词的概率分布进行建模, 全连接层输出的向量长度为词汇表中单词的数量,紧接着输出为一个全连接层。所以 \( p\left(S_{t}|I, h_{t}\right) \)变成

$$
p\left(S_{t}|I, h_{t} \right) = softmax\left(L_{h}h_{t}+L_{I}I\right) \tag{公式 3}
$$

上式中\(L_{h}\)和\(L_{i}\)是全连接层的权重矩阵,输入作为\(h_{t}\)和\(I\)的一个级联向量。

根据输出的概率分布,拥有最大概率的单词被当做标注的下一个单词。在\(t+1\)步中,先前生成的单词的条件也要将新生成的单词\((S_{t})\)包含进去。但是RNN向量\((h_{t})\)以单词\(S_{1}, S_{2}…S_{t-1}, S_{t}\)为条件。所以\(S_{t}\) 通过一个线性层与\(h_{t}\) 结合,紧接着是一个非线性激励函数来计算\(h_{t+1}\)。这就是RNN单元,它包括了如下的计算:

$$
h_{t+1} = tanh(W_{h}h_{t}+W_{s}S_{t}) \tag{公式 4}
$$


RNN

整体的算法流程图如图2所示。

由于RNN类似于由线性层和非线性层组合而成的前馈神经网络,所以训练期间的反向传播是直接的,不需要太多的推理计算。与正常神经网络的唯一区别在于,通过在每个步骤中的相同参数集来完成先前的隐藏向量和新产生的单词的组合。这相当于将输出馈送到与输入相同的网络,因此网络的名称为循环神经网络。这样避免了网络大小的激增,否则在每一个步骤都需要一组新的参数。RNN单元可以如图3代表所示。


RNN单元

未完待续。