Press "Enter" to skip to content

[SIGIR2021] StackRec框架:加速训练100层序列推荐模型

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

现有的序列推荐算法大多采用浅层的神经网络结构。近日,发表在信息检索领域顶会SIGIR上的一篇论文发现,通过对残差块结构进行微小的修改,序列推荐模型能够使用更深的网络结构以进一步提升精准度,也就是,推荐模型也能够像计算机视觉领域的模型那样拥有100层以上的深度并获得最优性能。在此基础上,论文提出一个高效且通用的框架StackRec来加速深度序列推荐模型的训练,并应用到多种实际的推荐场景中。

 

 

论文下载:

 

https://www.zhuanzhi.ai/paper/0ba0a722f4bd379045a7312037ed8194

 

代码+数据下载:https://github.com/wangjiachun0426/StackRec

 

100层深的序列推荐模型

 

由于推荐系统中的数据稀疏性问题以及深度学习中的梯度消失、梯度爆炸问题,现有的序列推荐算法往往采用浅层的神经网络结构(一般不超过10层,例如GRU4Rec通常1层最优,SASRec通常2个残差块最优)。而StackRec论文发现,通过对序列推荐模型的残差块进行微小的修改,在残差块的残差映射上添加一个权重系数,极深的网络也能得到有效的稳定的训练,从而缓解过拟合问题。具体来说,如图1所示,我们可以对残差块中的残差映射 添加一个系数 ,来衡量残差映射的权重,信号传播公式为:

 

 

其中, 被初始化为0,使得残差块在初始化阶段表示为一个单位函数,从而满足动态等距理论 [1]。论文作者在NextItNet [2]上进行实验,发现当训练数据充足时,随着网络深度的增加,推荐模型的表现越来越好,最多可使用128层的深度并获得最优性能,如图2(b)所示。

 

 

图1 改进后的残差块结构图

 

 

图2 不同训练数据量和网络深度的影响

 

StackRec算法动机

 

加深序列推荐模型带来了明显的精准度提升,但训练时间也会受到影响。一方面,深度神经网络的训练本身就需要大量的时间来进行计算和迭代优化;另一方面,在现实应用中,推荐系统承载的用户数量和物品数量往往可达到成百上千万,交互记录数量可达到数百亿,这样大规模训练数据的使用也在一定程度上增加了特别深模型的训练时间。如何在不损失精准度的条件下提升深度序列推荐模型的训练效率是一个极具学术研究意义和商业应用价值的问题,StackRec论文对此进行研究和探讨。

 

论文对现有的深度序列推荐算法进行观察,总结了一些特点和规律:1)现有的深度序列推荐模型呈现为“三明治”结构,包含三个模块,底层是用于表示交互序列的嵌入表示层,顶层是用于生成预测结果概率分布的Softmax层,中间是多个隐含层(通常为残差网络)。网络的深度可以通过控制残差块的数量来改变。2)最近的研究工作CpRec [3]展示了深度序列推荐模型的中间层参数可以通过多种方式跨层共享。例如,CpRec顶部的层/块使用与底部完全相同的参数,从而减少参数的存储空间,实现模型压缩。3)如图3所示,在深度序列推荐模型的中间层中,每两个相邻残差块输出的特征图非常相似,这潜在地表明这些块在某种程度上具有相似的功能。

 

 

图3 残差块输出的特征图之间的余弦相似度

 

这些观察表明,中间层学习到的知识可以通过某种方式进行共享,因为它们存在高度的相似性。这启发了论文作者思考,能否先训练一个浅层推荐模型,然后复制其参数并堆叠出一个更深的模型。通过添加新的层,或许能够扩展模型容量,提高推荐精准度;通过为新加的层赋予较好的初始化参数,或许能够加快模型收敛,减少训练时间,事实上这种现象在CV和NLP等模型上也存在。

 

StackRec算法框架

 

StackRec算法的非常简单,就是采用对一个浅层序列推荐模型进行多次层堆叠(Layer Stacking),从而得到一个深层序列推荐模型。具体来说,训练过程包含以下步骤:1)预训练一个浅层序列推荐模型;2)对该模型进行层堆叠,得到一个两倍深度的模型;3)微调这个深层模型;4)将深层模型作为一个新的浅层模型,重复1)至3)直到满足业务需求。

 

 

图4 两种按块进行的堆叠方式示意图

 

对于步骤2),论文提出两种按块进行的堆叠方式:相邻块堆叠(Adjacent-block Stacking)和交叉块堆叠(Cross-block Stacking)。假设我们有一个训练好的拥有 块的模型(也就是浅层模型),那幺我们可以通过复制这个浅层模型的参数来构造一个拥有 块的深层模型。我们按照以下方式进行相邻块堆叠:对于 ,深层模型的第 个块和第 个块与浅层模型的第 个块拥有相同的参数。同理,我们按照以下方式进行交叉块堆叠:对于 ,深层模型的 个块和第 个块与浅层模型的第 个块拥有相同的参数。图4展示了相邻块堆叠和交叉块堆叠这两种堆叠方式, 假设为2。这两种堆叠方式是可以互相替代的。它们刚好对应了CpRec中两种按块进行的参数共享机制。

 

通过这两种堆叠方式,步骤1)中训练好的浅层模型参数可以迁移到深层模型中,这对于深层模型来说是一种很好的热启动方式。通过步骤3)的微调,深层模型能够快速收敛,达到其最优性能。这种方式比起标准的从头开始训练方式,能够获得一定程度的训练加速效果。而且StackRec算法可以循环执行上述堆叠过程,快速获得一个很深的模型。

 

StackRec算法是一个通用的框架,可以使用NextItNet、GRec、SASRec、SSEPT等深度序列推荐模型作为基准模型,提升它们的训练效率。论文作者使用NextItNet作为案例来阐述StackRec算法的使用,但在实验中也报告了StackRec算法在其它模型上的性能表现,以证明StackRec算法的通用性。

 

StackRec算法在三种场景中的应用

 

论文作者将StackRec算法应用到持续学习、从头开始训练、迁移学习这三种常见的推荐场景中。

 

(1) 持续学习场景

 

 

图5 持续学习场景中StackRec算法架构图

 

在真实的生产环境中,推荐系统会经历两个阶段:数据匮乏阶段和数据充沛阶段。在数据匮乏阶段,推荐系统处于使用初期,缺乏训练数据,无论是用户和物品数量还是交互行为数量都很有限。在这个冷启动阶段,由于训练数据过于稀疏,使用浅层的推荐模型就足以获得较好的性能。若使用深层的推荐模型,可能会遇到过拟合问题,而且还会导致无意义的计算成本。推荐系统部署上线后,随着新数据的产生,训练数据逐渐累积,推荐系统进入数据充沛阶段,原有的浅层模型表达能力不足,我们需要重新构建并训练一个更深的网络以获得容量更大的模型,从而实现更好的推荐精准度。

 

在这样的场景中,StackRec算法就能起到很大的作用,因为它能够从浅层模型中迁移有用的知识到目标深层模型中,加速深层模型的训练,这使得我们不需要从头开始训练一个模型。更具前瞻性的是,真实的推荐系统会持续产生新的训练样本,最终能够变成终身学习(Lifelong Learning)系统。StackRec算法能够轻松地训练一个层数更多、容量更大的推荐模型,即时应用到终身学习系统中。我们将这种推荐场景命名为持续学习(Continual Learning,CL)场景。

 

算法 1 持续学习场景中的逐步堆叠

 

输入:初始块数 ,堆叠次数 ,训练样本

 

输出:训练好的拥有 块的模型

 

1 InitNextItNet( ){ 随机初始化NextItNet。}

 

2 Train( ){ 用样本 从头开始训练,直到收敛。}

 

3 for 1 to do{

 

4        Stack( ){ 执行堆叠操作,块数翻倍。}

 

5        Train( ){ 用样本 微调,直到收敛。}

 

6 }

 

7 返回模型 。

 

StackRec算法在CL场景中的使用如图5所示。假设 是训练样本, 是在系统上收集训练样本的时间刻度。在初始时刻,我们用样本 训练一个随机初始化的有 个块的浅层NextItNet,并将得到的模型 部署上线。推荐系统处于冷启动状态, 开始提供服务。当系统积累了更多的训练数据 ( 包含 ),模型 由于网络较浅,无法实现最优的性能。此时我们希望使用一个层数更多、表达能力更强的模型 ,于是,我们执行StackRec的堆叠操作,将NextItNet的层数翻倍为 个块。由于网络的连接突然发生变化,深层网络需要在样本 上进行微调直到收敛,即可得到模型 。真实的推荐系统每天都会产生大量新的数据,上述堆叠和微调操作可以重复执行下去。算法1展示了这样的逐步堆叠过程。事实上,按照这样的方式,StackRec可以被视作终身学习模型,轻松快捷地获得一个深度模型并投入使用。

 

(2)从头开始训练场景

 

在具体实践中,不同于持续学习场景,有时候我们需要从头开始训练一个新的深度序列推荐模型,而不利用旧模型的知识。在这种从头开始训练(Training from Scratch,TS)场景中,StackRec算法同样能够起到一定程度的训练加速作用。当我们需要一个深层模型时,我们可以先训练一个浅层模型若干步,接着使用StackRec算法将它复制并堆叠成深层模型,然后进一步训练它直到收敛。

 

与CL场景相比,StackRec算法在TS场景中的使用有两个不同点:1)浅层模型使用全部数据进行训练,而非部分数据;2)浅层模型不能训练直到收敛。如果我们知道训练一个模型直到收敛的总步数,那幺我们只需要训练浅层模型大约其 步即可。在TS场景中,StackRec算法能够帮助我们减少模型训练时间,是因为训练浅层模型所需时间更少,速度更快,并且堆叠方式中的知识迁移也带来一定的训练加速作用。值得注意的是,浅层模型和深层模型使用相同的数据进行训练,如果将浅层模型训练直到收敛,那幺深层模型会快速过拟合,无法找到更优的参数空间。算法 2阐述了StackRec算法在从头开始训练场景中的使用。

 

算法 2 从头开始训练场景中的逐步堆叠

 

输入:期望的块数 ,初始块数 ,堆叠次数 ,训练样本 ,训练步数

 

输出:训练好的拥有 块的模型

 

1 InitNextItNet( ){ 随机初始化NextItNet。}

 

2 Train( ){ 用样本 从头开始训练 步。}

 

3 for 1 to do{

 

4        Stack( ){ 执行堆叠操作,块数翻倍。}

 

5        Train( ){ 用样本 微调 步。}

 

6 }

 

7 返回模型 。

 

(3) 迁移学习场景

 

序列推荐模型可以通过无监督/自监督方式来训练,因此模型的输出可以被视作个性化的用户表示,并迁移到下游任务中,解决下游任务的用户冷启动问题。PeterRec是第一个展示序列推荐模型具有迁移学习能力的工作。受此启发,StackRec论文试图探索StackRec算法能否作为通用的预训练模型,有效地应用到下游任务中。

 

因此,在迁移学习(Transfer Learning,TF)场景中,我们可以使用StackRec算法训练一个深度序列推荐模型作为预训练模型,然后应用到下游任务中。根据实际业务需要,我们可以自由地选择使用CL场景中的StackRec算法过程,或是TS场景中的StackRec算法过程。论文作者按照CL场景的算法过程来展示StackRec算法在TF场景中的表现。事实证明,在TF场景中,StackRec算法同样能够用于加速预训练模型的训练,并且成功迁移到下游任务中,不损失预训练模型和目标模型的精准度。

 

实验

 

论文作者在ML20、Kuaibao和ColdRec这三个真实世界的数据集上进行大量实验,使用[email protected][email protected][email protected]这三个评估指标来评估模型的推荐精准度,并报告了相对于基准模型的训练加速比Speedup以分析训练效率。StackA-Next-k:代表使用相邻块堆叠方式的StackRec;StackC-Next-k:代表使用交叉块堆叠方式的StackRec,后缀-k表示所含块数。

 

(1)StackRec算法在持续学习场景中的表现

 

这个实验模拟了持续学习场景中数据不断增加的过程。由表1可见,首先,在ML20和Kuaibao这两个数据集上,NextItNet-8 ( ) 比NextItNet-4 ( ) 表现得更好,这表明当序列推荐模型拥有更多训练数据时,使用一个更深的网络结构能获得更高的精准度。其它设置( )下的实验结果也展示了相同的情况。然而,从头开始训练一个更深的模型需要花费更多的计算成本和训练时间。而StackRec模型,包括StackC-Next-8和StackA-Next-8,实现了与NextItNet-8 ( ) 同等甚至更好的推荐精准度,同时获得2.5倍的训练加速效果。这表明,使用好的参数初始化方式来热启动深度序列推荐模型,能使模型在微调过程中快速收敛,并保持同等的精准度。图6展示了相应的收敛过程,很明显,在相同的层数下,StackRec比NextItNet收敛更快,推荐精准度也略高。

 

表1 持续学习场景中的实验结果

 

 

 

图6 持续学习场景中的收敛过程

 

(2) StackRec算法在从头开始训练场景中的表现

 

为了获得一个32块的StackRec,首先可以训练一个8块的NextItNet(训练时间用黄色线表示),然后使用相邻块堆叠将它加深为16块,并执行微调(训练时间用橙色线表示);而后,进一步将它加深为32块,并训练直到收敛(训练时间用红色线表示)。

 

由图7可见,在ML20数据集上,StackRec总的训练时间缩短了40%(280分钟相对于490分钟),在Kuaibao数据集上则缩短了35%(480分钟相对于740分钟)。StackRec能够获得训练加速的原因在于:1)训练一个浅层模型需要的时间更少;2)从浅层模型迁移参数来热启动深层模型有助于训练收敛。

 

 

图7 从头开始训练场景中的训练曲线

 

(3) StackRec算法在迁移学习场景中的表现

 

为了检验StackRec算法的迁移学习能力,我们在ColdRec的源域数据集上使用StackRec算法预训练一个模型,然后简单地在最后一个隐含层后面增加一个新的Softmax层。原有的层使用预训练的参数,新的层使用随机初始化参数,随后,在目标域数据集上微调所有参数。

 

从表2可以看出,StackRec相比于NextItNet-16获得3倍的训练加速,并且它的精准度在预训练和微调后没有任何损失。在实际应用中,预训练模型通常需要使用一个大规模数据集进行长时间的训练,对高性能硬件资源和时间成本的需求阻碍了它的应用落地,预训练模型的训练效率成为迁移学习的关键问题。StackRec算法能在这样的迁移学习场景中起到很大作用。

 

表2 迁移学习场景中的实验结果

 

 

(4)另外,StackRec论文还进行了大量消融分析和通用性证明实验,包括不同堆叠方式的比较、不同堆叠块数的比较、不同基准模型的实例化等实验,以探究StackRec算法的合理性、有效性、灵活性和通用性。具体实验结果可查阅论文原文。

 

总结

 

StackRec论文探究了深度序列推荐模型中网络深度的影响,发现了模型隐含层之间具有很高的相似性,然后设计了相邻块堆叠和交叉块堆叠两种堆叠方式,并将算法实例化到NexItNet等多个序列推荐模型上,应用到持续学习、从头开始训练、迁移学习三个推荐场景中,在不损失推荐精准度的条件下,实现 2倍以上的训练加速效果。值得注意的是,StackRec仅仅适用于training阶段,对于线上推理阶段深度序列推荐模型加速问题,可以参考同时期工作SkipRec [4]发表在AAAI2021。

 

[1] Dynamical isometry and a mean field theory of cnns: How to Train 10,000- Layer Vanilla Convolutional Neural Networks. Xiao et al, ICML2018

 

[2] A Simple Convolutional Generative Network for Next Item Recommendation. Yuan et al. WSDM2019

 

[3] A Generic Network Compression Framework for Sequential Recommender Systems. Sun et al. SIGIR2020

 

[4] SkipRec: A User-Adaptive Layer Selection Framework for Very Deep Sequential Recommender Models. Chen et al. AAAI2021

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注