AutoInt模型——Transformer玩特征交互

浅层模型的FM, FFM, HOFM, FwFM到深层模型的DNN, PNN, NFM, AFM, DeepFM, DCN, xDeepFM, FiBiNet等,

关于特征交叉方向的模型paper, FiBinet模型通过SENET动态选择有用的交互特征, 然后再用一个双线性交互进行增强提高。在模型上并没有引入很复杂的结构,却能起到比较不错的效果。

本文中的AutoInt(Automatic Feature Interaction)模型是2019年发表在CIKM上的文章,重点也是在特征交互上,用到transformer结构,通过多头的自注意力机制显示地构造高阶特征,有效的提升了模型的效果。

和xdeepFM类似,针对目前很多浅层模型无法学习高阶的交互, 而DNN模型能学习高阶交互,但确是隐性学习,缺乏可解释性。而transformer把离散特征通过多个这样的交叉块堆积,学习到任意高阶的交互。

在Fibinet中整理到的在模型的特征重要性选择和特征交互时的两大思路:

  • 特征重要性选择 — 想到SENet和Attention机制
  • 特征交互 — 想到內积,哈达玛和双线性
  • 重要的一些网络模块:
    • DNN – 高阶隐性交互
    • FM – 低阶显性交互
    • CrossNet, CIN,transformer — 高阶显性交互

AutoInt把上面两个东西融合到了一起,在多头自注意力机制选择的时候, 自动完成了特征交互。并且还能学习到任意高阶交互。本文结构如下:

  • AutoInt模型的理论及论文细节
  • AutoInt模型的简单复现及结构解释
  • 总结

AutoInt模型的理论及论文细节

动机
  1. 浅层的模型会受到交叉阶数的限制,没法完成高阶交叉
  2. 深层模型的DNN在学习高阶隐性交叉的效果并不是很好, 且不具有可解释性
AutoInt模型的结构

在这里插入图片描述

Input Layer

输入层用到的特征主要是离散型特征和连续性特征,经过embedding层转成低维稠密的向量,连续性特征,这里并没有经过分桶离散化,而是直接走embedding。类似于预训练时候的思路,先通过item_id把连续型特征与类别特征关联起来,最简单的做法,就是把item_id拿过来,经过embedding层取出对应的embedding之后,再乘上连续值即可, 所以这个连续值需要预处理归一化的。

所以模型整体的输入如下:
x = [ x 1 ; x 2 ; … ; x M ] \mathbf{x}=\left[\mathbf{x}_{1} ; \mathbf{x}_{2} ; \ldots ; \mathbf{x}_{\mathbf{M}}\right] x=[x1;x2;;xM]
这里的 M M M 表示特征的个数, X 1 , X 2 X_{1}, X_{2} X1,X2 这是离散型特征, one-hot的形式,而 X M X_{M} XM 在这里是连续性特征。经过embedding层就是上面的做法。

Embedding Layer

embedding层的作用是把高维稀疏的特征转成低维稠密, 离散型的特征一般是取出对应的embedding向量即可,具体计算如下:
e i = V i x i \mathbf{e}_{\mathbf{i}}=\mathbf{V}_{\mathrm{i}} \mathbf{x}_{\mathbf{i}} ei=Vixi
对于第 i i i 个离散特征,直接第 i i i 个嵌入矩阵 V i V_{i} Vi 乘以one-hot向量,取出对应位置的embedding。

当然,如果输入的时候不是个one-hot,而 是个multi-hot的形式,那么对应的embedding输出是各个embedding求平均得到的。
e i = 1 q V i x i \mathbf{e}_{\mathbf{i}}=\frac{1}{q} \mathbf{V}_{\mathbf{i}} \mathbf{x}_{\mathbf{i}} ei=q1Vixi
而对于连续特征,也是过一个embedding矩阵取相应的embedding,不过,最后要乘一个连续值
e m = v m x m \mathbf{e}_{\mathbf{m}}=\mathbf{v}_{\mathbf{m}} x_{m} em=vmxm
这样,不管是连续特征,离散特征还是变长的离散特征,经过embedding之后,都能得到等长的embedding向量。把这个向量拼接到一块,就得到了交互层的输入。

在这里插入图片描述

Interacting Layer

这个是本篇论文的核心,描述了transformer块的前向传播过程。

通过embedding层,得到 M \mathrm{M} M 个向量 e 1 , … e M e_{1}, \ldots e_{M} e1,eM ,假设向量的维度是 d d d 维,那么这个就是一个 d × M d \times M d×M 的矩阵,我们定一个符号 X X X 。 接下来我们基于这个矩阵 X X X ,做三次变换,也就是分别乘以三个矩阵 W k ( h ) , W q ( h ) , W v ( h ) W_{k}^{(h)}, W_{q}^{(h)}, W_{v}^{(h)} Wk(h),Wq(h),Wv(h) ,这三个矩阵的维度是 d ′ × d d^{\prime} \times d d×d 的话,那么我们 就会得到三个结果:
Q ( h ) = W q ( h ) × X K ( h ) = W k ( h ) × X V ( h ) = W v ( h ) × X \begin{aligned} &Q^{(h)}=W_{q}^{(h)} \times X \\ &K^{(h)}=W_{k}^{(h)} \times X \\ &V^{(h)}=W_{v}^{(h)} \times X \end{aligned} Q(h)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_by

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值