在实现特定的神经网络时,如何获得梯度表达式
How do I get the gradient expression when implementing a specific neural network?
我的意思是,如果我想实现一个普通的神经网络,很容易在任何地方找到梯度或导数表达式,但当我实现一个特定的神经网络时,就没那么容易了。所以,通常情况下,当你这样做的时候,你可以用手或者用一些工具来获得梯度表达式?非常感谢!
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]
第一个输出是未优化的梯度表达式。第二个是优化的梯度表达式。
从我们的微分类中我们知道,对于给定的y
表达式,
dy/dw = x
这正是我们从西娅诺身上看到的。
所以你可以在Theano中构建你的神经网络,然后打印自动导出的符号梯度,看看它应该是什么,然后在你的替代实现中实现这个表达式。
对于更复杂的网络来说,从Theano解释符号梯度可能非常乏味,而且可能更容易学会自己推导梯度的必要数学,尤其是如果使用合理标准的神经网络结构。Theano自动微分可以用来验证您的手动推导。
使用和神经网络架构,应该计算梯度体面学习的公式。如果你使用的是像caffe或torch这样的神经网络包,你只需要指定你是在处理负对数似然性还是均方误差或什么(这就是改变学习规则的原因)。这些公式将自动完成。然而,如果你正在编写自己的神经网络平台,你需要做一些数学运算,或者只是从论文或其他东西中获得公式。没有任何工具可以作为神经网络学习的公式查找器。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何从C++中的依赖类型中获得它所依赖的类型
- 欧拉项目#8答案是大以获得有效答案
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何使用C/C++在MacOSX中获得键盘布局
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何在不产生任何垃圾的情况下获得C中的像素
- 使用正则表达式regex_search在字符串中查找字符串
- 有没有一种方法可以在编译时获得作用域类名
- 如何在C++中获得"静态纯虚拟"功能?
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 如何获得与 C++11 或 Boost 匹配的正则表达式长度
- C++ 和 Java 之间的表达式求值顺序有何不同
- 在实现特定的神经网络时,如何获得梯度表达式
- 如何从QInputDialog获得文本(正则表达式)
- 如何在QT c++中使用正则表达式从字符串中获得子字符串值