什么是网站链接优化,北京通州网站制作公司,百度工具,九江市住房和城乡建设局官方网站来源#xff1a;AI科技评论作者 | 张俊杰编辑 | 丛 末本文首发于知乎 https://zhuanlan.zhihu.com/p/143155437随着深度学习的快速发展#xff0c;优秀的模型层出不穷#xff0c;比如图像领域的ResNet、自然语言处理领域的Bert#xff0c;这些革命性的新技术使得应用效果快… 来源AI科技评论作者 | 张俊杰编辑 | 丛 末本文首发于知乎 https://zhuanlan.zhihu.com/p/143155437随着深度学习的快速发展优秀的模型层出不穷比如图像领域的ResNet、自然语言处理领域的Bert这些革命性的新技术使得应用效果快速提升。但是好的模型性能并非无代价的你会发现深度学习模型正在变得越来越复杂网络深度越来越深模型参数量也在变得越来越多。而这会带来一个现实应用的问题将这种复杂模型推上线模型响应速度太慢当流量大的时候撑不住。知识蒸馏就是目前一种比较流行的解决此类问题的技术方向。一般知识蒸馏采取Teacher-Student模式将复杂模型作为TeacherStudent模型结构较为简单用Teacher来辅助Student模型的训练Teacher学习能力强可以将它学到的暗知识Dark Knowledge迁移给学习能力相对弱的Student模型以此来增强Student模型的泛化能力。复杂笨重但是效果好的Teacher模型不上线就单纯是个导师角色真正上战场挡抢撑流量的是灵活轻巧的Student小模型。比如Bert因为太重很难直接上线跑目前很多公司都是采取知识蒸馏的方法学会一个轻巧但是因为被Teacher教导过所以效果也很好的Student模型部署上线。1知识蒸馏典型方法目前知识蒸馏已经成了独立研究方向各种新技术层出不穷。但是如果粗略归纳一下的话主流的知识蒸馏技术有两个技术发展主线Logits方法及特征蒸馏方法。我们先简单说明下Logits方法的思路。在介绍之前首先得明白什么是Logits。我们知道对于一般的分类问题比如图片分类输入一张图片后经过DNN网络各种非线性变换在网络接近最后一层会得到这张图片属于各个类别的大小数值 某个类别的 数值越大则模型认为输入图片属于这个类别的可能性就越大。什么是Logits? 这些汇总了网络内部各种信息后得出的属于各个类别的汇总分值 就是Logits, i代表第i个类别 代表属于第i类的可能性。因为Logits并非概率值所以一般在Logits数值上会用Softmax函数进行变换得出的概率值作为最终分类结果概率。Softmax一方面把Logits数值在各类别之间进行概率归一使得各个类别归属数值满足概率分布另外一方面它会放大Logits数值之间的差异使得Logits得分两极分化Logits得分高的得到的概率值更偏大一些而较低的Logits数值得到的概率值则更小。上图中的公式 就是一个变体的Softmax公式如果把T拿掉或令T1则是个标准的Softmax公式 就是第i个类别的Logits数值 是Logits数值经过Softmax变换后归属于第i个类别的概率值。知道了什么是Logits后我们来说什么是Logits蒸馏方法。假设我们有一个Teacher网络一个Student网络输入同一个数据给这两个网络Teacher会得到一个Logits向量代表Teacher认为输入数据属于各个类别的可能性Student也有一个Logits向量代表了Student认为输入数据属于各个类别的可能性。最简单也是最早的知识蒸馏工作就是让Student的Logits去拟合Teacher的Logits即Student的损失函数为其中 是Teacher的Logits 是Student的Logits。在这里Teacher的Logits就是传给Student的暗知识。Hinton在论文“Distilling the Knowledge in a Neural Network”中提出了称为Softmax Temperature的改进方法并第一次正式提出了“知识蒸馏”的叫法。Softmax Temperature改造了Softmax函数公式参考上图引入了温度T这是一个超参数。如果我们把T设置成1就是标准的Softmax函数也就是极端两极分化版本。如果将T设大则Softmax之后的Logits数值各个类别之间的概率分值差距会缩小也即是强化那些非最大类别的存在感反之则会加大类别间概率的两极分化。Hinton版本的知识蒸馏让Student去拟合Teacher经过T影响后Softmax得到的其实也是让Student去学习Teacher的Logits无非是加入T后可以动态调节Logits的分布。Student的损失函数由两项组成一个子项是Ground Truth就是在训练集上的标准交叉熵损失让Student去拟合训练数据另外一个是蒸馏损失让Student去拟合Teacher的LogitsH是交叉熵损失函数 是Student模型的映射函数 是Ground Truth Label 是Teacher的Logits 是Student的Logits 是Softmax Temperature函数 用于调节蒸馏Loss的影响程度。一般而言温度T要设置成大于1的数值这样会减小不同类别归属概率的两极分化程度因为Logits方法中Teacher能够提供给Student的额外信息就包含在Logits数值里。如果我们在蒸馏损失部分将T设置成1采用常规的Softmax也就是说两极分化严重时那么相对标准的训练数据也就是交叉熵损失两者等同Student从蒸馏损失中就学不到任何额外的信息。另外一种大的知识蒸馏思路是特征蒸馏方法如上图所示。它不像Logits方法那样Student只学习Teacher的Logits这种结果知识而是学习Teacher网络结构中的中间层特征。最早采用这种模式的工作来自于自于论文“FITNETSHints for Thin Deep Nets”它强迫Student某些中间层的网络响应要去逼近Teacher对应的中间层的网络响应。这种情况下Teacher中间特征层的响应就是传递给Student的暗知识。在此之后出了各种新方法但是大致思路还是这个思路本质是Teacher将特征级知识迁移给Student。因为介绍各种知识蒸馏方法不是我们的主题这里不展开了我们尽快切入主题。2知识蒸馏在推荐系统中的三个应用场景我们知道工业界常见推荐系统一般有三个级联的过程召回、粗排以及精排。召回环节从海量物品库里快速筛选部分用户可能感兴趣的物品传给粗排模块粗排环节通常采取使用少量特征的简单排序模型对召回物料进行初步排序并做截断进一步将物品集合缩小到合理数量向后传递给精排模块精排环节采用利用较多特征的复杂模型对少量物品进行精准排序。其中粗排环节根据具体应用可选可不选。那么在这种串行级联的推荐体系中知识蒸馏可以应用在哪个环节呢假设我们在召回环节采用模型排序FMFFMDNN双塔等模型那么知识蒸馏在上述三个环节都可采用不同环节采用知识蒸馏的目的可能也不太相同。也就是说精排、粗排以及模型召回环节都可以采用知识蒸馏技术来优化现有推荐系统的性能和效果这里的性能指的线上服务响应速度快效果指的推荐质量好。1精排环节采用知识蒸馏为何在精排环节采用知识蒸馏我们知道精排环节注重精准排序所以采用尽量多特征复杂模型以期待获得优质的个性化推荐结果。但是这同时也意味着复杂模型的在线服务响应变慢。若承载相同流量需要增加在线服务并行程度也就意味着增加机器资源和成本比如DNN 排序模型相对LRFM等非深度模型在线推理速度下降明显。此时我们面临两难选择要么上简单模型但是付出的代价是推荐效果不如复杂模型好要么上复杂模型虽说效果是提高了但是要付出额外的机器等资源及成本。有什么技术方案能够在两者之间做个均衡么就是说希望找到一个模型这个模型既有较好的推荐质量又能有快速推理能力。我们可以实现这一目标么可以的在精排环节上知识蒸馏模型即可。上图展示了如何在精排环节应用知识蒸馏我们在离线训练的时候可以训练一个复杂精排模型作为Teacher一个结构较简单的DNN排序模型作为Student。因为Student结构简单所以模型表达能力弱于是我们可以在Student训练的时候除了采用常规的Ground Truth训练数据外Teacher也辅助Student的训练将Teacher复杂模型学到的一些知识迁移给Student增强其模型表达能力以此加强其推荐效果。在模型上线服务的时候并不用那个大Teacher而是使用小的Student作为线上服务精排模型进行在线推理。因为Student结构较为简单所以在线推理速度会大大快于复杂模型而因为Teacher将一些知识迁移给Student所以经过知识蒸馏的Student推荐质量也比单纯Student自己训练质量要高。这就是典型的在精排环节采用知识蒸馏的思路。至于具体蒸馏方法后文会介绍。当然你也可以根据前文介绍的经典知识蒸馏方案自己试着想想应该怎么做。对于精排环节来说我觉得知识蒸馏比较适合以下两种技术转换场景一种是排序模型正在从非DNN模型初次向DNN模型进行模型升级在超大规模数据场景下从非DNN模型切换到DNN模型切换成本和付出的时间因素可能比你预想得要高尤其是线上服务环节切换到DNN模型导致大量增加在线服务机器成本这对于很多公司来说是无法接受的。如果在做模型升级的时候采取知识蒸馏方案导致的效果是相对线上的非DNN模型即使上一个蒸馏小模型效果也可能是有提升的同时在线服务占用资源能降下来相对直接上个复杂DNN模型在线服务速度快所以可以明显降低模型升级的成本这样可以相对容易地切换到DNN版本排序模型上来。第二种情况是目前尽管线上已经采用了DNN 排序模型但是模型还非常简单这个也有利用知识蒸馏优化效果的空间这种情形下现有在线模型的服务速度可能是足够快的因为在线服务模型还比较简单即使换成Student小模型在这方面估计也差不太多。但是可以期待通过知识蒸馏提升线上模型的推荐质量。我们可以离线训练一个复杂但是效果明显优于线上简单DNN排序模块的模型作为Teacher然后通过知识蒸馏训练一个可以代替目前线上模型的Student小模型。如果这样是有可能在响应速度不降的前提下模型效果上有所提升的。所以感觉这种情况也比较适合采用蒸馏模型。而对于其它情形比如目前线上已有较为复杂的DNN排序系统的业务或者公司至于是否要上知识蒸馏则需要面临一个权衡采用知识蒸馏线上服务模型从复杂模型切换成小模型肯定可以明显提高线上QPS减少服务资源效率提升会比较大但是有可能推荐质量比线上的大模型会有下掉。所以业务场景是否接受这种指标的临时下降这个问题的答案决定了不同的选择在有些业务场景下这是需要好好考虑考虑的。不同业务环境可能会作出不同的选择。2模型召回以及粗排采用知识蒸馏在模型召回环节或者粗排环节采取知识蒸馏的方案是非常自然的一个想法拓展而且非常合算。目前这块基本看不到完全公开细节的技术资料所以本文我重点谈谈在这块可能采用的技术和几位同学讨论出若干可能的方案会列在后面感兴趣的同学可以尝试一下在这里是很容易作出收益的所以特别值得关注与尝试相信这块用好了会对完成你的KPI有帮助。这里所谓的合算怎么理解呢因为召回或者粗排环节作为精排的前置环节有自己承担的独特职责需要在准确性和速度方面找到一个平衡点在保证一定推荐精准性的前提下对物品进行粗筛减小精排环节压力。所以这两个环节本身从其定位来说并不追求最高的推荐精度就算模型效果比精排差些这也完全不成问题毕竟在这两个环节如果准确性不足可以靠返回物品数量多来弥补。而模型小速度快则是模型召回及粗排的重要目标之一。这就和知识蒸馏本身的特点对上了所以在这里用是特别合算的。那么召回或者粗排怎么用蒸馏呢如果我们如上图所示用复杂的精排模型作为Teacher召回或粗排模型作为小的Student比如FM或者双塔DNN模型等Student模型模拟精排环节的排序结果以此来指导召回或粗排Student模型的优化过程。这样我们可以获得满足如下特性的召回或者粗排模型首先推荐效果好因为Student经过复杂精排模型的知识蒸馏所以效果虽然弱于但是可以非常接近于精排模型效果其次Student模型结构简单所以速度快满足这两个环节对于速度的要求再次通过Student模型模拟精排模型的排序结果可以使得前置两个环节的优化目标和推荐任务的最终优化目标保持一致在推荐系统中前两个环节优化目标保持和精排优化目标一致其实是很重要的但是这点往往在实做中容易被忽略或者因条件所限无法考虑这一因素比如非模型召回从机制上是没办法考虑这点的。这里需要注意的一点是如果召回模型或者粗排模型的优化目标已经是多目标的对于新增的模型蒸馏来说可以作为多目标任务中新加入的一个新目标当然也可以只保留单独的蒸馏模型完全替换掉之前的多目标模型貌似这两种思路应该都是可以的需要根据具体情况进行斟酌选择。由以上分析可见召回或粗排环节的知识蒸馏方案看上去貌似是为召回和粗排环节量身定制的推荐系统优化技术选项对于召回或者粗排优化来说应该是必试的一个技术选项。下面我们讨论下在推荐系统里在各个环节采用知识蒸馏的可能的具体方法。精排蒸馏有三篇公开文献可供参考而召回或粗排方面的蒸馏技术很少见相关公开资料所以后面列的多数是我和几位同学讨论的方案除个别方法有实践结果外大多方法仍处于设想阶段目前并未落地所以不能保证有效性这点还需要注意。1、精排环节蒸馏方法目前推荐领域里在精排环节采用知识蒸馏主要采用Teacher和Student联合训练Joint Learning的方法而目的是通过复杂Teacher来辅导小Student模型的训练将Student推上线增快模型响应速度。如上图所示所谓联合训练指的是在离线训练Student模型的时候增加复杂Teacher模型来辅助Student两者同时进行训练是一种训练过程中的辅导。从网络结构来说Teacher和Student模型共享底层特征Embedding层Teacher网络具有层深更深、神经元更多的MLP隐层而Student则由较少层深及神经元个数的MLP隐层构成两者的MLP部分参数各自私有。对于所有训练数据会同时训练Teacher和Student网络对于Teacher网络来说就是常规的训练过程以交叉熵作为Teacher的损失函数。而对于Student网络来说损失函数由两个部分构成一个子项是交叉熵这是常规的损失函数它促使Student网络去拟合训练数据另外一个子项则迫使Student输出的Logits去拟合Teacher输出的Logits所谓蒸馏就体现在这个损失函数子项通过这种手段让Teacher网络增强Student网络的模型泛化能力。也即H是交叉熵损失函数 是Student模型的映射函数 是Ground Truth Label 是Teacher的Logits 是Student的Logits 用于调节蒸馏Loss的影响程度。这个模型是阿里妈妈在论文“Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net”中提出的其要点有三其一两个模型同时训练其二Teacher和Student共享特征Embedding其三通过Logits进行知识蒸馏。对细节部分感兴趣的同学可以参考原始文献。爱奇艺在排序阶段提出了双DNN排序模型可以看作是在阿里的rocket launching模型基础上的进一步改进。如上图所示Student和Teacher共享特征Embedding参数层Student模型在损失函数中加入了拟合Teacher输出阶段的Logits子项这两点和rocket launching是类似的。主要改进有两点首先为了进一步增强student的泛化能力要求student的隐层MLP的激活也要学习Teacher对应隐层的响应这点同样可以通过在student的损失函数中加子项来实现。但是这会带来一个问题就是在MLP隐层复杂度方面Student和Teacher是相当的我们说过一般知识蒸馏老师要比学生博学那么在这个结构里Teacher相比student模型复杂在哪里呢这引出了第二点不同双DNN排序模型的Teacher在特征Embedding层和MLP层之间可以比较灵活加入各种不同方法的特征组合功能通过这种方式体现Teacher模型的较强的模型表达和泛化能力。爱奇艺给出的数据对比说明了这种模式学会的student模型线上推理速度是Teacher模型的5倍模型大小也缩小了2倍。Student模型的推荐效果也比rocket launching更接近Teacher的效果这说明改进的两点对于Teacher传授给Student更强的知识起到了积极作用。更多信息可参考双 DNN 排序模型在线知识蒸馏在爱奇艺推荐的实践2、召回粗排环节蒸馏方法上面介绍了阿里和爱奇艺在精排方面的两个知识蒸馏应用工作目前知识蒸馏应用在推荐领域的公开资料很少虽说上面两个工作是应用在精排目的是加快线上模型推理速度但是稍微改进一下也可以应用在召回模型以及粗排模型。假设我们打算使用上述方案改造召回或者粗排模型一种直观的想法是我们基本可以直接参照rocket launching的方案稍作改动即可。对于粗排或者召回模型来说一般大家会用DNN双塔模型建模只需要将粗排或召回模型作为Student精排模型作为Teacher两者联合训练要求Student学习Teacher的Logits同时采取特征Embedding共享。如此这般就可以让召回或粗排模型学习精排模型的排序结果。快手曾经在AICon分享过在粗排环节采取上面接近rocket launching的蒸馏技术方案并取得了效果。因双塔结构将用户侧和物品侧特征分离编码所以类似爱奇艺技术方案的要求Student隐层学习Teacher隐层响应是很难做到的。粗排尚有可能设计简单网络DNN结构的时候不采取双塔结构即可召回环节几无可能除非把精排模型也改成双塔结构可能才能实现这点但这样可能会影响精排模型的效果。但是问题是我们有必要这么兴师动众为了训练召回或粗排的蒸馏模型去联合训练精排模型么貌似如果这样,召回模型对于排序模型耦合得过于紧密了也有一定的资源浪费。其实我们未必一定要两者联合训练也可以采取更节省成本的两阶段方法。1召回蒸馏的两阶段方法在专门的知识蒸馏研究领域里蒸馏过程大都采取两阶段的模式就是说第一阶段先训练好Teacher模型第二阶段是训练Student的过程在Student训练过程中会使用训练好Teacher提供额外的Logits等信息辅助Student的训练。私以为精排环节貌似还是联合训练比较好而召回或粗排环节采取两阶段模式估计更有优势。为什么这么说呢你可以这么想如果我们的目的是希望训练一个小的Student精排模型貌似没有太大的必要采取两阶段训练过程因为无论是联合训练也好还是两阶段训练也好反正一大一小两个模型都需要完整训练一遍消耗的资源类似。而如果联合训练则还可以应用特征embedding共享、隐层响应学习等更多可选的技术改进方案。所以貌似没有太大必要改成两阶段的模式。但是如果是召回模型或粗排模型作为Student则情况有所不同。首先比如隐层响应等技术手段本来召回或粗排Student模型就无法使用粗排如果不用双塔而是简单DNN模型还是可以的所以联合训练相对两阶段训练增加的好处不明显。至于Student和Teacher特征Embedding共享如果是在两阶段模式下则可以改为使用Teacher训练好的特征Embedding初始化Student的特征这样貌似损失也不大所以两阶段模式相对联合训练模式在效果方面并无明显劣势。另外因为我们希望召回或者粗排模型学习精排模型而一般而言我们能够拿到一个已经训练好的精排模型比如最近上线的精排模型既然这样我们可以直接用当前已训练好的精排模型让它把用于召回模型的训练数据跑一遍给每个训练数据打上Logits信息然后就可以按照与联合训练完全一样的方式去训练召回蒸馏模型了优化目标是Ground Truth子目标和Logits蒸馏子目标。上图展示了这一过程。这样做明显我们节省了精排Teacher的联合训练迭代成本。不过这种方法是否有效不确定感兴趣的同学可以尝试一下不过推论起来应该是能保证效果的。上面的方法还是模仿精排蒸馏方式无非改成了相对节省资源的两阶段模式。这里我们关心另外一个问题对于召回蒸馏Student模型来说是否一定要优化那个Ground Truth子目标这可能要分情况看。按理说蒸馏模型带上Ground Truth优化目标肯定效果要好于不带这个子目标的模型。如果我们的召回模型或者粗排模型是单目标的比如就优化点击那么明显还是应该带上Ground Truth优化目标。但是事实上很可能我们手上的召回模型或粗排模型已经是多目标的了那么这种情况下其实蒸馏Student模型就没有太大必要带Ground Truth优化目标因为多目标已经各自做了这个事情了。这种情况下独立优化蒸馏目标然后将其作为多目标的一个新目标加入召回或粗排模型比较合适。所以我们下面介绍的方案就抛掉Ground Truth优化目标单独优化蒸馏目标。如果根据蒸馏Student模型是否需要参考Teacher提供的Logits信息来对方法进行分类又可以进一步划分为参考Logits信息的方案和不参考Logits信息的方案。按理说参考Logits信息效果应该好些但是这样Student仍然对Teacher有依赖而不参考Logits信息的方案比较独立基本不需要精排模型的直接介入所需信息直接可以在常规的推荐系统Log里拿到实现起来更具简单和独立性。而且如果精排模型已经是多目标的可能很难获得那个Logits数值但是我们能够拿到精排模块的排序结果这意味着Student在优化蒸馏目标的时候就已经朝着多目标进行优化了是一种在召回或粗排进行非精细化多目标方向优化的一种简洁手段所以有额外的好处。如果出于上述目的此时明显用非Logits方案更从容。综合而言从效果考虑应该考虑引入Logits从独立性和简洁性角度可以参考非Logits方案。这可能与现实场景相关。2Logits方案在召回或者精排采用知识蒸馏此时精排模型其实身兼二职主业是做好线上的精准排序副业是顺手可以教导一下召回及粗排模型。所以其实我们为了让Teacher能够教导Student在训练Student的时候并不需要专门训练一遍Teacher精排模型因为它就在线上跑着呢。而且我们抛开了Ground Truth优化子目标所以不需要Teacher对训练数据都过一遍而只需要多做一件事情线上精排模型在输出排序结果的时候对于当前判断User,Item,Context实例除了给出是否点击等判断外只要把对应优化目标的Logits数值输出并计入Log即可。这样召回或粗排模型可以直接使用训练数据中记载的Logits来作为Student的训练数据训练蒸馏模型上图展示了这一过程。所以综合看这种Logits方案是更节省计算资源的方案。当然上述都是我的个人推论实际效果如何还需要做对比实验才能说明问题。3Without-Logits方案另外一类方法可以进一步减少Student对Teacher的依赖或适用于无法得到合理Logits信息的场合即Student完全不参考Logits信息但是精排作为Teacher怎么教导Student呢别忘了精排模型的输出结果是有序的这里面也蕴含了Teacher的潜在知识我们可以利用这个数据。也就是说我们可以让Student模型完全拟合精排模型的排序结果以此学习精排的排序偏好。我们知道对于每次用户请求推荐系统经过几个环节通过精排输出Top K的Item作为推荐结果这个推荐结果是有序的排在越靠前的结果应该是精排系统认为用户越会点击的物品。那么我们其实可以不用Logits粗排或者召回环节的Student的学习目标是像精排模型一样排序。这时精排模型仍然是Teacher只是传给召回或粗排模型的知识不再是Logits而是一个有序的列表排序结果我们希望Student从这个排序结果里面获取额外的知识。如果这样的话对于目前的线上推荐系统不需要做任何额外的工作因为排序结果是会记在Log里的也可以用推荐系统在精排之后经过Re-ranker重排后的排序结果这样甚至可以学习到一些去重打散等业务规则只要拿到Log里的信息我们就可以训练召回或粗排的Student蒸馏模型。也就是说对于召回或者粗排模型来说它看到了若干精排的排序结果列表精排模型的知识就蕴含在里面而这可以作为Student模型的训练数据来训练蒸馏模型。很明显这是一个典型的Learning to Rank问题。我们知道对于LTR问题常见的优化目标包括三种Point Wise、Pair Wise和List Wise。于是我们可以按照这三种模式来设计召回模型或粗排模型的蒸馏学习任务。其中下面文中提到的Point Wise方式我们已亲试有效至于Pair Wise和List Wise蒸馏仍需实验才能证明是否有效。3、Point Wise蒸馏在Point Wise优化目标下理解召回模型蒸馏就是说我们把精排模型的有序输出结果作为训练数据把学习目标看作一个二分类问题通过这种方式试图学习精排模型的排序偏好。这种情况下分类模型的正负例如何设定呢我们不能把精排模型输出结果列表里用户行为过的Item作为正例因为这样你等于在学比如点击或者互动等用户行为模型而不是在学精排模型的排序偏好。一般而言可以这么做假设精排每次返回N个结果我们取列表前Top K的排序靠前的结果将其指定为正例位置K之后的例子作为负例。意思是通过排名最高的一部分数据来学习精排模型的排序偏好。这样我们就可以拿这些非标注的排序结果来训练召回模型。当然这里的K是个超参怎么定更合理可能需要实验来确定。上图展示了这一做法。通过这种方式我们就可以让召回模型从精排模型的排序列表中学到排序偏好知识达成知识蒸馏的目标。这种做法有个可以改进的点上述切分正负例的方法并未强调物品排序位置。比如假设K值取5就是排名前5的物品作为正例之后的作为负例。正例中排名Rank 1的物品和排名Rank 4的物品都各自作为一条正例没有差别。但是我们知道Rank 1应该排名比Rank 4更高但模型训练过程并没有利用这个信息。我们可以通过对正例引入Loss Weight的简单处理方法来引入这一信息比如引入一个跟位置相关的Weight函数其中Rank Position是Item的排名名次将其作为变量引入函数以此映射函数的数值作为正例的Loss Weight负例Loss Weight权重与常规训练一样可认为缺省Loss Weight权重为1。在具体设计这个函数的时候指导思想是希望这个函数能做到排名越靠前的正例对应的Loss Weight越大。将这个Loss Weight引入损失函数中就可以让模型更关注排名靠前的物品。比如我们可以这么定义函数这里Position是排名位置比如Rank Position1则Position1Rank Position4则Position4;通过这种定义就能使得排名靠前的正例对应的Loss Weight越大而a可以作为调节权重来放大或者缩小排名位置的影响。当然这里还可以引入其它各种花样的Loss Weight定义方法。热门微博尝试了上述思路FM版本的蒸馏召回模型多目标召回模型基础上增加蒸馏召回目标线上AB测试效果在时长、点击、互动等多个指标都有2%到6%之间的不同程度的提升作用目前正在尝试更多变体模型。4、Pair Wise蒸馏如果我们用Pair Wise Loss的方式来看待召回模型优化问题可以这么思考精排的排序结果是有序列表在列表内随机任意抽取两个Item都能维持序关系。那么很明显我们可以构造成对的训练数据以Item为正例以排在Item后面任意某个Item作为负例以此方式构造训练数据来训练模型。在推荐领域最常用的Pair Wise Loss是BPR损失函数于是我们可以如法炮制如上图所示假设对于排在第三位的Item作为正例可以抽取排名在其之后的Item构造足够多的成对训练数据以此目标来优化召回模型使得模型可以学会Item间的序列关系。对Pos,Neg成对的训练数据BPR损失函数希望某个预测系统能够对正例的得分要高于负例的得分具体计算方法如上图所示因为是个基础概念此处不展开介绍。论文Ranking Distillation: Learning Compact Ranking Models With High Performance for Recommender System 提出了使用Point Wise和Pair Wise Loss来使用Teacher的输出结果训练Student的方法文中说貌似上面这种BPR的Loss会导致Student训练不稳定有时不收敛所以这种模式还需要进一步探索成功路径。Ranking Distillation里采用的Point Wise Loss方式是比较成功的不过和上文介绍的Point Wise有个区别:对于Teacher输出的结果选择Top K的Item作为正例没有选取负例另外Student引入了Ground Truth作为Loss子项。文中还提出了几种比较有意思的Position Loss Weight方法。对具体细节感兴趣的同学可以参考。5、List Wise蒸馏Point Wise Loss将学习问题简化为单Item打分问题Pair Wise Loss对能够保持序关系的训练数据对建模而List Wise Loss则对整个排序列表顺序关系建模。List Wise Loss经常被用在排序问题中但是有个现实困难是训练数据不好做因为排序列表里每个Item的价值需要人工标注。我们来考虑下召回蒸馏模型的List Wise Loss优化目标怎么做的问题。既然我们能拿到大量精排给出的有序列表貌似我们是不缺训练数据的但是这里隐藏着个潜在的问题问题等会我们再说。我们先说个应用案例Instagram的推荐系统在初排阶段采用知识蒸馏的方法使用精排作为Teacher来指导Student的优化Student的优化目标用的是NDCG这是一种非常常用的List Wise Loss函数对Instagram推荐系统感兴趣的同学可以参考文章Instagram 推荐系统每秒预测 9000 万个模型是怎么做到的不过遗憾的是上述文章并未说明是具体怎么做的只能靠我们自己来摸索一下。其实细想一下在这里用NDCG来学习精排输出的有序列表这面临待解决的问题用NDCG是有前提条件的有序列表中的每个Item都需要带有一个价值分。比如对于搜索排序来说最相关Item是5分次相关Item是4分类似这种分数这一般是人工标注上的而List Wise Loss就希望排序系统能够将列表整体获得的价值分最大化。上面我们提到存在的问题就是精排系统只给出了Item之间的排序关系每个Item并没有提供对应的价值分。那么如果想用NDCG或者类似的其它List Wise 损失函数怎样才能得到列表内每个Item的价值分呢人工打标注显然是不现实的。这里感觉可以利用一下精排系统输出的Logits信息假设我们可以设计一个函数这个函数以Logits分数为输入变量将其映射到比如1分到5分几档上Logits得分越大则对应档次分越高。如果我们能做到这点就可以使用List Wise损失函数来训练召回或粗排模型了。这个函数定义有各种可能的方法这里不展开各位有兴趣的同学可以试试。如果我们想更简单点不用Logits分数那么有更加简单粗暴的方法比如强行将有序列表排在Top 5的Item设置成5分排在6到10位置的Item赋予4分…..类似这种。这等价于这么定义F函数的这个公式充分展示了工业界的简单暴力算法美学我相信类似的公式充斥于各大公司的代码仓库角落里。3联合训练召回、粗排及精排模型的设想如果我们打算把知识蒸馏这个事情在推荐领域做得更彻底一点比如在模型召回、粗排以及精排三个环节都用上那么其实可以设想一种“一带三”的模型联合训练方法。如上图所示我们可以设计一个很复杂但是效果很好的排序模型作为Teacher然后和召回、粗排、精排三个Student联合训练精排Student可以使用Logits以及隐层特征响应等各种手段优化追求效果好前提下的尽可能速度快召回和粗排Student则追求在模型小的前提下追求效果尽可能好。因为排序Teacher比较复杂所以能够提供尽可能好的模型效果通过它来带动三个环节蒸馏模型的效果而模型速度快则是蒸馏方法的题中应有之意。这样做有不少好处比如可以一次训练多环节收益再比如可以最大程度上保持推荐系统各个环节的目标一致性等做起来又不太难所以看上去是个可行的方案。最后归纳下全文推荐系统在各个环节采取知识蒸馏方法是可能达到提升推荐质量的同时提高推荐系统速度的一举两得比较容易产生效益所以是值得深入探索及应用的。致谢上面列的很多想法是在和几位同学的讨论中形成或完善的感谢微博机器学习佘青云、王志强等同学提出的思路和建议。未来智能实验室的主要工作包括建立AI智能系统智商评测体系开展世界人工智能智商评测开展互联网城市云脑研究计划构建互联网城市云脑技术和企业图谱为提升企业行业与城市的智能水平服务。 如果您对实验室的研究感兴趣欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”