本篇将补充部分在深度学习中常用到的内容

目录

  • 标准化与反标准化
    • 标准化
    • 反标准化或标准化还原
  • 卷积神经网络的反向传播
  • 反卷积和反池化
    • 反卷积操作过程
    • 棋盘效应
    • 反池化
  • 知识蒸馏
    • 诞生背景
    • 知识蒸馏原理

标准化与反标准化

标准化与反标准化常用于图像特征提取与图像生成方面,分别对应预处理和后处理

标准化

标准化指 Normalization ,常见的标准化方式有:

  • Min-Max Normalization,其实归一化就是这种方式的标准化,假设输入数据为xxx,则标准化后的数据为x∗x^{*}x∗:
    x∗=x−min(x)max(x)−min(x)x^{*}=\frac{x-min(x)}{max(x)-min(x)}x∗=max(x)−min(x)x−min(x)​
  • z-score Normalization,该方式就是最常用到的"将数据标准化到0均值,1标准差的正态分布",即x∗x^{*}x∗服从标准正态分布:
    x∗=x−μσx^{*}=\frac{x-\mu}{\sigma}x∗=σx−μ​
    其中,μ\muμ为样本的均值,σ\sigmaσ为样本的标准差;

标准化可以将数据映射到同一个坐标系下,即数据将具有相同的尺度,或服从同样的分布,因此,标准化使分布变得简单,更容易让网络学习;

反标准化或标准化还原

对于生成图像的任务,在使用标准化后的数据去驱动网络学习后,网络上采样得到的数据也将是和标准化一样的分布,为了还原到原始的图像分布,需要进行反标准化;
其实反标准化只是标准化的反向操作,对于 z-score Normalization 的反标准化,有以下计算过程:

  • 首先已知其标准化方式为:
    x∗=x−μ1σ1x^{*}=\frac{x-\mu_{1}}{\sigma_{1}}x∗=σ1​x−μ1​​
    则假设反标准化参数为μ2\mu_{2}μ2​和σ2\sigma_{2}σ2​,再次进行标准化还原到xxx,可以得到以下关系:
    x=x∗−μ2σ2=x−μ1σ1−μ2σ2x=\frac{x^{*}-\mu_{2}}{\sigma_{2}}=\frac{\frac{x-\mu_{1}}{\sigma_{1}}-\mu_{2}}{\sigma_{2}}x=σ2​x∗−μ2​​=σ2​σ1​x−μ1​​−μ2​​
  • 根据上述关系求解反标准化参数μ2\mu_{2}μ2​和σ2\sigma_{2}σ2​:
    μ1+μ2σ1=0\mu_{1}+\mu_{2} \sigma_{1}=0μ1​+μ2​σ1​=0
    σ1σ2=1\sigma_{1}\sigma_{2}=1σ1​σ2​=1
    得到μ2=−μ1σ1,σ2=1σ1\mu_{2}=-\frac{\mu_{1}}{\sigma_{1}},\sigma_{2}=\frac{1}{\sigma_{1}}μ2​=−σ1​μ1​​,σ2​=σ1​1​
    现在将反标准化参数代入 z-score Normalization 即可还原到原始数据的分布;

从数据集中选择一张图像,先进行标准化,再还原标准化分别有如下结果:

卷积神经网络的反向传播

计算机视觉常用的二维卷积,其本质是全连接网在局部特征上进行线性变换,对一个二维张量进行卷积,可以等效为以下过程:
可以看出,当把张量转为另一个表现形式后,卷积网络就变成了全连接网络,此时,卷积网络的反向传播即遵循全连接网络中的反向传播

反卷积和反池化

反卷积操作过程

反卷积的名称有很多,其目的是为了实现可学习的上采样,增加网络在上采样过程中的特征变换能力;反卷积 DeConv 又叫 Fractional Strided Conv ,或者转置卷积 TransposeConv(更规范的表述),反卷积是一种特殊的卷积,常用于实现特征图(Feature Maps)的上采样。
反卷积的操作有两个关键要素:

  • 连接模式
  • 小数步长(即Fractional Strided),这也是反卷积叫 Fractional Strided Conv 的原因

下面通过pytorch中的反卷积进行说明,在pytorch中,反卷积即torch.nn.ConvTranspose2d,常用参数为:

torch.nn.ConvTranspose2d(in_channels,out_channels,kernel_size, stride=1, padding=0, bias=True)

反卷积的本质是张量转置再相乘,其过程可以等效为先填充特征再卷积;基于以上参数,可以描述反卷积具体过程为:

  • 对于连接模式,指的是遵循一个固定模式:先对特征进行 zero padding ,填充量为:
    kernelsize−padding−1kernelsize-padding-1kernelsize−padding−1
    接下来用kernelsize×kernelsizekernelsize\times kernelsizekernelsize×kernelsize的滤波器去卷积,注意卷积的步长固定为1;
  • 小数步长并不是以小数的步长去卷积,上一条已经提到卷积的步长是恒为1的,小数步长指的是在特征的像素之间共插入stride−1stride-1stride−1个零填充,由于特征被填充,而卷积步长为1,从而类似于在特征上用小数步长去卷积;
  • 除了以上推导,可以直接使用设置反卷积的参数计算出输出特征的尺寸:
    Hout=(Hin−1)stride[0]−2padding[0]+kernelsize[0]H_{out}=(H_{in}-1)stride[0]-2padding[0]+kernelsize[0]Hout​=(Hin​−1)stride[0]−2padding[0]+kernelsize[0]
    Wout=(Win−1)stride[1]−2padding[1]+kernelsize[1]W_{out}=(W_{in}-1)stride[1]-2padding[1]+kernelsize[1]Wout​=(Win​−1)stride[1]−2padding[1]+kernelsize[1]

比如对于以下例子,设置反卷积参数为:

torch.nn.ConvTranspose2d(1, 1, (3, 3), stride=2, padding=1)

蓝色部分是输入特征,绿色部分是反卷积输出的特征:

首先,按照连接模式,输入特征的 zero padding 量为 kernelsize−padding−1=3−1−1=1kernelsize-padding-1=3-1-1=1kernelsize−padding−1=3−1−1=1,根据小数步长有,特征的每行(每列)各像素间填充0共stride−1=2stride-1=2stride−1=2个,现在特征尺寸从3×33 \times 33×3变成7×77 \times 77×7,然后用kernelsize×kernelsizekernelsize\times kernelsizekernelsize×kernelsize的滤波器去卷积,步长为1,可以得到输出特征尺寸为5×55 \times 55×5;

棋盘效应

通过上面的反卷积操作可以发现,特征的像素之间会存在0填充,这导致卷积的计算混合不均,即上采样得到的特征值不够均匀,于是导致棋盘效应;当仔细看网络生成的图片时,常常会看到一些棋盘格样式的瑕疵,这种棋盘格瑕疵在强烈色彩的图片中会尤为凸显:
缓解棋盘效应的常用方式是插值,即原本在像素之间进行的0填充被相邻像素插值得到的结果所覆盖,这样将会使卷积的计算相对均匀,输出特征的值也将较为均匀;

左图是未进行插值的反卷积,右图是采用插值后的反卷积,上层是输入特征,下层是输出特征,明显看出,输出特征在插值后,其值更为均匀(连续)

反池化

反池化是池化的逆操作,依然无法通过池化的结果还原出原始数据。因为池化的过程就只保留了主要信息,舍去部分信息;如果想从池化后的主要信息恢复出全部信息,只能通过补位来实现最大程度的信息恢复;
池化有两种:最大池化和平均池化,反池化也需要与其对应:

知识蒸馏

诞生背景

各种模型算法,最终目的都是要为某个应用服务。在买卖中,需要控制收入和支出。类似地,在工业应用中,除了要求模型要有好的预测(收入)以外,往往还希望它的支出足够小。具体来说,希望部署到应用中的模型使用较少的计算资源(存储空间、计算单元等),产生较低的时延。
在深度学习的背景下,为了达到更好的预测效果,常常会有两种方案:

  • 使用大型的复杂网络并部署在高配置的硬件上,在大量数据的支持下,大型网络的表现会比较突出;
  • 集成模型(ensemble),将许多较弱的模型集成起来,往往可以达到较好的预测效果。

然而,这两种方案无疑都有较大的支出,需要的计算量和计算资源很大,对部署不利。为了让一个单独的小模型(耗时较短)达到较好的效果,诞生了知识蒸馏 Knowledge Distillation

知识蒸馏原理

知识蒸馏基于 Model Compression ,让新模型近似原模型(模型即函数)。注意到,在机器学习中,人们常常假定输入到输出有一个潜在的函数关系,这个函数是未知的,学习一个新模型就是从有限的数据中近似一个未知的函数。
为了让新模型近似原模型,因为原模型的函数是已知的,于是可以使用很多非训练集内的伪数据来训练新模型,这显然要比直接使用训练集的数据更可行。
这样,本来需要让新模型的输出分布与真实标签匹配,现在只需要让新模型与原模型在给定输入下的输出分布匹配即可。直观来看,后者比前者具有优势:经过训练的原模型,其输出分布包含有更多的知识(更多的监督信息)——真实标签只能反映某个样本是一辆跑车,不是一辆大巴,也不是一个苹果;而经过训练的模型可以反映,它最可能是一辆跑车,不大可能是一辆大巴,更不可能是一个苹果;
直接的方法是单纯比较网络输出,假设对于样本iii,原模型输出为向量viv_{i}vi​,新模型输出为ziz_{i}zi​,则需要最小化:
J=12(zi−vi)2J=\frac{1}{2}(z_{i}-v_{i})^{2}J=21​(zi​−vi​)2
更普遍的做法是先修改网络输出部分的softmax(假设softmax的输入得分为ziz_{i}zi​):
qi=exp(ziT)∑jexp(zjT)q_{i}=\frac{exp(\frac{z_{i}}{T})}{\sum_{j}exp(\frac{z_{j}}{T})}qi​=∑j​exp(Tzj​​)exp(Tzi​​)​
TTT代表温度,借用了热力学中玻尔兹曼分布的概念,当温度趋近于0,qiq_{i}qi​将收敛到 one-hot 向量,反之,温度升高,qiq_{i}qi​将不再像one-hot一样极端,可以理解为此时网络的输出分布较软;


软化输出分布的意义
对于一个良好的原模型,温度TTT为1的输出分布信息量依然很小,软化输出后包含的信息量才更大:

红色0.001部分,对于权重的更新贡献微乎其微,这样就起不到捕捉更多监督信息的作用。因此,软化输出可以帮助新模型学习更多知识。


同样,假设新模型softmax的输入得分为ziz_{i}zi​,原模型softmax的输入得分为viv_{i}vi​,则用交叉熵计算后的最小化函数为:
J=−piTlog(qi)J=-p_{i}^{T}log(q_{i})J=−piT​log(qi​)
其中:
pi=exp(viT)∑jexp(vjT)p_{i}=\frac{exp(\frac{v_{i}}{T})}{\sum_{j}exp(\frac{v_{j}}{T})}pi​=∑j​exp(Tvj​​)exp(Tvi​​)​
qi=exp(ziT)∑jexp(zjT)q_{i}=\frac{exp(\frac{z_{i}}{T})}{\sum_{j}exp(\frac{z_{j}}{T})}qi​=∑j​exp(Tzj​​)exp(Tzi​​)​

在训练新模型时,使用较高的温度TTT使得softmax产生的分布足够软,这时让新模型的softmax输出近似原模型;在训练结束以后再使用正常的温度T=1T=1T=1来预测;
正如在化学中,蒸馏是一个有效的分离沸点不同的组分的方法,大致步骤是先升温使低沸点的组分汽化,然后降温冷凝,从而分离出目标物质;对于知识蒸馏,也是先让温度升高,然后在测试阶段恢复温度,从而将原模型中的知识提取出来,因此形象将其称为蒸馏;

第九课.深度学习常见内容补充相关推荐

  1. 人工智能之深度学习常见应用方向你都了解吗?(文末包邮送书5本)

    文章目录 本文导读 1. 数字识别 2. 图像识别 3. 图像分类 4. 目标检测 5. 人脸识别 6. 文本分类 7. 聊天机器人 8. 书籍推荐(包邮送书5本) 本文导读 从零带你了解深度学习常见 ...

  2. 深度学习常见优化算法,图解AdaGrad、RMSProp,Adam

    1. AdaGrad AdaGrad算法是梯度下降法的改进算法,其优点是可以自适应学习率.该优化算法在较为平缓处学习速率大,有比较高的学习效率,在陡峭处学习率小,在一定程度上可以避免越过极小值点.在S ...

  3. 深度学习常见损失函数总结+Pytroch实现

    文章目录 一.引言 二.损失函数 1.均方差损失(Mean Squared Error Loss) 2.平均绝对误差损失(Mean Absolute Error Loss) 3.交叉熵(Cross E ...

  4. 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...

    计算机视觉中大大小小可以包括至少30个以上的方向,在基于深度学习的计算机视觉研究方向中,图像分类,图像分割,目标检测无疑是最基础最底层的任务,掌握好之后可以很快的迁移到其他方向,比如目标识别,目标跟踪 ...

  5. 北大AI公开课第五课--深度学习处理器by寒武纪陈云霁

    当我们想要养成一个习惯,只要不管不顾地坚持21天就可以了,不敢说这个习惯养成之后我们可以一辈子不失去,但事实是,生活就是会不断地处于各种状态,而任何状态的存在都是一种共存和和解,一开始会不适应,但是慢 ...

  6. 1.5 关于这门课-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.4 为什么深度学习会兴起 回到目录 1.6 课程资源 关于这门课 你的学习进度已经快接近这个专项课程的第一门课的第一周结尾了,首先,快速地介绍一下下周的学习内容: 在第一 ...

  7. display函数怎么使用_损失函数—深度学习常见损失函数总结【图像分类|上】

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类篇[上] 一.前言在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少 ...

  8. 机器/深度学习常见面试问题

    1.训练决策树时的参数是什么? DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,max_features ...

  9. [深度学习] 深度学习常见概念

    深度学习框架 (from<深度学习入门之PyTorch>) TensorFlow TensorFlow由Google开源. TensorFlow是使用C++语言开发的开源数学计算软件,使用 ...

最新文章

  1. CUDA学习-计算实际线程ID
  2. Tungsten Fabric SDN — 基于 Tags 的安全访问控制策略
  3. git 拉取远端仓库_Git : 建立自己的本地仓库,并拉取远程代码
  4. Python获取一个字符串所有连续子串
  5. C# 使用 HelpProvider 控件调用帮助文件
  6. 【转贴】ASP.NET 3.5中的ListView控件和DataPager控件
  7. linux服务器的诗句迁移,使用scp命令在两台linux上对拷文件或者文件夹
  8. Google I/O 2019 行纪 —— Google 要让 AI 消除偏见
  9. 思路与好题记录与小技巧
  10. java判断是否失效_java – 如何在输入有效之前检查无效输入和循环?
  11. 链接服务器 修改端口号,服务器修改远程链接端口号
  12. java提高篇(二)-----理解java的三大特性之继承
  13. 基于matlab深度学习的水果图像识别算法
  14. 十四步实现拥有强大AI的五子棋游戏
  15. (机器学习)绘制PR曲线
  16. 【毕设教程】NBIOT 窄带物联网介绍
  17. c语言随机数字密码生成器,随机数生成器(浮点数整型数)
  18. VR眼镜连接android设备,如何将VR眼镜的屏幕投影到计算机或电视上?
  19. 计算机为什么找不到c盘d盘,我的电脑c盘d盘都没有了?为什么
  20. 虚拟机配置IP和关闭防火墙

热门文章

  1. 面试了一个32岁的大佬,明显感觉到他背过很多面试题…
  2. 图解电商支付架构设计,这才是真电商!
  3. 腾讯最大股东收购了 Stack Overflow,以后“抄代码”都要付费了么?
  4. 亿级流量网关设计思路
  5. 程序员吐槽职场戏精:凌晨三点半发周报,太装了!
  6. 如何使用Git提高研发团队工作效率?
  7. Scrum敏捷开发看板工具分享
  8. 在计算机网络中光缆的工作原理是什么,计算机网络原理期中考试试卷(A)
  9. 架构思维-高业务复杂度系统建设思路
  10. 分享Leangoo敏捷工具操作视频