mxnet:mx.sym.BlockGrad理解

解释:

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

举例:

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

  1. 正常反向传播

公式就是: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.结论

这个函数暂时还没有在实际的情况下用到,看到一些博客说在预测的时候需要用到。等我真正用到的时候再来更新。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值