实现特定神经网络时如何获取梯度表达式?
How do I get the gradient expression when implementing a specific neural network?
我的意思是,如果我要实现一个普通的神经网络,很容易在任何地方找到梯度或导数表达式,但是当我实现一个特定的神经网络时,就没那么容易了。所以,通常情况下,当你这样做时,你是手工获得梯度表达还是使用某种工具?非常感谢!
使用神经网络架构,应该计算梯度体面学习的公式。如果您使用的是像 caffe 或 torch 这样的神经网络包,您只需指定是处理负对数似然还是均方误差或什么(这就是改变学习规则的原因)。公式将自动完成。但是,如果您正在编写自己的神经网络平台,则需要做一些数学运算或者只是从论文或其他东西中获取公式。没有工具可以用作神经网络学习的公式查找器。
Theano 可以告诉你梯度的符号表达式。唯一的问题是解释输出可能需要一些努力。
例如,设x
、w
和b
为标量,
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 自动微分来验证您的手动推导。
我的意思是,如果我要实现一个普通的神经网络,很容易在任何地方找到梯度或导数表达式,但是当我实现一个特定的神经网络时,就没那么容易了。所以,通常情况下,当你这样做时,你是手工获得梯度表达还是使用某种工具?非常感谢!
使用神经网络架构,应该计算梯度体面学习的公式。如果您使用的是像 caffe 或 torch 这样的神经网络包,您只需指定是处理负对数似然还是均方误差或什么(这就是改变学习规则的原因)。公式将自动完成。但是,如果您正在编写自己的神经网络平台,则需要做一些数学运算或者只是从论文或其他东西中获取公式。没有工具可以用作神经网络学习的公式查找器。
Theano 可以告诉你梯度的符号表达式。唯一的问题是解释输出可能需要一些努力。
例如,设x
、w
和b
为标量,
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 自动微分来验证您的手动推导。