近段時間以來,張量與新的
機器學習工具(如 tensorflow)是非常熱門的話題,在那些尋求應用和學習機器學習的人看來更是如此。但是,當你回溯歷史,你會發現一些基礎但強大的、有用且可行的方法,它們也利用了張量的能力,而且不是在
深度學習的場景中。下面會給出具體解釋。
如果說計算是有傳統的,那麼使用線性代數的數值計算就是其中最重要的一支。像 linpack 和 lapack 這樣的包已經是非常老的了,但是在今天它們任然非常強大。其核心,線性代數由非常簡單且常規的運算構成,它們涉及到在一維或二維陣列(這裡我們稱其為向量或矩陣)上進行重複的乘法和加法運算。同時線性代數適用範圍異常廣泛,從計算機遊戲中的影象渲染到核**設計等許多不同的問題都可以被它解決或近似計算,
關鍵的線性代數運算:在計算機上使用的最基礎的線性代數運算是兩個向量的點積(dot product)。這種點積僅僅是兩個向量中相關元素的乘積和。乙個矩陣和乙個向量的積可以被視為該矩陣和向量行(row)的點積,兩個矩陣的乘積可以被視為乙個矩陣和另乙個矩陣的每一列(column)進行的矩陣-向量乘積的和。此外,再配上用乙個值對所有元素進行逐一的加法和乘法,我們可以構造出所需要的線性代數運算機器。
計算機之所以可憑極快速度求出用線性代數編寫的程式值,部分原因是線性代數具有規律性。此外,另乙個原因是它們可以大量地被並行處理。完全就潛在效能而言,從早期的 cray-1(譯者注:cary-1 是世界上最早的一台超級計算機,於 1975 年建造,運算速度每秒 1 億次)到今天的 gpu 計算機,我們可以發現效能增長了超過 30000 倍。此外,當你要考慮用大量 gpu 處理集群資料時,其潛在的效能,在極小成本下,比曾經世上最快速的計算機大約高出一百萬倍。
然而,歷史的模式總是一致的,即要想充分利用新的處理器,我們就要讓運算越來越抽象。cray-1 和它向量化的後繼者們需要其執行程式能夠使用向量運算(如點積)才能發揮出硬體的全部效能。後來的機器要求要就矩陣-向量運算或矩陣-矩陣運算來將
演算法形式化,從而方可盡可能地發揮硬體的價值。
我們現在正站在這樣乙個結點上。不同的是我們沒有任何超越矩陣-矩陣運算的辦法,即:我們對線性代數的使用已達極限。
然而,也有好訊息。雖然我們不能對張量使用僅幾個運算。但是我們可以在張量上寫下一套運算的模式(pattern)。不過,這還不不夠,因為根據這些模式編寫的程式不能像它們寫的那樣被充分高效地執行。但我們還有另外的好訊息:那些效率低下但是編寫簡單的程式可以被(基本上)自動轉換成可非常高效執行的程式。
更讚的是,這種轉換可以無需構建一門新程式語言就能實現。只需要乙個簡單的技巧就可以了,當我們在 tensorflow 中寫下如下**時:
v1 = tf.constant(3.0)
v2 = tf.constant(4.0)
v3 = tf.add(node1, node2)
實際情況是,系統將建立乙個像圖 1 中顯示的資料結構:
圖 1:上方的**被轉譯成乙個可被重建的資料結構,而且它會被轉成機器可執行的形式。將**轉譯成使用者可見的資料結構可讓我們所編寫的程式能被重寫從而更高效地執行,或者它也可以計算出乙個導數,從而使高階優化器可被使用。
該資料結構不會在上面我們展示的程式中實際執行。因此,tensorflow 才有機會在我們實際執行它之前,將資料結構重寫成更有效的**。這也許會牽涉到我們想讓計算機處理的小型或大型結構。它也可生成對我們使用的計算機 cpu、使用的集群、或任何手邊可用的 gpu 裝置實際可執行的**。對它來說很讚的一點是,我們可以編寫非常簡單但可實現令人意想不到結果的程式。
然而,這只是開始。
做一些有用但不一樣的事
tensorflow 和像它一樣的系統採用的完全是描述機器學習架構(如深度
神經網路)的程式,然後調整那個架構的引數以最小化一些誤差值。它們通過建立乙個表徵我們程式的資料結構,和乙個表徵相對於我們模型所有引數誤差值梯度的資料結構來實現這一點。這個梯度函式的存在使得優化變得更加容易。
但是,雖然你可以使用 tensorflow 或 caffe 或任何其它基本上同樣工作模式的架構來寫程式,不過你寫的程式不一定要去優化機器學習函式。如果你寫的程式使用了由你選擇的包(package)提供的張量標註,那它就可以優化所有型別的程式。自動微分和較先進的優化器以及對高效 gpu **的編譯對你仍然有利。
舉個簡例,圖二給出了乙個家庭能耗的簡單模型。
圖 2:該圖顯示了一間房子的日常能耗情況(圓圈),橫軸代表了溫度(華氏度)。能耗的乙個分段線性模型疊加在了能耗具體資料上。模型的引數按理來說會形成乙個矩陣,但是當我們要處理上百萬個模型時,我們便可以用到張量。
該圖顯示了一間房子的能耗使用情況,並對此進行了建模。得到乙個模型不是什麼難事,但是為了找出這個模型,筆者需要自己寫**來分別對數百萬間房子的能耗情況進行建模才行。如果使用 tensorflow,我們可以立即為所有這些房子建立模型,並且我們可以使用比之前得到這個模型更有效的優化器。於是,筆者就可以立即對數百萬個房間的模型進行優化,而且其效率比之前我們原始的程式要高得多。理論上我們可以手動優化**,並且可以有人工推導的導數函式。不過完成這項工作所需要的時間,以及更重要的,除錯花費的時間會讓筆者無法在有限時間裡建立這個模型。
這個例子為我們展示了乙個基於張量的計算系統如 tensorflow(或 caffe 或 theano 或 mxnet 等等)是可以被用於和深度學習非常不同的優化問題的。
所以,情況可能是這樣的,對你而言較好用的機器學習軟體除了完成機器學習功能以外還可以做很多其它事情。
XML初學者必讀
差不多每天都有人問 什麼是 xml xml 能做什麼 xml 能不能替我做這個 xml 會取代什麼 等等諸如此類的問題。由於最近一段時間稍微對 xml 使用了一下,我來談談自己的感覺。這些經驗都很淺顯,任何乙個用過 xml 的人都有,並且見仁見智,只不過我算剛剛走過這段路,對自己一開始的困惑,誤解還...
XML初學者必讀
差不多每天都有人問 什麼是 xml xml 能做什麼 xml 能不能替我做這個 xml 會取代什麼 等等諸如此類的問題。由於最近一段時間稍微對 xml 使用了一下,我來談談自己的感覺。這些經驗都很淺顯,任何乙個用過 xml 的人都有,並且見仁見智,只不過我算剛剛走過這段路,對自己一開始的困惑,誤解還...
vector模板,初學者必讀
vector 稱為向量,是一種類模板,其宣告包含在標頭檔案 vector 中,所以使用veto 時需要包含標頭檔案 vector vector是一種支援高效地隨機訪問和高效地向尾部插入新元素的容器,它一般實現為一 個動態分配的陣列,所以在程式開發過程中,使用vector作為動態陣列是非常方便的 類 ...