调参的一些blog

本文blog主要整理自:(主要用于自己学习,不用做其它)
https://blog.csdn.net/dugudaibo/article/details/77366245

Deep learning网络调参技巧

首先,调参调的是超参数(hyperparameters)。超参数和参数的区别是什么呢?

参数:就是模型可以根据数据可以自动学习出的变量,应该就是参数。比如,深度学习的权重,偏差等

超参数:就是用来确定模型的一些参数,超参数不同,模型是不同的(这个模型不同的意思就是有微小的区别,比如假设都是CNN模型,如果层数不同,模型不一样,虽然都是CNN模型哈。),超参数一般就是根据经验确定的变量。在深度学习中,超参数有:学习速率,迭代次数,层数,每层神经元的个数等等。 from: link

超参数主要包括:

  1. 学习率 $\eta$

1 0.1 0.01 0.001, 一般从1开始尝试。很少见learning rate大于10的。学习率一般要随着训练进行衰减。衰减系数一般是0.5。 衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后。

不过更建议使用自适应梯度的办法,例如adam,adadelta,rmsprop等,这些一般使用相关论文提供的默认值即可,可以避免再费劲调节学习率。对RNN来说,有个经验,如果RNN要处理的序列比较长,或者RNN层数比较多,那么learning rate一般小一些比较好,否则有可能出现结果不收敛,甚至Nan等问题。

  1. 正则化参数 $\lambda$

开始从1.0尝试,超过10的很少见

1
2
regularzation_penalty = 0.02
model.add(Dense(256, activation='relu', kernel_regularizer=regularizers.l2(regularzation_penalty)))
  1. 神经网络的层数 $L$

先从1层开始试

  1. 每一个隐层中神经元的个数 $j$

16 32 128,超过1000的情况比较少见。超过1W的从来没有见过

  1. 学习的回合数Epoch

  2. 小批量数据 minibatch 的大小

128上下开始。batch size值增加,的确能提高训练速度。但是有可能收敛结果变差。如果显存大小允许,可以考虑从一个比较大的值开始尝试。因为batch size太大,一般不会对结果有太大的影响,而batch size太小的话,结果有可能很差。

  1. 输出神经元的编码方式(?不太明白这里)

  2. 代价函数的选择
    代价函数有很多,例如, 更多cost function

1
2
3
loss = 'categorical_crossentropy' #cross-entropy,
loss = mean_squared_error
loss='binary_crossentropy'
  1. 权重初始化的方法
1
2
3
initilization_method = 'he_normal' #'random_uniform' ,'random_normal','TruncatedNormal' ,'glorot_uniform', 'glorot_nomral', 'he_normal', 'he_uniform'

model.add(Dense(256, input_dim=256, activation='relu', kernel_initializer=initilization_method)
  1. 神经元激活函数的种类
    指的activation function,具体可以参考deep learning(1)

  2. 参加训练模型数据的规模

实践经验

实践中,一般先进行初步范围搜索,然后根据好结果出现的地方,再缩小范围进行更精细的搜索。

  1. 建议先参考相关论文,以论文中给出的参数作为初始参数。至少论文中的参数,是个不差的结果。
  2. 如果找不到参考,那么只能自己尝试了。可以先从比较重要,对实验结果影响比较大的参数开始,同时固定其他参数,得到一个差不多的结果以后,在这个结果的基础上,再调其他参数。例如学习率一般就比正则值,dropout值重要的话,学习率设置的不合适,不仅结果可能变差,模型甚至会无法收敛。
  3. 如果实在找不到一组参数,可以让模型收敛。那么就需要检查,是不是其他地方出了问题,例如模型实现,数据等等。

自动调参

  1. Grid Search
  2. Random Search
  3. Bayesian Optimization

Optimizer

按吴恩达老师所说的,梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低点,用最快的方式(steepest)奔向最低的位置(minimum)

这部分数学部分不做陈述,主要是代码应用。
keras optimizers

Adam

简单认识Adam优化器

随机梯度涉及到这几个参数:

1
2
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08,
decay=0.0,amsgrad=False)

SGD

Resources:

18个技巧实战深度学习,资深研究员的血泪教训

optimizer总结
optimization for deep learning highlights in 2017

深度学习 14. 深度学习调参,CNN参数调参,各个参数理解和说明以及调整的要领。underfitting和overfitting的理解,过拟合的解释

深度学习调参策略1
深度学习调参策略2
深度学习训练的小技巧,调参经验。总结与记录

Deep learning网络调参技巧

知乎专栏:炼丹心得