3. Theano一覽
譯者: Python 文檔協作翻譯小組 ,原文: Theano at a Glance。
本文以
CC BY-NC-SA 4.0 協定釋出,轉載請保留作者署名和文章出處。 人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
Theano是一個Python庫,它允許你定義、優化和求值數學表達式,特别是具有多元數組(numpy.ndarray)的數學表達式。對于涉及大量資料的問題,使用Theano可以獲得與手工編寫的C實作不相上下的速度。它還可以通過利用最近的GPU超過CPU上的C多個數量級。
Theano将計算機代數系統(CAS)的各個方面與優化編譯器的各個方面相結合。它還可以為許多數學運算生成定制的C代碼。CAS與優化編譯的這種組合對于複雜數學表達式重複求值并且求值速度很關鍵的任務特别有用。對于許多不同的表達式每個求值一次的情況,Theano可以最小化編譯/分析的開銷,但仍然提供諸如自動微分等符号特征。
Theano的編譯器對這些符号表達式應用許多不同複雜度的優化。這些優化包括,但不限于:
- 使用GPU進行計算
- 恒定折疊
- 合并相似的子圖,避免備援計算
- 算術簡化(例如
,x*y/x -> y
)--x -> x
- 在各種上下文中插入高效的 BLAS 操作(例如
GEMM
- 使用記憶體别名來避免計算
- 使用就地操作,無論它涉不涉及到别名
- 元素子表達式的循環融合
- 數值穩定性的改進(例如和)
- 完整清單請參閱 優化
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++
将表達式圖的部分編譯成CPU或GPU指令,它們運作起來比純Python快得多。nvcc
- 符号微分:Theano可以自動建構用于計算梯度的符号圖。
- 穩定性優化:Theano可以識别[某些]數值不穩定的表達式,并使用更穩定的算法計算它們。
最接近Theano的Python包是
sympy。Theano比Sympy更注重張量表達,并有更多的機制進行編譯。Sympy具有更複雜的代數規則,可以處理更多種類的數學運算(如序列,極限和積分)。
如果将
numpy與
MATLAB和
Mathematica進行比較,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。
- 我們對
類型的張量有一個CUDA後端。float32
- 已經開始嘗試通用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-dev theano-users郵件清單中。對Theano的開發感興趣的人應該檢查前者,而後者保留給涉及最終使用者的問題。
問題、評論、贊美、批評和錯誤報告應送出到這些郵件清單。
我們歡迎各種貢獻。如果你對如何擴充Theano有任何問題,請随時問問
郵件清單。