Attentional Factorization Machines - 学习笔记

news/2024/5/20 0:31:38 标签: 深度学习, 人工智能, 推荐算法

引言

本篇文章介绍的是Attentional Factorization Machines(AFM)。AFM开创性地将注意力机制引入到因子分解机(Factorization Machines)中,可视为FM和NFM的延续之作,这两个模型在前面博客中已经进行了介绍,有兴趣的读者可以点击蓝色链接进行深入了解。

简单回顾一下,FM使用两个隐向量的内积来表示一对特征组合的权重,增强了模型的泛化性;NFM为了弥补FM中特征交叉阶数有限的缺点,引入深度神经网络(DNNs)构建交叉特征,并提出了一种新的特征交叉操作。

概括来说,NFM基于因子分解机的框架,在单纯的特征交叉方面已经做到了力所能及的最大限度。 而AFM解决的是特征交叉过程中的一个痛点,哪些特征是重要的?哪些特征是不重要的?这个问题FM和NFM都回答不了。解决的方法在今天看来也很简单,但是在当时是巨大的飞跃:通过引入注意力机制,对特征组合赋予注意力权重的方式,就可以让重要的特征发挥更显赫的作用。

Attentional Factorization Machines

在这里插入图片描述
上图是AFM的网络结构图。Embedding Layer层的作用是把高维的稀疏编码转换为低维的稠密向量。Pair-wise Interaction Layer引入了基于特征对的特征交叉操作,而Attention-based Pooling则为特征交叉提供注意力机制的权重预测,用公式表达如下:
f A t t ( f P I ( X ) ) = ∑ ( i , j ) ∈ R x a i j ( v i ⊙ v j ) x i x j f_{Att}(f_{PI}(X)) = \sum_{(i,j)∈R_x}a_{ij}(v_i⊙v_j)x_ix_j fAtt(fPI(X))=(i,j)Rxaij(vivj)xixj
其中 ⊙ ⊙ 是点对点乘积(element-wise product)。注意力权重 a i j a_{ij} aij的计算过程如下:
a i j ′ = h T R e L U ( W ( v i ⊙ v j ) x i x j + b ) a i j = e x p ( a i j ′ ) ∑ ( i , j ) ∈ R x e x p ( a i j ′ ) a_{ij}^{'}=h^TReLU(W(v_i⊙v_j)x_ix_j+b)\\ a_{ij} = \frac{exp(a_{ij}^{'})}{\sum_{(i,j)∈R_x}exp(a_{ij}^{'})} aij=hTReLU(W(vivj)xixj+b)aij=(i,j)Rxexp(aij)exp(aij)
最终AFM的输出表示为:
y A F M ( x ) = w 0 + ∑ i = 1 n w i x i + p T ∑ i = 1 n ∑ j = i + 1 n a i j ( v i ⊙ v j ) x i x j y_{AFM}(x) = w_0 + \sum_{i=1}^nw_ix_i+p^T\sum_{i=1}^n\sum_{j=i+1}^na_{ij}(v_i⊙v_j)x_ix_j yAFM(x)=w0+i=1nwixi+pTi=1nj=i+1naij(vivj)xixj
AFM模型优化使用的是均方误差损失:
L r = ∑ x ∈ T ( y A F M ( x ) − y ( x ) ) 2 + λ ∣ ∣ W ∣ ∣ 2 L_r=\sum_{x∈T}(y_{AFM}(x)-y(x))^2+λ||W||^2 Lr=xT(yAFM(x)y(x))2+λW2

总结

AFM创新性地引入了注意力机制,改善了因子分解机的特征交叉过程。


http://www.niftyadmin.cn/n/1701320.html

相关文章

XMPP 安装ejabberd 搭建服务器环境

网上各种找。。各种安装失败。。 终于。。。。 ejabberd 下载列表。。。。 http://www.process-one.net/en/ejabberd/archive/ 建议下载old 版本。。。 我用得是ejabberd-2.1.11-darwin-x86_64-installer.app.zip 下载完。安装(注意::记住…

python-tensorflow模型保存、提取

模型保存 import tensorflow as tf#%% #模型保存 with tf.variable_scope(a,reusetf.AUTO_REUSE):v1 tf.get_variable(namev1,initializertf.constant(3.0))v2 tf.get_variable(namev2,initializertf.constant(4.0))result v1 v2saver tf.train.Saver()with tf.Session() …

python-tensorflow多个图

import tensorflow as tf a tf.constant([[1,2],[3,4]],dtypetf.int32) b tf.constant([5,6,7,8],dtypetf.int32,shape[2,2])print("变量a是否在默认图中:{}".format(a.graph is tf.get_default_graph()))#使用新的构建的图 graph tf.Graph() with gra…

python-tensorflow tensorboard

2021-04-12 一直不知道怎么调试tensorflow模型,怎么样算好,遇到问题怎么办,目前还不知道怎么解决,听说tensorboard在调试过程种有很好的效果,花了一天时间了解学习。 本文主要讨论常用的几个应用: 1&…

python-tensorflow 变量及作用域之作用域(二)

前一节讲变量 tf.get_variable和tf.Variable新建变量的区别,区别在于重复定义变量时,计算机是否自动更改变量属性名,tf.variable会自动更改属性名加‘_n’,tf.get_variable就会报错。 本节讲作用域 结论1:变量名就是一个名字&a…

JS面向对象之对象属性的属性

ECMAScript的定义中,对象的属性有两种,一种是数据属性,另一种是访问器属性 我们知道JS中有基本数据类型和对象,对象中的属性也无外乎是这些类型,可是作为对象的属性,这些属性本身却也多了一些特殊的属性&a…

cocos2dx CCControlButton 按钮事件

.h文件bool HelloWorld::init(){//// 1. super init firstif ( !CCLayer::init() ){return false;}CCLabelTTF * label CCLabelTTF::create("为选中文字", "MarkerFelt",25);CCControlButton * button CCControlButton ::create(label,CCScale9Sprite::c…

JavaScript中的变量提升与函数提升

我们先来看下面这一段代码 console.log(foo) //undefined var foo ”test“ 很奇怪对吧,分明foo字符串声明在输出语句之后,为什么输出的结果只是“未找到值”而不是“未找到该变量”呢?别急,我们看接下来的这个例子。 var x n…