XDRush

Attention机制及其在计算广告中的应用

背景说明

在搜索广告和信息流广告中,除了常说的各种模型的应用之外,还有一块往往被大家所忽视,那就是物料优化,但是广告物料是直接呈现在网民面前的,对这一部分做好了优化工作无疑对广告的点击率/cpm以及用户体验上大有裨益。

物料优化中最重要的两点就是:(1)<关键词,标题>的相关性以及标题质量;(2)<关键词,图>的相关性以及图片质量。当广告库规模较小时,通过运营手段能取得较好的效果,但是当关键词达到几十万甚至几百万乃至千万量级时,人力手段就显得力不从心了。

这时,深度学习就能发挥优势。AI领域的两大难题就是:(1)自然语言理解;(2)图片理解;广告物料优化又恰恰是这两个领域的结合,因此想借助于深度学习等技术手段完全解决物料优化的问题是显然不可能的,只能Word2Vec、CNN、LSTM、Attention等技术手段进行初步优化;Attention机制恰恰能在较好的应用在这一场景中。

Attention机制原理

最近两年,注意力模型(Attention Model)被广泛应用于NLP,图像识别等领域中,甚至有基于Attention的FM模型AFM,下面将以机器翻译为例,简单阐述Attention模型的基本原理。

Attention机制起源

Attention模型源自于人类的注意力机制,
人类的注意力机制
上图描述的人类的视觉注意力在观察某个对象时,视觉的重点分布。颜色越深表示关注这一部分的注意力越强。我们发现,在观看小孩这个图片时,将视觉重心放在面部,在看一篇文章时,注意力重点分布在文章标题,摘要头部和文章头部位置,这也比较符合我们观察事物是视觉重心的分布。

深度学习中的注意力机制从本质上来说同人类的视觉注意力机制类似,核心都是从众多的信息中选择出对当前任务目标更关键的信息。

Encoder-Decoder框架

目前基本上所有的Attention模型都是建立在Encoder-Decoder框架之上的,所以有必要先了解下Encoder-Decoder框架。
Encoder-Decoder框架

上图就是一个最基本的框架示意图。以NLP领域中的Encoder-Decoder框架来更直观的理解这个框架:可以把它看做处理由一个句子(或一篇文章)生成另外一个句子(文章)的通用模型(也就是机器翻译)。对于句子对,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列组成:
Source-Target表示

Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:
中间语义表示

对于解码器Decoder来说,其任务就是根据句子Source的中间语义表示C和之前已经生成的历史信息y(1),y(2),y(i-1)来生成i时刻的单词y(i):
结果y的表示

每个y(i)都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。由此可见,在文本处理领域,Encoder-Decoder的应用领域相当广泛。

Encoder-Decoder框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。比如对于语音识别来说,上图所示的框架完全适用,区别无非是Encoder部分的输入是语音流,输出是对应的文本信息;而对于“图像描述”任务来说,Encoder部分的输入是一副图片,Decoder的输出是能够描述图片语义内容的一句描述语。一般而言,文本处理和语音识别的Encoder部分通常采用RNN模型,图像处理的Encoder一般采用CNN模型。

Attention模型

本节以机器翻译作为例子来讲解最基本的Attention模型的原理。

上节的Encoder-Decoder没有体现出“注意力模型”,可以把它看作是注意力不集中的分心模型。为什么这么说呢?请看下面目标句子Target中每个单词的生成过程:
结果y的表示

其中f是Decoder的非线性变换函数。从这里不难看出,在生成目标句子的单词时,不论是生成那个单词,他们使用的输入句子Source的语义编码C都是一样的,没有任何区别。

而语义编码C是由句子Source的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,y(1)、y(2)还是y(3),其实句子Source中任意单词对生成某个目标单词y(i)来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。
在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。

上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:

1
(Tom, 0.3) (Chase, 0.2) (Jerry, 0.5)

每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。

同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词y(i)的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的C(i)。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的C(i)。增加了注意力模型的Encoder-Decoder框架理解起来如下图所示:
Attention结构

因此,目标句子单词的生成过程变成了下面的形式:
目标句子的生成

而每个C(i)可能对应着不同的源句子单词的注意力分布概率,比如:

其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入x(i)后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式:
中间结果生成

其中,L(x)代表输入句子Source的长度,a(ij)代表代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而h(j)则是Source输入句子中第j个单词的语义编码。假设C(i)下标i就是上面例子所说的“ 汤姆” ,那么L(x)就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示的形成过程类似下图:

这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?
为了便于说明,我们假设对上图的非Attention模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则上图的框架转换为下图:
Encoder-Decoder展开

那么用上图可以较为便捷地说明注意力分配概率分布值的通用计算过程:
权重计算方式

对于采用RNN的Decoder来说,在时刻i,如果要生成y(i)单词,我们是可以知道Target在生成之前的时刻i-1时,隐层节点i-1时刻的输出值H(i-1)的,而我们的目的是要计算生成y(i)时输入句子中的单词“Tom”、“Chase”、“Jerry”对y(i)来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态H(i-1)去一一和输入句子Source中每个单词对应的RNN隐层节点状态h(j)进行对比,即通过函数F(h(j),H(i-1))来获得目标单词y(i)和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

绝大多数Attention模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。

以上便是Attention模型的基本思想;接下来分享两篇Attention模型在计算广告中的应用。

Attention模型应用于文本分类

文本分类在计算广告中有诸多应用场景,最典型的比如关键词-行业分类,创意标题-行业分类等,分类准确率的提升对广告点击率、cpm等指标能起到很直接的作用。

传统的文本分类方式比如贝叶斯分类、线性分类器系列、SVM系列以及近两年提出的CNN系列,能达到很好的性能,但是以上算法的一个劣势就是分类是基于已经训练好的静态的word2vector,没有考虑到具体的权重信息,而Attention机制正好可以弥补这个劣势。这里给大家分享一篇基于Attention机制的文本分类算法HAN-Hierarchical Attention Networks for Document Classification,本文的创新点个人认为有两个:

  • 提出了一种层次网络;
  • 将Attention模型应用于每层网络中;

下面来剖析文章主要思想;

模型结构

文章提出的HAN结构如下图所示:
HAN结构

由模型结构图可知,Hierarchical主要体现在两个店方:

  • 由word生成句子向量;
  • 由sentence生成document向量;

在上两个过程中,融入了Attention机制。Encoder采用的是GRU(一种类似于LSTM的网络,比LSTM少一个门),具体生成sentence vector和document vector的过程如下:
隐层表示
隐层表示

上式中,w(it)表示第i个sentence的第t个word,W(e)为一个静态矩阵,可理解为就是一个word2vector,最终的隐层结果就是h(it)为双向GRU的结果拼接在一起。得到中间隐层表示之后,就将隐层结果作为attention的输入:
sentence attention

其中u(w)随机初始化并参与到学习过程中,最终,s(i)就是经过Attention模型生成的Sentence vector。类似的,有了sentence vector之后,经过同样的Attention模型,得到document的vector表示如下:
document attention
最终v就是整个document的向量表示。

Softmax分类及Loss

得到document的向量表示之后,即可用softmax对向量进行分类了:
softmax分类

优化目标为:
loss函数
p(dj)表示文档d属于j的概率。

性能比较

最终HAN的性能如下图所示:
HAN-性能
从作者的实验结果看出,HAN相较于传统的文本分类算法,性能有显著的提升。

Attention模型应用于看图说话

在信息流广告和搜索广告中,广告图片对于广告投放效果起着举足轻重的作用,我们在信息流广告中,对top100 pv的关键词图片进行优化,导致CTR直接提升7%,cpm提升5%左右的效果,这是各种模型所远远不能达到的效果。在百度凤巢系统中,百度广告创意部会推荐若干个标题给推广账户,但是图却是收费的,可见广告图片对于广告的地位是多么重要!

在我们的广告系统中,关键词配图、账户配图对于图片的要求相当苛刻,要在众多的图片候选集中选择最合适的图片一直是一个难点。Attention的应用能够极大的提升图文相关性。下面结合《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》一文详细介绍Attention在看图说话中的应用。

模型简介

模型的结构如下图:
模型结构
模型把图片经过CNN网络,变成特征图,LSTM在此上运行Attention模型,最后得到最终的描述。

Encoder实现

将经过CNN之后得到的图片特征图切割成多个区域,表示为:
图片编码
L表示切割的区域个数,paper中区域的大小为14*14,D=196。输出的描述y可以编码为:
输出描述编码
K表示词汇词典的大小,C为描述的长度,y(i)为one-hot表示。

Decoder实现

该模型的LSTM结构如下图所示:
LSTM结构
上图就是典型的LSTM的几个门结构,运算方式为:
LSTM运算方式

上式中z(t)表示对整张图片部分信息的动态表示,是一个Attention模型,计算方式如下:
动态信息表示

其中i表示第i个特征区域,共有L个;函数f(att)采用的是一个MLP,利用前一时刻的隐层状态h(t-1)与L个特征区域,分别得到每个区域的权重a(ti),权重a(ti)可以理解为(1)下一步选择哪一个区域的概率,也可以理解为(2)每一个区域在下一次输入中所占的比例;不同的理解与应用,体现在函数z(t)的不同实现上。

按(1)的实现称为Stochastic “Hard” Attention,按(2)的实现称为Deterministic “Soft” Attention。下图实例很好的表现了Hard和Soft这两种方式的区别:
Hard和Soft区别

可以看出,Soft在选择图像区域时更加平滑。

LSTM中的记忆单元和隐藏单元的初始值,是两个不同的多层感知机,采用所有特征区域的平均值来进行初始化的。
初始化方式
而最终的单词概率输出,采用深度输出层实现:
最终预测

Stochastic “Hard” Attention

s(t, i)表示是否选择L个特征图中的第i个,如果设置为1,表示选中,0表示不选中。在随机“Hard”模型中,每次只选中一个区域。则z(t)的计算方式如下:

我们设置logp(y|a)函数的下限为优化的目标函数L(s):
hard目标函数

对其进行参数求导有:
参数求导

以上参数求导可用蒙特卡洛方法采样实现:
蒙特卡洛方式

为减少估计方差,可采用冲量方式,第k个mini-batch的时候:
冲量方式

为进一步减少估计方差,引入多项式分布的熵H(s):
多项式熵

以上参数求导优化的过程就是强化学习,每次选择下一个特征图的过程都朝着目标更好的方向变化。值得注意的是,Hard Attention在优化目标时,采用随机梯度上升方式。

Deterministic “Soft” Attention

上面的”Hard”随机模型需要随机采样位置s(t),我们还可以直接计算z(t):
对每个区域都取一个权重
这就是Deterministic “Soft” Attention模型,通过a(t,i)来选择感兴趣的特征区域,每个特征区域都有一个权重。在计算具体的a(t,i)时,有:
权重之和等于1

也就是,通过上面这个限制条件保证每个区域的权重之和等于1。另外,加入一个新的正则,对每一个区域,在所有的T步中,将被观察到的权重之和拉近:
加入正则
这个正则的加入,可以使得生成的描述更加丰富,结果会更好。另外,在z(t)的计算中添加一个标量进行缩放,通过前一个隐藏单元h(t-1)来计算:
加入标量

最终的目标函数为:
soft目标函数

与Hard不同的是,Soft采用的是随机梯度下降方式更新超参数。

Attention在物料优化中的应用

目前结合我们组的业务场景,主要是将Attention模型应用于生成图片描述,然后根据相关性,计算关键词和描述之间的相关性,进而为关键此配图。
具体应用01

如上图,在广告图库中随机抽取一张美容相关的照片,预测结果中“胶原蛋白”真是我们想要的关键词。(在构造样本时,将关键词+标题拼接在一起当做图片描述,主要是考虑到现在很多广告采用了标题党这种新式)

具体应用02
上图是一个badcase,给出的图片应该是金融理财类的,生成的描述却是糖尿病相关的。目前,因为标注的数据集较少,模型尚达不到要求,后续随着数据的增多,相信这种方式可以较好的服务于计算广告。