文献阅读:Cross-Batch Negative Sampling for Training Two-Tower Recommenders

本文探讨了一种新颖的跨批次负采样(Cross-Batch Negative Sampling, CBNS)方法,针对双塔推荐系统中的负样本问题。作者介绍了传统负采样挑战,提出CBNS通过复用早期批次的embedding,降低计算成本,但需注意训练后期模型稳定性的条件。实验结果显示CBNS在某些架构上有效,但效果未超越MNS和uniform采样。

文献链接:https://arxiv.org/pdf/2110.15154.pdf

1. 问题描述

这篇文章是今年入选到sigir的一篇文章,他针对的同样是双塔推荐系统当中的负采样问题。

关于推荐系统的负采样问题,事实上我们在之前的论文笔记(文献阅读:Mixed Negative Sampling for Learning Two-tower Neural Networks in Recommendations)当中也讨论过对应的内容,其主要的痛点在于说数据本身缺乏负反馈信号,因此我们只能将全部的其他样本都作为负信号来让模型学习正样本与其他样本之间的相对关系,具体到实现层面,就是用其他的一堆样本作为负采样进行模型训练。

而有关负采样的方式,常见的包括以下三种:

  1. inbatch sampling
  2. MNS(mixed negative sampling)
  3. uniform sampling

而在具体的使用当中,则往往需要根据实际的场景来平衡效果和计算效率,然后看一下具体的使用方式。

整体上来说,单就效果而言,肯定是uniform是最好的,但是其计算开销也是最大的,然后inbatch sampling虽然效果偏差,但是其计算开销是最小的,因此在业界似乎使用地非常频繁。然后MNS给我的感觉就是类似前面两者的缝合怪,效果上来说也貌似就是前述二者的一个折中。

而这篇文章当中,本质上也是要优化负采样问题,不过较之MNS的暴力缝合,这篇文章的方法显得更加优雅一些,他的核心思路是跨batch的进行负例采样,并利用encoder在训练过程中的稳定性来保证计算成本几乎可以保持和inbatch采样方式一致。

2. 方法优化

下面,我们来看一下其具体的采样方法。

其采样思路其实很直接,就是我保留下前几个batch的计算结果,然后添加到一个队列当中,然后直接应用到后续的计算当中直接取用之前的计算结果来加入到我的负例当中,由此,就可以将负例的选择范围从当前的batch扩展到前后连续的几个batch范围内。

但是,这里的思路成立的一个大前提是,之前的模型计算的embedding是可以复用的。而这个假设是不显然成立的,因为很明显,每一个batch计算完成之后模型都会对参数进行更新,因此原则上计算得到的embedding结果是必然会发生变化的,因此上述假设正常来说是不可能成立的。

不过,这篇文献给出了一定的数学证明,证明了在参数更新前后模型的item embedding的变化是可以找到一个上界的,尤其在训练的后期,embedding的变化是相对较小的,因此确实可以视之为相对稳定的,也就是说,之前的计算结果可以直接扔到后续的训练过程当作计算结果而减少计算量。

但是,如前所述,这里需要稍微注意的是,前期由于训练参数更新较大,因此这个策略在前期是不会使用的,而是在经过一个warm up,在模型有了一定的训练基础之后才会加入上述cross batch训练策略。

3. 实验结果考察

现在,我们来看一下其具体的实验结果。

文中在公开的amazon数据集上对不同的模型架构进行了实验,得到结果如下:

在这里插入图片描述

可以看到:

  • 在YouTubeDNN,GRU4Rec以及MIND等架构当中,CBNS策略都是有效的,且都能够获得较好的效果。

另外,文章中还考察了负采样数量对训练结果的影响,对应结果图如下:

在这里插入图片描述

可以看到:

  • 对于不同的模型架构,CBNS采样都是有效的,但是对应的最优实验参数配置需要对应的进行一定的微调。

4. 结论

整体来说,关于这篇文章的改进点,个人觉得非常的fancy,尤其是数学上证明参数更新前后embedding变化较小这一点,个人觉得可以玩的空间还很大。

不过对于CBNS采样方案本身,个人表示很怀疑,感觉非常奇怪。

本质上来说,如果batch size比较大,那么inbatch采样的最大问题在于说SSB,即用户反馈行为覆盖的数据集与全数据集存在一定的偏差,这也是uniform采样能够干趴下inbatch采样的最本质原因。

但是cross batch采样并无法带来这个问题的优化,长尾数据依然无法被看到,虽然执行效率上可以有所提升,但是上述实验结果中显示结果居然在效果上面干趴下了MNS和uniform采样方案,这个就让人感觉有点无法理解了。

倒不是认为实验作假,但是感觉性能提升的最关键原因必然不是由于CBNS的问题,也许换一个数据集CBNS方案就废了,或者就是复用之前的embedding计算结果的时候somehow刚好模拟了长尾数据的表达,但横竖不觉得是cross batch采样本身带来的效果的提升。

当然,以上仅仅是我个人的观点,也没有经过实验的论证,后续如果有时间的话可能会做实验进行一下简单地考察,如果上述哪里我的理解有什么问题,也欢迎大家批评指正。

在运行 `train.py` 脚本时,如果遇到错误提示类似 `error: unrecognized arguments: batch-siz5e`,这通常表示命令行中传递了一个未被脚本识别的参数名称。这种问题可能由以下几种原因导致: 1. 参数拼写错误,例如将 `--batch-size` 错误地写成 `--batch-siz5e`,其中包含了数字或多余的字符。 2. 参数名大小写不匹配,比如脚本期望的是 `--batch_size`,但用户输入了 `--Batch_Size` 或其他形式。 3. 参数本身并不存在于脚本定义的参数列表中。 为了修复这个问题,可以按照以下步骤进行检查和调整: - **确认参数拼写**:仔细检查命令行中的参数名称是否正确,确保没有拼写错误。例如,应使用 `--batch-size` 而不是 `--batch-siz5e` [^1]。 - **查看脚本支持的参数**:可以通过运行 `python train.py --help` 来查看脚本支持的所有参数列表,从而确认你使用的参数是否有效 [^1]。 - **检查参数格式**:某些脚本可能对参数格式有特定要求,比如是否需要使用短横线(`--`)或单横线(`-`),或者是否接受缩写形式。 ### 示例修正 假设你在运行训练脚本时使用了如下命令: ```bash python train.py --batch-siz5e 64 ``` 而正确的参数应该是 `--batch-size`,那么你需要将其更正为: ```bash python train.py --batch-size 64 ``` 如果你不确定参数名称是否正确,可以参考脚本中定义参数的地方,通常是通过 `argparse` 模块来实现的,例如: ```python import argparse parser = argparse.ArgumentParser(description='Training script') parser.add_argument('--batch-size', type=int, default=32, help='input batch size for training (default: 32)') args = parser.parse_args() ``` 上述代码片段展示了如何定义一个名为 `--batch-size` 的参数,其类型为整数,默认值为 32,并附带了帮助信息说明该参数的作用 [^1]。 ### 总结 要解决 `unrecognized arguments` 错误,关键是确保所有传递给脚本的命令行参数都与脚本中定义的参数完全匹配。此外,熟悉脚本作者提供的文档或帮助信息也能帮助快速定位问题所在。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值