解释:
我们知道现在深度学习的框架是计算图,由节点和路径组成。在前向和反向的时候都是通过图路径传递的,那么这个函数是用在反向传播的时候,字面意思就是阻塞梯度传播。
举例:
输入两个点,输出一个点,如下图所示:
正常反向传播
公式就是: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