面试常问系列(一)-神经网络参数初始化

一、背景

说到参数初始化,先提一下大家常见的两个概念梯度消失梯度爆炸

(一)、梯度消失:深层网络的“静默杀手”

定义

在反向传播过程中,梯度值随着网络层数增加呈指数级衰减,最终趋近于零,导致浅层权重几乎不更新。

核心成因
  1. 激活函数选择:Sigmoid/Tanh等函数在输入极大/极小时导数趋近0(如Sigmoid导数最大仅0.25),经多层连乘后梯度迅速消失。
  2. 链式法则连乘效应:梯度通过链式法则逐层传递,若每层梯度均小于1,总梯度将呈指数衰减。
  3. 权重初始化不当:初始权重过小或分布不合理,加剧前向信号衰减,间接导致梯度消失。
解决方案
  1. 激活函数优化:采用ReLU及其变种(Leaky ReLU、PReLU等),其正区间导数为1,避免梯度衰减。
  2. 权重初始化
    • He初始化:针对ReLU设计,使权重方差随输入神经元数调整。
    • Xavier初始化:适用于Sigmoid/Tanh,平衡前向/反向传播信号。
  3. 批量归一化(BN):通过归一化每层输入分布,减少内部协变量偏移,稳定梯度传播。
  4. 残差连接(ResNet):引入跨层跳跃连接,使梯度可直接传递至浅层,缓解衰减。
  5. LSTM/GRU门控机制:通过记忆单元选择性保留梯度,适用于序列数据。
案例

在MNIST分类任务中,使用He初始化+BN+残差连接,可将深度MLP精度提升至98%以上。

(二)、梯度爆炸:训练过程的“不稳定因子”

定义

        反向传播中梯度值随层数增加呈指数级增长,导致参数更新步长过大,模型无法收敛。

核心成因
  1. 权重初始化过大:初始权重过大时,梯度经多层连乘后迅速放大。
  2. 网络层数过深:深层网络加剧梯度累积效应。
  3. 学习率过高:过大学习率放大梯度更新幅度,加剧不稳定性。
实际影响
  • 模型参数更新剧烈,损失值震荡或发散(NaN)。
  • 浅层权重因梯度过大频繁越界,破坏已学习特征。
解决方案
  1. 梯度裁剪(Gradient Clipping)
    • 按值裁剪:限制梯度最大值(如clipvalue=1.0)。
    • 按范数裁剪:缩放梯度向量使其L2范数不超过阈值(如clipnorm=1.0)。
  2. 权重正则化:L1/L2正则化约束权重幅值,间接限制梯度增长。
  3. 优化器选择:使用Adam、RMSProp等自适应学习率算法,动态调整更新步长。
  4. 合理初始化:采用He/Xavier初始化,避免初始权重过大。
案例

        在训练深度RNN时,结合梯度裁剪(阈值=1.0)与LSTM单元,可稳定处理长序列数据。

(三)、对比与本质联系

维度梯度消失梯度爆炸
数学形式梯度 → 0(指数衰减)梯度 → ∞(指数增长)
核心诱因激活函数导数<1、层数过深权重初始化过大、学习率过高
后果浅层学习失效,模型退化参数更新不稳定,训练发散
通用策略ReLU+BN+残差连接梯度裁剪+权重正则化+自适应优化器

本质联系:二者均源于反向传播中梯度的连乘累积效应,是网络深度与参数初始化的“副作用”。

(四)、实践建议

  1. 优先使用ReLU激活函数,避免Sigmoid/Tanh的梯度衰减问题。
  2. 初始化策略:根据激活函数选择He或Xavier初始化。
  3. 深层网络必备:批量归一化+残差连接,稳定梯度传播。
  4. 梯度爆炸预防:默认启用梯度裁剪(阈值=1.0),尤其在RNN/Transformer中。
  5. 监控工具:利用TensorBoard跟踪梯度分布,及时检测异常。

通过理论创新与工程优化,梯度问题已不再是深度学习的“拦路虎”,反而推动了残差网络、Transformer等革命性架构的诞生。理解其机理并灵活应对,是掌握深度学习调参艺术的关键。

二、理论篇

经过背景的基本了解,相信大家都有个宏观的认知了,接下来从参数初始化、原理和实战的角度,带大家深入理解一下梯度消失和梯度爆炸这个两个概念。

(一)、公式推导

这里以线型层为列,假设我们堆叠了3层的全链接网络。

输入是X -> W1 -> H1(第一层隐层)->W2->H2(第二层隐层)->W3->输出层

我们对第二层的梯度进行分析。

H_1*W_2=H_2

\Delta W_2 = \frac{\partial loss}{\partial W_2}= \frac{\partial loss }{\partial out} * \frac{\partial out }{\partial H_2} * \frac{\partial H_2 }{\partial W_2} \\ = \frac{\partial loss }{\partial out} * \frac{\partial out }{\partial H_2} * H_1

我们从这个公式可以看出,第二层的梯度,会依赖上一层的输出。

如果H1趋近于0,则第二层梯度趋近于0,导致梯度消失

若H1趋近于无穷大,则第二层梯度趋近于无穷大,导致梯度爆炸。

因此我们需要约束上层的输出值大小,也就是说我们需要对每一层的网络输出进行约束。

这里大家可以实战操作一下,看看是不是符合预期~

(二)、数学推导

为了更细节的理解其原理,接下来进行一些简单的数学公式温习。

两个相互独立的随机变量

E(X+Y)=E(X)+E(Y)\\ E(XY)=E(X)*E(Y)\\ Var(x) = E(X^2) - [E(X))]^2\\ Var(X+Y)=Var(X)+Var(Y)\\ Var(XY)=Var(X)Var(Y)+Var(X)[E(Y)]^2+Var(Y)[E(X)] ^2\\

对上述公式做个简化,若X和Y 均为均值为0,方差为1,则有如下公式

Var(XY)=Var(X)Var(Y)

(三)、网络层神经元值推导

好了,有了上面的公式推导+数学基础,我们来细节看一下,隐藏层H的值是怎么变化的吧。

我们这里以隐层H1为例子,来看下H11(第一个隐层的第一个神经元的标准差的变化)。

这里还是假设我们的输入和W1服从均值0,标准差1的分布,我们来看看,经历过一层全链接后,分布的变化~

H_{11} = \sum_{i=0}^{n} X_i * W_{1i}\\ var(H_{11} ) = \sum_{i=0}^{n} var(X_i )* var(W_{1i})\\ = n * 1 * 1=n \\ std(H_{11} ) =\sqrt{var(H_{11} )} = \sqrt{n}

我们可以看出,标准差从1 变成了根号n,n为上一层的神经元个数。那么大家可以想象一下,随着网络层的不断加深,每层的标准差都会扩大根号n倍,尺度不断变大,最终就会超出最大精度范围,引发nan。

这里理论已经给出来了,大家也可亲手实践验证一下~

(四)、理论解决

针对上面nan的问题,如何解决呢?

我们从公式不难看出,我们的目标是让每层的分布保持标准差为1,而决定标准差的有三项,上层神经元个数、输出的方差和w的方差,因此,如果需要让结果目标层的标准差保持1不变,则需要。

std(W) =\sqrt{\frac{1}{n}}

(五)、激活函数引入

如果我们在一个简单的全链接网络里面,假设100层,我们会发现会出现nan,然后我们通过网络层参数的分布约束,可以保证最后一层的输出分布保持均值0,标准差1;但是如果这时候引入tanh激活函数,那么会发现随着层数加深,输出值逐渐减小。

因此引出了今天的正题!xavier初始化

三、xavier初始化

(一)、背景

Xavier初始化(又称Glorot初始化)是深度学习中一种经典的权重初始化方法,由Xavier Glorot和Yoshua Bengio于2010年提出。其核心思想是通过调整权重的初始值,使得神经网络在训练过程中能够保持信号的稳定传播,从而避免梯度消失或爆炸的问题。以下是Xavier初始化的详细解析:

(二)、核心原理

Xavier初始化的核心目标是保持每一层输入和输出的方差一致,确保信号(激活值)和梯度在多层网络中的双向稳定性。它特别适用于使用TanhSigmoid等对称激活函数的网络,因为这些激活函数在输入值为0附近时具有较大的梯度,有助于保持信号的稳定传播。

(三)、数学推导

1.前向传播方差分析

        假设 x 和 W 的元素独立同分布,且均值为0。为了保证输入和输出的方差一致,这个上面已经推导过了,不做过多阐述,直接写结果:

        var(W) = \frac{1}{n_{in}}

2.反向传播方差分析
  1. var(W) = \frac{1}{n_{out}}

3.调和平均

        综合前向和反向传播的方差要求,Xavier初始化取两者的调和平均:

        var(W) = \frac{1}{n_{in}+n_{out}+2}

(四)、实现方式

        1.均匀分布

 权重 W 的值在区间[-\frac{\sqrt{6}}{\sqrt{​{n_{in}+n_{out}}}},+\frac{\sqrt{6}}{\sqrt{​{n_{in}+n_{out}}}}] 内均匀随机采样。

        2.正态分布

权重 W 服从均值为0、方差为 \frac{2}{n_{in}+n_{out}} 的正态分布。

(五)、应用场景

  • 适用网络:前馈神经网络(FNN)、自编码器、使用Tanh或Sigmoid激活函数的卷积神经网络(CNN)或循环神经网络(RNN)。
  • 深层网络:通过平衡信号传播,改善深层网络的训练效果,避免梯度消失或爆炸。

(六)、与其他初始化方法的对比

方法核心思想适用激活函数特点
Xavier初始化保持输入输出方差一致Tanh、Sigmoid通用性强,适合对称激活函数
He初始化适配ReLU的非线性特性ReLU及其变体放大方差以应对ReLU的梯度衰减,适合非对称激活函数
零初始化所有权重设为0简单但无效,导致神经元对称性
随机初始化小随机数初始化通用需手动调参,稳定性差

(七)、代码实现(PyTorch示例)

import torch
import torch.nn as nn# 创建一个线性层
layer = nn.Linear(128, 64)# 使用Xavier均匀分布初始化
nn.init.xavier_uniform_(layer.weight)# 使用Xavier正态分布初始化
# nn.init.xavier_normal_(layer.weight)

(八)、局限性

  1. 激活函数假设:推导基于激活函数为线性的假设,对ReLU等非对称激活函数效果有限。
  2. 梯度稳定性:虽能缓解梯度问题,但在极深网络中仍需结合批归一化(Batch Normalization)等技术。

(九)、总结

Xavier初始化解决的是饱和激活函数(sigmoid/tanh)\但是针对非饱和激活函数,relu等无效。那么针对于relu这种激活函数该怎么办呢?可以使用kaiming初始化。

(十)、引申kaiming初始化

核心思想适用激活函数特点
Kaiming初始化保持输入输出方差一致,适配ReLU特性ReLU及其变体通过放大方差补偿ReLU的梯度衰减,适合非对称激活函数
Xavier初始化保持输入输出方差一致Tanh、Sigmoid通用性强,适合对称激活函数

四、附加题-面试常问

先对上述内容进行总结,总而言之,言而总之、所有的初始化方法都是为了,保证输入和输出的分布一致行,防止导致梯度消失和梯度爆炸。

具体的面试题,大家可以跳转这个链接去查看:

面试常问系列(二)-神经网络参数初始化之自注意力机制-CSDN博客

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

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

相关文章

使用CSS3实现炫酷的3D翻转卡片效果

使用CSS3实现炫酷的3D翻转卡片效果 这里写目录标题 使用CSS3实现炫酷的3D翻转卡片效果项目介绍技术要点分析1. 3D空间设置2. 核心CSS属性3. 布局和定位 实现难点和解决方案1. 3D效果的流畅性2. 卡片内容布局3. 响应式设计 性能优化建议浏览器兼容性总结 项目介绍 在这个项目中…

AI Agent开发大全第七课-个人如何申请到靠谱的AI

前言 前面几个课程我们做了一些AI基础知识的铺垫,不要小看基础知识,这些基础知识往往是一些正在从事AI开发的工作者们都没有深入去了解的。 其实这就好比简历上写熟练使用mySql,而实际mySql里那些精妙的参数和设置以及一些底层真的都知道吗? 所以我特别强调基础得打造,…

什么是网络准入?十种常见的网络准入解决方案分享!

在数字化转型的浪潮中&#xff0c;企业网络的边界日益模糊&#xff0c;数据安全与访问控制成为了企业IT管理的核心挑战之一。OneNAC网络准入系统&#xff0c;作为新一代网络安全解决方案的佼佼者&#xff0c;凭借其强大的功能特性和灵活性&#xff0c;在众多网络准入控制&#…

Jetpack Compose 选项卡控件实现

这里写目录标题 介绍主体解释 介绍 实现选项卡控件 主体 import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.…

Java 大视界 -- Java 大数据在智慧文旅旅游目的地营销与品牌传播中的应用(150)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

使用密码连接Redis服务的两种方式

说明&#xff1a;本文介绍连接需要密码的Redis服务的两种方式 方式一 连接时&#xff0c;携带密码&#xff0c;如下&#xff1a; redis-cli -a [密码]如下&#xff1a; 有两个问题&#xff1a; 密码直接放在命令里&#xff0c;可通过 history 找到&#xff0c;不安全&#x…

搭建React简单项目

一、项目构建 目录结构&#xff1a; 安装脚手架 npm install -g create-react-app // or yarn add -g create-react-app 一、项目版本 1、react&#xff1a;"^18.3.1"&#xff1b; 2、react-router-dom&#xff1a;"^6.23.1"&#xff1b; 3、项目创…

知识库已上线

目录 知识库上线了加入知识库注册账号切换租户加入租户找到知识库点击申请等待管理员审核通过后&#xff0c;点击去后台可以开始创作了创建我们的第一个知识库点击详情进入创作页面&#xff0c;创建我们的第一篇知识 发布知识将我们的知识库变更为公开状态发布知识等待管理员审…

对象克隆以及BigInteger()方法,与BigDecima()方法的学习

BigInteger&#xff08;&#xff09;方法&#xff1a; ①获取一个随机的大整数&#xff1a; public class Test3 {public static void main(String[] args) {Random rnew Random();BigInteger bigIntegernew BigInteger(4,r);System.out.println(bigInteger);} } ②&#xf…

学习记录-vue2,3-vue实现tab栏

目录 vue实现tab栏功能描述实现效果vue实现tab栏实现步骤1. 概念理解2. Tab栏切换 完整实例代码 vue实现tab栏功能描述 选项卡切换选中状态 实现效果 vue实现tab栏实现步骤 1. 概念理解 了解vue的基础指令 代码含义v-on绑定事件&#xff0c;可以简写为:事件名“执行体”。…

【读书笔记】华为《从偶然到必然》

note 华为的成功并非偶然&#xff0c;而是通过IPD体系、投资组合管理、平台战略等系统性工具&#xff0c;将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念&#xff0c;揭示了企业规模扩张与管理能力匹配的深层规律&#xff0c;为高科技企业提供了可借鉴…

表达式树和编译原理【10道经典面试题】(中英对照)

表达式树&#xff08;Expression Tree&#xff09; 是一种用于表示数学表达式的二叉树结构。它在编译器设计、数学计算引擎、符号计算等领域有着广泛的应用&#xff08;《表达式树&#xff08;Expression Tree&#xff09;在编译器中的应用》&#xff09;。理解表达式树的构建、…

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

STM32定时器-01定时器概述

内容概述 定时器是STM32中功能最强大、结构最复杂的一个外设&#xff0c;分为四部分&#xff1a; 一部分&#xff1a;定时中断功能 二部分&#xff1a;定时器输出比较&#xff0c;常见的用途&#xff1a;产生PWM波形&#xff0c;驱动电机&#xff08;如驱动舵机和直流电机&…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker&#xff1a;在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

17153 班级活动

17153 班级活动 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;2023、思维、国赛 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10…

Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

在 Java 编程中&#xff0c;IO&#xff08;输入输出&#xff09;流是处理数据输入输出的核心工具。无论是读取文件、网络通信&#xff0c;还是处理用户输入&#xff0c;IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景&#xff0…

HTTPS

目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL&#xff0c;TLS(HTTP之下&#xff0c;传输层之上)加密/解密安全协议&#xff0c;如果HTTP经过这个协议&#xff0c;对端也走…