当前位置: 首页 > 工具软件 > Sym > 使用案例 >

mxnet:mx.sym.BlockGrad理解

施轶
2023-12-01

 

解释:

我们知道现在深度学习的框架是计算图,由节点和路径组成。在前向和反向的时候都是通过图路径传递的,那么这个函数是用在反向传播的时候,字面意思就是阻塞梯度传播。

举例:

输入两个点,输出一个点,如下图所示:

正常反向传播


公式就是:y=3*a+4*b

在正常的反向传播的时候,a的偏导就是3,b的偏导为4(假设都是标量的情况下)。

代码测试:

 import mxnet as mx
 import numpy as np 
 v1=np.array([[1,2]])
 v2=np.array([[0,1]])
 a=mx.sym.Variable('a')
 b=mx.sym.Variable('b')
 b_stop_grad=4*b
 a_stop_grad=3*a
 loss=mx.sym.MakeLoss(b_stop_grad+a_stop)
 executor=loss.simple_bind(ctx=mx.cpu(),a=(1,2),b=(1,2))
 executor.forward(is_train=True,a=v1,b=v2)
 executor.backward()
 print(executor.grad_arrays)
 
 
结果输出:

2.阻塞传播

我们有时候需要阻塞一个op(操作)的反向,那么就需要利用BlockGrad函数。

例如,我们阻塞上图中的v4节点,简单来说就是反向传播的时候,y->v5->v4->input此路不通了,也就没有相应的梯度值了。

那么此时的结果应该是:

a的偏导为3,b的偏导为0。

代码测试:

    v1=np.array([[1,2]])
    v2=np.array([[0,1]])
    a=mx.sym.Variable('a')
    b=mx.sym.Variable('b')
    b_stop_grad=4*b
    b_stop_grad=mx.sym.BlockGrad(b_stop_grad)
    a_stop=3*a
    loss=mx.sym.MakeLoss(b_stop_grad+a_stop)
    executor=loss.simple_bind(ctx=mx.cpu(),a=(1,2),b=(1,2))
    executor.forward(is_train=True,a=v1,b=v2)
    executor.backward()
    print(executor.grad_arrays)
结果:

3.结论

这个函数暂时还没有在实际的情况下用到,看到一些博客说在预测的时候需要用到。等我真正用到的时候再来更新。
————————————————
版权声明:本文为CSDN博主「zxbinggo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zc199329/article/details/82178711

 类似资料: