函数 f ,输入的是一个 n 维向量 x = [x1,x2,...,xn]T,输出是一个标量。
函数 f 关于 x 的梯度就是一个 n 个偏导数组成的向量:
例如:
其中 x = [x1,x2,x3,x4]T,那么 y = 2(x1*x1+x2*x2+x3*x3+x4*x4);
关于 x 的偏导数求得 [4x1,4x2,4x3,4x4]T,即 4X
backward()自动求梯度
# coding: utf-8 # In[2]: from mxnet import autograd,nd # In[3]: x = nd.arange(4).reshape((4,1)) x # In[4]: x.attach_grad() # In[5]: with autograd.record(): y = 2 * nd.dot(x.T,x) # In[7]: y.backward() # In[8]: assert (x.grad - 4*x).norm().asscalar() == 0 x.grad # In[12]: x.grad
# In[13]: def f(a): b = a*2 while b.norm().asscalar()<1000: b = b*2 if b.sum().asscalar()>0: c = b else: c = 100 * b return c # In[15]: a = nd.random.normal(shape=1) a # In[16]: a.attach_grad() # In[18]: with autograd.record(): c = f(a) c.backward() # In[19]: a.grad # In[20]: a.grad == c/a
分析:根据函数可知,进去一个a,出来一定是 x * a 的形式,对a 求偏导,得x。
则 a.grad == c / a