Xavier 初始化:深度网络权重初始化的经典之作


Xavier 初始化:深度网络权重初始化的经典之作

发音:美 [zeɪvjər] n.泽维尔(男子名)

在深度学习的发展历程中,权重初始化对神经网络训练的成功至关重要。随机初始化的简单方法在浅层网络中尚可,但在深层网络中往往导致梯度消失或爆炸的问题。为了解决这一挑战,Xavier Glorot 和 Yoshua Bengio 在 2010 年提出了 Xavier 初始化(也称为 Glorot 初始化),一种基于输入和输出维度的优雅初始化策略。本文将深入探讨其原理、数学推导、PyTorch 实现以及适用场景,帮助你理解这一经典方法的魅力。

一、背景与动机

在深度神经网络中,信号(激活值)和梯度需要在多层之间稳定传播。如果权重初始化不当,可能出现以下问题:

  • 梯度消失:激活值在前向传播中逐渐变小,反向传播中的梯度趋于零,网络停止学习。
  • 梯度爆炸:激活值或梯度在前向传播或反向传播中指数增长,导致训练发散。

Xavier 初始化源于论文 Understanding the difficulty of training deep feedforward neural networks(Glorot & Bengio, 2010),旨在通过控制每一层输出的方差,确保信号在深层网络中的双向稳定性。它特别针对使用 Tanh 或 Sigmoid 等对称激活函数的网络设计,后来也被广泛应用于其他场景。


二、Xavier 初始化的数学原理

Xavier 初始化的核心思想是:保持每一层输入和输出的方差一致,同时在前向和反向传播中平衡信号传播

1. 前向传播的方差分析

考虑一个线性层:
y = W x y = W x y=Wx

  • ( x ∈ R n i n x \in \mathbb{R}^{n_{in}} xRnin ):输入向量,( n i n n_{in} nin ) 是输入维度(也称 fan-in)。
  • ( W ∈ R n o u t × n i n W \in \mathbb{R}^{n_{out} \times n_{in}} WRnout×nin ):权重矩阵,( n o u t n_{out} nout ) 是输出维度(也称 fan-out)。
  • ( y ∈ R n o u t y \in \mathbb{R}^{n_{out}} yRnout ):输出向量。

假设:

  • ( x x x ) 的每个元素是独立同分布(i.i.d.),方差为 ( Var ( x ) \text{Var}(x) Var(x) )。
  • ( W W W ) 的每个元素也是 i.i.d.,初始方差为 ( Var ( W ) \text{Var}(W) Var(W) )。

输出 ( y i y_i yi ) 的方差为:
Var ( y i ) = Var ( ∑ j = 1 n i n W i j x j ) = ∑ j = 1 n i n Var ( W i j x j ) \text{Var}(y_i) = \text{Var}\left( \sum_{j=1}^{n_{in}} W_{ij} x_j \right) = \sum_{j=1}^{n_{in}} \text{Var}(W_{ij} x_j) Var(yi)=Var(j=1ninWijxj)=j=1ninVar(Wijxj)
若 ( W i j W_{ij} Wij ) 和 ( x j x_j xj ) 独立:
Var ( y i ) = n i n ⋅ Var ( W i j ) ⋅ Var ( x j ) = n i n ⋅ Var ( W ) ⋅ Var ( x ) \text{Var}(y_i) = n_{in} \cdot \text{Var}(W_{ij}) \cdot \text{Var}(x_j) = n_{in} \cdot \text{Var}(W) \cdot \text{Var}(x) Var(yi)=ninVar(Wij)Var(xj)=ninVar(W)Var(x)
为了保持 ( Var ( y ) = Var ( x ) \text{Var}(y) = \text{Var}(x) Var(y)=Var(x) ):
n i n ⋅ Var ( W ) = 1 ⟹ Var ( W ) = 1 n i n n_{in} \cdot \text{Var}(W) = 1 \implies \text{Var}(W) = \frac{1}{n_{in}} ninVar(W)=1Var(W)=nin1

2. 反向传播的方差分析

反向传播中,梯度从输出 ( y y y ) 传回输入 ( x x x ):
∂ L ∂ x = W T ⋅ ∂ L ∂ y \frac{\partial L}{\partial x} = W^T \cdot \frac{\partial L}{\partial y} xL=WTyL

  • ( ∂ L ∂ y ∈ R n o u t \frac{\partial L}{\partial y} \in \mathbb{R}^{n_{out}} yLRnout):损失对输出的梯度。
  • ( W T ∈ R n i n × n o u t W^T \in \mathbb{R}^{n_{in} \times n_{out}} WTRnin×nout )。

梯度 ( ∂ L ∂ x j \frac{\partial L}{\partial x_j} xjL) 的方差:
Var ( ∂ L ∂ x j ) = n o u t ⋅ Var ( W ) ⋅ Var ( ∂ L ∂ y ) \text{Var}\left(\frac{\partial L}{\partial x_j}\right) = n_{out} \cdot \text{Var}(W) \cdot \text{Var}\left(\frac{\partial L}{\partial y}\right) Var(xjL)=noutVar(W)Var(yL)
为了保持 ( Var ( ∂ L ∂ x ) = Var ( ∂ L ∂ y ) \text{Var}\left(\frac{\partial L}{\partial x}\right) = \text{Var}\left(\frac{\partial L}{\partial y}\right) Var(xL)=Var(yL)):
n o u t ⋅ Var ( W ) = 1 ⟹ Var ( W ) = 1 n o u t n_{out} \cdot \text{Var}(W) = 1 \implies \text{Var}(W) = \frac{1}{n_{out}} noutVar(W)=1Var(W)=nout1

3. 折中方案

前向传播要求 ( Var ( W ) = 1 n i n \text{Var}(W) = \frac{1}{n_{in}} Var(W)=nin1),反向传播要求 ( Var ( W ) = 1 n o u t \text{Var}(W) = \frac{1}{n_{out}} Var(W)=nout1)。Xavier 初始化取两者的调和平均:
Var ( W ) = 2 n i n + n o u t \text{Var}(W) = \frac{2}{n_{in} + n_{out}} Var(W)=nin+nout2
这平衡了信号在前向和反向传播中的稳定性。

4. 均匀分布的参数

Xavier 初始化使用均匀分布 ( U ( − a , a ) U(-a, a) U(a,a) ):
Var ( W ) = ( a − ( − a ) ) 2 12 = ( 2 a ) 2 12 = a 2 3 \text{Var}(W) = \frac{(a - (-a))^2}{12} = \frac{(2a)^2}{12} = \frac{a^2}{3} Var(W)=12(a(a))2=12(2a)2=3a2
令:
a 2 3 = 2 n i n + n o u t \frac{a^2}{3} = \frac{2}{n_{in} + n_{out}} 3a2=nin+nout2
解得:
a = 6 n i n + n o u t a = \sqrt{\frac{6}{n_{in} + n_{out}}} a=nin+nout6
因此,权重初始化为:
W ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) W \sim U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) WU(nin+nout6 ,nin+nout6 )


三、PyTorch 中的实现

PyTorch 提供了 nn.init.xavier_uniform_ 函数,签名如下:

torch.nn.init.xavier_uniform_(tensor, gain=1.0)
  • tensor:要初始化的张量,通常是权重矩阵(形状为 ( [ n o u t , n i n ] [n_{out}, n_{in}] [nout,nin] ))。
  • gain:增益因子,用于调整不同激活函数的幅度,默认值为 1.0(适用于 Tanh)。
    • 对于 Sigmoid,推荐 ( g a i n = 1 gain = 1 gain=1 );
    • 对于 ReLU,推荐 ( g a i n = 2 gain = \sqrt{2} gain=2 )(接近 Kaiming 初始化)。

实现逻辑:

fan_in, fan_out = tensor.shape[1], tensor.shape[0]  # [n_out, n_in]
limit = gain * math.sqrt(6.0 / (fan_in + fan_out))
tensor.uniform_(-limit, limit)

四、使用场景与特点

1. 适用场景

  • 激活函数:Xavier 初始化最初为 Tanh 和 Sigmoid 设计,因其对称性与方差分析匹配。
  • 网络类型:适用于全连接网络(MLP)和早期卷积网络(CNN),在深度较浅或对称性强的模型中表现优异。
  • 过渡性应用:在现代网络中(如 Transformer),常作为基线或与 ReLU 结合使用。

2. 优势

  • 双向稳定性:同时考虑前向和反向传播,减少深层网络的训练困难。
  • 简单易用:仅需输入和输出维度,无需复杂假设。
  • 通用性:通过 gain 参数可适配不同激活函数。

3. 局限性

  • ReLU 不完全匹配:Xavier 假设激活函数是对称的,而 ReLU 的非线性(截断负值)会导致方差减半,因此需要调整 ( gain )(如 ( 2 \sqrt{2} 2 ))。
  • 现代网络复杂性:在 Transformer 或残差网络中,残差连接和归一化(如 LayerNorm)减轻了对初始化的依赖,Xavier 的优势被削弱。
  • 数据依赖性:假设输入是 i.i.d.,对真实数据的非均匀分布可能不够鲁棒。

五、与 Kaiming 初始化的对比

Xavier 初始化和 Kaiming 初始化(He 初始化,可参考笔者的另一篇博客:Kaiming Uniform 初始化:神经网络权重初始化的优雅解决方案)是两种经典方法,区别如下:

  • 目标激活函数
    • Xavier:Tanh、Sigmoid。
    • Kaiming:ReLU 及其变体。
  • 方差计算
    • Xavier:( Var ( W ) = 2 n i n + n o u t \text{Var}(W) = \frac{2}{n_{in} + n_{out}} Var(W)=nin+nout2),平衡输入输出。
    • Kaiming:( Var ( W ) = 2 n i n \text{Var}(W) = \frac{2}{n_{in}} Var(W)=nin2),仅考虑输入(因 ReLU 减半效应)。
  • 应用场景
    • Xavier:早期 MLP 和 CNN。
    • Kaiming:现代深层网络(如 ResNet、Transformer)。

例如,在 LoRA 中,nn.init.kaiming_uniform_(..., a=math.sqrt(5)) 实际上借鉴了 Xavier 的 ( a = 5 a = \sqrt{5} a=5 ) 传统,但更倾向于 Kaiming 的 ReLU 优化。


六、实践建议与改进方向

实践建议

  1. 选择 gain:根据激活函数调整 ( gain )(Tanh 用 1,ReLU 用 ( 2 \sqrt{2} 2 ))。
  2. 验证效果:在小型实验中比较 Xavier 和其他初始化(如 Kaiming)的收敛速度。
  3. 结合归一化:与 BatchNorm 或 LayerNorm 搭配使用,进一步稳定训练。

改进方向

  1. 动态 gain:根据网络深度或任务数据动态调整 ( gain )。
  2. 混合初始化:结合 Xavier 和 Kaiming 的优点,例如对称层用 Xavier,非对称层用 Kaiming。
  3. 正交扩展:在低秩场景(如 LoRA)中,尝试正交初始化替代均匀分布。

七、结语

Xavier 初始化作为深度学习早期的里程碑,通过数学推导解决了深层网络训练的稳定性问题。虽然在现代网络中,Kaiming 初始化因 ReLU 的流行而更常见,但 Xavier 依然是理解初始化原理的基石。无论你是初学者还是资深研究者,掌握 Xavier 都能为你的模型设计提供坚实基础。欢迎在评论区分享你的使用心得或疑问!

后记

2025年3月11日22点52分于上海,在Grok 3大模型辅助下完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32046.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM内存结构笔记02-堆

文章目录 堆1.定义2.堆的结构为什么JVM新生代对象年龄只能是 0-15? 3.堆内存溢出4.堆内存诊断代码示例 堆 1.定义 堆是Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对…

labview实现大小端交换移位

在解码时遇到了大小端交换的问题,需要把高低字节的16进制值进行互换,这里一时间不知道怎么操作,本来打算先把16进制转字节数组,算出字节数组的大小,然后通过模2得到0,1,来判断是否为奇数位和偶数…

详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 RAGOnMedicalKG:大模型结合知识图谱的RAG实现DSPy:变革式大模…

Unity使用UGUI制作无限滑动列表

原理参照上一篇使用NGUI的制作无限滑动列表的文章 Unity 使用NGUI制作无限滑动列表_unity 滑动列表很多物体-CSDN博客 准备工作: 新建一个空物体命名为LoopList,并调整其大小, 并增加Scroll Rect组件(用于滑动)、Re…

Docker数据管理,端口映射与容器互联

1.Docker 数据管理 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。 容器中的管理数据主要有两种方式: 数据卷(Data Volumns)&a…

Unity Shader编程】之基础纹理

一,单张纹理 好的,用户想学习Unity Shader中的单张纹理章节。我需要根据提供的搜索结果来整理相关内容。首先,查看搜索结果中的相关部分,特别是‌、‌、‌、‌、‌这几条,因为它们提到了基础纹理、单张纹理的实现方法…

QT系列教程(18) MVC结构之QItemSelectionModel模型介绍

视频教程 https://www.bilibili.com/video/BV1FP4y1z75U/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 QItemSelectionModel Qt的MVC结构支持多个View共享同一个model,包括该model的选中状态等。我们可以通过设置QItemSelectionModel,来更改View的选…

全网最详解答OSPF基础

目录 此图片为思科的(有些地方不对) 总结状态机: OSPF的工作过程: 结构突变 1 突然新增一个网段--触发更新 2 突然断开一个网段--触发更新 3 无法通信---dead time OSPF的配置 ​编辑条件匹配: ​编辑1&…

Flink深入浅出之05:CEP复杂事件

深入浅出Flink-第五天 1️⃣深入理解Flink的CEP的机制和使用,Flink实时处理应用案例。 4️⃣ 要点 📖 1. Flink的复杂事件处理机制CEP 1.1 CEP概念 CEP是Complex Event Processing三个单词的缩写,表示复杂事件处理,是一种基于…

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具(AI IDE)——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro,支持切换满血版DeepSeek R1&V3, 可以帮助各阶段开发者与AI流畅协作,更快、更高质量地完…

基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析

跨境电商的背景以及痛点 根据Statista数据,2025年全球跨境电商市场规模预计达6.57万亿美元,年增长率保持在12.5% 。随着平台规则趋严(如亚马逊封店潮),更多卖家选择自建独立站,2024年独立站占比已达35%。A…

神经网络探秘:原理、架构与实战案例

神经网络探秘:原理、架构与实战案例 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。https://www.captainbed.cn/ccc 在人工智能的浪潮中,神经网络作为核心驱动力之一…

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点(无 js) 这段HTML代码展示了一个简单的注册页面,包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面,包含了常见的HTML元素和表单控件。通过CSS样…

win32汇编环境,对话框中使用树形视图示例四

;运行效果,当点击张辽时,展示张辽的图像 ;当点击曹仁时,展示曹仁的图像 ;win32汇编环境,对话框中使用树形视图示例四 ;当点击树形视图treeview控件中的某项时,展示某些功能。这里展示的是当点到某个将领时,显示某个将领的图像 ;直接抄进RadAsm可编译运行。重要部分加备注。…

基于SpringBoot的“体育购物商城”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“体育购物商城”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体模块设计 前台用户登录界面 系统首页界面…

c#面试题整理9

1.遍历xml文档 2.解释一下这段 String s new String("xyz"); 这段在C#平台中,编译失败 3.说明一下抽象类 抽象类可以有构造函数 抽象类不能是静态和密封的类,密封的类表示无法继承,抽象类本身就不可实例化,加不好…

第85期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

如何安全处置旧设备?

每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式,不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源,然后再进行通信,所以想要通过共享内存进行通信,那么第一步一定是让两个…