文章目录


⚡️ 0、前言

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

???? 1、网络结构

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

首先我觉得最重要的就是确定你的大体网络结构,因为除了 CVNLP 等主流方向,其他方向都是刚开始结合深度学习,说好听点是创新点,说难听就是注水 。。。比如,因为个人做的方向和分割领域比较相似,所以现在尝试过的比较有效的网络结构是 ​​U-Net​​:

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

???? 2、数据

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

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

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

常说的几种方法,比如:

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

???? 3、学习率

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

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

之 ???? 4、优化器

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

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

常见优化器有 ​​SGD,Adagrad,Adadelta,Adam,RMSprop,NAG​​ 等等。

其中 ​​SGD​​ 和 ​​Adam​​ 优化器是最为常用的两种优化器:

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

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

???? 5、初始化

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

常见的变量初始化有零值初始化、随机初始化、均匀分布初始化、正态分布初始化、正交矩阵初始化、截断正态分布初始化和 ​​Xavier​​ 初始化、​​He​​ 初始化等等。

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

???? 6、训练轮数

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

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

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

???? 7、dropout

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

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

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

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

➕ 8、正则化

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

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

为了防止过拟合,可通过加入 ​​L1、L2​​ 正则化,如上图分别是 ​​L1、L2​​ 正则化。

从公式可以看出:

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

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

对需要训练的数据进行预训练,可以加快训练速度,并且对于模型最终的效果会有少量的提升。

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

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

???? 10、激活函数

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

常用的激活函数为 ​​sigmoid、tanh、relu、leaky relu、elu​​。

采用 ​​sigmoid​​、​​tanh​​ 的场景现在并不是很多了,更多的人会采用 ​​relu​​ 激活函数。从公式上可以看出,解决了 ​​gradient vanishing​​ 问题并且计算简单更容易优化 ???? 11、特征抽取

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

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

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

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

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

♻️ 12、置乱训练数据

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

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

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

???? 13、批大小

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

  • 对于小数据量模型,显卡显存充足的情况下,可以进行全量训练,即批大小等于数据大小,内存利用率提高了,大矩阵乘法的并行化效率提高,最关键的是其确定的下降方向越准,引起训练震荡越小,这样能更准确的朝着极值所在的方向更新。
  • 对于大数据,全量训练将会导致内存溢出,因此需要选择一个较小的批大小。批大小过小,花费时间多,同时梯度震荡严重,不利于收敛;批大小过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。

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

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

✨ 14、显卡

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

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

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

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

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

???? 15、总结

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

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