如何用張量分解加速深層神經網絡?(附代碼)

2021-01-09 雷鋒網

本文為雷鋒字幕組編譯的技術博客,原標題Accelerating deep neural networks with tensor decompositions,作者為Jacob。

翻譯 |  林立宏    整理 |  凡江

背景

在這篇文章中,我將介紹幾種低秩張量分解方法,用於在現有的深度學習模型中進行分層並使其更緊湊。我也將分享PyTorch代碼,它使用Tensorly來進行在卷積層上的CP分解和Tucker分解。

儘管希望大部分帖子都是可以獨立閱讀的,關於張量分解的回顧可以在這裡找到。Tensorly的作者也寫了於Tensor的基礎內容非常棒的notebook。這幫助我很好的開始學習這塊內容,建議你閱讀一下這些內容。

加上裁剪(pruning),張量分解是加快現有深度神經網絡的實用工具,我希望這篇文章能讓這些內容更加容易理解。

這些方法需要將一個層分解成幾個更小的層。儘管在分解後會有更多的層,但是浮點運算次數和權重的總數會變小。一些報告的結果是整個網絡的x8倍的速度提升(不針對像imagenet這樣的大型任務),或者imagenet中的特定層中x4倍的提升。我的結論是用這些分解方式,我能夠獲得x2到x4倍的加速,這取決於我願意犧牲多少的精度。

在這篇文章中我介紹了一些稱為裁剪(pruning)的技術以減少模型中的參數數量。在一個數據集上正向傳遞(有時是反向傳遞)裁剪(pruning),然後根據網絡中激活的一些標準對神經元進行排序。

完全不同的是,張量分解的辦法只用到層的權重,假設網絡層是參數化的,它的權重能夠用一個矩陣或者是一個低秩的張量來表示。這意味這個它們在參數化的網絡下效果最佳。像VGG神經網絡設計為完全參數化的。另外一個關於參數化模型的例子是使用更少的類別對網絡進行微調以實現更簡單的任務。

和裁剪(pruning)相似,分解之後通過模型需要微調來恢復準確性。

在我們會深入討論細節之前,最後一件要說明的事是,雖然這些方法是實用的,並給出了很好的結果,但它們有一些缺點:

目前還要試圖解決這些問題,而且它仍然是一個活躍的研究領域。


截斷SVD用於分解完全連接的層

第一份我能找到的使用這個來加速深度神經網絡的是在Fast-RNN論文中,Ross Girshick使用它來加速用於檢測的全連接層。代碼可以在這裡找到:pyfaster-rcnn implementation。


SVD概況

奇異值分解使我們能夠分解任何具有n行和m列的矩陣A:

S是一個對角矩陣,其對角線上有非負值(奇異值),並且通常被構造成奇異值按降序排列的。U和V是正交矩陣:

如果我們取最大的奇異值並將其餘的歸零,我們得到A的近似值:

具有作為Frobenius範數最接近於A的秩t矩陣的性質,所以如果t足夠大,是A的良好近似。


在全連接層上的SVD

一個全連接層通常是做了矩陣乘法,輸入一個矩陣A然後增加一個偏差b:

我們可以取A的SVD,只保留第一個奇異值。

這不是一個完全連接的層,而是指導我們如何實現它作為兩個較小的:

權重總數從nxm下降到t(n + m)。


在卷積層上張量分解

二維卷積層是一個多維矩陣(後面用-張量),有四個維度:

cols x rows x input_channels x output_channels.

遵循SVD的例子,我們想要以某種方式將張量分解成幾個更小的張量。卷積層轉換為幾個較小近似的卷積層。

為此,我們將使用兩種流行的(至少在Tensor算法的世界中)張量分解:CP分解和Tucker分解(也稱為高階SVD或其他名稱)。


1412.6553 使用微調CP分解加速卷積神經網絡

1412.6553 Speeding-up Convolutional Neural Networks Using Fine-tuned CP-Decomposition 這篇論文說明了如果CP分解能夠用於卷積層的加速,正如我們會看到的,這將卷積層納入類似行動網路的東西。

他們使用它來加速網絡的速度,而不會明顯降低精度。在我自己的實驗中,我可以使用這個在基於VGG16的網絡上獲得x2加速,而不會降低準確度。

我使用這種方法的經驗是,需要非常仔細地選擇學習率,微調以使其工作,學習率通常應該非常小(大約)。

一個秩R矩陣可以被視為R秩和1矩陣的和,每個秩1矩陣是一個列向量乘以一個行向量:

SVD為我們提供了使用SVD中的U和V列來寫矩陣和的方法:

如果我們選擇一個小於矩陣滿秩的R,那麼這個和就是一個近似值,就像截斷SVD的情況一樣。

CP分解讓我們推廣了張量。

使用CP分解,我們的卷積核,一個四維張量公式,可以近似為一個選定的R:

我們希望R對於有效的分解是小的,但是對保持近似高精度是足夠大的。


帶CP分解的卷積正向傳遞

為了傳遞圖層,我們使用輸入進行卷積:

這給了我們一個辦法來解決這個問題:

1.首先做一個wise(1x1xS)與卷積。這減少了從S到R輸入通道的數量。下一步將在較少數量的通道上完成卷積,使其更快。

2.用在空間維度上執行分離的卷積。就像在行動網路中一樣,卷積是深度可分的,分別在每個通道中完成。與mobilenets不同,卷積在空間維度上也是可分的

3.做另一個逐點卷積來改變從R到T的通道數量如果原始卷積層有一個偏差,在這一點上加上它。

注意像在移動網中的逐點和深度卷積的組合。在使用mobilenets的時候,你必須從頭開始訓練一個網絡來獲得這個結構,在這裡我們可以把現有的圖層分解成這種形式。

與行動網路一樣,為了獲得最快的速度,需要一個有效實現深度可分離卷積的平臺。


用PyTorch和Tensorly卷積層CP分解


1511.06530 用於快速和低功率移動應用的深度卷積神經網絡的壓縮

1511.06530 Compression of Deep Convolutional Neural Networks for Fast and Low Power Mobile Applications 這一篇非常酷的論文,說明了如何使用Tucker分解來加速卷積層來得到更好的結果。我也在基於VGG的參數化網絡用了這種加速,比CP分解的精度要好。作者在論文中指出,它可以讓我們使用更高的學習率(我用)進行微調。

Tucker分解也稱為高階奇異值分解(HOSVD)或者其他名稱,是對張量進行奇異值分解的一種推廣。

它認為SVD的推廣的原因是的分量通常是正交的,但這對於我們的目的並不重要。被稱為核心矩陣,並定義不同的軸如何相互作用。

在上面描述的CP分解中,沿著空間維度的分解導致空間上可分離的卷積。無論如何,過濾器是非常小的,通常是3x3或5x5,所以可分離的卷積並不節省我們大量的計算,而且是一個積極的近似。

Trucker分解有用的性質是,它不必沿著所有的軸(模式)分解。我們可以沿著輸入和輸出通道進行分解(模式2分解):


卷積正向傳遞與塔克分解

像CP分解一樣,寫一下卷積公式並插入內核分解:

這給了我們以下用Tucker分解進行卷積的配方:

1.與進行點對點卷積,信道從S減少到的數量。

2.用進行正則(不可分)卷積。這個卷積代替了原始層的S輸入通道和T輸出通道,具有輸入通道和輸出通道。如果這些等級小於S和T,這就是減少的原因。

3.用進行點對點卷積以回到原始卷積的T個輸出通道。由於這是最後一次卷積,所以在這一點上,如果有偏差就加上偏差。


我們如何選擇分解行列

一種方法是嘗試不同的值並檢查準確性。嘗試後的啟發是,效果很好。

理想情況下,選擇行列應該是自動的。

作者提出使用變分貝葉斯矩陣分解(VBMF)(Nakajima等,2013)作為估計等級的方法。

VBMF很複雜,不在本文的討論範圍內,但是在一個非常高層次的總結中,他們所做的是將矩陣近似為低秩矩陣和高斯噪聲之和。在找到A和B之後,H是等級的上限。

為了將其用於Tucker分解,我們可以展開原始權重張量的s和t分量來創建矩陣。然後我們可以使用VBMF估計作為矩陣的秩。

我用這個在Python上實現的VBMF,相信它可以工作。

VBMF通常返回的秩,非常接近我之前,仔細和乏味的手動調整得到的結果。

這也可以用於估計完全連接層的截斷SVD加速的等級。


用PyTorch和Tensorly卷積層Tucker分解

總結

在這篇文章中,我們討論了幾個張量分解的方法來加速深度神經網絡。

我覺得有趣的是網絡設計中的常見模式,逐點和深度卷積,自然而然出現在這些分解中!


博客原址 https://jacobgil.github.io/deeplearning/tensor-decompositions-deep-learning

更多文章,關注雷鋒網(公眾號:雷鋒網),添加雷鋒字幕組微信號(leiphonefansub)為好友

備註「我要加入」,To be a  AI  Volunteer !

雷鋒網雷鋒網

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 盤點:GPU加速的神經網絡與JavaScript的交叉
    JavaScript已經徵服了網絡,並「滲入」了伺服器、移動端、桌面和其他平臺。與此同時,GPU加速的使用已經遠遠超出了計算機圖形領域,現在已經成為機器學習的一個必需組成部分。訓練神經網絡與深層架構是一個計算密集型過程,在機器智能領域帶來了許多重要的先進結果。
  • 如何使用Keras構建殘差神經網絡?
    什麼是殘差神經網絡?原則上,神經網絡的層數越多,應獲得越好的結果。一個更深層的網絡可以學到任何淺層的東西,甚至可能更多。如果對於給定的數據集,網絡無法通過添加更多的層來學習更多東西,那麼它就可以學習這些其他層的恆等映射(identity mappings)。這樣,它可以保留先前層中的信息,並且不會比較淺的層更糟糕。
  • MIT Taco項目:自動生成張量計算的優化代碼,深度學習加速效果提高...
    例如,如果用一個龐大的表格表示亞馬遜所有客戶與其所有產品的對應映射關係,購買某個產品以「1」表示,未購買以「0」表示,這張表的大部分將會是0。使用稀疏數據進行分析的算法最終做了大量的加法和乘法,而這大部分計算是無效的。通常,程式設計師通過編寫自定義代碼來優化和避免零條目,但這種代碼通常編寫起來複雜,而且通常適用範圍狹窄。
  • 一文看懂系列之深入理解 RNN——神經圖靈機(附代碼)
    原標題:一文看懂系列之深入理解 RNN——神經圖靈機(附代碼) 1 新智元推薦 當然,深度學習中有很多種網絡結構,像多層網絡結構(multi layered)可能大家比較熟悉,相信很多人接觸神經網絡是從下圖這樣的結構開始的,這也是deep learning中「deep」的來源。好友YJango也在專欄中寫了一系列很好的介紹深層神經網絡的文章,也以新穎的觀點分析了深層學習為什麼要deep。
  • 【乾貨】用神經網絡識別歌曲流派(附代碼)
    作者:Navdeep Singh編譯:肖琴【新智元導讀】本文手把手教你如何構建一個能夠識別歌曲類型的神經網絡。MFCC值將被直接輸入神經網絡。了解MFCC讓我們用兩個例子來說明MFCC。請通過Stereo Surgeon下載Kick Loop 5[2]和Whistling[3]。其中一個是低音鼓聲,另一個是高音口哨聲。它們明顯不同,你可以看到它們的MFCC數值是不同的。讓我們轉到代碼(本文的所有代碼文件都可以在Github連結中找到)。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。
  • 如何重建深層神經網絡的可塑性?
    ,深度學習的基本結構是深度神經網絡,它是一種人工神經網絡,人工神經網絡是一種應用類似於大腦神經突觸聯接的結構進行信息處理的數學模型。一般而言,突觸可塑性與著名的赫布定律有關:「一起發射的神經元連在一起」,這試圖總結:根據在不同認知任務上的常規使用情況,大腦如何形成長時間的連接。這不足為奇,突觸可塑性被認為是長期學習和記憶等領域的基礎。在人工智慧太空領域,研究人員長期以來嘗試建立模擬突觸可塑性的機制,以改善神經網絡的學習。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    而且,如果您還沒有這樣做的話,本文將解釋BN的基本直覺,包括其起源以及如何使用TensorFlow和Keras在神經網絡中實現它。對於那些熟悉BN技術並且只想專注於實現的人,可以跳到下面的「代碼」部分。
  • 《超智能體》作者講述深層神經網絡設計理念(附PPT+視頻) | 雷鋒網...
    等技術背後的共享,讓大家感受該如何設計符合自己任務的深層神經網絡。我們可以依照同樣的思路繼續分解下去,進一步降低訓練所需要的數據量。這意味著當你用深層神經網絡時,訓練飛機樣本會間接的對坦克進行了訓練,降低了訓練所需要的數據量。
  • 談一談逆勢而上的圖神經網絡
    《圖學習與挖掘》綜述教程,311頁ppt+教程NeurIPS2020 | 圖對比學習 | 結合四種數據擴充方式進行對比學習(附論文代碼連結)NeurIPS2020 | 四篇圖魯棒性研究相關論文一覽方法總結 | 兩篇論文分析解耦/分離/Disentangled/圖神經網絡表示學習ICLR2021Submission/6677分 / 性能超越圖神經網絡
  • 一篇文章教你用11行Python代碼實現神經網絡
    聲明:本文是根據英文教程 (用 11 行 Python 代碼實現的神經網絡)學習總結而來,關於更詳細的神經網絡的介紹可以參考我的另一篇博客:。A Neural Network in 11 lines of Python從感知機到人工神經網絡如果你讀懂了下面的文章,你會對神經網絡有更深刻的認識,有任何問題,請多指教。
  • 一圖抵千言:帶你了解最直觀的神經網絡架構可視化
    神經網絡是複雜、多維、非線性的數組運算。如何在避免過於複雜或重複的情況下呈現深度學習模型架構的重要特徵呢?又該以何種方式清晰直觀、啟發性地呈現它們呢?(好看也是加分項!)無論研究還是教學項目對此都沒有固定標準。本文我們就來了解一下可視化整個神經網絡架構和特定模塊的工具和技巧。
  • 神經網絡篇——從代碼出發理解BP神經網絡
    一提到反向傳播算法,我們就不自覺的想到隨機梯度下降、sigmoid激活函數和最讓人頭大的反向傳播法則的推導,即便是把反向傳播神經網絡的原理學了一遍,也還是一頭霧水,在這裡推薦一本小編認為把BP神經網絡講的最通透的教材《Python神經網絡編程》。
  • 正則表達式與神經網絡的深度融合
    因此,儘管神經網絡和深度學習如火中天,在工業界實際應用場景中,基於規則的方法仍然有著穩固的地位。規則系統的缺點在於完全依賴於人類專家,無法自動從數據中學習,因而在數據資源豐富的場景下難以達到和神經網絡相近的效果。為了結合兩者的優點,近年來如何將規則更好地融入神經網絡成為了一個重要的研究方向。
  • 最全面的卷積神經網絡介紹(含代碼實戰詳解)
    普通神經網絡的主要缺點是其忽略了輸入數據的結構。這些神經元接收輸入的數據並處理,然後輸出信息。神經網絡的目標是將輸入層中的原始圖像數據轉到輸出層中的正確類中。普通神經網絡和CNN之間的區別在於使用的層類型以及處理輸入數據的方式。假設CNN的輸入是圖像,這允許其提取特定於圖像的屬性。這使得CNN在處理圖像方面更有效率。那麼,CNN是如何構建的?
  • 進展|有限溫量子體系的張量網絡方法
    張量網絡方法是研究量子多體問題的利器。為了和有限溫度下的實驗測量建立直接的聯繫,同時也為了更好地刻畫熱漲落和量子漲落共存時所發生的豐富物理現象,有必要發展針對有限溫量子體系的張量網絡算法。最近,中國科學院物理研究所/北京凝聚態物理國家研究中心凝聚態理論與材料計算重點實驗室T03組的王磊研究員,與北京大學物理學院國際量子材料科學中心的博士生唐維、徳累斯頓工業大學的塗鴻浩教授合作,提出了一類應用於有限溫量子體系的張量網絡方法。該方法借鑑了轉移矩陣重整化群的思路,通過求解轉移矩陣的最大本徵態來研究體系的熱力學性質。
  • 深度學習基礎:張量運算
    事實上,它的影響是如此之大,以至於我們可以在亞馬遜上看到名為「嬰兒的神經網絡」的書籍:D「深度」學習是如何發生的?就其核心而言,深度學習只不過是人腦工作方式的縮影(忽略了人腦中存在的實際複雜性,這種複雜性仍然很難複製)。 計算機使用成百上千個跨越深層的神經元連接從它的輸入和輸出中學習(因此有了「深度學習」這個詞)。每一個神經元連接都有與自身相關的不同重量。
  • Keras結合Keras後端搭建個性化神經網絡模型(不用原生Tensorflow)
    Keras是基於Tensorflow等底層張量處理庫的高級API庫。它幫我們實現了一系列經典的神經網絡層(全連接層、卷積層、循環層等),以及簡潔的迭代模型的接口,讓我們能在模型層面寫代碼,從而不用仔細考慮模型各層張量之間的數據流動。
  • 進展|有限溫量子體系的張量網絡方法
    張量網絡方法是研究量子多體問題的利器。為了和有限溫度下的實驗測量建立直接的聯繫,同時也為了更好地刻畫熱漲落和量子漲落共存時所發生的豐富物理現象,有必要發展針對有限溫量子體系的張量網絡算法。最近,中國科學院物理研究所/北京凝聚態物理國家研究中心凝聚態理論與材料計算重點實驗室T03組的王磊研究員,與北京大學物理學院國際量子材料科學中心的博士生唐維、徳累斯頓工業大學的塗鴻浩教授合作,提出了一類應用於有限溫量子體系的張量網絡方法。該方法借鑑了轉移矩陣重整化群的思路,通過求解轉移矩陣的最大本徵態來研究體系的熱力學性質。
  • 乾貨分享|使用JAX創建神經網絡的對抗性示例(附詳細代碼)
    在本教程中,我們將看到如何創建使用JAX訓練神經網絡的對抗示例。首先,讓我們看一些定義。有哪些例子?簡而言之,對抗性示例是神經網絡的輸入,這些輸入經過優化以欺騙算法,即導致目標變量分類錯誤。通過向目標變量添加「適當的」噪聲,我們可以對目標變量進行錯誤分類。下圖演示了該概念。本教程的重點是演示如何創建對抗示例。我們將使用快速梯度符號法生成。