实现特定神经网络时如何获取梯度表达式?

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

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

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

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]

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

正如我们从微分学 class 中得知的那样,对于 y

的给定表达式
dy/dw = x

这正是我们从 Theano 中看到的。

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

对于更复杂的网络,解释 Theano 的符号梯度可能非常乏味,学习必要的数学知识来自己推导梯度可能更容易,特别是如果使用合理的标准神经网络结构。然后可以使用 Theano 自动微分来验证您的手动推导。