能「看到」的張量運算:因子圖可視化

2020-12-11 機器之心Pro

選自GitHub

作者:Rajat Vadiraj Dwaraknath

參與:Panda

張量運算有時候並不容易直觀地理解:為什麼有時候改變計算順序不會影響結果,同時又能極大節省計算成本?使用因子圖來可視化或許能為人們提供簡潔直觀的理解方式。Rajat Vadiraj Dwaraknath 近日發布了一篇文章,介紹了他在使用因子圖可視化張量運算方面的心得。

從格羅滕迪克那裡,我學習到不要以證明過程的難度為榮:困難意味著我們尚未理解。也就是說我們要能繪製出讓證明過程顯而易見的圖景。 ——著名數學家 Pierre Deligne

當維度超過 2 或 3 時,理解涉及多維數組的運算就會變得相當困難。但是,矩陣本身的特定性質可能讓你在初次與它們相遇時深感驚訝。軌跡運算的循環性質就是其中一例。

我最近遇到個能可視化這些所謂的張量運算的好工具——因子圖(factor graphs),它能得到視覺上很明顯(如循環軌跡)的結果。儘管我最初是在圖模型和消息傳遞的語境中遇到因子圖的,但我很快就意識到它們體現了一種更通用和更簡單的概念。在這篇文章中,我將主要在高層面介紹因子圖,而不會涉及圖模型或消息傳遞等算法的具體細節。

在深入因子圖之前,我們先簡單快速地介紹一下愛因斯坦求和符號。

愛因斯坦求和符號

愛因斯坦符號存在多種形式,尤其是在物理學領域,但我們要介紹的那種非常簡單,沒有任何物理學背景也能輕鬆掌握。

在矩陣乘法的定義中,

求和符號實際上是多餘的。我們可以直接捨棄它,並推斷出索引 k 必須被求和,因為它沒有出現在左側。

為什麼要這麼做?好吧,我們來看一個有一般張量的案例(將其看作是超過 2 維的 numpy 數組即可):

然後假設張量的形狀如下:

其中交織著複雜的「和」與「積」,而不斷寫求和符號是非常煩人的。同樣,我們不需要寫這些求和符號,因為我們可以通過查看僅出現在右側的索引來暗示所要求和的索引。用愛因斯坦表示法,寫起來就簡單多了:

但相比於公式 (4),這種表示方式確實丟失了一些信息——計算求和的順序。現在,求和的順序實際上不影響最終結果(福比尼定理),但事實表明某些順序的求和過程比另一些順序更高效(後面還會提到)。另外,你可以使用 numpy.einsum 在 Python 中輕鬆嘗試這些。這篇文章更詳細地介紹了 einsum,並給出了一些很好的示例:http://ajcr.net/Basic-guide-to-einsum/

因子圖

帶有多個不同大小的張量的和-積表達式也被稱為張量網絡。除了聽起來炫酷之外,這個名字也是合理的,因為你寫的任何有效的愛因斯坦求和實際上都可映射為一個張量圖。(「有效」是指同樣索引的不同張量的維度大小必須相等。)

我們可以很輕鬆地構建出這樣的圖。我們回頭看看這個例子,了解下發生了什麼:

這個圖有兩種節點——因子和變量我們將用方框表示因子,用圓圈表示變量因子對應張量 (A,B,C)變量對應索引 (i,j,k)邊僅出現在方框和圓圈之間 邊的規則很簡單——每個因子都連接其每個索引。在上面的例子中,A_{ijk} 表示 A 連接著 i、j、k邊的厚度對應於因子中軸(即數組分量的長度)的大小這使得圖成為了方框和圓圈之間的二部圖(bipartite graph)僅出現在等式右側的索引(i 和 j)會被隱式地求和。我們通過加黑圖中對應的變量節點來表示它。

上面動畫的最後一部分給出了一個重要的直覺觀察:

每個因子圖都有一個完全收縮的狀態——愛因斯坦求和的右側(示例中的 2 維張量 D)。通過將圖中的所有因子組合成單個因子,然後將每個灰色的變量求和,可以得到這個狀態。現在剩下的是僅連接到未求和變量的單個因子——這就是收縮狀態。示例中轉變為因子 D 的綠色雲很好地展示了這種收縮。

在我們繼續探索這個奇特工具的能力之前,我們先談談它的來源。

名字從何而來?

這種圖被稱為因子圖的一大原因是右側看起來像是對左側張量的因子分解。在離散隨機變量的概率分布語境中,這會更加具體。如果張量為正且總和為 1,則它們可以表示在不同隨機變量上的聯合分布(這也是索引對應於變量的原因)。在這種設置中,因子圖是將許多變量的大型聯合分解成更小的互相獨立的變量集的聯合。

因子圖不僅會在概率圖模型中出現,而且也會現身於物理學當中,這時候它被稱為張量網絡或矩陣積狀態(matrix product states)。但是,這裡不會介紹這些應用的細節。

有一點需要注意,因子分解所需的內存實際上比整個聯合要少得多(存儲一個 10×10×10 張量對比存儲三個 10 維張量)。

可視化的 numpy 運算

為什麼這種表示方式有用?因為這能讓我們將複雜的因子分解轉換成更可視化的表示,從而更加輕鬆地處理。numpy 中的數值張量運算可以很好地適用於這個框架。下面給出了幾個無需過多解釋的示例:

矩陣-向量乘法

矩陣-矩陣乘法

逐元素求積

外積

軌跡

注意,沒有邊的因子是 0 維張量,其實就是單個數值(軌跡就該是這樣)。

可視化證明

使用簡潔的可視化證明,我們不僅可以理解 numpy 運算,還能迅速搞定數學定理。下面就簡潔地證明了我一開始提到的軌跡恆等:

軌跡是循環的

張量收縮的計算成本

現在,我們已經將因子圖中的那些綠色雲壓縮成了一個大因子,而沒有探討這種變換究竟是怎樣計算的。將許多因子組合成單個因子並求灰色變量的和的過程涉及到兩個基本的計算操作:

求和:移除僅有一條邊的灰色節點求積:將兩個因子合併成一個因子

可以很容易看到,這樣的操作能保留網絡最終的收縮狀態,所以如果我們不斷應用它們直到只剩僅連接到未求和變量的單個因子,那麼我們就實現了網絡收縮。

求和

求和是不言自明的。基本上就是將 numpy.sum 運算應用於對應的軸。這涉及到對大小等於所有其它軸大小的積的張量求和,而且這些張量的數量就是被求和的軸的大小。因此,加法的總數量就是所有軸大小的積。我們也能從可視化表示中看出這一點:

求積

求積運算本質上就是兩個張量的外積泛化為一般張量。用愛因斯坦表示法,組合兩個因子就等同於通過兩個因子的項相乘而將兩個因子當成一個,從而得到一個更大的因子:

這種求積是用一個因子中的每個元素與另一個因子的整體相乘。因此最終結果的大小是各個因子的總大小的積,這會大很多。最終積的每個元素都只是兩個數值相乘的結果,所以乘法總數量就是最終積的項總數。這也很容易可視化:

另外,如果兩個因子共享一個變量,則兩條邊會結合成單條邊——在效果上是執行類似於軌跡動畫中的對角運算。

當收縮一個網絡時,對變量求和並以不同的順序組合因子會導致不同的計算成本。研究表明,尋找實現成本最小化的收縮一般因子圖的最優順序實際上是 NP-hard 問題。作為一個有趣的練習,你可以試試解讀矩陣鏈乘法(matrix chain multiplication)過程,並使用因子圖理解尋找一個鏈矩陣積的總計算成本是如何受乘法順序影響的。這個特定案例有非常簡潔的動態編程算法,可在平方時間內獲得最優順序。

希望我現在已經使你信服因子圖是非常強大的可視化工具。我們不僅能用它證明一些簡單的恆等關係,而且還能進一步將其用於理解一些複雜概念,比如用於概率圖模型推理的有效方法。

一些細節

因子圖其實不能精確地表示愛因斯坦求和。你們可能已經注意到我們丟失了張量的哪個軸對應於圖中哪條邊的信息。但是,只要將源自每個因子的邊加上軸標籤,就能輕鬆解決這個問題。但這會使可視化無必要地雜亂和醜陋,所以我決定不包含它們。

另外,我們還可將這種可視化擴展用於不只是求和變量節點的網絡。將一個變量節點變為灰色在效果上就是將對應的軸約簡為單個數值,因此我們可以用任何執行這種約簡的運算替代求和。舉個例子,我們不用求和,而是取該軸中所有元素的最大值,或者就簡單地索引該軸上一個特定位置。這在 MAP 估計和最大積信念傳播方面是相關的。我們甚至可以將這種解讀方式擴展到連續域,並用積分替代求和,其中的因子也不再是離散矩陣,而是連續域上的多變量函數。

相關焦點

  • PyTorch進階之路(一):張量與梯度
    這是「PyTorch: Zero to GANs」系列教程的第一篇,介紹了 PyTorch 模型的基本構件:張量和梯度。如果想自己輸入代碼,你還可以通過點擊「New」鍵來創建新的 notebook。首先導入 PyTorch:
  • 一圖抵千言:帶你了解最直觀的神經網絡架構可視化
    這張圖可以直接變成下式:我可能更偏向於「使事情更簡單」,就像我在 JavaScript 中處理複雜張量運算一樣,而且提前可視化結果是一件很酷的事情。在量子力學和深度學習中,我們都可以用張量結構做大量線性代數的運算。
  • 使用三重損失網絡學習位置嵌入:讓位置數據也能進行算術運算
    我們甚至可以直接在嵌入空間中執行「國王-男人+女人=女王」這樣的算術運算。在接下來的幾段中,我們將會討論我們如何設計了一種解決方案,可學習將位置坐標映射到度量空間中,這讓我們可以執行一些類似於詞嵌入的操作,如圖 3 所示。圖 3:我們提出的解決方案可直接優化度量空間,這樣就能使用基本的算術運算探索該嵌入空間了。
  • Lesson 3.張量的廣播和科學運算
    由於譜運算(Spectral Ops)前期不會涉及,而要理解傅立葉變換本身需要更多額外的數學基礎,而很多其他運算,我們在前面介紹張量的基本方法時已經介紹,因此接下來將主要圍繞逐點運算、規約運算、比較運算和線性代數運算四塊進行講解,而線性代數部分由於涉及到大量的數學內容,因此將放在後面單獨進行講解。
  • 手把手教你將矩陣畫成張量網絡圖
    矩陣乘法是張量的縮並將兩個矩陣相乘就相當於「粘合」它們的圖。這叫做張量的縮並(tensor contraction)。命名之爭文章中討論的圖起源於 Penrose 的圖形符號,被稱為張量網絡圖和/或字符串圖(string diagram),也許有一些微小的區別。「和/或」取決於你是誰。也就是說,在物理/機器學習社區(在那裡它們被稱為張量網絡圖)和範疇論社區(在那裡它們被稱為字符串圖),將向量空間的圖可視化地表示為帶邊的節點。
  • 深度學習框架中的「張量」不好用?也許我們需要重新定義Tensor了
    陷阱 2:通過對齊進行廣播張量最有用的地方是它們可以在不直接需要 for 循環的情況下快速執行數組運算。為此,要直接對齊維度,以便廣播張量。同樣,這是按照慣例和代碼文檔實現的,這使排列維度變得「容易」。例如,假設我們想對上圖應用掩碼。
  • 這是一份「不正經」的深度學習簡述
    關於深度學習,我們能夠看到很多優秀的介紹、課程和博客,本文將列舉其中的精華部分,而且,你會發現這是一篇「不一樣」的文章。不一樣在哪兒呢?可能是本文沒有按照「正常」的深度學習博客結構:從數學講起,然後介紹論文、實現,最後講應用。我希望用講故事的方式來介紹深度學習,這可能要比只介紹信息和公式要更加平易近人一些。我為什麼要寫這篇深度學習簡介?
  • 【Pytorch 】筆記八:Tensorboard 可視化與 Hook 機制
    「大綱如下」:Tensorboard 的基本使用(標量可視化和圖像可視化)下面依然是一張導圖把知識拎起來:2./PytorchLearning/runs, 這樣我們點擊下面的那個連結就可以看到我們創建的可視化事件了。下面一個圖介紹 Tensorboard 界面:
  • 擁有「數據分析」+「數據可視化」能力,更能受到社會偏愛?
    不過公司類型和規模不同,工作內容也就有所不同,我列出了不同類型公司的數據分析崗位所需要的能力:小公司數據分析專員:略懂資料庫,能利用Excel製作各類數據圖表、報告;中型公司數據開發工程師:會python語言,能利用Python爬蟲抓取業務相關數據,並且製作成漂亮的可視化報表,且有一定的數據建模能力
  • 谷歌大腦發布神經網絡的「核磁共振」,並公開相關代碼
    不幸的是,任何分組本質上都是將事物減少到人類規模與保存信息之間的折衷,因為任何聚合都是有損的。矩陣因子分解可以讓我們挑選出針對特定內容優化的組,這比之前的自然分組要好。用戶界面的目標應該會影響矩陣因子分解優化的優先級。例如,如果想要優先考慮網絡檢測到的東西,我們就希望因子分解能充分地描述激活。相反,如果想要優先考慮改變網絡行為的因素,我們希望因子分解能充分描述梯度。
  • 百度數據可視化實驗室正式成立,發布深度學習可視化平臺 Visual DL
    內容:
  • 萬字長文:特徵可視化技術(CAM)
    ; 「step2」:獲取該張量的每個channel的權重,即長度為所以「目標類別score建議使用不經過softmax的值」。Grad-CAM是利用目標特徵圖的梯度求平均(GAP)獲取特徵圖權重,可以看做梯度map上每一個元素的貢獻是一樣。而本文認為梯度map上的「每一個元素的貢獻不同」,因此增加了一個額外的權重對梯度map上的元素進行加權。
  • 「張量」?「纖維取向張量」?看得懂的都是專家
    很多注塑模具相關人員對於玻纖填充材料的纖維取向張量不甚明了,甚至有多年經驗的Moldflow工程師也是一知半解。造成這種情況的原因是這個結果的名字裡包含了3個名詞——纖維、取向、張量,每個名詞都不能被直接看到和簡單理解。
  • 跟我學萬字長文:最前沿的特徵可視化(CAM)技術
    ; 「step2」:獲取該張量的每個channel的權重,即長度為>「gradient-free」:開山之作:利用GAP獲取CAM「論文標題」:  Learning Deep Features for Discriminative Localizatiion「論文地址
  • 耗時86小時的「百變小櫻」最強數據可視化作品!
    優秀的可視化作品之前也分享過一些,網上也不少,但可能大家此前很少有了解,創作者是如何一步步創作出那些優秀作品的,本篇文章即是帶大家簡單開開眼,當然看完也並不代表就能作出這樣的作品,真刀真槍地實踐還得看源碼,之前的文章古柳也說過會復現很多優秀可視化作品,自然也少不了「百變小櫻」這個項目,更多實踐講解下,敬請期待。
  • 包學包會,這些動圖和代碼讓你一次讀懂「自注意力」
    BERT 及其多種變體已經在多種語言理解任務上取得了非常出色的表現,這些架構全都基於 Transformer,而 Transformer 又使用了一種名為「自注意力」的方法。 本文將通過圖示和代碼對自注意力機制進行透徹的解讀。 當然,在閱讀本文之前,你可能也想了解什麼是注意力機制。
  • 教程| 深度學習初學者必讀:張量究竟是什麼?
    本文對張量進行了詳細的解讀,能幫你在對張量的理解上更進一步。本文作者為 MapR Technologies 的首席應用架構師 Ted Dunning。近段時間以來,張量與新的機器學習工具(如 TensorFlow)是非常熱門的話題,在那些尋求應用和學習機器學習的人看來更是如此。