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

Python 在Theano中创建符号变量的目的是什么?,python,theano,Python,Theano,在序号中,变量被写为“符号”: x = T.matrix("x") y = T.vector("y") 从阅读文档中可以看出,我们创建这些符号的原因可能是因为这些变量被编译成了C代码。但我不确定情况是否如此,更不用说使用符号变量的唯一原因了 在Theano中创建符号变量的目的是什么?他们能做什么,而Python中的开箱即用的任务做不到的呢?Theano网站将以 Theano是一个Python库,允许您定义、优化和 计算涉及多维数组的数学表达式 效率高 这似乎是一个很好的总结,它做什么,但也许不

在序号中,变量被写为“符号”:

x = T.matrix("x")
y = T.vector("y")
从阅读文档中可以看出,我们创建这些符号的原因可能是因为这些变量被编译成了C代码。但我不确定情况是否如此,更不用说使用符号变量的唯一原因了


在Theano中创建符号变量的目的是什么?他们能做什么,而Python中的开箱即用的任务做不到的呢?

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
操作只创建一个正确形状的张量(在本例中为标量),用1填充,
TensorConstant{a}
只是一个数字
a
,因此可以简化为

(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的编译器是一个优化编译器,因为它可以使用各种变换来更改表达式(也称为计算图),这些变换可以维护表达式的语义(在给定相同输入的情况下,它仍然计算相同的结果),但可以获得不同的性能,更重要的是,可以获得不同的收益
普通Python不提供上述任何功能,仅使用numpy只提供一些并行化功能(通过BLAS和OpenMP)

更多关于这个话题


附:这是@Eikenberg对该问题简短评论的扩展。

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
操作只创建一个正确形状的张量(在本例中为标量),用1填充,
TensorConstant{a}
只是一个数字
a
,因此可以简化为

(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的编译器是一个优化编译器,它可以使用各种保持表达式语义的转换来更改表达式(也称为计算图)(在给定相同输入的情况下,它仍然计算相同的结果),但