[DICM]Image Matters: Visually modeling user behaviors using Advanced Model Server
前言
最近工作都比较忙,一直没更新,刚好最近在做图像特征提取方面的工作,就刚好更新一下一篇阿里发表的利用图像对用户进行视觉特征建模的文章,感觉文中价值最多的内容主要是AMS块的内容,不过本文主要说一下对图像提取的部分内容,思路比较简单,所以本文内容会比较简短一些。
背景
背景内容比较简单,也就是说当前图片信息很少放到ctr预估模型中,这是因为图片非常大,引入到model中训练会使得模型规模非常巨大训练困难,这部分是AMS解决的问题,所以这里避开不谈,另外一方面用户的视觉偏好对于ctr预估而言应该具有一定的价值,这也是DICM(Deep Image Ctr Model,这个名字还真是直白)的原因,下面直奔主题来看一下模型的结构。
DICM
应该说整体的模型结构和当前主流的deep ctr结构类似,都是embedding+mlp的结构,不同的是模型中加入了用户点击过的图片列表,所以其实核心内容是图像这一块的部分,文中称之为embed model,所以我们来着重看一下embed model的结构。
Image embedding model
VGG16
为了说Image embedding model,先来说一下VGG16这个模型,很多人可能对VGG16比较熟悉了,所以不展开细致的介绍了,有不太了解的同学可以参考这篇文章,https://zhuanlan.zhihu.com/p/41423739。下面直接上一下模型的结构图:
VGG16是一个分类的模型,但是熟悉迁移学习的同学应该知道我们可以用这些预训练的模型来提取图像的一些通用特征,比如VGG16,通常而言可以拿第一个FC层的输出作为embedding表达,当然其他层也可以尝试,拿效果来做对比比较合适。
使用keras来提取VGG16的特征也非常方便,如下:
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
model = VGG16(weights='imagenet', include_top=False)
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
features = model.predict(x)
不过上面代码提取的是最后一层pooling后的输出
另外一些ImageNet比赛的模型
我实际的对比中发现,还是VGG16提取的特征效果好一些,大家都可以做一下尝试。
Embedding model
前面说完了可以使用VGG16来提取特征,那么阿里是怎么做的呢?
- 使用VGG16将每个图片提取为4096维的vector
- 在图片的4096维度上增加若干层全连接将4096维压缩到12维,该参数与ctr model一起进行端到端训练
那么主要存在的问题是什么呢?
- 用户点击过的图片是一个列表,表示为对应图片的embedding后是不定长的
针对上述问题,最常见的措施是什么呢?
- 直接concat
- sum/avg pooling
- attentive pooling
- attentive pooling(add id feature)
下面挨个来说一下吧
concat
直接有多少个图片就concat多少个,这种方式是不定长的,没办法放到模型里(不用rnn、lstm这类结构的话)
sum\avg pooling
这种处理方案比较常见,直接对所有的embedding求和或者平均,缺点是将每个图片对于当前的预估权重相当于都设置为相同权重,在用户的列表比较长时效果不佳
attentive pooling
做法参考阿里17年的文章DIN,使用加权和来处理embedding融合的问题,适用于用户行为列表比较长的场景。
attentive pooling(add id feature)
第三种方案的attention主要是基于当前预估的图片以及用户的历史图片列表,而特征交叉在ctr预估场景下通常也比较重要,因此,这里加入了新的特征交叉,举个简单的例子:
当前的广告是属于大衣类,此时用户表达时便可以通过给用户历史点击中的大衣图片更大的权重来进行加权求和,这也是这个方案的目的,具体实现如上图(d),即使用了两个attention结构,二者右侧的输入不同,一个是预估任务的image embedding,另一个是id类特征的embedding。
评估
上面基本就过完DICM的核心结构内容了,评估指标是使用GAUC,看实验数据来说有些许的提升。
总结
DICM模型整体而言没有让人眼前一亮的感觉,使用迁移学习提取特征放到模型中训练应该许多公司都做了,attentiive pooling也是借鉴了DIN的思路,文章中更重要的内容应该是AMS这样一个平台,这应该才是这篇文章的核心内容,不过本人水平较差,对于平台这块知之甚少,没太理解这种大规模分布式的平台是怎样的原理,以后还得好好学习。
本次的内容就到这了。
ps:最近在做图片feature提取时,用vgg16提取完embedding后再走了一个auto-encoder模型来做压缩,总体来看似乎还可以,后续比较一下ctr效果咋样再说。