神经网络训练tricks

1、先别着急写代码

训练神经网络前,别管代码,先从预处理数据集开始。我们先花几个小时的时间,了解数据的分布并找出其中的规律。比如何凯明发现暗通道去雾算法。

一旦从数据中发现规律,可以编写一些代码对他们进行搜索、过滤、排序。把数据可视化能帮助我们发现异常值,而异常值总能揭示数据的质量或预处理中的一些错误。

2、设置端到端的训练评估框架

下一步是建立一个完整的训练+评估框架。

这个阶段的技巧有:

· 固定随机种子

使用固定的随机种子,来保证运行代码两次都获得相同的结果,消除差异因素。

· 过拟合一个batch

比如在超分辨率中可以只测试一张图片,验证我们可以达到的最低损失(即最高性能指标)。

· Adam

在设定基线的早期阶段,使用学习率为3e-4的Adam 。一般不会出现问题

· 一次只复杂化一个

多个模块逐个输入,然后增加复杂性,确保预期的性能逐步提升,而不要一股脑儿全放进去。

· 不要相信学习率衰减默认值

代码可能会过早地将学习率减少到零,导致模型无法收敛。设置合理的衰减策略

· 数据增广

把数据集做大,除了扩大数据集的种类之外,就是扩增了。一般的超分算法都有这一步。旋转,翻转,拉伸,做扩增的时候可以野性一点。甚至可以用上GAN生成的图片来扩充数据集。

· 预训练

使用预训练模型省时间。

· Dropout

目前有论文提出,超分任务中,在上采样之前的一层增加Dropout可以涨点(未验证)。

关于batch_size

参考:https://www.zhihu.com/question/456600260/answer/2380983385

简单来说:小的batch_size可以提升精度,大的batch_size训练快,但精度低

batch size的大小影响的是训练过程中的完成每个epoch所需的时间(假设算力确定了)和每次迭代(iteration)之间梯度的平滑程度。因此完成每个epoch所需的时间会随着迭代次数的增加而增加(此为batch_size影响的是完成每个epoch所需的时间)。

这也是为什么大的batch_size往往建议可以相应取大点learning_rate, 因为梯度震荡小,大learning_rate可以加速收敛过程,也可以防止陷入到局部最小值,而小batch_size用小learning_rate迭代,防止错过最优点,一直上下震荡没法收敛(这也是一个小trick)

1. 若是loss还能降,指标还在升,那说明欠拟合,还没收敛,应该继续train,增大epoch。
2. 若是loss还能再降,指标也在降,说明过拟合了,那就得采用提前终止(减少epoch)或采用weight_decay等防过拟合措施。
3.若是设置epoch=16,到第8个epoch,loss也不降了,指标也不动了,说明8个epoch就够了,剩下的白算了。
当然以上说的都是预设的一些理想情况,现实中往往没有这么明确,就如第三种情况,它可能只是到了局部最优点,并没有最优,你可能换个大点的batch_size,模型就调了个方向继续下坡,指标又能往上走点,这也就是炼丹的奥秘了,这样的情况就不再讨论了。

最后附一个adm防抖动加decay的简单方法

自适应优化器Adam还需加learning-rate decay吗?

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值