学习率、损失函数以及batch norm在训练中的影响

本文探讨了训练过程中常见的问题,如loss函数停滞和梯度波动,着重介绍了学习率管理方法(Adagrad和RMSProp),以及BatchNorm在深度学习中的作用,包括如何在Pytorch中实施移动平均。
摘要由CSDN通过智能技术生成

训练过程中的Tips

​ 在本人之前的学习中,已经介绍了model bias,optimization issuse,overfitting,mismatch这些训练中会被卡住的情况。

​ 接下来,将介绍实践中更常见的training stuck情况。
在这里插入图片描述
​在实践中,经常会出现loss function的值随着时间流逝已经几乎不变了,这种不变的情况可能包含上述情况。但这些情况都不是最常见的情况,很少有人回去关注当loss function稳定时,gradient的大小变化。可能当loss不怎么变化时,gradient还处于一个比较高的值,且来回跳跃,接下来介绍这种情况。

学习率

我们都知道学习率这个超参数的重要性,在实践过程中动手调节学习率也是一件痛苦的事。
在这里插入图片描述

  • 过大的学习率很可能会陷入长时间的震荡,向错误的方向更新,也容易错过最优点走向别的地方。
  • 过小的学习率可以确保方向正确,但是Update所需的时间是万万不能忍受的,尤其实在gradient比较小的区域。

​ 面对这种情况,亟须一种能够自动变化的学习率来帮助我们既能保持方向的稳定性,又能保证update的效率。下面提出一些adaptive learning rate的方法。
在这里插入图片描述
​ 理想情况下,学习率能够在gradient大的时候变小,在gradient小的时候变大。且不同的参数往往需要不同的学习率。

Adagrad

​ 方便讲解,演示某个参数的更新。

​ Adagrad的更新方式是这样的,在gradient decent baseline中加入了额外的一个参数 σ i t \sigma_i^t σit这个参数放在分母的位置。

θ i t + 1 ← θ i t − η σ i t g i t \theta_i^{t+1}\leftarrow \theta_i^t-\frac{\eta}{\sigma_i^t} g_i^t θit+1θitσitηgit
在这里插入图片描述
​ 这个参数需要能够根据现有的梯度进行变化,且对每个参数、每一次迭代都是不同的。Adagrad选择方法为Root Mean Square来进行 σ i t \sigma_i^t σit的计算。

σ i t = 1 t + 1 ∑ i = 0 t ( g i t ) 2 \sigma_i^t =\sqrt{\frac{1}{t+1}\sum_{i=0}^t(g^t_i)^2} σit=t+11i=0t(git)2

在这里插入图片描述
​ 然而,Adagrad的更新方法仍然具有一定的缺陷,我的个人理解就是拥有一定的迟滞性,过去的梯度对当前的梯度的影响是固定且不可调节的,这在一定程度上不符合我们的需求。

RMSProp

​ RMSProp方法提出的很早,且其具体实现并不是在一篇论文中,而是一个视频中,所以大家想要具体了解其来源可以去检索其来源。
在这里插入图片描述
​ RMSProp方法中就引进了一个参数 α \alpha α,这个 α \alpha α能够调节当前梯度对更新大小的影响。

σ i 0 = ( g i 0 ) 2 \sigma_i^0 = \sqrt{(g_i^0)^2} σi0=(gi0)2

σ i t = α ( σ i t − 1 ) 2 + ( 1 − α ) ( g i t ) 2 \sigma_i^t=\sqrt{\alpha(\sigma_i^{t-1})^2+(1-\alpha)(g_i^t)^2} σit=α(σit1)2+(1α)(git)2

​ 这样在训练过程中,我们就能调节当前梯度在当前迭代中的影响,从而能够更快的对梯度变化做出响应。

​ RMSProp方法+Momentum方法就是Adam方法的原理啦。

θ i t + 1 ← θ i t − η σ i t m i t \theta_i^{t+1}\leftarrow\theta_i^t-\frac{\eta}{\sigma_i^t}m_i^t θit+1θitσitηmit

在这里插入图片描述
除了在学习率的调节方法上有上述部分方式之外,还有一些学习率的调节策略。这种策略都是学习率 η \eta η随时间的变化趋势指导。

θ i t + 1 ← θ i t − η t σ i t g i t \theta_i^{t+1}\leftarrow\theta_i^t-\frac{\eta^t}{\sigma_i^t}g_i^t θit+1θitσitηtgit

Learning Rate Scheduling

在这里插入图片描述

  • Learning Rate Decay

    • 随着训练进行,我们越来越接近目标点,所以应该谨慎地试探,慢慢降低学习率
  • Warm Up

    • 先增再减

      至于为什么是先增再减还没有一种严密的证明,只有一些合理的解释。

      • 有一种解释:在刚开始的时候,我们需要谨慎地探索周围的环境,等到大致情况都打探清楚就可以慢慢增大学习率。等到快要接近目标的时候,需要小心地探索以免错过,需要降低学习率。

损失函数的形式

​ 上面的情况都是在解决措施的方向做出一些改进,而有没有一种可能,我们从理论上该边loss function的形式,使loss function的样子能够看起来好看一点,走起来也容易走一些,不至于有太多磕磕绊绊和陷阱呢?

以分类的方式为例:

在分类中我们可以用MSE或者交叉熵(Cross Entropy)计算损失函数。

​ 关于分类问题呢,我就不给大家介绍了,毕竟脑子里也没多少墨水,大家可以看老师的课程做详细的学习。

​ 损失函数呢,大致就是分类器预测结果 y ‘ y^` y y ^ \widehat y y 的距离。损失函数的形式就可以通过改变评估两者距离的形式来改变。
在这里插入图片描述

  • Cross Entropy
    • e = − ∑ i ( y ^ i ln ⁡ y i ‘ ) e = -\sum_i(\widehat y_i\ln y_i^`) e=i(y ilnyi)
  • MSE
    • e = ∑ i ( y ^ ln ⁡ y i ‘ ) e=\sum_i(\widehat y\ln y_i^`) e=i(y lnyi)
      在这里插入图片描述
      可以看出来两个不同的损失函数带来的error surface是不同的,训练难度也是不同的,其中cross-entropy明显更胜一筹。

Batch Norm

​ 在训练过程中,每个数据输入的大小的range都是不确定的,所以在参数上就会容易造成不平衡的状态,使Loss function更加复杂,训练过程更加困难。如果我们想要将原input的error surface变得漂亮一点,变得更加适合训练过程。那我们可以将每一dimension都scale到相同的尺度,这样gradient在各个方向上都不会有特别复杂的差异,训练过程相应也会轻松许多。

Feature Normalization

将输入的所有样本的同一维度dimension i做normalization。

正则化的过程就是:

  1. 计算 m e a n : m i mean:m_i mean:mi s t a n d a r d d e v i a t i o n : σ i standard deviation:\sigma_i standarddeviation:σi
  2. x ~ i r ← x i r − m i σ i \widetilde x_i^r\leftarrow \frac{x_i^r-m_i}{\sigma_i} x irσixirmi
    在这里插入图片描述
    其实就是,同一纬度的所有样本的element都减去这一维度的均值然后除以标准差。

这样处理过后的数据每一维度的均值为0,标准差为1,range(0,1)。

Deep Learning Normalization in Train Batch

​ 我们可以考虑在深度学习中使用Normalization来改善学习过程。
在这里插入图片描述
​ 我们输入的数据正则化之后,经过权重的加持,每一层的输出又不是统一range了,所有我们就可以对每一层的输出做normalization,这个normalization可以在sigmoid函数之前或者之后做都行,没有要求。

​ 然而我们肯定不是对所有的样本做normalization,而是结合Batch,只对Batch中有的样本进行Normalization。
在这里插入图片描述

​ 只是我们不知道这种batch normalization会不会对训练有什么不利的影响,所以我们又在正则化中引入了新的参数 γ , β \gamma,\beta γ,β,这两个参数同样是需要学习的。为了保持normalization,这两个参数分别初始化为1和0。

ps:上述中的向量运算都是element的运算,标量运算。

Pytorch中的Batch Norm

​ 之前介绍的都是训练过程中的normalization,然而在推理或者测试的时候,我们根本就没有那么多样本进行normalization,肯定不能等凑齐一Batch才进行测试。

Moving average

​ 看过pytorch的同学应该知道,Pytorch在训练的过程中会记录每一batch的 μ i \mu^i μi,然后计算** μ ‾ = p μ ‾ + ( 1 − p ) μ t \overline \mu = p\overline \mu + (1-p)\mu^t μ=pμ+(1p)μt,**也就是使用当前训练batch的 μ \mu μ与以往的 μ ‾ \overline \mu μ插值计算得到当前的均值,p也是需要调整的超参数,在pytorch中有调好的。

​ 而在测试的时候,就是用训练过程中的 μ ‾ \overline\mu μ就行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值