文章目录
- 0.交叉特征
- 1.NCF
- 1.1 问题:基于FM的问题
- 问题
- 动机:神经网络替代点积
- 1.2 NCF模型图
- 1.3代码
- 2. Deep Crossing:微软:ResNet
- 3.Deep&Cross
- 4. AutoInt(19)
- 摘要
- 贡献
- 相关工作:
- 模型结构
- 优缺点
- 实验效果
- 代码
- 5. AFN(20)
- LNN
- AFN
- code
- 比较
- NFM
0.交叉特征
在这里插入图片描述
1.NCF
1.1 问题:基于FM的问题
问题
FM->MF来自于矩阵分解的思想,所以也有矩阵分解的问题
实际上u1和u4更相似,但没有交互不代表不想似,而latent space隐式空间考虑的是交互。
所谓潜在因素就是虽然用户与项目间有交互,但不一定用户就喜欢了,而没交互也不代表不喜欢,这就对隐形学习带来了噪音
动机:神经网络替代点积
直接使用DNN从数据中学习交互函数(以代替MF的内积交互部分),从而突破了由于MF表达时的限制
1.2 NCF模型图
-
GMF:通用矩阵分解,线性部分
yui^=aout(hT(pu⊙qi))\hat{y_{ui}}=a_{out}(h^T(p_u\odot q_i))yui^=aout(hT(pu⊙qi))
pup_upu:用户向量,qiq_iqi:商品向量?item
点乘,element-wise -
MLP:非线性部分
-
最终
NCF(x)=yui^=σ(hT([pu⊙qi,MLP(pu,qi)]))NCF(x)=\hat{y_{ui}}=\sigma(h^T([p_u\odot q_i,MLP(p_u, q_i)]))NCF(x)=yui^=σ(hT([pu⊙qi,MLP(pu,qi)]))
- 上述两者共享Embeding
- 建议预训练:通用框架建议使用 GMF 和 MLP 的预训练模型来初始化NeuMF
- 初始化很重要:NeuMF的目标函数是非凸的,gradient-based会使得模型陷入局部最优
1.3代码
x = self.embedding(x)
user_x = x[:, self.user_field_idx].squeeze(1)
item_x = x[:, self.item_field_idx].squeeze(1)
x = self.mlp(x.view(-1, self.embed_output_dim))
gmf = user_x * item_x
x = torch.cat([gmf, x], dim=1)
x = self.fc(x).squeeze(1)
2. Deep Crossing:微软:ResNet
3.Deep&Cross
Cross+MLP
Cross:处理交叉特征(和FM功能一致)
4. AutoInt(19)
AutoInt
paper
挑战:
- (1)输入特征通常是稀疏高维的;
- (2)高阶特征组合能够带来效果,但耗费时间和人力
摘要
AutoInt,能够自动的学习输入特征的高阶特征交互。AutoInt是非常普适的,可以用于数值和类别输入特征。特别地,我们将数值化和类别化特征映射到同一个低维空间,然后,带有残差连接的multi-head self-attentive神经网络在低维空间显示地建模特征交互。由于multi-head self-attentive神经网络不同层的存在,不同阶的特征组合可以被建模。
贡献
- 我们提出研究显示学习高阶特征交互的问题,以及寻找可解释好的模型的问题;
- 我们提出基于self-attentive神经网络的方法,能够自动的学习高阶特征交互,有效的处理大规模高维稀疏数据;
- 我们通过实验证明了所提出方法,不仅有显著的效果,还有很好的模型解释性;
相关工作:
低阶特征交互:FM/FFM/AFM/GBFM
高阶特征交互:
- 隐式的方式:NFM,PNN、FNN、DeepCrossing、Wide&Deep、DeepFM-可解释性差
- 显示:Deep&Cross、xDeepFM-很难解释哪些组合特征是有用的
- 有效的训练方法:HOFM-参数过多
模型结构
优缺点
优点:
1.找到意思相近的embedding并进行组合,形成一些可解释性较强的组合特征;
2.大量的实验也验证这种方式的高阶交叉组合的优势;
缺点:
1.个人感觉还是未能充分挖掘有意义的高阶交叉特征;此处的组合只是找到了关系相近的特征,关系相近的特征进行组合并不一定是合适的方式,也就是说multi-head selfattention能做到有意义的特征组合,但却不能说明关系不相近的特征的意义就不大。
————————————————
版权声明:本文为CSDN博主「凝眸伏笔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pearl8899/article/details/106747210
实验效果
代码
AFI(x)=linear(x)+fc(crossterm+res_fc(lz))+mlp(lz),cross_term=multi...(multi−headi(att_fc(lz)),lz=embed(x)AFI(x)=linear(x)+fc(cross_term+res\_fc(l_z))+mlp(l_z),cross\_term=multi...(multi-head_i(att\_fc(l_z)),l_z=embed(x)AFI(x)=linear(x)+fc(crossterm+res_fc(lz))+mlp(lz),cross_term=multi...(multi−headi(att_fc(lz)),lz=embed(x)
class AutomaticFeatureInteractionModel(torch.nn.Module):"""A pytorch implementation of AutoInt.Reference:W Song, et al. AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks, 2018."""def __init__(self, field_dims, embed_dim, atten_embed_dim, num_heads, num_layers, mlp_dims, dropouts, has_residual=True):super().__init__()self.num_fields = len(field_dims)self.linear = FeaturesLinear(field_dims)self.embedding = FeaturesEmbedding(field_dims, embed_dim)self.atten_embedding = torch.nn.Linear(embed_dim, atten_embed_dim)self.embed_output_dim = len(field_dims) * embed_dimself.atten_output_dim = len(field_dims) * atten_embed_dimself.has_residual = has_residualself.mlp = MultiLayerPerceptron(self.embed_output_dim, mlp_dims, dropouts[1])self.self_attns = torch.nn.ModuleList([torch.nn.MultiheadAttention(atten_embed_dim, num_heads, dropout=dropouts[0]) for _ in range(num_layers)])self.attn_fc = torch.nn.Linear(self.atten_output_dim, 1)if self.has_residual:self.V_res_embedding = torch.nn.Linear(embed_dim, atten_embed_dim)def forward(self, x):""":param x: Long tensor of size ``(batch_size, num_fields)``"""embed_x = self.embedding(x)atten_x = self.atten_embedding(embed_x)cross_term = atten_x.transpose(0, 1)for self_attn in self.self_attns:cross_term, _ = self_attn(cross_term, cross_term, cross_term)cross_term = cross_term.transpose(0, 1)if self.has_residual:V_res = self.V_res_embedding(embed_x)cross_term += V_rescross_term = F.relu(cross_term).contiguous().view(-1, self.atten_output_dim)x = self.linear(x) + self.attn_fc(cross_term) + self.mlp(embed_x.view(-1, self.embed_output_dim))return torch.sigmoid(x.squeeze(1))
5. AFN(20)
问题:
- 他们必须在高阶交叉特征的表达能力和计算成本之间进行权衡,从而导致次优预测。
- 模型该使用多高阶的特征?因为使用上高阶特征是会对结果有益的,但是会带来更多的计算成本。
- 枚举所有交叉特征,包括不相关的特征,可能会引入噪声特征组合,从而降低模型性能。
- 哪些交叉的特征是有用的
目前的交叉特征都限定了阶数
- 哪些交叉的特征是有用的
优点:
- 可以从数据中学习任意阶的特征。
核心思想:
- 引入对数mic变换,将特征对数化,再去做交叉运算。这样能将特征组合中每个特征的幂转换为带系数的乘法。
LNN
乘法转化为加法–>加权求和–>任意阶的高阶特征
约等于FM?
AFN
code
AFN(x)=linear(x)+mlp(LNN(lz)),lz=embed(x)AFN(x)=linear(x)+mlp(LNN(l_z)),l_z=embed(x)AFN(x)=linear(x)+mlp(LNN(lz)),lz=embed(x)
embed_x = self.embedding(x)
lnn_out = self.LNN(embed_x)
x = self.linear(x) + self.mlp(lnn_out)
比较
NFM
NFM(x)=linear(x)+mlp(FM(x))NFM(x)=linear(x)+mlp(FM(x))NFM(x)=linear(x)+mlp(FM(x))
AFN(x)=linear(x)+mlp(LNN(lz)),lz=embed(x)AFN(x)=linear(x)+mlp(LNN(l_z)),l_z=embed(x)AFN(x)=linear(x)+mlp(LNN(lz)),lz=embed(x)