广告行业中那些趣事系列27:围观机器学习是怎么解决“看图说话”任务

2022-05-05 13:29:43 浏览数 (2)

导读:本文是“数据拾光者”专栏的第二十七篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践分享了机器学习是如何解决看图说话任务的,对CV和NLP交叉领域的看图说话任务感兴趣的小伙伴可能会有帮助。

摘要:本篇从理论到实践分享了机器学习是如何解决看图说话任务的。首先介绍了看图说话任务的背景,主要包括什么是看图说话任务和为啥要学习看图说话任务;然后详细讲解了看图说话任务,介绍了看图说话任务、机器翻译以及Encoder-Decoder三者之间的关系,重点介绍了一些有代表性的看图说话模型比如百度的m-RNN、谷歌的NIC、基于视觉Attention的NIC以及使用高等级语义特征的V2L等模型;最后实战了看图说话模型开源项目NeuralTalk2。对CV和NLP交叉领域的看图说话任务感兴趣的小伙伴可能会有帮助。

下面主要按照如下思维导图进行学习分享:

01 看图说话任务背景介绍

1.1 什么是看图说话任务

看图说话任务在机器学习中称为图像标注(Image Caption),简单的理解就是输入一张图片,输出这张图片的文本语言描述,有点类似小时候的看图说话。看图说话任务整体来看分成两个步骤,第一步是理解图片中的内容,这里包括检测图片中的物体以及理解物体之间的关系,这里主要涉及CV领域;第二步是用合理的语言表达出来,也就是文本生成,这里主要涉及NLP领域,所以说看图说话任务其实是CV领域和NLP领域的交叉。下面是看图说话任务示例图:

图1 看图说话任务示例

1.2 为啥要学习看图说话任务

讲完了什么是看图说话任务,下面讲下学习看图说话任务的背景。因为今年有个业务是根据一定的条件自动生成广告文案。比如下面渣渣辉代言的《X贪X玩X蓝X月》传奇游戏,一般广告主在创建广告的时候有两个必备的条件:广告素材图片(渣渣辉代言的传奇广告图片)和广告文案(挥洒热血,再续巅峰)。下面是《X贪X玩X蓝X月》传奇广告示例:

图2 《X贪X玩X蓝X月》广告素材以及广告文案

对于广告主来说创建广告的流程越简单越好。通常情况下广告素材图片因为涉及到代言人等等原因所以需要定制化,而广告文案如果能根据广告的自身特点比如广告自身信息、广告类别、受众人群和广告素材图片等自动生成的话就可以大大节约广告主撰写广告文案的成本。通俗点说,假如我要创建一个广告,希望准备一张广告素材图片,平台就可以根据广告自身的信息和提供的广告素材图片来自动生成广告文案。其实这个功能阿里妈妈平台已经实现,下面是一键生成电商营销文案的示例图:

图3 阿里妈妈的一键生成电商营销文案

上图中用户输入TB商品链接阿里妈妈平台就会自动生成商品广告营销文案。这里TB商品链接其实会作为生成条件,链接里包括商品相关的信息,广告主还可以进一步确定关键词提升文案生成的效果。可以看出生成的广告营销文案效果还是不错的。

总结下我为啥要学习“看图说话”任务,通过广告主上传的广告素材图片来提取重要的广告文案生成条件,比如广告类型 (是传奇游戏还是捕鱼游戏)以及其他重要的广告信息,然后根据这些条件来自动生成广告文案

02 详解看图说话任务

2.1 看图说话是一种特殊的机器翻译任务

之所以说看图说话是一种特殊的机器翻译任务主要原因是看图说话任务和机器翻译任务非常类似。机器翻译任务一般是把一种语言翻译成另外一种语言,比如中文翻译成英文,而看图说话任务也是把一种语言(图片)翻译成另一种语言(文本描述)

2.2 机器翻译和Encoder-Decoder结构

Encoder-Decoder结构是在论文《Learning Phrase Representations using RNN Encoder–Decoder forStatistical Machine Translation》中提出并应用到机器翻译系统中的。下面是Encoder-Decoder结构图:

图4 Encoder-Decoder结构模型

Encoder-Decoder是编码器解码器结构,主要分成编码器和解码器两部分。如上图所示输入序列是W1,W2,....,Wn,编码器会串行的进行编码直到将所有输入编码成一个包含所有原始输入信息的固定长度向量hn。解码器则会根据向量hn进行解码操作,并输出y1,y2,.....,yn。

前面说过看图说话任务是一种特殊的机器翻译系统,输入从单词序列变成了图像,而CV领域中主要使用CNN卷积神经网络来提取图像特征,所以编码器使用CNN结构。解码器还是使用Decoder结构来输出序列就可以了。这种将CNN RNN(解码器就是RNN结构)相结合就成为了看图说话任务的核心思路。后续的很多解决方案中有很多是使用更好的CNN模型或者更好的RNN结构。

2.3 百度的m-RNN模型

百度2014年10月在论文《Explain Images with Multimodal Recurrent Neural Networks》中提出了m-RNN模型,第一个创造性的把CNN RNN相结合来解决看图说话任务。下面是一般的RNN和m-RNN结构对比图:

图5 一般的RNN和m-RNN结构对比图

上图中(a)是简单的RNN结构,(c)是m-RNN结构。m-RNN模型的输入是图片以及图片对应的描述。比如现在有张图片以及对应的描述”a man at a giant tree in the jungle”,最开始第一轮m-RNN模型会输入图片以及开始标志##START##,模型的输出是第一个词a;第二轮m-RNN模型会再次输入图片以及已经得到的词一起来预测下一个单词man,依次循环直到模型最后输出结束标志##END##。整体来看相比于简单的RNN结构m-RNN每次会额外加入图片特征。

m-RNN模型开创性的将CNN RNN相结合用于解决看图说话任务,后面主要作为其他论文以及模型的baseline进行对比。

2.4 谷歌的NIC模型

谷歌2014年11月在论文《Show and Tell: A Neural Image Caption Generator》中提出了NIC(Neural Image Caption)模型。NIC和m-RNN模型非常相似,都是CNN RNN相结合的结构,不同点主要有三处:第一处卷积神经网络CNN部分,NIC模型使用了Inception,而m-RNN使用的是AlexNet;第二处RNN部分,NIC使用LSTM替代了普通的RNN。如果对LSTM不了解的小伙伴可以简单的把LSTM理解成更好用的RNN;第三处图片特征的输入,m-RNN会在每一轮都输入图片特征,而NIC则在最开始的时候仅输入一次。下面是NIC模型的结构图:

图6 NIC模型的结构图

这里需要重点说明图像部分的处理。NIC模型会在开始阶段将图像通过CNN提取特征,然后输入给LSTM,后续并不会再输入图像特征。但是m-RNN模型会在每一轮都输入图像特征。针对这个问题谷歌团队通过实验证明每一轮都输入图像特征会导致模型效果较差,主要原因是模型会放大图像数据中的噪声,同时容易过拟合

2.5 蒙特利尔大学的基于视觉Attention的NIC

前面讲到Encoder-Decoder结构中编码器会将输入序列编码成固定长度的隐层向量hn,然后根据hn向量进行解码来输出序列。也就是说hn向量必须包含输入序列的所有信息,而hn向量的长度是有限的。这样存在一个问题,当输入序列特别长的时候固定长度的隐层向量hn很难保存全部的信息,那么模型的效果就会大大降低。虽然改进版的LSTM通过门机制能一定程度上缓解长序列的遗忘性问题,但还是无法彻底解决。针对这个问题,论文《Neural machine translation by jointly learning to align andtranslate》提出了一种Attention注意力机制。这种Attention机制不再使用统一的语义特征也就是编码器最后得到的隐层向量hn,而是让解码器可以在输入序列中自由选择特征从而提升了编码器解码器的模型效果

蒙特利尔大学在论文《Show, Attend and Tell: NeuralImage Caption Generation with Visual Attention》中将Attention机制应用到NIC模型。相比于NIC模型将图像提取到一个统一的隐层向量hn中,基于Attention的NIC模型会针对图片的不同位置提取不同的特征向量。假如我们将图片划分成12个位置,那么编码器会得到12个特定长度的特征向量。解码阶段会让解码器自由从这12个特征向量中进行选择。下图是基于Attention机制的NIC模型根据不同的词(通过下划线标注)选择图片中不同位置的示例图(图片位置进行高亮):

图7 基于Attention机制的NIC模型

2.6 使用高等级语义特征的V2L

可以看出m-RNN、NIC以及基于Attention机制的NIC三种模型都是将CNN RNN相结合来解决看图说话任务,都是通过CNN模型来抽取图像的特征,然后用RNN去解析,至于这些图像特征具体是什么以及是否有高级语义特征表示并没有说明。针对这个问题,论文《What Value Do Explicit High Level Concepts Have in Vision toLanguage Problems?》提出了使用高层语义特征的V2L模型。相比于直接将图像特征扔给RNN模型,V2L提出了先将这些图像特征利用高层级语义特征进行表示然后再提供给RNN模型,具体是怎么做的先看下V2L模型的结构图:

图8 V2L模型结构

V2L模型相比于上面的三个模型来说RNN部分基本上是类似的,使用了和NIC一样的LSTM结构,主要不同点在于提取图像特征部分。之前的模型简单干脆,直接将通过CNN模型抽取图像的特征,提供给下游RNN的是一堆可解释性很差的向量,但是V2L模型不同。V2L模型提供给下游RNN的是我们人类可以很好理解的高等级语义特征,这也是该论文最有价值的地方,下面进行详细说明。首先我们需要明确的是V2L模型提取图像特征得到的是高等级语义特征Vatt(I),这个高层级语义特征到底是啥?高等级语义特征Vatt(I)其实是一个向量,向量的长度就是标签的长度(词表的长度),可能比较绕,咱们通过一个例子详细说明。如果我们有张图片,图片中有”people、table、pizza”等等,V2L模型得到的是词表中所有词的概率分布,得分比较高的词就是图片得到的高层级语义特征。通过这个例子大家就可以理解V2L模型提取的图像特征到底是啥了。下面是高等级语义特征Vatt(I)的获取流程:

图9 高等级语义特征Vatt(I)的获取流程

首先基于ImageNet预训练一个单标签的CNN;然后将这个模型参数作为初始值构建多标签的CNN模型使用MS COCO这样的多标签标注数据集进行微调;最后经过多标签的CNN模型输出的就是高等级语义特征Vatt(I)向量,这里的高等级语义特征对应的是词表属性中各个词的概率值。这里还需要说明下词表是如何构建的。将训练集标注的语言描述中最常用的词用来构建词表,同时对词表的长度进行了优化操作,比如将不同时态(eat和eating)、复数词(car和cas)都看作一个词。通过这种方式我们可以一目了然的看到图像特征经过CNN之后到底得到的是什么。

2.7 基于图像和描述双向映射的RNN

论文《Mind’s Eye: A Recurrent VisualRepresentation for Image Caption Generation》中提出了一种基于图像和描述双向映射的RNN模型。这篇论文的核心思想是进行看图说话任务时如何让机器学习模型可以像人的眼睛一样根据图像的文本描述自动联想图像构建图像和文本描述的双向映射,更生动的描述就像下面这张图:

图10 构建图像和描述的双向映射

就像上图中右边的人根据一张图像说出“the boy threw the baseball”,左边的人听到这句话可以在脑海中自动生成小男孩打棒球的画面一样。这篇论文主要对Decoder部分进行改进,下图是基于图像和描述双向映射的RNN模型结构:

图11 基于图像和描述双向映射的RNN模型结构

上图中V是经过CNN得到的图像特征向量,St是第t阶段RNN得到的隐层状态,Wt是根据隐层状态得到的词。这里其实和前面的模型是类似的,不同之处是红色方框的部分。在V、St和Wt的前提下,基于图像和描述双向映射的RNN模型还添加了还原图像信息的部分。论文中会根据Wt去生成词的隐变量Ut,主要目的是让模型记住已生成词的信息。最后让模型根据Ut去还原图像信息~V,并且训练过程会让V尽量接近~V。有点绕,通俗的理解是现在我们的模型是根据图像来生成文本描述,同时我们还会根据文本描述来还原图像,希望原来的图像和生成的图像尽量相近。

03 实战看图说话任务

介绍一个看图说话任务的github开源项目NeuralTalk2,目前有5100个star,感兴趣的小伙伴可以尝试下,下面是github的地址:

https://github.com/karpathy/neuraltalk2

下面是NeuralTalk2的可视化结果显示:

图12 NeuralTalk2的可视化结果显示

总结及反思

本篇从理论到实践分享了机器学习是如何解决看图说话任务的。首先介绍了看图说话任务的背景,主要包括什么是看图说话任务和为啥要学习看图说话任务;然后详细讲解了看图说话任务,介绍了看图说话任务、机器翻译以及Encoder-Decoder三者之间的关系,重点介绍了一些有代表性的看图说话模型比如百度的m-RNN、谷歌的NIC、基于视觉Attention的NIC以及使用高等级语义特征的V2L等模型;最后实战了看图说话模型开源项目NeuralTalk2。对CV和NLP交叉领域的看图说话任务感兴趣的小伙伴可能会有帮助。

0 人点赞