Xavier 均匀初始化方法(Xavier Uniform Initialization)来

使用 Xavier 均匀初始化方法(Xavier Uniform Initialization)来初始化张量 m.weight 的权重值:


1. Xavier 均匀初始化的定义

Xavier 均匀初始化是 权重初始化 的一种方法,其主要目的是:

  • 保持前向传播和反向传播过程中,梯度的尺度在各层间保持稳定,避免梯度爆炸或梯度消失。

公式如下:
W ∼ U [ − 6 n i n + n o u t , 6 n i n + n o u t ] W \sim \mathcal{U}\left[-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right] WU[nin+nout6 ,nin+nout6 ]
其中:

  • U \mathcal{U} U 表示均匀分布。
  • n i n n_{in} nin: 当前层的输入神经元数量。
  • n o u t n_{out} nout: 当前层的输出神经元数量。
  • 权重值 W W W 被初始化为介于上述范围内的随机数。

2. 代码解析

nn.init.xavier_uniform_(m.weight)
  • m.weight:

    • m 通常是一个层(如 nn.Linearnn.Conv2d)。
    • m.weight 是该层的权重张量。
  • nn.init.xavier_uniform_:

    • PyTorch 提供的函数,用于实现 Xavier 均匀初始化。
    • 它会根据权重的形状自动计算 n i n n_{in} nin n o u t n_{out} nout

3. 使用示例

假设 m 是一个全连接层:

import torch
import torch.nn as nn

# 定义一个线性层
m = nn.Linear(in_features=128, out_features=64)

# 使用 Xavier 均匀初始化
nn.init.xavier_uniform_(m.weight)

# 查看初始化后的权重范围
print(m.weight)

4. 为什么需要 Xavier 初始化?

在深层神经网络中:

  1. 前向传播:

    • 如果权重初始化过大,激活值会过于分散,导致梯度爆炸。
    • 如果权重初始化过小,激活值会过于集中,导致梯度消失。
  2. 反向传播:

    • 权重的梯度也可能因初始化不当而无法有效更新。

Xavier 初始化确保:

  • 权重值既不太大也不太小。
  • 神经元的输入和输出方差尽可能相同,保证梯度在各层之间稳定传播。

5. Xavier 均匀与 Xavier 正态的区别

PyTorch 还提供了 Xavier 正态初始化,用法类似:

nn.init.xavier_normal_(m.weight)

区别:

  • Xavier 均匀: 从均匀分布中采样初始化值。
  • Xavier 正态: 从正态分布中采样初始化值,分布均值为 0,标准差为:
    σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin+nout2

选择哪种方法主要取决于具体的模型和任务。


在 PyTorch 中,除了我们刚刚提到的 `xavier_uniform_` 初始化方法之外,还有很多其他的常见权重初始化方法。这些方法可以根据具体的任务需求选择适合的一种或几种组合使用。下面是几个常用的初始化方法及其特点: --- ### 1. **正态分布初始化 (Normal Distribution)** ```python torch.nn.init.normal_(tensor, mean=0.0, std=1.0) ``` - 将张量的值从指定均值和标准差的正态分布中采样。 - 特点:适用于需要较小随机扰动的情况,但需要注意不要让初始权重过大导致数值不稳定。 --- ### 2. **均匀分布初始化 (Uniform Distribution)** ```python torch.nn.init.uniform_(tensor, a=0.0, b=1.0) ``` - 张量中的元素会被设定为从 `[a,b)` 区间内抽取出来的均匀分布样本。 - 应用场景:当希望避免极端大、小数对损失函数造成剧烈波动时可用此法。 --- ### 3. **Kaiming 正太 / Kaiming 均匀 分布初始化 (He Initialization)** 针对 ReLU 及其变体激活函数特别设计的一套方案: 对于ReLU等非线性变换后的零中心输出特性进行了考量. #### Kaiming Normal(He正常): ```python torch.nn.init.kaiming_normal_(tensor, mode='fan_in', nonlinearity='relu') ``` #### Kaiming Uniform(He一致卡方分布): ```python torch.nn.init.kaiming_uniform_(tensor, mode='fan_in', nonlinearity='relu') ``` 这两种都推荐给有大量隐藏单元并且采用ReLUs作为激活函數架构下最佳实践之一因为它们能够保持信号在网络层数增加时不衰减也不爆炸. --- ### 4. **常数初始化(Constant Initializer)** ```python torch.nn.init.constant_(tensor, val) ``` 将所有的权置设成相同的固定值比如全零或者是某个极小额正值用于偏项bias上,默认情况下一般只会在特殊情形下方才运用到恒定型式配置如BN层之后紧跟conv不需要再额外引入偏差向量了。 --- ### 5. **Orthogonal Orthogonality 矩阵化(直交矩阵转化)** ```python torch.nn.init.orthogonal_(tensor, gain=sqrt(2)) ``` 生成的是彼此相互垂直方向矢量构成投影空间映射关系使得信息流得以更好维持传递准确度较高且能有效缓解深层结构内部代表表达坍塌问题发生几率降低不少哦~ --- 以上就是一些常用PyTorch内置提供的参数初始化手段啦~当然实际项目当中也可以依据理论推导自行定制满足个性化求解目标所需版本呢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值