本文是对《Learnable Embedding Sizes for Recommender Systems》一文的浅显翻译与理解,如有侵权即刻删除。
朋友们,我们在github创建了一个图学习笔记库,总结了相关文章的论文、代码和我个人的中文笔记,能够帮助大家更加便捷地找到对应论文,欢迎star~
Chinese-Reading-Notes-of-Graph-Learning
更多相关文章,请移步:文献阅读总结:网络表示学习/图学习
Title
《Learnable Embedding Sizes for Recommender Systems》
——ICLR2021
Author: Siyi Liu
总结
笔记参考:https://zhuanlan.zhihu.com/p/389037631
文章认为在网络表征学习和推荐系统模型中,固定的嵌入维度大小会造成大量的存储损耗和计算时长,而对维度的削减又会带来明显的效果下降。因此文章提出了PEP算法,通过为不同重要程度的特征设计不同的维度大小,来在大幅度减小模型参数量的同时保持模型原有效果。
1 问题定义
文章首先给出了基于特征的推荐系统模型通用表示,即该文章提出的方法能够广泛应用于各类基于特征的推荐系统模型中。具体而言,推荐模型将用户和商品的属性组合作为其输入向量x,其特征数设为M,则有:
根据特征向量x,可以生成对应的嵌入向量v有:
其中V_i是第i个特征域的嵌入矩阵,有:
在进行模型预测时,往往通过V与其他参数得到预测结果:
其中y^表示预测的概率,在模型训练过程中,为学习模型参数,将对如下损失进行优化:
其中D={x,y}表示输入到模型中的数据,x表示输入特征,y表示真实标签,这一优化目标的经典损失函数为:
以上即为推荐模型的通用训练流程,即给出特征和真实标签,通过对特征进行向量化处理来做标签预测,再将预测标签和真实标签做损失进一步缩小其差距。文章目的就在于,对特征进行向量化时,不同重要程度的特征会被分配不同的嵌入维度大小。
2 算法介绍
文章提出了PEP模型(Plug-in Embedding Pruning),目的在于对不同的特征嵌入执行不同的维度大小。然而不同维度的嵌入在存储时较为不便,因此文章采用归0的方法来达到剪枝效果,即对需要裁剪的维度位置进行归0化,使得其在实际计算中不起作用,见下图。
基于这一思想,文章设定了阈值k,即要求嵌入矩阵V中非零值不能大于等于k个:
其中||V||_0为L0范数,k为参数阈值。然而,由于L0范数约束的非凸性,使得优化该目标成为了一个NP难问题。虽然有先前工作对该范数进行扩展为L1,但在计算过程中仍然有着巨大的计算成本,且在这种情况下阈值k需要人为设置。
考虑到不同特征的重要性不同,人为设置阈值往往只能达到局部最优的结果。因此,文章受软阈值重参数化(Soft Threshold Reparameterization)的启发,通过梯度下降来更新阈值s,进而对V实现剪枝操作。
其中,sign函数会使得矩阵中正值归1,负值归-1,0值不动。从而,引入PEP框架后的通用优化模型变为:
在执行反向传播梯度优化的过程中,V的值将会更新如下:
为解决S的不可微性,文章使用次梯度优化来调整更新公式为:
在修剪完嵌入维度后,还要重新更新回模型进行训练。文章会保留原始模型的参数值,在维度剪枝完成后,返回原模型训练时,将这些参数值作为新的初始化值写回。
上述维度剪枝方法为全局剪枝,文章还给出了不同粒度的剪枝策略:
(1)维度粒度,阈值会被设置为一个维度为d的向量来对应嵌入维度,在特征嵌入中的不同维度值都会被独立修剪。
(2)特征粒度,阈值会被设置为一个维度为N的向量来对应特征数量,从而对不同的特征嵌入进行修剪。
(3)特征-维度粒度,阈值s会被设置为d*N的矩阵,来执行上述两种剪枝策略,以完成最细粒度的修剪。
3 代码
文章的伪代码如下:
文章提到,PEP是一个通用的框架,能够搭建在任意推荐模型上,事实上其实现过程也非常简便,基于pytorch的代码实现如下: