第九课.深度学习常见内容补充

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

标准化与反标准化

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

标准化

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

  • Min-Max Normalization,其实归一化就是这种方式的标准化,假设输入数据为 x x x,则标准化后的数据为 x ∗ x^{*} x
    x ∗ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^{*}=\frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(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 σ 1 x^{*}=\frac{x-\mu_{1}}{\sigma_{1}} x=σ1xμ1
    则假设反标准化参数为 μ 2 \mu_{2} μ2 σ 2 \sigma_{2} σ2,再次进行标准化还原到 x x x,可以得到以下关系:
    x = x ∗ − μ 2 σ 2 = x − μ 1 σ 1 − μ 2 σ 2 x=\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 即可还原到原始数据的分布;

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

卷积神经网络的反向传播

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

反卷积和反池化

反卷积操作过程

反卷积的名称有很多,其目的是为了实现可学习的上采样,增加网络在上采样过程中的特征变换能力;反卷积 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 ,填充量为:
    k e r n e l s i z e − p a d d i n g − 1 kernelsize-padding-1 kernelsizepadding1
    接下来用 k e r n e l s i z e × k e r n e l s i z e kernelsize\times kernelsize kernelsize×kernelsize的滤波器去卷积,注意卷积的步长固定为1;
  • 小数步长并不是以小数的步长去卷积,上一条已经提到卷积的步长是恒为1的,小数步长指的是在特征的像素之间共插入 s t r i d e − 1 stride-1 stride1个零填充,由于特征被填充,而卷积步长为1,从而类似于在特征上用小数步长去卷积;
  • 除了以上推导,可以直接使用设置反卷积的参数计算出输出特征的尺寸:
    H o u t = ( H i n − 1 ) s t r i d e [ 0 ] − 2 p a d d i n g [ 0 ] + k e r n e l s i z e [ 0 ] H_{out}=(H_{in}-1)stride[0]-2padding[0]+kernelsize[0] Hout=(Hin1)stride[0]2padding[0]+kernelsize[0]
    W o u t = ( W i n − 1 ) s t r i d e [ 1 ] − 2 p a d d i n g [ 1 ] + k e r n e l s i z e [ 1 ] W_{out}=(W_{in}-1)stride[1]-2padding[1]+kernelsize[1] Wout=(Win1)stride[1]2padding[1]+kernelsize[1]

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

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

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

fig2首先,按照连接模式,输入特征的 zero padding 量为 k e r n e l s i z e − p a d d i n g − 1 = 3 − 1 − 1 = 1 kernelsize-padding-1=3-1-1=1 kernelsizepadding1=311=1,根据小数步长有,特征的每行(每列)各像素间填充0共 s t r i d e − 1 = 2 stride-1=2 stride1=2个,现在特征尺寸从 3 × 3 3 \times 3 3×3变成 7 × 7 7 \times 7 7×7,然后用 k e r n e l s i z e × k e r n e l s i z e kernelsize\times kernelsize kernelsize×kernelsize的滤波器去卷积,步长为1,可以得到输出特征尺寸为 5 × 5 5 \times 5 5×5

棋盘效应

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

反池化

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

知识蒸馏

诞生背景

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

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

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

知识蒸馏原理

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


软化输出分布的意义
对于一个良好的原模型,温度 T T T为1的输出分布信息量依然很小,软化输出后包含的信息量才更大:
fig6
红色0.001部分,对于权重的更新贡献微乎其微,这样就起不到捕捉更多监督信息的作用。因此,软化输出可以帮助新模型学习更多知识。


同样,假设新模型softmax的输入得分为 z i z_{i} zi,原模型softmax的输入得分为 v i v_{i} vi,则用交叉熵计算后的最小化函数为:
J = − p i T l o g ( q i ) J=-p_{i}^{T}log(q_{i}) J=piTlog(qi)
其中:
p i = e x p ( v i T ) ∑ j e x p ( v j T ) p_{i}=\frac{exp(\frac{v_{i}}{T})}{\sum_{j}exp(\frac{v_{j}}{T})} pi=jexp(Tvj)exp(Tvi)
q i = e x p ( z i T ) ∑ j e x p ( z j T ) q_{i}=\frac{exp(\frac{z_{i}}{T})}{\sum_{j}exp(\frac{z_{j}}{T})} qi=jexp(Tzj)exp(Tzi)

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值