Deep learning 您是否在训练期间遇到过类似的问题,如丢失抖动?

Deep learning 您是否在训练期间遇到过类似的问题,如丢失抖动?,deep-learning,pytorch,tensorboard,loss,bert-language-model,Deep Learning,Pytorch,Tensorboard,Loss,Bert Language Model,背景:这是关于在每个训练阶段的开始阶段产生的损失抖动。当dataloader加载第一批数据以馈送到网络时,丢失值总是突然上升,然后从第二批数据恢复到正常值并继续下降。曲线很奇怪。我需要你的帮助 用于范围内的历元(开始历元,结束历元): 打印('进度:%.2f%%'%(100.0*epoch/end_epoch)) #分布式训练时将历元设置为采样器的随机种子 如果列车采样器不是None且为hasattr(列车采样器“设置历元”): 列车采样器。设置历元(历元) #重置指标 metrics.res

背景:这是关于在每个训练阶段的开始阶段产生的损失抖动。当dataloader加载第一批数据以馈送到网络时,丢失值总是突然上升,然后从第二批数据恢复到正常值并继续下降。曲线很奇怪。我需要你的帮助

用于范围内的历元(开始历元,结束历元):
打印('进度:%.2f%%'%(100.0*epoch/end_epoch))
#分布式训练时将历元设置为采样器的随机种子
如果列车采样器不是None且为hasattr(列车采样器“设置历元”):
列车采样器。设置历元(历元)
#重置指标
metrics.reset()
#将网络设置为训练模式
net.train()
#清除参数渐变
#optimizer.zero_grad()
#起始结束时间
结束时间=time.time()
如果isinstance(lr_调度程序、torch.optim.lr_调度程序、reducelRon调度程序):
name,value=validation\u monitor.metrics.get()
val=值[名称.索引(验证\监视器.主机\度量\名称)]
lr_调度程序步骤(val,历元)
#训练
列车装载机iter=iter(列车装载机)
对于范围内的批次(总尺寸):
尝试:
批次=下一个(列车装载机)
除停止迭代外:
打印('重置加载程序..')
列车装载机iter=iter(列车装载机)
批次=下一个(列车装载机)
全局步长=总步长*历元+批次
os.environ['global_steps']=str(global_steps)
#记录时间
时间中的数据=时间。时间()-结束时间
#将数据传输到GPU
数据传输时间=time.time()
批次=至_cuda(批次)
数据传输时间=time.time()-数据传输时间
#前进
前进时间=时间。时间()
输出,损耗=净(*批次)
损失=损失。平均值()
如果梯度累积步数>1:
损耗=损耗/梯度\累积\步数
前进时间=时间。时间()-前进时间
#落后的
后退时间=时间。时间()
如果fp16:
将安培标度损耗(损耗、优化器)作为标度损耗:
缩放损失。向后()
其他:
loss.backward()
后退时间=时间。时间()-后退时间
优化器_time=time.time()
如果(全局\u步数+1)%gradient\u累计\u步数==0:
#剪辑梯度
如果剪辑梯度标准>0:
如果fp16:
total_norm=torch.nn.utils.clip_grad_norm(amp.master_参数(优化器)),
夹子(梯度标准)
其他:
total\u norm=torch.nn.utils.clip\u grad\u norm(net.parameters(),
夹子(梯度标准)
如果writer不是None:
writer.add_scalar(tag='grad-para/Total Norm',
标量_值=浮点(总_范数),
全局步骤=全局步骤)
optimizer.step()
#step LR调度程序
如果lr_调度程序不是None也不是isinstance(lr_调度程序,
torch.optim.lr_调度程序.reducelRon):
lr_调度程序。步骤()
#清除参数渐变
optimizer.zero_grad()
optimizer\u time=time.time()-optimizer\u time
#更新度量
公制时间=time.time()
指标更新(输出)
如果writer不是None且nbatch%50==0:
使用手电筒。无梯度()
对于组i,枚举中的param组(optimizer.param组):
writer.add_scalar(tag='Initial-LR/Group{}).format(Group_i),
标量值=参数组['initial_lr'],
全局步骤=全局步骤)
writer.add_scalar(tag='LR/Group{}).format(Group_i),
标量值=参数组['lr'],
全局步骤=全局步骤)
writer.add_标量(tag='Train-Loss',
标量值=浮动(loss.item()),
全局步骤=全局步骤)
name,value=metrics.get()
对于zip中的n、v(名称、值):
如果n中的“登录”:
writer.add_scalar(tag='Train-Logits/'+n,
标量_值=v,
全局步骤=全局步骤)
其他:
writer.add_标量(tag='Train-'+n,
标量_值=v,
全局步骤=全局步骤)
对于输出中的k,v.items():
如果k中有“分数”:
writer.add_直方图(tag=k,
值=v,
全局步骤=全局步骤)
公制时间=time.time()-公制时间

您的数据集中有一批数据丢失率很高,就是这样

人们为每个批次存储度量值并不常见,通常存储的是历元平均值(或多个批次步骤的平均值)。如果存储平均值,就不会看到这样的峰值

您还可以通过洗牌数据来减少这些峰值,以便