🌟 大背景:训练神经网络 = 下山寻宝

训练神经网络就像你蒙着眼在一座大山里,想找最低点(最小损失)。你只能靠脚下的坡度(梯度)来决定往哪儿走。

  • 你的位置 = 模型参数(权重 www
  • 坡度 = 梯度 ∇J∇JJ
  • 走一步的大小 = 学习率 ηηη
  • 山的结构 = 神经网络的结构

现在,我们看看路上会遇到哪些坑。


1. 参数初始化:你一开始站哪儿?

💬 大白话:

你不能随便往地上一站就开始走。
如果一开始站的位置太差(比如平地或悬崖),可能一辈子都找不到宝藏。

在神经网络里,参数初始化就是决定模型一开始的“姿势”。

❌ 常见错误:全0初始化

w = 0  # 所有权重都设为0

问题:所有神经元“长得一模一样”,更新也一样 → 对称性问题,学不到东西。

✅ 正确做法:用随机小数初始化

但随机也不能乱来!太小 → 信号传着传着没了;太大 → 信号爆炸。

于是,大神们提出了科学初始化方法


1.1 Lecun Initialization(1998)

适用tanh 激活函数 + 线性激活(如MLP)

核心思想:让前向传播时,信号的方差保持稳定。

数学公式

权重 www 从均值为 0、方差为 1nin\frac{1}{n_{in}}nin1 的正态分布中采样:
w∼N(0,1nin) w ∼ N(0, \frac{1}{n_{in}}) wN(0,nin1)

其中 ninn_{in}nin 是前一层的神经元数量。

例子
前一层有 512 个神经元 → Var(w)=1512≈0.00195→w∼N(0,0.00195)Var(w) = \frac{1}{512} ≈ 0.00195 → w ∼ N(0, 0.00195)Var(w)=51210.00195wN(0,0.00195)


1.2 Xavier (Glorot) Initialization(2010)

适用tanhsigmoid 激活函数

核心思想:同时考虑前向和反向传播,让梯度也不爆炸不消失。

数学公式

权重 www 从均值为 0、方差为 2nin+nout\frac{2}{n_{in} + n_{out}}nin+nout2 的正态分布中采样:

w∼N(0,2nin+nout) w ∼ N(0, \frac{2}{n_{in} + n_{out}}) wN(0,nin+nout2)

其中:

  • ninn_{in}nin:前一层神经元数
  • noutn_{out}nout:后一层神经元数

例子
nin=512,nout=256→Var(w)=2512+256=2768≈0.0026→w∼N(0,0.0026)n_{in}=512, n_{out}=256 → Var(w) = \frac{2}{512+256} = \frac{2}{768} ≈ 0.0026 → w ∼ N(0, 0.0026)nin=512,nout=256Var(w)=512+2562=76820.0026wN(0,0.0026)

✅ 比 Lecun 更“平衡”,兼顾前后向。


1.3 Kaiming (He) Initialization(2015)

适用ReLU 及其变体(如 Leaky ReLU)激活函数

为什么需要它?
因为 ReLU(x)=max⁡(0,x)ReLU(x) = \max(0,x)ReLU(x)=max(0,x) 会“杀死”一半的神经元(负数变0),所以信号会衰减。

核心思想:补偿 ReLU 的“死亡率”,让信号方差稳定。

数学公式

权重 www 从均值为 0、方差为 2nin\frac{2}{n_{in}}nin2 的正态分布中采样:

w∼N(0,2nin) w ∼ N(0, \frac{2}{n_{in}}) wN(0,nin2)

例子
nin=512→Var(w)=2/512=0.0039→w∼N(0,0.0039)n_{in}=512 → Var(w) = 2/512 = 0.0039 → w ∼ N(0, 0.0039)nin=512Var(w)=2/512=0.0039wN(0,0.0039)

✅ 现代深度学习(如ResNet)几乎都用 Kaiming 初始化。


📊 总结对比

方法适用激活函数方差公式
Lecuntanh, 线性1/nin1 / n_{in}1/nin
Xaviertanh, sigmoid2/(nin+nout)2 / (n_{in} + n_{out})2/(nin+nout)
KaimingReLU, Leaky ReLU2/nin2 / n_{in}2/nin

2. 梯度消失 & 梯度爆炸

💬 大白话:

你走着走着,发现:

  • 梯度消失:坡度太小,几乎感觉不到方向,走不动了。
  • 梯度爆炸:坡度太大,一步迈过头,直接飞出山外。

📌 根源:链式法则的“连乘效应”

假设一个3层网络,损失 J 对第一层权重 w1 的梯度:

∂J/∂w1=(∂J/∂a3)×(∂a3/∂z3)×(∂z3/∂a2)×(∂a2/∂z2)×(∂z2/∂a1)×(∂a1/∂z1)×(∂z1/∂w1) ∂J/∂w_1 = (∂J/∂a_3) × (∂a_3/∂z_3) × (∂z_3/∂a_2) × (∂a_2/∂z_2) × (∂z_2/∂a_1) × (∂a_1/∂z_1) × (∂z_1/∂w_1) J/w1=(J/a3)×(a3/z3)×(z3/a2)×(a2/z2)×(z2/a1)×(a1/z1)×(z1/w1)

其中 a=σ(z)a = σ(z)a=σ(z)σσσ 是激活函数。

📐 例子:Sigmoid 激活函数

Sigmoid 导数:σ′(z)=σ(z)(1−σ(z))σ'(z) = σ(z)(1-σ(z))σ(z)=σ(z)(1σ(z)),最大值 0.25

假设每层梯度都被乘以 0.25:

  • 3层:0.253=0.01560.25^3 = 0.01560.253=0.0156
  • 10层:0.2510≈9.5e−70.25^{10} ≈ 9.5e-70.25109.5e7几乎为0 → 梯度消失!

📐 例子:权重太大

如果 www 初始化太大,比如 w=5w=5w=5,那 z=w×az = w×az=w×a 会很大 → σ(z)≈1σ(z) ≈ 1σ(z)1σ′(z)≈0σ'(z) ≈ 0σ(z)0 → 同样梯度消失。

或者 w=10w=10w=10zzz 超大 → 梯度超大 → 一步更新 w=w−η×∇Jw = w - η×∇Jw=wη×J,直接飞出合理范围 → 梯度爆炸。


✅ 解决方案

  1. 换激活函数:用 ReLU,它的导数在正区间是 1,不会让梯度变小。
  2. 用 Kaiming 初始化:专门针对 ReLU 设计。
  3. 加 Batch Normalization:让每层输入保持稳定分布。
  4. 残差连接:见下文。

3. 残差连接(Residual Connection)

💬 大白话:

梯度消失是因为路太长,梯度传不回去。
那怎么办?修条“捷径”!

让信息和梯度可以“抄近道”直接传回去。

📐 数学公式(ResNet)

普通层:
a[l]=σ(w[l]×a[l−1]+b[l]) a[l] = σ( w[l] × a[l-1] + b[l] ) a[l]=σ(w[l]×a[l1]+b[l])

残差块:
a[l]=σ(F(a[l−1])+a[l−1]) a[l] = σ( F(a[l-1]) + a[l-1] ) a[l]=σ(F(a[l1])+a[l1])

其中 F(a[l−1])F(a[l-1])F(a[l1]) 是“主路”(比如两层卷积),a[l−1]a[l-1]a[l1] 是“捷径”。

📐 为什么能解决梯度消失?

看梯度 ∂J/∂a[l−1]∂J/∂a[l-1]J/a[l1]

∂J/∂a[l−1]=∂J/∂a[l]×∂a[l]/∂a[l−1] ∂J/∂a[l-1] = ∂J/∂a[l] × ∂a[l]/∂a[l-1] J/a[l1]=J/a[l]×a[l]/a[l1]

而:
∂a[l]/∂a[l−1]=∂/∂a[l−1][F(a[l−1])+a[l−1]]=F′+I ∂a[l]/∂a[l-1] = ∂/∂a[l-1] [ F(a[l-1]) + a[l-1] ] = F' + I a[l]/a[l1]=/a[l1][F(a[l1])+a[l1]]=F+I

其中 III 是单位矩阵(来自 a[l−1]a[l-1]a[l1] 的导数)。

关键:即使 F′≈0F' ≈ 0F0(主路梯度消失),F′+IF' + IF+I 的最小特征值也有 1

所以梯度至少能以 111 的比例传回去,不会消失。

🖼️ 就像你下山,主路被雪埋了,但旁边有条水泥小路(+1),你还能走回去。

✅ 效果:

ResNet 可以轻松训练 100层、1000层 的网络!


4. 学习率与训练不稳定性

💬 大白话:

你走一步的大小(学习率 η)得合适。

  • η 太小:走得慢,天黑了还没到底。
  • η 太大:容易迈过头,来回震荡,甚至飞出山外(发散)。

📐 数学公式(梯度下降)

wt+1=wt−η×∇J(wt) w_{t+1} = w_t - η × ∇J(w_t) wt+1=wtη×J(wt)

📌 例子:J(w)=w2J(w) = w²J(w)=w2(抛物线,最小值在 w=0w=0w=0

  • 梯度:∇J(w)=2w∇J(w) = 2wJ(w)=2w
  • w=3w=3w=3 开始
学习率 ηηη更新过程结果
η=0.1η=0.1η=0.13→2.4→1.92→...3 → 2.4 → 1.92 → ...32.41.92...慢慢收敛
η=0.6η=0.6η=0.63→−0.6→0.12→−0.024→...3 → -0.6 → 0.12 → -0.024 → ...30.60.120.024...震荡收敛
η=1.1η=1.1η=1.13→−3.6→4.32→...3 → -3.6 → 4.32 → ...33.64.32...发散!

🎯 训练不稳定性表现:

  • 损失函数上蹿下跳
  • 损失变成 NaNNaNNaN(数值溢出)

✅ 解决方案

  1. 调小学习率:最直接。
  2. 学习率预热(Warm-up):开始用小学习率,等稳定了再加大。
  3. 学习率衰减:训练后期逐渐减小 ηηη
  4. 用自适应优化器:如 Adam,它会自动调每个参数的“步子”。

📊 总结对比表

问题原因数学关键解决方案
初始化不当信号爆炸/消失Var(w)Var(w)Var(w) 不合理Lecun/Xavier/Kaiming
梯度消失链式法则连乘∏σ′(z)≈0∏ σ'(z) ≈ 0σ(z)0ReLU + Kaiming + BN + Residual
残差连接深网络梯度传不回∂a[l]/∂a[l−1]=F′+I∂a[l]/∂a[l-1] = F' + Ia[l]/a[l1]=F+I加“捷径”
学习率太大更新步子太大w=w−η×∇Jw = w - η×∇Jw=wη×J 爆炸ηηη,用 Adam

💡 一句话记住

  • 初始化:别乱站,按激活函数选“科学站位”。
  • 梯度消失:路太长,坡没了 → 修“捷径”(残差)。
  • 学习率:步子太大扯着蛋,太小半天到不了。

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

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

相关文章

synchronized锁升级的过程(从无锁到偏向锁,再到轻量级锁,最后到重量级锁的一个过程)

锁升级是 Java 中 synchronized 锁 的核心优化机制(基于 JVM 的 对象头 Mark Word 实现),指锁的状态从 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 逐步升级的过程。其目的是通过 “按需升级”,在不同并发场景下选择最优的锁实现&am…

HOT100--Day25--84. 柱状图中最大的矩形,215. 数组中的第K个最大元素,347. 前 K 个高频元素

HOT100–Day25–84. 柱状图中最大的矩形,215. 数组中的第K个最大元素,347. 前 K 个高频元素 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型:栈,堆。 84. 柱状图中最大的矩形 思路: class Solution {publ…

基于 Apache Doris 的用户画像数据模型设计方案

一、 需求分析与设计目标数据源:用户基本信息:用户ID、性别、出生日期、注册时间、常驻地域(省、市、区)、职业等。用户体检报告:每次体检的报告ID、体检时间、各项指标(如血压、血糖、血脂、BMI等&#xf…

Python的深度学习

深入理解Python高级特性掌握Python的高级特性是进阶的关键,包括装饰器、生成器、上下文管理器、元类等。这些特性能够提升代码的灵活性和效率。例如,装饰器可以用于实现AOP(面向切面编程),生成器可以处理大数据流而无需…

数据库范式(Normalization)

一个设计混乱的数据库就像一个杂乱的房间,用起来非常不方便:东西到处乱放(数据冗余),找件东西要翻遍所有角落(查询困难),扔掉一把旧椅子时,可能会把搭在上面的唯一一件外…

数据结构---循环队列

基于循环数组实现的循环队列解决了顺序队列中的假溢出导致的空间浪费问题操作:(1)初始化//循环队列 typedef struct {int *data;//指针模拟声明数组int head,tail;//队头,队尾 }Queue; //初始化 Queue *InitQueue() {Queue *q (Q…

深入理解线程模型

线程作为操作系统调度的基本执行单元,是实现高吞吐、低延迟系统的基础。一、进程与线程的体系结构对比核心概念:进程(Process):操作系统资源分配的基本单位,拥有独立的虚拟地址空间、文件描述符表、环境变量…

TTC定时器中断——MPSOC实战3

开启TTC定时器&#xff0c;不同于7000系列的私有定时器此处设置LPD_LSBUS频率TTC频率取决于LPD_LSBUS可前往指定位置查看参数不使能填写对应宏可前往指定位置查看参数main.c#include <stdio.h> #include "xparameters.h" #include "xgpiops.h" #incl…

人工智能训练师三级备考笔记

一、实操1&#xff09;通用语法&#xff08;常见于实操题第一块代码块&#xff09;1.读取文件数据或加载数据集等描述时一般为以下结构&#xff1a;Datapd.read_文件格式(文件名) 注意&#xff1a;文件名需要用‘ ’框起来&#xff0c;必须要有引号文件格式有以下内容csv、txt…

Cherry Studio递归工具调用机制深度解析

在现代AI应用开发中,工具调用(Tool Calling)已成为大语言模型与外部系统交互的核心机制。Cherry Studio作为一款先进的AI对话客户端,实现了一套完整的递归工具调用系统,能够让AI助手在执行复杂任务时自动调用多个工具,并根据执行结果智能决策下一步操作。本文将深入解析这…

[哈希表]966. 元音拼写检查器

966. 元音拼写检查器 class Solution:def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:origin set(wordlist) # 存储原始单词用于完全匹配lower_to_origin {} # 存储小写形式到原始单词的映射vowel_to_origin {} # 存储元音模糊形…

正则表达式与文本三剑客(grep、sed、awk)基础与实践

正则表达式基础与实践一、正则表达式概述1. 定义正则表达式&#xff08;Regular Expression&#xff0c;简称 RE&#xff09;是用于描述字符排列和匹配模式的语法规则&#xff0c;核心作用是对字符串进行分割、匹配、查找、替换操作。它本质是 “模式模板”&#xff0c;Linux 工…

eclipse中web项目编译后的lib里面jar为空问题处理

1. 检查项目构建配置验证项目性质右键单击项目 → Properties确认项目已正确配置&#xff1a;​Project Facets​&#xff1a;确保已勾选"Dynamic Web Module"​Targeted Runtimes​&#xff1a;确保已选择服务器运行时&#xff08;如Tomcat&#xff09;检查部署程序…

C语言中的递归问题——汉诺塔问题

汉诺塔&#xff08;Tower of Hanoi)&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。传说大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在…

ArkAnalyzer源码初步分析I——分析ts项目流程

1.前言&#xff1a; 鸿蒙程序分析框架ArkAnalyzer&#xff08;方舟分析器&#xff09; 源码地址 入门文档 2.阅读入门文档后&#xff1a; 本人具有一定的Java开发经验。虽然我对 TypeScript&#xff08;TS&#xff09;和 ArkTS 还不熟&#xff0c;但很多概念对我这个 Java 开…

c#基础二(类和对象,构造器调用顺序、访问级别、重写和多态、抽象类和接口)

一、类1.0对象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //写法一Student stunew Student();stu.name"Tom";stu.age20;//写法二Student stu2 new Student { name &qu…

Qt之快捷键、事件处理、自定义按键——完成记事本项目

快捷键我们电脑中的记事本中还支持快捷键&#xff0c;如“CTRLO”打开文件、“CTRLS”保存文件在Qt中使用QShortcut这个类创建快捷键在.cpp文件的构造函数中创建QShortcut对象&#xff0c;绑定打开文件和保存文件的槽函数放大缩小字体还是在.cpp的构造函数中编写代码Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一个Face

理论介绍 在OpenCASCADE几何建模内核中&#xff0c;BRepAlgoAPI_Splitter是一个强大的工具&#xff0c;用于将一个形状&#xff08;Shape&#xff09;用另一个形状&#xff08;Tool&#xff09;进行分割。这种操作在CAD建模中非常常见&#xff0c;比如用平面切割实体、用曲线分…

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法

【医疗 AI】Baichuan-M2 医疗大模型&#xff1a;技术解读与使用方法1. Baichuan-M2 医疗大模型简介1.1 基本信息1.2 下载地址1.3 技术特点2. Baichuan-M2 模型技术报告2.1 摘要2.2 医学性能评估2.2.1 HealthBench基准2.2.2 中国医疗场景对比评估2.3 系统架构2.3.1 验证器系统2.…

unity pcd 二进制版 简单显示文件对象(单色)

unity Point Cloud Viewer and Tool 那个插件不支持pcd二进制&#xff0c;而且网上到处都是AI 我恨这种AI滥用&#xff0c;提供不了一点价值 好了&#xff0c;言归正传 可以在Point Cloud Viewer and Tool这个插件报错地方转用这个代码&#xff0c;具体咋结合请自行研究。 …