神经网络中参数的初始化方法

昨天做完了coursera上ng神经网络课程的第一节第四周作业,终于完整地实现了一个深层神经网络。当我准备整理一下思路和代码,写一个自己的神经网络时(其实就是copy代码),问题来了。我的代码的训练结果与课程作业中的结果差别很大:

左边是作业中的结果,右边是我自己的结果,显然我的结果有问题。在梯度下降过程中,我的代价函数一直保持在0.6几,似乎陷入了局部最优解(不知道是不是这个原因),而在左边的正确结果中,代价函数最后减小到0.003几,显然效果好很多。而且,可以看输出结果的最后两行,右边我的训练结果对训练集的准确率只有0.65多,excuse me?我可是拿它训练参数的,难道是欠拟合?而且对于测试集的准确率只有0.34,显然这个模型的效果十分差了。而左边比较正常,对训练集的准确率为0.9999999....,接近1了,你可以怀疑它过拟合,但是在下面一行对测试集的预测准确率中,居然有0.8,说明这个模型训练的很好。

我想或许是代码出了问题,于是自己建了个测试集对比了一遍自己的代码和ng的代码,并定义的神经网络的维数(2层):

 

layers_dims = [3,2,1]
x1=[[2.,3.],[3.,4.],[4.,6.]]
xx = np.array(x1)
y1=[[1.],[0.]]
yy = np.array(y1).T
parameters = L_layer_model(xx,yy,layers_dims,num_iterations=2400,print_cost=True)
predicrions_train = predict(xx, yy, parameters)

算出来的结果,我的代码和作业上的代码运行结果一致,那么应该不是代码的问题?于是我花了大概一个下午的时间做了各种猜想、推测和测试,无果。

 

问题不解决,心里就有疙瘩不舒服。于是我把自己的代码和作业上的代码逐行对比,最后终于发现了问题出在哪里。

我的代码中,是这样初始化参数W的:

 

parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l - 1]) * 0.01

而作业的代码中是这样的:

 

 

parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l - 1]) / np.sqrt(
            layer_dims[l - 1])  # *0.01

改了之后,运行结果正常了,原来问题出在这里。

 

我记得ng的视频中讲了是*0.01,并且说了有别的初始化方法将在后面提到,但是没看到有说呀,就已经在代码里用到了,哎,小菜鸟伤不起呀。

然后查了下资料,参数W的初始化方法为:

 

  1. 激活函数为tanh时,令W的方差为 \frac1n
    w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])
  2. 激活函数是ReLU,权重w的初始化一般令其方差为 \frac2n :
    w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1]) 
  3. Yoshua Bengio提出一种初始化w的方法,令其方差为 2/(n[l-1]+n[l])
    w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/(n[l-1]+n[l])) 

 

可见,不同的初始化方法,对神经网络的训练结果影响很大,选对初始化方法可以大大提高神经网络的准确率。

而选择这些初始化方法的原理是什么,以及如何在参数的初始化上做文章来优化神经网络,就涉及到统计学习方法了,稍后再研究。

 

 

 

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值