这里回顾dlsys第九讲,本讲内容是归一化和正则化。

课程主页:

大纲

  • 归一化;
  • 正则化;
  • 优化、初始化、归一化、正则化的交互;

归一化

初始化vs优化

假设我们为ReLU网络选择初始化方式为$W_i\sim \mathcal N(0, \frac c n )$,不同的$c$会带来不同的训练结果:

然而,问题更为根本:即使训练成功,初始化时出现的效果/尺度在整个训练过程中都会持续存在:

归一化

  • 既然初始化对于训练非常重要,并且在训练过程中可能会发生变化,不再跨层/网络“一致”。
  • 但请记住,深度网络中的“层”可以是任何计算。
  • 让我们添加层来“修复”激活的规范化,使其成为我们想要的任何值!

Layer normalization

第一个想法:让我们标准化(均值零和方差一)每一层的激活函数值,这称为Layer normalization:

为每个项添加额外的标量权重和偏差也很常见(仅更改表示,例如,如果我们也可以将归一化放在非线性之前)。

LayerNorm效果

“修复”不同层激活范数的问题:

Batch normalization

一个奇怪的想法:让我们考虑更新的矩阵形式:

那么Layer normalization就相当于对这个矩阵的行进行归一化。相反,如果我们规范化它的列呢? 这称为Batch normalization,因为我们正在对minibatch的激活值进行归一化:

Minibatch依赖性

BatchNorm的一个奇怪之处在于它使每个示例的预测都依赖于整个批次。常见的解决方案是计算每层所有特征的均值/方差的滑动平均值$\hat{\mu}_{i+1}, \hat{\sigma}_{i+1}^2$,并在测试时通过这些量进行归一化:

正则化

深度网络的正则化

  • 典型的深度网络(即使是你在作业中写的简单的两层网络)都是过度参数化的模型:它们包含的参数(权重)多于训练样本的数量;
    • 这意味着(形式上,在一些假设下),它们能够准确地拟合训练数据;
  • 在“传统的”机器学习/统计思维中(有很多重要的警告),这应该意味着模型会过度拟合训练集,并且不能很好地泛化;
    • 但它们确实很好地概括了测试示例;
    • 但并非总是如此(许多较大的模型通常仍会过拟合);

正则化

  • 正则化是“限制函数类的复杂性”的过程,以确保网络更好地泛化到新数据;在深度学习中通常以两种方式发生。
  • 隐式正则化是指我们现有的算法(即SGD)或架构已经限制函数复杂性的方式;
    • 例如,我们实际上并没有优化“所有神经网络”,我们正在优化SGD能够优化的所有神经网络。
  • 显式正则化是指对网络进行修改,然后在训练过程正则化网络。

$\ell_2$正则化a.k.a权重衰减

传统上,模型参数(模长)的大小通常是复杂性的合理代表,因此我们可以在保持参数较小的同时最大限度地减少损失。

梯度下降更新的结果:

即,在每次迭代中,我们在采取梯度步骤之前将权重缩小一个因子$(1-\alpha\lambda)$。

$\ell_2$正则化的注意事项

$\ell_2$正则化在深度学习中非常常见,通常只是作为“权重衰减”项引入优化过程。
然而,回想一下我们具有不同初始化的优化网络:

参数模长大小可能无法很好地代表深度网络的复杂性。

Dropout

另一种常见的正则化策略,将每层的部分激活随机设置为零:

乍一看似乎很奇怪:这不会极大地改变被逼近的函数吗?

Dropout作为随机近似

Dropout经常被认为是使网络“健壮”以应对缺失的激活(但我们不在测试时应用它)。

将Dropout视为将与SGD类似的随机近似值用于个体激活的设置是有指导意义的:

优化、初始化、归一化、正则化的交互

许多设计选择旨在简化深度网络的优化能力:

  • 优化器学习率/动量的选择;
  • 权重初始化的选择;
  • 归一化层;
  • 正规化;

这些甚至不包括我们将在后面的讲座中介绍的许多其他“技巧”:
残差连接、学习率schedules等等。

如果你觉得深度学习的实践就是在大量GPU上随机摆动,也是情有可原的。

这里老师举了一些讨论BatchNorm作用机理的论文,论文之间的结论经常是矛盾的,老师借此吐槽深度学习的玄学性质。

结论

  • 我不想给人留下这样的印象,即深度学习完全是关于random hacks。
  • 但确实,我们并没有全面了解人们使用的所有不同的经验技巧是如何真正起作用和相互作用的。
  • “好”消息是,在许多情况下,似乎有可能通过截然不同的架构和方法选择获得类似的好结果。
    • 即大部分trick还是可以起作用的。