Theano 中文文檔 0.9 - 3. Theano一覽

3. Theano一覽

譯者:Python 文檔協(xié)作翻譯小組,原文:Theano at a Glance

本文以 CC BY-NC-SA 4.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。

Python 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。

Theano是一個(gè)Python庫,它允許你定義、優(yōu)化和求值數(shù)學(xué)表達(dá)式,特別是具有多維數(shù)組(numpy.ndarray)的數(shù)學(xué)表達(dá)式。對(duì)于涉及大量數(shù)據(jù)的問題,使用Theano可以獲得與手工編寫的C實(shí)現(xiàn)不相上下的速度。它還可以通過利用最近的GPU超過CPU上的C多個(gè)數(shù)量級(jí)。

Theano將計(jì)算機(jī)代數(shù)系統(tǒng)(CAS)的各個(gè)方面與優(yōu)化編譯器的各個(gè)方面相結(jié)合。它還可以為許多數(shù)學(xué)運(yùn)算生成定制的C代碼。CAS與優(yōu)化編譯的這種組合對(duì)于復(fù)雜數(shù)學(xué)表達(dá)式重復(fù)求值并且求值速度很關(guān)鍵的任務(wù)特別有用。對(duì)于許多不同的表達(dá)式每個(gè)求值一次的情況,Theano可以最小化編譯/分析的開銷,但仍然提供諸如自動(dòng)微分等符號(hào)特征。

Theano的編譯器對(duì)這些符號(hào)表達(dá)式應(yīng)用許多不同復(fù)雜度的優(yōu)化。這些優(yōu)化包括,但不限于:

  • 使用GPU進(jìn)行計(jì)算
  • 恒定折疊
  • 合并相似的子圖,避免冗余計(jì)算
  • 算術(shù)簡化(例如x*y/x -> y, --x -> x
  • 在各種上下文中插入高效的BLAS操作(例如GEMM
  • 使用內(nèi)存別名來避免計(jì)算
  • 使用就地操作,無論它涉不涉及到別名
  • 元素子表達(dá)式的循環(huán)融合
  • 數(shù)值穩(wěn)定性的改進(jìn)(例如和)
  • 完整列表請(qǐng)參閱優(yōu)化

Theano是在LISA實(shí)驗(yàn)室編寫的,以支持高效機(jī)器學(xué)習(xí)算法的快速開發(fā)。Theano以希臘數(shù)學(xué)家命名,她可能是畢達(dá)哥拉斯的妻子。Theano根據(jù)BSD許可證(link)發(fā)布。

先睹為快

這里是如何使用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不是一個(gè)正常意義上的編程語言,因?yàn)槟阍赑ython中編寫一個(gè)程序來為Theano構(gòu)建表達(dá)式。在某種程度上它仍然像一個(gè)編程語言,因?yàn)槟惚仨?/p>

  • 聲明變量(a,b)并給出它們的類型
  • 構(gòu)建表達(dá)式來表示如何將這些變量放在一起
  • 將表達(dá)式圖編譯為函數(shù),以便將它們用于計(jì)算。

可以把theano.function看作一個(gè)編譯器的接口,它從純粹的符號(hào)圖中構(gòu)建一個(gè)可調(diào)用的對(duì)象。Theano的最重要的特性之一是theano.function可以優(yōu)化圖,甚至將其中的一些或全部編譯為本機(jī)機(jī)器指令。

它做了什么,但是其它庫沒有做?

Theano是一個(gè)Python庫和優(yōu)化編譯器,用于處理和求值表達(dá)式,特別是矩陣表達(dá)式。矩陣的操作通常使用numpy包來完成,那么什么是Theano做的而Python和numpy沒有做的呢?

  • 執(zhí)行速度優(yōu)化:Theano可以使用g++nvcc將表達(dá)式圖的部分編譯成CPU或GPU指令,它們運(yùn)行起來比純Python快得多。
  • 符號(hào)微分:Theano可以自動(dòng)構(gòu)建用于計(jì)算梯度的符號(hào)圖。
  • 穩(wěn)定性優(yōu)化:Theano可以識(shí)別[某些]數(shù)值不穩(wěn)定的表達(dá)式,并使用更穩(wěn)定的算法計(jì)算它們。

最接近Theano的Python包是sympy。Theano比Sympy更注重張量表達(dá),并有更多的機(jī)制進(jìn)行編譯。Sympy具有更復(fù)雜的代數(shù)規(guī)則,可以處理更多種類的數(shù)學(xué)運(yùn)算(如序列,極限和積分)。

如果將numpyMATLABsympyMathematica進(jìn)行比較,Theano是一種試圖結(jié)合兩個(gè)世界的最好的部分的東西。

入門

安裝Theano

在你的系統(tǒng)上下載并安裝Theano的說明。

教程

開始使用Theano的基本功能。如果你是新手,去這里!

API文檔

Theano提供的細(xì)節(jié)。建議先通讀教程

可在此處找到在線文檔的PDF版本。

Theano的愿景

這是我們對(duì)Theano的愿景。這是給人們對(duì)Theano未來的一個(gè)期望,但我們不能承諾實(shí)現(xiàn)所有的。這也應(yīng)該能幫助你理解Theano與其他計(jì)算工具的關(guān)系。

  • 支持張量和稀疏運(yùn)算

  • 支持線性代數(shù)運(yùn)算

  • 圖變換

    • 微分/高階微分
    • 'R'和'L'微分運(yùn)算符
    • 速度/內(nèi)存優(yōu)化
    • 數(shù)值穩(wěn)定性優(yōu)化
  • 可以使用多種編譯語言、指令集:C/C++、CUDA、OpenCL、PTX、CAL、AVX ...

  • 延遲求值

  • 循環(huán)

  • 并行執(zhí)行(SIMD、多核,集群上的多節(jié)點(diǎn),分布式多節(jié)點(diǎn))

  • 支持NumPy所有功能和SciPy的基本功能

  • 在Theano中輕松封裝庫函數(shù)

注意:短期沒有計(jì)劃支持多節(jié)點(diǎn)計(jì)算。

Theano愿景的狀態(tài)

以下是截至2013年12月3日(Theano版本0.6之后)的愿景狀態(tài):

  • 我們支持使用numpy.ndarray對(duì)象的張量,我們支持對(duì)它們的許多操作。
  • 我們通過使用scipy.{csc,csr,bsr} _matrix對(duì)象支持稀疏類型,并支持對(duì)它們的一些操作。
  • 我們已經(jīng)開始實(shí)現(xiàn)/封裝更高級(jí)的線性代數(shù)運(yùn)算。
  • 我們有許多圖變換,涵蓋上面列出的4個(gè)類別。
  • 我們可以通過更好的存儲(chǔ)優(yōu)化和指令選擇來改進(jìn)圖轉(zhuǎn)換。
    • 類似于在優(yōu)化階段的自動(dòng)調(diào)整,但這不適用于只有1個(gè)的操作。
    • 使用示例:根據(jù)輸入大小確定是否應(yīng)將計(jì)算移動(dòng)到GPU。
    • 可能實(shí)現(xiàn):允許fgraph中的Theano變量擁有超過1個(gè)所有者。
  • 我們支持Python 2和Python 3。
  • 我們對(duì)float32類型的張量有一個(gè)CUDA后端。
  • 已經(jīng)開始嘗試通用GPU ndarray(GPU張量)(在libgpuarray項(xiàng)目中啟動(dòng))
    • 將GPU后端移到Theano外部。
    • 將在Windows上為GPU提供更好的支持,并在CPU上支持OpenCL后端。
  • 循環(huán)可以工作,但并不是所有的相關(guān)優(yōu)化都已完成。
  • cvm鏈接器允許延遲求值。它是當(dāng)前的默認(rèn)鏈接器。
    • 如何讓DebugMode檢查?目前,DebugMode非延遲地檢查計(jì)算。
  • CPU上的SIMD并行性來自編譯器。
  • 多核并行支持有限。如果外部BLAS實(shí)現(xiàn)支持它,許多點(diǎn)通過gemm,gemv和ger并行化。此外,支持逐個(gè)元素的操作。請(qǐng)參閱Multi cores support in Theano
  • 無多節(jié)點(diǎn)支持。
  • 實(shí)現(xiàn)大多數(shù)但不是所有NumPy的函數(shù)/別名。* https://github.com/Theano/Theano/issues/1080
  • 將現(xiàn)有的Python函數(shù)封裝的更簡單并寫成文檔。
  • 我們知道如何從對(duì)象類型(張量、稀疏矩陣、dtype、broadcast 標(biāo)志)分離共享變量內(nèi)存存儲(chǔ)位置,但我們需要這樣做。

聯(lián)系我們

關(guān)于Theano的討論發(fā)生在theano-devtheano-users郵件列表中。對(duì)Theano的開發(fā)感興趣的人應(yīng)該檢查前者,而后者保留給涉及最終用戶的問題。

問題、評(píng)論、贊美、批評(píng)和錯(cuò)誤報(bào)告應(yīng)提交到這些郵件列表。

我們歡迎各種貢獻(xiàn)。如果你對(duì)如何擴(kuò)展Theano有任何問題,請(qǐng)隨時(shí)問問theano-dev郵件列表。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容