L04_机器学习:批次(Batch)与动量(Momentum)

机器学习:批次(Batch)与动量(Momentum)

回顾:使用Batch进行最优化

在实际的最优化过程中,我们将很多的数据分成好多份,每一份算出一个 L i L^{i} Li出来,然后使用它迭代计算 θ ∗ \mathbf{\theta}^{*} θ具体过程如下图所示
请添加图片描述
update \textbf{update} update:是使用一个 b a t c h batch batch中的数据训练出的 L L L迭代一次。

epoch \textbf{epoch} epoch:使用每一个 b a t c h batch batch迭代过一次 θ \mathbf{\theta} θ,每一个epoch之后会重新分配batch进行训练(Shuffle)。

Small Batch v.s. Large Batch

假设总共有20个数据。(N=20)

Large Batch

每一批的数据大小为20个,也就是说不分批次训练(Full Batch)。这样的话,每次更新都是使用所有数据进行更新参数,每一次更新耗费时间较长,但是走的方向比较稳健,更容易向准确的方向走。

Small Batch

每一批数据的大小为1个,也就是说分成20个Batch。更新次数比较多,每一个epoch会更新20次。但是这样每一次更新找到的更新方向不会太准确。

但是,如果考虑并行Large Batch花费的时间不一定比Small Batch 花费的时间长。

具体训练效果对比

更新时间对比

请添加图片描述
通过对比可以发现,在batch大小在1000以内时,每一次更新时间相差无几,但是,当batch相对较大的时候,每一个epoch的更新次数就会减少,因此一个epoch所耗费的时间更少。

不同大小的batch训练出的模型的准确率对比

请添加图片描述

可以发现,小的Batch Size在训练模型上有更好的表现。而大的Batch Size表现不好是因为最优化失败。"Noisy"的更新对训练模型有帮助

为什么小的Batch Size 会有比较好的结果?

对于Full Batch,只有一个损失函数,很容易就会卡在critical point上,但是Small Batch每一次进行更新所使用的损失函数是不一样的,可能参数更新卡在了Batch1的损失函数上,但是Batch2的损失函数可能就可以继续进行更新。因此,Noisy的Gradient有帮助

Small Batch在测试集上更好

当解决了Large Batch最优化的问题,从实际案例中可以发现训练时Small Batch和Large Batch得到几乎一样的结果,但是测试阶段Small Batch表现的更好。

Small Batch更好的原因

具体的原因有待研究,但是现在有一种解释方法。

请添加图片描述

对于局部最小值也有好有坏,比如认为平原(Flat Minima)就要比峡谷(Sharp Minima)更好。如上图所示,假设测试损失函数相比于训练损失函数有一点小小的平移,那么对于平原来说影响并不是很大,但是对于峡谷来说,一个微小的移动就会使测试损失函数发生较大的变化。一般认为Small Batch更新的方向比较Noisy,不容易进入峡谷的狭口里边,而Large Batch更新方向比较稳定,很容易就会进入到峡谷里边。

将两种方法的优点相结合

经过对比可以发现,不同的Batch Size具有不同的优缺点,如下图所示:
请添加图片描述

现在有一些算法可以通过增加Batch Size来缩短训练时间,通过一些其他的方式解决Large Size出现的问题,从而提高训练模型的效率。

动量(Momentum)

有可能对抗一些Local Minima和Saddle Point,假设损失函数的曲线就是物理世界中的斜坡,而参数是一个移动的球,,把球从斜坡上滚下,如果动量够大就会有可能跳出一些Local Minima和Saddle Point。

具体实现

Gradient Descent回顾

每到一个位置,会计算这个位置的梯度 g g g,向梯度反方向前进一小段距离,然后重新计算梯度,并且以此循环,如下图所示:

请添加图片描述

Gradient Descent + Momentum

每一次的移动方向不仅仅为梯度反方向,还要加上上一步移动的方向,共同决定当前参数更新的方向。
请添加图片描述
m i m^{i} mi是先前所有梯度的加权和: g 0 , g 1 , … , g i − 1 g^{0},g^{1},\dots,g^{i-1} g0,g1,,gi1
m 0 = 0 m 1 = − η g 0 m 2 = − λ η g 0 − η g 1 ⋮ ⋮ m^{0}=0\\ m^{1}=-\eta g^{0}\\ m^{2}=-\lambda \eta g^{0}-\eta g^{1}\\ \vdots\\ \vdots m0=0m1=ηg0m2=ληg0ηg1

文中图片均来自李宏毅老师机器学习(2021)课程

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段话是一个配置文件,用于指定训练神经网络模型的超参数和数据集参数。具体解释如下: - setup: selflabel:表示使用自标签技术进行训练。 - confidence_threshold: 0.99:表示置信度阈值为0.99。 - use_ema: True,ema_alpha: 0.999:表示使用指数移动平均(EMA)方法进行训练,并设置EMA的衰减系数为0.999。 - criterion: confidence-cross-entropy,criterion_kwargs: apply_class_balancing: False:表示使用置信度交叉熵损失函数进行训练,并关闭类别平衡。 - backbone: resnet50,num_heads: 1:表示使用ResNet-50作为模型骨架,并设置模型头数为1。 - train_db_name: imagenet_50,val_db_name: imagenet_50,num_classes: 50:表示使用ImageNet-50数据集进行训练和验证,并共有50个类别。 - augmentation_strategy: ours,augmentation_kwargs: crop_size: 224,normalize: mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225],num_strong_augs: 4,cutout_kwargs: n_holes: 1 length: 75 random: True:表示使用作者自己的数据增强策略进行训练,并设置裁剪尺寸为224、归一化参数为给定值、强增强次数为4、cutout参数为1个洞、洞的大小为75,并随机选择位置。 - transformation_kwargs: crop_size: 224,normalize: mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225]:表示在验证时使用裁剪尺寸为224、归一化参数为给定值的数据增强策略。 - optimizer: sgd,optimizer_kwargs: lr: 0.03,weight_decay: 0.0,nesterov: False,momentum: 0.9:表示使用随机梯度下降(SGD)优化器进行训练,并设置学习率为0.03、权重衰减为0.0、是否使用Nesterov动量为False、动量系数为0.9。 - epochs: 25,batch_size: 512,num_workers: 16:表示总共训练25个epochs,每个batch的大小为512,使用16个worker进行数据加载。最后,scheduler: constant表示使用恒定的学习率调度程序,即不会随着训练过程中的epoch数量而改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值