在训练神经网络的时候,特别是深度神经网络,如果初始参数选择不恰当将会导致网络训练非常缓慢。再加上计算机对于数值精度表达有限,就会出现经过一次迭代后,整个神经网络的cost function的值没有任何变化。这都是由于梯度消失或者梯度爆炸引起的。

对于线性激励函数

为了便于理解,我们先认为我们神经网络的激励函数是线性函数也就是a(z(x))=z(x)。并且我们不考虑截距b。其中z(x)=w*x就是输入与权重的乘积之和。a(x)是激励函数。对于我们之前讲的Relu激励函数,在z(x)大于0的时候,其实就是线性的。
\hat{y}=x*w_{1}*w_{2}...*w_{n}
这时如果w矩阵里的值大于1,即使是1.1,因为是指数级别的扩大,假如网络有100层,那么传递到最终的\hat{y}会变成10000多。而根据我们之前讲过的梯度下降反向传播,就会导致梯度在逐级递减,也就是说对于网络前边的weight值在一次后向传播时修正很小。如果初始化w小于1,结果相反。

对于非线性激励函数

对于非线性激励函数,比如sigmoid:

如果z(x)过大或者过小,都将导致在这一层的训练变慢。因为在simgmoid函数的两侧,梯度都减小的很快。

如何初始化网络参数

我们看到对于梯度爆炸和梯度消失主要是因为在神经网络每一层z函数的输出值的期望不一样引起的。所以我们要做的就是调整z函数的输出,使得每一层的z函数输出的分布一致。
我们以单个神经元为例,这个神经元有n个输入,x1,x2,x3...xn:
z=x_{1}*w_{1}+x_{2}*w_{2}+...+x_{n}*w_{n}
假设x和w都是满足正态分布的。
根据方差的公式:
Var(z)=Var(x_{1}*w_{1})+Var(x_{2}*w_{2})+...+Var(x_{n}*w_{n})=n*Var(x*w)
因为x,w都是标准正态分布,方差为1.所以Var(z)=n
再根据Var(n*w)=n^2*Var(w)
所以我们让w=标准正态分布*\sqrt{\frac{1}{n}}从而可以将Var(z)调整为1。

对于Relu我们一般可以给每个weight值前边乘以\sqrt{\frac{2}{L_{n-1}}}
对于tanh激活函数,也有人给标准正态分布值前乘以\sqrt{\frac{2}{L_{n-1}+L_{n}}}
其中L_{n-1}表示第n-1层的神经元数,也就是第n层的z函数的输入。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: