DIDL5_数值稳定性和模型初始化

news2024/12/26 2:30:14

数值稳定性和模型初始化

  • 数值稳定性
    • 梯度不稳定的影响
    • 推导
    • 什么是梯度消失?
    • 什么是梯度爆炸?
  • 如何解决数值不稳定问题?——参数初始化
    • 参数初始化的几种方法
      • 默认初始化
      • Xavier初始化
  • 小结

当神经网络变得很深的时候,数值特别容易不稳定。
我们实现的每个模型都是根据某个预先指定的分布来初始化模型的参数。
初始化方案的选择在神经网络学习中起着举足轻重的作用, 它对保持数值稳定性至关重要

数值稳定性

梯度不稳定的影响

糟糕初始化参数可能会导致我们在训练时遇到梯度爆炸或梯度消失。
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。

  • 梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛;
  • 梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。

推导

考虑一个具有 L L L层、输入 x x x和输出 o o o的深层网络。每一层 l l l由变换 f l f_l fl定义, 该变换的参数为权重 W ( l ) W^{(l)} W(l), 其隐藏变量是 h ( l ) h^{(l)} h(l)(令 h 0 = x h^{0} = x h0=x)。
该网络可以表示为:
h ( l ) = f l ( h ( l − 1 ) )  因此  o = f L ∘ … ∘ f 1 ( x ) . \mathbf{h}^{(l)} = f_l (\mathbf{h}^{(l-1)}) \text{ 因此 } \mathbf{o} = f_L \circ \ldots \circ f_1(\mathbf{x}). h(l)=fl(h(l1)) 因此 o=fLf1(x).
如果所有隐藏变量和输入都是向量, 我们可以将 o \mathbf{o} o关于任何一组参数 W ( l ) \mathbf{W}^{(l)} W(l)的梯度写为下式:
∂ W ( l ) o = ∂ h ( L − 1 ) h ( L ) ⏟ M ( L ) = d e f ⋅ … ⋅ ∂ h ( l ) h ( l + 1 ) ⏟ M ( l + 1 ) = d e f ∂ W ( l ) h ( l ) ⏟ v ( l ) = d e f . \partial_{\mathbf{W}^{(l)}} \mathbf{o} = \underbrace{\partial_{\mathbf{h}^{(L-1)}} \mathbf{h}^{(L)}}_{ \mathbf{M}^{(L)} \stackrel{\mathrm{def}}{=}} \cdot \ldots \cdot \underbrace{\partial_{\mathbf{h}^{(l)}} \mathbf{h}^{(l+1)}}_{ \mathbf{M}^{(l+1)} \stackrel{\mathrm{def}}{=}} \underbrace{\partial_{\mathbf{W}^{(l)}} \mathbf{h}^{(l)}}_{ \mathbf{v}^{(l)} \stackrel{\mathrm{def}}{=}}. W(l)o=M(L)=def h(L1)h(L)M(l+1)=def h(l)h(l+1)v(l)=def W(l)h(l).
该梯度是 L − l L-l Ll个矩阵 M ( L ) ⋅ … ⋅ M ( l + 1 ) \mathbf{M}^{(L)} \cdot \ldots \cdot \mathbf{M}^{(l+1)} M(L)M(l+1)与梯度向量 v ( l ) \mathbf{v}^{(l)} v(l)的乘积。

因此,我们容易受到数值下溢问题的影响. 当将太多的概率乘在一起时,这些问题经常会出现。

什么是梯度消失?

激活函数sigmoid函数, 1 / ( 1 + exp ⁡ ( − x ) ) 1/(1 + \exp(-x)) 1/(1+exp(x)),类似于阈值函数。 由于早期的人工神经网络受到生物神经网络的启发, 神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。 然而,它却是导致梯度消失问题的一个常见的原因:
在这里插入图片描述
当sigmoid函数的输入很大或是很小时,它的梯度都会消失。当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。
当我们的网络有很多层时,除非我们很小心,否则在某一层可能会切断梯度。
更稳定的ReLU系列函数已经成为从业者的默认选择。

什么是梯度爆炸?

矩阵乘积发生了爆炸,这种情况是由于深度网络的初始化导致的,没有机会让梯度下降优化器收敛。

#pytorch
M = torch.normal(0, 1, size=(4,4))
print('一个矩阵 \n',M)
for i in range(100):
    M = torch.mm(M,torch.normal(0, 1, size=(4, 4)))

print('乘以100个矩阵后\n', M)

在这里插入图片描述

如何解决数值不稳定问题?——参数初始化

参数初始化是解决(或至少减轻)上述问题的一种方法, 优化期间的注意和适当的正则化也可以进一步提高稳定性。

参数初始化的几种方法

默认初始化

如果我们不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。

Xavier初始化

某些没有非线性的全连接层输出(例如,隐藏变量) o i o_{i} oi的尺度分布。 对于该层 n i n n_\mathrm{in} nin输入 x j x_j xj及其相关权重 w i j w_{ij} wij,输出由下式给出
o i = ∑ j = 1 n i n w i j x j . o_{i} = \sum_{j=1}^{n_\mathrm{in}} w_{ij} x_j. oi=j=1ninwijxj.

现在标准且实用的Xavier初始化的基础, 它以其提出者 (Glorot and Bengio, 2010) 第一作者的名字命名。 通常,Xavier初始化从均值为零,方差 σ 2 = 2 n i n + n o u t \sigma^2 = \frac{2}{n_\mathrm{in} + n_\mathrm{out}} σ2=nin+nout2的高斯分布中采样权重。 我们也可以将其改为选择从均匀分布中抽取权重时的方差。 注意均匀分布 U ( − a , a ) U(-a, a) U(a,a)的方差为 a 2 3 \frac{a^2}{3} 3a2。 将 a 2 3 \frac{a^2}{3} 3a2代入到 σ 2 \sigma^2 σ2的条件中,将得到初始化值域:
U ( − 6 n i n + n o u t , 6 n i n + n o u t ) . U\left(-\sqrt{\frac{6}{n_\mathrm{in} + n_\mathrm{out}}}, \sqrt{\frac{6}{n_\mathrm{in} + n_\mathrm{out}}}\right). U(nin+nout6 ,nin+nout6 ).

尽管在上述数学推理中,“不存在非线性”的假设在神经网络中很容易被违反, 但Xavier初始化方法在实践中被证明是有效的。

小结

  • 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。
  • 需要用启发式的初始化方法来确保初始梯度既不太大也不太小。
  • ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。
  • 随机初始化是保证在进行优化前打破对称性的关键。
  • Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。

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

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

相关文章

面试题67. 把字符串转换成整数

题目 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xf…

密度峰值聚类算法(DPC)

密度峰值聚类算法目录DPC算法1.1 DPC算法的两个假设1.2 DPC算法的两个重要概念1.3 DPC算法的执行步骤1.4 DPC算法的优缺点matlab代码密度计算函数计算delta寻找聚类中心点聚类算法目录 DPC算法 1.1 DPC算法的两个假设 1)类簇中心被类簇中其他密度较低的数据点包围…

kubernetes 教程

K8s 安装kubectl 下载kubectl curl -LO "https://dl.k8s.io/release/**$(**curl -L -s https://dl.k8s.io/release/stable.txt**)**/bin/linux/amd64/kubectl" 安装 sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 验证 kubectl versi…

学习 Python 之 Pygame 开发坦克大战(二)

学习 Python 之 Pygame 开发坦克大战(二)坦克大战的需求开始编写坦克大战1. 搭建主类框架2. 获取窗口中的事件3. 创建基类4. 初始化我方坦克类5. 完善我方坦克的移动5. 完善我方坦克的显示6. 在主类中加入我方坦克并完成坦克移动7. 初始化子弹类8. 完善子…

(考研湖科大教书匠计算机网络)第五章传输层-第一、二节:传输层概述及端口号、复用分用等概念

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:传输层概述(1)概述(2)从计算机网络体系结构角度看传输层(3)传输层意义二&am…

MySQL行转列列转行实例解析

文档准备要求:找出所有的用户没有安装的软件。创建两个表,用户表app_install 和 app表app建表语句:# 创建app表,并插入数据 create table app(id int,app varchar(32)); insert into app(id,app) values (1,微信),(2,QQ),(3,支付宝…

二叉树理论基础知识点

二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这…

About Oracle Database Performance Method

bottleneck(瓶颈): a point where resource contention is highest throughput(吞吐量): the amount of work that can be completed in a specified time. response time (响应时间): the time to complete a spec…

Java 日志简介

目录1、Slf4j2、Log4j3、LogBack4、Logback 优点5、ELK1、Slf4j slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则…

解决:eclipse绿化版Resource注解报Resource cannot be resolved to a type问题

如图: 网上解决教程很多,我的eclipse是绿化版的,不需要安装 解决办法如下: 1、在eclipse中,进入到Window->Preferences->Java->Installed JREs中 默认显示如下: 2、点击Add-->Standard VM--…

分页插件

引入依赖 注意需要和SpringBoot的版本对应&#xff0c;否则分页可能不生效 使用的分页依赖&#xff1a; <!-- pagehelper 插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</arti…

Dockerfile详解及优化技巧

写在前面 Dockerfile的默认相对路径是Dockerfile所在的目录&#xff1b;Dockerfile中的每一行会被视为一层镜像 一、Dockerfile 原理 1.1 镜像定义 首先我们先来回顾一下 Docker 镜像&#xff0c;它由多个只读层堆叠到一起&#xff0c;每一层是上一层的增量修改。基于镜像创…

深度学习炼丹-数据标准化

前言 一般机器学习任务其工作流程可总结为如下所示 pipeline。 在工业界,数据预处理步骤对模型精度的提高的发挥着重要作用。对于机器学习任务来说,广泛的数据预处理一般有四个阶段(视觉任务一般只需 Data Transformation): 数据清洗(Data Cleaning)、数据整合(Data Integ…

【c语言进阶】深度剖析整形数据

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

C++010-C++嵌套循环

文章目录C010-C嵌套循环嵌套循环嵌套循环举例题目描述 输出1的个数题目描述 输出n行99乘法表题目描述 求s1!2!...10!作业在线练习&#xff1a;总结C010-C嵌套循环 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 嵌套循环 循环可以指挥计算机重复去…

自命为缓存之王的Caffeine(6)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;之前用Caffeine替代Redis的时候&#xff0c;发现先保存KV&#xff0c;再获取key&#xff0c;过期时间为3秒。但即使过了3秒&#xff0c;还是能获取到保存的数据。…

网络爬虫简介

前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫&#xff08;英语&#xff1a;web crawler&#xff09;&#xff0c;也叫网路蜘蛛&#xff08;spider&#xff09;&#xff0c;是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…

Windows 环境下,cmake工程导入OpenCV库

目录 1、下载 OpenCV 库 2、配置环境变量 3、CmakeLists.txt 配置 1、下载 OpenCV 库 OpenCV官方下载地址&#xff1a;download | OpenCV 4.6.0 下载完毕后解压&#xff0c;便可以得到下面的文件 2、配置环境变量 我们需要添加两个环境变量&#xff0c;一个是 OpenCVConfi…

小红书达人选择,投放指南4注意!

为什么达人投放后反响平平&#xff0c;别的品牌为什么曝光这么高&#xff0c;我投放的钱是打水漂了吗&#xff1f;怎么能达到高曝光投放&#xff1f;今天就跟大家来聊聊如何让小红书达人投放达到高曝光&#xff1f;随着消费升级&#xff0c;在这场营销中&#xff0c;平台日渐爆…

数据结构与算法】链表2:节点交换与删除 链表相交 环形链表

文章目录今日任务1.Leetcode24&#xff1a;两两交换链表中的节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路&#xff08;3&#xff09;代码实现2.Leetcode19&#xff1a;删除链表的倒数第N个节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路…