神经网络权重初始化

在我们真正开始训练网络之前,我们必须要知道如何去初始化神经网络的参数。

陷阱: 都初始化为0。

        首先介绍一下我们不应该做的事情(即初始化为0)。需要注意的是我们并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化后,我们可以有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为0这个一个听起来还蛮合理的想法也许是一个我们假设中最好的一个假设了。但结果正确是一个错误(的想法),因为如果神经网络计算出来的输出值都一个样,那么反向传播算法计算出来的梯度值一样,并且参数更新值也一样 。更一般地说,如果权重初始化为同一个值,网络就不可能不对称(即是对称的)。

为什么参数的初始值不能设定为全0(不能是全都一样的值)?

一种形象的解释是:

      设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。 由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。 结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

原理:

以一个三层网络为例,首先看下结构

                                

它的表达式为:

                              

         如果每个权重都一样,那么在多层网络中,从第二层开始,每一层的输入值都是相同的了也就是a1=a2=a3=....,既然都一样,就相当于一个输入了,代入到后面的算法中得到的答案是相同的。所得到的梯度下降法的偏导相同,不停的迭代,不停的相同,不停的迭代,不停的相同......,最后就得到了相同的值(权重和截距)。

 使用反向传播来训练该模型,而参数W的更新规则是按照下面的公式进行:

                                                       

这将导致,在反向传播的时候,每一层的dW都一样,进而使得每一层的W一样。这样就回到了上面所讲的模型退化问题了。

简而言之就是:

     当每层的W一样时,检测的特征也一样,网络经过前向传播和反向传播后,每层的W值更新后大小还是一致,因此检测的特征也还是一样。每层的W一样,会使得多层的效果和一层的效果是一致的,因为提取的特征是重复的,即出现模型退化问题。所以神经网络参数的初始值不能全相同,初始值全设为0即使一个特例,自然初始化是无效的。

初始化为小的随机数

       既然不能都初始化为0,那么很自然的我们会想到将权重初始化为非常接近0的小数 。将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。这个想法是,神经元在一开始都是随机的、独一无二的,所以它们会计算出不同的更新,并将自己整合到整个网络的各个部分。每个神经元的权重向量初始化为一个服从多维高斯分布取样的随机向量,所以神经元在输入空间中指向随机的方向(so the neurons point in random direction in the input space.应该是指输入空间对于随机方向有影响)。其实也可以从均匀分布中来随机选取小数,但是在实际操作中看起来似乎对最后的表现并没有太大的影响。

    警告:并不是数字越小就会表现的越好。比如,如果一个神经网络层的权重非常小,那么在反向传播算法就会计算出很小的梯度(因为梯度gradient是与权重成正比的)。在网络不断的反向传播过程中将极大地减少“梯度信号”,并可能成为深层网络的一个需要注意的问题。   

方差标准化

       上述建议的一个问题是,随机初始化神经元的输出的分布有一个随输入量增加而变化的方差。结果证明,我们可以通过将其权重向量按其输入的平方根(即输入的数量)进行缩放,从而将每个神经元的输出的方差标准化到1。也就是说推荐的启发式方法(heuristic)是将每个神经元的权重向量按下面的方法进行初始化:  w=np.random.randn(n)/sqrt(n) ,

      其中n 表示输入的数量。这保证了网络中所有的神经元最初的输出分布大致相同,并在经验上提高了收敛速度。

 w=np.random.randn(n)/sqrt(n)推导过程大致如下: 

令权重w和输入x的内积表达式为: s=\sum (w_{i}x_{i}),       计算s的方差:

                                             

       第三步,我们我们假设输入值和权重均值为0, 。注意到这不是一般的情况:比如ReLU的单元会有一个正的均值。在最后一步我们假设所有的wi,xi 都是同分布的(即w1,w2... 是同分布,x1,x2,... 是同分布,但是 w和 x不是同分布)。

        从这个推导中我们可以看到如果我们想让s和所有的输入都有相同的方差,那么需要保证在初始化的时候每个权重w的方差是1/n。并且因为(a是一个标量, X是一个随机变量),这就意味着我们可以从单位高斯分布中取样,然后通过a=\sqrt{\frac{1}{n}}   进行缩放来使得权重的方差为1/n。

Xavier( Glorot)初始化

      Glorot等人所写的文章Understanding the difficulty of training deep feedforward neural networks中有类似的分析。在这篇论文中,作者的结论是建议初始化的形式是:

                                                   \sigma =\sqrt{\frac{2}{n_{inputs}+n_{outputs}}}

其中 n_{inputs}n_{outputs} 是权重被初始化层的输入和输出连接数(也称为扇入和扇出)。这是基于一个折中的选择和对反向传播梯度等价分析后具有积极作用的办法.

                                     

该方法有一定限制,其推导过程假设激活函数在零点附近接近线性函数,且激活值关于0对称。 relu函数不满足这些假设。

He 初始化(ReLU及其变体)

适用于ReLU的初始化:

                         

from :https://blog.youkuaiyun.com/marsggbo/article/details/77771497

from :https://blog.youkuaiyun.com/u012151283/article/details/78230891/

### 权重初始化的最佳实践与方法 在神经网络中,权重初始化是一个非常重要的环节。如果初始权重设置不当,则可能导致梯度消失或爆炸等问题,从而影响模型的收敛速度和最终性能。 #### 方法概述 常见的权重初始化方法包括随机初始化、Xavier 初始化以及 He 初始化等。以下是这些方法的具体介绍: 1. **随机初始化** 随机初始化是最简单的方法之一,通常会从均匀分布或正态分布中抽取权重值。然而,这种方法可能无法很好地适应深层网络结构,因为随着层数增加,激活函数可能会导致梯度逐渐变小或者变得过大[^4]。 2. **Xavier Initialization (Glorot Initialization)** Xavier 初始化旨在解决传统随机初始化带来的问题。它基于这样一个假设:每层输入信号的标准差应该等于其输出标准差。对于使用 Sigmoid 或 Tanh 激活函数的情况特别有效。具体而言,当采用均匀分布时,权重可以从范围 \([-limit, limit]\) 中选取,其中 \(limit=\sqrt{\frac{6}{n_{in}+n_{out}}}\),\(n_{in}\) 和 \(n_{out}\) 分别表示当前层节点数及其下一层节点数;如果是正态分布,则均值为零,方差设定为\(\frac{2}{n_{in} + n_{out}}\) 。 3. **He Initialization** 对于 ReLU 类型的非线性激活函数来说,He 初始化更为合适。该技术调整了上述公式中的分母部分,仅考虑输入单元数量而非平均两者。因此,在利用正态分布的情况下,方差被定义成\(\frac{2}{n_{in}}\) ,这有助于保持前向传播过程中各层间数据流动稳定并促进更快学习过程发生 。 下面展示了一个简单的例子来说明如何在 PyTorch 中实现不同的权重初始化策略: ```python import torch.nn as nn import math def init_weights(m): if isinstance(m, nn.Linear): # Linear Layer nn.init.xavier_uniform_(m.weight.data) m.bias.data.fill_(0) model = nn.Sequential( nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 10) ).apply(init_weights) ``` 此代码片段展示了怎样通过自定义 `init_weights` 函数遍历整个模型,并根据不同类型的模块应用相应的初始化方案。这里选择了 Xavier Uniform 方式处理全连接层(`nn.Linear`) 的权值矩阵,并将偏置项全部赋值为零。 另外值得注意的是,在某些特殊架构比如卷积神经网络(CNNs)里边还存在局部感受野的概念,这意味着即使是在同一个特征图内部也可能存在着空间上的依赖关系需要加以建模。所以在实际操作当中往往还需要结合具体的业务场景做出适当的选择与优化[^2]。 最后一点补充关于批量标准化(Batch Normalization), 它可以一定程度缓解由于不良权重初值所引发的一些数值不稳定现象,但并不能完全替代良好的初始化工作 [^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值