「写在前面:」 这是一篇介绍 「【知识蒸馏】」 在 「【推荐系统】」领域应用的文章,算是知识蒸馏简述系列文章的延续,希望能对推荐领域的同学有所帮助。
以下是本文的主要框架:
- a brief review
-
kd & 推荐
-
conclusion
「1. a brief review」
「1-1 知识蒸馏回顾」
当我们训练一个深度学习模型时,常常面临模型效果与工程性能冲突的问题。
在监督学习中:
- 训练模型时,通常采用 「复杂模型」 或者 「ensemble」 方式来获取最好的结果,参数冗余严重。
-
前向预测时,需要对模型进行复杂的计算(或多个加权),导致工程性能较差
特别是在推荐系统中,系统需要从千百万级别的候选中挑选出用户最感兴趣的item。此时面临的模型效果和性能的冲突更为严重。
hinton在nips 2014workshop中提出知识蒸馏(knowledge distillation,下面简称kd)概念:
- kd定义:将 「复杂模型或者多个模型ensemble(teacher网络)」 学到的 「[知识 ]」 → 迁移到另一个 「轻量级模型( student 网络)」 ;辅助student网络的学习
-
目的:模型压缩、加速;也会应用于模型表现的提升
-
要求:在模型变轻量的同时(方便部署),尽量不损失性能
按照待迁移的知识类型,kd主要分为三个大类:
- 「输出迁移(output transfer)——将网络输出(logits或者softmax概率等)作为知识」
-
「特征迁移(feature transfer)——将网络学习的特征作为知识」
-
关系迁移(relation transfer)——将网络特征的关系或者样本的关系作为知识
其中,当下应用到推荐系统中的主要是前两个类别——输出迁移和特征迁移。为了方便关于”kd与推荐“部分的介绍,接下来将对这两大类方法进行简单的介绍。
「1-2 输出迁移」
输出迁移的思路为:「学生网络拟合教师网络输出层的输出(教师输出的结果」 )
输出迁移的网络训练分为两个阶段,以分类任务为例:
- 第一阶段:在原始数据集上,使用hard target(真实0, 1标签),训练好一个teacher网络。第一阶段的训练与普通的监督学习训练过程完全相同。teacher网络的loss为普通的交叉熵loss:l=cross entropy(x, y)
-
第二阶段:将teacher网络的输出结果soft target(logits输出或softmax的输出等,记作q)作为student网络输出的目标,训练student网络,使得student网络的结果p接近q。「student网络的loss分为两个部分:第一部分为student网络预估的结果在真实标签上的交叉熵loss,第二部分的kd loss为student网络的输出与teacher网络输出的差异。」 student网络的loss:l=α cross entropy(x, y) (1-α) cross entropy(p, q)
-
通过kd loss使得学生网络的输出“像”教师网络,使得教师网络输出的“知识”传递学生网络。最终使用student网络来进行预测。
distillingthe knowledge in a neural network
「1-3 特征迁移」
特征迁移的思路为:「学生网络拟合教师网络隐藏层的输出(教师抽取的特征)」
fitnets:hints for thin deep nets
该模型分为 「三阶段训练」 :
- 第一阶段:用ground-truth目标将教师网络训练好
-
第二阶段:让 最高层的输出拟合 最高层的输出用第一个loss(特征迁移),完成学生网络的参数初始化
-
第三阶段:用soft-target方式对学生网络进行蒸馏(输出迁移)
其中:
- 是教师网络的所有参数, 是学生网络的所有参数
-
是教师网络的部分层的参数(绿框) ; 是学生网络的部分层的参数 (红框)
-
是一个全连接层,用于将两个网络输出的size配齐(因为学生网络隐藏层宽度比教师网络窄)
这两篇paper是输出迁移和特征迁移中最最经典的两篇,后续的这两类kd的相关paper基本都与这两个算法相关。「特别地是,当下(截止2020年8月)kd与推荐系统结合的应用基本都是对这两个算法的借鉴与优化。」
「1-4 推荐系统」
常见的推荐系统一般分为召回、粗排、精排等几个主要的环节(有的推荐系统还包含混排等),根据这几个环节,我罗列了它们各自的特点。
「1-5 潜在应用?」
结合知识蒸馏与推荐系统的特点,我们大胆设想一下,kd与推荐系统结合会有哪些有意思的点呢?
- 在推荐系统的各个阶段都高度要求模型性能。受限于网络延时和性能要求,可以用复杂模型(如带有高阶特征交叉的模型,xdeepfm等)蒸馏的知识指导简单一些的模型进行学习
-
相对于精排模型而言,在粗排和召回里,本身就相对简单。粗排阶段,是否可以不仅仅优化ground-truth目标,是否可以用精排(teacher网络)输出的知识指导粗排或者召回模型的训练?
2 kd & 推荐
带着上面的设想,我们看一下几个知识蒸馏与推荐系统结合的一些工作。
「2-1 rocket launching: a universal and efficient framework for training well-performing light net」
「这是一篇将输出迁移应用到推荐系统领域的paper。」
「【诉求】:」
- 精排过程对模型工程性能要求高,复杂的模型(teacher网络)难以上线
-
通过知识蒸馏将复杂模型(teacher网络)的知识蒸馏给简单模型(studentr网络)
「【网络结构】:」
rocketlaunching
「【思路】:」
- 设计了两个网络模块booster(teacher,红色部分)和light(student,蓝色部分)网络
-
teacher网络和student网络 「同时进行训练,不再采用经典蒸馏中两阶段训练过程」
-
teacher网络和student网络share底层特征参数(黄色部分)
-
loss分为三个部分,教师网络和学生网络分别与ground-truth目标的交叉熵,教师网络和学生网络输出的差异:
「最终上线的模型是light net」
这里有个小问题需要注意,在rocket网络训练时,不再采用经典蒸馏网络两阶段训练的方式会带来一个小问题——教师网络的效果会受到学生网络的负面的影响(loss加在一起对参数进行优化)。为了避免这一点,作者提出了gradientblock的trick:
rocketlaunching部分参数的更新方式
- 教师网络独有部分的参数只用教师网络的loss更新
-
学生网络独有部分的参数用学生网络的loss和蒸馏loss更新
-
共享部分的参数用三部分loss更新
「【模型效果】:」
模型在cifar-10上的错误率为:
- wrn-16-1,0.2m——wide resnet(16层,wide参数为1,参数量0.2m);
-
kd——使用经典蒸馏网络后的base模型;
-
1. base——单独使用wrn-16-1训练的网络
-
2. rocket——用paper的架构训练出的base模型
-
3. rocket kd——用paper的架构训练出的base模型,hint loss使用经典蒸馏网络的loss(带参数温度t)
-
4. booster——用paper架构训练出的teacher模型
-
5. booster only——单独训练出的teacher模型
从效果上来看:
- 比较1和2可以发现,采用rocket的蒸馏架构后,小网络从大网络中明显地学习到了“知识”
-
比较4和5可以发现,使用单独的teacher网络训练的得到的结果还是最好的,但是与rocket网络中的大网络错误率接近;这说明gradient block结构比较有效地防止了小网络对于大网络的负面影响
-
比较kd与2可以发现,采用rocket的蒸馏架构后(一阶段训练),小网络的效果优于经典蒸馏网络(两阶段训练)中的小网络的效果。这点我持怀疑态度,感觉这个结论不一定普适于很多场景
此外,论文作者提到rocket网络的架构使得阿里妈妈广告预估auc提升0.3%。
「2-2 手淘推荐——privileged features distillation at taobao recommendations」
「这是一篇将输出迁移应用到推荐系统领域的paper」 。
「【诉求】:」
- 后验知识(点击商品详情页后发生的行为)有价值,但只能离线获取到,线上获取不到
-
通过知识蒸馏,将后验知识蒸馏到网络中
如下图所示,用户点击商品详情页之后会有进一步的行为,比如与客服沟通,看评论等等,这些行为对于推荐商品是有帮助的,但是这些信息在推荐系统实时推荐商品的时候获取不到。
猜你喜欢功能与商品详情页信息
「【网络结构】:」
手淘kd网络结构
**【思路 & loss】:**
- teacher网络和student网络share底层特征参数(x),x*是privileged features(后验特征与信息,teacher独有)
-
teacher网络和student网络同时进行训练,student网络拟合teacher网络的输出(输出迁移)
-
λ 系数是控制蒸馏loss的比例,因为是联合训练,前期教师网络准确度也不高,容易误导学生网络,因此前期λ 较小,后面会慢慢提高
-
最终使用student网络来进行预测
「2-3 爱奇艺推荐——双dnn模型」
「这是一个将输出迁移和特征迁移结合,应用到推荐系统领域的实践」 。
「【诉求】:」
- wide & deep模型转为xdeepfm模型,显式提取特征的高阶组合,提升模型效果
-
新模型qps过低,不能达到预期
「【网络结构】:」
「【思路】——rocket launching改进:」
- 设计了两个网络模块teacher网络和student网络
-
teacher网络和student网络同时进行训练
-
teacher网络(绿框)和student网络(黄框)share底层特征参数(红框),teacher网络多了feature interaction layer层(该层时teacher网络的核心,可以容纳各种特征交互层)
-
学生网络学习教师网络的隐层输出和logits输出(特征迁移 输出迁移)
最终效果为:
「2-4 ranking distillation: learning compact ranking models with highperformance for recommender system」
这篇paper我在 《知识蒸馏简述(二)》 已经分享过,因为是推荐和排序相关paper,有一定借鉴价值,因此也列在这里。
「【诉求】:」
- 检索系统或者推荐系统中模型庞大,可以用蒸馏网络的方式提升工程效率;
-
目标是给一个query,预测检索系统的top k相关的doc。
「【网络结构】:」
rankingdistillation网络结构
「【思路】:」
- 第一阶段训练教师网络,对于每个query预测top k相关doc,补充为学生网络的ground truth信息;
-
第二阶段教师网络的top k作为正例加到学生网络中一起进行训练,使得学生网络和教师网络的预测结果更像。
「【loss】:」
为每条教师网络中预测的样本的权重,有两种方式生成:
- 对位置进行加权(即,top 1到k的顺序);
-
对排序相关性进行加权(考虑教师网络预测的的item与query的相关性程度)。
3 conclusion
-
从整个推荐系统的工作流程和业界的实践来看,在多个环节,知识蒸馏都值得尝试!我们在微信看一看的业务中,对蒸馏网络进行了尝试,效果还不错^_^
-
推荐中每个环节都有可以尝试知识蒸馏的场景:
-
线上模型往往存在性能瓶颈,导致模型不能过于复杂;但为了提升效果,模型“需要”复杂;某些序列模型前向计算很慢(比如rnns), 这几者是天然冲突的
-
后验知识,在线获取不到但是离线可以获取到
-
「蒸馏在这方面的价值是,可以用简单模型获取部分复杂模型的“收益”」
3. 在工业届的推荐系统精排中,知识蒸馏的效果已经得到了验证;但是粗排中,还鲜有提及。如果打破推荐不同环节之间的壁垒:
- 可以获取每个doc是否点击的信息 精排输出的概率、logits等信息;用这些信息来指导粗排、召回模型的训练
-
「蒸馏在这方面的价值是,用复杂模型精排的输出、知识指导粗排」
4. 可以选择输出迁移和特征迁移的方法,低成本进行尝试和迭代。
5.蒸馏的本质是要定义好“知识”和衡量“知识差异”的函数。对于整个深度网络而言,网络的输出、网络隐藏层输出,网络层与层之间的关系等都可以定义为知识;至于如何衡量“知识差异”,可以采用交叉熵、mse、kl散度、js散度等方式来衡量两个输出或者分布的差异,让两个输出越来越“趋同”。