根据题主对问题的描述,我认为将问题改成“计算机如何‘理解’图像?”会更合适。
可能很多人都看过李飞飞的这个演讲:李飞飞: 我们怎么教计算机理解图片?,没有看过的可以去看一下,讲得非常棒。她在演讲中提到如何才叫理解一幅图像。
近些年深度学习在图像领域可以说取得了爆炸式的发展。首先是图像分类(image classification)这一块,自2012年Krizhevsky 【1】提出利用深度卷积神经网络(CNN)进行图像分类后,图像分类的准确率年年提高,去年2015年甚至将分类错误率降低到了5%以下,直接逼近甚至超过了人类的分类准确率。 然后是目标检测(object detection)这一块,借着CNN的东风,Girshick 和Kaiming He 两位大神分别提出R-CNN、SPP net、Fast R-CNN、Faster R-CNN这些网络模型,甚至Kaiming He 去年的一篇文章直接将网络深度加深到前无古人的152层,这些工作带领目标识别领域进入了一个前所未有的发展高峰期。好,既然现在计算机已经能做到这么好了,我们可以说计算机已经理解图像了吗?李飞飞在演讲中告诉我们,不,还远没有。给计算机输入如下一副图像,我们不是希望它将这幅图像分到“马”这个类别中,也不是希望它告诉我这是马,这是人,这是狗,我希望它能告诉我“一个人骑在一匹马上,他的狗坐在马前面”,甚至我希望它能告诉我“在一个阳光明媚的下午,一个穿着牛仔衣服的年轻小伙坐在一匹健壮的马上,他的爱犬坐在马的前面,他们相互对望着,看起来非常开心”,这样,我们才能说计算机‘理解’了图像。那么怎么才能做到这一点呢?怎么才能让计算机准确地描述图像中的目标以及他们之间的相互关系呢?我相信这才是题主想要问的问题。
接下来的这些内容,我是假设大家都对CNN、RNN、LSTM、word embedding等比较熟悉的,如果不熟悉,可以去看一看我们之前的这篇回答(CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? - Ph.D(er) 的回答),将会对你理解接下来的内容非常有帮助。
如何让计算机根据一副图像自动生成它的文字描述?为了解决这个问题,我们得首先跳到另外一个领域,就是机器翻译领域。机器翻译面对的是这样一个问题,输入一段文字(比如英语),输出用另一种语言(比如法语)表达同样意思的一段文字,要求输出的句子是连贯的、语法正确的并且同时要和输入的文字表达同样的意思。过去可能有很多别的方法,但基本都是基于句法规则的,生成的句子显得不太自然(相信大家以前用Google翻译的时候都体会过)。但近些年来,人们发现用深度神经网络来做机器翻译,可以取得非常好的效果。
机器翻译( machine translation )
思路是这样的,将输入句子(source sentence)和目标句子(target sentence)表示在同一个向量空间,当输入一个句子时,将其encode成一个向量,这个向量包含了句子的语义信息,然后将这个向量decode,得到目标句子。接下来我们按照encode和decode分成两个部分来介绍。
Encode
如何将一个句子表示成一个向量形式,同时又要不丢失语义信息?这篇文章【2】中给出了一种基于卷积操作的方法。如下图所示:
我们可以通过word2vec将句子中每个词表示成一个K维的向量形式,这里每个词向量是表示了词的语义信息的,然后进行几次纵向的卷积操作,最后可以得到一个1*K维的向量,这个向量就被当成是这个句子的向量表达。
文章【3】中是通过一个RNN来对输入句子进行encode的,如下图:
把源句子中的词一个一个顺序输入,RNN对输入的词进行如下操作:
每一个当前状态的输出是基于之前所有词的输入,因此文章【3】中将最后一个时刻隐藏层的表达当做整个句子的向量表示。
但我们知道用梯度下降算法进行训练时,会出现梯度弥散的现象,解决的办法是隐藏层使用LSTM,于是文章【4】就是利用LSTM进行的encode,其实就是将上文【3】中的f()函数用LSTM代替,同样是利用最后一个时刻隐藏层的向量当做整个句子的向量表示。
Decode
上面讲了如何对一个句子进行encode表示成一个向量形式,那么如何把这个向量空间中的一个向量进行decode来得到一个完整句子呢?其实基本也都是用的RNN来进行decode的。
我们将源句子的向量表示和目标句子中第i时刻的词的词向量一起作为RNN网络的输入,如下面公式所示,s表示源句子的向量表示(source sentence),V(f_i)表示的第i个词的词向量,通过隐藏层计算后,再通过一个softmax函数生成一个K维的向量(这个K表示词典的长度),向量中每一维的值表示基于前面的词以及源句子后,出现下一个词的概率。在训练阶段,我们进行优化使目标句子中的下一个词出现的概率尽可能的大;在test阶段,我们将预测概率最大的一个词的词向量作为下一个时刻的输入,不断循环往复,直到生成完整的目标句子(一般句子的开头和结尾都会给一个特殊的标签来表达的)。
因此我们最后的目标函数表达如下,它表示的是输入一个英文句子后,输出一个对应的法语句子的概率是多少,我们希望这个值尽可能的大:
最后我们可以将这个网络完整表示为如下所示:
当然这是文章【3】中的示意图,它是RNN-RNN的结构,对于【2】的CNN-RNN,将CNN产生的句子向量作为上图中的C输入即可,对于【4】的LSTM-LSTM将上图中的隐藏层改为LSTM即可。
对于基于深度神经网络的机器翻译我就简单介绍到这里,接下来我们回到正题,如何生成一幅图像的文字描述。
图像描述(Image Descriptions)
其实仔细去想,如果我们将一幅图像表示成一个向量形式,再对这个向量进行decode,其实原理上和机器翻译非常类似。那么我们如何将一副图像表示成向量形式呢?
比较普遍的做法是利用【1】中的CNN网络,首先将这个网络在ImageNet上预训练,然后将倒数第二层的4096维向量作为这个图像的向量表示,通过一个线性变换将其表达为一个D维(和文本向量再同样维度)的向量。 然后类似机器翻译中的decode过程,将其作为RNN的输入,最后产生一段文本,这段文本基本就可以认为是这幅图像的 一个文本描述。如下图所示:
具体实现细节上稍微有些差异,比如【5】中使用的是LSTM模型、图像的向量只是作为0时刻输入一次、每个词向量表示为one-hot形式输入:
它的部分结果如下:
而文章【6】中在每个时刻都将图像向量和当前的词向量一起输入:
它的部分结果如下:
李飞飞组似乎更关注图像各个目标的信息,而不是全局信息,他们组一直在考虑如何将图像的各个区域(fragments of images)和文本中各个碎片(fragments of sentences)联系起来,生成dense descriptions of images【7】【8】,如下:
不过这样做的原因感觉他们希望能提高图像—文本检索的准确率,看成一个检索的任务而不是直接生成description 的任务。
总结
生成一幅图像的文本描述是一件很有意义的事情。我们知道人们传递信息一般有三种方式,文本、语音、图像,这三种信息的传递方式各有各的特点。如果能构建一个桥梁将它们联系起来,将会更好的传递信息,给人们带来更多的便利以及想象空间。文本和语音的关联上人们做了很多的研究,但是图像和文本之间人们似乎一直没有很有效的将其连接起来。我上面说的这些都是非常好的努力,它帮助计算机更好的去理解图像,并且在图像—文本相关联的一些任务(比如检索、问答等)上可以带来非常大的帮助。
另外非常值得一提的,我们这篇文章最开头TED演讲的主人公李飞飞教授,在将深度学习应用到图像相关领域的这个潮流中起到了非常重要的作用。当年是她着手构建了图像分类的数据库ImageNet ,并且举办了一年一届的ImageNet Large Scale Visual Recognition Challenge (ILSVRC)比赛,正是有这么大量的数据集可以训练以及这个比赛去促进大家,才使得Krizhevsky A的Deep CNN能够有大量的数据训练并且拿下2012届比赛的冠军,然后让深度神经网络一下子火爆起来,然后促进了现在图像相关领域的巨大发展。
前段时间,李飞飞组又发布了一篇文章【9】,这篇文章中又开放了一个非常庞大而细致的数据集Visual Genome,在这个数据集里包含了每幅图像中的对象、属性、关系,这个数据集提供了一个多层次的图片理解。我们期待这个数据集能像ImageNet一样,进一步促进计算机去更好的理解图像,带给我们更多的惊喜。
最后,心疼李飞飞的学生们[抱抱]。
参考文献
【1】Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
【2】Kalchbrenner N, Blunsom P. Recurrent Continuous Translation Models[C]//EMNLP. 2013, 3(39): 413.
【3】Cho K, Van Merriënboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[J]. arXiv preprint arXiv:1406.1078, 2014.
【4】Sutskever I, Vinyals O, Le Q V. Sequence to sequence learning with neural networks[C]//Advances in neural information processing systems. 2014: 3104-3112.
【5】Vinyals O, Toshev A, Bengio S, et al. Show and tell: A neural image caption generator[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 3156-3164.
【6】Mao J, Xu W, Yang Y, et al. Explain images with multimodal recurrent neural networks[J]. arXiv preprint arXiv:1410.1090, 2014.
【7】Karpathy A, Joulin A, Li F F F. Deep fragment embeddings for bidirectional image sentence mapping[C]//Advances in neural information processing systems. 2014: 1889-1897.
【8】Karpathy A, Fei-Fei L. Deep visual-semantic alignments for generating image descriptions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 3128-3137.
【9】Krishna R, Zhu Y, Groth O, et al. Visual Genome: Connecting Language and Vision Using Crowdsourced Dense Image Annotations[J]. arXiv preprint arXiv:1602.07332, 2016.
【“科研君”公众号初衷始终是希望聚集各专业一线科研人员和工作者,在进行科学研究的同时也作为知识的传播者,利用自己的专业知识解释和普及生活中的 一些现象和原理,展现科学有趣生动的一面。该公众号由清华大学一群在校博士生发起,目前参与的作者人数有10人,但我们感觉这远远不能覆盖所以想科普的领域,并且由于空闲时间有限,导致我们只能每周发布一篇文章。我们期待更多的战友加入,认识更多志同道合的人,每个人都是科研君,每个人都是知识的传播者。我们期待大家的参与,想加入我们,进QQ群吧~:108141238】
【非常高兴看到大家喜欢并赞同我们的回答。应许多知友的建议,最近我们开通了同名公众号:PhDer,也会定期更新我们的文章,如果您不想错过我们的每篇回答,欢迎扫码关注~ 】