在实现特定的神经网络时,如何获得梯度表达式

How do I get the gradient expression when implementing a specific neural network?

本文关键字:何获得 表达式 实现 神经网络      更新时间:2023-10-16

我的意思是,如果我想实现一个普通的神经网络,很容易在任何地方找到梯度或导数表达式,但当我实现一个特定的神经网络时,就没那么容易了。所以,通常情况下,当你这样做的时候,你可以用手或者用一些工具来获得梯度表达式?非常感谢!

Theano可以告诉您渐变的符号表达式。唯一的问题是,解释输出可能需要一点努力。

例如,设xwb为标量,

y = x * w + b

在Theano,这可以实现为

import theano
import theano.tensor as tt
x = tt.scalar('x')
w = tt.scalar('w')
b = tt.scalar('b')
y = x * w + b
g = tt.grad(y, w)
theano.printing.debugprint(g)
f = theano.function([x, w, b], outputs=g)
theano.printing.debugprint(f)

执行时(使用Theano的当前出血边缘版本),此脚本将打印

Elemwise{mul} [id A] ''   
 |Elemwise{second,no_inplace} [id B] ''   
 | |Elemwise{add,no_inplace} [id C] ''   
 | | |Elemwise{mul,no_inplace} [id D] ''   
 | | | |x [id E]
 | | | |w [id F]
 | | |b [id G]
 | |TensorConstant{1.0} [id H]
 |x [id E]
DeepCopyOp [id A] 'x'   0
 |x [id B]

第一个输出是未优化的梯度表达式。第二个是优化的梯度表达式。

从我们的微分类中我们知道,对于给定的y表达式,

dy/dw = x

这正是我们从西娅诺身上看到的。

所以你可以在Theano中构建你的神经网络,然后打印自动导出的符号梯度,看看它应该是什么,然后在你的替代实现中实现这个表达式。

对于更复杂的网络来说,从Theano解释符号梯度可能非常乏味,而且可能更容易学会自己推导梯度的必要数学,尤其是如果使用合理标准的神经网络结构。Theano自动微分可以用来验证您的手动推导。

使用和神经网络架构,应该计算梯度体面学习的公式。如果你使用的是像caffe或torch这样的神经网络包,你只需要指定你是在处理负对数似然性还是均方误差或什么(这就是改变学习规则的原因)。这些公式将自动完成。然而,如果你正在编写自己的神经网络平台,你需要做一些数学运算,或者只是从论文或其他东西中获得公式。没有任何工具可以作为神经网络学习的公式查找器。