训练深度神经网络的常用方法和技巧
- 背景知识要求
- 摘要
- 正文
-
-
- 1. 方法和技巧
- 2. 神经网络模型的一般形式
- 3.方法和技巧的单独说明
-
- SGD(Stochastic gradient descent)
- Mini-batch(解决第一个缺点)
- momentum(解决第一个缺点)
- AdaGrad(解决第二个缺点)
- RMSprop(解决第二个缺点)
- Adam(解决第二个缺点)
- L2正则化,drop-out,early-stopping
- 4.超参数的重要性从高到低
- 5.超参数的搜索方式
- 6.偏差和方差分析(bias an variance)
- 7.如何解决高偏差(high bias)
- 8.如何解决高方差(high variance)
- 总结
- 参考
背景知识要求
神经网络基础
摘要
前文三篇文章:
一个简单的3层神经网络模型part1,https://blog.csdn.net/qq_39206674/article/details/90204383
一个简单的3层神经网络模型part2,https://blog.csdn.net/qq_39206674/article/details/90302038
一个简单的3层神经网络模型part3(使用Sklearn MLPClassifier)——3层神经网络完结篇,https://blog.csdn.net/qq_39206674/article/details/90383482
从一个简单的模型出发,使用单隐藏层神经网络模型学习了房源数据,不幸的是,单隐藏层模型在数据集上的性能表现一般,本文将从几个角度阐述深度神经网络提升性能表现的方法和技巧和神经网络偏差方差分析的方法。
正文
1. 方法和技巧
丛神经网络诞生之日起,机器学习专家们就致力于解决模型架构问题、模型训练提速问题,bias-variance的折中问题,模型收敛问题从而诞生了:
- 模型架构方面,比如卷积神经网络,循环神经网络等,也诞生了一些经典的机器学习思想,比如迁移学习和强化学习等。
- 模型训练提速方面,Mini-batch,SGD,AdaGrad,momentum,RMSprop,adam,学习率衰减,使用更优良的架构减少模型参数量等方法。
- bias-variance折中方面,改变特征的数量,改变训练样本的数量,改变模型深度,改变模型某一层的权重数,正则化,drop-out,early-stopping,batch-norm(也有轻微的正则化效果)等方法。
- 模型收敛性方面,参数初始化(random,he,xariver),batch-norm(也有模型训练加速效果)等方法。
2. 神经网络模型的一般形式
通常构建一个神经网络程序包含以下过程:
1 初始化(random,he,xariver等方式)
2 循环:
- mini-batch划分
- 学习率等超参数更新
- 前向传播
- 计算损失(带或不带正则化的损失、带或不带正drop-out正的损失)
- 方向传播计算梯度(带或不带正则化正的损失、带或不带drop-out正的损失)
- 更新参数(SGD,AdaGrad,momentum,RMSprop,adam等方法)
- 判断是否early-stopping
3 保存参数
3.方法和技巧的单独说明
SGD(Stochastic gradient descent)
最简单的 BGD 以整个训练集的梯度和作为更新方向,缺点是速度慢,一个 epoch 只能更新一次模型参数。
SGD可以看做是mini-batch的一种特殊情况,当mini-batch size等于1时,mini-batch就退化为Stochastic gradient descent。此时每次迭代中,对于数据集中每个样本都做一次梯度下降。
SGD 以每个样本的梯度作为更新方向,更新次数更频繁。但有两个缺点:
- 第一个缺点:更新方向不稳定、波动很大。因为单个样本有很大的随机性,单样本的梯度不能指示参数优化的大方向。
- 第二个缺点:所有参数的学习率相同,这并不合理,因为有些参数不需要频繁变化,而有些参数则需要频繁学习改进。
Mini-batch(解决第一个缺点)
mini-batch是将训练集分组,分组之后,分别对每组求梯度,更新速度加快,batch-size通常为64,128,256,512,而512一般已经算是比较大了。
momentum(解决第一个缺点)
Momentum 算法则设置了动量(momentum)的概念,可以理解为惯性,使当前梯度小幅影响优化方向,而不是完全决定优化方向。也起到了减小波动的效果。
AdaGrad(解决第二个缺点)
AdaGrad记录了每个参数的历史梯度平方和(平方是 element-wise 的),并以此表征每个参数变化的剧烈程度,继而自适应地为变化剧烈的参数选择更小的学习率。
但 AdaGrad 有一个缺点,即随着时间的累积每个参数的历史梯度平方和都会变得巨大,使得所有参数的学习率都急剧缩小。
RMSprop(解决第二个缺点)
RMSprop采用了一种递推递减的形式来记录历史梯度平方和,可以观察其表达式:早期的历史梯度平方和会逐渐失去影响力,系数逐渐衰减。
Adam(解决第二个缺点)
简单来讲 Adam 算法就是综合了 Momentum 和 RMSProp 的一种算法,其既记录了历史梯度均值作为动量,又考虑了历史梯度平方和实现各个参数的学习率自适应调整,解决了 SGD 的上述两个问题。
L2正则化,drop-out,early-stopping
当测试集或交叉验证集的性能指标明显低于训练集时:
- 正则化通过添加参数W的正则化项,避免了W的更新完全去满足训练集的数据要求,而不能很好的泛化到验证集合测试集的数据。
- drop-out通过随机关闭神经元的方式,将神经网络模型动态的简化,避免使用过于复杂的模型去拟合训练集。
- early-stopping防止模型训练过久,导致模型的参数过于适应当前训练集,从而泛华能力不强。
4.超参数的重要性从高到低
最重要:学习率
第二重要:mini-batch的大小和隐藏层的神经元数量
第三重要:隐藏层数和学习率衰减
第四重要:Adam(beta1,beta2,epsilon), momentum(beta)
5.超参数的搜索方式
最好不要用网格搜索,使用随机搜索。
一次只改一个超参数,不要同时改多个超参数。
6.偏差和方差分析(bias an variance)
第一种情况,当测试集、开发集、训练集是同分布数据时,此种情况比较简单:
- 练集误差较大时候说明存在Bias问题。
- 练集误差-开发集误差较大时说明存在variance问题。
但是现实生活中通常测试集和训练集不属于同分布。
第二种情况,当测试集、开发集是同分布数据,开发训练集和训练集是另一分布数据时:
- 最佳贝叶斯错误率 Bayes error
2 - 1 较大时解决Bias
- 训练集错误率 Training set error
3 - 2较大时解决Variance
- 开发和训练集错误率 Development - Training set error
4 - 3较大时解决Data mismatch
- 开发集错误率 Development set error
5 - 4较大时解决Degree of overfitting to the development set
- 测试集错误率 Test set error
7.如何解决高偏差(high bias)
- 使用更大的神经网络
- 尝试变换网络架构
- 训练更久
任何一种方式都会在减少训练集的误差(减小bias)都会增加测试集(或验证集)的误差(增加variance),即偏差方差困境。
8.如何解决高方差(high variance)
- 获取更多的训练数据
- 使用更简单的模型
- 正则化,drop-out(本质就是简化模型),early-stopping等
- 尝试变化网络架构
任何一种方法通常都会在减少测试集(或验证集)的误差(较小variance)同时增加训练集的误差(增加bias),即偏差方差困境。
总结
本文简要介绍了训练深度神经网络的常用方法和技巧,简要介绍了偏差方差分析方法。
下一篇文章将通过深度神经网络模型训练房源数据,使用本文的方法和技巧来提高模型在房源数据集上的性能。
参考
1.Andrew Ng 深度学习
2.https://www.cnblogs.com/glowming/p/10629362.html
3.https://www.jianshu.com/p/aebcaf8af76e