解决 “梯度爆炸” 的方法 - 梯度裁剪
梯度裁剪
- 一、什么是梯度爆炸
- 二、梯度裁剪
- 三、如何选择超参数c
- 四、框架中的实现
梯度裁剪是解决梯度爆炸的一种简单高效的方法,并且梯度裁剪可以应用于所有神经网络的训练中(任何可能发生梯度爆炸的训练过程都适用)。
一、什么是梯度爆炸
梯度爆炸是指在模型训练过程中梯度会变得太大而使得模型不稳定的问题,其阻止了神经网络参数的更新,以至于不能从训练数据中得到稳定的模型。
通过bp训练一个RNN时,意味着我们通过在每个时间段(每一步)都复制一份网络来展开RNN网络,并将展开后的网络视为一个多层前馈神经网络,显然层数与时间步数相同。然后考虑到权重共享,我们在展开的网络上进行bp:
这里的W指递归(循环?)的的权重矩阵。可以看出损失函数的梯度由 WT 的 n 个拷贝相乘构成,n指时间步数即该前馈神经网络的层数,而矩阵的多次相乘正是导致梯度爆炸的罪魁祸首。
举一个简单的例子, a ≠ 1 时 an 指数变化。例如 n=30,则有 1. 1 n ≈ 17.45 以及 0. 9 n ≈ 0.042 【这里取 n 为 30 是考虑了实际情况:在NLP(自然语言处理)中,一个包含30个字词的句子是十分常见的,此外在许多分析中取30天的数据也十分常见】。这个例子与 (WT)n的情形是类似的——最容易理解的方式是考虑 W T 是可对角化的,则将其对角化后做幂运算可以清晰看出与上述例子的一致性(也就是W T将成指数级增大或减小)。
二、梯度裁剪
我们可以采取一个简单的策略来避免梯度的爆炸,那就是梯度截断Clip, 将梯度约束在某一个区间之内,在训练的过程中,在优化器更新之前进行梯度截断操作。
梯度裁剪是解决梯度爆炸的一种技术,其出发点是非常简明的:如果梯度变得非常大,那么我们就调节它使其保持较小的状态。精确的说,如果 ∥ g ∥ ≥ c,则
g←c⋅g/∥g∥
此处的c指超参数, g 指梯度, ∥ g ∥ 为梯度的范数, g / ∥ g ∥ 必然是个单位矢量,因此在进行调节后新的梯度范数必然等于c,注意到如果 ∥ g ∥ ≤ c 则不需要进行调节。
梯度裁剪确保了梯度矢量的最大范数(本文中规定为c)。即使在模型的损失函数不规则时,这一技巧也有助于梯度下降保持合理的行为。下面的图片展示了损失函数的陡崖。不采用裁剪,参数将会沿着梯度下降方向剧烈变化,导致其离开了最小值范围;而使用裁剪后参数变化将被限制在一个合理范围内,避免了上面的情况。
三、如何选择超参数c
我们可以先进行数轮迭代,然后查看梯度范数的统计数据,以统计数据的均值作为c值的初始值是较为合理的初步尝试。
四、框架中的实现
- PyTorch : torch.nn.utils.clip_grad_norm_
pytorch梯度裁剪示例:
#计算loss结果(已经对mini-batch数量取了平均值)
loss = criterion(output,y)
#将模型中参数的梯度设为0
model.zero_grad()
#反向传播,计算当前梯度
loss.backward()for p in model.parameters():#打印每个梯度的模print(p.grad.norm())
#将梯度的模clip到小于10的范围
torch.nn.utils.clip_grad_norm(p,10)
#利用裁剪后的梯度,使用优化器进行参数更新
optimizer.step()
解决 “梯度爆炸” 的方法 - 梯度裁剪相关推荐
- 解决梯度裁剪和梯度爆炸的方法及原理
1 梯度爆炸和梯度消失产生的原因 前向传播产生loss: y为真实标签 反向传播: 以上述简单网络中为例,梯度爆炸的现象为靠近输入层的权重更新幅度较大,产生的原因为后面层的权重初始化时初始值过大,由于 ...
- 梯度消失和梯度爆炸_出现梯度消失与梯度爆炸的原因以及解决方案
在学习李宏毅老师机器学习的相关视频时,课下做了一个有关神经网络的小Demo,但是运行效果总是不尽人意,上网查询资料,才发现是梯度爆炸和梯度消失惹的祸.今天就让我们一起来学习一下梯度消失与梯度爆炸的概念 ...
- [CNN-grad]1. 梯度爆炸实操|梯度消失|模型坍塌初识
1. 神经网络梯度爆炸实操 在深度学习中,网络常见的问题有两种,一个是梯度消失(也称梯度弥散),另一个是梯度爆炸,其实还有一个就是模型坍塌(这个模型坍塌在网络设计的较为合理的前提下,会在生成模型GAN ...
- pytorch 梯度爆炸调试方法
调试模式下运行代码,并按以下代码设置torch配置, torch.autograd.set_detect_anomaly(True)with torch.autograd.detect_anomaly ...
- 梯度消失和梯度爆炸问题及其解决方法详解
梯度不稳定概念和解决方法 梯度消失和梯度爆炸问题 概念 原理详解 解决方法 更改激活函数(Relu.Leaky-Relu.P-Relu等) 权重初始化 加入BN层(Batch Normalizatio ...
- 什么是梯度消失和梯度爆炸及如何解决
原因 梯度消失 (Vanishing Gradients) 在梯度下降中, 随着算法反向的反馈, 梯度会越来越小,最终没有变化,此时并没有收敛到比好的解,这就是梯度消失的问题. 梯度爆炸 梯度爆炸原理 ...
- 梯度爆炸与梯度消失是什么?有什么影响?如何解决?
文章目录 一.梯度爆炸 1.什么是梯度爆炸? 2.有何影响? 二.梯度消失 1.定义 2.有何影响? 三.共同点 1.产生原因 2.解决办法 a. 方案1-预训练加微调 b. 方案2-梯度剪切.正则化 ...
- 如何解决梯度消失和梯度爆炸?
何为梯度消失,梯度爆炸? 目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化.这样做是有一定原因的,首先,深层网络由许多非线性层堆 ...
- 神经网络梯度消失和梯度爆炸及解决办法
关注微信公众号[Microstrong],我现在研究方向是机器学习.深度学习,分享我在学习过程中的读书笔记!一起来学习,一起来交流,一起来进步吧! 本文同步更新在我的微信公众号中,公众号文章地址:ht ...
最新文章
- access 查找工龄大于30_同济大学大学计算机access作业答案
- Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://sch
- CentOS Squid
- oracle 判断是否位汉字,js判断字符是否是汉字的两种方法小结
- 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
- 一步一步学Linq to sql(八):继承与关系
- spring框架实现实例化和依赖注入的方式分别是什么_助力金三银四—— spring相关基础及面试题(附spring100问)...
- Excel Rendering Limitations
- 根据两点经纬度计算距离和角度——java实现
- CGLIB 动态代理使用
- Linux系统下安装flash player插件
- 基于SSM和layUI的汽车租赁系统设计
- 2022-2028年中国奶茶店行业竞争策略研究及未来前景展望报告
- astc软解性能测试 - adxe引擎项目
- 小白学习爬虫的第三天之数据解析bs4与pyQuery的使用
- Android Google登录接入
- win10pe系统计算机名修改,win10系统账户用户名如何修改
- [原创] 鼠绘美女全攻略
- UE5 官方案例Lyra 全特性详解 7.资源管理
- Probabilistic Volumetric Fusion for Dense Monocular SLAM
热门文章
- GameFi 年度报告: 2022 年发生了什么,行业将走向何方?
- ACP入门篇-阿里云大数据平台经典架构
- PHP 冒泡排序
- [问题解决] NameError: name ‘get_ipython‘ is not defined
- 模拟redis位图操作bitmap 统计日活跃用户数
- 走近中国的Oracle (转)
- 简单的邮政编码范围测试仪
- iOS巅峰之已经上架App在appStore上搜索不到的解决方案
- 程序员的快乐-用python爬取彼岸网美女图片
- mysql gtid 复制_MySQL 使用GTID进行复制