深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应低层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。Google 将这一现象总结为 Internal Covariate Shift,简称 ICS. 什么是 ICS 呢?魏秀参做了如下回答:
大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同,即:对所有,但是大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。
ICS 会导致什么问题?简而言之,每个神经元的输入数据不再是“独立同分布”。
- 上层参数需要不断适应新的输入数据分布,降低学习速度。
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
因此,在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使得整个神经网络在各层的中间输出的数值更稳定。对全连接层和卷积层做批量归一化的方法稍有不同。下面我们将分别介绍这两种情况下的批量归一化。
3.1 对全连接层做批量归一化
我们先考虑如何对全连接层做批量归一化。通常,我们将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为 ,权重参数和偏差参数分别为 和 ,激活函数为 。设批量归一化的操作符为 。那么,使用批量归一化的全连接层的输出为
其中批量归一化输入 由仿射变换
得到。考虑一个由 个样本组成的小批量,仿射变换的输出为一个新的小批量 。它们正是批量归一化层的输入。对于小批量 中任意样本 ,批量归一化层的输出同样是 维向量
并由以下几步求得。首先,对小批量 求均值和方差:
其中的平方计算是按元素求平方。接下来,我们使用按元素开方和按元素除法对 标准化:
这里 是一个很小的常数,保证分母大于 。在上面标准化的基础上,批量归一化层引入了两个可以学习的模型参数,拉升(scale)参数 和偏移(shift)参数 。这两个参数和 形状相同,皆为 维向量。它们与 分别做按元素乘法(符号)和加法计算:
至此,我们得到了 的批量归一化的输出 。
值得注意的是,可学习的拉升和偏移参数保留了不对 做批量归一化的可能:此时只需学出 和。我们可以对此这样理解:如果批量归一化无益,理论上学出的模型可以不使用批量归一化。
3.2 对卷积层做批量归一化
对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉升和偏移参数,且均为标量。设小批量中有 个样本。在单个通道上,假设卷积计算输出的高和宽分别为 和 。我们需要对该通道中 个元素同时做批量归一化。对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中 个元素的均值和方差。
3.3 预测时的批量归一化
使用批量归一化训练时,我们可以将批量大小设的大一点,从而使批量内样本的均值和方差的计算都较为准确。将训练好的模型用来预测时,我们希望模型对于任意输入都有确定的输出。因此,单个样本的输出不应取决于批量归一化所需要的随机小批量中的均值和方差。一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。可见,和丢弃层一样,批量归一化层在训练模式和预测模式下的计算结果也是不一样的。
3.5 小结
- 在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使得整个神经网络在各层的中间输出的数值更稳定。
- 对全连接层和卷积层做批量归一化的方法稍有不同。
- 批量归一化层和丢弃层 (Drop Out) 一样,在训练模式和预测模式的计算结果是不一样的。
- 拉升参数 和偏移参数 保证了模型的表达能力不因为规范化而下降。
共同学习,写下你的评论
评论加载中...
作者其他优质文章