阿里妈妈2018的DIN & DIEN

本文深入解析了DIN和DIEN模型在用户行为序列建模中的应用,包括Attention机制、自适应正则化、Dice函数、GAUC评估、RNN编码、附加损失函数等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DIN来龙去脉

背景知识:用户画像+用户行为+Item特征+上下文特征,这4者(也可是3者)作为输入信息,将原有的高维稀疏0/1特征做成embedding向量,每组特征由1个或多个向量pooling得到1个向量,最后所有组特征concatenate起来,作为神经网络的input;

一. DIN:(用户行为item和候选item的向量相似度做权重(attention),把所有行为item加和起来,得到行为序列向量)

A. Attention:

引入attention机制,对user侧的特征进行了“选择性pooling",把和当前这个广告相关的信息加强了出来;(这里用的attention不是简单的内积,而是一个小网络)

以前user的一组行为,是平等对待的(同等权重地pooling; 也可以把时间权重加上,越新的权重越大);现在把user每个行为和广告特征计算相关性(其实就是2个向量的内积),作为该行为的权重,该user所有行为加权加和得到最终行为特征向量;

体现了“局部激活”:用户点击了这个广告,和他之前的某些点击行为有关,而不是所有;

体现了“多样性”:用户对广告A感兴趣,和之前的某些行为有关;用户对广告B感兴趣,和之前的另一些行为有关;

每个ad会有good_id, shop_id, category_id三层属性,shop_id只跟用户历史中的shop_id序列发生作用,good_id只跟用户的good_id序列发生作用,...; 其实就是把3个embedding进行concatenate,得到一个item向量;注意:用户行为序列里,是最近点击过的商品(不是广告!),候选广告是用他对应商品的id做特征的;

对以下3点微创新讲的很清楚的文章

B. 自适应正则:输入embedding层是高维稀疏的,如果不进行正则,第1个epoch后效果就大幅下降;传统L2正则用在高维稀疏embedding输入上,会带来巨大的计算量(每个mini-batch只有几百个embedding有效,而L2正则会一股脑更新所有这几百万个embedding); 解决:本mini-batch里出现过的embedding,进行L2正则更新,没出现就不更新;

C. Dice函数:PRelu在LeakyRelu基础上,让x负半轴的参数\alpha变成了可学习的;观察到每一层网络的输入值分布都是不同的,Dice在PRelu的基础上,把0作为分割点改成了把均值点作为分割点, 并进行了平滑;(类比google的Swish函数?)

D. GAUC:  AUC衡量的是样本间的排序能力。CRT预估是二分类问题,输出是该样本被点击的概率。不同用户之前的排序顺序可能不重要,而全局AUC会考虑这个,所以有时候会不准。GAUC对每个用户求一个AUC,然后加权平均起来,权重可以是该用户的总点击数。   (传统AUC是Area-Uner-Curve, 是ROC曲线形成的包络面积,横轴是FPR, 纵轴是TPR;TPR=TP/(TP+FN), FPR=FP/(FP+TN))

 

二. DIEN: (用RNN编码用户行为序列;附加损失函数,用上一时刻的隐状态预测下一时刻的行为;用Attention得到的"权重"去控制当前时刻的输入有多大程度更新(update-gate)到后面的RNN里面去)

DIEN论文中文翻译

DIEN的论文解读

两大思想:

1. latent interest: 用户行为序列是observation, 用户的兴趣是隐变量;

2. interest evolving: 用户的兴趣是在不断变化的;

Base model: 输入是<用户行为,用户画像,ad特征,上下文特征>四大类特征,每大类有多组特征,每组特征由multi-hot编码;embedding+pooling; MLP; softmax层2个类别输出;log-likelihood损失函数;(log-likelihood是极大似然函数的负对数形式;和交叉熵损失函数一模一样,也可以理解成交叉熵损失函数)

Base model的缺点:

1. 直接采用行为们的pooling作为兴趣的做法,忽略了行为时间序列内部的依赖关系;Insight:(1)在电商平台中,用户行为是兴趣的载体,且是以时间而产生的序列数据,其间存在的依赖、次序隐藏着用户喜好。(2)当前时刻的兴趣直接导致了下一行为的产生

2. 忽略了兴趣的变化。Insight: (1)用户的兴趣呈现序列变迁的趋势,即随外在环境和内在认知的变化而变化。(2)DIN的启示:淘宝平台中,用户的兴趣是丰富多样的,但能够影响用户行为的仅仅是与目标商品相关的兴趣(attention)。(3)AGRU的启示:用带attention机制的GRU对序列行为建模。

DIEN网络做出的改进:

1. 其他3大类特征不变,仅对用户行为这类特征进行序列建模;

2. 第一层使用GRU单元解决时间序列的梯度消散问题;(且比LSTM速度快)

3. 第一层t时刻的输出h[t](兴趣)和下一时刻的输入e[t+1](行为), 设计附加损失函数,用negative-sampling,负例的选择:或是从用户未交互过的商品中随机抽取,或是从已展示给用户但用户没有点击的商品中随机抽取。h和e度量相似度,监督信息是0或1,使用负对数似然损失函数(别名是交叉熵损失函数)

4. 第二层使用attention,将上一层得到的兴趣h和ad特征进行相似度度量,然后经过softmax得到本次行为序列里每个兴趣和该ad的相似概率(每个兴趣计算hWe,这些数值经过softmax得到概率们);AUGRU单元:把attention作为update-gate的一个因素,从而影响“当前兴趣”和“记忆兴趣”之间的取舍程度;

效果提升:在阿里在线商品广告推荐大数据集上,AUC做指标:Base model和Deep&wide基本一样;DIN提升了0.65个百分点;只用2层GRU单元提升了1个百分点;DIEN去掉附加loss函数提升了1.3个百分点;DIEN提升了1.9个百分点;

DIEN对效果提升的总结:

1.引入RNN对用户行为序列建模;

2.对序列里的中间兴趣和下一时刻的输入行为,进行了相关度建模(附加损失函数);

3.用每时刻的兴趣和该ad特征进行了相关性概率计算,作为下一层GRU单元的一个输入,影响“当前兴趣”和“记忆兴趣”之间的取舍程度;

 

感想:

人家阿里的人,意识到用户的兴趣只和一部分用户行为有关,和当前商品相关度大的那些行为会构成用户的兴趣,于是就把attention加入了进来,于是有了DIN;

人家阿里的人,意识到用户的行为是一个时间序列,时间序列建模当然用RNN最好,再用上DIN的attention,于是就有了DIEN;

### 深度兴趣演化网络(DIEN)模型概述 深度兴趣演化网络(Deep Interest Evolution Network, DIEN)是一种专门用于提升点击率(CTR)预测性能的深度学习模型。该模型的核心在于捕捉用户的动态兴趣变化并对其进行建模,从而更精准地预测用户的行为倾向。 #### 1. **DIEN 的背景与动机** 在推荐系统领域,传统的 CTR 预测方法通常基于静态特征表示,无法有效应对用户兴趣随时间演化的复杂性。DIEN 提出了两个关键模块&mdash;&mdash;**兴趣提取层(Interest Extractor Layer)** 和 **兴趣演化层(Interest Evolving Layer)** 来解决这一问题[^2]。这些模块能够更好地捕获用户的历史行为序列中的短期和长期兴趣,并通过 GRU 结构进一步增强对目标项目的关注。 --- #### 2. **DIEN 架构详解** ##### (1)输入层 DIEN 的输入主要由两部分组成: - 用户历史行为序列 $ \{h_1, h_2, ..., h_n\} $ 表示用户过去的交互记录。 - 当前候选物品 $ x_t $ 是待评估的目标商品或广告。 ##### (2)兴趣提取层 兴趣提取层利用带有时序关系的兴趣抽取器来生成用户兴趣向量集合。具体来说,此阶段采用了一个改进版的 GRU 单元,称为 **AUGRU(Attention-based Update Gate Recurrent Unit)**,它可以自适应调整隐藏状态更新的程度,使得模型更加专注于那些与当前目标高度相关的兴趣点[^4]。 ##### (3)兴趣演化层 为了模拟用户兴趣的变化轨迹,DIEN 设计了兴趣演化层。在此过程中引入了一种特殊的注意机制,即 **辅助损失函数驱动的注意力计算方式**,这不仅提高了模型对于重要事件的关注能力,还减少了无关噪声带来的干扰影响[^5]。 最终输出经过全连接神经网络映射至概率空间完成二分类任务。 --- ### Python 实现代码片段 以下是基于 TensorFlow/Keras 的简化版本实现: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Dense, Embedding, Concatenate, Dropout from tensorflow.keras.models import Model from tensorflow.keras.regularizers import l2 def AUGRU(units): &quot;&quot;&quot;定义 Attention-based Update Gate Recurrent Unit&quot;&quot;&quot; def __call__(self, inputs, states, attention_score=None): xt = inputs ht_minus_1 = states[0] zt = tf.sigmoid(tf.matmul(xt, self.Wz) + tf.matmul(ht_minus_1, self.Uz)) rt = tf.sigmoid(tf.matmul(xt, self.Wr) + tf.matmul(ht_minus_1, self.Ur)) candidate_ht = tf.tanh( tf.matmul(xt, self.Wh) + tf.multiply(rt, tf.matmul(ht_minus_1, self.Uh)) * attention_score[:, None] ) ht = (1 - zt) * ht_minus_1 + zt * candidate_ht return ht, [ht] class DIEN(Model): def __init__(self, num_users, num_items, embedding_dim=64, hidden_units=128): super(DIEN, self).__init__() self.user_embedding = Embedding(num_users, embedding_dim) self.item_embedding = Embedding(num_items, embedding_dim) self.gru_layer = tf.keras.layers.GRU(hidden_units, return_sequences=True) self.augru_layer = AUGRU(hidden_units) self.dense_output = Dense(1, activation=&#39;sigmoid&#39;) def call(self, inputs): user_ids, item_seq, target_item = inputs # 嵌入操作 seq_embeddings = self.item_embedding(item_seq) target_emb = self.item_embedding(target_item) # 兴趣提取层 gru_out = self.gru_layer(seq_embeddings) # 计算注意力分数 att_scores = tf.nn.softmax(tf.reduce_sum(gru_out * target_emb[:,None,:], axis=-1), axis=1) # 利用 AUGRU 更新状态 augru_outputs = [] state = tf.zeros_like(gru_out[:,0]) for t in range(gru_out.shape[1]): output, state = self.augru_layer(gru_out[:,t:t+1], initial_state=[state], attention_score=att_scores[:,t]) augru_outputs.append(output) final_interests = tf.concat(augru_outputs, axis=1) # 输出层 concat_input = Concatenate()([final_interests[:,-1], target_emb]) logits = self.dense_output(concat_input) return logits ``` 上述代码展示了如何构建一个基础框架下的 DIEN 模型结构,其中包含了 AUGRU 层的设计思路以及整体流程逻辑[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值