当前位置: 首页 > article >正文

神经网络训练不起来怎么办(五)| Batch Normalization

Ⅰ,领域背景

训练困境:当 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] 李宏毅 | 课程视频 | 神经网络训练不起来怎么办?(五)


http://www.kler.cn/a/287922.html

相关文章:

  • 用PHP实现一个简单的http服务器
  • 支持向量机SVM——基于分类问题的监督学习算法
  • LlamaFactory介绍
  • w~视觉~合集23
  • web——sqliabs靶场——第六关——报错注入和布尔盲注
  • Ubuntu 18 EDK2 环境编译
  • 【无标题】html前段小知识点
  • Django Admin对自定义的计算字段进行排序
  • hugging face 利用现有模型进行预测
  • C语言 strlen求字符串长度
  • Linux驱动(三):字符设备驱动之杂项
  • Go wv(WebView2) GUI框架介绍和使用
  • 【Python报错已解决】“NameError: name ‘re‘ is not defined”
  • BeanFactory 和 FactoryBean 的区别
  • 用QT写一个加载模板文件,替换关键字为实际值
  • 【前端框架】你知道的前端框架有哪些呢
  • JavaWeb(基于SpringBoot开发)全总结(1)
  • 藏头诗娱乐小程序源码
  • 如何在 Spring Boot 中创建自定义注解简化重复编码
  • 栈和队列
  • 一 lua学习笔记:概述
  • 第L2周:机器学习-线性回归
  • Ubuntu系统本地搭建WordPress网站并一键发布内网站点至公网实战
  • 20-22 - 打造专业的编译环境
  • Language Models are Few-Shot Learners
  • 【计算机网络复习资料】