【推荐系统】双塔模型中的负采样

作者:十方

推荐模型中双塔模型早已经普及.一个塔学用户表达.一个塔学item表达.很多双塔模型用各种各样的in-batch负采样策略.十方也是如此.往往使用比较大的batchsize,效果会比较好,但是由于内存限制,训练效率会比较低.这篇论文《Cross-Batch Negative Sampling for Training Two-Tower Recommenders》发现encoder的输出在warming up的训练过程后就比较稳定了,基于此提出一个高效负采样的方法Cross Batch Negative Sampling (CBNS),该方法充分使用了最近编码过的item embedding来加速训练过程.

CBNS

关于问题定义就不赘述了,双塔已经写了很多了,计算用户与item相似度也是用简单的点积。loss最典型的就是用sampled softmax:

提升训练效率,最好使的就是batch内负采样了,如下图(a)所示。

参考sampled softmax机制,论文修改上述公式为:

其中q(I)为采样偏差。接下来就要说到cross-batch negative sampling,这个方法可以解决in-batch负采样中,存在batch size受到gpu显存大小,从而影响模型效果。在训练过程中,我们往往认为过去训练过的mini-batches是无用废弃的,论文中则认为这些信息可以反复利用在当前负采样中因为encoder逐渐趋于稳定。论文中用下式评估item encoder特征的偏移:

如上图(b)所示,在早期学习率较大的时候,encoder编码相同item的变化是很大的,随着训练过程的推进,学习率逐渐降低,特征逐渐趋向于稳定,如下图所示

这时候我们可以充分利用稳定的embedding作为负样本。但是用历史的embedding会给梯度带来偏差,论文有证明这个偏差影响是很小的:

考虑到训练前期embedding波动较大,在warm up过程中先使用简单的in-batch内负采样,然后使用一个FIFO memory bank,存放M个历史item embedding

q(I)表示第i个item的采样概率。CBNS的softmax如下式所示:

在每次迭代结束,都会把当前mini-batch的embedding和采样概率加入memory bank.在下次训练过程中,除了使用batch内负样本,同时也会从memory bank中拉取负样本.

实验

对比不同采样策略下的表现:

以及在不同模型下验证集的召回和NDCG曲线:

同时论文还对比了M大小/负样本数对效果的影响:


往期精彩回顾



适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推荐系统双塔模型是一种常见的推荐算法模型,可以用 PyTorch 来实现。 在这种模型,有两个塔,分别用于处理用户和物品的信息。用户塔和物品塔的架构相同,通常包括几层神经网络层,例如全连接层、激活函数层等。这两个塔的目的是提取用户和物品的特征向量,然后将它们进行点积计算,得到用户对物品的评分。 下面是一个简单的双塔模型的 PyTorch 实现代码: ``` python import torch import torch.nn as nn class DoubleTower(nn.Module): def __init__(self, num_users, num_items, embedding_size, hidden_size): super(DoubleTower, self).__init__() self.user_embedding = nn.Embedding(num_users, embedding_size) self.item_embedding = nn.Embedding(num_items, embedding_size) self.user_layers = nn.Sequential( nn.Linear(embedding_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), nn.ReLU(), ) self.item_layers = nn.Sequential( nn.Linear(embedding_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), nn.ReLU(), ) def forward(self, user_ids, item_ids): user_emb = self.user_embedding(user_ids) item_emb = self.item_embedding(item_ids) user_vec = self.user_layers(user_emb) item_vec = self.item_layers(item_emb) pred = torch.sum(user_vec * item_vec, dim=1) return pred ``` 这个模型包含两个塔,每个塔由三个全连接层组成,用于提取用户和物品的特征向量。在 forward 方法,我们首先通过嵌入层获取用户和物品的嵌入向量,然后分别通过塔的全连接层进行前向传播得到特征向量。最后,我们将用户和物品的特征向量点积得到用户对物品的评分。 在训练模型时,我们可以使用均方误差(MSE)作为损失函数,优化器可以选择 Adam 等常用的优化算法。同时,为了防止模型过拟合,我们可以使用 dropout 等正则化技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值