Theano一览

Theano是一个Python库,它允许你定义、优化和求值数学表达式,特别是具有多维数组(numpy.ndarray)的数学表达式。对于涉及大量数据的问题,使用Theano可以获得与手工编写的C实现不相上下的速度。它还可以通过利用最近的GPU超过CPU上的C多个数量级。

Theano将计算机代数系统(CAS)的各个方面与优化编译器的各个方面相结合。它还可以为许多数学运算生成定制的C代码。CAS与优化编译的这种组合对于复杂数学表达式重复求值并且求值速度很关键的任务特别有用。对于许多不同的表达式每个求值一次的情况,Theano可以最小化编译/分析的开销,但仍然提供诸如自动微分等符号特征。

Theano的编译器对这些符号表达式应用许多不同复杂度的优化。这些优化包括,但不限于:

  • 使用GPU进行计算
  • 恒定折叠
  • 合并相似的子图,避免冗余计算
  • 算术简化(例如x*y/x -> y, --x -> x
  • 在各种上下文中插入高效的BLAS操作(例如GEMM
  • 使用内存别名来避免计算
  • 使用就地操作,无论它涉不涉及到别名
  • 元素子表达式的循环融合
  • 数值稳定性的改进(例如\log(1+\exp(x))\log(\sum_i \exp(x[i]))
  • 完整列表请参阅优化

Theano是在LISA实验室编写的,以支持高效机器学习算法的快速开发。Theano以希腊数学家命名,她可能是毕达哥拉斯的妻子。Theano根据BSD许可证(link)发布。

先睹为快

这里是如何使用Theano的示例。它没有展示Theano的许多功能,但它具体说明了Theano是什么。

import theano
from theano import tensor

# declare two symbolic floating-point scalars
a = tensor.dscalar()
b = tensor.dscalar()

# create a simple expression
c = a + b

# convert the expression into a callable object that takes (a,b)
# values as input and computes a value for c
f = theano.function([a,b], c)

# bind 1.5 to 'a', 2.5 to 'b', and evaluate 'c'
assert 4.0 == f(1.5, 2.5)

Theano不是一个正常意义上的编程语言,因为你在Python中编写一个程序来为Theano构建表达式。在某种程度上它仍然像一个编程语言,因为你必须

  • 声明变量(a,b)并给出它们的类型
  • 构建表达式来表示如何将这些变量放在一起
  • 将表达式图编译为函数,以便将它们用于计算。

可以把theano.function看作一个编译器的接口,它从纯粹的符号图中构建一个可调用的对象。Theano的最重要的特性之一是theano.function可以优化图,甚至将其中的一些或全部编译为本机机器指令。

相对其他类似库的特色

Theano是一个Python库和优化编译器,用于处理和求值表达式,特别是矩阵表达式。矩阵的操作通常使用numpy包来完成,那么什么是Theano做的而Python和numpy没有做的呢?

  • 执行速度优化:Theano可以使用g++nvcc将表达式图的部分编译成CPU或GPU指令,它们运行起来比纯Python快得多。
  • 符号微分:Theano可以自动构建用于计算梯度的符号图。
  • 稳定性优化:Theano可以识别[某些]数值不稳定的表达式,并使用更稳定的算法计算它们。

最接近Theano的Python包是sympyTheano比Sympy更注重张量表达,并有更多的机制进行编译。Sympy具有更复杂的代数规则,可以处理更多种类的数学运算(如序列,极限和积分)。

如果将numpyMATLABsympyMathematica进行比较,Theano是一种试图结合两个世界的最好的部分的东西。

入门

安装Theano
在你的系统上下载并安装Theano的说明。
教程
开始使用Theano的基本功能。如果你是新手,去这里!
API文档
Theano提供的细节。建议先通读教程

可在此处找到在线文档的PDF版本。

Theano的愿景

这是我们对Theano的愿景。这是给人们对Theano未来的一个期望,但我们不能承诺实现所有的。这也应该能帮助你理解Theano与其他计算工具的关系。

  • 支持张量和稀疏运算
  • 支持线性代数运算
  • 图变换
    • 微分/高阶微分
    • 'R'和'L'微分运算符
    • 速度/内存优化
    • 数值稳定性优化
  • 可以使用多种编译语言、指令集:C/C++、CUDA、OpenCL、PTX、CAL、AVX ...
  • 延迟求值
  • 循环
  • 并行执行(SIMD、多核,集群上的多节点,分布式多节点)
  • 支持NumPy所有功能和SciPy的基本功能
  • 在Theano中轻松封装库函数

注意:短期没有计划支持多节点计算。

Theano愿景的状态

以下是截至2013年12月3日(Theano版本0.6之后)的愿景状态:

  • 我们支持使用numpy.ndarray对象的张量,我们支持对它们的许多操作。
  • 我们通过使用scipy.{csc,csr,bsr} _matrix对象支持稀疏类型,并支持对它们的一些操作。
  • 我们已经开始实现/封装更高级的线性代数运算。
  • 我们有许多图变换,涵盖上面列出的4个类别。
  • 我们可以通过更好的存储优化和指令选择来改进图转换。
    • 类似于在优化阶段的自动调整,但这不适用于只有1个的操作。
    • 使用示例:根据输入大小确定是否应将计算移动到GPU。
    • 可能实现:允许fgraph中的Theano变量拥有超过1个所有者。
  • 我们支持Python 2和Python 3。
  • 我们对float32类型的张量有一个CUDA后端。
  • 已经开始尝试通用GPU ndarray(GPU张量)(在libgpuarray项目中启动)
    • 将GPU后端移到Theano外部。
    • 将在Windows上为GPU提供更好的支持,并在CPU上支持OpenCL后端。
  • 循环可以工作,但并不是所有的相关优化都已完成。
  • cvm链接器允许延迟求值。它是当前的默认链接器。
    • 如何让DebugMode检查?目前,DebugMode非延迟地检查计算。
  • CPU上的SIMD并行性来自编译器。
  • 多核并行支持有限。如果外部BLAS实现支持它,许多点通过gemm,gemv和ger并行化。此外,支持逐个元素的操作。请参阅Multi cores support in Theano
  • 无多节点支持。
  • 实现大多数但不是所有NumPy的函数/别名。* https://github.com/Theano/Theano/issues/1080
  • 将现有的Python函数封装的更简单并写成文档。
  • 我们知道如何从对象类型(张量、稀疏矩阵、dtype、broadcast 标志)分离共享变量内存存储位置,但我们需要这样做。

联系我们

关于Theano的讨论发生在theano-devtheano-users邮件列表中。对Theano的开发感兴趣的人应该检查前者,而后者保留给涉及最终用户的问题。

问题、评论、赞美、批评和错误报告应提交到这些邮件列表。

我们欢迎各种贡献。如果你对如何扩展Theano有任何问题,请随时问问theano-dev邮件列表。