目录
1. 更多的优化算法
(1)随机梯度下降
(2)动量梯度下降
(3)AdaGrad算法
(4)RMSProp算法
(5)Adam算法
(6) 学习率自适应
2. 激活函数
(1)sigmoid函数
(2)Tanh函数
(3)ReLU(Rectified Linear Unit)
(4)Leaky-ReLU
(5)ELU
(6)Maxout
3. 网格初始化
(1) 全部为0
(2) 如何分析初始化结果好不好?
4. 批归一化
5. 数据增强
(1)归一化
(2)图像变换
(3)色彩变换
(4)多尺度裁剪
6. 更多调参技巧
(1) 拿到更多的数据
(2) 给神经网络添加层次
(3) 紧跟最新进展,使用新方法
(4) 增大训练的迭代次数
(5) 尝试使用正则化
(6) 使用更多的GPU来加速训练
(7) 可视化工具来检查中间状态
(8) 在标准数据集上训练
(9) 在小数据集上过拟合
(10) 数据集分布均衡
(11) 使用预调整好的稳定的模型结构
(12) Fine-tuning,基于公开的模型,参数,进行微调。
1. 更多的优化算法
(1)随机梯度下降
局部极值
saddle point问题
(2)动量梯度下降
随机梯度下降和动量梯度下降存在的问题:
受初始学习率影响很大
每一个维度的学习率一样
(3)AdaGrad算法
前期,regularizer较小,放大梯度
后期,regularizer较大,缩小梯度
梯度随训练次数降低
每个分量有不同的学习率
缺点:
学习率设置太大,导致regularizer影响过于敏感
后期,regularizer累积值太大,提前结束训练
(4)RMSProp算法
Adagrad的变种
由累积平方梯度变为平均平方梯度
解决了后期提前结束的问题
(5)Adam算法
所有的上述算法都会用learning_reat来做参数
Adam比较有效:beta1 = 0.9,beta2 = 0.999,learning_rate = 1e-3 or 5e-4
(6) 学习率自适应
其中α0为学习率的初始值,k为系数,t为迭代次数。
Exponential decay和1/t decay表示学习率随着迭代次数的增加而减小。
总结:
2. 激活函数
(1)sigmoid函数
输入非常大或非常小时没有梯度
输出均值非0(输出均值非0,对神经网络的学习不友好,why?)
exp计算复杂
梯度消失:df(x) / dx = f(x)(1-f(x))
f(x)在0—1之间,1-f(x)也在0—1之间,故f(x)(1-f(x))也在0—1之间。没经过一层,其梯度都要乘以小于1的数,不经过几层,梯度就会变得很小。故,用sigmoid函数,其网络层次较深,底层参数得不到更新。
(2)Tanh函数
依旧没有梯度
输出均值为0
计算复杂
(3)ReLU(Rectified Linear Unit)
不饱和(梯度不会过小)
计算量小
收敛速度快
输出均值非0
Dead ReLU:一个非常大的梯度,使x经过调整后,输出得到负值,其导数是0,得不到更新,一直处在负值,不会有激活现象。(可用Leaky-ReLU解决)
(4)Leaky-ReLU
f(x) = max(0.01x, x), 在x为负数时,依旧有梯度。
解决dead relu的问题
(5)ELU
均值更接近0
小于0时计算量大
(6)Maxout
ReLU的泛化版本。ReLU
没有dead relu
参数double
总结:
- Relu:小心设置learning rate,因为relu的导数本来就比较大
- 不要使用sigmoid,因为计算量太大
- 使用leaky relu,maxout,elu
- 可以试试tanh,但不要抱太大希望
3. 网格初始化
(1) 全部为0
单层网络可以
多层网络会使梯度消失(由于链式法则)
(2) 如何分析初始化结果好不好?
查看初始化后各层的激活值(即神经元经过激活函数的输出)分布,若激活值是在固定的区间内,比如归一化好的0——1,-1——1等比较固定的分布,认为比较好。若集中在某个值上,则认为其是不好的初始化方法。
Eg:均值为0,方差为0.02的正太分布初始化,tanh,relu激活函数。
4. 批归一化
每个batch上做归一化,存在的问题——当数据量特别大时,每个batch并不能反应每个数据的分布。此时,本来卷积神经网络对样本已经提出来一个特征,但是做归一化之后,可能会使这种特征在批与批之间不能够区分特定的样本。解决办法——逆归一化。
5. 数据增强
详见:
数据 增强_zhao_crystal的博客-CSDN博客目录1. 数据增强在tf中的实现2. 实战1. 数据增强在tf中的实现通过keras.preprocessing.image.ImageDataGenerator接口来实现数据增强rescale = 1./255, # 将所有的像素点缩放到0——1,因为所有的像素点的值在0——255之间。rotation_range = 40, # 图像增强的一种方式,比如 ratation_range = 40, 表示将图像随机旋转的角度为-40——40度之间。width_shift_ra
6. 迁移学习(Fine-tuning)基于公开的模型,参数,进行微调。
详见:
7. 更多调参技巧
(1) 拿到更多的数据
(2) 给神经网络添加层次
一般是逐步增加网络层次,方便定位问题。
(3) 紧跟最新进展,使用新方法
(4) 增大训练的迭代次数
此方法需要和其它手段并行使用,比如,之前网络达到20%的错误率,已比较接近最终的效果,此时可适当的降低学习率,再继续进行学习,当学习迭代次数较多时,可能会达到意想不到的突破。
(5) 尝试使用正则化
正则化是机器学习中防止过拟合的一个方法,一个神经网络的容量是由参数的个数决定的,当参数的个数过多时,容易发生过拟合,此时可加1个正则化项
(参数的平方值)
(6) 使用更多的GPU来加速训练
(7) 可视化工具来检查中间状态
损失函数的值:可分别打印出来在训练集和测试集上的损失函数的值的比较,在同样的训练次数下,训练集上的值和测试集上的值分别是怎样的
梯度:梯度的分布决定了训练的神经网络的程度如何。
当所有的梯度都比较小时,说明神经网络快要训练完了。
若梯度比较大时,说明神经网络还需要一定的时间进行训练,才能达到收敛效果。
准确率:训练集和测试集准确率的对比
学习率:很多优化方法可调整学习率,把学习率打印出来之后,即可知当前的学习率,若学习率比较低时,即说明模型即将训练完了。或训练方法,优化方法已经使得此网络不能再继续训练下去了,此时,还想继续训练,可手动调整学习率。
可视化图形如下图所示
(8) 在标准数据集上训练
(9) 在小数据集上过拟合
在小数据集上去测试,达到过拟合的效果。