深度学习系列:阿里DIN模型的原理和代码实现

一、前言

今天介绍阿里巴巴的DIN网络,不得不说,阿里妈妈的大佬是真的多,经常都会更新非常多的创造性的东西,比如DIN中使用的自适应正则化技术以及Dice激活函数以及注意力机制的使用,并且值得注意的是DIN网络中使用的注意力机制还挺多的,哈哈哈,下面就来介绍一下阿里妈妈推荐部门大佬们的主要工作吧;

论文地址:https://arxiv.org/abs/1706.06978

代码地址:https://github.com/zhougr1993/DeepInterestNetwork

二、算法原理

(1)深度兴趣网络主要考虑到用户兴趣的变化性,用户当前的兴趣可能只和历史信息中的一部分有关,并且考虑了用户兴趣的广泛性,比如一位用户浏览了运动类食品类书籍类的物品,那么这几类之间的关系就不是很大了,为了解决这类似的问题就提出了DIN网络;

(2)下图介绍了阿里推荐的流程:采集用户历史行为信息;通过matching获得候选广告;排序ranking得到每个广告的概率进行排序;记录用户在当前广告下点击与否作为标签;

模型的整体框架如下:先看一个basemodel吧,basemodel就是将用户特征,进行sum pooling输入给全连接层,和sigmoid函数得到一个输出的结果;

阿里巴巴的模型则是,利用注意力机制对用户的兴趣进行进行一个加权最后再使用一个sum pooling;

其中,va代表的是候选广告的嵌入向量,ej是用户历史中的兴趣;通过注意力机制来表示用户对于不同历史信息中的关注的重点部分;

 

(3)采用的特征:包括用户信息,用户行为信息,商品信息等等;其中包含了很多多值离散特征,多值离散特征就下一篇文章介绍一下怎处理吧;

(4)Dice函数(Data Adaptive Activation Function)是根据Pleakyrelu激活函数演化而来的,它的分割点不是严格的零点,而是根据数据来进行变化的,两者图像如下图所示;

    Dice函数的公式如下所示,其中sigmoid函数中e的指数其实就是批量归一化算法;

(5)自适应正则:在实际的用户数据中,会出现部分用户feature id出现频率很高从而导致噪声的增加,这对训练的结果也是有很大影响的,所以自适应正则的目的就是解决这个问题,方法就是根据用户feature id的出现频次来决定正则化的强度;

根据论文中的公式:公式(4)代表L2正则化,其中D代表embedding的维度,K代表整个特征空间数量,I代表是否x中有特征id j,n_{j}代表特征id j出现的频次;如果n_{j}越小那么正则权重就越大,相应的就达到了将正则强度加大的目的,如果n_{j}越小那么结果则反之,随后的表示则如图中所示;

(6)测试指标:如下是推荐系统中常用的评价指标,

改进后的评价指标公式如下图所示,

经过测试可以得知,第二种评价指标更符合要求一点;

三、算法效果

论文比较了在不同数据集上模型的表现,模型的测试结果如下图所示;

四、代码实现

代码实现部分,只实现了dice函数和注意力机制的部分;

(1)Dice函数实现部分,代码严格按照论文中公式实现;

import tensorflow as tf
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.initializers import Zeros
from tensorflow.python.keras.layers import Layer, BatchNormalization
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, inputs_shape, **kwargs):
        self.bn = BatchNormalization(self.axis, self.epsilon)
        self.alphas = self.add_weight(name='dice_bias', shape=(inputs_shape[-1], ), initializer=Zeros(), dtype=tf.float32)
        super(Dice, self).build(inputs_shape)
        
    def call(self, inputs, **kwargs):
        bn_inputs = self.bn(inputs)
        p = tf.sigmoid(bn_inputs)
        return self.alphas * (1 - p) * inputs + p * inputs

(2)如下是din中attention部分

import tensorflow as tf
from tensorflow.python.keras import backend as K

class din_att(Layer):
    def __init__(self, **kwargs):
        super(din_att, self).__init__(**kwargs)
    
    def call(self, inputs, **kwargs):
        query, keys, keys_len= inputs#(batch, 1, embed_size), (batch, T, embed_size), (batch)中的值其实是T;
        keys_len = keys.get_shape()[1]
        
        querys = K.repeat_elements(query, keys_len, axis=1)
        #din中原始代码的实现方法;
        atten_input = tf.concat([querys, keys, querys - keys, querys * keys], axis=-1)#(batch, T, 4 * embed_size)
        #经过三层全连接层;
        dnn1 = tf.layers.dense(atten_input, 80, activation=tf.nn.sigmoid, name='dnn1')
        dnn2 = tf.layers.dense(dnn1, 40, activation=tf.nn.sigmoid, name='dnn2')
        dnn3 = tf.layers.dense(dnn2, 1, activation=None, name='dnn3')#(batch, T, 1)
        
        outputs = tf.transpose(dnn3, (0, 2, 1))#(batch, 1, T)
        
        #mask
        keys_mask = tf.sequence_mask(keys_len, tf.shape(keys)[1])#(batch, T), bool;
        keys_mask = tf.expand_dims(keys_mask, axis=1)#(batch, 1, T)
        padding = tf.ones_like(outputs) * (-2 ** 32 + 1)#(batch, 1, T)
        outputs = tf.where(keys_mask, outputs, padding)#the position of padding is set as a small num;
        
        #scale
        outputs = outputs / (tf.shape(keys)[-1] ** 0.5)
        outputs = tf.nn.softmax(outputs)#(batch, 1, T)
        
        #weighted sum_pooling
        outputs = tf.matmul(outputs, keys) #(batch, 1, embedding)
        return outputs

 

<think>好的,我现在要解答用户关于深度兴趣网络(DIN模型的工作原理及其主要特性的问题。首先,我需要回顾一下自己之前对DIN模型的了解,并结合提供的参考文献来确保回答的准确性。 用户提供的引用资料提到了DIN模型主要用于点击率预测(CTR),特别是在电商场景中处理用户兴趣的多样性动态变化。核心是注意力机制,用来捕捉用户历史行为与当前候选商品的相关性。引用[2][4]都提到了基准模型是Embedding&MLP结构,DIN在此基础上加入了注意力网络,动态学习用户兴趣。引用[1][3]则补充了特征表示线上应用的信息。 接下来,我需要整理DIN的工作原理。首先,用户的特征通常包括历史行为,比如点击过的商品。DIN模型需要将这些行为与当前候选商品关联起来,这里用到了注意力机制。注意力机制会计算每个历史行为与当前商品的相关性权重,加权求后得到用户的兴趣表示。这个表示再与其他特征(如用户画像、上下文)结合,输入到MLP中进行预测。 关键特点方面,注意力机制是核心,能够动态捕捉兴趣,而不是静态的池化操作。此外,参考文献提到DIN针对用户兴趣的多样性,不同商品激活不同的历史行为,这也是其创新点。另外,引用[4]指出DIN在基准模型基础上添加注意力网络,这说明其结构上的改进。 还需要考虑DIN的具体实现细节。比如,如何计算注意力分数?可能使用候选商品历史行为的嵌入向量之间的交互,比如点积或神经网络。引用[2]提到阿里巴巴的Python实现,可能需要代码示例来说明注意力机制的结构。 另外,用户可能对DIN的优势应用场景感兴趣。根据引用[2],电商场景中的CTR预测,特别是处理用户动态兴趣,是DIN的主要应用。而传统模型可能无法有效处理这种动态变化,DIN通过注意力机制解决了这一问题。 需要注意的问题:确保对注意力机制的解释准确,区分DIN与其他模型(如DIN的变种DIEN)的不同之处。同时,正确引用文献中的内容,比如基准模型的结构DIN的改进点。 总结回答结构: 1. DIN模型的应用背景目标。 2. 工作原理分步骤说明:特征处理、注意力机制、兴趣表示、预测。 3. 关键特点:动态兴趣捕捉、注意力机制、针对多样性设计。 4. 可能的代码示例(如注意力层的实现)。 5. 引用文献支持各部分内容。 现在需要验证各部分是否符合参考文献的内容。例如,引用[4]提到基准模型是Embedding&MLP,DIN添加注意力网络,这与工作原理部分一致。引用[2]强调动态捕捉兴趣,符合关键特点中的描述。确保所有引用标注正确,例如在提到注意力机制时引用[2],在基准模型时引用[4]。 最后,生成相关问题,可能需要围绕DIN的优化、应用场景、与其他模型的对比等方面提问,确保问题与用户的问题相关,并基于提供的引用内容。</think>### 深度兴趣网络(DIN模型工作原理及关键特点 #### 1. **工作原理** DIN模型的核心是通过**注意力机制**动态捕捉用户历史行为与当前候选商品的相关性,从而建模用户兴趣的多样性与动态变化。具体流程如下: 1. **特征表示** 用户特征(如历史行为序列、画像属性)商品特征(如候选广告属性)均通过嵌入(Embedding)层转换为低维稠密向量[^1]。例如,用户的历史行为序列包含多个商品嵌入向量:$\\{e_1, e_2, ..., e_T\\}$,候选广告的嵌入向量为$e_a$。 2. **注意力机制计算** 对每个历史行为$e_i$与候选广告$e_a$计算相关性权重$\alpha_i$: $$ \alpha_i = \text{Softmax}(f(e_i, e_a)) $$ 其中,$f$是一个可学习的函数(如全连接网络或点积),用于衡量两者的相关性[^2]。 3. **动态兴趣表示** 加权求历史行为嵌入,生成用户兴趣向量$v_u$: $$ v_u = \sum_{i=1}^T \alpha_i e_i $$ 这一步骤使模型能够**动态聚焦**与当前广告最相关的历史行为[^4]。 4. **预测层** 将用户兴趣向量$v_u$、候选广告向量$e_a$及其他特征(如上下文信息)拼接后输入多层感知机(MLP),输出点击率预测结果: $$ \hat{y} = \sigma(\text{MLP}([v_u; e_a; \text{其他特征}])) $$ #### 2. **关键特点** - **动态兴趣捕捉**:通过注意力机制,DIN能够针对不同候选广告自适应调整用户兴趣表示,避免传统静态池化(如平均池化)的信息损失。 - **处理兴趣多样性**:用户历史行为可能涉及多个兴趣领域,DIN通过注意力权重区分不同行为的重要性,增强模型表达能力[^3]。 - **小批量敏感正则化**:为缓解高维稀疏特征中的过拟合问题,DIN引入了**Dice激活函数****自适应正则化技术**,提升模型泛化能力。 #### 3. **代码示例(注意力机制简化实现)** ```python import torch import torch.nn as nn class AttentionLayer(nn.Module): def __init__(self, embed_dim): super().__init__() self.linear = nn.Linear(embed_dim * 2, 1) # 计算相关性得分 def forward(self, candidate_emb, history_embs): # candidate_emb: (batch_size, embed_dim) # history_embs: (batch_size, seq_len, embed_dim) batch_size, seq_len, _ = history_embs.shape candidate_expanded = candidate_emb.unsqueeze(1).expand(-1, seq_len, -1) # 扩展为(batch_size, seq_len, embed_dim) combined = torch.cat([candidate_expanded, history_embs], dim=-1) # (batch_size, seq_len, 2*embed_dim) scores = self.linear(combined).squeeze(-1) # (batch_size, seq_len) weights = torch.softmax(scores, dim=1) # 注意力权重 weighted_sum = torch.sum(weights.unsqueeze(-1) * history_embs, dim=1) # (batch_size, embed_dim) return weighted_sum ``` #### 4. **应用场景** DIN广泛应用于**电商推荐**与**广告点击率预测**场景,尤其适用于用户行为丰富、兴趣多样的场景,例如: - 根据用户浏览历史推荐相关商品。 - 动态调整广告展示策略以提升转化率。 --- §§ 相关问题 §§ 1. DIN模型中的注意力机制与传统池化方法相比有哪些优势? 2. 如何解决DIN模型训练中的过拟合问题? 3. DIN模型与后续的DIEN模型有何改进与区别? 4. 在特征工程中,DIN模型如何处理长序列用户行为数据? : 特征表示 : 阿里巴巴DIN模型原理与Python实现 [^3]: 阿里兴趣网络DIN网络中几个关键的点(三) : 深度推荐模型-DIN
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值