动手学深度学习笔记(三)

ryluo 2020-06-14 01:29:22
动手学深度学习系列

卷积神经网络中常用的模块,包括批量归一化、残差块, Inception块, Droupout, 数据增强, 模型微调, 未完成…

批量归一化(BN)

为什么要有Batch Normalization(BN)?

BN属于深度学习中的一种训练模型的技巧。BN的目的是使得模型每一层的参数分布一致,这样就可以让模型的训练更加的稳定。使得学习参数的分布一致,是不是想到了机器学习中经常将数据进行归一化,是的没错,BN也是类似的功能,只不过对深层的神经网络来说就是让每一层的输出(也就是下一层的输入)进行归一化。

BN具体做了什么?

正如上述所说的,BN的目的就是归一化神经网络每一层的输出, 用更加专业的话来说是解决Internal covariate shift, 如下是论文中给出的算法步骤.

对算法的大致描述是: 对于一个小批量的数据, 先求出该小批量数据的均值$\mu_B$和方差$\delta^2_B$, 然后利用$\mu_B$和$\delta^2_B$,来归一化当前的输出$x_i$得到新的输出$\hat{x_i}$. 最后引入了两个可学习的参数$\gamma$和$\beta$. 对输出的数据分布进行拉伸.


全连接层与卷积层的输出分别如何做BN?

1.全连接层:

假设一个批量的数据有$m$个数据组成, 假如数据的维度是$(m, d)$

首先对小批量数据求均值和方差, 公式如上图中的$\mu_B$和$\delta_B^2$, 但是需要注意的是在全连接层中是沿着数据维度的第0维进行计算, 也就是说计算完的均值和方差的维度是(, d), 没有了batchsize的维度, 相当于是一个d维的向量, 最终每个神经元的维度都有一个均值和方差

最后将得到的均值和方差进行归一化和拉伸操作, 需要注意的是拉伸操作的两个参数$\gamma$和$\beta$是可学习的, 并且是通过模型在多个小批量数据上的易懂平均进行更新的.

mean = X.mean(dim=0)
var = ((X - mean) ** 2).mean(dim=0)

2.卷积层

假设有一个批量的Feature map维度为$(m, c, h, w)$, 分别表示特征图的批量大小, 通道数, 高和宽.

对于卷积层的均值和方差是沿着$(m, ,h, w)$维度进行计算的, 计算所得的均值与方差的维度为$(, c, , )$, 也就是只剩下通道维度, 最终每个通道都有一个均值和方差, 然后进行归一化和拉伸

mean = X.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
var = ((X - mean) ** 2).mean(dim=0, keepdim=True).mean(dim=2,keepdim=True).mean(dim=3, keepdim=True)

BN可以缓解梯度消失于爆炸吗?

在原文中有提到, BN有缓解对于Sigmoid激活函数的网络梯度消失与爆炸的问题, 除此之外还可以当模型在训练的时候使用更大的学习率, 从而提高学习效率, 加快收敛速度, 使模型正则化, 防止模型过拟合


残差块

在卷积神经网络中, 当网络层数比较深的时候, 即使使用Batch Normalization也还是会发生梯度消失和爆炸的问题, 使得模型的层数总是有一个上限, 这样看来模型在深度上还是限制了模型的拟合能力. 为了让模型可以变得更深,让模型的拟合能力更强, 复杂度更高, 何凯明团队提出了残差网络, 这也使得后面载卷积神经网络中模型的深度达到了上千层.

而残差网络最基本的单元以及最核心的思想就是残差块, 如下图所示, 图中左边虚线框为$f(x)$是模型需要学习的拟合函数, 而右图中的虚线框$f(x) - x$是残差块需要学习的拟合函数, 对于左边的模型直接前向传播, 当模型深度加深很容易使得模型发生梯度消失和爆炸. 但是右边学习残差的拟合却可以有效的缓解.

为什么使用残差块可以缓解梯度消失和爆炸呢?

先回想一下引起梯度消失于爆炸的原因: 由于模型比较深导致在反向传播时利用链式求导法则不断计算的时候, 可能会使得比较小的梯度值在传播过程中越来越小, 直到变成零; 而对于梯度值比较大的时候, 在反向传播的时候, 梯度值越来越大, 直到$∞$. 所以能够对层进行归一化的Batch Normalization可以一定程度上使得计算的梯度值不会太大或者太小, 但是当网络的层数非常大的时候, BN也无法保证梯度计算的稳定性.

从残差块可以看出, 在每个残差块的后面, 都是直接将该残差块的上一个输入直接加到最后的拟合函数上, 使得真正模型的学习是由$f(x)-x$进行的, 这种跨层的连接线路让数据更快的往前传播, 此外,在计算梯度的时候由于每个残差块之间有一个加法计算, 所以计算梯度的时候不在与没有残差块那样一直从最后面的梯度乘到最前面, 中间出现了很多次加法运算, 所以很大程度上使得梯度消失和爆炸问题得到了解决.

既然在加深了网络层数, 还不会导致梯度消失和爆炸, 那这种网络肯定比浅层的网络的拟合能力更强, 这也是后续很多深层网络架构设计的思路. 将残差网络利用到极致的网络结构是DenseNet, 充分利用了模型浅层提取的信息, 将浅层网络直接拼接在深层网络上, 如下图所示.

但是需要注意的是, DenseNet中的跨通道连接与ResNet中残差块的连接不太一样, ResNet中是相加的操作, 而DenseNet是按照通道维度进行拼接, 如下图所示


Inception块

其实为了增加模型的复杂度, 不仅可以加深网络的深度还可以加深网络的宽度, 例如Google团队提出的InceptionNet系列, 如下图是InceptionV1. 从图中可以看出, 每个模块都是多尺度特征的融合, Google在这一些列上也不断进行了改进, 感兴趣的可以去查找相关的资料学习, 这里只是说了一种提高网络复杂度的一种方法, 或许在我们自己设计网络结构时需要多尺度的信息, 也可以参考该系列进行改进.


Dropout

为了防止模型过拟合, 研究者们还提出里一种叫做丢弃法的技术, 来缓解模型发生过拟合, 但是这种丢弃发用在全连接层比较多. 下图是丢弃法的示意图:


目的:减少神经元对部分上层神经元的依赖,类似将多个网络模型集成来降低模型过拟合

实现:在训练时以一定的概率失活神经元,也就是让神经元的输出为0(需要注意,这里是让神经元的值为零,而不是这一层的参数为0, 也可以认为是这些失活神经元对应的参数在失活的这一次中参数不更新, 后面可能失活别的神经元, 这些不更新的参数可能在之后的过程中会被更新),此外为了使得训练与测试时,网络层的输出有大致相同的期望,在训练的时候需要对进行了Dropout层的输出值进行一个拉伸,也就是$\frac{x}{p}$($x$表示的是输出, $p$是失活的概率)。

训练与测试时的不同:训练时需要以概率p对神经元进行失活,但是测试的时候是使用所有参数,也就是dropout没有起作用。

Dropout与BN的比较:

Dropout与BN同时使用可能发生的问题:

从上面的分析可以知道,BN是为了让网络的每一层有相似的分布,而Dropout是以一定的比例随机失活神经元,并且对输出进行一个拉伸。

如果BN和Dropout同时使用,那么刚被BN归一化后的输入,经过Dropout失活在拉伸之后,相当于之前BN的归一化分布就失效了,先Dropout然后经过BN的话,其实Dropout的拉伸作用也发生了变化,所以随着网络的训练方差会越来越大,最后影响模型的性能

解决办法:尽量不要将这两种方法一起使用,当然也有学者研究,将Dropout与BN同时使用的方法,就是引入了高斯分布的Dropout。


数据增强

在计算机视觉领域, 对图像数据进行数据增强进而提高模型的性能是非常常见的技巧, 常用的图像增强方法有:

单样本空间几何变换:

翻转,旋转,裁剪,缩放,没有改变图像本身的内容,选择了图像的一部分或者像素的空间重分布,一般深度学习框架中都有现成的transform的API

单样本像素内容变换:

噪声,模糊,颜色扰动,内容改动大,多样性强,一般深度学习框架中都有现成的transform的API

多样本插值SMOT:

Synthetic Minority Over-sampling Technique(SMOT)方法, 可以缓解样本不平衡问题, 近邻样本$(x_n, y_n)$插值公式:

Sampling Pairing:

随机抽取两张图片经过基础数据增强操作(如随机翻转等)处理后,直接叠加合成一个新样本,标签为原样本标签中的一种,用于降低测试集误差,对相似样本数据集有用.

多样本插值Mixup:

ICLR2018, Facebook的研究,具体做法是图像和标签都进行线性插值

数据增强开源项目, 推荐使用

涵盖主流的数据增强算法, python代码可以直接使用 ,项目连接, https://github.com/aleju/imgaug


模型微调

模型微调是一种常用的迁移学习的技术, 可以将源数据(预训练模型用来训练的数据集)上学到的知识迁移到目标数据集, 这样可以一定程度上降低当前任务对数据的依赖, 对于数据比较少的任务来说, 找到一些经过相似数据集训练过的预训练模型用来微调, 还可以在一定程度上防止过拟合. 下面介绍一下模型微调的四个常用的步骤:

源模型与目标模型大致可以用一下图来表示:


参考资料:

动手学深度学习教材及课程

有三AI微信公众号