函数式自动微分
一般来说,神经网络都是神经元组成,所以利用一些计算图组织神经网络的计算
非常重要。
可见mindspore里用Parameter申明会变的元
https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/api_python/ops/mindspore.ops.binary_cross_entropy_with_logits.html
官网的函数api文档指出
loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))
后面2个是权重,一个是输出的权重,1个是输入的权重。
表示在一批里,假如传入3个是一批,3个z的权重是怎么样的,ops.ones_like(z)就都是1,一样的权重,没有偏心,计算出来损失值
function就是前面计算loss的函数,
grad_fn = mindspore.grad(function, (2, 3))的2,3是function里哪个位置的变参要求导,所以是最后2个,我一共有4个参数
就得到2 tensor
关于梯度截断
梯度的作用是反向传播时让nn知道要怎么变化神经元的参数,当某些参数在计算图里的时候会影响所有神经元的梯度
这是计算梯度函数返回的东西多了个z,原来是只有loss,就是计算loss对于各个变参的梯度,现在还要计算z这个输出路径上的神经元变参对于各个变参梯度,得到的数值和单计算对于loss的不同
所以要截断z
grad_fn = mindspore.grad(function_with_logits, (2, 3), has_aux=True)
has_aux=True就可以让z对参数的梯度输出,而不参入z对参数的梯度影响。
nn的自动微分
这是前向计算,得到loss的函数,很常见
这样就得到了损失和损失对于参数的梯度
非常自动。本文常说的参数是什么呢
参数就是1神经元。1神经元里有不同的结构,是个众多参数的矩阵,说实话,ms里起名叫参数不好。个人建议应该叫cell,而cell应该改名为network。