ReLU 网络的初始权重应该是什么值?
在过去的 5 年里,关于神经网络初始化的理论工作非常多,但显然还没有传播到更广泛的深度学习社区。虽然确实没有适用于所有架构和所有激活函数的初始化(而且很可能永远不会是,根据我们迄今为止对深度神经网络动态的理解),实际上这并不是一个巨大的限制,因为大多数用户使用两个或三个激活函数(用于 CNN 的 ReLU,用于 LSTM 的 tanh 和 sigmoid,AKA 是唯一的大多数人使用的 RNN)和两个或三个架构(即用于图像分类的 ResNet 和用于序列预测或时间序列预测的 LSTM)。对于这些事情,我们确实有一些强有力的结果。当然,他们不会为刚刚在 ICML 2018 上展示的 Universal Transformer 工作,但坦率地说,现在有更多的人试图将 ResNets 等“标准”架构应用于有趣的业务问题,他们需要比 Xavier 更好的初始化,而不是发明的人最前沿的架构,他们总是不得不使用经典的、可靠的初始化策略:肘部油脂,也被称为“漫长而无聊的计算实验,由仔细的簿记支持”。
深度线性网络
第一个主要结果显示在Andrew Saxe 等人 2014 年关于深度线性网络的最佳激活的开创性工作“深度线性神经网络中学习的非线性动力学的精确解决方案”中,它使用了随机矩阵的结果理论,特别是来自自由概率论(准确地说是非交换随机变量的概率理论,例如随机矩阵),以表明使用随机正交权重提供的结果比通常的缩放正态初始化要好得多。这个结果背后的理论概念是动力学等距,即在尽可能高维度的子空间(权重空间)上,使与误差信号反向传播相关的雅可比行列式的乘积作为近似等距,直至某些整体的全局常数附近的小范围内尽可能多地具有雅可比乘积的奇异值,并且与压缩感知和随机投影中的受限等距概念密切相关。
深度非线性网络
但是,Saxe 的结果不容易转化为具有非线性激活函数的“真实”NN。可以尝试应用随机正交矩阵初始化,并且有一些“制度”,例如“混乱的边缘”,它确实对于一个很难训练的架构(一个完全连接的神经网络,具有 100层,每层 1000 个单位和 tanh 激活 (!!!))。但是在这个机制之外,没有任何保证:结果甚至可能比 Xe 初始化更差,所以你回到“试试看”。
然而,3 年后,出现了两篇不同的论文,通过尝试实现非线性网络的动态等距,将 Saxe 的工作扩展到非线性神经网络。其中之一是 Pennington 等人的工作,“Resurrecting the sigmoid in deep learning through dynamical isometry: theory and practice”,第 31 届神经信息处理系统会议 (NIPS 2017),美国加利福尼亚州长滩。这篇论文没有找到对 ReLU 网络有用的初始化方法,但它找到了对 tanh 网络非常好的初始化方法。由于您对后者感兴趣,我将跳过这一点,只是为了完整起见在这里列出。
另一篇是 Balduzzi 等人著名的 Shattered Gradients 论文(Balduzzi 等人,“The Shattered Gradients Problem: if resnets are the answer, then what is question?”,arXiv:1702.08591v2, 2018),该论文提出使用所谓的 Looks-Linear (LL) 激活的 Saxe 随机正交权重。方法如下:
用 CReLU 替换所有 ReLU,即级联整流器:基本上,这些与 ReLU 单元非常相似,但不是
我们有
(注意)。当您在这里时,您可能希望将单元数减少 2,以保持与以前相同的参数数量。
现在,每一层都有一个权重矩阵,它的元素数量是以前的两倍,如果你没有减少每层中的单元数量以实现与初始架构的参数奇偶校验。在任何情况下,它都是具有奇数列的矩阵,因为 CReLU 激活函数,因此其中和具有相同的形状。现在,为每一层采样一个矩阵与正交列,形状与相同,并将初始化为。显然,在初始化时,您现在有一个线性网络,因为
这就是为什么我们称这种初始化为 LL(看起来是线性的)。
LL-init 可以很容易地“扩展”到 CNN(有关详细信息,请参阅引用的论文)。它确实有强迫你改变你的架构的缺点,尽管它是一个简单的改变。
最后,基于理论和实验相结合的最令人印象深刻的结果是 Xiao 等人的 Delta-Orthogonal 初始化,“Dynamical Isometry and a Mean Field Theory of CNNs: How to Train 10,000-Layer Vanilla Convolutional Neural Networks”,arXiv:1806.05393v2,2018 年。这个初始化器获得了惊人的结果,例如允许使用 tanh 激活成功训练 10000 层 vanilla CNN,几乎没有任何正则化技术(没有 dropout、没有残差连接、没有 Batch Norm、没有权重衰减和没有学习率衰减:网络仅依赖于具有正则化动量的 SGD)。初始化甚至作为 Tensorflow 初始化运算符套件中的ConvolutionOrthogonal 初始化器包含在 Tensorflow中。
遗憾的是,这个初始化器只在 tanh CNN 上发挥作用,而不能保证为 ReLU CNN 提供惊人的加速。而 tanh CNN 在对象分类方面确实很烂:当前 CIFAR-10 上的 tanh CNN 的 SOTA 测试误差超过 10%,而使用修改后的 ReLU ResNet,我们低于 3%。
初始化是一个主题,其中只有两个毫无帮助的事实是确定的:
神经网络可能对您使用的初始化策略非常敏感。
对于不同的问题类型、网络架构、激活函数和数据集,没有一个通用的“最佳选择”始终如一。有很多实验。
这就是为什么在任何现代神经网络软件中经常会实施大量不同的初始化策略。
这些中的每一个也有一个统一的变体。
Glorot Normal(又名 Xavier 初始化)
“它从以 0 为中心的截断正态分布中抽取样本, stddev = sqrt(2 / (fan_in + fan_out))
其中fan_in
是权重张量中的输入单元数,是权重张量fan_out
中的输出单元数。” - Keras 文档
He 正常初始化
“它从以 0 为中心的截断正态分布中抽取样本,stddev = sqrt(2 / fan_in)
其中fan_in
权重张量中输入单元的数量。” - Keras 文档
LeCun 普通初始化程序。
“它从以 0 为中心的截断正态分布中抽取样本,stddev = sqrt(1 / fan_in)
其中fan_in
权重张量中输入单元的数量。” - Keras 文档