神经网络 测试集loss不下降_神经网络调参技巧

大部分内容转自:

会写代码的好厨师:炼丹笔记六 : 调参技巧​zhuanlan.zhihu.com
神经网络 测试集loss不下降_神经网络调参技巧_第1张图片

本期问题:深度学习中的调参技巧

我们主要从以下几个方面分析:

1. 哪些参数需要调?(what)
2. 什么时候需要调参?(when)
3. 如何调参?(how)
4. 训练网络的一般过程是什么?(recap)

一、哪些参数需要调?(what)

需要调参的都是超参数,也就是人为设定的参数!因此,这个问题还可以换成神经网络中有哪些超参数?主要从两个方面来看:

  • 网络设计相关的参数:网络层数、不同层的类别和搭建顺序、隐藏层神经元的参数设置、LOSS 的选择、正则化参数
  • 训练过程相关的参数:网络权重初始化方法、学习率、迭代次数、小批量数据的规模

二、什么时候需要调参?(when)

通常网络训练的结果一般表现为以下五种情况:过拟合、欠拟合、恰好拟合,趋于收敛但一直在震荡以及完全不收敛。

欠拟合、恰好拟合、过拟合的现象,图像表示如下:

神经网络 测试集loss不下降_神经网络调参技巧_第2张图片

三、如何调参?(how)

不同情形的LOSS曲线如图所示:

神经网络 测试集loss不下降_神经网络调参技巧_第3张图片

3.1 恰好拟合的情况:A 图

恰好拟合:训练集和测试集的LOSS都已经收敛,且很接近,说明模型能够很好地拟合训练样本和测试样本的分布,泛化能力强,简单讲就是在训练集和测试集上效果都很好。

这个时候效果都这么好了,还需要调参吗?答案是:需要调参! 主要集中在网络设计方面的调参,在工程项目上,要达到同样的效果,我们需要考虑更小、更轻量型的网络结构,简言之就是为了节省成本(计算量===功耗,网络大小===内存)

这时候可以考虑调节以下参数:

  • 减少网络层数
  • 减少不同的层的参数,主要是卷积核的数量
  • 考虑深度可分离这样的轻量型卷积结构
  • 适当调大 batchsize

3.2 欠拟合的情况:B 图

欠拟合:从LOSS曲线上看,训练集和测试集从趋势上还没有收敛!

这时候可以考虑调节以下参数:

  • 增加优化数据集,进行数据清洗
  • 加大训练迭代次数,有可能是网络还没训练完
  • 进一步衰减调小学习率
  • 添加更多的层,也有可能是网络容量不够
  • 去掉正则化约束的部分,l1l2正则(正则主要是为了防止过拟合)
  • 加入BN层加快收敛速度
  • 增加网络的非线性度(ReLu)
  • 优化数据集,进行数据清洗,参考博客《炼丹笔记之数据清洗》https://mp.weixin.qq.com/s/W8angaDewLTY_YniN8JmeQ

3.3 过拟合的情况:D 图

过拟合:从LOSS曲线上看,都趋向收敛,但是测试集上的LOSS很高,甚至出现回升现象。说明模型泛化能力很差,有可能训练集和测试集数据分布不一致,更加可能的是模型太复杂。

这时候可以考虑调节以下参数:

  • 增加样本数量,训练样本太少或者说小样本问题,很容易导致过拟合。推荐阅读博主的另一篇文章,链接地址:https://mp.weixin.qq.com/s/6hzGMOMrG2w-54c4zyRj5g
  • 数据增强,可以参考博主的另一篇博客《炼丹笔记之数据增强》https://mp.weixin.qq.com/s/KfiggFTzDRMjQWzvFd_C_g
  • 早停法(Early stopping),从LOSS不在下降的地方拿到模型,作为训练好的模型
  • 增加网络的稀疏度
  • 降低网络的复杂度(深度)
  • L1 regularization
  • L2 regulariztion
  • Dropout
  • 适当降低Learning rate
  • 适当减少epoch的次数

3.4 趋于收敛但是震荡的情况:C 图

我们还提到了一种情况,就是网络在训练集上已经趋于收敛,但是在测试集上存在很严重的LOSS震荡的情况,这时候可以考虑调节以下参数:

  • 训练集和测试集分布是否存在较大的差异
  • 是否由于数据增强做的太过分了
  • 学习率是不是还很高?如果是,降低学习率
  • 测试集LOSS的计算是基于单个batch还是整个测试集?(一定要基于整个测试集来看)
  • 网络是否存在欠拟合的可能,如果欠拟合参考上面欠拟合的方法

3.5 完全不收敛的情况

上面我们并没有给出完全不收敛的情况曲线图,那怎么判断网络完全没收敛?一个是LOSS一直都很高,自己按照自己定义的LOSS函数估计下,全部为0的时候LOSS是多少,就可以大致估计出LOSS要低于多少网络才能算作是收敛了。

这时候可以考虑以下几点:

  • 先检查数据!输入数据是不是有问题?预处理是不是有问题?数据增强是不是有问题?标签是不是有问题!
  • 网络设计或者参数使用错误,一定要确保网络层的设计和参数设置正确!
  • 考虑LOSS设计是否存在问题,优化函数是否合理?
  • 设计的算法本身是够存在问题,是否存在正负样本严重失衡的问题? 推荐阅读博客《炼丹笔记之样本不平衡问题》:https://mp.weixin.qq.com/s/R7z-mtgr4XiOVAYwP2SBIw

四、训练网络的一般过程是什么?(recap)

基本上遵循从粗到细,先易后难的顺序,具体流程如下:

神经网络 测试集loss不下降_神经网络调参技巧_第4张图片

1. 首先是搭建模型:

  • 主干网络可以直接考虑:resnet(后续网络优化部分在考虑裁剪或者其他网络结构)
  • loss根据相应任务进行选择,可能是交叉熵损失(分类任务)、smooth-l1(回归任务)等
  • 优化函数:采用Adam或者SGD都可以
  • 学习率可以从0.1或者0.01开始
  • batchsize:32或者64

2. 准备小规模样本:比如存在100w数据,可以先打包1w数据或者几千样本,可以暂时先不考虑数据增强,正常打包后直接训练网络,用小批量样本来测试网络搭建中可能存在的bug,直到网络可以收敛,确保网络搭建的准确性,方便后续出现问题时,问题的定位。

3. 小规模样本训练收敛之后,则可以确定模型框架没有问题。开始加大样本规模到100W,使用大规模样本训练;

4. 训练后,分析训练集和测试集LOSS的变化情况,考虑上述过拟合、欠拟合、收敛不稳定等不同情况,优化相应的参数;

5. 在LOSS出现较为理想的结果之后,接下来则是重点排查难点问题,尝试创新性的调整网络架构,尝试新的loss,调整数据增强策略,不同优化函数,不同学习率,不同batchsize等等,通过各种手段,来提高准确度。其中,最关键的一定是“数据清洗”。推荐阅读博客《炼丹笔记之数据清洗》:https://mp.weixin.qq.com/s/W8angaDewLTY_YniN8JmeQ

你可能感兴趣的:(神经网络,测试集loss不下降)