注意力FM模型AFM

注意力FM模型AFM

1. 概述

在CTR预估任务中,对模型特征的探索是一个重要的分支方向,尤其是特征的交叉,从早起的线性模型Logistic Regression开始,研究者在其中加入了人工的交叉特征,对最终的预估效果起到了正向的效果,但是人工的方式毕竟需要大量的人力,能否自动挖掘出特征的交叉成了研究的重要方向,随着Factorization Machines[1]的提出,模型能够自动处理二阶的特征交叉,极大减轻了人工交叉的工作量。

但是在FM中,每一个交叉特征的权重是一致的,但是在实际的工作中,不同的交叉特征应该具备不同的权重,尤其是较少使用到的权重,对于统一的权重会影响到模型的最终效果。AFM(Attentional Factorization Machines)[2]模型在FM模型的基础上,引入了Attention机制,通过Attention的网络对FM模型中的交叉特征赋予不同的权重。

2. 算法原理

2.1. FM模型中的交叉特征

FM模型中包含了两个部分,一部分是线性部分,另一部分是二阶的交叉部分,其表达式如下所示:

y ^ F M ( x ) = w 0 + ∑ i = 1 n w i x i ⏟ + ∑ i = 1 n ∑ j = i + 1 n w ^ i j x i x j ⏟ linear regression pair-wise feature omteractions \begin{matrix} \hat{y}_{FM}\left ( \mathbf{x} \right )= & \underbrace{w_0+\sum_{i=1}^{n}w_ix_i} & + & \underbrace{\sum_{i=1}^{n}\sum_{j=i+1}^{n}\hat{w}_{ij}x_ix_j} \\ & \textrm{linear\;regression} & & \textrm{pair-wise\;feature omteractions} \\ \end{matrix} y^​FM​(x)=​         w0​+i=1∑n​wi​xi​​linearregression​+​         i=1∑n​j=i+1∑n​w^ij​xi​xj​​pair-wisefeature omteractions​
其中, w ^ i j \hat{w}_{ij} w^ij​表示的是交叉特征 x i x j x_ix_j xi​xj​的权重,在FM算法中,为了方便计算,为每一个特征赋予了一个 k k k维的向量: v i ∈ R k \mathbf{v}_i\in \mathbb{R}^k vi​∈Rk,则 w ^ i j \hat{w}_{ij} w^ij​可以表示为:

w ^ i j = v i T v j \hat{w}_{ij}=\mathbf{v}_i^T\mathbf{v}_j w^ij​=viT​vj​

对于具体为甚么上述的这样的计算方式可以方便计算,可以参见参考[3]。既然上面说 w ^ i j \hat{w}_{ij} w^ij​表示的是交叉特征 x i x j x_ix_j xi​xj​的权重,那么为什么还说在FM模型中的每个交叉特征的权重是一致的,这个怎么理解?如果将FM模型放入到神经网络的框架下,FM模型的结构可以由下图表示:

www.zeeklog.com  - 注意力FM模型AFM

对于每一个特征都赋予一个 k k k维的向量,如上图中的第二个特征 x 2 x_2 x2​的 k k k维向量为 v 2 \mathbf{v}_2 v2​,同理,第四个特征 x 4 x_4 x4​的 k k k维向量为 v 4 \mathbf{v}_4 v4​,这里类似于对原始特征的Embedding,最终 x 2 x_2 x2​和 x 4 x_4 x4​的交叉特征可以表示为: ( v 2 ⊙ v 4 ) x 2 x 4 \left ( \mathbf{v}_2\odot \mathbf{v}_4 \right )x_2x_4 (v2​⊙v4​)x2​x4​,其中, ⊙ \odot ⊙表示的是元素的乘积。最终,将所有的交叉特征相加便得到了交叉部分 y 2 y_2 y2​:

y 2 = p T ∑ ( i , j ) ∈ R x ( v i ⊙ v i ) x i x j + b y_2= \mathbf{p}^T\sum_{\left ( i,j \right )\in \mathfrak{R}_x}\left ( \mathbf{v}_i\odot \mathbf{v}_i \right )x_ix_j+b y2​=pT(i,j)∈Rx​∑​(vi​⊙vi​)xi​xj​+b

其中, R x = { ( i , j ) } i ∈ χ , j ∈ χ , j > i \mathfrak{R}_x=\left\{\left ( i,j \right ) \right\}_{i\in \chi ,j\in \chi,j>i} Rx​={(i,j)}i∈χ,j∈χ,j>i​, p ∈ R k \mathbf{p}\in \mathbb{R}^k p∈Rk, b ∈ R b\in \mathbb{R} b∈R,在上述的FM中, p = 1 \mathbf{p}=\mathbf{1} p=1, b = 0 b=0 b=0。在相加的过程中,对于每一部分的交叉特征的权重都是一致的,这就会导致上面说的统一的权重会影响到模型的最终效果。我们希望对于每一部分的交叉特征能够有不同的权重,即:

y 2 = p T ∑ ( i , j ) ∈ R x a i , j ( v i ⊙ v i ) x i x j + b y_2=\mathbf{p}^T\sum_{\left ( i,j \right )\in \mathfrak{R}_x}a_{i,j}\left ( \mathbf{v}_i\odot \mathbf{v}_i \right )x_ix_j+b y2​=pT(i,j)∈Rx​∑​ai,j​(vi​⊙vi​)xi​xj​+b

其中, a i , j a_{i,j} ai,j​表示的是第 i i i, j j j交叉特征部分的权重。

2.2. AFM的网络结构

在注意力FM模型AFM(Attentional Factorization Machines)中,是在FM的基础上引入了Attention机制,通过Attention网络学习到每个交叉特征的权重 a i , j a_{i,j} ai,j​,AFM的网络结构如下图所示:

www.zeeklog.com  - 注意力FM模型AFM

上述在Pair-wise Interaction Layer和Prediction Score之间的SUM Pooling上增加了Attention的网络,具体的数学表达式如下所示:

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 \hat{y}_{AFM}\left ( \mathbf{x} \right )=w_0+\sum_{i=1}^{n}w_ix_i+\mathbf{p}^T\sum_{i=1}^{n}\sum_{j=i+1}^{n}a_{ij}\left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_j y^​AFM​(x)=w0​+i=1∑n​wi​xi​+pTi=1∑n​j=i+1∑n​aij​(vi​⊙vj​)xi​xj​

2.3. Attention网络

对于Attention网络部分,需要计算出对于不同的交叉特征部分的权重 a i j a_{ij} aij​,其中,网络的输入为 ( v i ⊙ v j ) x i x j \left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_j (vi​⊙vj​)xi​xj​, 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 ′ ) \begin{matrix} a^{'}_{ij}=\mathbf{h}^TReLU\left ( \mathbf{W}\left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_j+\mathbf{b} \right ) \\ a_{ij}=\frac{exp\left ( a^{'}_{ij} \right )}{\sum_{\left ( i,j \right )\in \mathfrak{R}_x}exp\left ( a^{'}_{ij} \right )} \end{matrix} aij′​=hTReLU(W(vi​⊙vj​)xi​xj​+b)aij​=∑(i,j)∈Rx​​exp(aij′​)exp(aij′​)​​

参考[4]中给出了具体的AFM的实现,下面是Attention网络的具体实现方法:

def call(self, inputs, training=None, **kwargs):
	if K.ndim(inputs[0]) != 3:
		raise ValueError(
			"Unexpected inputs dimensions %d, expect to be 3 dimensions" % (K.ndim(inputs)))

	embeds_vec_list = inputs # 交叉特征部分
	row = []
	col = []

	for r, c in itertools.combinations(embeds_vec_list, 2):
		row.append(r)
		col.append(c)

	p = tf.concat(row, axis=1)
	q = tf.concat(col, axis=1)
	inner_product = p * q

	bi_interaction = inner_product
	attention_temp = tf.nn.relu(tf.nn.bias_add(tf.tensordot(
		bi_interaction, self.attention_W, axes=(-1, 0)), self.attention_b)) # 计算网络输出,上述公式的第一部分
	#  Dense(self.attention_factor,'relu',kernel_regularizer=l2(self.l2_reg_w))(bi_interaction)
	self.normalized_att_score = softmax(tf.tensordot(
		attention_temp, self.projection_h, axes=(-1, 0)), dim=1) # 归一化,上述公式的第二部分
	attention_output = reduce_sum(
		self.normalized_att_score * bi_interaction, axis=1) # 加权求和

	attention_output = self.dropout(attention_output, training=training)  # training,防止过拟合

	afm_out = self.tensordot([attention_output, self.projection_p]) # 乘以向量,做最终的输出
	return afm_out

3. 总结

AFM模型在FM模型的基础上,引入了Attention机制,通过Attention的网络对FM模型中的交叉特征赋予不同的权重。

参考文献

[1] Rendle S. Factorization machines[C]//2010 IEEE International conference on data mining. IEEE, 2010: 995-1000.

[2] Xiao J, Ye H, He X, et al. Attentional factorization machines: Learning the weight of feature interactions via attention networks[J]. arXiv preprint arXiv:1708.04617, 2017.

[3]

[4]

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk