神经网路权重初始化方式

本文探讨神经网络训练前的权重初始化方法,包括错误的全零初始化、小随机数初始化、使用1/sqrt(n)校准方差、Glorot初始化、针对ReLU神经元的He初始化及稀疏初始化。同时讨论了偏置的初始化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开始训练网络之前,还需要初始化网络的参数。方式有:

       错误:全零初始化。让我们从应该避免的错误开始。在训练完毕后,虽然不知道网络中每个权重的最终值应该是多少,但如果数据经过了恰当的归一化的话,就可以假设所有权重数值中大约一半为正数,一半为负数。这样,一个听起来蛮合理的想法就是把这些权重的初始值都设为0吧,因为在期望上来说0是最合理的猜测。这个做法错误的!因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。即出现对称权重的现象。

       小随机数初始化。因此,权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。其思路是:如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。小随机数权重初始化的实现方法是:W = 0.01 * np.random.randn(D,H)。其中randn函数是基于零均值和标准差的一个高斯分布(译者注:国内教程一般习惯称均值参数为期望)来生成随机数的。根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。也可以使用均匀分布生成的随机数,但是从实践结果来看,对于算法的结果影响极小。

       警告。并不是小数值一定会得到好的结果。例如,一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度(因为梯度与权重值是成比例的)。这就会很大程度上减小反向传播中的“梯度信号”,在深度网络中,就会出现问题。

        使用1/sqrt(n)校准方差。上面做法存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。也就是说,建议将神经元的权重向量初始化为:w=np.random.randn(n)/ sqrt(n)。其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

上述结论的推导过程如下:假设权重w和输入x之间的内积为s=\sum w_{i}x_{i},这是还没有进行非线性激活函数运算之前的原始数值。我们可以检查s的方差:

        Glorot等在论文Understanding the difficulty of training deep feedforward neural networks中作出了类似的分析。在论文中,作者推荐初始化公式为,其中是在前一层和后一层中单元的个数。这是基于妥协和对反向传播中梯度的分析得出的结论。该主题下最新的一篇论文是:Delving Deep into Rectifiers: Surpassing Human-Level P erformance on ImageNet Classification,作者是He等人。文中给出了一种针对ReLU神经元的特殊初始化,并给出结论:网络中神经元的方差应该是 。代码为w =np.random.randn(n) * sqrt(2.0/n)。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。

        稀疏初始化(Sparse initialization)。另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。

        偏置(biases)的初始化。通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。

实践。当前的推荐是使用ReLU激活函数,并且使用w = np.random.randn(n) * sqrt(2.0/n)来进行权重初始化。

       来源:CS231

### 权重初始化的最佳实践与方法 在神经网络中,权重初始化是一个非常重要的环节。如果初始权重设置不当,则可能导致梯度消失或爆炸等问题,从而影响模型的收敛速度和最终性能。 #### 方法概述 常见的权重初始化方法包括随机初始化、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、付费专栏及课程。

余额充值