1. 机器说图概述

序列学习在自然语言处理领域已经取得了很多成功,如机器翻译(漫谈RNN之序列建模(机器翻译篇))、机器造句(漫谈RNN之序列建模(机器造句篇))等,今天我们看另外一个应用——机器看图说话(Neural Image Caption)。

12.1_.jpg


首先需要明白,为什么序列建模可以用于图像描述。类比前面说过的机器翻译模型,其任务是将一种语言的句子S转化成另外一种语言的句子T,构建了一个编码RNN网络用于读取源句子S并得到其固定长度的特征表示,再将此特征表示传入解码RNN网络的隐含层进而可以生成新的句子T,训练网络的目标函数是使得条件概率P(T|S)达到最大。



回到图像描述的问题上,我们需要首先识别一幅图像中的所有物体及其内在关联性,然后用一句话(英语)来描述这些物体及其关联性。传统的图像描述的做法涉及的手动特征提取工作比较多,或者是添加了很多人为设定的语法规则,但是这种做法显然是不高效,而对于一个端对端的神经网络图像描述系统,它意味着我们不需要任何人为的附加干预,只要输入一幅图像,系统即可输出一句话,整个训练过程是端对端的。



如何得到一个端对端的神经网络图像描述系统呢?受机器翻译的启发,如果我们得到了每幅图像的固定长度的特征表示以后,再将此特征表示与图像描述的句子进行一一映射,这实际上就跟机器翻译的模型是一样的。因此,我们可以把图像描述总结为两步:

图像识别

序列建模


12.2_.jpg


并且,我们可以建立类似的目标函数进行有监督训练,即给定一个输入图片I,要使得输出的描述句子S的概率最大:

12.3_.JPG


这样,我们就构建了一个端对端的神经网络图像描述系统,接下来我会详细说明一下其具体的内部结构。



2.机器说图模型具体结构

前面提到,神经网络图像描述主要分为两大块,分别是图像识别和序列建模。接下来我们将具体讲解这两部分是如何用神经网络搭建起来联合学习的。


图像识别部分 由于深度卷积神经网络最近几年在图像识别领域取得了较大的成功(可参考文末的推荐文章),在大规模图像识别任务ImageNet上,很多优秀的深度卷积神经网络模型已经被训练出来了,例如2012年的AlexNet、2013年的Network in Network、2014年的VGG和GoogleNet、2015年的Resnet,它们都是用于图像分类的训练好的模型。一般在处理图像领域的问题时(如Prisma软件、你的名字同款滤镜),我们可以使用这些网络作为预训练的模型,因为它们在处理图像任务上具有良好的泛化能力,这样会比自己创新一个新的卷积网路模型更加高效,训练起来也节省时间。这里使用的是GoogleNet(论文:《Going Deeper with Convolutions》)作为图像识别的部分,即给定一幅图像I,经由GoogleNet产生一个固定长度的特征表示x。


序列建模部分 由于LSTM网络在时序建模问题上避免了梯度消失的问题,进而可以学习到长时间的时序记忆,因此这里使用LSTM作为序列建模的循环单元。并且,同机器翻译类似,我们在训练的时候,仍然是让LSTM输出一个单词的概率分布,然后将这个概率分布作为下一时刻LSTM网络的输入。假设输入图片是I,其对应的描述句子的单词为S=(S_0,S_1,...,S_N),那么整个序列建模的过程如下:

12.4_.JPG



因此,整个神经网络图像描述系统的原理是:给定一幅图像I,将其传入到GoogleNet得到一个固定长度的特征分布,接着将其作为初始状态传入到LSTM网络中,得到一个特殊的代表描述开头标志单词S_0,然后将S_0进行word embedding传入到下一时刻的LSTM网络并且得到S_1的概率分布,再由S1得到S2,S2得到S3,...,直到代表描述结束标志单词S_N出现,即可结束循环。模型结构图如下所示(左边是GoogleNet,右边是基于LSTM的序列建模网络)。

12.5_.JPG


在训练过程中,对于每幅图像,其误差可以表示为所有单词的误差的乘积,即对数之和:

12.6_.JPG


运用后向传播算法即可实现端对端的训练网络,训练的参数包括GoogleNet的所有参数、word embedding的权重以及LSTM的权重。


在推理过程中,我们可以使用两种方法得到最佳描述序列。一种是类似于机器造句,先根据p_1的大小随机抽样得到第一个单词S_1,然后由S_1得到S_2,一直到序列结束,这种方法我们可以称为是Best-first Search,即每个时刻得到概率最大的单词,最终连成一句话;另外一种方法是使用Beam Search,受计算机资源的限制因此需要首先设定一个beam size,然后使用动态规划的算法不停地迭代得到t时刻最佳的K个序列,其优点是综合考虑了所有时刻的概率分布,并且可以降低噪声的影响。




3.序列建模总结

序列建模的应用性比较强,除了前面提到的几个应用之外,还有的典型应用如机器对话、机器作曲、知识问答、视频描述、文档摘要等。回顾机器翻译、机器造句、机器说图,我们可以发现它们有下列共同点:

训练数据通常是序列对,动态的如句子,静态的如图像

都是端对端的训练,即不需要额外的人工制定规则,输入序列A,即可输出序列B

RNN在其中应用十分广泛,尤其是LSTM

虽然领域不同,但是模型大多类似


到目前为止,我们只讲了最传统的序列建模的方式,即使用RNN网络结构得到序列的输出,而没有提到一些性能更好的优化策略,例如引入注意力模型、外部存储模块、更好的读写机制,甚至是强化学习来学得潜在的语法规则等等,这些在后面几期都会陆续讲解。




你可能会感兴趣的文章有:

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

《漫谈RNN之序列建模(机器造句篇)》

《TensorFlow(三)——卷积神经网络用于手写字识别》

《我所理解的深度学习(二)——卷积神经网络基础》

《我所理解的深度学习(三)——卷积神经网络应用①》

《我所理解的深度学习(四)——卷积神经网络应用②》

《Prisma修图软件的图片风格转换算法》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家