autograd手动仿真手记

Posted feuker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了autograd手动仿真手记相关的知识,希望对你有一定的参考价值。

Preface

查看损失函数的时候,突然想手工模拟梯度传递过程。

Script

损失函数是这个: \(l(x)=-||x| - |x-1||\)。程序脚本:

import mxnet as mx;import numpy as np;import mxnet.autograd as ag
x=mx.nd.zeros((1,))+2
x.attach_grad()
with ag.record():
    l=-mx.nd.abs( mx.nd.abs(x) - mx.nd.abs(x-1.)   )
    l.backward(mx.nd.ones_like(l))
print x,l,‘x.grad:‘,x.grad

先回顾一下梯度传递的理论基础:如果\(y=f(z(x))\),其中\(f,z\)都可看作不同layer代表的映射,那么需要求得对\(x\)的梯度,易于推广的方法是链式法则:
\[ y_x = f_z(z)\times z_x(x) \]
得到普遍应用的原因是易于模块化,每个layer只需要把自己那部分设计好,就可以支持构建自定义系统。
明白这点后,模拟过程最好就是列表:
比如现在\(x=2\)

Symbol Op Input Output Grad
x | | 2 2 -1x1=-1
x-1 + 2 1 1x1=1
|x-1| | | 1 1 1x1/1=1
|x|-|x-1| +,- 2, 1 1 -1x1=-1, -1x-1=1
| |x| - |x-1| | | | 1 1 -1 x 1/1=-1
-| |x| - |x-1| | - 1 -1 1 x -1 =-1
l 1

绝对值的导数:\(f(x)=|x| \Rightarrow f^,(x)=\frac{x}{f(x)}\)
填写Input/Output的过程类似于Forward过程;计算Grad类比于Backward,需要从表格底部算起。
x的节点被复用一次:\(grad_x=1+(-1)=0\)

Note

\(f(0)=|0|\)处,MXNet使用的应该是置零操作。参考\(x=0\Rightarrow 1, x=0.5\Rightarrow 0, x=1\Rightarrow -1\)

以上是关于autograd手动仿真手记的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch Note6 自动求导Autograd

动手学深度学习第一课:从上手到多类分类-Autograd

手动仿真-门级仿真 步骤

Autograd解析|OneFlow学习笔记

基于51单片机手动计步器protues仿真设计(源码+仿真)

代码在我的系统中运行良好,但 coursera autograder 给了我未知的信号