跳到主要内容

参数初始化

参数初始化是指为神经网络中的权重和偏置设置初始值的过程。当我们开始训练一个神经网络时,我们需要为其参数(即权重和偏置)选择一个初始值。这些初始值的选择对网络的训练速度和最终性能都有很大的影响。

什么是超参数

在机器学习中,超参数(Hyperparameter)是在开始学习过程之前设置的参数,与模型在训练过程中学到的参数(例如神经网络中的权重和偏置)相对。换句话说,超参数是在模型训练之前由开发者定义的,不是通过训练数据学得的。

超参数对于模型的性能和行为有很大的影响。例如,它们可以决定学习速率、正则化的程度、模型的复杂性等等。

常见的超参数包括:

  1. 学习率(Learning Rate):决定模型参数更新的速度。
  2. 批次大小(Batch Size):一次训练所用的样本数。
  3. 迭代次数/纪元数(Number of Epochs):模型完整地遍历训练数据集的次数。
  4. 正则化参数:例如 L1 和 L2 正则化的强度。
  5. 神经网络中的层数和每层的神经元数
  6. 优化器选择:例如 SGD, Adam, RMSprop 等。
  7. 早停参数(Early Stopping Parameters):例如多少个纪元没有性能提高时停止训练。
  8. Dropout率:在训练神经网络时,随机忽略某些节点的比率,用于防止过拟合。
  9. 初始化方法:如何设置模型初始参数(如 He initialization, Xavier initialization 等)。

选择适当的超参数是机器学习中的一个关键任务。这通常涉及到经验、实验和有时候是搜索过程(例如网格搜索或随机搜索)来确定最佳的超参数组合。

为什么参数初始化很重要?

  1. 避免梯度消失和爆炸:不当的初始化可能导致梯度消失(权重更新太小,网络学不到东西)或梯度爆炸(权重更新太大,网络变得不稳定)。
  2. 加速收敛:合适的初始化可以帮助网络更快地收敛到较低的损失。
  3. 避免对称性问题:如果所有神经元的权重都被初始化为相同的值,那么它们在训练过程中都会进行相同的更新。这意味着它们在整个训练过程中都是冗余的。通过随机初始化,我们可以打破这种对称性。

常见的参数初始化方法:

  1. 零初始化:所有权重都初始化为0。这通常是不好的,因为它会导致上述的对称性问题。
  2. 随机初始化:权重随机地初始化为非常小的值。这可以打破对称性,但如果值太小或太大,可能会导致梯度消失或爆炸。
  3. Xavier/Glorot初始化:权重从均匀或正态分布中随机初始化,其中方差为 2nin+nout\frac{2}{n_{\text{in}} + n_{\text{out}}} ,其中 ninn_{\text{in}}noutn_{\text{out}} 分别是输入和输出神经元的数量。这种初始化方法特别适用于sigmoid和tanh激活函数。
  4. He初始化:权重从正态分布中随机初始化,其中方差为 2nin\frac{2}{n_{\text{in}}} 。这种初始化方法特别适用于ReLU及其变种。
  5. LeCun初始化:权重从正态分布中随机初始化,其中方差为 1nin\frac{1}{n_{\text{in}}} 。这种初始化方法特别适用于sigmoid激活函数。
  6. 正交初始化:权重初始化为正交矩阵。这种初始化方法有助于保持权重在训练过程中的独立性。

总的来说,参数初始化是神经网络训练中的一个关键步骤。正确的初始化可以加速训练,提高模型的性能,而不当的初始化可能会导致训练失败。

Xavier/Glorot初始化:

Xavier或Glorot初始化是为深度神经网络中的权重选择初始值的方法。它是由Xavier Glorot和Yoshua Bengio在2010年的一篇论文中提出的,因此得名。这种初始化方法特别适用于sigmoid和tanh激活函数。

原理: Xavier初始化的核心思想是保持输入的方差和输出的方差相同,这样可以避免在深层网络中的梯度消失或爆炸问题。

数学描述: 权重 WW 从以下分布中随机初始化:

  1. 均匀分布WU(6nin+nout,6nin+nout)W \sim U\left(-\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}, \sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}\right)

  2. 正态分布WN(0,2nin+nout)W \sim \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\text{in}} + n_{\text{out}}}}\right)

其中,ninn_{\text{in}} 是输入神经元的数量,而 noutn_{\text{out}} 是输出神经元的数量。

例子:

假设我们有一个神经网络层,该层的输入神经元数量为 500,输出神经元数量为 200。我们想使用Xavier初始化方法来初始化这一层的权重。

  1. 对于均匀分布:

    • 下界:6500+200=0.0816-\sqrt{\frac{6}{500 + 200}} = -0.0816
    • 上界:6500+200=0.0816\sqrt{\frac{6}{500 + 200}} = 0.0816 因此,权重将从 [0.0816,0.0816][-0.0816, 0.0816] 的均匀分布中随机选择。
  2. 对于正态分布:

    • 均值:0
    • 标准差:2500+200=0.0577\sqrt{\frac{2}{500 + 200}} = 0.0577 因此,权重将从均值为0、标准差为0.0577的正态分布中随机选择。

在实际应用中,我们可以使用深度学习框架(如TensorFlow或PyTorch)来轻松地应用Xavier初始化。例如,在 PyTorch 中,可以使用 nn.init.xavier_uniform_nn.init.xavier_normal_ 函数来进行 Xavier 初始化。

Batchsize 的设置

增大 batch size的好处

在合理范围内,增大 batch size的好处

  • 内存利用率提高了,大矩阵乘法的并行化效率提高。
  • 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
  • 在一定范围内,一般来说 batch size 越大,其确定的下降方向越准,引起训练震荡越小。

随着 batch size 增大,处理相同数据量的速度越快。 随着 batch size 增大,达到相同精度所需要的 epoch 数量越来越多。由于最终收敛精度会陷入不同的局部极值,因此 batch size 增大到某些时候,达到最终收敛精度上的最优。

增大 batch size 有何坏处

盲目增大 batch size 有何坏处

  • batch size 增大到一定程度,其确定的下降方向已经基本不再变化。
  • 太大的 batch size 容易陷入 sharp minima,泛化性不好。
  • batch size 太小 收敛太慢,算法在 200 epoch 内不收敛。

不同的梯度下降算法的影响

不同的梯度下降算法下,不同 Batch Size 设置的影响

样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点,从而有机会去寻找更优的最优点。

因此,与之相反的,当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。

总结一下,batch 的 size 设置的不能太大也不能太小,因此实际工程中最常用的就是 mini-batch,一般 size 设置为几十或者几百。

使用更大的方差来试探最优点的质量。

所以在小 batch size 时,逐渐减少 learning rate 的神经网络玩的就是退火算法。 不同的 batch size 不仅仅会影响你的收敛速度,还经常影响你最终收敛时的准确率。 工程上实验验证 batch size 越大,比如 1000 对 100 的效果要差。即发现 batch 太多大, 训练一点效果没。

这之前我们的讨论是基于梯度下降的,而且默认是一阶的(即没有利用二阶导数信息,仅仅使用一阶导数去优化)。因此对于SGD(随机梯度下降)及其改良的一阶优化算法如Adagrad、Adam等是没问题的,但是对于强大的二阶优化算法如共轭梯度法、L-BFGS来说,如果估计不好一阶导数,那么对二阶导数的估计会有更大的误差,这对于这些算法来说是致命的。

因此,对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。

batch_size 与 2 的倍数

一般而言,根据你的 GPU 显存,设置为最大,而且一般要求是 8 的倍数(比如32,128),这样, GPU 内部的并行运算效率最高。

那么怎么选择 batch number 呢?就像刚才说的,8的倍数,然后是稍微大一点(一般而言)。另外一个方法,就是选择一部分数据,跑几个 batch 看看你的loss是不是在变小,选择一个合适的就可以了。

cpu 有预取,gpu 有合并访问,不仅仅要求长度是 2 的次方,内存地址也是有要求的。

另外,听说 GPU 对 2 的幂次的 batch 可以发挥更佳的性能,因此设置成 16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优。

Batch Size 使用总结

总结: Batch Size 决定训练速度,并且不应该被直接用于调整验证集性能。通常来说,可用硬件支持的最大 Batch Size 是较为理想的数值。

  • Batch Size是决定训练时间和计算资源消耗的关键因素。
  • 增加Batch Size通常会减少训练时间。这非常有益,因为它:
    • 能使固定时间间隔内超参数调整更彻底,最终训练出更好的模型。
    • 减少开发周期的延迟,能更多地测试新想法。
  • 资源消耗和 Batch Size 之间并没有明确的关系,增加Batch Size让资源消耗增加、减少或是保持不变都有可能。

Epoch 的大小

看 loss 曲线,如果 train loss 和 val loss 都还有下降空间,就继续加大 epoch,如果基本平了,加大 epoch 用处也不大了,如果 train loss 降 val loss 降着降着上升了,这说明,模型在 val loss 由降转升的转折点就收敛了。

References