作者:Ranjeet Singh
編譯:ronghuaiyang
導讀
目前,深度學習模型需要大量的計算、內存和能力,這成為我們需要實時推理或在計算資源有限的邊緣設備和瀏覽器上運行模型的瓶頸。能源效率是當前深度學習模型的主要關注點。處理這種效率的方法之一是啟用高效推理。
更大的模型=>更多的內存使用=>更多的能量
剪枝是一種推理方法,它可以有效地生成更小的模型、更高效的內存使用、更高效的能量使用和更快的推理,同時在精度上損失最小,其他類似的技術還有權值共享和量化。深度學習的靈感來自於神經科學領域的幾個方面。在深度學習中剪枝也是一個受生物學啟發的概念,我們將在稍後的文章中討論。
隨著深度學習的進步,最先進的模型變得越來越精確,但這種進步是有代價的。我將在這個博客中討論其中的一些。
第一個挑戰 :模型越來越大
很難通過在線更新來發布非常大的模型。
第二個挑戰:速度
訓練時間以fb.resnet.torch為基準,使用四個M40 gpu。
如此長的訓練時間限制了ML研究人員的生產力。
第三個挑戰:能耗效率
AlphaGo: 1920個cpu和280個gpu,每場3000美元的電費
- 在移動設備上:乾電池
- 在數據中心:增加TCO
解決方案:高效推理算法
- 剪枝
- 權值共享
- 量化
- 低秩近似
- 二值化 / 三元化 網絡
- Winograd轉換
受到生物學啟發的剪枝
人工神經網絡中的剪枝是從人腦的突觸修剪借鑑過來的,在早期童年和青春期開始的時候,許多(哺乳動物)的觸突和軸突會逐漸死亡。剪枝從出生時開始,一直持續到25歲左右。
神經網絡剪枝
網絡通常看起來像左邊的那個:下面一層的每個神經元每個都與上面一層相連,但這意味著我們必須將許多浮點數相乘。理想情況下,我們只需要將每個神經元連接到其他幾個神經元上,這樣可以省去一些乘法,這就是所謂的「稀疏」網絡。
稀疏模型更容易壓縮,我們可以在推理過程中跳過零值,以改進延遲。
如果可以根據神經元的貢獻大小對網絡中的神經元進行排序,那麼就可以將排名較低的神經元從網絡中移除,從而得到一個更小、更快的網絡。
要在移動設備上運行這些深度學習網絡,獲得更快/更小的網絡非常重要
例如,可以根據神經元權重的L1/L2範數進行排序。在修剪之後,準確性會下降(如果排名很聰明,希望不會下降太多),並且網絡通常是疊代地訓練-修剪-訓練-修剪來恢復。如果我們一次修剪得太多,網絡可能會受到嚴重破壞,無法恢復。因此,在實踐中,這是一個疊代過程——通常稱為「疊代剪枝」:修剪/訓練/重複。
權值剪枝
- 將權重矩陣中的單個權重設置為零。這對應於刪除連接,如圖所示。
- 這裡,為了實現k%的稀疏性,我們將權重矩陣W中的各個權重按大小排序,然後將最小的k%設為零。
f = h5py.File("model_weights.h5",'r+')
for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]:
ranks = {}
for l in list(f[『model_weights』])[:-1]:
data = f[『model_weights』][l][l][『kernel:0』]
w = np.array(data)
ranks[l]=(rankdata(np.abs(w),method=』dense』)—1).astype(int).reshape(w.shape)
lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int)
ranks[l][ranks[l]<=lower_bound_rank] = 0
ranks[l][ranks[l]>lower_bound_rank] = 1
w = w*ranks[l]
data[…] = w
單元/神經元 剪枝
- 將權值矩陣中的整列設置為零,即刪除相應的輸出神經元。
- 在這裡,為了達到k%的稀疏性,我們根據權重矩陣的l2範數對列進行排序,並刪除最小的k%。
f = h5py.File("model_weights.h5",'r+')
for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]:
\tranks = {}
for l in list(f[『model_weights』])[:-1]:
data = f[『model_weights』][l][l][『kernel:0』]
w = np.array(data)
norm = LA.norm(w,axis=0)
norm = np.tile(norm,(w.shape[0],1))
ranks[l] = (rankdata(norm,method=』dense』)—1).astype(int).reshape(norm.shape)
lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int)
ranks[l][ranks[l]<=lower_bound_rank] = 0
ranks[l][ranks[l]>lower_bound_rank] = 1
w = w*ranks[l]
data[…] = w
自然,當您增加稀疏性並刪除更多的網絡時,性能將逐步下降。您預期稀疏性與性能之間的退化曲線是什麼?
在MNIST數據集上使用一個簡單的神經網絡結構剪除圖像分類模型的結果,給出如下-
網絡的體系結構
使用代碼生成的圖
要點
許多研究人員認為剪枝是一種被忽視的方法,將得到更多的關注和在實踐中使用。我們展示了如何使用一個非常簡單的神經網絡結構在一個玩具數據集上獲得良好的結果。我認為在實踐中使用深度學習來解決的許多問題與此類似,在有限的數據集上使用遷移學習,所以它們也可以從剪枝中受益。
英文原文:https://towardsdatascience.com/pruning-deep-neural-network-56cae1ec5505
請長按或掃描二維碼關注本公眾號