在Theano中创建符号变量的目的是什么?

时间:2015-05-21 00:02:44

标签: python theano

在Theano中,变量被写为'符号':

x = T.matrix("x")
y = T.vector("y")

从阅读文档中可以看出,我们创建这些符号的原因可能是由于这些变量被编译成C代码。但我不确定是否是这种情况,更不用说使用符号变量的唯一原因了。

在Theano中创建符号变量的目的是什么?他们可以做什么,在Python中开箱即用的分配不能做到?

1 个答案:

答案 0 :(得分:4)

Theano网站以

打开
  

Theano是一个Python库,允许您定义,优化和   评估涉及多维数组的数学表达式   有效。

这似乎是对它的作用的一个很好的总结,但也许不是它为什么会这样做。

Theano的主要特征之一是其象征性的差异化特征。也就是说,给定一个符号数学表达式,Theano可以自动地将表达式与表达式中的某个变量区分开来,即它可以自动确定表达式沿某些感兴趣维度的梯度。

例如,如果y=x**2(其中**是权力运算符)则y相对于x的渐变为dy/dx = 2*x。 Theano可以自动执行此操作:

import theano
import theano.tensor
x = theano.tensor.scalar('x')
y = x ** 2
theano.printing.pp(y)
dy_dx = theano.grad(y, x)
theano.printing.pp(dy_dx)

如果您运行此代码,您将看到输出

(x ** TensorConstant{2})
((fill((x ** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x ** (TensorConstant{2} - TensorConstant{1})))

fill操作只会创建一个正确形状的张量(在这种情况下为标量),其中填充了一个TensorConstant{a}只是数字a,因此可以简化为< / p>

(x ** 2) == x ** 2
((1 * 2) * (x ** (2 - 1))) == (2 * (x ** 1)) == 2 * x

正如所料。

显然,这对于这样一个简单的数学表达式并不是特别有用,但是现在想象你正在构建一个任意大而复杂的数学表达式,其梯度并不是那么明显,就像神经网络研究中经常出现的那样。

但还有更多。 Theano可以执行上述操作,不仅包括标量,还包括向量,矩阵或任何其他张量。

除了象征性的差异化,Theano的象征性方法还有其他显着的好处:

  • Theano可以将符号数学表达式编译成可执行代码。它使用各种技术,可以产生比普通Python代码运行得更快的可执行代码。
  • Theano程序通常可以在CPU和GPU上运行之间切换,无需任何代码更改。
  • 在CPU上运行时,Theano充分利用numpy BLAS和OpenMP工具(如果可用),以便在多个CPU核心上并行执行。
  • 在GPU上运行时,Theano充分利用现代GPU上的众多内核来并行化最昂贵的操作(最明显的是矩阵乘法)。
  • Theano的编译器是一个优化编译器,因为它可以使用各种变换来改变表达式(也称为计算图),这些变换维护表达式的语义(它仍然在给定相同输入的情况下计算相同的结果)但是实现了各种性能而且,至关重要的是,numerical stability获益。

普通Python不提供上述任何内容,单独使用numpy只提供一些并行化功能(通过BLAS和OpenMP)。

有关此主题的更多信息in the Theano documentation

P.S。这是@eickenberg对这个问题的简短评论的扩展。