阿里巴巴在CTR预估领域有3篇比较有名的文章。

2017年的深度兴趣网络, DIN(DeepInterestNetwork)。

2018年的深度兴趣演化网络, DIEN(DeepInterestEvolutionNetWork)。

2019年的深度会话兴趣网络, DSIN(DeepSessionInterestNetWork)。

这3篇文章的主要思想和相互关系用一句话分别概括如下:

第1篇DIN说,用户的行为日志中只有一部分和当前候选广告有关。可以利用Attention机制从用户行为日志中建模出和当前候选广告相关的用户兴趣表示。我们试过涨点了嘻嘻嘻。

第2篇DIEN说,用户最近的行为可能比较远的行为更加重要。可以用循环神经网络GRU建模用户兴趣随时间的演化。我们试过也涨点了嘿嘿嘿。

第3篇DSIN说,用户在同一次会话中的行为高度相关,在不同会话间的行为则相对独立。可以把用户行为日志按照时间间隔分割成会话并用SelfAttention机制建模它们之间的相互作用。我们试过又涨点了哈哈哈。

参考材料:

  • DIN论文:https://arxiv.org/pdf/1706.06978.pdf

  • 推荐系统中的注意力机制:https://zhuanlan.zhihu.com/p/51623339

  • 阿里经典兴趣网络:https://zhuanlan.zhihu.com/p/429433768

  • 从DIN到DIEN看阿里CTR算法的进化脉络:https://zhuanlan.zhihu.com/p/78365283

  • DIN+DIEN,机器学习唯一指定涨点技Attention:https://zhuanlan.zhihu.com/p/431131396

  • Attention机制简单总结:https://zhuanlan.zhihu.com/p/46313756

  • 代码实现参考:https://github.com/GitHub-HongweiZhang/prediction-flow

本篇文章我们主要介绍DIN,下一篇文章我们介绍DIEN。

公众号后台回复关键词:DIN,获取本文源代码和数据集下载链接。

〇,Attention原理概述

众所周知,Attention机制在深度学习领域是非常通用的涨分技巧。其主要作用是提升模型的自适应能力。

Attention机制的一些常用功能和典型范例总结如下:

  • 1,动态特征选择,根据样本不同动态地赋予特征以不同的权重,典型范例如SENet中的SEAttention,DIN中的Attention.

  • 2,动态特征交互,动态地构建特征之间的交互强弱关系,提取高阶特征。典型范例如Transformer中的的Attention。

  • 3,动态模块集成,类似多模型融合集成,但是不同子模块的权重是动态的。典型范例如MOE中的门控注意力机制。

在许多Attention机制的应用场景中,输入分成Query(Q)和Key(K)。Query是当前关注项的Embedding向量,Key是待和当前关注项进行匹配的Embedding向量。

例如在广告CTR领域,Query就是当前待预估的广告,Key就是用户历史上点击过的广告,通过Attention机制建立当前待预估的广告和用户历史上点击过的广告的相关性强弱。

又比如在NLP翻译领域,Query就是当前正在解码的译文单词词向量,Key就是原文单词序列的词向量,通过Attention机制可以建立译文单词和原文单词的对应关系。

Attention机制的核心实现是计算注意力权重,一些的常用实现形式如下:

1,多层感知机方法

先将Query和Key进行拼接,然后接一个多层感知机。

这种方法不需要Query和Key的向量长度相等,Query和Key之间的交互方式是通过学习获得的。

2,Bilinear方法

通过一个权重矩阵直接建立Query和Key的关系映射,计算速度较快,但是需要Query和Key的向量长度相同。

3,Scaled-Dot Product

这种方式直接求Query和Key的内积相似度,没有需要学习的参数,计算速度极快,需要Query和Key的向量长度相同。考虑到随着向量维度的增加,最后得到的权重也会增加,对其进行scaling。

402 Payment Required

一,DIN原理解析

阿里的展示广告系统主要用到了如下4类特征

  • (1) 用户画像特征。

  • (2) 用户行为特征,即用户点击过的商品。

  • (3) 待曝光的广告特征,广告其实也是商品。

  • (4) 上下文特征。

DIN、DIEN和DSIN主要聚焦在对用户行为日志的建模。

用户行为日志反应的是用户的兴趣,如何从行为日志中建模出一个好的用户兴趣的表示?

最基础的建模方法是 Embedding+SumPooling. 把用户的过去所有点击行为做Embedding, 然后求和。

这个SumPooling的实现不要太简单。

import torch
import torch.nn as nnclass SumPooling(nn.Module):def __init__(self, dim):super(SumPooling, self).__init__()self.dim = dimdef forward(self, x):return torch.sum(x, self.dim)

这种建模方式存在着一个巨大的缺陷,那就是用户的兴趣表示是确定的,和候选广告无关。

不管来个啥候选广告,用户过去的所有行为日志全部一把梭哈丢进去求和。

很显然,如果我们如果建模出和候选广告相关的用户兴趣表示,效果应该会好很多。

那么,如何做到这一点呢?我们可以用候选广告来和用户历史行为日志求相关性,用相关性对历史行为日志做加权。

这是很自然的,我们主要聚焦(Attention)用户历史行为日志中那些和候选广告相关的部分。

于是,duang的一下,DIN模型的模型架构就出来了。

这里注意力机制比较值得玩味,它是一种mlp形式的注意力结构,但在输入端不是简单地拼接了和,而是将都一起打包拼接了,这样模型更加容易学习Q和K之间的相似性关系。

此外,这里用mask技巧将keys中填充的的部分的注意力赋值为0,以及维度变换等一些实现上的细节,也是很值得揣摩的。

import torch
from torch import nn class MLP(nn.Module):def __init__(self, input_size, hidden_layers,dropout=0.0, batchnorm=True):super(MLP, self).__init__()modules = OrderedDict()previous_size = input_sizefor index, hidden_layer in enumerate(hidden_layers):modules[f"dense{index}"] = nn.Linear(previous_size, hidden_layer)if batchnorm:modules[f"batchnorm{index}"] = nn.BatchNorm1d(hidden_layer)modules[f"activation{index}"] = nn.PReLU() if dropout:modules[f"dropout{index}"] = nn.Dropout(dropout)previous_size = hidden_layerself.mlp = nn.Sequential(modules)def forward(self, x):return self.mlp(x)class Attention(nn.Module):def __init__(self,input_size,hidden_layers,dropout=0.0,batchnorm=True,return_scores=False):super().__init__()self.return_scores = return_scoresself.mlp = MLP(input_size=input_size * 4,hidden_layers=hidden_layers,dropout=dropout,batchnorm=batchnorm,activation=activation)self.fc = nn.Linear(hidden_layers[-1], 1)def forward(self, query, keys, keys_length):"""Parameters----------query: 2D tensor, [Batch, Hidden]keys: 3D tensor, [Batch, Time, Hidden]keys_length: 1D tensor, [Batch]Returns-------outputs: 2D tensor, [Batch, Hidden]"""batch_size, max_length, dim = keys.size()query = query.unsqueeze(1).expand(-1, max_length, -1)din_all = torch.cat([query, keys, query - keys, query * keys], dim=-1)din_all = din_all.view(batch_size * max_length, -1)outputs = self.mlp(din_all)outputs = self.fc(outputs).view(batch_size, max_length)  # [B, T]# Scaleoutputs = outputs / (dim ** 0.5)# Maskmask = (torch.arange(max_length, device=keys_length.device).repeat(batch_size, 1) < keys_length.view(-1, 1))outputs[~mask] = -np.inf# Activationoutputs = torch.sigmoid(outputs)  # [B, T]if not self.return_scores:# Weighted sumoutputs = torch.matmul(outputs.unsqueeze(1), keys).squeeze()  # [B, H]return outputs

我们期待的效果是这样的,和候选广告(query)越相关的用户历史浏览记录(keys),其注意力权重值越高

100分钟吃掉DIN深度兴趣网络相关推荐

  1. 深度学习 - 46.DIN 深度兴趣网络

    目录 一.引言 二.摘要 ABSTRACT 三.介绍 INTRODUCTION 1.CTR 在广告系统的作用 2.传统 MLP 存在的问题 3.DIN 的改进 四.近期工作 RELATEDWORK 1 ...

  2. 【序列建模】DIN深度兴趣网络

    [序列建模]DIN深度兴趣网络 通过用户的历史行为序列刻画用户兴趣的广泛性,是推荐系统比较大的一个难点,用户历史行为序列建模的研究经历了从Pooling.RNN到attention.capsule再到 ...

  3. [论文阅读]阿里DIN深度兴趣网络之总体解读

    [论文阅读]阿里DIN深度兴趣网络之总体解读 文章目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词 ...

  4. 120分钟吃掉DIEN深度兴趣演化网络

    阿里妈妈在CTR预估领域有3篇比较有名的文章. 2017年的深度兴趣网络, DIN(DeepInterestNetwork). 2018年的深度兴趣演化网络, DIEN(DeepInterestEvo ...

  5. 阿里DIN模型(深度兴趣网络)详解及理解

    这里写目录标题 目标: 模型产生原因: 核心思想: 模型介绍: Base model 改进模型 模型算法设计 论文的算法改进 参考资料 目标: 掌握2017年阿里提出的深度兴趣网络(Deep Inte ...

  6. 推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)

    推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR ...

  7. din算法 代码_深度兴趣网络(DIN,Deep Interest Network)

    1. DIN介绍 Deep Interest Network是基于BaseModel演化而来 1.1 流程: 整个流程可以描述为:1.检查用户历史行为数据 2.使用matching module产生候 ...

  8. DIN:使用Attention挖掘历史数据的深度兴趣网络

    DIN要解决的问题 DIN(Deep Interest Network)是阿里巴巴用于解决工业级CTR预估问题的预测模型,论文收录于KDD 2018.这篇论文的主要贡献有三点:提出了DIN模型:提出了 ...

  9. 【王喆-推荐系统】模型篇-(task8)深度兴趣网络 DIN

    学习总结 DIN基于注意力机制,利用激活单元计算出用户对于不同历史商品的注意力权重,针对当前广告商品,作出更有针对性的预测.该激活单元将历史行为商品的 Embedding和候选广告商品的 Embedd ...

最新文章

  1. 台式计算机,笔记本电脑如何查看自己的电池损耗情况!
  2. Android之如何卸载指定的 应用程序
  3. 使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
  4. linux下面的navicat中文出现白色方块
  5. DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )
  6. sqlite3使用简介(内含解决sqlite内存的方法)
  7. 剑指Offer值数字在排序数组中出现的次数
  8. 实训|第七天横扫Linux磁盘分区、软件安装障碍附制作软件仓库
  9. 开课吧:C++STL常用remove算法有哪些?
  10. EXCEL单元格内的姓名对齐
  11. WIN10_cmd命令提示符更换用户启动
  12. cad怎么去除drawing1_CAD工具栏下边那行显示DraWing1的没了,如何找回?
  13. springboot绑定邮箱激活发邮件
  14. 免费的中文深度学习全书:《深度学习理论与实战:提高篇》
  15. 网站源码、模板分享(前端)
  16. 三种商业模式B2C、B2B、C2C
  17. 异常收集 ----雨之殇
  18. FFB6D A Full Flow Bidirectional Fusion Network for 6D Pose EstimationFFB6D 6D 姿势估计的全流双向融合网络
  19. 京东 API接口:item_search - 按关键字搜索商品
  20. vue3+ts+ant-table横向表格数据实现对单元格过滤之后的数据进行标红

热门文章

  1. 笔记_Maya绑定基础_创建一段骨骼
  2. 网赚真的会有市场吗?
  3. tinyproxy http代理服务
  4. Kubernetes + 焱融 SaaS 数据服务平台,个性化需求支持就没输过
  5. 名词/形容词/形容动词/动词的简体及敬体变形
  6. 学习Java的最佳方法
  7. 北京朝阳区电子眼查询
  8. ubuntu中使用Playonlinux安装exe程序——以安装爱奇异为例。
  9. 三大通信运营商的资费套餐对比分析
  10. 浏览器的渲染流程详解