深度学习权重参数初始化要点

今天做吴恩达深度学习第1课第4周的编程作业,参数初始化按照指南中“- Use random initialization for the weight matrices. Use np.random.rand(shape) * 0.01”进行操作,但计算无论怎样也不收敛:

Cost after iteration 0: 0.693148
Cost after iteration 100: 0.678011
Cost after iteration 200: 0.667600
Cost after iteration 300: 0.660422
Cost after iteration 400: 0.655458
Cost after iteration 500: 0.652013
Cost after iteration 600: 0.649616
Cost after iteration 700: 0.647942
Cost after iteration 800: 0.646770
Cost after iteration 900: 0.645947
Cost after iteration 1000: 0.645368
Cost after iteration 1100: 0.644961
Cost after iteration 1200: 0.644673
Cost after iteration 1300: 0.644469
Cost after iteration 1400: 0.644325
Cost after iteration 1500: 0.644223
Cost after iteration 1600: 0.644151
Cost after iteration 1700: 0.644100
Cost after iteration 1800: 0.644063
Cost after iteration 1900: 0.644037
Cost after iteration 2000: 0.644019

发现遇到了梯度消失的问题。权重w选取不当时,z=w*a[l-1],a[l]=sigmoid(z),z所在位置的梯度非常小,因此导致不收敛。

若选取合适的权重w,使得z的区间落在[-4,4]之间,梯度下降将比较快。

以下内容为转载:点击打开链接

本文出自Bin的专栏blog.csdn.net/xbinworld。 
技术交流QQ群:433250724,欢迎对算法、技术感兴趣的同学加入。

神经网络,或者深度学习算法的参数初始化是一个很重要的方面,传统的初始化方法从高斯分布中随机初始化参数。甚至直接全初始化为1或者0。这样的方法暴力直接,但是往往效果一般。本篇文章的叙述来源于一个国外的讨论帖子[1],下面就自己的理解阐述一下。

首先我们来思考一下,为什么在神经网络算法(为了简化问题,我们以最基本的DNN来思考)中,参数的选择很重要呢?以sigmoid函数(logistic neurons)为例,当x的绝对值变大时,函数值越来越平滑,趋于饱和,这个时候函数的倒数趋于0,例如,在x=2时,函数的导数约为1/10,而在x=10时,函数的导数已经变成约为1/22000,也就是说,激活函数的输入是10的时候比2的时候神经网络的学习速率要慢2200倍!

这里写图片描述

为了让神经网络学习得快一些,我们希望激活函数sigmoid的导数较大。从数值上,大约让sigmoid的输入在[-4,4]之间即可,见上图。当然,也不一定要那么精确。我们知道,一个神经元j的输入是由前一层神经元的输出的加权和,xj=iaiwi+bjxj=∑iai·wi+bj。因此,我们可以通过控制权重参数初始值的范围,使得神经元的输入落在我们需要的范围内。

种比较简单、有效的方法是:权重参数初始化从区间均匀随机取值。

为了说明这样取值的合理性,先简单回顾一下几点基本知识:

1.符合均匀分布U(a,b)的随机变量数学期望和方差分别是——数学期望:E(X)=(a+b)/2,方差:D(X)=(b-a)²/12

2.如果随机变量X,Y是相互独立的,那么Var(X+Y) = Var(X)+Var(Y),如果X,Y是相互独立的且均值为0,那么Var(X*Y) = Var(X)*Var(Y)

因此,如果我们限制神经元的输入信号(xi

xi)是均值=0,标准差=1的,那么




也就是说,随机的d个输入信号加权和,其中权重来自于(1d,1d)(−1d,1d)均匀分布,服从均值=0,方差=1/3的正态分布,且与d无关。所以神经元的输入落在区间[-4,4]之外的概率非常小。


更一般的形式可以写为: 


-------------------------------------------------------------------------------------------------

总结:在实践中可以使用np.random.randn(shape)正态分布,虽然其方差为1,大于均匀分布U(-1,1)的方差1/3,但在区间[-4,4]之内还有足够冗余,落在3σ之外概率很小。另外虽然输入信号X不服从均值=0,标准差=1的均匀分布,但其已经归一化,在区间(0,1)之间,可以近似认为服从均值在0.3-0.7之间,方差≈0.5的正态分布,因此对z的分布影响不太大。

因此,在权重参数初始化时,除以√d一般就满足了Z的合理分布,不至于梯度消失。

效果:

将 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]) 后,

损失函数明显收敛。

Cost after iteration 0: 0.715732
Cost after iteration 100: 0.674738
Cost after iteration 200: 0.660337
Cost after iteration 300: 0.646289
Cost after iteration 400: 0.629813
Cost after iteration 500: 0.606006
Cost after iteration 600: 0.569004
Cost after iteration 700: 0.519797
Cost after iteration 800: 0.464157
Cost after iteration 900: 0.408420
Cost after iteration 1000: 0.373155
Cost after iteration 1100: 0.305724
Cost after iteration 1200: 0.268102
Cost after iteration 1300: 0.238725
Cost after iteration 1400: 0.206323
Cost after iteration 1500: 0.179439
Cost after iteration 1600: 0.157987
Cost after iteration 1700: 0.142404
Cost after iteration 1800: 0.128652
Cost after iteration 1900: 0.112443
Cost after iteration 2000: 0.085056
Cost after iteration 2100: 0.057584
Cost after iteration 2200: 0.044568
Cost after iteration 2300: 0.038083

Cost after iteration 2400: 0.034411



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页