Ⅰ,领域背景
训练困境:当 input feature 在不同 dimension 上差距很大的时候,会产生一个非常崎岖的 error surface(误差平面)。这种崎岖多变的误差平面容易导致训练陷入以下的几个困境。
- 收敛困难:在崎岖的误差表面上,梯度下降等优化算法很容易陷入局部最小值或者鞍点,并且很难继续优化。这会导致模型无法收敛到全局最优解,训练过程变得非常困难。
- 训练速度变慢:由于优化算法在崎岖的误差表面上可能会走弯路,需要更多的迭代次数才能找到较好的参数解,导致训练速度变慢
- 梯度消失或爆炸:梯度在崎岖的误差表面上可能会非常大或者非常小。这种情况会导致梯度消失或爆炸,使得模型参数更新不稳定,训练过程变得不可靠。
不要小看 optimization 这个问题,有时候就算你的 error surface 是 convex 碗状都不见得很好训练。如果我们采用固定的 learning rate,一般很难得到好的结果,所以才需要adaptive learning rate、 Adam 等改进过的 optimization 的方法。
Batch Normalization 则是通过直接改变 input feature 的分布,得到一张均匀、光滑的 error surface,使得训练变得容易。
Ⅱ,原理详解
举例理解: 如图展示了一个非常简单的 model,输入是 x1 和 x2,模型参数是 w1 和 w2。input feature 这两个 dimension 的 scale 差距很大:x1 是个位级的;x2 是百位级的。因此 w2 的更新会对最终的损失产生更大的影响,也就是说 w1 方向是相对平缓的,w2 方向是相对陡峭的,形成了一张不同方向上坡度非常不同的 error surface。
Feature Normalization:此时如果我们将 x1 和 x2 归一化到同样的数值范围,就可以得到一张均匀、相对光滑的 error surface,如图绿色的 error surface 所示。这种将 feature 归一化的方法统称为 Feature Normalization。更一般的,我们如果一共有 R 个 inputs,那么在每个 dimension 做 normalization,意味着仍然可以保留 inputs 在每个 dimension 上的比重,同时又使得每个 dimension 数值范围保持相同。
Batch Normalization:实际的训练中,我们是将数据以 batch 的大小送进去,因此我们只以 batch 为单元做 normalization,而不是直接对所有数据做 normalization,这招叫做 Batch Normalization。
scale and shift: Normalization 之后还包含了一个适应过程,通过引入了可学习的参数 γ 和 β,可以通过训练来学习最优的特征表示。换句话说,这两个可学习参数增加了模型的韧性和容量,能够留给神经网络一点自我发挥的空间,让它慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 γ 和 β 来抵消一些 normalization 的操作。
Deep Learning:在多层 layer 的网络架构中,每次经过线性变化后都可能使得 feature 的数值范围再次变得不一致,而每层的输出 feature 又将作为下一层的输入 feature。因此,需要在每层处理之后,重新进行 normalization(激活层前后进行 normalization 对训练效果影响不大)。
model testing:我们如果用 model 作 application 的时候,inputs 不像 train 的过程那样可以一次性给出,然后划分为 batch 一批一批进行送进去,也就没有 batch 的概念。在这种情况下,我们通常直接使用训练得到的 Batch Normalization 作为先验知识对 testing 过程中的每个 input 进行 normalize。
Ⅲ,实验分析
如下图所示,展示了不同训练条件下模型的收敛情况,其中横轴是训练过程,纵轴是模型在验证集上的准确率。观察图中的几条对比曲线,我们能够得到如下的结论:
- 加速收敛:黑色虚线是没有进行 Batch Normalization 的训练过程,其余的几条线都是有 Batch Normalization 参与的训练过程。很明显可以看出 Batch Normalization 可以加速模型的收敛速度,缩短训练时间。
- 允许使用更高的学习率:蓝色实线表示将学习率提高至原来的30倍,明显加速了收敛。由于 Batch Normalization 可以尽可能产生均匀、光滑的 error surface,因此可以使用更高的学习率来训练模型,加快收敛速度。
- 缓解了梯度消失的问题:sigmoid 作为激活函数,导致 feature 都分布在 sigmoid 梯度较小处,引起梯度消失的问题,导致模型无法训练起来。但是使用 Batch Normalization 之后,feature 集中在0附近,可以在 sigmoid 函数上产生较大的梯度,顺利反向传播。
Ⅳ,参考链接
[1] 李宏毅 | MACHINE LEARNING | 2021 SPRING
[2] 李宏毅 | 课程视频 | 神经网络训练不起来怎么办?(五)