为什么用迁移学习
大量的研究根据建模的用户-物品交互序列生成推荐,效果也不错。但是很少有研究尝试表征和迁移这些模型从而用于下游任务,而数据样本通常是比较有限的,所以会考虑能否通过迁移学习,学习一个通用用户表征,并且将该用户表征应用到下游任务中,例如冷启动用户场景和用户画像预测等
问题与挑战
尝试以一种无监督训练方式预训练一个神经网络,然后将此神经网络迁移到下游任务中。为此,论文需要至少解决三个问题:
- 构造一个有效的预训练模型,能够建模超长用户点击序列;
- 设计一种微调策略,能够将预训练网络适配到下游任务。目前为止,没有相关文献证实这种无监督学习的用户表征是否对其他场景有帮助
- 设计一个适配方法,能够使得不同任务都能充分利用预训练网络参数,从而不需要微调整个网络,达到更加高效的迁移学习方式
腾讯看点是怎样做的
PeterRec 进行用户画像预测示意图。注意:PeterRec 不需要借助于任何图像和文本特征,仅需要用户点击物品 ID 即可。中间网络为大量堆叠的空洞卷积网络
空洞卷积神经网络
研究者提出采用空洞卷积神经网络构建大型的预训练模型。
- 优势:采用一定空洞率设置的多层卷积网络可以实现可视域指数级增长,从而捕获和建模超长的用户点击行为。
对比:
- RNN 网络:建模长序列时通常会遇到梯度消失和爆炸问题,并且并行训练低效
- Transformer 等:对显存需求和复杂度也会随着序列长度以二次方的级别增加
模型补丁
同时为了实现对预训练网络参数的最大化共享,论文提出了一种模型补丁方式,类似于植物嫁接技术,只需要在预训练网络插入数个的模型补丁网络,既可以实现预训练网络的快速迁移,效果甚至好于对整个模型全部微调
取得的效果
- 提出了一种通用用户表征学习架构,首次证实采用无监督或者自监督的预训练网路学习用户点击行为可以内用来推测用户的属性信息。这一发现将有望改进很多公共服务,带来更大的商业利润,同时也会引发甚至推动对于隐私保护的相关问题的研究;
- 提出了一种非常有效的模型补丁网络,网络相对于原来的空洞卷积层参数量更小,但是具有同等表达能力;
- 提出了两种模型补丁的插入方式,并行插入和串行插入;
方法细节
预训练
PeterRec 预训练网络(a)和微调网络(b)的参数分布
本研究预训练网络采用空洞卷积网络,每层空洞因子以 2^n 增加,通过叠加空洞卷积层达到可视域指数级的增加。
在预训练优化方式上,本文采用了两种自监督方式,分别是单向自回归方式以及双向遮掩法 ,分别对应因果卷积和非因果卷积网络,下图所示
采用空洞卷积网络的几种微调策略。(a)(b) 为因果卷机,(c)(d) 为非因果卷积
微调
微调方式非常简单,采用直接移除预训练 softmax 层,然后添加新任务的分类层
本文的主要贡献是在预训练的残差块(图 3(a))插入了模型补丁网络,每个模型补丁有一个瓶颈结构的残差块构成,如图 3(f)所示。本研究提出了几种可选择的插入方式,如图 3(b)(c)(d)。注意(e)的设计效果非常差,文章分析很可能是因为模型补丁的和操作,并行插入的和操作与原始残差网络的和操作夹杂在一起,影响最终优化效果。另外文中给出分析,通常模型补丁的参数量仅有原始空洞卷积的不到十分之一,但是可以达到与所有参数一起优化类似或者更好的效果。
实验结果
无监督预训练
论文首次证实采用无监督预训练方式非常有效,论文对比 PeterRec 的两种设置,有无预训练下的实验效果,如图 4 中所示 PeterRec 大幅度超越 PeterZero,证实了本研究预训练的有效性。
微调
以下是几种微调方式比较,如图 5 所示。图中证实 PeterRec 仅仅微调模型补丁和 softmax 层参数达到了跟微调所有参数一样的效果,但是由于仅有少数参数参与优化,可以很好的抗过拟合现象。
代码实践
开源代码
代码地址:https://github.com/fajieyuan/sigir2020_peterrec
- PeterRec_cau_parallel.py: PeterRec with causal cnn and parallel insertion
- PeterRec_cau_serial.py: PeterRec with causal cnn and serial insertion
- PeterRec_noncau_parallel.py: PeterRec with noncausal cnn and parallel insertion
- PeterRec_noncau_serial.py: PeterRec with causal cnn and serial insertion
- NextitNet_TF_Pretrain.py: Petrained by NextItNet [0] (i.e., causal cnn)
- GRec_TF_Pretrain.py: Petrained by the encoder of GRec [1] (i.e., noncausal cnn)
-
First: python NextitNet_TF_Pretrain.py
Second: python PeterRec_cau_serial.py -
First: python GRec_TF_Pretrain.py
Second: python PeterRec_noncau_parallel.py