日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021 神经网络压缩 (李宏毅

發(fā)布時間:2023/12/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021 神经网络压缩 (李宏毅 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先,為什么需要對神經(jīng)網(wǎng)絡模型進行壓縮呢?我們在之前的課程中介紹過很多大型的深度學習模型,但當我們想要將這些大模型放在算力比較小的邊緣設備或者其他IoT設備里面,就需要對大模型進行壓縮。

Lower latency:低時延 Privacy:私密性

介紹5個網(wǎng)絡壓縮的方法,我們只考慮算法(軟件)層面,不考慮硬件層面的解決方法。

?

1. Network Pruning(網(wǎng)絡剪枝)

對于一個大的網(wǎng)絡來說,我們能想到的是,眾多網(wǎng)絡參數(shù)中一定會有不重要/冗余的一些參數(shù),因此我們將這些參數(shù)減掉達到網(wǎng)絡壓縮的目的。

網(wǎng)絡剪枝的步驟如下:首先,我們預訓練一個大規(guī)模的網(wǎng)絡,然后評估里面參數(shù)的重要性,包括權(quán)重(weight)的重要性和神經(jīng)元(neuron)的重要性。

  • 評價weight重要性,我們可以用絕對值衡量,即絕對值越大,weight越重要,或者采用之前介紹的life long learning的想法(也許我們也可以就把每個參數(shù)的 bi 算出來、就可以知道那個參數(shù)重不重要)。
  • 評價neuron重要性,我們可以用其輸出的結(jié)果為0的次數(shù)衡量,即輸出0越多越不重要。

接著我們對多余的參數(shù)的重要性評估并修剪,得到一個小的網(wǎng)絡,再對里面的參數(shù)微調(diào),再評估、修剪。。。重復上述過程,直到滿足要求,完成Network pruning過程。(一次剪掉大量參數(shù)可能對network傷害太大,所以一次只剪掉一點參數(shù)比如10%)

剛才提到,修剪的單位有兩種,一種是以權(quán)重(weight)為單位,一種是以神經(jīng)元(neuron)為單位,這兩者有什么不同呢?實作上差別較大

首先Weight pruning,但這樣就造成network 形狀不規(guī)則(irregular),難以編程實現(xiàn)(pytorch定義network每一層有幾個 Neuron/ vector),同時難以用GPU加速(矩陣乘法)。通常的做法是將冗余的weight置為0,但這樣做還是保留了參數(shù)(等于0),不是真正去除掉。

在這篇論文中有個關(guān)于參數(shù)pruning多少與訓練速度提升關(guān)系的實驗驗證,其中紫色線sparsity表示參數(shù)去掉的量。可以發(fā)現(xiàn),雖然參數(shù)去掉了將近95%,但是速度依然沒有提升。

(這個 Network Pruning 的方法、其實是一個非常有效率的方法、往往你可以 Prune 到 95% 以上的參數(shù)、那但是你的 Accuracy 只掉 1~2% 而已)

接著Neuron pruning,通過去除冗余的神經(jīng)元,簡化網(wǎng)絡結(jié)構(gòu)。這樣得到的網(wǎng)絡結(jié)構(gòu)是規(guī)則的,相比于Weight pruning,這種方式更好實現(xiàn),也更容易通過GPU加速。

Q&A:這個 Pruning 有沒有效率是函式庫的問題?對啦 是函式庫的問題、那如果你可以想辦法寫一個、Irregular的 Network也很有效的函式庫的話、那你就可以用 Weight Pruning、但是 大家都沒有要自己寫函式庫

為什么我們先訓練一個大的network,再壓縮成一個小的network,而不是直接訓練一個小的network呢?一般來說,大的network更容易訓練,如果直接訓練小的網(wǎng)絡可能達不到大的network的訓練效果。

why大的network比較好train?參看過去課程錄影。這里有個大樂透假說(Lottery Ticket Hypothesis)對上述觀點進行了說明。

什么是大樂透假說(Lottery Ticket Hypothesis)呢?

train network是看人品的,每次 Train Network 的結(jié)果不一定會一樣,你抽到一組好的 Initial 的參數(shù),就會得到好的結(jié)果。

現(xiàn)在有一個訓練好的大的網(wǎng)絡,可以分解成若干個小的網(wǎng)絡,只要某一個小的網(wǎng)絡性能與大的網(wǎng)絡相同或相似,就說明這個大的網(wǎng)絡可以壓縮。

大樂透假說在實驗上是怎么被證實的呢?

用大樂透假說來解釋上圖的現(xiàn)象,就是大network裡面有很多 Sub-network、而這一組 Initialize 的參數(shù),就是幸運的那一組、可以 Train 得起來的 Sub-network

大樂透假說非常知名,在ICLR2019得到 Best Paper Award

關(guān)于大樂透假說的一個后續(xù)的研究如下,“解構(gòu)大樂透假說”,通過充分的實驗得到了一些有趣的結(jié)論:

  • 第一個發(fā)現(xiàn)是,嘗試了不同的pruning strategy,發(fā)現(xiàn)如果訓練前和訓練后參數(shù)的差距越大,將其pruning后得到的結(jié)果越有效。
  • 第二個發(fā)現(xiàn)是,到底我們今天這一組好的 Initialization好在哪里,? ?發(fā)現(xiàn)說 小的sub-network只要我們不改變參數(shù)的正負號,就可以訓練起來。說明:正負號是初始化參數(shù) 能不能夠訓練起來的關(guān)鍵
  • 第三個發(fā)現(xiàn)是,對于一個初始的大的網(wǎng)絡(因為參數(shù)隨機初始化很關(guān)鍵),有可能不訓練就已經(jīng)有一個sub-network可以有一個比較好的效果。(其實可以得到跟supervise很接近的正確率)

但是? 大樂透假說一定是對的嗎?不一定。下面這篇文章就“打臉”了大樂透假說。實驗是這樣的,我們用pruned完的小網(wǎng)絡隨機初始化參數(shù),再訓練,只要多訓練幾個epoch,就可以比不隨機初始化訓練小網(wǎng)絡的效果要好。

當然這篇文章的作者也給出了一些對大樂透假說的回應,大樂透假說出現(xiàn)的前提是當learning rate很小,或者unstructured(做Weight pruning )時候才有可能出現(xiàn)大樂透假說現(xiàn)象。

所以大樂透假說,? 未來尚待更多的研究來證實

2. Knowledge Distillation

Knowledge Distillation的精神和?Network Pruning 其實也有一些類似的地方

Knowledge Distillation做法如下:首先我們先train一個大網(wǎng)絡,叫Teacher Net。student network是去根據(jù)這個 Teacher Network 來學習。學生 不是去看這個圖片的正確答案來學習、他把老師的輸出?就當做正確答案。

這樣做是因為:直接 Train 一個小的 Network 往往結(jié)果就是沒有從大的 Pruning 來得好

Knowledge Distillation其實不是新的技術(shù),最知名的文章其實是Hinton在2015年就發(fā)表了,

Teacher Net其實會提供這個 Student Network 額外的資訊

那其實 Knowledge Distillation 有些神奇的地方、如果你看那個 Hinton 的 Paper 裡面、它甚至可以做到? 光是 Teacher 告訴 Student 哪些數(shù)字之間、有什麼樣的關(guān)係這件事情、就可以讓 Student在完全沒有看到某些數(shù)字的訓練資料下、就可以把那一個數(shù)字學會

這個Teacher Net不一定是一個巨大的network,也有可能是將多個network組合(ensemble)得到的。

(ensemble是機器學習比賽里一個非常常用的技巧,你就訓練多個模型? 然後你輸出的結(jié)果就是多個模型、投票的結(jié)果就結(jié)束了。或者是把多個模型的輸出平均起來,

做個超級ensemble,訓練個100 個模型啊1000個模型,把那麼多的模型的結(jié)果通通平均起來,往往你要在機器學習的 這種 Leaderboard 上面名列前茅,靠的就是這個技術(shù),

network output上做平均,也可以在network參數(shù)上做平均? 在translation作業(yè)里用過,這一招在translation上不知道為什么特別有用)

?關(guān)于Knowledge Distillation的一個小技巧,在softmax函數(shù)基礎上對每個輸出結(jié)果加一個超參數(shù)T(Temperature),這樣會對最后的預測結(jié)果進行一個平滑處理,讓Student Net更好訓練一些。

(softmax就是,你把每一個 Neural 的輸出、都取 Exponential然后再做normalize得到最終 Network 的輸出)

還有人會拿network每一層都拿來train,比如大的有12層,小的6層,可以拿小的第6層像大的12層,小的第3層像大的第6層,往往做比較多的限制,可以得到更好的結(jié)果。

3. Parameter Quantization

Parameter Quantization參數(shù)量化,也可以稱為參數(shù)壓縮。用比較少的空間來儲存一個參數(shù),具體來說有如下幾種方式:

  • 減少參數(shù)精度。對于Weight的精度可能不需要太高就可以獲得一個比較好的效果,比如從64位調(diào)整為32位或者16位等等,這樣就可以減少存儲的數(shù)據(jù)量。
  • Weight clustering(權(quán)重聚類):將神經(jīng)網(wǎng)絡所有weight按數(shù)值接近進行分群,數(shù)值差不多的聚成一類。分幾群事先設定好。然后對每個類取一個值(可以是平均值)替換里面所有的權(quán)值,相當于每一堆只用一個值就可以存儲,這樣存儲的數(shù)據(jù)量也大大減少。
  • 采用信號處理中常用的一種方法:Huffman encoding(哈夫曼編碼),常出現(xiàn)的東西用比較少的bit描述,不常出現(xiàn)的東西用比較多的bit描述,這樣平均起來存儲的數(shù)據(jù)量將大大減少。
  • Q&A:Weight Clustering 要怎麼做 Update、每次 Update 都要重新分群嗎?

    Weight Clustering其實有個簡單做法是,network訓練完后、再直接做 Weight Clustering

    但直接做,可能會導致?Cluster 後的參數(shù)、跟原來的參數(shù)相差太大

    所以 有一個做法是? 我們在訓練的時候要求 Network 的參數(shù) 彼此之間比較接近、你可以把這個訓練的 Quantization 當做是Loss 的其中一個環(huán)節(jié)、直接塞到你的訓練的過程中。讓訓練中達到 參數(shù)有群聚的效果,

    Q&A:每個 Cluster 的數(shù)字要怎麼決定呢? 就是決定好每個 Cluster 的區(qū)間之後取平均。

    weight到底可以壓縮到什么程度呢?最終極的結(jié)果就是,每個weight只需要1bit就可以存下來,? 網(wǎng)絡中的weight要么是+1,要么是-1,像這樣Binary Weights的研究還蠻多的,可以參考的reference如圖:

    那這樣訓練出的網(wǎng)絡效果會不會不太好?這里有一篇文章是binary network里一個經(jīng)典的方法Binary Connect,

    介紹了該方法用于3種數(shù)據(jù)集的圖像分類問題中,結(jié)果發(fā)現(xiàn)BinaryConnect的方法識別錯誤率更小,原文給出的解釋是這種方法給network比較大的限制,會在一定程度上減少overfitting情況的發(fā)生。

    4. Architecture Design(Depth Separable Convolution)

    通過network架構(gòu)的設計 來達到減少參數(shù)量的效果,

    這里介紹一種關(guān)于CNN的減少參數(shù)量的結(jié)構(gòu)化設計。

    首先回顧一下CNN,在 CNN 的 Convolution Layer 裡、每一個 Layer 的 Input 是一個 Feature Map,? 假設輸入有2個channel,對應的filter也是2個channel。假設有4個filter,每個filter都是3*3的,那么輸出就有4個channel。卷積層共有?3?3?2?4=72?個參數(shù)。

    接著介紹Depth Separable Convolution,它分為兩個步驟:

    1. Depthwise Convolution

    它在做卷積的時候與傳統(tǒng)的對圖像做卷積有很大的不同。圖片有幾個channel就對應有幾個filter,每個filter只管一個channel

    但是只做Depthwise Convolution會遇到一個問題,channel和channel之間沒有任何互動,假設某個pattern是跨channel才能看的出來,這種方法無能為力。

    上述過程有?3?3?2=18?個參數(shù)。

    2. Pointwise Convolution

    為了解決無法學習輸入圖像channel與channel之間聯(lián)系的問題,將Depthwise Convolution的輸出結(jié)果用?1x1?的filter做卷積,以4個filter為例,效果如下:

    上述過程有?2?4=8?個參數(shù)。

    將標準CNN和Depth Separable Convolution參數(shù)量做對比,可以發(fā)現(xiàn)Depth Separable Convolution參數(shù)量比CNN要少很多。

    那因為 O 通常是一個很大的值、你的 Channel 數(shù)目你可能開個 256 啊 512 啊。今天常用的 Kernel Size 可能是 3 x 3 或者是 2 x 2

    上述方法為什么有效呢?

    過去有一招Low rank approximation,來減少一層 Network 的參數(shù)量。如果神經(jīng)網(wǎng)絡某一層輸入為N,輸出為M(假設非常大),那么對應的weight就有?N?M?個。這時,如果我們在N和M中間加一層,這一層不用激活函數(shù),直接多插一層,neuron數(shù)目是K?。當K比較小時,參數(shù)量相比于?N?M?會大大減少。比如N和M都是1000,K 可以塞個 20、50。但是這樣的做法會減少W的可能性,本來W可以放任何參數(shù),拆成這樣W的rank ≤ K。

    Depth Separable Convolution其實就是用了把 “1層拆成2層 ”這樣的概念,相當于將CNN中間多加了一層,這樣就可以減少整體網(wǎng)絡的參數(shù)量。

    關(guān)于網(wǎng)絡結(jié)構(gòu)設計方面還有一些文獻參考,感興趣可以看一下里面相關(guān)的內(nèi)容,這里就不多介紹。

    5. Dynamic Computation(動態(tài)計算)

    在前幾個方法裡面想要做的事情、就是單純的把 Network 變小

    而Dynamic Computation讓network可以自適應調(diào)整計算量,比如讓神經(jīng)網(wǎng)絡自適應不同算力的設備,或者同一設備不同電量時對算力的分配。

    為什么不在一個設備上放好多個模型呢?因為需要占更多的空間。

    如何自適應調(diào)整網(wǎng)絡的計算量?讓 Network 自由調(diào)整它的深度,

    這種方式效果到底如何?可以用.. 比較好一點的方法(MSDNet)。

    讓 Network 自由決定它的寬度,。

    強調(diào)一下:是同一個 Network,可以選擇不同的寬度。標一樣顏色的就是同一個 Weight

    事先決定好 在只要用 75% 參數(shù)的時候,某一些neuron不要用到,

    訓練時 就把所有的狀況一起考慮、然後所有的狀況都得到一個 Output,

    上述兩種方法都是人為決定根據(jù)設備不同的算力(比如電量)動態(tài)調(diào)整網(wǎng)絡深度和寬度,

    讓network自行決定、根據(jù)情景 、決定它的寬度或者是深度。比如,對于不同難度的訓練樣本可能需要的層數(shù)也不一樣。

    最后總結(jié)一下,關(guān)于神經(jīng)網(wǎng)絡壓縮(Network Compression)的這幾種方法,它們并不是互斥的,可以先用某一個方法,再接著用剩余的一個或幾個方法,直到滿足壓縮條件。

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的2021 神经网络压缩 (李宏毅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。