深度学习训练中如何处理NaNs
NaNs问题(Dealing with NaNs)
相信很多自己实现过深度学习模型或者训练过深度学习模型的人都会知道,产生NaNs或者Infs是一件特别常见的事情。但是NaNs的问题又往往很棘手,因为出现NaN的原因可能有很多,诊断起来并不容易。
这可能是因为模型中某个地方设置的不是特别合理,或者代码中出现了Bug。也有可能是出现了数值不稳定,数值不稳定问题会进行单独说明。甚至也可能是你的算法出了问题,下面将介绍几种出现NaNs的场景以及如何进行诊断并处理模型训练过程中出现的NaNs。
超参数的设置以及权重初始化(Check Superparameters and Weight Initialization)
通常情况下,尤其是你使用深度学习库训练时,原因大多是超参数设置问题。
最可能是就你的学习率设置过大。一个过大的学习率可能在一个epoch里就让你整个模型产生NaN的输出,所以首先检查学习率,最简单的办法就是设置一个小的学习率。
其次,你的模型里有正则化项吗?看正则项是否设置合理,选择一个大的正则项系数来训练几个epoch看下NaNs有没有消失。
还有一些模型可能对权重的初始化十分敏感,如果权重没有采用合理的初始化方法,或者合适的初始化范围,模型可能会产生NaNs。
关于数值稳定(Numerical Stability)
如果你最终诊断发现是在某个公式计算时产生的NaNs,可能的原因就是这个公式存在数值稳定问题,通常发生在你自己实现的某个公式,例如Softmax,因为深度学习库通常会帮助解决公式中的数值稳定问题。
举个列子:一些nodes在某些输入下产生一个很小的p(x)。
在反向传播时,正确的类别所得到的概率非常小(接近零)的话,这里会有 overflow 的危险。
更加详细的数值稳定讲解参照这篇Blog: Softmax vs. Softmax-Loss: Numerical Stability
算法相关(Algorithm Related)
如果上述方法都不适用,那可能是你的算法出了问题,回头去检查数学公式的实现来确保所有的计算和推导是正确的。
Using Theano
Run in NanGuardMode, DebugMode, or MonitorMode
如果你使用Theano,你可以通过Theano的NanGuardMode来寻求帮助。NanGuardMode会监控每个结点所有的输入和输出,如果发现了NaNs就会报错。
具体用法参照: nanguardmode
使用 optimizer_including=alloc_empty_to_zeros
结合NanGuardMode对于检测NaN很有帮助,具体看下面 NaN Introduced by AllocEmpty的介绍。
DebugMode 也很有帮助。 通过flag mode=DebugMode,DebugMode.check_py=False
来运行debugmode。 这样可以看出那个运算造成了这个问题,进而深入地查看这个运算。
具体用法参照:debugmode
Theano 的 MonitorMode 可以用来单步调试function的执行,可以通过它来查看执行function时每个node的输入和输出。
详细用法参照:How do I Step through a Compiled Function?
NaN Introduced by AllocEmpty
很多运算用到AllocEmpty,例如没有适当地清理前分配内存,分配的内存随后会被重写。之前这块内存里的数据和运算有时会导致产生NaN。例如,在运算前使用乘法来使内存清零,当之前内存中是Nan时, 0 * NaN => NaN。
使用optimizer_including=alloc_empty_to_zeros
来代替AllocEmpty的Alloc{0},对诊断NaNs的出处很有帮助。需要注意的是NanGuardMode中,这个flag默认是不开启的,所以同时用NanGuardMode
和optimizer_including=alloc_empty_to_zeros
会比较好。
CUDA Specific Option
Theano的这个设置 nvcc.fastmath=True
可能产生NaN,所以在debugging NaN时不要设置这个参数。
http://deeplearning.net/software/theano/tutorial/nan_tutorial.html
http://zh.gluon.ai/chapter_supervised-learning/softmax-regression-scratch.html
深度学习训练中如何处理NaNs相关推荐
- 深度学习训练中关于数据处理方式--原始样本采集以及数据增广
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SMF0504/article/details/78695908 好久没有写博客,一直想重新调整自己的 ...
- Python 中的可执行对象 eval,exec 和 compile与其在深度学习训练中的应用实例
Python 中的可执行对象 eval,exec 和 compile 与其在深度学习训练中的应用实例 eval 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式(注意eval不支 ...
- 深度学习训练中为什么要将图片随机剪裁(Random Crop)
概述 这篇文章是用Markdown重写的以前发布的文章.图像分类中,深度学习训练时将图片随机剪裁(random crop)已经成为很普遍的数据扩充(data augmentation)方法,随机剪裁 ...
- 深度学习训练中噪声减小吗_【机器学习 155】DoubleEnsemble
更新:根据大家评论区和私信的反馈,我们把文章重新更新了一版在 arxiv 上.这次更新主要修改了方法部分的叙述和其他一些typos.欢迎大家围观- 相信关注我专栏的也有很多对于金融感兴趣的同学,这里给 ...
- <美团>深度学习训练中梯度消失的原因有哪些?有哪些解决方法?
梯度消失产生的主要原因有:一是使用了深层网络,二是采用了不合适的损失函数. (1)目前优化神经网络的方法都是基于BP,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化.其中将 ...
- 深度学习训练中GPU占用0%
在模型训练过程中,许多小伙伴会打开win10的任务管理器查看GPU的占用率,却发现一直是0%,下面来解决这个问题. 首先,将硬件加速GPU计划关闭. 重启之后,在任务管理器的GPU中,将3D切换为Cu ...
- 如何训练出优秀的深度学习模型-深度学习训练经验总结!
深度学习训练中的经验总结! 一些训练心得,欢迎补充. 1 优化器 优化器是很重要的一个环节,使用得当会发挥出意想不到的结果. 首先可尝试,Adam: 进一步可使用SGD,对优化器对参数较敏感,可修改的 ...
- 基于AI的计算机视觉识别在Java项目中的使用(三) —— 搭建基于Docker的深度学习训练环境
深度学习在哪里? 我们已然生活在数字时代,一天24小时我们被数字包围.我们生活中的方方面面都在使用数字来表达.传递.存储.我们无时无刻不在接收数字信息,而又无时无刻不在生产数字信息. 在数字世界中,可 ...
- 深度学习 训练吃显卡_深度学习训练如何更快些?GPU性能的I/O优化你试过吗?...
原本,有多少人已经准备好最新显卡,足够的硬盘空间,甚至请好年假,只为十天后去那个仰慕已久的赛博朋克世界里体验一番-- 结果他们又发了一张「黄色背景图」,告诉大家要跳票--再一次-- 好吧,你有了大量闲 ...
最新文章
- 【转】Docker —— 从入门到实践
- 《Python学习笔记》——南溪的python编程笔记
- 如何通过自动增加索引,实现数据库查询耗时降低50%
- static与线程安全 -摘自网络
- windows 常见环境变量(%AppData%、%TEMP%、%TMP%)
- 目录_计算机视觉中的数学方法
- python爬取新浪博客_Python爬虫爬取一篇韩寒新浪博客
- 一天搞懂机器学习PPT笔记-1
- 算法设计与分析 ——10-7课程总结
- 美团2020校招后台开发
- 以太网rxp rxn txp txn
- 书籍《阅读的方法》读后感
- 跑步耳机哪款好用,排行前五的运动耳机推荐
- 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
- 元素节点,属性节点,文本节点,文档节点,分别的意思
- 单例模式-DoubleCheck
- python适合女生吗-女生学数据分析好吗?数据分析适不适合女生学?
- vue项目中 使用百度地图 轨迹动画
- 深度学习调参:优化算法,优化器optimizer,学习率learning rate
- phpstorm配置phpunit组件