在训练神经网络的时候,需要调的参数很多,选一组最适合自己模型的参数。实际训练的时候如果不按照一定的顺序,会很乱。因此正确有序地调参很重要

需要调节的参数大概有如下几个:

神经网络的层数
每层神经元的个数
如何初始化Weights和biases
loss函数选择哪一个
选择何种Regularization?L1,L2
Regularization parameter lambda 选择多大合适
激励函数如何选择
是否使用dropout
训练集多大比较合适
mini-batch选择多大
学习率多少合适
选择何种梯度下降算法
何时停止Epoch训练
自己模型的超参数

给出自己的建议:

① 建议优先在对数尺度上进行超参数搜索:
比较典型的是学习率和正则化项,我们可以从诸如0.001 0.01 0.1 1 10,以10为阶数进行尝试。因为他们对训练的影响是相乘的效果。不过有些参数,还是建议在原始尺度上进行搜索,例如dropout值: 0.3 0.5 0.7)。
② 选择合适的Epoch训练次数
如果随着Epoch的次数增加,准确度在一定时间内(比如5到10次)变化很小,就可以停止Epoch。开始时可以把Epoch次数设置的大一些,观察在哪个地方准确度变化很小,就把Epoch设置成几。也可以用早停法,防止过拟合。
③ 调节Regularization parameter lambda
实验lambda,从1.0,10,100…找到一个合适的。注意:lambda的大小是和样本数成正比关系的,比如现在样本数、lambda分别是1000、0.4,以后把样本数扩大到10000时,对应的lambda也要扩大到4。
④ 调节mini-batch size
mini-batch选择太小:没有充分利用计算资源;太大:更新权重和偏向比较慢,mini-batch size和其他参数相对独立,一旦找到一个合适的以后,就不需要再改了。一般就是16,32,64,128,256找一个就行。
详细见深度机器学习中的batch的大小对学习效果有何影响?——https://www.zhihu.com/question/32673260
⑤ 如何选择梯度下降算法
adam或者SGD,当然还有其他自适应的梯度下降算法都可以试试。
⑥ 如何选择激励函数
如何选择激励函数,没有特别好的方法,只能靠实验比较。常用的激励函数有:sigmoid,tanh,relu。
⑦ 如何设置Weights和biases
最简单的方法:让W和b服从N(0, 1 / sqrt(n_in) ),n_in:输入神经元的个数,设置合适的W和b可以加快学习的速率,在极个别的神经网络中,W和b甚至可以影响最后训练的准确度。
⑧ 选择何种Regularization
L1和L2是对cost函数后面增加一项。L1和L2都是为了减少连接对cost影响的权重,但是L1和L2又存在一定的区别。L1减少的是一个常量,L2减少权重的一个固定比例,如果权重本身很大,L1减少的比L2少很多,反之,如果权重本身很小,L1减少的更多。L1倾向于集中在少部分重要的连接上。
注意:对于L1,当W=0时,cost关于W的偏导没有意义,因为在W=0时不可导,此时就使用un-regulazied表达式,sgn(0)=0,本来regularization的目的就是减少权重,到权重=0时,就没有必要再减少。
编程的时候发现这个在pytorch里是用weight decay来实现的,选择L2范式的系数就行了,但是一般用了dropout再用L2范式性能会下降,这点我没弄清楚,可能我这里说的不对,以后补充。
⑨ 是否使用dropout
pytorch里的dropout方法就是对Tensor进行随机mask,这样做可以避免过拟合,一般就是0.2,0.3,0.5,用了效果都挺好的,而且不一定拘泥于神经元,你也可以试试对训练过程中各种Tensor是用dropout。
⑩ 训练集多大比较合适
训练集越大越好,增加训练集在一定程度上也可以减少过拟合,数据集对模型很重要,有文章说,参数是对应于数据集的,多大的数据集需要数量差不多的参数就够了。
⑪ Loss函数选择
一般用交叉熵就能解决,但是具体问题具体对待,每个人都可以定义自己的损失函数。
⑫ 神经元的个数
这个在实验中其实起到挺大作用的,句子匹配中,一般第一个隐层要和输入层差不多,最后用于分类的MLP神经元2倍左右,经验值。具体任务具体对待。
⑬ 自己模型的超参数
这个最小二乘法呗。

以后有新的感悟再更新,参考文献写的并不是很好,自己先按照这个顺序写了一下,调参感觉是个玄学,就像神经网络并不是很好解释