前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow学习笔记之--[tf.clip_by_global_norm,tf.clip_by_value,tf.clip_by_norm等的区别]

TensorFlow学习笔记之--[tf.clip_by_global_norm,tf.clip_by_value,tf.clip_by_norm等的区别]

作者头像
marsggbo
发布2018-12-21 14:24:27
2.4K0
发布2018-12-21 14:24:27
举报
文章被收录于专栏:AutoML(自动机器学习)

以下这些函数可以用于解决梯度消失或梯度爆炸问题上。

1. tf.clip_by_value

代码语言:javascript
复制
tf.clip_by_value(
    t,
    clip_value_min,
    clip_value_max,
    name=None
)

Returns:A clipped Tensor.

输入一个张量t,把t中的每一个元素的值都压缩在clip_value_min和clip_value_max之间。小于min的让它等于min,大于max的元素的值等于max。

例子:

代码语言:javascript
复制
import tensorflow as tf;
import numpy as np;
 
A = np.array([[1,1,2,4], [3,4,8,5]])
 
with tf.Session() as sess:
    print sess.run(tf.clip_by_value(A, 2, 5))

>>>
[[2 2 2 4]
 [3 4 5 5]]

2. tf.clip_by_norm

代码语言:javascript
复制
tf.clip_by_norm(
    t,
    clip_norm,
    axes=None,
    name=None
)

Returns:A clipped Tensor.

指对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,是一种比较常用的梯度规约的方式。

  • t: 输入tensor,也可以是list
  • clip_norm: 一个具体的数,如果\(l_2 \, norm(t)≤clip\_norm\), 则t不变化;否则\(t=\frac{t*clip\_norm}{l_2norm(t)}\)

注意上面的t可以是list,所以最后做比较的时候是将t的二范式和clip_norm作比较。看下面的例子:

代码语言:javascript
复制
a = np.array([2.,5.])
b = tf.clip_by_norm(a, 5)
with tf.Session() as sess:
    print(sess.run(tf.norm(a)))
    print(sess.run(b))
    
>>>
5.3851647
[1.8569534 4.6423836]

3. tf.clip_by_average_norm

代码语言:javascript
复制
tf.clip_by_average_norm(
    t,
    clip_norm,
    name=None
)

Returns:A clipped Tensor.

其实和tf.clip_by_norm类似,只不过把\(l_2\,norm(t)\)改成了\(l_2\,norm_avg(t)=\frac{1}{n} \, l_2\,norm(t)\),\(n\)表示t的元素个数。

例子

代码语言:javascript
复制
a = np.array([3, 4]).astype('float32')
e = tf.clip_by_average_norm(a, 1)
with tf.Session() as sess:
    print(sess.run(e))

>>>
[1.2 1.6]

验证一下:\(\frac{3*1}{\frac{1}{2}\sqrt{3^2+4^2}}=\frac{3}{2.5}=1.2\)。

4. tf.clip_by_global_norm

代码语言:javascript
复制
tf.clip_by_global_norm(
    t_list,
    clip_norm,
    use_norm=None,
    name=None
)

Returns:

  • list_clipped: A list of Tensors of the same type as list_t.
  • global_norm: A 0-D (scalar) Tensor representing the global norm.

注意这里的t_list是a tuple or list of tensors。

global_norm计算公式如下:

\[global\_norm=\sqrt{\sum_i^n{l_2\,norm(t[i])^2}}\]

如果global_norm>clip_norm,则t_list中所有元素若如下计算:

\[t\_list[i]=\frac{t\_list[i]*clip\_norm}{max(global\_norm,clip\_norm)}\]

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. tf.clip_by_value
  • 2. tf.clip_by_norm
  • 3. tf.clip_by_average_norm
  • 4. tf.clip_by_global_norm
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档