目录
(3)ReLU(Rectified Linear Unit)
(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_rahttps://blog.csdn.net/zhao_crystal/article/details/123157815
6. 迁移学习(Fine-tuning)基于公开的模型,参数,进行微调。
详见:
7. 更多调参技巧
(1) 拿到更多的数据
(2) 给神经网络添加层次
一般是逐步增加网络层次,方便定位问题。
(3) 紧跟最新进展,使用新方法
(4) 增大训练的迭代次数
此方法需要和其它手段并行使用,比如,之前网络达到20%的错误率,已比较接近最终的效果,此时可适当的降低学习率,再继续进行学习,当学习迭代次数较多时,可能会达到意想不到的突破。
(5) 尝试使用正则化
正则化是机器学习中防止过拟合的一个方法,一个神经网络的容量是由参数的个数决定的,当参数的个数过多时,容易发生过拟合,此时可加1个正则化项(参数的平方值)
(6) 使用更多的GPU来加速训练
(7) 可视化工具来检查中间状态
损失函数的值:可分别打印出来在训练集和测试集上的损失函数的值的比较,在同样的训练次数下,训练集上的值和测试集上的值分别是怎样的
梯度:梯度的分布决定了训练的神经网络的程度如何。
当所有的梯度都比较小时,说明神经网络快要训练完了。
若梯度比较大时,说明神经网络还需要一定的时间进行训练,才能达到收敛效果。
准确率:训练集和测试集准确率的对比
学习率:很多优化方法可调整学习率,把学习率打印出来之后,即可知当前的学习率,若学习率比较低时,即说明模型即将训练完了。或训练方法,优化方法已经使得此网络不能再继续训练下去了,此时,还想继续训练,可手动调整学习率。
可视化图形如下图所示
(8) 在标准数据集上训练
(9) 在小数据集上过拟合
在小数据集上去测试,达到过拟合的效果。