美文网首页
tensorflow tf.clip_by_global_nor

tensorflow tf.clip_by_global_nor

作者: 脏脏包盛 | 来源:发表于2019-03-26 15:39 被阅读0次

    参考:https://blog.csdn.net/u013713117/article/details/56281715

    tf.gradients

    tf.gradients(
        ys,
        xs,
        grad_ys=None,
        name='gradients',
        colocate_gradients_with_ops=False,
        gate_gradients=False,
        aggregation_method=None,
        stop_gradients=None,
        unconnected_gradients=tf.UnconnectedGradients.NONE
    )
    

    ys 和xs每一个都是张量或者是张量列表
    gradients()将ops添加到图形中以输出ys相对于的导数xs。它返回一个长度为len(xs)的Tensor长度列表,其中每个张量都是sum(dy/dx) for y in ys。

    意思是:
    tf.gradients()实现ys对xs求导
    求导返回值是一个list,list的长度等于len(xs)
    假设返回值是[grad1, grad2, grad3],ys=[y1, y2],xs=[x1, x2, x3]。则,真实的计算过程为:
    1.grad1=dy1/dx1+dy2/dx1
    2.grad2=dy1/dx2+dy2/x2
    3.grad3=dy1/dx3+dy2/dx3

    tf.clip_by_global_norm

    tf.clip_by_global_norm(
        t_list,
        clip_norm,
        use_norm=None,
        name=None
    )
    

    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.

    t_list[i] * clip_norm / max(global_norm, clip_norm)
    

    其中

    global_norm = sqrt(sum([l2norm(t)**2 for t in t_list]))
    

    global_norm 是所有梯度的平方和

    相关文章

      网友评论

          本文标题:tensorflow tf.clip_by_global_nor

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