美文网首页tensorflow
tensorflow clip介绍

tensorflow clip介绍

作者: Persistently | 来源:发表于2017-07-26 20:34 被阅读2357次

    tensorflow中主要有4种不同的clip方式:
    1.tf.clip_by_value
    2.tf.clip_by_norm
    3.tf.clip_by_global_norm
    4.tf.clip_by_average_norm


    1.tf.clip_by_value

    官方手册

    这个函数比较简单,将t的值clip在[clip_value_min,clip_value_max].

        if t>clip_value_max
             t = clip_value_max;
        if t <clip_value_min
             t = clip_value_min.
    

    2.tf.clip_by_norm

    官方手册
    l2-norm
    这个范数是最常用的。它的应用在科学和工程领域中随处可见。下面是其定义:
    l2-norm
    它也就是众所周知的欧几里得范数(Euclidean norm)。

    t 为要clip的tensor
    clip_norm:是一个最大的clip的数

        if   clip_norm >= l2_norm
               t = t
        else
               t = t*clip_norm/l2norm(t)
    

    axes = 1对每一个行做l2_norm的clip_norm
    axes = 0 就是对列做


    3.tf.clip_by_global_norm

    官方文档

    t_list 是梯度张量, clip_norm 是截取的比率, 这个函数返回截取过的梯度张量和一个所有张量的全局范数。

        t_list[i] * clip_norm / max(global_norm, clip_norm) 
        其中global_norm = sqrt(sum([l2norm(t)**2 for t in t_list])) 
    

    global_norm 是所有梯度的平方和,如果 clip_norm > global_norm ,就不进行截取。
    但是这个函数的速度比clip_by_norm() 要慢,因为在截取之前所有的参数都要准备好。

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

    具体的细节是
    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.


    4.tf.clip_by_average_norm

    官方文档

    这个感觉跟tf.clip_by_norm差不多,只是把将分母的l2_norm改成了l2norm_avg。

    相关文章

      网友评论

        本文标题:tensorflow clip介绍

        本文链接:https://www.haomeiwen.com/subject/pmwokxtx.html