深度学习的训练、超参数设置及tricks

本文详细讨论了训练深度学习模型时遇到的问题,如训练出现nan的检查步骤,训练流程的分阶段策略,数据集的分割原则,以及训练集、验证集和测试集的用途。还涵盖了超参数设置,如batchsize的影响,优化器的选择,学习率的动态调整,以及epoch设置和模型选择方案。此外,文章还涉及权重初始化的重要性,数据预处理技巧,以及竞赛中的策略和技巧。

来源:https://maiya.fan/blog?id=656617456aa58e39d9301927

训练时的问题

出现nan

  1. 检查模型的构建,确保没有出现除0的情况;

  2. 检查输入数据,确保没有出现nan或者inf;

  3. 检查学习率,确保学习率不过大;

  4. 检查模型参数,确保模型参数初始化合理;

  5. 检查损失函数,确保损失函数没有出现除0的情况;

  6. 检查优化器,确保优化器的参数设置合理;

  7. 检查batch size,确保batch size不过大;

  8. 检查数据增强,确保数据增强没有出现除0的情况;

  9. 检查模型的梯度,确保梯度没有出现除0的情况;

  10. 检查模型的参数,确保模型参数没有出现nan或者inf;

训练流程

小规模训练

如果上手一个模型, 就用全部数据来进行训练, 那么就会消耗大量的时间来调整一些不需要训练全部数据就可以得到的超参或debug. 因此, 需要分阶段来进行训练.
阶段一: debug, 数据集长度设置为多个batch就可以, 主要跑一遍程序保证可以运行和没有明显的错误运算. 对于多层架构的网络,可以在一开始选用较少层的网络,如对于ResNet采用ResNet50而不是ResNet152.
阶段二: 使用更多的数据(可能几千个数据), 验证模型过拟合特性, 保证模型可以拟合数据和确定学习率等超参数.
阶段三: 使用可以反应数据分布的数据的量级(可能与阶段二的数据量相似或稍微大几倍), 去训练数据, 在这过程中尽量决定超参数. 当数据量不是特别大时, 直接步骤四.
阶段四: 完全训练, 这时同样可以对超参数进行修改, 但是尽量在阶段三完成超参数的修改. 对于多层架构的网络,这阶段开始使用较多层的网络进行训练。

数据集的分割

为了提高泛化性,即对未知数据的识别能力,需要使用训练数据外的数据进行测试. 一般主要分为训练集, 验证集, 测试集.

定义

训练集(Training Dataset)主要在训练阶段使用。当我们的模型训练好之后,我们并不知道他的表现如何。

这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不同的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态。验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。

通过测试集(Test Dataset)来做最终的评估。因为测试集是从未见过的数据,因此可能最公正的表示模型的性能。

数据划分的方法并没有明确的规定,不过可以参考3个原则:
● 对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集。
● 对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集。
● 超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集。
此外,还有一种划分数据集的方法为K折交叉验证法,用于降低由于数据划分引起的验证结果的方差, 更真实的体现模型的性能。

为什么训练集的数据量最大?

训练或者选取超参数的过程实际上是通过使用特定参数拟合当前数据集来拟合超越当前数据集的未知模型的过程, 应该用适当的参数量拟合适当复杂度的模型(少量参数难以拟合复杂模型, 大量参数会过拟合复杂模型), 训练过程中的参数量相较于超参数的参数量大, 可以拟合更复杂的模型, 因此, 训练集的数据量最大.

是否需要将测试集纳入k折交叉验证中?

不将测试集纳入K折交叉验证中, 必然会带来随机性的误差. 就像学习-测验-高考一样, 总会有人发挥好. 为了简化流程, 可以定义验证集后为测试集.

是否可以使用多个小数据集选择多个参数?

使用新数据去判断网络的泛化性, 本质是使用新的数据去训练网络, 只不过该训练挑选的不是权重, 而是网络模型, 也可以认为是超参数.
训练神经网络的目的是使参数以适当的程度去拟合数据集, 同时又可以保证其在隐模型(未知模型)上的精度.
假设当前网络已经较好的拟合了旧数据, 如果再在旧数据的基础上进行选择, 那么就会导致更进一步的拟合旧数据. 每有一个新参数, 则采用一个新的数据集来进行选取, 则可以保证比较好的受隐模型的引导, 保证一定的泛化性. 但是, 假设当前并没有拟合当前旧数据, 盲目的使用新数据集来进行选取, 则会导致欠拟合, 不能对数据集进行较好的拟合.
综合来看, 并不能确定多少个参数对应多少的数据量, 这中间存在一个未知的平衡. 因此, 在训练过程中, 当前只分为决定权重的训练集, 决定超参数的验证集和决定网络模型的测试集.

重载训练和载入之前的权重重新训练的区别

重载训练会使用之前的学习率和一些其他与epoch有关的量, 而仅载入权重则无该效果.
但是仍建议尽量不要使用重载训练. pl(其实基本都是如此)中的重载训练不会保存随机数信息, 这会导致重载训练时, 取样序列和初始训练时的顺序一样, 无法进行有效shuffle. 通过我对机器学习框架的修改, 实现了重载训练具有不同的取样序列, 并且该序列在给定随机种子的情况下不变.
但是, 此时的训练结果仍与原作者的训练结果不同. 在训练过程中随机种子随着

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoilingHotPot

听说打赏我的人,都发顶会顶刊了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值