少部分网站ie打不开这些网站域名ping不通,网站建设jsp,公司广告推广,极客网站建设一、引言
1.1 深度学习的优点 特征学习代替特征工程#xff1a;深度学习通过从数据中自己学习出有效的特征表示#xff0c;代替以往机器学习中繁琐的人工特征工程过程#xff0c;举例来说#xff0c;对于图片的猫狗识别问题#xff0c;机器学习需要人工的设计、提取出猫的…一、引言
1.1 深度学习的优点 特征学习代替特征工程深度学习通过从数据中自己学习出有效的特征表示代替以往机器学习中繁琐的人工特征工程过程举例来说对于图片的猫狗识别问题机器学习需要人工的设计、提取出猫的特征、狗的特征输入到机器学习模型中才能进行进一步的分类这个过程非常依赖人的经验和领域知识而深度学习模型会自己直接从猫狗图片中学习出猫和狗的有效特征表示。 端到端学习代替多模块学习在一些任务中传统机器学习方法需要将一个任务的输入和输出之间人为的分割成多个子模块也就是分割成多个阶段每个子模块分开进行训练学习比如对于一个自然语言理解问题一般需要切分成分词、词性标注、句法分析、语法分析等多个模块而端到端学习不进行模块和阶段的划分直接优化任务的总体目标中间过程不需要人为干预训练数据呈现 输入-输出 对的形式不再需要额外的信息。 1.2 深度学习的缺点 依赖数据量规模深度学习要想发挥出理想的效果需要大规模的数据当数据量偏少时可能还不如传统的机器学习方法。 模型体积过大深度学习要想从数据中学习出更有效的特征表示一般会通过加深模型层数的方法随着残差连接和多种正则化方法的提出训练更深层的模型变为可能这也导致了深度学习模型的体积变的越来越大无法部署在那些资源受限的设备上往往只是理论上能达到最优但是无法真正进行落地使用。 可解释性差在深度学习的眼中万事万物都是向量更准确的说叫张量外界对象需要被表示为向量才能输入到模型中进行进一步的处理在深度学习中把将外界对象表示为向量这个过程叫做嵌入比如将一个词语表示为向量叫做词嵌入但是表示成向量之后它的解释性就很差比如用 [0.3,0.4,9.2] 这个向量表示‘我’这个词你就不知道这几个数字究竟表示什么意义。 二、什么是知识蒸馏
2.1 模型压缩 模型压缩在不降低或者只是轻微降低原模型准确率的同时大幅缩小原模型的体积使其可以真正进行线上部署常用的模型压缩方法包括 参数裁剪删除掉原模型中一些无用的参数缩小模型的体积 精度转换降低原模型中参数的存储精度 神经网络结构搜索寻找原模型中真正对最终结果起作用的网络层删除掉影响不大的网络层降低模型的体积。 2.2 什么是学习 赫尔伯特.西蒙曾经给学习下过定义“如果一个系统能够通过执行某个过程改进它的性能这就是学习。” 具体到深度学习的过程也就是训练的过程就是神经网络根据损失函数的约束从输入的数据中发掘信息从信息中再获取到对于最终任务起关键性作用的知识。 这些学习到的知识以参数的形式固化在神经网络中当我们将数据输入到训练完毕的神经网络中可以获取到神经网络关于数据形成的知识。 2.3 什么是知识蒸馏 知识蒸馏也是一种模型压缩方法参数裁剪、精度转换、神经网络结构搜索这些模型压缩方法会破坏原模型的结构也就是会损坏原模型从数据中学习到的知识而知识蒸馏通过蒸馏的手段保护原模型中学习到的知识然后将这些知识迁移到压缩模型中使压缩模型虽然相比原模型体积要小的多但是也可以学习到相同的知识。 2.4 知识蒸馏的一般流程 类比人类的学习过程在知识蒸馏中称要进行压缩的模型为教师神经网络Teacher Model压缩之后的模型为学生神经网络(Student Model)一般情况下教师神经网络的体积要远大于学生神经网络。 一般的知识蒸馏过程为 首先利用数据集训练教师神经网络让教师神经网络充分学习数据中包含的知识 然后在利用数据集训练学生神经网络时通过蒸馏方法将教师神经网络中已经学习到的知识提取出来指导学生神经网络的训练这样学生神经网络相当于从教师神经网络那里获取到了关于数据集的先验信息。 也就是在知识蒸馏中教师神经网络是预先在数据集上进行过训练的然后在学生神经网络的训练过程中利用自身学习到的知识对其进行指导帮助提高学生神经网络的准确率。 使用知识蒸馏要解决的关键问题是 如何发掘教师神经网络中包含的知识如何将教师神经网络中的知识通过蒸馏无损的迁移到学生神经网络中也就是蒸馏方法的设计如何设计学生神经网络的结构 三 知识蒸馏的分类
3.1 模型结构的种类 深度学习中虽然模型众多但是其结构可以归为四种 前馈神经网络也叫多层感知机MLP前馈神经网络由 线性变换非线性激活 组成通过线性变换将输入空间中的数据变换到特征空间利用非线性激活函数无限逼近真实的判别函数。 卷积神经网络CNN,卷积神经网络是连接受限的前馈神经网络适合处理具有局部相关性的数据比如图像 循环神经网络RNN,循环神经网络会携带网络处理过程中产生的历史信息进行接下来的处理适合处理那些具有时序性特征的数据 Transformer:带有注意力机制的前馈神经网络利用注意力机制获取数据中的关键信息可以利用有限的计算资源处理更重要的信息。 综上多种网络结构其实可以统一看成前馈神经网络。 3.2 知识的分类 在知识蒸馏中将教师神经网络中的知识分为三种 输出层知识图中的Response-based Knowledge是教师神经网络最后一层的输出这个输出未经过Softmax层转换为概率一般称为Logits,关于Logits的具体介绍可见Logits 中间层知识图中的Feature-Based Knowledge指的是教师神经网络中间网络层的输出、包含的参数 关系型知识图中的Relation-Based Knowledge将教师神经网络不同层知识之间的关系作为一种知识也叫结构型知识。 3.3 如何蒸馏 四、输出层知识蒸馏 《Distilling the Knowledge in a Neural Network 》 2015 Hinton2015年在这篇文章中首次提出知识蒸馏的概念和方法并在MNIST手写体数字识别数据集上验证了方法的有效性。 假设我们现在的任务是利用神经网络识别 1~5 的手写体数字图片也就是将一张手写体数字图片输入到神经网络中神经网络要判断出这张图片中的数字究竟是几。 但是这些数字的大小相差太大类似于归一化先想办法在不改变它们原有分布的情况下改变这些数值的大小使其具有可比性Hinton在这里引入了一个称为温度的参数对Logtis进行平滑处理知识蒸馏这个词语也是来自于这个过程具体平滑公式是 蒸馏过程为 五、中间层知识蒸馏 《Learning Metrics from Teachers: Compact Networks for Image Embedding》2019 CVPR 可以将神经网络看作是一个解决问题的过程最后神经网络的输出结果就是神经网络对问题的解而中间的网络层就是解决问题的步骤既然可以让学生神经网络直接学习教师神经网络输出的问题结果也可以利用蒸馏损失函数让学生神经网络学习教师神经网络的解题过程也就是学习教师神经网络中间层的知识。 这篇论文中的中间层知识蒸馏过程如下图 首先利用数据集训练教师神经网络然后在学生神经网络训练的过程中将数据同样输入到教师神经网络中获取教师神经网络每个中间网络层输出的特征图同样获取学生神经网络的特征图然后定义中间层蒸馏损失函数为 中间层知识蒸馏的一般流程为 首先训练教师神经网络然后获取教师神经网络中间层的知识在训练学生神经网络时获取教师神经网络、学生神经网络中间层的知识利用蒸馏损失函数进行中间层知识蒸馏。 六、关系层知识蒸馏 《Relational Knowledge Distillation》2019 CVPR 普通的知识蒸馏上图中左侧的Conventional KD中学生神经网络学习到的是一对一的教师神经网络产生的知识而在关系层知识蒸馏上图中右侧Relational KD中学生神经网络学习的是知识之间的结构关系Structure Knowledge,增强知识蒸馏的泛化性。 在这篇文章中作者提出的关系层知识蒸馏过程如下 在这篇文章中作者每次选择两个样本进行关系型知识蒸馏定义关系抽取函数为 其中的 u 是一个正则化因子定义为 在本文中使用的衡量相似性函数为 最终关系型蒸馏损失函数定义为
七、其它知识蒸馏方法
7.1 多教师知识蒸馏 相当于是一种模型集成的方法利用知识蒸馏将多个教师神经网络中的知识迁移到学生神经网络中让学生神经网络在多个不同的特征空间中进行学习可以大幅提高学生神经网络的准确率。 7.2 融合图神经网络的知识蒸馏 将教师神经网络中的知识构建成图然后利用图神经网络中的方法获取其中的关系型知识进行关系层的知识蒸馏。 7.3 结合多模态的知识蒸馏 数据集是一个多模态的数据集比如包含声音、图像、文本在A模态上训练教师神经网络然后在利用B模态训练学生神经网络的时候利用知识蒸馏相当于一种多模态融合方法。 八、知识蒸馏代码的编写 知识蒸馏代码编写中教师神经网络按照普通的深度学习流程在数据集上进行训练即可重点在于神经网络中知识的获取和蒸馏损失函数的编写拿PyTorch举例 8.1 如何获取到神经网络中的知识 利用hook机制获取神经网络中的知识hook机制能够使我们获取神经网络中指定层在前向传递过程中的输出也就是相应的知识 import torch# 获取模型中的知识
class GetFeatures:# 指定想要获取知识的模型和相应的网络层def __init__(self, model, layer_num):# 获取到的知识self.features None# 注入hookself.hook model[layer_num].register_forward_hook(self.hook_fn)# hook函数def hook_fn(self, module, input, output):# 获取模型相应网络层的输出self.features output.cuda()# 移除hookdef remove(self):self.hook.remove()