1,前言

AFM(Attentional Factorization Machines):FM模型的增强变体,这个其实算是NFM的一个延伸,在NFM模型的特征交叉层与池化层中间加了一个注意力网络,对于低阶交互特征,根据其对预测结果的影响程度不同加上了注意力权重,以更加符合实际的推荐场景。
DIN(Deep Interest Network):阿里的知名推荐模型,这个模型是基于业务观察的模型的改进,相较于学术派的深度模型,这个模型更加有业务气息。

大纲如下:

  • AFM模型

    • 模型解决了什么问题?
    • 模型的创新点在哪里?
    • 模型是如何如何实现的?(模型结构,数学原理,代码实现)
  • DIN模型
    • 模型解决了什么问题?
    • 模型的创新点在哪里?
    • AFM模型是如何如何实现的?(模型结构,数学原理,代码实现)

2,AFM模型

AFM模型是2017年由浙江大学和新加坡国立大学研究员提出的一个模型。

2.1,模型解决了什么问题?

NFM中,不同特征域的特征embedding向量经过特征交叉池化层的交叉,将各个交叉特征向量进行“加和”,然后后面跟一个DNN网络。这里的加和池化,相当于“一视同仁”的对待所有交叉特征,没有考虑不同特征对结果的影响程度,作者认为,由于不是所有的交互特征都能对最后的预测起作用,因此这种一视同仁的加和池化,可能会影响最后的预测效果。
AFM模型是为了解决这个问题而提出来的。

2.2,模型的创新点在哪里?

AFM模型与NFM模型结构非常相似,但是在NFM的基础上,引入了注意力机制,来学习不同交叉特征对最终结果的不同影响程度。从而使得模型更加符合真实的业务场景。

2.3,AFM模型是如何如何实现的?(模型结构,数学原理,代码实现)


AFM模型是通过在特征交叉层和最终的输出层之间加入注意力网络来引入注意力机制。

2.3.1 Input 和 embedding 层

这里与NFM模型一样,上图中为了简单,把连续型的特征给省去了,输入的是稀疏特征。并且只画了非0的稀疏特征值进入embedding层,得到相应稀疏特征的embedding向量。实际中,每一个稀疏特征值,都会有一个对应的embedding向量的,只不过为0的稀疏特征值,对应的embedding向量也是0罢了。如果一共有n个稀疏特征向量,embeding层应该有n个embeding向量,下面的pair-wise interaction Layer应该有n*(n-1)个交叉特征对。

2.3.2 pair-wise interaction Layer

这里与NFM一样,每对embedding 向量进行各个元素对应相乘(element-wise product),公式如下:

KaTeX parse error: Unexpected end of input in a macro argument, expected '}' at end of input: \dot表示对应元素相乘。Rx={(i,j)}i∈X,j∈X,j>iR_{x} = \left \{ (i,j) \right \}_{i\in X,j\in X,j>i}Rx={(i,j)}iX,jX,j>i,这里的XXX是非零特征经过embedding层之后得到的embedding集合。若有m个特征向量的话,会有m*(m-1)/2 个交叉向量。也就是pair-wise interaction Layer会产生m*(m-1)/2个交叉向量,每个交叉向量,都是两个特征的embeding向量对应元素相乘得到的向量值,维度是K,K代表每个向量经过embedng后的维度。
注意:
NFM中,两两特征的embeding交叉完毕之后,会直接进行求和的操作,根据之前FM的化简公式,NFM中可以借鉴FM的化简公式,只需要一个公式就能搞定交叉和求和的操作,所以时间复杂度是o(m),m是embedding向量的个数。但是在AFM中,两两特征的embeding交叉完毕之后,不能直接求和,需要加注意力。也就是AFM中,需要先求出两两交叉后的特征向量(维度是k*1),一共有m(m-1)/2 个特征向量,给这些特征向量分别加上注意力权重,然后再进行求和。因此AFM不能像FM或者NFM那样进行公式化简,所以AFM的时间复杂度是o(m^2)。这样就损失了FM的效率。

2.3.3 Attention based Pooling layer

如果不加Attention based Pooling layer 这一层,则上一层产生的m*(m-1)/2个交叉向量直接进行一个sum pooling(对应元素相加),得到一个K维的输出,将这个输出再经过一个全连接层,得到最后的预测结果。

但加入Attention based Pooling layer这一层的想法是,对于每一个特征交叉向量(vi⊙vj)xixj(v_{i} \odot v_{j})x_{i}x_{j}(vivj)xixj,先根据其对预测结果的影响程度加上不同的权重,然后再进行sum pooling及后续的操作。也就是在Pair-wise Interaction Layer和Output layer中间加入了一个Attention注意力网络。计算公式如下:

其中aija_{ij}aij表示(vi⊙vj)xixj(v_{i} \odot v_{j})x_{i}x_{j}(vivj)xixj 的权重,也就是注意力分数,表示该特征交叉对 对于预测目标的重要性程度。
Attention Net 的结构是一个简单的但全连接层+softmax输出层的结构,数学表示如下:

该层需要学习的参数是pair-wise interaction Layer 到 注意力网络全连接层的权重矩阵W和偏置b,以及全连接层到softmax输出层的权重向量h,这三个的维度分别是W∈Rt×k,b∈Rt,h∈RtW\in R^{t\times k},b\in R^{t},h\in R^{t}WRt×k,bRt,hRt,这里t 表示注意力网络隐藏层单元的格式(这里我觉得应该=n(n-1)/2 n代表输入层所有特征的个数,毕竟要考虑到任意两个不同的特征都有可能交叉,即使当前的训练数据中,由于训练数据有限,某些特征交叉对,在当前训练数据集中没有体现* )。a_{ij}表示每个交互特征的重要性程度,由于是通过softmax之后得到的,所以是一个0-1之间的数值。注意力网络与整个模型一起参与反向传播过程,通过训练迭代,得到最终的权重参数。

2.3.4 Output

pair-wise interaction Layer 层输出的m*(m-1)/2个交叉向量,先经过Attention based Pooling layer 得到对应的权重。交叉向量与对应的权重相乘。然后再进行一个sum pooling(对应元素相加),得到一个K维的输出,将这个输出再经过一个全连接层,得到最后的预测结果。

PTP^{T}PT 代表全连接层。
对于NFM来说,pair-wise interaction Layer 层的输出,会进入到DNN网络,然后再进入输出层。对于AFM来说,pair-wise interaction Layer 层的输出则是与注意力网络层的权重相乘,然后直接进入输出层。这是两个模型的不同之处。

3,DIN模型

3.1背景知识:

介绍DIN模型之前,首先需要了解两小块内容:1,DIN模型的数据集和特征表示。2,深度学习的base模型,DIN模型的提出,是为了解决base模型的不足,这也是DIN模型提出的意义。
1)数据集和特征表示:
工业上的CTR预测数据集 一般都是 multi-group categorical form ,一般长这样:

红框部分是 用户行为特征,这里包含丰富的用户兴趣信息。
对于特征编码,论文作者举例如下:[weekday=Friday, gender=Female, visited_cate_ids={Bag,Book}, ad_cate_id=Book]。对于 weekday,gender,ad_cate_id,通过one-hot 编码的形式来表示。对于 visited_cate_ids,也就是用户历史商品列表,对于某个用户来说,这是一个多值型特征,并且不同用户,visited_cate_ids这个特征的长度一般不一样。这种特征,可以使用multi-hot编码的形式来进行标识。设待选的所有商品有n个,该用户历史商品列表中,有哪个商品,对应位置就是1,经过编码后,数据长下面这个样子:

这个就是输入模型的数据形式。此时输入特征之间没有做特征交叉,特征交叉由后面的模型层来做。

2)基线模型
与DIN模型对比的base模型,分为三大模块:Embedding layer,Pooling&Concat layer,MLP,结构如下:

1,Embedding layer:这个层的作用是把高维稀疏的输入,转成低维稠密向量,每个离散特征下面都会对应一个embedding词典,维度是DK,这里D表示隐向量的维度,K表示是当前离散特征的唯一取值个数nunique()。
假设某个用户的weekday特征是周五,转化成one-hot 编码的时候,是[0,0,0,0,1,0,0]表示,如果再假设隐向量维度是D,那么这个特征对应的embedding词典就是一个D
7的矩阵(每一列代表一个embedding,7列正好7个embedding向量,对应周一到周日),那么该用户这个one-hot向量经过embedding层之后就会得到一个D1的向量,也就是周五对应的那个embedding,计算方式就是 embedding矩阵 [0,0,0,0,1,0,0]T[0,0,0,0,1,0,0]^{T}[0,0,0,0,1,0,0]T,也就是直接把embeding矩阵中one-hot向量中为1的那个位置的embedding向量拿出来。这样就得到稀疏特征的稠密向量了。
对于multi-hot编码的那个,会得到一个embedding向量的列表,因为他开始的那个multi-hot向量中不止一个位置是1,这样乘以embedding矩阵,就会得到一个列表了。

2,pooling layer and Concat layer:
pooling层的作用是将用户的历史行为embedding,这个不定长的embeding向量变成一个定长的向量。每个用户multi-hot中1的个数不一样,这样经过embedding层,得到的用户历史行为embeding的个数不一样多,也就是tit_{i}ti对应的embedding列表不一样长。这样的话,每个用户的历史行为特征拼起来就不一样长了。但后面如果加全连接网络的话,则需要定长特征输入。所以往往用一个Pooling layer 先把用户历史行为embedding 变成固定长度。实现公式如下:

这里的eije_{ij}eij是用户历史行为的那些embedding。eie_{i}ei就变成了定长的向量。这里的i表示第i个历史特征组(是历史行为,比如历史的商品id,历史的商品类别id等),这里的k表示对应历史特征组里面用户购买过的商品数量,也就是历史embedding的数量。Concat layer层的作用就是拼接了,这里就是把这所有的embedding向量,如果有连续特征的话也算上,从特征维度整合拼接,作为MLP的输入。

3.MLP:普通全连接层,用于学习特征之间的各种交互
4.Loss:点击率预测任务,属于二分类问题,损失函数使用负的log对数似然。


以上是base模型的基本框架。该模型的不足之处在于
用户的历史行为特征和当前候选广告特征在全部拼起来送到MLP层之前,没有特征交互的过程。送到MLP层中虽然有了一些交互,但是因为与当前候选广告交互的是池化后的历史特征eie_{i}ei,eie_{i}ei是所有历史商品信息的综合,因此,每个历史商品信息的信息就会有丢失。丢失在哪里呢?
首先,把历史商品信息综合起来的话,无法看出用户历史行为中,哪些商品与当前候选商品比较相关,即丢失了历史行为中不同商品对当前预测的重要性程度。比如当前候选广告是键盘,但是该用户的历史行为中包括:鼠标,电脑,洗面奶,衣服,包包。很显然,鼠标,电脑,与候选广告键盘的相关程度是不同于 洗面奶,衣服,包包与候选广告键盘的相关程度的。
其次,用户所有的历史商品信息,都通过embeding和pooling转换成固定长度的embedding,会限制模型学习用户的多样化兴趣。
如何改进?
思路1:加大embedding的维度D,增加各个商品的表达能力,这样,综合起来的emdeding的表达能力也会加强。但这个在工业界推荐场景中落地的话,会存在计算量太大的问题。
思路2:在当前候选广告与用户的历史行为之间引入注意力机制。让模型更加关注与当前广告商品相关的那些用户历史商品。

3.2 模型解决了什么问题?

DIN模型,是针对base_model存在的问题,从改进思路2出发,提出的模型。模型结构如下:

DIN模型,是在base_model的基础上,引入local Activation Unit(局部激活单元,也就是注意力机制)来学习用户兴趣和当前候选广告的关联程度。local Activation Unit用在用户历史行为特征上面,能够根据用户历史行为特征和当前广告的相关性来给用户历史行为特征embedding进行加权。
local Activation Unit是一个前馈神经网络,输入是用户历史行为商品与当前的候选商品,输出是二者之间的相关性得分,把相关性得分与原来的历史行为embedding相乘求和得到了用户的兴趣表示vu(A)v_{u}(A)vu(A),计算公式如下:

以上是DIN模型的原理。

3.3 模型的创新点在哪里?

在工业界的实践中,训练具有大规模稀疏输入特征的工业深度网络是一个很大的挑战。论文中提到两种技术,在实践中被证明是有帮助的。
1,Mini-batch Aware Regularization。相比较L2正则,该方法做出的改进是只对出现过的特征embedding的参数施加正则约束。
2,Data Adaptive Activation Function。跟随数据分布而动态调整的自适应激活函数Dice。Dice是泛化的PRelu函数。作者把它应用在了local Activation Unit单元中。PRelu激活函数公式如下:

作者指出PRelu 函数的不足在于,采用固定阈值0来作为硬矫正点。但实际中,当每一个batch的输入数据遵循不同的分布时,可能会不合适,因此,作者设计一个新的自适应激活函数Dice。PRelu 和 Dice 两个激活函数中P(s)部分如下:

Dice激活函数的计算公式如下:

先回顾一下sigmoid函数的计算公式:
S(t)=11+e−tS(t) = \frac{1}{1+e^{-t}}S(t)=1+et1 ,所以, P(s)函数就是一个sigmoid函数。
E(s)和Var(s)是每个mini-batch里面样本的均值和方差。当然这里是训练集部分。对于测试集,则是采用数据上平滑的均值和方差。由于把均值和方差考虑进去了,所以这个函数的调整就可以根据数据的分布进行自适应,这样更加灵活和合理一些。

3.4 一些论文细节

1,RelaTmpr:
该指标用来基于base model 看模型的提高程度。

2,加权AUC:

n是用户数,KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲impression_{i}AUCiAUC_{i}AUCi是第i个用户的曝光商品数以及第i个用户的AUC。

3.4 DIN模型是如何如何实现的?(模型结构,数学原理,代码实现)

模型结构和数学原理,在前面基本讲过了。在代码实现层面,主要分为两个重点之前没有接触过的部分。
1,数据预处理。主要是针对包含用户历史行为的数据集,正负样本该如何构建?
2,DIN模型里面的Attention 层该如何实现?
这里准备过一遍小强大神的代码。虽然跟自己本职工作内容不太相关。但是比较感兴趣,想看一下,这个数据预处理究竟是怎么做的,Attention 层,又究竟是怎么实现的。just for interest!

(1)在数据准备阶段,比较重要的细节有:正负样本是如何生成的?append 函数的深拷贝和浅拷贝,pytorch 实现 pad_sequence该如何做,这三个知识点

import copy as cp
from copy import deepcopy
hist = []train_data = []
val_data = []
test_data = []
for i in range(1, len(pos_list)):hist.append([pos_list[i-1]])if i == len(pos_list) - 1:                   # 最后一个的时候test_data.append([deepcopy(hist), [pos_list[i]], 1])test_data.append([deepcopy(hist), [neg_list[i]], 0])elif i == len(pos_list) - 2:           # 倒数第二个的时候val_data.append([deepcopy(hist), [pos_list[i]], 1])val_data.append([deepcopy(hist), [neg_list[i]], 0])else:
#         train_data.append([hist, [pos_list[i]], 1])  #直接append hist时,属于浅拷贝,只是拷贝了hist的引用,随着循环的进行,hist会改变,train_data中,之前append的hist,它的内容也会改变
#         train_data.append([hist, [neg_list[i]], 0])train_data.append([deepcopy(hist), [pos_list[i]], 1])train_data.append([deepcopy(hist), [neg_list[i]], 0])print(train_data)print('\n')
# train_data 直觉上包含的多个元素中,hist长度应该是1,2,3,逐渐变长的,但是实际上最终的train_data中hist的长度都是最终的长度,原因是什么呢?
# 出现困惑的原因在于append函数的浅拷贝
# https://zhuanlan.zhihu.com/p/161266559
# pad_sequence 在pytorch 中的使用
# https://blog.csdn.net/m0_37586991/article/details/89470658pad_train_hist= pad_sequence([torch.from_numpy(np.array(x)) for x in train['hist']], batch_first=True)
train_X = [np.array([0.] * len(train)), np.array([0]*len(train)),pad_train_hist,np.array(train['target_item'].tolist())]

(2)模型搭建中

Attention layer 层的代码理解:

至此,DIN模型算是有一个基础的了解。

4,总结

AFM和DIN模型都是带有注意力机制的模型,但这两个模型的差距很大,注意力起作用的出发点和原理都不一样。

AFM模型是基于NFM模型改进的,解决的痛点问题是:**各个特征交叉之后的embedding向量被同等看待,赋予对预测相同的重要性的问题。**所以引入注意力机制,给各个特征交叉后的embedding向量不同的权重,来表示不同embeding向量对预测结果的重要程度。

DIN模型解决的痛点问题是:**深度学习模型无法表达用户多样化的兴趣。**它通过考虑【给定的候选广告】和【用户的历史行为】的相关性来计算用户兴趣的表示向量。具体来说,就是引入local activation unit,通过历史搜索行为的来关注相关的用户兴趣,并采用加权和来获得有关候选广告的用户兴趣的表示。与候选广告相关性较高的行为会获得较高的激活权重,并支配着用户兴趣。该表示向量在不同广告上有所不同,从而大大提高模型的表达能力。DIN模型的使用,与应用场景有很大关系,需要有丰富的用户历史行为数据。
作者在DIN这篇论文里面提到了尝试用LSTM对用户历史行为数据进行建模。 但是发现没有改善效果。因为用户历史行为的序列可能包含多个并发兴趣, 这些兴趣的快速跳跃和突然结束导致用户行为的序列数据很嘈杂, 但是提供了一个研究的方向, 而在一年之后,作者真的找到了合适的结构,搞定了这个问题, 这个就是2019年的DIEN了,这个模型在后面的文章中会进行整理。

这里再次梳理一下模型的发展时间线,继NeuralCF之后:

参考资料:
AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)

推荐系统9---AFM与DIN模型(推荐系统遇上注意力机制)相关推荐

  1. AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  2. 推荐系统 之 AFM和DIN

    (文章已补全) 感觉已经落下好多进度了,要马上赶上来才行.后面还有好多书没有看0 0 这篇文章的两个模型都是来自于引入了attention机制而产生的,再NFM模型中,不同域的特征Embediing向 ...

  3. 推荐系统之DIN模型(注意力机制对业务的理解)

    前言 前面讲过了AFM,AFM是对注意力机制的一个浅显的尝试,并没有基于业务上进行设计的一个模型.在工业领域例如在线广告上点击率(Click-through rate,CTR)预测是一个很重要的任务. ...

  4. 推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models)

    推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐 ...

  5. 《推荐系统》-DIN模型

    1.背景 深度学习在CTR预估领域已经有了广泛的应用,常见的算法比如Wide&Deep,DeepFM等.这些方法一般的思路是:通过Embedding层,将高维离散特征转换为固定长度的连续特征, ...

  6. 推荐系统与深度学习(十七)——DIN模型原理

    公众号后台回复"图书",了解更多号主新书内容 作者:livan 来源:数据python与算法 模型简介 随着推荐算法逐渐的发展,大佬们的研究方向主要切分成了两部分:一个是对特征的调 ...

  7. 注意力机制在推荐模型中的应用——AFM、DIN、DIEN

    "注意力机制"来源于人类最自然的选择性注意的习惯.最典型的例子是用户在浏览网页时,会选择性地注意页面的特定区域,忽视其他区域.正是基于这样的现象,在建模过程中考虑注意力机制对预测结 ...

  8. 【推荐实践】腾讯推荐系统中的深度匹配模型

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年6月热门报告合集从零开始了解推荐系统全貌机器学习在B站推荐系统中的应用实践微信视频号实时推 ...

  9. 搜索和推荐系统中的深度匹配模型

    文章作者:辛俊波 腾讯 高级研究员 编辑整理:DataFunTalk 导读:推荐系统和搜索应该是机器学习乃至深度学习在工业界落地应用最多也最容易变现的场景.而无论是搜索还是推荐,本质其实都是匹配,搜索 ...

最新文章

  1. python制作缩略图
  2. 前端学习(806):数据类型内存分配
  3. java8 di_java8 多个list对象用lambda求差集操作
  4. 第六届省赛(软件类)真题----Java大学B组答案及解析
  5. paip. 调试技术打印堆栈 uapi print stack java php python 总结.
  6. Docker学习笔记 之 Docker安装配置使用
  7. 根据第xx天推算日期
  8. linux卸载qt5.6.2,请问该怎么把linux的Qt升级为5.6?
  9. Android自定义选座,Android实现电影院选座效果
  10. DDD领域驱动设计实战(四)-值对象
  11. 工序能力指数Cp判定标准(附免费CPK计算工具)
  12. php版寿星万年历,寿星万年历电脑版
  13. sqlserver大批量数据查询的优化方式
  14. 什么是combo复用口,光电类型如何转换?
  15. 霍尼韦尔和陕西西咸新区签订投资战略协议;雀巢专业餐饮成都客户交流体验中心落成 | 美通企业日报...
  16. 电脑中的耳机插进去没有反应
  17. Linux C++ 海康 设备 直连抓图 和 平台抓图代码~
  18. 征服嵌入式linux,成功征服英语的三十个好习惯
  19. 笔记本强制删除文件的资料找到办法
  20. 上海亨隆科教设备有限公司——人体针灸模型

热门文章

  1. 快捷指令通知运行html,快捷指令怎样运行这段,一个书签
  2. 微信小程序-贪吃蛇开发4 wxml和wxss学习
  3. 传真百科:传真通讯技术的发展历史
  4. 华为云桌面,一站式云上数字化创作深度解读
  5. 命令与征服2完全版+烈火风暴资料片
  6. DAVINCI DM36x开发攻略——U-BOOT-2010.12及UBL移植
  7. 城镇水务系统碳减排路径|给水与再生水系统
  8. 鉴于B站的代码粘贴没有全选功能,up在这里放上软件小妹的脚本代码
  9. PCL显示点云-ICP(PCL1.9.1)
  10. SpringBoot启动代表出现Process finished with exit code 0