在Theano中,变量被写为'符号':
x = T.matrix("x")
y = T.vector("y")
从阅读文档中可以看出,我们创建这些符号的原因可能是由于这些变量被编译成C代码。但我不确定是否是这种情况,更不用说使用符号变量的唯一原因了。
在Theano中创建符号变量的目的是什么?他们可以做什么,在Python中开箱即用的分配不能做到?
答案 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的象征性方法还有其他显着的好处:
普通Python不提供上述任何内容,单独使用numpy只提供一些并行化功能(通过BLAS和OpenMP)。
有关此主题的更多信息in the Theano documentation。
P.S。这是@eickenberg对这个问题的简短评论的扩展。