第九课.深度学习常见内容补充
本篇将补充部分在深度学习中常用到的内容
目录
- 标准化与反标准化
- 标准化
- 反标准化或标准化还原
- 卷积神经网络的反向传播
- 反卷积和反池化
- 反卷积操作过程
- 棋盘效应
- 反池化
- 知识蒸馏
- 诞生背景
- 知识蒸馏原理
标准化与反标准化
标准化与反标准化常用于图像特征提取与图像生成方面,分别对应预处理和后处理
标准化
标准化指 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∗=σ1x−μ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=σ2x∗−μ2=σ2σ1x−μ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=σ11
现在将反标准化参数代入 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=∑jexp(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=−piTlog(qi)
其中:
pi=exp(viT)∑jexp(vjT)p_{i}=\frac{exp(\frac{v_{i}}{T})}{\sum_{j}exp(\frac{v_{j}}{T})}pi=∑jexp(Tvj)exp(Tvi)
qi=exp(ziT)∑jexp(zjT)q_{i}=\frac{exp(\frac{z_{i}}{T})}{\sum_{j}exp(\frac{z_{j}}{T})}qi=∑jexp(Tzj)exp(Tzi)
在训练新模型时,使用较高的温度TTT使得softmax产生的分布足够软,这时让新模型的softmax输出近似原模型;在训练结束以后再使用正常的温度T=1T=1T=1来预测;
正如在化学中,蒸馏是一个有效的分离沸点不同的组分的方法,大致步骤是先升温使低沸点的组分汽化,然后降温冷凝,从而分离出目标物质;对于知识蒸馏,也是先让温度升高,然后在测试阶段恢复温度,从而将原模型中的知识提取出来,因此形象将其称为蒸馏;
第九课.深度学习常见内容补充相关推荐
- 人工智能之深度学习常见应用方向你都了解吗?(文末包邮送书5本)
文章目录 本文导读 1. 数字识别 2. 图像识别 3. 图像分类 4. 目标检测 5. 人脸识别 6. 文本分类 7. 聊天机器人 8. 书籍推荐(包邮送书5本) 本文导读 从零带你了解深度学习常见 ...
- 深度学习常见优化算法,图解AdaGrad、RMSProp,Adam
1. AdaGrad AdaGrad算法是梯度下降法的改进算法,其优点是可以自适应学习率.该优化算法在较为平缓处学习速率大,有比较高的学习效率,在陡峭处学习率小,在一定程度上可以避免越过极小值点.在S ...
- 深度学习常见损失函数总结+Pytroch实现
文章目录 一.引言 二.损失函数 1.均方差损失(Mean Squared Error Loss) 2.平均绝对误差损失(Mean Absolute Error Loss) 3.交叉熵(Cross E ...
- 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...
计算机视觉中大大小小可以包括至少30个以上的方向,在基于深度学习的计算机视觉研究方向中,图像分类,图像分割,目标检测无疑是最基础最底层的任务,掌握好之后可以很快的迁移到其他方向,比如目标识别,目标跟踪 ...
- 北大AI公开课第五课--深度学习处理器by寒武纪陈云霁
当我们想要养成一个习惯,只要不管不顾地坚持21天就可以了,不敢说这个习惯养成之后我们可以一辈子不失去,但事实是,生活就是会不断地处于各种状态,而任何状态的存在都是一种共存和和解,一开始会不适应,但是慢 ...
- 1.5 关于这门课-深度学习-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 1.4 为什么深度学习会兴起 回到目录 1.6 课程资源 关于这门课 你的学习进度已经快接近这个专项课程的第一门课的第一周结尾了,首先,快速地介绍一下下周的学习内容: 在第一 ...
- display函数怎么使用_损失函数—深度学习常见损失函数总结【图像分类|上】
点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类篇[上] 一.前言在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少 ...
- 机器/深度学习常见面试问题
1.训练决策树时的参数是什么? DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,max_features ...
- [深度学习] 深度学习常见概念
深度学习框架 (from<深度学习入门之PyTorch>) TensorFlow TensorFlow由Google开源. TensorFlow是使用C++语言开发的开源数学计算软件,使用 ...
最新文章
- CUDA学习-计算实际线程ID
- Tungsten Fabric SDN — 基于 Tags 的安全访问控制策略
- git 拉取远端仓库_Git : 建立自己的本地仓库,并拉取远程代码
- Python获取一个字符串所有连续子串
- C# 使用 HelpProvider 控件调用帮助文件
- 【转贴】ASP.NET 3.5中的ListView控件和DataPager控件
- linux服务器的诗句迁移,使用scp命令在两台linux上对拷文件或者文件夹
- Google I/O 2019 行纪 —— Google 要让 AI 消除偏见
- 思路与好题记录与小技巧
- java判断是否失效_java – 如何在输入有效之前检查无效输入和循环?
- 链接服务器 修改端口号,服务器修改远程链接端口号
- java提高篇(二)-----理解java的三大特性之继承
- 基于matlab深度学习的水果图像识别算法
- 十四步实现拥有强大AI的五子棋游戏
- (机器学习)绘制PR曲线
- 【毕设教程】NBIOT 窄带物联网介绍
- c语言随机数字密码生成器,随机数生成器(浮点数整型数)
- VR眼镜连接android设备,如何将VR眼镜的屏幕投影到计算机或电视上?
- 计算机为什么找不到c盘d盘,我的电脑c盘d盘都没有了?为什么
- 虚拟机配置IP和关闭防火墙