深度学习100问之提高深度学习模型训练效果(调参经验)

声明

1)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
3)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。

⚡️ 0、前言

在这里插入图片描述
最近在 炼丹 的时候验证病查找了一些提高深度学习网络模型训练效果的方法,和大家分享一下。

🎨 1、网络结构

在这里插入图片描述
首先我觉得最重要的就是确定你的大体网络结构,因为除了 CVNLP 等主流方向,其他方向都是刚开始结合深度学习,说好听点是创新点,说难听就是注水 。。。所以你需要选择一个主要的框架结构,之前写过一个 大话卷积神经网络CNN(干货满满) 的热门高赞文章,有需要的童鞋可以看一看。

比如,因为个人做的方向和分割领域比较相似,所以现在尝试过的比较有效的网络结构是 U-Net
在这里插入图片描述
你看它像不像个 炼丹炉=-=,而我们就是 炼金术师

🗃 2、数据

在这里插入图片描述
其实这个问题是我一直有一些好奇的地方,对于目前的监督学习来说,标记的好坏决定了学习的最佳结果的程度,也就是最终网络输出结果的好坏。

根据 没有免费的午餐 这个学界公认的道理,任何算法都不能脱离数据或者应用场景来谈效果的好坏。算法的最终目的是 拟合这种趋势或者分布,不同的数据集的特征分布是不同的,甚至同一个数据集划分方式和比例的不同都也会使得特征的分布存在差异。

所以还记得之前看过一个大佬说,现在工业界训练效果提升,数据占了很大一部分,其实可以理解为,如果你能更好地处理数据,那么最后的训练效果就会更好!!!

常说的几种方法,比如:

  • 人工标注,大家比较熟知的就是花钱进行众包了,特别出名的应该是IMAGENET;再就是让实验室的小师弟小师妹帮忙。。。咳咳;
  • 适当预处理,大家比较熟知的就是数据清洗,降噪;再就是去除冗余数据,减少过拟合;
  • 等等。

之前写过一个 深度学习入门笔记(九):深度学习数据处理 的热门文章,有需要的童鞋可以看一看。

🚀 3、学习率

在这里插入图片描述
学习速率的设置,建议第一次,也就是初始学习率可以设置大一点,可以加快收敛,节省时间,快速得到一个最优解,后续再慢慢调整,比如采用动态变化学习速率的方式,也就是常说的学习率衰减,比如每一轮乘以一个衰减系数或者根据损失的变化动态调整学习速率,等等,可以在后期避免震荡,让模型的训练更稳定。

之前写过一个 深度学习100问之学习率衰减 的热门文章,有需要的童鞋可以看一看。

🔧 4、优化器

在这里插入图片描述
在这里插入图片描述
常见优化器有 SGD,Adagrad,Adadelta,Adam,RMSprop,NAG 等等。

其中 SGDAdam 优化器是最为常用的两种优化器:

  • SGD 根据每个 batch 的数据计算一次局部的估计,最小化代价函数。因为学习速率决定了每次步进的大小,因此 SGD 通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠。
  • Adam 优化器结合了 Adagrad 善于处理稀疏梯度和 RMSprop 善于处理非平稳目标的优点,能够自动调整学习速率,收敛速度更快,在复杂网络中表现更优。

上图是不同优化器的比较图,通过图片你能更直接地看到对比结果!

🎉 5、初始化

在这里插入图片描述
常见的变量初始化有零值初始化、随机初始化、均匀分布初始化、正态分布初始化、正交矩阵初始化、截断正态分布初始化和 Xavier 初始化、He 初始化等等。

一般采用正态分布初始化或者截断正态分布初始化比较多,有的论文说正交分布的初始值能带来更好的效果,等等。个人结论不一而定,还是需要实验的时候做一个尝试,像最近尝试的 Xavier 初始化、He 初始化效果居然比之前的还要好,真是惊喜。

之前写过一个 深度学习入门笔记(十二):权重初始化 的热门文章,有需要的童鞋可以看一看。

📝 6、训练轮数

在这里插入图片描述
理论上模型收敛即可停止迭代,所以,一般采用验证集作为停止迭代的条件。如果连续几轮模型损失都没有相应减少,则停止迭代。

或者简单粗暴地来,多设置一些迭代次数,多保存一些模型,然后根据损失函数曲线判断最佳结果在哪一轮。

之前写过一个 深度学习100问之神经网络中解决过拟合的几种方法 的热门文章,有需要的童鞋可以看一看。

📈 7、dropout

在这里插入图片描述
数据第一次跑模型的时候可以不加 dropout,而是在后期调优的时候使用 dropout 用于防止过拟合有比较明显的效果,特别是数据量相对较小的时候。

dropout 的缺点在于,需要将训练集分为不同子集输入每一次的迭代,这就需要较大的训练集,所以在训练集较小的情况下,dropout的效果可能并不好。

大家都知道增大数据集是最好的正则化方式,所以在增大数据集的情况下,使用dropout需要使用的计算代价可能会比它带来正则化效果更高,这需要我们在实际使用场景中做取舍。

之前写过一个 深度学习100问之神经网络中解决过拟合的几种方法 的热门文章,有需要的童鞋可以看一看。

➕ 8、正则化

在这里插入图片描述
在这里插入图片描述
为了防止过拟合,可通过加入 L1、L2 正则化,如上图分别是 L1、L2 正则化。

从公式可以看出:

  • 加入 L1 正则化的目的是为了加强权值的稀疏性,让更多值接近于零。
  • 而加入 L2 正则化的目的是为了减小每次权重的调整幅度,避免模型训练过程中出现较大抖动。

之前写过一个 深度学习100问之神经网络中解决过拟合的几种方法 的热门文章,有需要的童鞋可以看一看。

🥅 9、预训练

在这里插入图片描述
对需要训练的数据进行预训练,可以加快训练速度,并且对于模型最终的效果会有少量的提升。

即先训练一个稍差的模型,然后倒入该模型,继续训练直至达到较好的效果为止。常用的场景有打比赛,做项目等等,需要一个较佳的模型进行快速使用,以期在较短时间内达到一个不错的结果,比如:

  • 之前看过的一个 Kaggle 医疗识别图像比赛,就有好多人在 ResNeXt 基础上做迁移学习,先导入对应的权重进行预训练,从而达到一个很不错的效果。
  • 机器学习方向也接触过一个例子,是直接搭建的两层全连接网络 NN 上进行预训练,然后对训练的模型继续训练,直达达到损失函数几乎不变为止。

💥 10、激活函数

在这里插入图片描述
常用的激活函数为 sigmoid、tanh、relu、leaky relu、elu

采用 sigmoidtanh 的场景现在并不是很多了,更多的人会采用 relu 激活函数。从公式上可以看出,解决了 gradient vanishing 问题并且计算简单更容易优化(深度学习100问之深入理解Vanishing/Exploding Gradient(梯度消失/爆炸)),但是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新(Dead ReLU Problem)。

所以一定要注意,不能盲目迷信一个函数用到底的情况,比如我所在的领域,图像中是存在负数的,如果只是用 relu 的话,那么永远不能保护负半轴的数据被正确恢复出来。

在这个时候,我发现了 leaky relu,它拥有 relu 的所有优点,外加不会有 Dead ReLU 问题,证明在实际操作当中真的有更好用一点!

之前写过一个 大话卷积神经网络CNN(干货满满) 的热门高赞文章,有需要的童鞋可以看一看。

还有 TensorFlow学习笔记之 PReLU激活函数原理和代码

🍱 11、特征抽取

在这里插入图片描述
max-pooling、avg-pooling 是深度学习中最常用的特征抽取方式,目前大多数场合中平均池化好像更多见一些:

  • max-pooling 是抽取最大的信息向量,然而当存在多个有用的信息向量时,这样的操作会丢失大量有用的信息。
  • avg-pooling 是对所有信息向量求平均,当仅仅部分向量相关而大部分向量无关时,会导致有用信息向量被噪声淹没。

如果既想在有多个有用向量的情形下尽量在最终的代表向量中保留这些有用的向量信息,又想在只有一个显著相关向量的情形下直接提取该向量做代表向量,避免其被噪声淹没,那么解决方案只有:加权平均,即 Attention
在这里插入图片描述

♻️ 12、置乱训练数据

在这里插入图片描述
读入数据时,应该尽量让每轮数据的迭代保持不同的顺序,这样可以避免模型每轮都对相同的数据进行计算,容易过拟合。

建议在读入数据转换成矩阵过程中使用置乱,从而增加数据的随机性。

💫 13、批大小

在这里插入图片描述

  • 对于小数据量模型,显卡显存充足的情况下,可以进行全量训练,即批大小等于数据大小,内存利用率提高了,大矩阵乘法的并行化效率提高,最关键的是其确定的下降方向越准,引起训练震荡越小,这样能更准确的朝着极值所在的方向更新。

  • 对于大数据,全量训练将会导致内存溢出,因此需要选择一个较小的批大小。批大小过小,花费时间多,同时梯度震荡严重,不利于收敛;批大小过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。

如果这时选择 batch_size 为 1,则此时为在线学习,每次修正方向为各自样本的梯度方向修正,难以达到收敛。批大小是1的 loss 曲线图真的是惨不忍睹,过几天补一张图给你们看看。。。

所以你们可以明白显卡的重要性!!!

✨ 14、显卡

在这里插入图片描述
深度学习是一个对算力要求很高的领域,GPU 的选择将从根本上决定你的深度学习体验。如果没有 GPU 或者 GPU 差的话,可能完成整个实验需要几个月,甚至当只想看看参数调整、模型修改后的效果时,那可能也得耗费好多天,甚至更久的时间。

我现在的网络跑一次实验就得十个小时左右,,,你可以明白了吧=-=。

显存性能好,训练速度快;显卡显存大,训练批大小大。当然你要考虑自己的预算和实验室的经费,不然的话,就推荐一个泰坦就行了。
在这里插入图片描述

🚀 15、总结

在这里插入图片描述
通过以上的总结,你可以看到调参需要考虑的因素有很多,这是一个很偏向于经验的能力,所以多动脑思考多去尝试才是正途。

新的一年,祝你,祝我,祝我们都能有一个更大的进步!!!

如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

回复【福利】即可获取我为你准备的大礼,包括C++,编程四大件,NLP,深度学习等等的资料。

想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

在这里插入图片描述

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页