caffe里的clip gradient是什么意思?

谁能简单介绍下?没设过这个东西
关注者
125
被浏览
26,227
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

第一次回答问题,有点紧张。。。

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里看到具体的实现代码。