训练中Loss为Nan的原因,梯度消失或者爆炸的优化
向AI转型的程序员都关注了这个号????????????
机器学习AI算法工程 公众号:datayx
现象
如何确定是否出现梯度爆炸?
在训练过程中出现梯度爆炸会伴随一些细微的信号,如:
(1)模型无法从训练数据中获得更新;
(2)模型不稳定,导致更新过程中的损失出现显著变化;
(3)训练过程中,模型的损失变为Nan。
梯度消失与梯度爆炸原因
首先,来看神经网络更新梯度的原理,即反向传播算法。
详细推导参考
http://ufldl.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95
通过反向传播算法更新梯度的公式可以看到,影响梯度更新的有,初始权重、激活函数、梯度流动方式、损失值过大等。
下面分别来一一进行介绍:
(1)初始权重带来的影响:神经网络权重初始化不当;
(2)激活函数带来的影响:激活函数选择不当;
(3)梯度流动方式带来的影响:网络结构本身的问题,如RNN;
(4)损失值过大带来的影响:数据集的问题,如标注不准等。
下面,就来对这几种情况分别进行一一介绍。
神经网络权重初始化不当
当网络过深,如果连乘的因子大部分小于1,最后乘积可能趋于0;另一方面,如果连乘的因子大部分大于1,最后乘积可能趋于无穷。这就是所谓的梯度消失与梯度爆炸。
防止因权重初始化不当带来的梯度爆炸:
(1) 使用Xavier初始化法或者MSRA初始化法,使得在深度网络的每一层,激活值都有很好的分布。
(2) 使用预训练模型,初始化已有网络层的权重。
激活函数选择不当
神经网络常用的激活函数可参考:
https://blog.csdn.net/u013250416/article/details/80991831
如果选择sigmoid 或者 tanh 函数,由它们的曲线可以看出,当输入很大或者很小的时候,饱和的神经元会带来梯度消失。
防止因激活函数选择不当带来的梯度消失:
1.最常使用Relu,需要小心地调节学习速率(如果relu参数初始化不理想,前向计算结果为负值,则进行梯度计算的时候全部变为0,在反向计算的时候也会没有响应);
2.偶尔可考虑Relu的变种,如Leaky Relu;
3.一般不使用sigmoid
神经网络本身的结构问题,如RNN
RNN相当于把许多循环神经网络单元连接成一个序列。可以设想梯度流穿过,当我们要计算关于h0的损失函数的梯度时,反向传播需要经过RNN中的每一个单元。每次反向传播经过一个单元时,都要使用其中某一个W的转置。
这意味着最终的表达式对h0梯度的表达式将会包含很多很多权重矩阵因子,这样不断对同一个值做乘法,是非常糟糕的。
在标量情况下,要么当这个值的绝对值大于1时,发生梯度爆炸;要么当这个值的绝对值小于1时,发生梯度消失,直到为0。既不发生梯度爆炸也不发生梯度消失,也就是当这个值正好为1。
对于矩阵而言,需要关注矩阵的最大奇异值,如果最大奇异值大于1,会发生梯度爆炸;如果最大奇异值小于1,会发生梯度消失。
防止因使用循环神经网络RNN带来的梯度消失与梯度爆炸问题:
1.设置梯度剪切阈值(gradient clipping threshold),一旦梯度超过该值,直接设置为该值;
2.使用沿时间的截断反向传导方法。
https://blog.csdn.net/u013250416/article/details/81276671
2.使用更加复杂的RNN结构,例如LSTM。
LSTM能尽量避免梯度爆炸或者梯度消失的原因有两个:
1.这里的遗忘门是矩阵元素相乘,而不是矩阵相乘。
2.矩阵元素相乘,可能会在不同的时间点乘以一个不同的遗忘门。
3.遗忘门是一个sigmoid函数,所以矩阵元素相乘的结果,会保证在(0,1)之间。
4.从最后的隐藏单元状态,反向传播到第一个单元状态,在反向传播的路径上,我们只通过一个单一的非线性tanh向后传播,而不是在每一个时间步长中单独设置tanh函数。
数据集本身问题
数据集本身可能标注不准确,引入大量噪声。以图片数据集为例,具体情况可能包括:
1.在目标检测中,四边形标注框与实际不匹配,标注框的面积过多大于实际目标的面积;
2.在使用mask rcnn检测目标时,只用四点标注的bounding boxes来生成mask,可能会导致生成的mask不够准确。如果偏差过大,也会引入梯度爆炸;
3.在场景文字检测中,为了套用已有的检测水平方向物体的目标检测框架,将原有的任意四边形标注框转换为其水平方向的最小外接矩形,也会导致标注框的面积过多大于实际目标的面积;
4.在场景文字识别中,对于一张完整的图片,一般是根据坐标对单词区域进行裁剪,再将所有的单词区域缩放成相同的大小。一是单词区域裁剪不准确,二是如果缩放尺寸没有选择好,较小的图片放大成过大的尺寸,会使得训练图片非常模糊,引入大量噪声。
对于数据集本身的问题,带来的梯度爆炸问题,一般需要注意,尽量使得标注准确,除非是进行难样本挖掘操作,一般尽量使用清晰的图片。
深度学习网络训练中出现loss函数为nan的原因
1. 学习率太大,步子迈的太大导致梯度爆炸等都是有可能的。
2. 网络结构不合理,导致的Non
1. 增加或者减少网络的深度
2. 增加网络的宽度
3. 不当的损失函数
4. relu和softmax两层不要连着用,最好将relu改成tanh,也算一个技巧。
3. 数据处理的不合理,导致的Non
1. batch size 选择过小
2. 检查 参数初始化
3. 数据本身,是否存在Nan,可以用numpy.any(numpy.isnan(x))检查一下input和target
4. 在训练的时候,整个网络随机初始化,很容易出现Nan,这时候需要把学习率调小,可以尝试0.1,0.01,0.001,直到不出现Nan为止,如果一直都有,那可能是网络实现问题。学习率和网络的层数一般成反比,层数越多,学习率通常要减小。有时候可以先用较小的学习率训练5000或以上次迭代,得到参数输出,手动kill掉训练,用前面的参数fine tune,这时候可以加大学习率,能更快收敛哦
阅读过本文的人还看了以下文章:
【全套视频课】最全的目标检测算法系列讲解,通俗易懂!
《美团机器学习实践》_美团算法团队.pdf
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
python就业班学习视频,从入门到实战项目
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
《深度学习之pytorch》pdf+附书源码
PyTorch深度学习快速实战入门《pytorch-handbook》
【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》
《Python数据分析与挖掘实战》PDF+完整源码
汽车行业完整知识图谱项目实战视频(全23课)
李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材
笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!
《神经网络与深度学习》最新2018版中英PDF+源码
将机器学习模型部署为REST API
FashionAI服装属性标签图像识别Top1-5方案分享
重要开源!CNN-RNN-CTC 实现手写汉字识别
yolo3 检测出图像中的不规则汉字
同样是机器学习算法工程师,你的面试为什么过不了?
前海征信大数据算法:风险概率预测
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
VGG16迁移学习,实现医学图像识别分类工程项目
特征工程(一)
特征工程(二) :文本数据的展开、过滤和分块
特征工程(三):特征缩放,从词袋到 TF-IDF
特征工程(四): 类别特征
特征工程(五): PCA 降维
特征工程(六): 非线性特征提取和模型堆叠
特征工程(七):图像特征提取和深度学习
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
蚂蚁金服2018秋招-算法工程师(共四面)通过
全球AI挑战-场景分类的比赛源码(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在线识别手写中文网站
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
长按图片,识别二维码,点关注
训练中Loss为Nan的原因,梯度消失或者爆炸的优化相关推荐
- 使用caffe训练时Loss变为nan的原因
极视角高校计算机视觉算法邀请赛目前正在报名中,欢迎各高校在读学生报名参加,大奖+商业项目参与机会+数据库等你来拿!!!咨询报名请加小助手(微信号:Extreme-Vision) 本文为极市平台原创编译 ...
- pytorch训练过程中loss出现NaN的原因及可采取的方法
在pytorch训练过程中出现loss=nan的情况 1.学习率太高. 2.loss函数 3.对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决 4.数据本身,是否存在Nan,可以用n ...
- matlab损失函数出现nan,[译]在训练过程中loss出现NaN的原因以及可以采取的方法。...
1.梯度爆炸 原因:在学习过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹. 症状:观察输出日志(runtime log)中每次迭代的loss值,你会发现loss随着迭代有明显的增长,最后因为l ...
- 训练网络loss出现Nan的原因总结记录
1. 学习率过大 2. 数据发生了损坏
- 反向传播算法推导、激活函数、梯度消失与爆炸
目录 反向传播算法 定义 推导过程 激活函数 定义 性质 常用的激活函数 Sigmoid Tanh ReLU softmax 梯度消失与梯度爆炸 起因 出现的原因 表现 解决方案 参考文档 反向传播算 ...
- 网络nan的原因_训练网络loss出现Nan解决办法
训练网络loss出现Nan解决办法 一.原因 一般来说,出现NaN有以下几种情况: 1.如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率.可以不断降低学习率直 ...
- 梯度消失和梯度爆炸_梯度消失、爆炸的原因及解决办法
一.引入:梯度更新规则 目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,更新优化深度网络的权值.这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来 ...
- RNN梯度消失和爆炸的原因 以及 LSTM如何解决梯度消失问题
RNN梯度消失和爆炸的原因 经典的RNN结构如下图所示: 假设我们的时间序列只有三段, 为给定值,神经元没有激活函数,则RNN最简单的前向传播过程如下: 假设在t=3时刻,损失函数为 . 则对于一 ...
- ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...
引言:参加了一家公司的面试和另一家公司的笔试,都问到了这个题!看来很有必要好好准备一下,自己动手推了公式,果然理解更深入了!持续准备面试中... 一. 概述: 想要真正了解梯度爆炸和消失问题,必须手推 ...
最新文章
- Permission denied: user=root, access=WRITE, inode=/:hadoopuser:supergroup:drwxr-xr-x
- python笔记 xpinyin
- 2021-11-05 虚拟机centos7更改root与home分区大小
- 拦截锚点修改url_前端系列课程(2)-网络基础概念(URL)
- unity3d Vector3.Lerp解析
- 目标检测论文阅读:Cascade R-CNN: Delving into High Quality Object Detection(CVPR2018)
- Mac下安装MySQL
- MySql 学习笔记-Mysql架构介绍与查询sql执行流程
- hql与sql的区别(转)
- 拓端tecdat|卡尔曼滤波器:用R语言中的KFAS建模时间序列
- 电子设计从零开始(第2版)pdf
- 【Python】爬取TapTap原神评论并生成词云分析
- 手游营销的10个靠谱方向
- python瓦登尔湖词频统计
- Java项目:图书馆管理系统思路分析
- ios label内字体置顶_IOS_Vertically align UILabel文本置顶 | 学步园
- 文明5 java 英_文明5模组“Future Worlds”(未来世界)中英版补丁
- iphoneX布局适配及iOS 11.0系统适配
- 关于ligerui grid分页checkbox绑定问题
- pytorch:交叉熵(cross entropy)
热门文章
- java:Map借口及其子类HashMap五,identityHashMap子类
- Burp Suite
- 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)
- 谈谈我自己为什么突然想写技术博客
- 计算机会计技术特点,会计电算化的特点
- C++简易复数类的实现
- elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..
- Git1天打卡 day13-查看仓库文件改动状态
- c语言调整图片分辨率,如何不改变图片分辨率,并且缩小图片质量-电脑自学网...
- 技术提升为管理,最重要的能力是什么?