神经网络的权重初始化

神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能有着至关重要的影响。因为,神经网络其实就是对权重参数w的不停迭代更新,以期达到较好的性能。在深度神经网络中,随着层数的增多,我们在梯度下降的过程中,极易出现梯度消失或者梯度爆炸。因此,对权重w的初始化则显得至关重要,一个好的权重初始化虽然不能完全解决梯度消失和梯度爆炸的问题,但是对于处理这两个问题是有很大的帮助的,并且十分有利于模型性能和收敛速度。一般来说,主要有四种权重初始化方法:

  • 初始化为0
  • 随机初始化
  • Xavier initialization
  • He initialization
    本文主要讨论后两种初始化方法。

Xavier initialization

Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,通过尽可能的让输入和输出服从相同的分布来避免后面层的激活函数的输出值趋向于0。初始化方法为:

def initialize_parameters_he(layers_dims):
    """
    Arguments:
    layer_dims -- python array (list) containing the size of each layer.

    Returns:
    parameters -- python dictionary containing your parameters "W1", "b1", ..., "WL", "bL":
                    W1 -- weight matrix of shape (layers_dims[1], layers_dims[0])
                    b1 -- bias vector of shape (layers_dims[1], 1)
                    ...
                    WL -- weight matrix of shape (layers_dims[L], layers_dims[L-1])
                    bL -- bias vector of shape (layers_dims[L], 1)
    """
    np.random.seed(3)
    parameters = {}
    L = len(layers_dims)  # integer representing the number of layers
    for l in range(1, L):
        parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(1 / layers_dims[l - 1])
        parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    return parameters

Xavier initialization初始化后,每层激活函数输出值的分布如下图所示:
在这里插入图片描述
可以看出,激活函数输出值仍旧服从标准高斯分布。
这也说明Xavier initialization和tanH 激活函数是良好搭档,但对于目前神经网络中最常用的ReLU激活函数 却无能为力,当达到5,6层后几乎又开始趋向于0,更深层的话很明显又会趋向于0。
在这里插入图片描述

He initialization

为了解决上述问题,何恺明提出了一种针对ReLU的初始化方法,一般称作He initialization。初始化方式为:

def initialize_parameters_he(layers_dims):
    """
    Arguments:
    layer_dims -- python array (list) containing the size of each layer.

    Returns:
    parameters -- python dictionary containing your parameters "W1", "b1", ..., "WL", "bL":
                    W1 -- weight matrix of shape (layers_dims[1], layers_dims[0])
                    b1 -- bias vector of shape (layers_dims[1], 1)
                    ...
                    WL -- weight matrix of shape (layers_dims[L], layers_dims[L-1])
                    bL -- bias vector of shape (layers_dims[L], 1)
    """
    np.random.seed(3)
    parameters = {}
    L = len(layers_dims)  # integer representing the number of layers
    for l in range(1, L):
        parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(2 / layers_dims[l - 1])
        parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    return parameters

经过He initialization后,当隐藏层使用ReLU时,激活函数输出值的分布情况比Xavier initialization好很多。
在这里插入图片描述
补充:

深度学习模型参数初始化都有哪些方法?

(1)Gaussian 满足mean=0,std=1的高斯分布x∼N(mean,std2)

(2)Xavier 满足x∼U(−a,+a)x∼U(−a,+a)的均匀分布, 其中 a = sqrt(3/n)

(3)MSRA 满足x∼N(0,σ2)x∼N(0,σ2)的高斯分布,其中σ = sqrt(2/n)

(4)Uniform 满足min=0,max=1的均匀分布。x∼U(min,max)x∼U(min,max)

等等
参考;
深度学习中神经网络的几种权重初始化方法

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

余额充值