一文弄清深度學習、TensorFlow和張量之間的關係

深度學習 機器學習 數據結構 GPU 機器人圈 2017-06-07

一文弄清深度學習、TensorFlow和張量之間的關係

圖:pixabay

「機器人圈導覽」關於深度學習系統,大家或多或少都有一些瞭解,可是你知道嗎?我們今天所用的許多深度學習系統都是基於張量代數的,比如谷歌的TensorFlow,但是張量代數與深度學習的關係到底如何?本文作者是Ted Dunning,MapR Technologies的首席應用架構師,機器人圈將文章編譯如下:

張量(Tensors)和諸如TensorFlow這樣的機器學習新工具都是當代的熱門話題,特別是在那些尋求深度學習方法的人之中,這都是非常受歡迎的。結果就是,當你瀏覽熱詞時,你會發現,真的有一些基礎強大的、有用的並且可用的方法,它們能夠充分利用張量所能提供的,而這不僅僅是針對深度學習而言的。這就是為什麼張量為什麼那麼受歡迎。

如果說計算也是有傳統特點的話,那麼使用線性代數的數值計算就是最受歡迎的計算之一了。像LINPACK測試以及後來的種種LAPACK軟件包,在現在看來都是很古老的了,但它們的功能還是很強大的。那麼,其核心是,線性代數是由相當簡單和非常有規律可循的操作組成的,包括對一維和二維數字數組(在本文中通常稱之為向量和矩陣)的重複乘法和加法運算,並且它是極其普遍的,許多問題都可以通過線性方法求解或近似。這些範圍涵蓋的領域非常廣闊,從計算機遊戲中圖像的渲染到核武器的設計,以及這些極端之間的其他大範圍的應用都是可以利用線性代數來進行運算的。

關鍵線性代數運算

線性代數在計算機上可實現的完全基本操作是兩個向量的點積。這個乘積只是兩個向量中相應元素的乘積之和。矩陣和向量的(左)乘積可以被視為具有向量的矩陣行的重複點積,並且兩個矩陣的乘積可以被視為矩陣的矩陣向量積和另一個矩陣的列的組合。通過單個值對所有元素進行逐元素加法和乘法,這些操作可以建立所有必需的線性代數機器。

部分原因是它們的規律性,以及它們可以通過大量的並行性操作得以實現,所以計算機可以以極高的速度評估使用線性代數編寫的程序。就原始潛力表現方面來說,從Cray-1計算機系統到今天的GPU的演進,其表現能力已經顯示出超過3萬次的改進,而當你考慮具有大量GPU的集群時,其性能潛力大概是百萬次,而這曾經是地球上最快的計算機,其成本只是總成本的一小部分

然而,歷史模式已經宣誓了一切,那就是我們必須向越來越高的抽象層次邁進,以便更好地利用新的處理器。Cray-1及其面向向量的後來者需要重寫程序以使用向量操作(如點積),從而實現全面的性能。而後來的機器已經要求在矩陣向量運算或甚至矩陣—矩陣運算方面來形成算法,以推動硬件以其最大的潛力運行。

而我們現在剛好處在門檻位置。不同之處在於,除了矩陣—矩陣運算之外,沒有其他方面可以著手進行。也就是說,使用線性代數沒有任何其他好途徑。

但是我們也不必把自己侷限在線性代數中。事實證明,我們是可以提高數學食物鏈的。長期以來,在數學抽象的海洋中有比矩陣更大的“魚”存在的。而張量就是這樣一位可以肩此重任的候選人。張量在廣義相對論的數學基礎中佔據突出地位,同時它也是其他物理學科的基礎。但正如矩陣和向量的數學概念可以簡化為我們在計算機中使用的陣列一樣,張量也可以被簡化並表示為多維數組和一些相關的操作。不幸的是,事情並沒有想象中容易,它並不像矩陣和向量那樣簡單,主要是因為沒有一個明顯且簡單的操作集可以在張量執行,就像在矩陣和向量上那樣執行。

雖然如此,不過還是有一些真正的好消息的。即使我們不能在張量上只寫幾個操作,我們可以寫出一組在張量上的操作模式。然而,這還不夠,因為根據這些模式編寫的程序在寫入時無法按照預期目標有效執行。其餘的好消息是,雖然我們低效,但易於編寫一些程序,這些程序可以(幾乎)自動轉換到執行得非常有效的程序中去。

更好的是,這種轉換是可以輕鬆實現的,因此不必再建立另一種新的計算機語言。所做的就像是惡作劇一樣:在TensorFlow中,當我們編寫如下代碼時:

一文弄清深度學習、TensorFlow和張量之間的關係

真正發生的是,構建了一個如下圖所示的數據結構:

一文弄清深度學習、TensorFlow和張量之間的關係

上述代碼被轉換為可重構並轉換為機器可執行形式的數據結構。將代碼轉換為用戶可見的數據結構允許我們編寫的程序被重寫以便更有效的執行或允許計算導數,從而可以使用高級優化器。

這個數據結構實際上並沒有在我們上面提到的程序中執行。因此,在我們實際嘗試運行之前,TensorFlow有可能將數據結構重寫成更高效的代碼。這可能涉及到,我們認為的,要求電腦做的事情的小型或大型的結構化。它還可能涉及生成我們正在使用的機器的CPU的、或者我們正使用的集群的,或者我們已備好的任何GPU的實際可執行代碼。

這個很酷的事情就是,我們可以編寫非常簡單的程序能夠得到非常驚奇的結果。

但這僅僅是個開始。

做一些有用的東西(但要與眾不同)

TensorFlow和系統類似之處在於,它們都是關於採用描述機器學習架構(如深度神經網絡)的程序,並調整該架構的參數從而最小化某種誤差值。它們不僅通過創建代表我們的程序的數據結構來實現,而且還產生一個數據結構,表示相對於我們模型的所有參數的誤差值的梯度。而具有這樣的梯度函數使得優化變得更加容易。

你可以使用TensorFlow也可以使用Caffe,或者使用其他任何具有基本相同效果的系統編寫程序,但是你編寫的程序不需要優化機器學習功能。你可以編寫優化各種程序的程序,如果你編寫的程序使用的是你選擇的程序包提供的張量符號。自動差異化和最先進的優化器以及彙編到高效的GPU代碼仍然會對你有所幫助。

作為一個簡易有效的示例,下圖顯示了家庭能源使用情況的簡單模型。

一文弄清深度學習、TensorFlow和張量之間的關係

家庭(圓圈)使用的日常能源作為水平軸上溫度函數圖。能源使用的分段線性模型已經疊加在使用數據上。模型的參數通常是一個矩陣,但是當我們談論一百萬個模型時,我們可以使用張量。

這個圖表顯示了一個家庭的能源消耗和一個用量消耗模型。要得到一個單一的模型不是什麼大不了的事情,但是要找到這個模型,我必須編寫一些真正的代碼,然後該代碼必須運行在數以百萬計的家庭中以獲取每個模型。使用TensorFlow,我們可以立即為所有房屋創建模型,我們可以使用比我原來使用的更高效的優化器來獲取此模型。結果是一萬個模型被一次性優化,效率高於我原來的程序。理論上來說,我可以手工優化我的代碼,並且可以手工導出一個派生函數,但是這麼做需要時間,更重要的是,調試結果所需的時間使我在做模型時不可能完成。

這樣的示例顯示了基於張量的計算系統,如TensorFlow(或Caffe或Theano或Mxnet或任何你最喜歡的)是如何用於與深度學習非常不同的優化問題中的。

最好的機器學習軟件(對你來說)最好是根本不要使用機器學習。

編譯自:KDnuggets Home

作者:Ted Dunning,MapR Technologies的首席應用架構師。目前擔任Apache基金會董事會成員,擔任大量項目的導師。他開發了用於估計極限分位數的t-digest算法。

文章做了不改變原意的修改

相關推薦

推薦中...