从0开始深度学习(17)——数值稳定性和模型初始化

在每次训练之前,都会对模型的参数进行初始化,初始化方案的选择在神经网络学习中起着举足轻重的作用, 它对保持数值稳定性至关重要。
我们选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇到梯度爆炸梯度消失

1 梯度消失和梯度爆炸

不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。 我们可能面临一些问题:
要么是**梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛;
要么是
梯度消失(gradient vanishing)**问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。

1.1 梯度消失

这里以sigmoid函数为例,因为它类似于阈值函数,所以也容易导致梯度消失,我们创建了一个从 -8.0 到 8.0,步长为 0.1 的一维张量 x,使用sigmoid函数,然后计算 y 对 x 的梯度,最后输出一个横轴是x,y轴是梯度的图像

%matplotlib inline
import torch
from d2l import torch as d2lx = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.backward(torch.ones_like(x))d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()],legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))

在这里插入图片描述
我们发现,当sigmoid函数的输入很大或是很小时,它的梯度都会消失,所以一旦某个网络层的输入过大或者过小,梯度就会消失, 因此,更稳定的ReLU系列函数称为了默认选择

1.2 梯度爆炸

通过构造一个简单的递归函数或链式乘法,可以看到梯度在反向传播过程中如何逐渐增大

%matplotlib inline
import torch
from d2l import torch as d2l# 构造从 -1 到 1 的输入数据,并启用梯度计算
x = torch.tensor(1.0, requires_grad=True)# 模拟梯度爆炸:我们构造一个由 100 个常数值相乘的过程
y = x
for i in range(100):  # 重复 100 次y = y * 1.1  # 每次乘以 1.1# 反向传播
y.backward()# 绘制结果
x_grad = x.grad.item()
print(f"x 的梯度值为: {x_grad}")# 由于我们反复放大,梯度会呈指数增长,这就是梯度爆炸的表现。

当这种情况是由于深度网络的初始化所导致时,我们没有机会让梯度下降优化器收敛。

1.3 对称性问题

如果所有的神经元(同一层中的神经元)具有相同的初始权重,它们将学到相同的特征。这种现象会让网络的学习过程失去多样性,进而影响模型的表达能力和训练效果。

例如,如果你把每一层的所有神经元的权重都初始化为 0 或相同的值,网络中的每个神经元都会执行相同的计算,这样就失去了通过不同神经元学习不同特征的意义。

1.4 打破对称性

打破对称性就是在网络初始化时,为每个神经元赋予不同的初始权重值,确保它们在训练过程中能学习到不同的特征。通常的做法是随机初始化权重,同样的还能使用暂退法正则化来打破

2 参数初始化

解决(或至少减轻)上述问题的一种方法是进行参数初始化

2.1 默认初始化

之前的例子中,我们一直使用的是正态分布来初始化权重,如果不指定,pytorch框架会使用默认的随机初始化方法。

2.2 Xavier初始化( Glorot 初始化)

核心思想:
Xavier 初始化的目标是确保信号的方差在每一层传播时保持一致,即:

  • 前向传播中,输出的激活值的方差保持稳定,避免过大或过小。
  • 反向传播中,梯度的方差同样保持稳定,避免梯度爆炸或梯度消失。

为了实现这个目标,Xavier 初始化根据输入和输出层的神经元数量,计算合适的初始权重分布。具体公式如下:

对于权重矩阵中的每个元素 W i j W_{ij} Wij ,其初始化值从一个均匀分布或正态分布中随机采样:

  1. 均匀分布:

在这里插入图片描述

  1. 正态分布:

在这里插入图片描述

​其中:

  • n i n n_{in} nin是该层神经元的输入节点数量(上一层的神经元数量)。
  • n o u t n_{out} nout是该层神经元的输出节点数量(下一层的神经元数量)。

PyTorch 中提供了 Xavier 初始化的方法,可以直接使用 torch.nn.init.xavier_uniform_ 或 torch.nn.init.xavier_normal_ 来应用 Xavier 初始化。

import torch
import torch.nn as nnlinear = nn.Linear(100, 50)  
# 使用 Xavier 均匀初始化
nn.init.xavier_uniform_(linear.weight)
# 如果需要 Xavier 正态分布初始化
# nn.init.xavier_normal_(linear.weight)

Xavier 初始化通过平衡前向和反向传播中信号和梯度的方差,能够有效地帮助深层网络稳定训练,特别是对于使用 sigmoid 或 tanh 激活函数的网络非常重要。

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

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

相关文章

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机?2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充:使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

动态规划-子序列问题——1027.最长等差数列

1.题目解析 题目来源:1027.最长递增子序列——力扣 测试用例 2.算法原理 1.状态表示 等差数列至少是三个数,所以一维数组显然无法满足状态表示,所以需要开辟一个二维数组来表示,二维数组的两个下标分别是倒数第一与倒数第二个数 …

【JSON相关漏洞(Hijacking+Injection)挖掘技巧及实战案例全汇总】

JSON相关漏洞(HijackingInjection)挖掘技巧及实战案例全汇总 本文一是在为测试过程中遇到json返回格式时提供测试思路,二是几乎所有国内的资料都混淆了json和jsonp的区别——这是两种技术;以及json和jsonp hijacking的区别——这…

基于知识图谱的设备问答系统

你是不是还在为毕业设计苦恼?今天我就来给大家分享一款基于知识图谱的设备问答系统,不仅技术领先,而且非常适合用作毕业设计项目,帮助你轻松通过! 项目简介 这个设备问答系统基于Django(后端框架&#xf…

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包nginx部署配置ssl证书) 文章目录 从零开始的 vue项目部署到服务器详细步骤(vue项目build打包nginx部署配置ssl证书)一、前言二、vue项目部署前配置1、vite.config.js 增加…

ubuntu内核更新导致显卡驱动掉的解决办法

方法1,DKMS指定内核版本 用第一个就行 1,借鉴别人博客解决方法 2,借鉴别人博客解决方法 方法2,删除多于内核的方法 系统版本:ubuntu20.24 这个方法是下下策,如果重装驱动还是不行,就删内核在…

豆瓣同城活动采集-过去一年到未来已定档活动

通过采集豆瓣同城活动,来辅助分析一个城市的文商旅体活跃繁荣程度。 以成都为例,2023年10月30日到2024年11月未来已定档活动期间,豆瓣同城活动共有975场。 示例数据: 活动网址:有,此处不显示 封图网址&…

海量数据面试题

⭐️前言⭐️ 本篇文章主要针对在面试时可能涉及到的海量数据的面试题,该类型面试题常常考虑通过位图、布隆过滤器或者哈希的方式来解决。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何…

pytorh学习笔记——cifar10(九)使用torhvision的标准resnet模型

之前的demo都是模仿和简化了已有的模型,也可以直接调用orhvision的标准模型,代码将更加简单。 新建resnet18.py import torch.nn as nn from torchvision import modelsclass ResNet18(nn.Module):def __init__(self, num_classes10):super(ResNet18, …

json与python中字典的互相转化

json的定义 JSON (JavaScript Object Notation) ,是一种轻量级的数据交换格式。它的使用范围很广,并成为 ECMA 标准,可以被使用在多种编程语言中,用于前后端之间的数据传输、存储和交换数据。可以说是“用…

如何快速分析音频中的各种频率成分

从视频中提取音频 from moviepy.editor import VideoFileClip# Load the video file and extract audio video_path "/mnt/data/WeChat_20241026235630.mp4" video_clip VideoFileClip(video_path)# Extract audio and save as a temporary file for further anal…

Rust 力扣 - 5. 最长回文子串

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 从中心点先寻找和中心点相等的左右端点,在基于左右端点进行往外扩散,直至左右端点不相等或者越界,然后左右端点这个范围内就是我们找寻的回文串,我们遍历中心点&am…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程

想要把dmg格式转成iso格式,然后能在虚拟机上用,最起码新版的macOS镜像是不能用UltraISO,dmg2iso这种软件了,你直接转放到VMware里绝对读不出来,办法就是,在Mac系统中转换为cdr,然后再转成iso&am…

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言:上一篇实现了角色简单的移动控制,但是实际游戏中玩家的视角是可以转动的,并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动,觉得有帮助的话可以点赞收藏支持一下! 玩家第一人称视角 修复小问…

NAT技术和代理服务器

NAT IP原理 之前我们讨论了, IPv4协议中, IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:很多学校, 家庭, 公司内部采用每个终端设置私有…

批处理操作的优化

原来的代码 Override Transactional(rollbackFor Exception.class) public void batchAddQuestionsToBank(List<Long> questionIdList, Long questionBankId, User loginUser) {// 参数校验ThrowUtils.throwIf(CollUtil.isEmpty(questionIdList), ErrorCode.PARAMS_ERR…

2023IKCEST第五届“一带一路”国际大数据竞赛--社交网络中多模态虚假 媒体内容核查top11

比赛链接&#xff1a;https://aistudio.baidu.com/competition/detail/1030/0/introduction PPT链接&#xff1a;https://www.ikcest.org/bigdata2024/zlxz/list/page.html 赛题 社交网络中多模态虚假媒体内容核查 背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容…

GitHub Star 数量前 5 的开源应用程序生成器

欢迎来的 GitHub Star 数量排名系列文章的第 7 篇——最受欢迎的应用程序生成器。 之前我们已经详细探讨过&#xff1a;在 GitHub 上最受欢迎的——无代码工具、低代码项目、内部工具、CRUD项目、自部署项目和 Airtable 开源替代品。累计超过 50 个优质项目&#xff01;&#…