训练神经网络的建议
(1)一般情况下,在训练集上的目标函数的平均值(cost)会随着训练的深入而不断减小,如果这个指标有增大情况,停下来。
- 两种情况:
- 采用的模型不够复杂,以至于不能在训练集上完全拟合
- 已经训练很好了
(2)分出一些验证集,训练的本质目标是在验证集上获取最大的识别率。因此训练一段时间后,必须在验证集上测试识别率,保存使验证集上识别率最大的模型参数,作为最后的结果。
(3)注意调整学习率,如果刚训练几步损失函数cost就增加,一般来说是学习率太高了。如果每次cost变化很小,说明学习率太低。
训练神经网络的各种经验
(1) 目标函数可以加入正则项
M
i
n
i
m
i
z
e
E
(
ω
,
b
)
=
L
(
ω
,
b
)
+
λ
2
∥
W
∥
2
\text Minimize \ E(\omega,b)=L(\omega,b)+\frac{\lambda}{2}\parallel W \parallel ^2
Minimize E(ω,b)=L(ω,b)+2λ∥W∥2
λ
\lambda
λ:权值衰减系数,我们的优化不仅要使目标函数尽可能的小,也要使所有W的模尽可能的小,防止W过大造成的过拟合现象
(2)训练数据的归一化
n
e
w
X
=
X
−
m
e
a
n
(
X
)
s
t
d
(
X
)
newX = \frac{X-mean(X)}{std(X)}
newX=std(X)X−mean(X)
(3)参数和W和b的初始化
在随机梯度下降法中,第一步是随机的取所有的(w,b),这时会出现一个问题,如果激活函数是sigmoid或tanh函数,这两个函数在值很大的地方梯度都很小,通过后向传播后前边相关的梯度也将趋近于0,从而产生梯度消失的现象,导致训练缓慢,因此,我们需要将
W
T
+
b
W^T+b
WT+b
在一开始就落在0附近:
- 一种比较简单有效的方法是:
- (W,b)初始化从区间 ( − 1 d -\frac{1}{\sqrt d} −d1, − 1 d -\frac{1}{\sqrt d} −d1)均匀随机取值,d是(w,b)所在层的神经元个数。
(4)BATCH NORMALIZATION
基本思想:既然希望没一层获得的值都在0附近,从而避免梯度小时现象,那么我们为什么不直接把每一层的值做基于均值和方差的归一化
(5)参数的更新策略
-
常规的更新策略使用随机梯度下降法
- (W,b)的每一个分量获得的梯度绝对值有大有小,一些情况下,将会迫使优化路径变成Z字形状。
- ADAGRAD:将梯度的平方不断的累积,用归一化因子来规范最终的结果
-
SGD求梯度的策略过于随机,每一次都是用的不同batch的数据,会出现优化方向随机化
-
MOMENTUM:解决梯度随机性问题
-
同时解决两个问题
- Adam:结合了ADAGRAD和MOMENTUM,同时解决梯度绝对值分量不平衡和梯度方向随机性,并且引入逐渐降低梯度搜索步长的机制
- 对梯度做累积处理,所以开始更新快,之后会越来越慢
- 与ADAGRAD的唯一不同就是对r的处理,加入参数p,也就是说通过参数p来调整梯度更重视以前的影响还是当前的影响,可以把adagrad看作是rmspro的特列,即p=0.5。
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:
mt=μ∗mt−1+gt
Δθt=−η∗mt
其中,μ是动量因子
让第一次算出来的方向对第二次的方向还有那么一点影响,即t时刻梯度下降的方向,由之前的梯度共同决定。
- 同时解决两个问题
参考:深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
简单认识Adam优化器
优化算法选择:SGD、SGDM、NAG、Adam、AdaGrad、RMSProp、Nadam