参数设置中更深入的问题
1. 回顾
在前面的章节中,我们讲过神经网络的训练是一门艺术。我们这一讲将从解决实际问题经验的角度出发,给出训练神经网络的一些建议,同时探讨神经网络参数设置中更深入的问题,希望通过本章内容的讲解,加深对训练神经网络的感性认识,提高利用神经网络解决实际问题的能力。
2. 参数设置问题
2.1 训练神经网络的建议
首先是三个训练神经网络的建议,这几个建议应该是学术界一致公认的。
(1)一般情况下,在训练集上的目标函数的平均值(cost) 会随着训练的深入而不断减小,如果这个指标有增大的情况,请停下来。
有两种情况:
- 采用的模型不够复杂,以至于不能在训练集上完全拟合;
- 已经训练很好了。
因此停下来检查一下是否训练好,采取相应的措施。
(2)分出一些验证集(Validation Set),训练的本质目标是在验证集上获取最大的识别率。
因此训练一段时间后,必须在验证集上测试识别率,同时需要保存使验证集上识别率最大的模型参数,作为最后的结果。
(3)注意调整学习率(Learning Rate),如果刚训练几步损失函数cost就增加,一般来说是学习率太高了;如果每次cost变化很小,说明学习率太低了。根据实际情况适度的调整学习率是使神经网络快速正确收敛的基础。
2.2 训练神经网络的经验
下面讲一下训练神经网络的各种经验,尤其着重最近几年来这个领域的研究进展。
(1)目标函数可以加入正则项(regularization term)
M i n i m i z e E ( W , b ) = L ( w , b ) + λ 2 ∣ ∣ W ∣ ∣ 2 Minimize E(W,b)=L(w,b)+\fracλ2||W||^2 MinimizeE(W,b)=L(w,b)+2λ∣∣W∣∣2
其中, L ( w , b ) L(w,b) L(w,b)是原来的目标函数,例如MSE
或Cross Entropy
,而 λ 2 ∣ ∣ W ∣ ∣ 2 \fracλ2||W||^2 2λ∣∣W∣∣2叫作正则项,在这里 λ λ λ叫作权值衰减系数(Weight Decay Parameter
)。换句话说,我们的优化不仅是让原来的目标函数尽可能小,同时也要让所有的 ∣ ∣ W ∣ ∣ ||W|| ∣∣W∣∣尽可能的小,这样可以防止一些权值绝对值过大造成的过拟合现象,从而增加系统的鲁棒性。
加了正则项的目标函数前向计算程序如下(nn_forward.m
第50-53行)
if strcmp(nn.objective_function,'MSE')
nn.cost(s) = 0.5 / m * sum(sum((nn.a{k} - batch_y).^2)) + 0.5 * nn.weight_decay * cost2;
elseif strcmp(nn.objective_function,'Cross Entropy')
nn.cost(s) = -0.5*sum(sum(batch_y.*log(nn.a{k})))/m + 0.5 * nn.weight_decay * cost2;
后向传播(nn_backpropagation.m
第22-23行)
nn.W_grad{nn.depth-1} = nn.theta{nn.depth}*nn.a{nn.depth-1}'/m + nn.weight_decay*nn.W{nn.depth-1};
可以看出第23行中第二项就是正则项求导获得的,导数正好等于 nn.weight_decay*nn.W{nn.depth-1}
,有兴趣大家可自行验证一下。
(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)
[U,V] = size(xTraining);
avgX = mean(xTraining);
sigma = std(xTraining);
xTraining = (xTraining - repmat(avgX,U,1))./repmat(sigma,U,1);
(3)参数 w w