神經網路壓縮

神經網路壓縮

一個深度學習模型通常包含數以百萬計甚至千萬計的參數和十幾層甚至幾十層的網路,通常需要非常大的計算代價和存儲空間。神經網路壓縮是指通過改變網路結構或利用量化、近似的方法來減少網路的參數或存儲空間, 在不影響神經網路性能的情況下,降低網路計算代價和存儲空間。

簡介

神經網路壓縮簡單來說通過有關方法來減少網路的參數和存儲空間,在神經網路性能影響不大的情況下。神經網路壓縮大體上可以分為近似,量化和裁剪三類方法。近似類方法主要利用矩陣或張量分解的思想,通過少量參數重構原始網路參數矩陣或參數張量,以達到減少網路存儲開銷的目的。通常,在網路運行時,這些參數將會被適當重建,網路的運行時開銷並沒有得到有效減少。第二類方法是量化方法,量化方法的主要思想是將網路參數的可能值從實數域映射到有限數集,或將網路參數用更少的比特數來表示。量化的方法將原本具有無限種可能的參數約束到少數幾種參數中,再對這些參數進行重用,就可以減少網路存儲開銷。通過改變參數的數據類型,如將原本的64位浮點型量化為整形甚至布爾型,網路的運行時開銷也將得到大幅度減少。第三類方法是網路裁剪的方法,與前兩種方法相比,網路裁剪的主要特點是會直接改變網路的結構。網路裁剪可以按粒度分為層級裁剪,神經元級裁剪和神經連線級裁剪。層級裁剪的裁減對象是網路層,裁剪的結果是獲得更淺的網路。

需求

神經網路壓縮不但具有必要性,也具有可能性。首先,儘管神經網路通常是深度越深,效果越好,但針對具體的套用場景和需求,適當深度和參數數目的網路即能夠滿足。盲目加深網路複雜度所帶來的微弱性能提升在許多套用場合意義並不大。其次,神經網路常常存在過參數化的問題,網路神經元的功能具有較大的重複性,即使在網路性能敏感的場景,大部分網路也可以被“安全地”壓縮而不影響其性能。神經網路壓縮可以有助於理解神經元作用機理和使神經網路模型部署在輕量級的設備上。

深度神經網路儘管在計算機視覺、語音識別、機器人技術等多個領域都取得了良好成果。深度學習的實際套用往往受限於其存儲和運算規模。例如,VGG-16網路含有約1.4億浮點數參數,假設每個參數存儲為32位浮點數格式,則整個網路需要占用超過500兆存儲空間。這樣的計算量在只能通過高性能並行設備進行,且仍不具備很好的實時性。高性能並行計算設備具有體積大、能耗大、價格高的特點,在許多場合都不能使用。因此,如何在資源受限場合,如手機、平板電腦、各種嵌入式和攜帶型設備上運行神經網路,是深度學習走向日常生活的關鍵一步,也是學界和工業界研究的熱點問題之一。

方法

基於張量分解的網路壓縮

張量是向量和矩陣的自然推廣,向量可稱為一階張量,矩陣可稱為二階張量,將矩陣堆疊形成“立方體”,這種數據結構則稱為三階張量。一張灰度圖像在計算機中由矩陣表示,是二階張量。一張RGB三通道的彩色圖像在計算機中則保存為三階張量。當然,三階張量也可以堆疊形成更高階的張量。張量分解是張量分析中的重要組成部分,其基本原理是利用張量數據中的結構信息,將張量分解為形式更簡單、存儲規模更小的若干張量的組合。典型的張量分解方法有CP分解,Tucker分解等。在神經網路中,參數通常以“張量”的形式集中保存。對全連線層而言,全連線通過權重矩陣將輸入向量變換到輸出向量,其參數為二階張量。對卷積層而言,設輸入數據為具有通道的三階張量。則卷積層中的每一個卷積核也都是具有通道的三階卷積核,故一層卷積層所包含的一組卷積核構成了形如 × ××的四階張量。基於張量分解的網路壓縮的基本思想,就是利用張量分解的技術將網路的參數重新表達為小張量的組合。重新表達後的張量組一般能夠在一定的精度下近似與原張量相同,而所占用的空間又得到大大降低,從而獲得網路壓縮的效果。

基於量化的網路壓縮

第二類網路壓縮的方法是基於量化的方法。這裡的量化主要包含兩層含義,第一是用低精度參數代替高精度參數,對參數進行精度截取,其本質是均勻量化。第二是進行權重共享,限制網路權重可取的種類。有限的權重種類可以隨後進行進一步編碼,這種量化的手段本質是非均勻量化。降低權重精度的一種極限情況,在該文獻中,卷積網路的權重被二值化為+1與-1,網路的運算速度得到大幅度提升,存儲消耗大幅度降低,且二值化網路有潛在的利用硬體邏輯運算實現的可能性。值共享的量化將網路權重的取值從全體實數集映射到有限數集的過程 。

基於裁剪的網路壓縮

基於張量分解和量化的網路壓縮方法,其著眼點都是網路的參數。在網路壓縮的過程中網路的拓撲結構保持不變。在基於裁剪的網路壓縮中,網路的拓撲結構和數據的推斷方法都可能發生改變。基於裁剪的網路壓縮將直接改變網路的結構,其本質是將網路中的冗餘部分剔除。

依據裁剪對象的不同,網路裁剪可以分為層級裁剪,神經元級裁剪,神經連線級裁剪等多個粒度。層級裁剪的裁剪對象是整個網路層,主要適合於網路層數較多的模型,裁剪的結果是神經網路變得更“淺”, 去除深度殘差網路的若干模組,實際上就是一種層級裁剪。神經元級裁剪的裁剪對象是單個神經元或濾波器,裁剪的結果是神經網路變得更“瘦”。神經連線級裁剪的目標是單個神經網路連線權,裁剪的結果是使得神經網路更“稀疏”。一旦一個神經元被裁剪,則與它相連的所有連線權都被剪斷。所以神經元裁剪實際上是神經連線裁剪的一種特殊情況。

層級裁剪由於粒度較粗糙,對層內特徵表達影響很大,研究相對較少。神經連線級裁剪是研究較多的網路壓縮方法之一,相對而言具有更精細的裁剪粒度。但它具有的副作用是,稀疏的神經連線的保存需要使用稀疏張量的存儲和運算方法。稀疏張量的存儲需要保存數據點位置的額外存儲開銷,其實際節約的存儲空間小於裁減掉的參數數目。稀疏張量的計算需要用特殊的計算方法,不利於並行計算。我們稱神經連線級的裁剪破壞了網路的“正規性”。

相關詞條

熱門詞條

聯絡我們