算法步骤如下。

  • 首先设置一个梯度阈值:clip_gradient
  • 在后向传播中求出各参数的梯度,这里我们不直接使用梯度进去参数更新,我们求这些梯度的l2范数
  • 然后比较梯度的l2范数||g||与clip_gradient的大小
  • 如果前者大,求缩放因子clip_gradient/||g||, 由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围
  • 最后将梯度乘上缩放因子便得到最后所需的梯度

作者:Gein Chen

链接:https://www.zhihu.com/question/29873016/answer/77647103
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

clip_gradient 的引入是为了处理gradient explosion的问题。当在一次迭代中权重的更新过于迅猛的话,很容易导致loss divergence。clip_gradient 的直观作用就是让权重的更新限制在一个合适的范围。

具体的细节是,
1.在solver中先设置一个clip_gradient
2.在前向传播与反向传播之后,我们会得到每个权重的梯度diff,这时不像通常那样直接使用这些梯度进行权重更新,而是先求所有权重梯度的平方和sumsq_diff,如果sumsq_diff > clip_gradient,则求缩放因子scale_factor = clip_gradient / sumsq_diff。这个scale_factor在(0,1)之间。如果权重梯度的平方和sumsq_diff越大,那缩放因子将越小。
3.最后将所有的权重梯度乘以这个缩放因子,这时得到的梯度才是最后的梯度信息。

这样就保证了在一次迭代更新中,所有权重的梯度的平方和在一个设定范围以内,这个范围就是clip_gradient.

最后补充一点,这个参数多用于LSTM中,而我这个回答是基于jeffdonahue 在caffe Pull的RNN 代码,你可以在 jeffdonahue/caffe at recurrent · GitHub 中的src/caffe/solver.cpp里看到具体的实现代码。

作者:圣行
链接:https://www.zhihu.com/question/29873016/answer/48682130
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

SolverParameter中的clip_gradients,设置为一个大于0的值,作为一个阈值,在计算当前梯度的时候,如果该值超过了该阈值,则将梯度直接设置为该阈值。
增加这个设计的原因,应该是源于这个回答(Handle divergence/NaNs gracefully · Issue #1349 · BVLC/caffe · GitHub):
I'm encountering a problem I never had before. So usually the loss either diverge soon and generate NaNs or start converging and never diverges again. However, recently in some experiments I'm encountering the problem that the loss start converging, and after a while 45K iterations diverges.
We need to do something about this, in addition to stop, maybe we could log what caused the NaN to appear.
Also maybe adding gradient clipping could help, **** could you do a PR with the gradient clipping?

作者:Weijie Huang
链接:https://www.zhihu.com/question/29873016/answer/106125794
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://arxiv.org/abs/1211.5063
On the difficulty of training Recurrent Neural Networks
这篇文章最早提出了Gradient clipping这个优化,用于解决exploding gradients 问题.
-----
把关联的问题也回答了吧

##Vanishing Gradients是什么,如何解决这个问题
###如果一个神经网络有超过1层比如4层的话,bp算法会使得四层学习的速度逐步递减,layer4>layer3>layer2>layer1,这意味着在前面的隐藏层中的神经元学习速度要慢于后面的隐藏层.
###BP的本质是对神经元的输出z进行纠正,通过对他求梯度作一个反方向的偏移,这里假设我们Layer1的b要进行反向传播更新权值,那么可以得出公式:"http://neuralnetworksanddeeplearning.com/images/tikz38.png", 这样可以观察到这个等式传播的时候有两个关键点,一个是w权值,一个是sigmoid'(z).sigmoid'(z)是一个max=0.25的正态分布图,所以随着Layers越多显然这个学习的速度就会至少降低75%,所以会产生这个Vanishing Gradients问题.同理,如果这个w权值非常大的话,那么理论上整个乘积也会放大,但是sigmoid'函数里面的z是等于(wx + b),这个数值越大则sigmoid'越靠两边其实数值越小,所以其实最后的学习率通常来讲都是越来越小的.

##Exploding gradient是什么,如何解决这个问题
###梯度爆炸就是当上面的w控制在一个非常大的值,同时sigmoid'也非常大,两个的乘积都大于1的时候,就有了梯度爆炸的问题.

###解决方法:通过对w进行pre-trained可以通过更改w权值来解决Vanishing Gradients,或者更改激活函数从sigmoid换成ReLU,这样ReLU是1/0函数,不会使得传播的时候持续缩小了

###解决方法:gradient clipping解决了Exploding gradient问题,把每次更新的gradient压缩在clip范围内,就不会无限制的连乘导致偏离了.

https://cs224d.stanford.edu/lecture_notes/LectureNotes4.pdf
[译] 第五章 深度神经网络为何很难训练

##是因为BP训练才产生Exploding gradient和Vanishing Gradients的问题吗
### 应该是的,因为BP训练的过程才得到了上面的等式,才有了这么一系列推论.

Neural networks and deep learning

修改了好几次这个答案,有错误还请指正

clip gradient相关推荐

  1. 深度学习实战 Tricks —— 梯度消失与梯度爆炸(gradient exploding)

    梯度爆炸:梯度过大会使得损失函数很难收敛,甚至导致梯度为 NaN,异常退出: 解决方案:gradient cliping 梯度消失:较前的层次很难对较后的层次产生影响,梯度更新失效: 解决方案:对于 ...

  2. 使用RNN神经网络自动生成名字 (不使用深度学习框架,源码)

    本文讲解在不使用深度学习框架的情况下,构建一个基本的RNN神经网络来进行名字自动生成.RNN模型请看下面的三张图片.本文主要讲解数据集以及输入模型的数据格式. 数据集和可执行的源码下载地址:https ...

  3. 深度学习在美团配送ETA预估中的探索与实践

    1.背景 ETA(Estimated Time of Arrival,"预计送达时间"),即用户下单后,配送人员在多长时间内将外卖送达到用户手中.送达时间预测的结果,将会以&quo ...

  4. 训练深度学习网络时候,出现Nan是什么原因,怎么才能避免?——我自己是因为data有nan的坏数据,clear下解决...

    from:https://www.zhihu.com/question/49346370 Harick 梯度爆炸了吧. 我的解决办法一般以下几条: 1.数据归一化(减均值,除方差,或者加入normal ...

  5. 使用caffe训练时Loss变为nan的原因

    极视角高校计算机视觉算法邀请赛目前正在报名中,欢迎各高校在读学生报名参加,大奖+商业项目参与机会+数据库等你来拿!!!咨询报名请加小助手(微信号:Extreme-Vision) 本文为极市平台原创编译 ...

  6. caffe loss一直nan什么情况

    1.  http://blog.csdn.net/kuaitoukid/article/details/42120961 2. http://blog.csdn.net/huangynn/arti ...

  7. 17.深度学习练习:Character level language model - Dinosaurus land

    本文节选自吴恩达老师<深度学习专项课程>编程作业,在此表示感谢. 课程链接:https://www.deeplearning.ai/deep-learning-specialization ...

  8. 05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)

    文章目录 作业1:建立你的循环神经网络 1. RNN 前向传播 1.1 RNN 单元 1.2 RNN 前向传播 2. LSTM 网络 2.1 LSTM 单元 2.2 LSTM 前向传播 3. RNN ...

  9. 深度学习在美团配送ETA预估中的探索与实践 1

    1.背景 ETA(Estimated Time of Arrival,"预计送达时间"),即用户下单后,配送人员在多长时间内将外卖送达到用户手中.送达时间预测的结果,将会以&quo ...

  10. (pytorch-深度学习)循环神经网络的从零开始实现

    循环神经网络的从零开始实现 首先,我们读取周杰伦专辑歌词数据集: import time import math import numpy as np import torch from torch ...

最新文章

  1. Ubuntu iso镜像文件写入U盘
  2. 网络爬虫:采用“负载均衡”策略来优化网络爬虫
  3. MySQL数据库的终结_MySQL数据库秘籍终结 对不起了 让你们自宫了 其实不消哈哈哈...
  4. 软件测试作业5:计算下列代码片段的 Halstead 复杂度的11项内容
  5. HDU4907小技巧
  6. java设计一个顺序表类的成员函数,用java编写一个逐个输出顺序表中所有数据元素的成员函数...
  7. linux 使用ssh-keygen生成ssh公钥和私钥
  8. spring集成web
  9. python指定目录_python生成指定文件夹目录树
  10. 14. 随需应变:网站的可扩展架构
  11. git 各种撤销操作办法
  12. kitti数据集 Raw Data与00-10 Ground Truth的对应关系
  13. 百度智能云文字转语音
  14. FFmpeg视频截取第一帧
  15. 应用程序无法正常启动0xc000007b win7
  16. 如何高效处理面板数据
  17. IOS 自带地图开发
  18. 深入理解Mysql事务ACID特性以及事务隔离级别
  19. 基于Java的物资租赁管理系统 MYSQL
  20. windwos设置GifCam录屏全局快捷键

热门文章

  1. JavaScript之E-mail 地址格式验证
  2. 小学生必积累的名人名言汇总100条
  3. 影响世界的100条管理励志名言
  4. 第1周练习 货币转换 I
  5. 手机网络通过USB共享给台式机电脑
  6. Python 利用win32com批量给excel加密
  7. js页面打印去掉页眉页脚
  8. Madoko - Markdown 在线编辑器
  9. 全国短消息服务中心号码
  10. ES拼音中文智能提示suggest