机器之心发布
机器之心编辑部
推荐领域的模型压缩一直是个极具挑战性的问题,面对实际部署中数千万或亿级的推荐项,如何压缩才能获得最佳性能?由 SIAT-NLP 组与腾讯看点推荐团队共同完成的论文《A Generic Network Compression Framework for Sequential Recommender Systems》,提出了一个序列推荐模型框架「CpRec」,压缩率更高、训练和推断速度也更快。目前这篇论文已被 SIGIR 2020 接收。
原文链接:https://arxiv.org/pdf/2004.13139.pdf
提起模型压缩,很多人都非常熟悉。在实际应用部署中,推荐领域的模型压缩问题比较于 NLP 和 CV 更具挑战性, 工业级推荐系统例如 YouTube 与抖音, 参数量是大型 NLP 及 CV 模型(如 BERT-Large, ResNet-101)参数量的上百倍,原因在于工业推荐系统中存在千万乃至亿级别以上的推荐项目。而当前最优的序列推荐系统 (SRS) 模型通常是基于三明治结构的深度神经网络,通常这些模型需要大量参数(例如使用较大的嵌入维度或深层网络体系结构)才能获得最佳推荐性能。
这篇论文提出了一个序列推荐模型框架「CpRec」,其中使用了两种通用的模型压缩技术。具体来说,文中首先提出一种分块自适应分解方法,通过利用 SRS 中的推荐项服从长尾分布的事实来近似输入矩阵和 softmax 矩阵。为了减少中间层的参数,文中引入了三种分层参数共享方案。通过广泛的消融研究,文中证明了所提出的 CpRec 在现实世界的 SRS 数据集中可以实现高达 4-8 倍的压缩率。同时,CpRec 在训练和推断过程中速度更快,并且在大多数情况下胜过其未压缩的模型。相关工作也会在不久后开源。
分块自适应分解
如上图所示,本文中首先根据推荐系的频率对所有推荐项进行排序
,其中x_1和x_k分别是频率最高和最低的推荐项。将推荐项集合S划分为n个簇:
其中
。每个簇中推荐项的数量为
,且
,K为所有推荐项的数量。因此,可以将输入嵌入矩阵
如上图 (a) 分割为个n块
如上图 (b),其中 d 是嵌入大小。采用相似的策略,文中对输出 softmax 矩阵
分割为n个块
。接下来,文中分别描述了输入嵌入矩阵和输出 softmax 矩阵的分块自适应分解。
基于分块自适应分解的输入嵌入层
在输入层中,文中将块
分解为两个低阶矩阵
,其中
d_j是第j个块的因式分解维度(也称为秩)。由于高频率的推荐项应具有更高的表达能力,因此随着簇的索引增加,减小对应的d_j。相应地,每个推荐项的嵌入表示与通过原始的 look-up 操作的嵌入表示是不同的。给定推荐项标签 ID x,用下列的等式来表示其嵌入向量 为:
其中
表示第j个块的第g行的嵌入向量,
。通过这种因式分解,能将输入嵌入层的参数量从
减少到
。当
,输入嵌入层的参数量会明显减少。上图 (c) 阐述了这个分解过程。
基于分块自适应分解的输出 softmax 层
在输出 softmax 层,文中指出直接的在输出 softmax 层运用与输入层相同的策略会造成模型性能降低的问题。为了解决这些问题,通过二层树结构来构造这些块,其中每个树节点代表一个簇。上图 (d) 显示了输出 softmax 层的分块嵌入的范例。文中在输出 softmax 层中使用与输入嵌入层类似的分块嵌入的聚簇配置。一个主要的不同是输出层的第一个块矩阵被扩展为
, 其中n-1表示叶子节点所属的父类的数量。第一个簇的标签集合被扩展为
, 其中k_1 1到
对应于第 2 个到第 n 个簇的父类标签。在输出 softmax 层的其它的块矩阵为
, 其中
。对比于原始的 softmax 层,该方法能将输出 softmax 层的参数量从
减少到
。
论文中提到,在训练过程中,对于给定上下文向量
(即序列推荐模型的最终隐藏向量)的情况下预测下一个用户可能感兴趣的推荐项,需要首先根据下一个推荐的标签(例如x)确定搜索空间。如果属于第一个簇,则仅计算该簇中的logits。如果x属于其他簇,则在其父类所属簇(即第一个簇)和当前簇中计算。
为:
因此文中训练过程分为两个步骤:第一步,计算第一个聚类的,这需要
时间。在第二步,如果推荐项标签x属于叶子节点上的簇之一,则计算该簇的logits,这需要
时间。对比于使用原始的 softmax,文中将训练时间从O(K)减少到
和
之间。另外,文中在推断阶段也不需要为所有推荐项计算 softmax 概率,可通过提前停止搜索以加快生成过程。具体来说,如果前 N 个概率得分位于第一个簇中,不需要计算在其它簇的推荐项的概率分数。
分层参数共享
为了充分利用深度模型的堆叠层的优势,同时提高参数效率,该研究采用了多种参数共享策略。例如上图 (a) 是 ALBERT 采用的跨层参数共享方法,但在此条件下分析了在减少大量冗余参数的同时,神经网络模型的表达也受到了一定程度的限制,因此又提出一个高级版本「跨块参数共享」,如上图 (b)。
此外,研究还提出了另外两种分层的参数共享方法:相邻层和相邻块参数共享,分别为上图 (c) 和上图 (d)。具体地,相邻层参数共享表示每个残差块中的两个单独的层共享相同的参数集。相邻块参数共享表示在每两个相邻残差块之间共享参数。
这些参数共享策略被认为具有两个主要优点:(1)作为一种正则化方法,它们可以稳定训练过程并提高模型的泛化能力;(2)它们可以显着减少参数量,而不会像跨层参数共享那样降低性能。
CpRec 采用 NextitNet 模型实例化的架构图如下:
实验结果
这一部分主要以 NextItNet 框架实例化 CpRec,在 weishi、movielen、tiktok 和 ColdRec 等 4 个数据集上进行实验,另外由于序列推荐系统在不同序列长度的数据集下,表现不同,为展示其可靠性,采用 10、20、50 和 100 等 4 种序列长度对数据集进行预处理。文中采用多种评测指标,包括 MRR、HR 和 NDCC 等 3 个 top-N 评测指标以测评模型准确率,采用参数量 (Params)、训练时间 (Training Times) 和推测加速比 (Inference Speedup) 等指标以测评模型压缩表现。
结果显示,在该 4 个数据集的模型表现和压缩效果的评价指标中,CpRec 在推荐准确率与压缩效果上都具有比较好的表现。