深度学习之与学习相关的技巧(篇三Batch Normalization与正则化)

#深度学习

        在上一篇,我们观察了各层的激活值分布,并从中了解到如果设定了合适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利地进行学习。那么,为了使各层拥有适当的广度,“强制性”地调整激活值的分布会怎样呢?实际上,Batch Normalization[11]方法就是基于这个想法而产生的。

        1. Batch Normalization

        Batch Normalization[1]是一种在深度学习中用于提高训练速度和稳定性的技术,由 Sergey Ioffe 和 Christian Szegedy 在2015年提出。它的主要目的是解决在训练深度神经网络时内部协变量偏移(Internal Covariate Shift)的问题。

        内部协变量偏移指的是神经网络在训练过程中,由于每层输入的分布不断变化,导致每层的权重需要不断适应这些变化,这会使得训练过程变得缓慢且难以收敛。Batch Normalization通过以下步骤来解决这个问题:

  1. 标准化:对每个特征在小批量数据上进行标准化处理。具体来说,对每个特征,计算小批量数据的平均值和标准差,然后使用这些值将每个特征标准化到均值为0,标准差为1的分布。

            

    其中,𝑚是批量大小,𝜖是一个很小的数,以避免除以零。

  2. 缩放和移位:通过引入两个可学习的参数(缩放因子γ和移位因子β),对标准化后的数据进行缩放和平移,以保持网络的表示能力。

        Batch Normalization的好处包括:

  • 加速训练过程:通过减少内部协变量偏移,可以使更高的学习率成为可能,从而加速网络的训练。
  • 减少对初始化的依赖:由于Batch Normalization可以控制激活函数的输入分布,因此网络对权重初始化的敏感度降低。
  • 正则化效果:在训练过程中,每个小批量数据引入了噪声,这可以作为一种形式的隐式正则化,有助于防止过拟合。

        在应用Batch Normalization时,通常将其放置在卷积层或全连接层之后,并且紧接在激活函数之前。然而,在某些情况下,例如在循环神经网络(RNNs)中,应用Batch Normalization较为复杂,因为它涉及到时间序列数据的处理。

        但是Batch Normalization毕竟已经过去多年,目前比较先进的技术有以下几种:

                

  1. 混合精度训练和多GPU训练:Sebastian Raschka的研究表明,通过使用混合精度(mixed-precision)方法和多GPU训练模式,可以在最小代码更改的情况下显著提高PyTorch模型训练的速度。这种方法通过优化计算效率和内存使用,实现了更快的训练速度  。

  2. 大规模深度学习模型的高效训练技术:一篇综述论文详细回顾了加速大规模深度学习模型训练的一般技术,这些技术包括数据集正则化、数据采样、压缩训练、模型初始化、学习率的选择和调整、有效目标的设计、模型平均技术等。这些方法旨在减少计算复杂度,提高参数计算的效率,以及改进大模型的通用性和稳定性  。

  3. 硬件加速和优化代码:使用GPU或TPU等加速器可以显著提高训练速度。同时,优化代码以减少不必要的计算也是提高训练效率的关键。例如,使用高效的编程语言和库,以及对代码进行优化  。

  4. 预训练模型的使用:利用预训练模型可以缩短训练时间并提高模型性能。预训练模型已经学习了大量的特征,可以直接用于新的任务,从而提高训练效率  。

  5. Hugging Face的PyTorch新库「Accelerate」:这个库旨在简化多GPU、TPU和混合精度训练的过程,使得开发者能够更高效地利用硬件资源进行深度学习模型的训练。通过提供一系列工具和功能,开发者能够轻松地扩展模型训练到多个GPU和TPU上,进一步提高模型的训练效率和准确性  。

        2. 正则化

        机器学习的问题中,过拟合是一个很常见的问题。过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模型可以进行正确的识别。我们可以制作复杂的、表现力强的模型,但是相应地,抑制过拟合的技巧也很重要。

        2.1 过拟合

        发生过拟合的原因,主要有以下两个。

        •模型拥有大量参数、表现力强。

        •训练数据少。

如下图1所示,当寻来你的精度远远大于测试的精度时,就是发生了过拟合的现象。下面我们来介绍几个抑制过拟合的方法。

        2.2 权值衰减

        权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。

        权值衰减(Weight Decay)是一种在训练神经网络时使用的技术,它是一种正则化方法,旨在防止模型过拟合。权值衰减通过对网络的权重施加惩罚,来限制权重的增长,从而减少模型的复杂度。

        在数学上,权值衰减通常通过在损失函数中添加一个与权重大小的平方成正比的项来实现。对于具有权重 𝑤 的神经网络,原始的损失函数 𝐿 可以表示为:

      

        其中,𝜆λ是权值衰减系数,它决定了正则化强度的大小。较大的 𝜆 值会使得权值衰减对模型的影响更大,可能会使得模型更加简单,减少了过拟合的风险,但也可能降低模型的预测能力。因此,𝜆 的选择通常需要通过交叉验证来确定。

        权值衰减在机器学习社区中有多种叫法,有时也被称为L2正则化或Tikhonov正则化。尽管在优化算法中,权值衰减通常被解释为对权重进行衰减处理,但在实践中,更常见的是通过修改梯度下降算法来实现。具体来说,包含权值衰减的梯度下降更新可以表示为:

        

        

        

        虽然训练数据的识别精度和测试数据的识别精度之间有差距,但是与没有使用权值衰减的图1的结果相比,差距变小了。这说明过拟合受到了抑制。

        2.3 Dropout

           作为抑制过拟合的方法,前面我们介绍了为损失函数加上权重的L2范数的权值衰减方法。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用Dropout[1]方法。

          Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递,如图3所示。训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。      

图4左边为没有使用Dropout,右边为使用了Dropout。

        通过使用Dropout,训练数据和测试数据的识别精度的差距变小了。并且,训练数据也没有到达100%的识别精度。像这样,通过使用Dropout,即便是表现力强的网络,也可以抑制过拟合。

好啦,今天的分享结束,下期再见!

参考文献:

[1] Frederik Kratzert’s blog“Understanding the backward pass through BatchNormalization Layer”.

[2] N. Srivastava, G. Hinton, A. Krizhevsky, I. Sutskever, and R.Salakhutdinov(2014):Dropout: A simple way to prevent neuralnetworks from overfitting. The Journal of Machine Learning Research,pages 1929 – 1958, 2014.

[3]《深度学习入门:基于Python的理论与实现》作者:斋藤康毅(日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值