AutoInt
00 min
2024-9-28
2024-9-28
type
status
date
slug
summary
tags
category
icon
password

AutoInt

1️⃣论文出处

2️⃣论文解读

AutoInt模型通过显示的方式进行特征交叉,并且在模型的交互层引入了多头自注意力机制来赋予不同特征交叉以不同的重要性,增强了模型的表达能力。
AutoInt:使用Multi-head Self-Attention进行自动特征学习的CTR模型
这篇论文提出使用multi-head self attention(类似Transformer里的那个) 机制来进行自动特征交叉学习以提升CTR预测任务的精度。 废话不多说,先看下主要结构。典型的四段式深度学习CTR模型结构:输入,嵌入,特征提取,输出。这里我们重点看下嵌入和特征提取部分 针对类别特征,通过embedding方式转换为低维稠密向量 其中, 是特征组 对应的嵌入字典(嵌入矩阵), 是特征组特征的独热编码表示向量(通常出于节省空间的考虑,只存储非零特征对应的索引) 对于连续特征有, 其中 是一个嵌入向量, 是一个标量值 通常在CTR任务中我们对连续值特征的处理方式有三种: 进行归一化处理拼接到embedding向量侧 进行离散化处理作为类别特征 赋予其一个embedding向量,每次用特征值与embedding向量的乘积作为其最终表示 本文采取的是第三种方式,具体这三种方式孰优孰劣,要在具体场景具体任务下大家自己去验证了~ 从实现的角度看第三种是比较便捷的。 交互层使用多头注意力机制将特征投射到多个子空间中,在不同的子空间中可以捕获不同的特征交互模式。通过交互层的堆叠,可以捕获更高阶的交互模式。 下面展示在特定子空间 下,对于特征组 下的特征 ,交互层是如何计算与其相关的交互特征 的 首先输入特征通过矩阵乘法线性变换为在注意力空间下的向量表示,对于每个特征 在特定的注意力空间 中,都有三个表示向量 , , 计算 与其他特征 的相似度,本文使用向量内积表示: 计算softmax归一化注意力分布: 通过加权求和的方式得到特征 及其相关的特征组成的一个新特征 假设有 个注意力子空间,将每个子空间下的结果进行拼接,得到特征 最终的结果表示 : 我们可以选择使用残差网络保留一些原始特征的信息留给下一层继续学习 最后,将每个特征的结果拼接,计算最终的输出值 一层交互层捕获的阶数有限,通过堆叠若干交互层可以捕获高阶交互,提升注意力空间向量维度和提高子空间个数均能提升模型的表达能力。该模型也可以联合传统的MLP进行联合训练进一步提升表达能力。 下面就是核心代码啦,可以看到其实很短。 我们使用tensorflow进行实现的时候,可以充分利用矩阵运算的特性来简化实现。 先说明一些定义,fieldsize为特征组的个数,embedding_size为嵌入层单个特征的嵌入维度, att_embedding_size为注意力空间下隐向量的长度, head_num为注意力空间的个数, use_res 为一个布尔变量,表示是否使用残差连接。 首先假设输入 inputs的shape为(batch_size,field_size,embedding_size),四个投影矩阵 的shape均为(embedding_size, att_embedding_size * head_num) 通过矩阵乘法得到注意力空间下的三组向量表示 querys = tf.tensordot(inputs, W_Query, axes=(-1, 0)) # (batch_size,field_size,att_embedding_size*head_num) keys = tf.tensordot(inputs, W_key, axes=(-1, 0)) values = tf.tensordot(inputs, W_Value, axes=(-1, 0)) 2.
AutoInt:使用Multi-head Self-Attention进行自动特征学习的CTR模型
 

3️⃣模型结构

notion image
1-Input Layer
首先将用户属性和物品数学转化为稀疏向量并拼接在一起。
其中M表示总共的feature fields的数目,表示第i个特征,如果是离散的,就是one-hot向量,如果是dense类型的特征,就是一个scalar。
 
2-Embedding Layer
1、针对类别特征,通过embedding方式转换为低维稠密向量:
其中, 是特征组对应的嵌入字典(嵌入矩阵), 是特征组特征的独热编码表示向量(通常出于节省空间的考虑,只存储非零特征对应的索引)。
2、针对多值离散特征,其对应特征值向量的平均值作为其embedding:
其中, 是特征组对应的嵌入字典(嵌入矩阵),是样本对于个字段的值个数,是这个字段的多个热矢量表示。
3、针对数值特征
其中是字段的嵌入向量,是标量值。
 
3-Interacting Layer
交互层使用多头注意力机制将特征投射到多个子空间中,在不同的子空间中可以捕获不同的特征交互模式。通过交互层的堆叠,可以捕获更高阶的交互模式。
下图为在特定子空间下,对于特征组下的特征,交互层如何得到与其相关的特征向量
notion image
1.首先输入特征通过矩阵乘法线性变换为在注意力空间下的向量表示,对于每个特征在特定的注意力空间中,都有三个表示向量:
2.计算与其他特征的相似度,文中使用向量内积表示:
3.计算softmax归一化注意力分布:
4.通过加权求和的方式得到特征及其相关的特征组成的一个新特征:
假设有个注意力子空间,将每个子空间下的结果进行拼接,得到特征最终的结果表示 :
notion image
我们可以选择使用残差网络保留一些原始特征的信息留给下一层继续学习
notion image
最后,将每个特征的结果拼接,计算最终的输出值
notion image
4-Output Layer
 
 
5-时间复杂度
单层 Interacting 的AutoInt的时间复杂度为,对比单层 MLP,假设神经元个数为N,时间复杂度为。通常的值比较小,因此时间效率不会太差。M为特征维度,d为隐藏层维度,H为注意力头数。
 
6-特征交叉
Self-Attention会先计算每个embedding向量和其他向量的相关系数,然后再用所有向量的系数乘上自己的embedding作为下一层的输入,所以我们可以计算得到每个向量和其他向量的关系,再将相关性强的特征进行组合,作为新的特征,这样的组合最大的意义我们可以找到经常一起出现的特征。
优点:
1.找到意思相近的embedding并进行组合,形成一些可解释性较强的组合特征; 2.大量的实验也验证这种方式的高阶交叉组合的优势;
缺点:
1.个人感觉还是未能充分挖掘有意义的高阶交叉特征;此处的组合只是找到了关系相近的特征,关系相近的特征进行组合并不一定是合适的方式,也就是说multi-head selfattention能做到有意义的特征组合,但却不能说明关系不相近的特征的意义就不大。

4️⃣解决问题

模型主要解决先前模型,如FM模型无法学习到高阶交叉特征,DeepFM学习到的高级特征是隐式的,缺乏良好的解释性,XDeepFM虽然是显示进行特征交叉的,但是解释这些特征效果并不容易的问题。
 

5️⃣损失函数 | 目标函数 | 公式推导

notion image
 

6️⃣代码实现

AutoInt:使用Multi-head Self-Attention进行自动特征学习的CTR模型
这篇论文提出使用multi-head self attention(类似Transformer里的那个) 机制来进行自动特征交叉学习以提升CTR预测任务的精度。 废话不多说,先看下主要结构。典型的四段式深度学习CTR模型结构:输入,嵌入,特征提取,输出。这里我们重点看下嵌入和特征提取部分 针对类别特征,通过embedding方式转换为低维稠密向量 其中, 是特征组 对应的嵌入字典(嵌入矩阵), 是特征组特征的独热编码表示向量(通常出于节省空间的考虑,只存储非零特征对应的索引) 对于连续特征有, 其中 是一个嵌入向量, 是一个标量值 通常在CTR任务中我们对连续值特征的处理方式有三种: 进行归一化处理拼接到embedding向量侧 进行离散化处理作为类别特征 赋予其一个embedding向量,每次用特征值与embedding向量的乘积作为其最终表示 本文采取的是第三种方式,具体这三种方式孰优孰劣,要在具体场景具体任务下大家自己去验证了~ 从实现的角度看第三种是比较便捷的。 交互层使用多头注意力机制将特征投射到多个子空间中,在不同的子空间中可以捕获不同的特征交互模式。通过交互层的堆叠,可以捕获更高阶的交互模式。 下面展示在特定子空间 下,对于特征组 下的特征 ,交互层是如何计算与其相关的交互特征 的 首先输入特征通过矩阵乘法线性变换为在注意力空间下的向量表示,对于每个特征 在特定的注意力空间 中,都有三个表示向量 , , 计算 与其他特征 的相似度,本文使用向量内积表示: 计算softmax归一化注意力分布: 通过加权求和的方式得到特征 及其相关的特征组成的一个新特征 假设有 个注意力子空间,将每个子空间下的结果进行拼接,得到特征 最终的结果表示 : 我们可以选择使用残差网络保留一些原始特征的信息留给下一层继续学习 最后,将每个特征的结果拼接,计算最终的输出值 一层交互层捕获的阶数有限,通过堆叠若干交互层可以捕获高阶交互,提升注意力空间向量维度和提高子空间个数均能提升模型的表达能力。该模型也可以联合传统的MLP进行联合训练进一步提升表达能力。 下面就是核心代码啦,可以看到其实很短。 我们使用tensorflow进行实现的时候,可以充分利用矩阵运算的特性来简化实现。 先说明一些定义,fieldsize为特征组的个数,embedding_size为嵌入层单个特征的嵌入维度, att_embedding_size为注意力空间下隐向量的长度, head_num为注意力空间的个数, use_res 为一个布尔变量,表示是否使用残差连接。 首先假设输入 inputs的shape为(batch_size,field_size,embedding_size),四个投影矩阵 的shape均为(embedding_size, att_embedding_size * head_num) 通过矩阵乘法得到注意力空间下的三组向量表示 querys = tf.tensordot(inputs, W_Query, axes=(-1, 0)) # (batch_size,field_size,att_embedding_size*head_num) keys = tf.tensordot(inputs, W_key, axes=(-1, 0)) values = tf.tensordot(inputs, W_Value, axes=(-1, 0)) 2.
AutoInt:使用Multi-head Self-Attention进行自动特征学习的CTR模型
上一篇
xDeepFM
下一篇
ESMM