DIN模型

Deep Interest Network for Click-Through Rate Prediction

摘要

在工业界,点击率预估是一项基本的任务,例如线上广告。最近基于Embedding和MLP的深度学习模型特别的流行。将大量稀疏特征转化为低维的Embedding向量,以分组的转化为固定的长度,然后拼接在一起喂给全连接层,学习特征的非线性关系。**通过这种方式,用户的特征被压缩成固定长度的向量表达,但是,没有考虑广告的候选集是什么。**由于用户行为丰富多变,使用固定长度的向量,不能很好地表征用户兴趣。在本论文中,我们提出如下创新DIN模型:**为了解决这个问题,我们通过设计局部激活单元,根据给定广告,从用户的历史行为中学习用户的兴趣点。**这种表征根据根据广告的不同而发生变化,很大程度提升模型的能力。除此之外,我们还发明了两个技巧:小样本正则化和数据自适应激活函数,能够训练1亿多个参数工业级深度网络。在两个公开数据集和2亿样本阿里巴巴数据上证明该方法的有效性。该模型的效果优于现有的方法。DIN模型成功地应用于阿里巴巴的广告系统,服务于主要的流量。

1 背景介绍

在CPC广告系统中, 广告商会根据eCPM(千次展示收入)进行排序,它是根据竞价和CTR预估计算得到,而CTR需要根据系统进行计算。因此,CTR预估在广告系统中扮演重要角色,直接影响到最终的广告收入。在商业和研究领域,CTR预估得到广泛的关注。

受深度学习在视觉和NLP领域成功的启发,深度学习开始应用于CTR预估的任务。将大量稀疏特征转化为低维的Embedding向量,以分组的转化为固定的长度,然后拼接在一起喂给全连接层,学习特征的非线性关系。相对于逻辑回归,这些深度模型减少特征工程的工作量,很大程度地提升模型的能力。Embedding&MLP在CTR预估的任务已经变得非常流行。

用有限维度的Embedding&MLP表征多样的用户兴趣存在困难。用户访问电商网站会对多种商品感兴趣,这也就是说,用户的兴趣是多变的。对CTR进行预估的时候,使用用户的历史行为数据。Embedding&MLP将用户行为数据转化为固定的长度向量,限制对多变兴趣表征能力。 为了表征多样的用户兴趣,增加向量的维度,但是这样存在过拟合的风险,而且增加计算量,这是不能容忍的。

换句话说,没有必要将所有的用户兴趣压缩到一个相同维度的向量中。只有部分兴趣影响当前的点击行为。举例来说,一个妇女点击一个护目眼镜,主要是由于她前段时间购买游泳衣和她上周购买一双鞋子没有太大的关系。我们提出的DIN模型会根据候选的广告和用户的历史行为的相关性,动态地表征用户兴趣。DIN模型采用局部激活单元,根据用户历史行为,搜索与当前候选广告相关的购买行为,根据相关性设置权重,进行sum pooling操作,以此表征用户兴趣。 相关性越高,权重越大,通过这种方式,在有限维度的向量情况下,表征用户多变的兴趣,提升模型的表达能力。

在工业级的应用中,使用大量的稀疏特征训练模型存在巨大挑战。举例来说:SGD基于mini-batch训练模型,L2正则化基于mini-batch全部参数(有时参数多达10亿级别)使得计算变得不可接受。我们提出mini-batch aware 正则化,只更新特征值非零的参数。除此之外,我们设计自适应激活函数, 使得PReLU通用化,根据输入数据的分布进行动态调整。

这篇论文做出以下几点贡献:

  • 设计局部激活单元(local activation unit) 能够根据特定的广告自适应学习用户兴趣,解决固定长度向量表征多样用户兴趣的不足的问题。DIN模型更好地捕捉用户兴趣,提升了模型的表达能力。
  • 提出训练工业级神经网络两个创新技术:1)mini-batch aware regularization 解决了由于参数过多带来计算复杂性问题,同时避免过拟合情况。2)在考虑数据分布的情况下,设计数据自适应激活函数(data adaptive activation function),使得模型获得良好的表现。
  • 我们在两个公开数据集和阿里巴巴数据进行实验,证明了DIN模型和训练技巧的有效性。我们代码开源,在世界上最大广告平台-阿里巴巴得到应用,为商业界做出巨大的贡献。

我们这篇论文主要聚焦在电商广告展示的CTR预估模型。这个模型同样也适用于其他相似的场景,电商中的个性化推荐和社交领域的feed流排序。

论文分为以下几个部分:第2节介绍相关工作,第3节介绍电商广告系统用户行为数据

应用情况。第4、5节详细介绍DIN模型的设计和两个训练技巧。第6节介绍实验的应用。第7节说明下总体的结论。

2 相关工作

CTR预估模型的结构从浅层到深层进行演化,样本量和特征维度也越来越大。为了提供模型的表征能力,在网络结构设计进行了相关研究。

NNLM通过Embedding替代onehot方式,学习预测下一个单词,避免单词特征维度过高的问题,为CTR预估模型学习稀疏特征情况带来启发。

LS-PLM和FM模型为了捕捉特征之间的交叉情况,首次将稀疏特征做embedding处理,然后输入到特定设计的转换函数。

Deep Crossing、Wide&Deep Learning、YouTube Recommendation CTR模型对LS-PLM和FM进行扩展,利用复杂的MLP替换转换函数,提升模型的能力。PNN为了捕捉更高阶交叉特征在embedding layer之后引入product layer。DeepFM加入因子分解机作为Wide&Deep的Wide部分,不需要进行特征工程。这些模型都有相似的网络结构,Embedding层学习稀疏的类别特征,MLP层学习特征的交叉组合,减少了特征工程的工作量。我们基础对比模型也采用相似的网络结构。**用户兴趣是通过搜索和点击商品的id来表现的。这些模型使用求和或者求平均pooling方式将序列商品id转化为固定的长度,会损失很多信息。**这就需要通过DIN模型根据候选广告id自适应学习特征表示, 提升模型的表征能力。

Attention机制来自深度翻译模型(NMT)领域。为了得到期望的下一个单词,NMT对所有译文进行求和加权,计算与其最相关的词作为目标词。DeepIntent在搜索广告领域采用类似NMT的attention机制,他们采用RNN进行建模,学习全局隐藏层向量,对用户检索的关键词采用注意力机制。这也说明了注意力机制能够捕捉用户的在广告和搜索中能够关注用户的意图。DIN模型设计局部激活单元对用户的行为进行相关性计算,在给定广告的情况下,采用加权求和的方式自适应的学习用户的兴趣。用户的表征兴趣随着广告的不同发生变化,这是和DeepIntent不同的地方,DeepIntent没有采用广告和用户兴趣的交互情况。

我们部署的DIN模型代码开源并且在世界上最大的广告系统的得到成功的应用,在多达上亿参数的网络模型进行训练优化,对训练的技巧进行创新。

3 背景

在电商网站,例如阿里巴巴,广告就是商品。如果我们不做特别声明,我们将广告称作商品。Figure 1描述了购物流程。

在这里插入图片描述

图1描述的广告展示系统主要包括两个阶段:1)使用类似协同过滤的方法,匹配产生候选集的阶段。2)根据预估的CTR进行排序的阶段。每天会有大量的用户访问网站,产生大量的用户行为,这些对匹配和排序是非常重要的。这些用户历史行为表征用户多样的兴趣。例如,年轻妈妈最近浏览过大衣,T恤、耳环、皮包或者宝宝衣服等等。这些用户行为表明了用户的兴趣。当她再次访问网站时展示合适广告给她,例如一个新款的包包。显然,这个广告展示和这么年轻妈妈的兴趣是相互匹配的。总之,用户的兴趣是丰富多样的,可以在给定特定广告下匹配用户兴趣。接下来,我们将讨论如何利用这些特征构建CTR预估模型。

4 深度兴趣模型(Deep Interest Network)

不同于搜索,广告展示系统无法获取用户明确的意图。因此,我们只能从历史行为中提取用户的兴趣,建立CTR预估模型。由于用户和广告是广告系统中基本元素,使用这些特征进行深度挖掘是非常重要的。

4.1 特征表示

在CTR预估模型使用的特征通常是多种类别的,例如【星期五,性别:女, 访问的类别ids:{包、书籍}, 广告的类别id: 书籍】,通常会将稀疏的类别特征转化为对其进行高维二进制表示。数学上编码第$i $个特征 t i ∈ R K i t_i \in R^{K_i} tiRKi. 其中 K i K_i Ki是特征的维度。 K i K_i Ki个唯一编码维度(例如:性别编码 K i = 2 K_i=2 Ki=2)。 t i [ j ] t_i[j] ti[j] 表明 t i t_i ti的第 j j j个元素, t i [ j ] ∈ { 0 , 1 } t_i[j] \in \{0,1\} ti[j]{0,1} ∑ j = 1 K i = k \sum_{j=1}^{K_i}=k j=1Ki=k。如果向量 t i t_i ti计算的 k = 1 k=1 k=1表明是one-hot编码, k > 1 k>1 k>1表明是multi-hot编码。一个样本可以表示为 x = [ t 1 T , t 2 T , ⋯   , t M T ] T x=[t_1^T,t_2^T,\cdots,t_M^T]^T x=[t1T,t2T,,tMT]T,其中,M是特征的个数。 ∑ i = 1 M K i = K \sum_{i=1}^{M}K_i=K i=1MKi=K, K K K是所有特征的维度。前面提到的4个特征可以通过以下方式表示

在这里插入图片描述

全部的特征集合如下表1所示。它是由4种类别组成,multi-hot编码的用户行为和丰富的用户兴趣。注意,在我们的设置中,没有使用交叉特征。我们可以通过深度网络捕捉特征之间的交叉关系。

在这里插入图片描述

4.2 基础模型(Embedding&MLP)

如 Fig.2 左边的图所示。它是由以下几个部分组成

Embedding layer .将高维的二值变量转化为低维度稠密的向量。对于 t i t_i ti个特征,用向量 W i = [ w 1 i , … , w j i , … , w K i i ] ∈ R D × K i \mathrm{W}^{i}=\left[w_{1}^{i}, \ldots, w_{j}^{i}, \ldots, w_{K_{i}}^{i}\right] \in \mathbb{R}^{D \times K_{i}} Wi=[w1i,,wji,,wKii]RD×Ki表示第 i i i特征的字典,其中, w j i ∈ R D w_j^i\in R^D wjiRD表示embedding向量的维度为 D D D。Embedding操作如下Fig.2所示。

  • 如果 t i t_i ti的 第 j j j个元素 t i [ j ] = 1 t_i[j]=1 ti[j]=1是one-hot向量, t i t_i ti的embedded表示是单独的向量。 e i = w j i e_i=w_j^i ei=wji
  • 如果 t i t_i ti是multi-hot向量, t i [ j ] = 1 t_i[j]=1 ti[j]=1 j ∈ { i 1 , i 2 , ⋯ , i k } j\in \{i_1,i_2,\cdots, i_k\} j{i1,i2,ik}, t i t_i ti的embedded表示是一个list: { e i 1 , e i 2 , … e i k } = { w i 1 i , w i 2 i , … w i k i } \left\{\boldsymbol{e}_{i_{1}}, \boldsymbol{e}_{i_{2}}, \ldots \boldsymbol{e}_{i_{k}}\right\}=\left\{w_{i_{1}}^{i}, w_{i_{2}}^{i}, \ldots w_{i_{k}}^{i}\right\} {ei1,ei2,eik}={wi1i,wi2i,wiki}

Pooling layer and Concat layer 不同用户的行为序列长度是不同的,导致他们的特征 t i t_i ti表示embedding向量是变化的,需要将其转化为固定的长度。
e i = pooling ( e i 1 , e i 2 , ⋯   , e i k ) (1) e_i=\text{pooling}(e_{i1}, e_{i2}, \cdots, e_{ik})\tag{1} ei=pooling(ei1,ei2,,eik)(1)
在这里插入图片描述

两个常用处理embedding list方式包括sum pooling和average pooling。

对于每个稀疏特征,将其映射为固定长度的多重向量表示,将他们拼接在一起,构成该样本的全部表示。

MLP 将稠密的向量拼接在一起,利用全连接网络自动学习特征组合,可以更好地提取特征信息。

Loss 基础模型的目标函数是负log-likelihood函数,定义如下:
L = − 1 N ∑ ( x , y ) ∈ S ( y log ⁡ p ( x ) + ( 1 − y ) log ⁡ ( 1 − p ( x ) ) ) (2) L=-\frac{1}{N} \sum_{(x, y) \in \mathcal{S}}(y \log p(x)+(1-y) \log (1-p(x)))\tag{2} L=N1(x,y)S(ylogp(x)+(1y)log(1p(x)))(2)
其中,训练的数据集 S S S, 数据集的大小为 N N N, x x x是特征输入, y y y是标签, p ( x ) p(x) p(x)是softmax后的输出概率, 表征预测的概率。

4.3 DIN模型的结构

如Table 1所示, 在电商应用中,利用用户行为特征表征用户兴趣是非常重要的。

def DIN(dnn_feature_columns, history_feature_list, dnn_use_bn=False,
        dnn_hidden_units=(200, 80), dnn_activation='relu', att_hidden_size=(80, 40), att_activation="dice",
        att_weight_normalization=False, l2_reg_dnn=0, l2_reg_embedding=1e-6, dnn_dropout=0, seed=1024,
        task='binary'):
    dnn_input_emb_list = embedding_lookup(embedding_dict, features, sparse_feature_columns,
                                          mask_feat_list=history_feature_list, to_list=True)
    dense_value_list = get_dense_input(features, dense_feature_columns)

    sequence_embed_dict = varlen_embedding_lookup(embedding_dict, features, sparse_varlen_feature_columns)
    sequence_embed_list = get_varlen_pooling_list(sequence_embed_dict, features, sparse_varlen_feature_columns,
                                                  to_list=True)

    dnn_input_emb_list += sequence_embed_list

    keys_emb = concat_func(keys_emb_list, mask=True)
    deep_input_emb = concat_func(dnn_input_emb_list)
    query_emb = concat_func(query_emb_list, mask=True)
    hist = AttentionSequencePoolingLayer(att_hidden_size, att_activation,
                                         weight_normalization=att_weight_normalization, supports_masking=True)([
        query_emb, keys_emb])

    deep_input_emb = tf.keras.layers.Concatenate()([NoMask()(deep_input_emb), hist])
    deep_input_emb = tf.keras.layers.Flatten()(deep_input_emb)
    dnn_input = combined_dnn_input([deep_input_emb], dense_value_list)
    output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
    final_logit = tf.keras.layers.Dense(1, use_bias=False,
                                        kernel_initializer=tf.keras.initializers.glorot_normal(seed))(output)
    output = PredictionLayer(task)(final_logit)

    model = tf.keras.models.Model(inputs=inputs_list, outputs=output)
    return model

在基础模型中,如Eq.(1)所示,使用固定的长度向量通过pooling的方式表征用户兴趣。给定用户,他们的表征向量是相同的,与候选的广告无关。用固定长度的向量表征用户兴趣存在瓶颈问题,需要增加向量的维度,但是,增加向量的维度会导致学习参数任务非常重。而且在有限的样本下,会导致过拟合的风险,增加计算和存储的复杂度,不利于工业级的应用。

如何用有限的特征维度表征丰富的用户兴趣?对用户的兴趣进行局部激活给了我们设计DIN模型的灵感。以上面第3节提到的那个例子,年轻妈妈发现一个非常可爱的手提包,点击了她。让我们剖析背后的原因发现,她最近浏览其他手提包。换句话说,用户的过去行为会对当前点击产生贡献。DIN模型根据候选的广告计算和过去历史行为的相关性表征用户兴趣,替代之前使用固定的向量表征全部用户兴趣的方式。这种表征随着广告的变化而变化的。

如Fig.2 的右半部分所示,描述DIN模型的网络结构。相比于基础模型,DIN模型引进局部激活单元,其他结构都相同。这种局部激活单元表征用户兴趣,它是通过给定广告A的情况下,计算加权sum pooling自适应计算 v U v_U vU,如下Eq.(3)所示
v U ( A ) = f ( v A , e 1 , e 2 , … , e H ) = ∑ j = 1 H a ( e j , v A ) e j = ∑ j = 1 H w j e j (3) \boldsymbol{v}_{U}(A)=f\left(\boldsymbol{v}_{A}, \boldsymbol{e}_{1}, \boldsymbol{e}_{2}, \ldots, \boldsymbol{e}_{H}\right)=\sum_{j=1}^{H} a\left(\boldsymbol{e}_{j}, \boldsymbol{v}_{A}\right) \boldsymbol{e}_{j}=\sum_{j=1}^{H} \boldsymbol{w}_{j} \boldsymbol{e}_{j}\tag{3} vU(A)=f(vA,e1,e2,,eH)=j=1Ha(ej,vA)ej=j=1Hwjej(3)
其中, { e 1 , e 2 , ⋯   , e H } \{e_1,e_2,\cdots,e_H\} {e1,e2,,eH}是用户 U U U一组行为embedding向量,长度为 H H H v A v_A vA是广告 A A A的embedding向量。通过这种方式, v U ( A ) v_U(A) vU(A)随着广告变化而不同。 a ( ⋅ ) a(\cdot) a()作为前向传播的激活权重函数,如Fig.2描述。除了两个输入的向量, a ( ⋅ ) a(\cdot) a()将他们的外积拼接,喂给接下来的网络,这一明确的知识,可以帮助接下来的关联建模。

Eq.(3) 局部激活单元相似的思想来自NMT 任务。但是与传统的attention机制不同,在Eq.(3)中放宽了 ∑ i w i = 1 \sum_i w_i=1 iwi=1的限制,目的是为了保留用户兴趣的强度。对 a ( ⋅ ) a(\cdot) a()使用softmax对其进行标准化已经被放弃了。例如一个用户的历史行为90%购买购买的衣服,10%购买的电器产品。如果给定T恤和手机两个候选广告,T恤的用户兴趣强度 v U v_U vU高于手机。传统的注意力机制通过标准化,数值上失去分辨率。

我们已经尝试通过LSTM对用户的历史行为序列进行建模,但是效果没有提升。NLP任务通常存在固定的语法,而用户的历史行为同时存在多种兴趣组合,兴趣的跳跃性和突然的结束会让数据看起来存在很多的噪音。因此,针对这种序列数据,需要设计特殊的模型结构。这留给我们将来去研究。

class LocalActivationUnit(Layer):

    def __init__(self, hidden_units=(64, 32), activation='sigmoid', l2_reg=0, dropout_rate=0, use_bn=False, seed=1024,
                 **kwargs):
		pass
    def build(self, input_shape):
		pass

    def call(self, inputs, training=None, **kwargs):

        query, keys = inputs

        keys_len = keys.get_shape()[1]
        queries = K.repeat_elements(query, keys_len, 1)

        att_input = tf.concat(
            [queries, keys, queries - keys, queries * keys], axis=-1)

        att_out = self.dnn(att_input, training=training)

        attention_score = self.dense([att_out, self.kernel, self.bias])

        return attention_score

    def compute_output_shape(self, input_shape):
		pass

    def compute_mask(self, inputs, mask):
        pass

    def get_config(self, ):
		pass

5 训练技巧

在阿里巴巴的广告系统中,存在上亿级别的用户和商品。训练工业数据的大量稀疏特征给训练带来巨大的挑战。在本节中,我们介绍两个重要的技巧帮助解决这个问题。

5.1 Mini-batch Aware Regularization

过拟合是工业界网络模型训练面临巨大挑战。像访问商品id、用户特征、广告id等,多达6亿。如Fig.4绿线所示,如果没有正则化处理,模型效果在第一轮训练后,会显著下降。传统的 L 1 L1 L1 L 2 L2 L2正则项不适合处理稀疏且存在百万级别参数网络。以 L 2 L2 L2正则为例,对每个batch来说, L 2 L2 L2正则需要对多达上亿的参数进行更新,这样就会增加计算的压力,而对于那些稀疏特征来说,我们只需要更新那些非0的数据的参数。

在这里插入图片描述

在本篇论文中,我们介绍mini-batch aware regularizer, 只是更具存在非零数据更新模型的参数。实际上,向量字典的学习是最重的计算任务。 W ∈ R D × K \mathbf{W} \in \mathbb{R}^{D\times K} WRD×K表示embedding字典全部参数。 D D D表示向量的维度, K K K表示空间的维度。对 L 2 L2 L2正则化扩充方式如下:
L 2 ( W ) = ∥ W ∥ 2 2 = ∑ j = 1 K ∥ w j ∥ 2 2 = ∑ ( x , y ) ∈ S ∑ j = 1 K I ( x j ≠ 0 ) n j ∥ w j ∥ 2 2 (4) L_{2}(\mathbf{W})=\|\mathbf{W}\|_{2}^{2}=\sum_{j=1}^{K}\left\|\boldsymbol{w}_{j}\right\|_{2}^{2}=\sum_{(\boldsymbol{x}, y) \in \mathcal{S}} \sum_{j=1}^{K} \frac{I\left(\boldsymbol{x}_{j} \neq 0\right)}{n_{j}}\left\|\boldsymbol{w}_{j}\right\|_{2}^{2}\tag{4} L2(W)=W22=j=1Kwj22=(x,y)Sj=1KnjI(xj=0)wj22(4)
其中, w j ∈ R D w_j\in \mathbb{R}^D wjRD是第 j j j个embedding向量。 I ( x j ≠ 0 ) I\left(\boldsymbol{x}_{j} \neq 0\right) I(xj=0)表示样本是否有特征 j j j n j n_j nj表示样本 j j j在所有样本出现的次数。Eq.(4)可以转化为Eq.(5):
L 2 ( W ) = ∑ j = 1 K ∑ m = 1 B ∑ ( x , y ) ∈ B m I ( x j ≠ 0 ) n j ∥ w j ∥ 2 2 (5) L_{2}(\mathbf{W})=\sum_{j=1}^{K} \sum_{m=1}^{B} \sum_{(\boldsymbol{x}, y) \in \mathcal{B}_{m}} \frac{I\left(\boldsymbol{x}_{j} \neq 0\right)}{n_{j}}\left\|\boldsymbol{w}_{j}\right\|_{2}^{2}\tag{5} L2(W)=j=1Km=1B(x,y)BmnjI(xj=0)wj22(5)
其中, B B B表示mini-batches的数量, B m \mathcal{B}_m Bm表示第 m m m个mini-batch。 α m j = max ⁡ ( x , y ) ∈ B m I ( x j ≠ 0 ) \alpha_{m j}=\max _{(x, y) \in \mathcal{B}_{m}} I\left(x_{j} \neq 0\right) αmj=max(x,y)BmI(xj=0)表示在mini-batch至少有一个特征 j j j。然后Eq.(5)可以用以下方式近似表示:
L 2 ( W ) ≈ ∑ j = 1 K ∑ m = 1 B α m j n j ∥ w j ∥ 2 2 (6) L_{2}(\mathbf{W}) \approx \sum_{j=1}^{K} \sum_{m=1}^{B} \frac{\alpha_{m j}}{n_{j}}\left\|w_{j}\right\|_{2}^{2} \tag{6} L2(W)j=1Km=1Bnjαmjwj22(6)
通过这种方式,我们衍生新的 L 2 L2 L2正则化。对于第 m m m个mini-batch, 特征 j j j 的embedding 权重更新方式如下:
w j ← w j − η [ 1 ∣ B m ∣ ∑ ( x , y ) ∈ B m ∂ L ( p ( x ) , y ) ∂ w j + λ α m j n j w j ] (7) w_{j} \leftarrow w_{j}-\eta\left[\frac{1}{\left|\mathcal{B}_{m}\right|} \sum_{(x, y) \in \mathcal{B}_{m}} \frac{\partial L(p(x), y)}{\partial w_{j}}+\lambda \frac{\alpha_{m j}}{n_{j}} w_{j}\right]\tag{7} wjwjηBm1(x,y)BmwjL(p(x),y)+λnjαmjwj(7)
通过这种方式,在第 m m m个mini-batch中,只有存在特征值才会参与计算。

5.2 数据自适应激活函数

常用的PReLU的激活函数如下:
f ( s ) = { s  if  s > 0 α s  if  s ≤ 0 = p ( s ) ⋅ s + ( 1 − p ( s ) ) ⋅ α s (8) f(s)=\left\{\begin{array}{ll} s & \text { if } s>0 \\ \alpha s & \text { if } s \leq 0 \end{array}=p(s) \cdot s+(1-p(s)) \cdot \alpha s\right. \tag{8} f(s)={sαs if s>0 if s0=p(s)s+(1p(s))αs(8)
其中, s s s是激活函数 f ( ⋅ ) f(\cdot) f()的输入, p ( s ) = I ( s > 0 ) p(s)=I(s>0) p(s)=I(s>0)是控制 f ( s ) f(s) f(s) f ( s ) = s f(s)=s f(s)=s f ( s ) = α s f(s)=\alpha s f(s)=αs进行转换的指示函数, α \alpha α是学习的参数。 p ( s ) p(s) p(s)是控制函数。Fig.3的左半部分图是PReLu。它的左半部分好是硬性为0的点,对于不同分布的数据,该种方式处理可能不太适合。因此,我们重新设计自适应激活函数Dice,
f ( s ) = p ( s ) ⋅ s + ( 1 − p ( s ) ) ⋅ α s , p ( s ) = 1 1 + e − s − E [ s ] Var ⁡ [ s ] + ϵ (9) f(s)=p(s) \cdot s+(1-p(s)) \cdot \alpha s, p(s)=\frac{1}{1+e^{-\frac{s-E[s]}{\sqrt{\operatorname{Var}[s]+\epsilon}}}}\tag{9} f(s)=p(s)s+(1p(s))αs,p(s)=1+eVar[s]+ϵ sE[s]1(9)
该控制函数如Fig.3的右图所示。在训练阶段, E [ s ] E[s] E[s] V a r [ s ] Var[s] Var[s]表示输入的每个mini-batch的均值和方差。在测试阶段, E [ s ] E[s] E[s] V a r [ s ] Var[s] Var[s]会随着数据进行平滑计算, ϵ \epsilon ϵ是一个设置的非常小的常数,我们将它设置为 1 0 − 8 10^{-8} 108

Dice可以认为PReLu的通用形式。Dice的方式随着输入数据分布的变化自动调整,它的值是输入数据的均值。除此之外,Dice可以控制在两个通道之间进行切换。当 E ( s ) = 0 E(s)=0 E(s)=0 V a r [ s ] = 0 Var[s]=0 Var[s]=0,Dice降级为PReLU。

class Dice(Layer):
    def __init__(self, axis=-1, epsilon=1e-9, **kwargs):
        self.axis = axis
        self.epsilon = epsilon
        super(Dice, self).__init__(**kwargs)

    def build(self, input_shape):
        self.bn = tf.keras.layers.BatchNormalization(
            axis=self.axis, epsilon=self.epsilon, center=False, scale=False)
        self.alphas = self.add_weight(shape=(input_shape[-1],), initializer=Zeros(
        ), dtype=tf.float32, name='dice_alpha')  # name='alpha_'+self.name
        super(Dice, self).build(input_shape)  # Be sure to call this somewhere!
        self.uses_learning_phase = True

    def call(self, inputs, training=None, **kwargs):
        inputs_normed = self.bn(inputs, training=training)
        # tf.layers.batch_normalization(
        # inputs, axis=self.axis, epsilon=self.epsilon, center=False, scale=False)
        x_p = tf.sigmoid(inputs_normed)
        return self.alphas * (1.0 - x_p) * inputs + x_p * inputs

    def compute_output_shape(self, input_shape):
		pass

    def get_config(self, ):
		pass

6 实验

在本节,我们讲述一下实验过程,包括:数据集、评估指标、实验设置、模型对比和模型分析。在两个公开的数据集和阿里巴巴数据集上,进行相关实验,模型效果优于当前模型。

6.1 数据集和参数设置

在这里插入图片描述

Amazon Dataset

参数设置:

优化器:SGD

decay rate: 0.1

mini-batch: 32

使用特征:商品id, 类别id, 用户浏览商品列表,商品id列表,类别id列表。

MovieLens Dataset

电影评分0-5,0-4划分为负样本,4-5为正样本。

使用特征: 电影id,电影类别_id, 用户的评分,电影id的列表, 电影类别的列表

Alibaba Dataset

MLP设置:192 × 200 × 80 × 2

mini-batch size:5000

optimizer: Adam

learning rate starts: 0.001

decay rate:0.9

6.2 模型对比

  • LR. baseline

  • BaseModel . Embedding&MLP architecture

  • Wide&Deep. 模型包括两部分:1) 在wide侧, 手工进行特征工程,需要专家经验。在本次测试中主要是用户行为和侯选集进行特征交叉。2)deep侧, 自动进行特征交叉。

  • PNN. PNN能够捕捉高阶的交叉特征,是BaseModel的升级版本。

  • DeepFM. 使用因子分解机替换Wide&Deep中的Wide部分,减少特征工程的工作量。

6.3 度量指标

AUC是常用的衡量广告和预测CTR之间的评估指标,包括用户内和用户间的排序。我们引入对用户内AUC加权的一种计算方式,这种方式更适合线上的广告系统,计算形式如下:
A U C = ∑ i = 1 n #  impression  i × A U C i ∑ i = 1 n #  impression  i (10) \mathrm{AUC}=\frac{\sum_{i=1}^{n} \# \text { impression }_{i} \times \mathrm{AUC}_{i}}{\sum_{i=1}^{n} \# \text { impression }_{i}}\tag{10} AUC=i=1n# impression ii=1n# impression i×AUCi(10)
其中, n n n表示用户的数量,KaTeX parse error: Expected '}', got '#' at position 7: \text{#̲impression} AUC i \text{AUC}_i AUCi分别表示曝光次数和用户 i i i 的AUC。

除此之外,我们引入相对AUC提升度计算指标 RelaImpr \text{RelaImpr} RelaImpr:
 RelaImpr  = (  AUC(measured model  ) − 0.5  AUC(base model)  − 0.5 − 1 ) × 100 % (11) \text { RelaImpr }=\left(\frac{\text { AUC(measured model })-0.5}{\text { AUC(base model) }-0.5}-1\right) \times 100 \% \tag{11}  RelaImpr =( AUC(base model) 0.5 AUC(measured model )0.51)×100%(11)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.4 基于Amazon Dataset 和 MovieLens Dataset模型效果对比

Table 3 基于两个数据集重复5次实验计算平均值。很显然,深度模型的效果优于机器学习的模型效果。PNN和DeepFM的模型效果好于Wide&Deep。DIN在所有模型中表现最好,这主要得益于设计局部激活单元结果,学习广告和用户行为之间的相关性。除此之外,设计数据自适应激活函数也带来模型效果的进一步提升。

6.5 正则化效果

Amazon Dataset 和 MovieLens Dataset特征维度不高(10万级别),所有的深度学习模型没有遇到严重的过拟合的情况。如果使用阿里巴巴数据级,特征的维度高达6亿,如果没有正则化处理,会存在严重的过拟合行为,导致模型效果迅速下降,如Fig.4中的绿线所示。基于这种原因,我们尝试以下几种正则化处理。

  • Dropout. 每个样本随机丢掉50%的特征。
  • Filter. 保留出现高频次的商品id, 大约2000万种。
  • Regularization in DiFacto. 模型参数与特征呢个出现的频次相关正则化方式。
  • MBA. Mini-Batch Aware regularization method

对于DiFacto和MBA 正则化参数 λ \lambda λ设置为0.01.

Fig.4和Table 4给出模型对比结果。相对于不使用商品id特征,使用细粒度的商品id特征在第一轮epoch之后,对模型效果带来较大的提升。但是,如果不使用正则化下处理,会带来过拟合情况。Dropout会减少过拟合,但是模型效果收敛过慢。频次过滤能够减少过拟合。DiFacto效果不如频次过滤。MBA的带来的模型效果最好。

除此之外,使用商品id训练的模型比没有使用商品id训练的模型效果好,这说明其包含丰富的信息。考虑这种情况,虽然频次过滤的效果比dropout好,但是它丢掉低频次商品id会导致信息损失。

6.6 基于阿里巴巴数据集模型效果的对比

在这里插入图片描述

如Table 5所示, LR模型效果弱于深度学习模型的效果,DIN模型是所有深度模型中,效果最好的。想对于BaseModel来说,AUC绝对值提升0.0059, 相对提升$6.08% $。这主要得益于设计局部激活单元结构、训练方式的改进。除此之外,正则化处理使得auc绝对值提升0.0031。Dice相对于PReLU提升0.0015。

使用MBA正则化和Dice相对于基础模型活得0.0113的绝对提升和 11.65 % 11.65\% 11.65%的相对提升。相对于DeepFM, AUC绝对提升0.009。阿里巴巴多达上亿的流量,0.001的AUC绝对值的提升带来巨大的价值。

6.7 线上A/B测试

使用2017-05到2017-06的数据进行测试,带来10%的CTR提升和3.8%RPM(Revenue
Per Mille)提升,目前服务于阿里的主要流量。

对于上亿用户访问的系统,特征是流量高峰期,每秒对超过100万用户提供服务,做到高吞吐、低延迟不是一件容易的事情。对每个用户来说,100广告推理时间小于10毫秒,在CPU-GPU框架下,我们采用几种方式加速计算:1)请求批处理,将来自CPU的请求进行合并,然后利用GPU处理。2)GPU内存优化,改善访问方式,减少GPU显存的交互。3)并发内核计算,利用多个CUDA内核进行矩阵计算。总之,经过这些优化,DIN对外提供服务时,每秒请求处理效率提升2倍。

6.8 DIN可视化

在这里插入图片描述

最后,我们利用阿里数据对DIN内部结构进行相关研究,测试局部激活单元的效果。Fig.5描述了用户行为和候选广告之间的关系。正如所料,用户行为和广告相关性是非常高的。

以前面提到的年轻妈妈为例,我们选择9类和每个类别100种商品广告给她。使用t-SNE聚类,Fig.6对DIN学习embedding向量的进行可视化,我们发现,基本上每个簇属于一个类别。Fig.6热力图展示这位母亲对候选广告的兴趣大小。

7 结论

为了解决传统固定长度向量不能表征多样的用户新区,提升模型的表达能力,我们设计一种能够根据广告动态捕捉用户兴趣的DIN模型。除此之外,设计两种训练技巧,用于提升DIN的表现能力。DIN模型已经应用于阿里巴巴广告系统中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值