当前位置: 首页 > ds >正文

深度学习-数值稳定性和模型初始化

到目前为止,我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数,有人会认为初始化方案时理所当然的,忽略了如何做出这些选择的细节,甚至有人可能会觉得,初始化方案的选择并不是特别重要,实际上,初始化方案的选择在神经网络学习中起着举足轻重的作用,保持数值稳定性至关重要。此外,这些初始化方案的选择可以与非线性激活函数的选择有趣的结合在一起。我们选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快,糟糕的选择可能会导致我们在训练时遇到梯度爆炸或者梯度消失,本节将更详细的探讨这些主题,讨论一些有用的启发方式方法。这些启发方式在整个深度学习中都很有用。

4.8.1 梯度小时和梯度爆炸

考虑一个具有L层,输入x和输出o的深层网络。每一层l由变换f1定义,该变换的参数为权重W(l),隐藏变量是h(l) 令h(0) =x。我们的网络可以表示为

h(l) = Flh(l-1), 因此 o = FL .... Fl(x)

换而言之,该剃度是L-1 个矩阵M(L) ... M(l + 1) 与梯度向量v(l)的乘积。因此,我们容易受到数值下溢问题的影响,当将过多的概率在一起相承时,这种问题经常会出现。在处理概率时,一个常见的技巧是切换到对数空间,即将数值表示的压力从尾数转移到指数。遗憾的是,这会使上面的问题更为严重,矩阵M可能是各种各样的特征值,可能很小,也可能很大,而他们的乘积可能非常大,也可能非常小。

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

1 梯度消失

曾经sigmoid 函数很流行,因为它类似于阈值函数,由于早期的人工神经网络受到生物神经网络的启发,神经元要饿完全激活,要么完全不激活的想法很吸引力。然而,却是导致梯度消失的一个常见原因,我们仔细看着sigmoid函数为什么导致梯度消失

%matplotlib inline

import torch

from d2l import torch as d2l

x = 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函数输入很大或者很小梯度就会消失此外反向传播通过许多除非恰好sigmoid函数输入接近位置否则整个乘积梯度可能会消失网络很多层时候除非我们很小心否则某一层可能会切断梯度事实这个问题曾经困扰深度网络训练因此更稳定RelU系列函数已经成为从业者默认选择(虽然从神经科学的角度看起来不会太合理)

  1. 梯度爆炸

梯度消失相反梯度爆炸可能同样令人烦恼为了更好说明这一点我们生成100高斯随机矩阵将他们某个初始矩阵相乘对于我们选择尺寸矩阵乘积发生了爆炸当这种情况深度网络初始化所导致我们没有机会梯度下降优化收敛

M = torch.normal(0, 1, size = (4,4))

printf('一个矩阵\n');

for i in range(100)

M = torch.mm(M, torch.normal(0, 1, size(4, 4)));

3 打破对成型

神经网络设计中另一个问题参数固有对称性假设我们有一个简单多层感知有一个隐藏两个隐藏单元在这种情况下我们可以第一层权重进行排列并且同样输出层权重进行重排列可以获得相同函数第一个隐藏单元第二个隐藏单元没有什么区别换句话说每一层隐藏单元之间具有排列对称性

4.8.2 参数初始化

解决上述问题一种方法进行参数初始化优化期间适当正则化也可以进一步提高稳定性

http://www.xdnf.cn/news/1642.html

相关文章:

  • ZooKeeper配置优化秘籍:核心参数说明与性能优化
  • 实时数字人——DH_LIVE
  • 矩阵运算和线性代数操作开源库
  • Unreal Niagara制作SubUV贴图翻页动画
  • 实现营销投放全流程自动化 超级汇川推出信息流智能投放产品“AI智投“
  • DDD领域驱动与传统CRUD
  • 缓存集群技术深度解析:从原理到实战
  • 数据结构-排序
  • C#基于Sunnyui框架和MVC模式实现用户登录管理
  • PH热榜 | 2025-04-24
  • 【网络应用程序设计】实验四:物联网监控系统
  • 发币流程是什么,需要多少成本?
  • 深入详解人工智能数学基础——概率论中的KL散度在变分自编码器中的应用
  • 数据库安装和升级和双主配置
  • 深度解析:基于Python的微信小程序自动化操作实现
  • 优化uniappx页面性能,处理页面滑动卡顿问题
  • 时序数据库IoTDB构建的能源电力解决方案
  • JVM-类加载机制
  • 【docker】 pull FROM build
  • 3.1.3 materialDesign:DialogHost 使用介绍
  • Whisper微调及制作方言数据集
  • Golang 闭包学习
  • arm64适配系列文章-第三章-arm64环境上mariadb的部署
  • 一行命令打开iOS模拟器
  • uniapp -- 实现微信小程序、app、H5端视频上传
  • ORACLE RAC环境使用ASM机制零宕机时间更换存储的实践
  • matlab 绘图
  • 【leetcode100】目标和
  • MongoDB副本集搭建与核心机制
  • 【MySQL】基本查询