【说在前面】本人博客新手一枚,象牙塔的老白,职业场的小白。如下内容仅为我的看法,欢迎批评指正,不喜勿喷![握手][握手]html
【再啰嗦一下】本文衔接上两个随笔:人工智能中小样本问题相关的系列模型演变及学习笔记(一):元学习、小样本学习python
【再啰嗦一下】本文衔接上两个随笔:人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GANgit
【再啰嗦一下】本文衔接上两个随笔:人工智能中小样本问题相关的系列模型演变及学习笔记(三):迁移学习面试
知识蒸馏被普遍的用于模型压缩和迁移学习当中。算法
本文主要参考:模型压缩中知识蒸馏技术原理及其发展示状和展望网络
知识蒸馏能够将一个网络的知识转移到另外一个网络,两个网络能够是同构或者异构。作法是先训练一个teacher网络,而后使用这个teacher网络的输出和数据的真实标签去训练student网络。架构
知识蒸馏是对模型的能力进行迁移,根据迁移的方法不一样能够简单分为基于目标驱动的算法、基于特征匹配的算法两个大的方向。app
Hinton最先在文章“Distilling the knowledge in a neural network”中提出了知识蒸馏的概念,即knowledge distilling,对后续的许多算法都产生了影响,其框架示意图以下:框架
从上图中能够看出,包括一个teacher model和一个student model,teacher model须要预先训练好,使用的就是标准分类softmax损失,可是它的输出使用带温度参数T的softmax函数进行映射,以下:机器学习
当T=1时,就是softmax自己。当T>1,称之为soft softmax,T越大,由于输入 zk 产生的几率 f(zk) 差别就会越小。之因此要这么作,其背后的思想是:当训练好一个模型以后,模型为全部的误标签都分配了很小的几率。然而实际上对于不一样的错误标签,其被分配的几率仍然可能存在数个量级的悬殊差距。这个差距,在softmax中直接就被忽略了,但这实际上是一部分有用的信息。
训练的时候小模型有两个损失:一个是与真实标签的softmax损失,一个是与teacher model的蒸馏损失,定义为KL散度。
当teacher model和student model各自的预测几率为pi,qi时,其蒸馏损失部分梯度传播以下:
能够看出形式很是的简单,梯度为二者预测几率之差,这就是最简单的知识蒸馏框架。
Hinton等人提出的框架是在模型最后的预测端,让student模型学习到与teacher模型的知识,这能够称之为直接使用优化目标进行驱动的框架,相似的还有ProjectionNet。
PrjojectNet同时训练一个大模型和一个小模型,二者的输入都是样本,其中大模型就是普通的CNN网络,而小模型会对输入首先进行特征投影。每个投影矩阵P都对应了一个映射,由一个d-bit长的向量表示,其中每个bit为0或者1,这是一个更加稀疏的表达。特征用这种方法简化后天然就可使用更加轻量的网络的结构进行训练。那么怎么完成这个过程呢?文中使用的是locality sensitive hashing(LSH)算法,这是一种聚类任务中经常使用的降维的算法。
优化目标包含了3部分,分别是大模型的损失,投影损失,以及大模型和小模型的预测损失,所有使用交叉熵,各自定义以下:
基于优化目标驱动的方法其思想是很是直观,就是结果导向型,中间怎么实现的不关心,对它进行改进的一个有趣方向是GAN的运用。
结果导向型的知识蒸馏框架的具体细节是难以控制的,会让训练变得不稳定且缓慢。一种更直观的方式是将teacher模型和student模型的特征进行约束,从而保证student模型确实继承了teacher模型的知识,其中一个典型表明就是FitNets,FitNets将比较浅而宽的Teacher模型的知识迁移到更窄更深的Student模型上,框架以下:
FitNets背后的思想是,用网络的中间层的特征进行匹配,不只仅是在输出端。它的训练包含了两个阶段:
(1)第一阶段就是根据Teacher模型的损失来指导预训练Student模型。记Teacher网络的某一中间层的权值Wt为Whint,意为指导的意思。Student网络的某一中间层的权值Ws为Wguided,即被指导的意思,在训练之初Student网络进行随机初始化。须要学习一个映射函数Wr使得Wguided的维度匹配Whint,获得Ws',并最小化二者网络输出的MSE差别做为损失,以下:
(2)第二个训练阶段,就是对整个网络进行知识蒸馏训练,与上述Hinton等人提出的策略一致。不过FitNet直接将特征值进行了匹配,先验约束太强,有的框架对激活值进行了归一化。
基于特征空间进行匹配的方法实际上是知识蒸馏的主流,相似的方法很是多,包括注意力机制的使用、相似于风格迁移算法的特征匹配等。
知识蒸馏还有很是多有意思的研究方向,这里咱们介绍其中几个。
机器学习模型要解决的问题以下,其中y是预测值,x是输入,L是优化目标,θ1是优化参数。
由于深度学习模型没有解析解,每每没法获得最优解,咱们常常会经过添加一些正则项来促使模型达到更好的性能。
Born Again Neural Networks框架思想是经过增长一样的模型架构,而且从新进行优化,以增长一个模型为例,要解决的问题以下:
具体的流程就是:
(1)训练一个教师模型使其收敛到较好的局部值。
(2)对与教师模型结构相同的学生模型进行初始化,其优化目标包含两部分,一部分是要匹配教师模型的输出分布,好比采用KL散度。另外一部分就是与教师模型训练时一样的目标,即数据集的预测真值。
而后经过下面这样的流程,一步一步往下传,因此被形象地命名为“born again”。
相似的框架还有Net2Net,network morphism等。
通常知识蒸馏框架都须要包括一个Teacher模型和一个Student模型,而Deep mutual learning则没有Teacher模型,它经过多个小模型进行协同训练,框架示意图以下。
Deep mutual learning在训练的过程当中让两个学生网络相互学习,每个网络都有两个损失。一个是任务自己的损失,另一个就是KL散度。因为KL散度是非对称的,因此两个网络的散度会不一样。
相比单独训练,每个模型能够取得更高的精度。值得注意的是,就算是两个结构彻底同样的模型,也会学习到不一样的特征表达。
在进行知识蒸馏时,咱们一般假设teacher模型有更好的性能,而student模型是一个压缩版的模型,这不就是模型压缩吗?与模型剪枝,量化先后的模型对比是同样的。因此知识蒸馏也被用于与相关技术进行结合,apprentice框架是一个表明。
网络结构如上图所示,Teacher模型是一个全精度模型,Apprentice模型是一个低精度模型。
若是您对智能推荐感兴趣,欢迎浏览个人另外一篇博客:智能推荐算法演变及学习笔记 、CTR预估模型演变及学习笔记
本文主要参考:知识蒸馏在推荐系统中的应用
深度学习模型正在变得愈来愈复杂,网络深度愈来愈深,模型参数量也在变得愈来愈多。而这会带来一个现实应用的问题:将这种复杂模型推上线,模型响应速度太慢,当流量大的时候撑不住。
知识蒸馏就是目前一种比较流行的解决此类问题的技术方向。复杂笨重可是效果好的 Teacher 模型不上线,就单纯是个导师角色,真正上战场挡抢撑流量的是灵活轻巧的 Student 小模型。
在智能推荐中已经提到,通常有三个级联的过程:召回、粗排和精排。
以上环节均可以采用知识蒸馏技术来优化性能和效果,这里的性能指的线上服务响应速度快,效果指的推荐质量好。
精排环节注重精准排序,因此采用尽可能多特征复杂模型,以期待得到优质的个性化推荐结果。这也意味着复杂模型的在线服务响应变慢。
(1)在离线训练的时候,能够训练一个复杂精排模型做为 Teacher,一个结构较简单的 DNN 排序模型做为 Student。
(2)在模型上线服务的时候,并不用那个大 Teacher,而是使用小的 Student 做为线上服务精排模型,进行在线推理。
(1)阿里妈妈在论文 "Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net" 提出。
在精排环节采用知识蒸馏,主要采用 Teacher 和 Student 联合训练 ( Joint Learning ) 的方法。所谓联合训练,指的是在离线训练 Student 模型的时候,增长复杂 Teacher 模型来辅助 Student,二者同时进行训练,是一种训练过程当中的辅导。
从网络结构来讲,Teacher 和 Student 模型共享底层特征 Embedding 层,Teacher 网络具备层深更深、神经元更多的 MLP 隐层,而 Student 则由较少层深及神经元个数的 MLP 隐层构成,二者的 MLP 部分参数各自私有。
(2)爱奇艺在排序阶段提出了双 DNN 排序模型,能够看做是在阿里的 rocket launching 模型基础上的进一步改进。
为了进一步加强 student 的泛化能力,要求 student 的隐层 MLP 的激活也要学习 Teacher 对应隐层的响应,这点一样能够经过在 student 的损失函数中加子项来实现。可是这会带来一个问题,就是在 MLP 隐层复杂度方面,Student 和 Teacher 是至关的。那么,Teacher 相比 student,模型复杂在哪里呢?
这引出了第二点不一样:双 DNN 排序模型的 Teacher 在特征 Embedding 层和 MLP 层之间,能够比较灵活加入各类不一样方法的特征组合功能。经过这种方式,体现 Teacher 模型的较强的模型表达和泛化能力。
召回或者粗排环节,做为精排的前置环节,须要在准确性和速度方面找到一个平衡点,在保证必定推荐精准性的前提下,对物品进行粗筛,减少精排环节压力。这两个环节并不追求最高的推荐精度。毕竟在这两个环节,若是准确性不足能够靠返回物品数量多来弥补。而模型小,速度快则是模型召回及粗排的重要目标之一。
做者给出了一些可能的处理方式,目前业内还没定论。
(1)设想一:召回蒸馏的两阶段方法
(2)设想二:logits方法
(3)设想三:Without-Logits 方案
(4)设想四:Point Wise 蒸馏:Point Wise Loss 将学习问题简化为单 Item 打分问题。
(5)设想五:Pair Wise 蒸馏:Pair Wise Loss 对可以保持序关系的训练数据对建模。
(6)设想六:List Wise 蒸馏:List Wise Loss 则对整个排序列表顺序关系建模。
(7)设想七:联合训练召回、粗排及精排模型的设想
主要关注的是灾难性遗忘,平衡新知识与旧知识之间的关系。即如何在学习新知识的状况下不忘记旧知识。
引用Robipolikar对增量学习算法的定义,即一个增量学习算法应同时具备如下特色:
在概念上,增量学习与迁移学习最大的区别就是对待旧知识的处理:
关于这部份内容,将来有看到好的资料,再来分享。
若是您对异常检测感兴趣,欢迎浏览个人另外一篇博客:异常检测算法演变及学习笔记
若是您对智能推荐感兴趣,欢迎浏览个人另外一篇博客:智能推荐算法演变及学习笔记 、CTR预估模型演变及学习笔记
若是您对知识图谱感兴趣,欢迎浏览个人另外一篇博客:行业知识图谱的构建及应用、基于图模型的智能推荐算法学习笔记
若是您对时间序列分析感兴趣,欢迎浏览个人另外一篇博客:时间序列分析中预测类问题下的建模方案 、深度学习中的序列模型演变及学习笔记
若是您对数据挖掘感兴趣,欢迎浏览个人另外一篇博客:数据挖掘比赛/项目全流程介绍 、机器学习中的聚类算法演变及学习笔记
若是您对人工智能算法感兴趣,欢迎浏览个人另外一篇博客:人工智能新手入门学习路线和学习资源合集(含AI综述/python/机器学习/深度学习/tensorflow)、人工智能领域经常使用的开源框架和库(含机器学习/深度学习/强化学习/知识图谱/图神经网络)
若是你是计算机专业的应届毕业生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的应届生,你如何准备求职面试?
若是你是计算机专业的本科生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的本科生,你能够选择学习什么?
若是你是计算机专业的研究生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的研究生,你能够选择学习什么?
若是你对金融科技感兴趣,欢迎浏览个人另外一篇博客:若是你想了解金融科技,不妨先了解金融科技有哪些可能?
以后博主将持续分享各大算法的学习思路和学习笔记:hello world: 个人博客写做思路