Theano 0.6 文档[4] - 图结构

本文为Lancelod_Liu编译, 转载请保留此行.

This Article is translated and edited by Lancelod_Liu, keep this line if you share it.

原文: .

Graph Structures

Theano Graphs(图)

如果你不知道底层的细节, 调试Theano代码并不容易. 本章旨在教会你Theano内在工作原理的最基本的部分. 更多细节参考 Extending Theano.

写Theano代码的第一步就是使用符号变量写出所有的数学关系, 使用 +,-, **,sum(),tanh()等类似的操作. 所有的这些都被称作ops. 一个op 代表着一个基于某种类型输入产生某种类型输出的特定的计算步骤. 你可以把它看做一个function definition(函数定义).

Theano内部构造一个图结构, 它由变量节点(variable nodes), 操作节点(op nodes)和应用节点(apply nodes)组成. 一个apply node代表着一个op 应用到一些variables上. 描述一个op表示的计算的定义和apply表示的对于一些实际数据的op的应用的差别是很重要的. 更多细节参考Variable,Op,Apply. 下面是一个图的例子:

Code

x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y

Diagram

../_images/apply1.png

Apply (蓝色), Variable (红色), Op (绿色),and Type (紫色) 对象的交互关系.

这张图的箭头代表了Python对象指向的引用. 蓝色方框是一个 Apply 节点. 红色方框是 Variable 节点. 绿色圆圈是 Ops. 紫色方框是 Types.

这张图可以从输出方向开始倒置, 参考下面代码:

x = T.dmatrix('x')
y = x * 2.

如果你输入(y.owner), 输出是<class 'theano.gof.graph.Apply'>, 即apply 节点连接到op和输入来得到输出. 你可以打印出用来得到y的op的name:

>>> y.owner.op.name
'Elemwise{mul,no_inplace}'

结果是一个elementwise的乘法. 这个乘法在输入间生效:

>>> len(y.owner.inputs)
2
>>> y.owner.inputs[0]
x
>>> y.owner.inputs[1]
InplaceDimShuffle{x,x}.0

注意第二个输入不是2. 这是因为首先被 broadcasted 成一个和x的形状相同的矩阵. 这通过op DimShuffle 实现:

>>> type(y.owner.inputs[1])
<class 'theano.tensor.basic.TensorVariable'>
>>> type(y.owner.inputs[1].owner)
<class 'theano.gof.graph.Apply'>
>>> y.owner.inputs[1].owner.op
<class 'theano.tensor.elemwise.DimShuffle object at 0x14675f0'>
>>> y.owner.inputs[1].owner.inputs
[2.0]

基于这个图结构我们可以很容易理解自动梯度计算是怎么工作的, 以及符号关系式如何为性能和稳定性进行优化的.

Automatic Differentiation(自动差分)

有了图结构, 计算差分就非常容易啦. tensor.grad() 需要做的唯一的一件事就是反朔整张图, 通过所有的apply节点, 直到到达输入. 对于每个apply 节点, 它的op 定义了如何计算节点输出对应于其输入的梯度. 注意到如果一个 op 没有提供这个信息, 它就认为梯度是未定义的了. 使用链式法则(chain rule), 这些梯度可以按顺序整合来得到整张图的输入输出的梯度.

以后继续讨论这个话题( differentiation ).

Optimizations(优化)

当编译一个Theano函数的时候, 你传递给theano.function 的实际上式一个图(graph)(从输出变量你可以横穿整张图直到输入变量). 这个图结构展示了如何计算输出, 它也提供了改进计算方式的可能性. Theano优化的方式是通过定义和替换图中某些特定的模式, 从而可以更快/稳定地产生同样的输出. 优化同样可以检测出关键的子图并保证同一个值不会计算两次或重定义.

举个栗子, Theano的一个优化就是替换 \frac{xy}{y}x.

更多信息参考processoptimizations.

Example(栗子)

符号变成设计到模式变化: 它会更加清晰. 考虑下面的栗子:

>>> import theano
>>> a = theano.tensor.vector("a")      # declare symbolic variable
>>> b = a + a ** 10                    # build symbolic expression
>>> f = theano.function([a], b)        # compile function
>>> print f([0, 1, 2])                 # prints `array([0,2,1026])`
Unoptimized graphOptimized graph
../_images/f_unoptimized2.png../_images/f_optimized2.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值