梯度爆炸与梯度消失
时间:2021-08-16
本文章向大家介绍梯度爆炸与梯度消失,主要包括梯度爆炸与梯度消失使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0 概述
在神经网络模型中,如果网络的层数很多,则可能会出现梯度爆炸或者梯度消失问题。顾名思义,梯度爆炸意思是梯度太大了,可能会超出计算机可表示的数值范围;梯度消失意思是梯度太小了。
1 梯度爆炸
1.1 梯度爆炸的成因
以多层感知机为例,第t层的输出为:
\[f_{t}(h^{t-1})=\sigma(W^{t}h^{t-1})
\]
第t层对t-1层的导数为:
\[\frac{\partial h^{t}}{\partial h^{t-1}}=diag(\sigma ^{'}(W^{t}h^{t-1}))((W^{t})^{T}
\]
\[\prod_{i=t}^{d-1}\frac{\partial h^{i+1}}{\partial h^{i}}=\prod_{i=t}^{d-1}diag(\sigma ^{'}(W^{i}h^{i-1}))(W^{i})^{T}
\]
假设使用Relu激活函数:
\[\sigma (x)=max(0,x)
\]
\[\sigma ^{'}=\left\{\begin{matrix}
1\quad if\quad x>0\\
0\quad otherwise
\end{matrix}\right.\]
\(\prod_{i-t}^{d-1}\frac{\partial h^{i+1}}{\partial h^{i}}=\prod_{i=t}^{d-1}diag(\sigma ^{'}(W^{i}h^{i-1}))(W^{i})^{T}\)的一些元素会来自\(\prod_{i=t}^{d-1}(W^{i})^{T}\)。如果层数很多就会导致梯度爆炸。
1.2 梯度爆炸的危害
- 值超出计算机标识范围
- 对学习率敏感:如果学习率太大,则参数会更新很大,这样就导致更大的梯度;如果学习率太小,则训练无进展
2 梯度消失
2.1 梯度消失的成因
如果使用sigmoid作为激活函数:
\[\sigma (x)=\frac{1}{1+e^{-x}}
\]
\[\sigma ^{'}(x)=\sigma (x)(1-\sigma(x))
\]
sigmoid函数的导数在任何点都是小于1的,如果网络层数很多,则会导致很多小于1的数连乘。
2.2 梯度消失的危害
- 梯度值变成0
- 训练没有进展
- 对底部层尤为严重
3 缓解方法
3.1 将乘法变加法
3.2 梯度归一化、梯度裁剪
梯度归一化就是将梯度强行归一化到一定范围内,梯度裁剪就是将大于某个阈值的梯度强行变为某个阈值。
3.3 合理的权重初始化和激活函数
原文地址:https://www.cnblogs.com/foghorn/p/15089760.html
- 新装/重装git后的指令&链接到github
- 【译】ASP.NET MVC 6路由技术
- 从原理到实践:Oracle 12.2 Sharding技术揭秘
- Xamarin-C#开发移动App-环境搭建
- Tensorflow快速入门
- .NET Core 实战笔记1-介绍和安装
- 全面直观认识深度神经网络
- dedecms清空所有文章怎么操作?sql语句如何写?
- .NET Core 实战笔记2-从命令开始
- 【译】使用Docker Compose一条指令配置Mesos
- 【译】Windows下的Docker Machine - 如何设置你的Docker主机
- 史上最透彻的KMP算法讲解
- 【译】助你成功搭建云应用的12条方法
- 你能用微信小程序打开小程序了【附开发方法】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下升级python和安装pip的详解
- Linux中使用top命令的技巧
- Linux中查找工具的友好替代方案
- 使用命令行检测Ubuntu版本方法
- 一键实现 PowerBI 度量值批量重命名
- Ubuntu E: 无法获得锁 /var/lib/dpkg/lock-frontend – open (11: 资源暂时不可用)
- Ubuntu 18.04 安装MySQL时未提示输入密码的问题及解决方法
- ubuntu中修改grub的启动时间生成
- linux7下虚拟主机的三种实现方式
- 详解CentOS7下PostgreSQL 11的安装和配置教程
- CentOS下安装Memcached和PHP Memcached扩展
- Mac中文件权限查看和设置详解
- linux下open-vswitch安装卸载操作
- CentOS7安装GUI界面及远程连接的实现
- Centos7.4环境安装lamp-php7.0教程