目录

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算法

神经网络如何调参提升准确率 神经网络的调参_神经网络如何调参提升准确率_02

Adagrad的变种

由累积平方梯度变为平均平方梯度

解决了后期提前结束的问题

(5)Adam算法

神经网络如何调参提升准确率 神经网络的调参_数据_03

神经网络如何调参提升准确率 神经网络的调参_数据_04

所有的上述算法都会用learning_reat来做参数

Adam比较有效:beta1 = 0.9,beta2 = 0.999,learning_rate = 1e-3 or 5e-4

 (6)  学习率自适应

神经网络如何调参提升准确率 神经网络的调参_数据_05

其中α0为学习率的初始值,k为系数,t为迭代次数。

Exponential decay和1/t decay表示学习率随着迭代次数的增加而减小。

总结:

神经网络如何调参提升准确率 神经网络的调参_神经网络_06

2. 激活函数

神经网络如何调参提升准确率 神经网络的调参_数据_07

(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

神经网络如何调参提升准确率 神经网络的调参_神经网络_08

      均值更接近0

      小于0时计算量大

(6)Maxout

神经网络如何调参提升准确率 神经网络的调参_cnn_09

ReLU的泛化版本。ReLU 

神经网络如何调参提升准确率 神经网络的调参_数据_10

没有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激活函数。

神经网络如何调参提升准确率 神经网络的调参_深度学习_11

神经网络如何调参提升准确率 神经网络的调参_神经网络如何调参提升准确率_12

神经网络如何调参提升准确率 神经网络的调参_cnn_13

神经网络如何调参提升准确率 神经网络的调参_cnn_14

神经网络如何调参提升准确率 神经网络的调参_数据_15

4. 批归一化

神经网络如何调参提升准确率 神经网络的调参_cnn_16

每个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)基于公开的模型,参数,进行微调。

详见:

迁移 学习_zhao_crystal的博客-CSDN博客目录1. fine_tune实战1.1 读取数据1.2构建模型1.2.1 resnet模型不训练1.2.2resnet模型部分层次训练1.2.3 效果对比迁移学习:是利用之前训练好的模型,在当前的任务上进行提升。Fine_tune 训练较少次数即可以得到较好的模型1. fine_tune实战使用10 monkeys数据集1.1 读取数据# 通过height, width 参数来将输入的图片规整为统一的尺寸height = 224 # 图片的长wi..

7. 更多调参技巧

(1) 拿到更多的数据

(2) 给神经网络添加层次

 一般是逐步增加网络层次,方便定位问题。

(3) 紧跟最新进展,使用新方法

(4) 增大训练的迭代次数

 此方法需要和其它手段并行使用,比如,之前网络达到20%的错误率,已比较接近最终的效果,此时可适当的降低学习率,再继续进行学习,当学习迭代次数较多时,可能会达到意想不到的突破。

(5) 尝试使用正则化

神经网络如何调参提升准确率 神经网络的调参_cnn_17

正则化是机器学习中防止过拟合的一个方法,一个神经网络的容量是由参数的个数决定的,当参数的个数过多时,容易发生过拟合,此时可加1个正则化项

神经网络如何调参提升准确率 神经网络的调参_cnn_18

(参数的平方值)

(6) 使用更多的GPU来加速训练

(7) 可视化工具来检查中间状态

损失函数的值:可分别打印出来在训练集和测试集上的损失函数的值的比较,在同样的训练次数下,训练集上的值和测试集上的值分别是怎样的

梯度:梯度的分布决定了训练的神经网络的程度如何。

当所有的梯度都比较小时,说明神经网络快要训练完了。

若梯度比较大时,说明神经网络还需要一定的时间进行训练,才能达到收敛效果。

准确率:训练集和测试集准确率的对比

学习率:很多优化方法可调整学习率,把学习率打印出来之后,即可知当前的学习率,若学习率比较低时,即说明模型即将训练完了。或训练方法,优化方法已经使得此网络不能再继续训练下去了,此时,还想继续训练,可手动调整学习率。

可视化图形如下图所示

神经网络如何调参提升准确率 神经网络的调参_深度学习_19

(8) 在标准数据集上训练

(9) 在小数据集上过拟合

  在小数据集上去测试,达到过拟合的效果。

(10) 数据集分布均衡

(11)  使用预调整好的稳定的模型结构