天天看點

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

作者:AITIME論道

王梓楓

美國東北大學博士生,主要研究方向持續學習(Continual Learning)。

個人首頁:https://kingspencer.github.io/

報告題目

SparCL: 邊緣裝置上的稀疏持續學習

SparCL: Sparse Continual Learning on the Edge (作者團隊來自Northeastern University)

最近在看2022NeurIPS關于連續學習的文章,不得不感歎nips的文章太“Mathy”了!這對于我這種數學功底薄弱的人很不友好,許多文章看下來都是一知半解。不過這篇SparCL并沒有太多數學推導的内容,而且文章寫得清晰易讀,閱讀過程中的疑問往下讀一讀就被解答了。

說回這篇本章本身,SparCL的效果比State of the art提升不多,其主要優勢在于訓練效率的提升,這種特性能有效适配最需要連續學習加持的邊緣裝置(如家用機器人等),這為連續學習在實際應用場景中的落地創造了有利條件。接下來我們就詳細解讀一下這篇文章。

01

什麼是剪枝?

首先,我們講一下Sparsity以及剪枝(pruning)。

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

神經網絡示意圖,圓圈表示neuron,連線表示weights

在一個訓練好的神經網絡中,最經典的剪枝方法是統計所有權重的大小,将數值大的權重保留,将數值小的權重置0,他們的比例sparse ratio是人為确定的。值得注意的是,這裡的置0也不是真的把權重數值改成0,而是使用一個binary mask,在用到神經網絡時用這個mask來進行篩選操作。

除了最簡單的直接看權重大小,還有很多其他的剪枝方法,比如通過檢視梯度值大小,以及用到黑賽矩陣等更fancy的方法,這裡不再贅述。

02

為什麼要剪枝?

經常看到文章說,隻用5%的權重,就能達到多少多少的性能。這傳遞了一種剪枝似乎能夠降低模型大小,加速訓練的功效。但我細想之後就産生了疑問,如果模型中很多權重直接設定為0,那麼這些0也是浮點數,同樣要占據空間的呀。此外,如果是用mask來達到置0的目的,這儲存開銷甚至還要增大不少吧。對這個疑問在網上搜尋了一番,可能是關鍵詞不對,竟沒有找到太多資料。最終找到了一些(不是很權威但make sense的)解釋:

剪枝分為structured 剪枝和unstructured 剪枝

前者可以把權重tensor做整行消除的操作,相當于減少了全連接配接層的一個neuron或者一個卷積層的channel,這确實可以壓縮模型。(但這并不是sparsity領域的主要研究方向)

後者unstructured 剪枝是sparsity領域的主要研究内容,這多了個mask,其實并沒有在空間上以及時間上提高效率。此外,目前的gpu搞稀疏矩陣乘法的效率反而比正常模型效率更低。

03

剪枝的意義在哪?

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

通過剪枝可以提升模型性能

如果不能提高效率,那剪枝到底有啥用呢?可以概括為以下三點:

一些剪枝算法可以提高模型性能。比如上圖中紅色實線為一篇文章提出的剪枝方法,在保留權重比例大于7%的時候,剪枝後的模型準确率都有所提高。

有理論上的價值。比如 Lottery Ticket Hypothesis 就提供了why deep learning works的解釋。

雖然單獨的剪枝不能壓縮模型,但和模型蒸餾(Distillation)結合使用,确實可以達到減小模型大小的目的。

Sparse Continual Learning (SparCL)

鋪墊了一些背景知識後,我們來看這篇文章的主要内容。SparCL定位為一個插件型的算法,其對memory bank有獨特的設計,是以這個插件型算法僅能用在 rehearsal-based 的連續學習算法上。文章中的實驗也主要是将SparCL與ER和DER++這兩個算法結合來驗證其有效性。

具體地,SparCL模型分為三個部分:

Task-aware Dynamic Masking (TDM) for weight sparsity

Dynamic Data Removal (DDR) for data efficiency

Dynamic Gradient Masking (DGM) for gradient sparsity

這三個部分有着各自的目标。TDM是最接近正常剪枝算法的,其目的是實作權重的稀疏化。DDR則是本文中提升訓練效率的主要因素,其能使得訓練資料被更高效地利用。DGM将權重稀疏化的思路用在了梯度稀疏化上面,希望能進一步提升模型在連續學習任務上的表現。

Task-aware Dynamic Masking (TDM)

TDM使得模型在訓練過程中,通過維護一個mask,來定期地去除不重要的權重,并适時地增加未使用權重來增強模型的表征能力。

04

如何來确定各個權重的重要性呢?

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

Continual weight importance (CWI)

用CWI公式來計算各權重的重要性,其中第一項是權重的絕對值大小,第二項是目前任務訓練時的梯度,第三項是包含所有過去類資料 (memory buffer) 計算出的梯度。這三者對總重要性的影響通過系數alpha和beta來調控。

ps:公式中的 Dt表示目前任務的資料集, θ表示模型參數, M表示memory buffer, L表示囊括了模型和算法的損失函數。這裡第二項的 L~ ,表示在對目前任務資料集訓練時,分類頭将非目前類的output neuron給mask掉了,是和第三項中使用memory buffer的完整模型有差別,是以用tilde加以區分。

接下來我們看TDM的詳細算法步驟圖

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

這個算法步驟圖中,最關鍵的是 inter-task adjustment 和 intra-task adjustment

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

上圖中(a)為inter-task adjustment. 在每次引入新任務時,因為在上一個任務的訓練時,已經充分将留存的sparse權重訓練過了,如果直接訓練新任務,那麼很有可能将對上一個任務重要的權重更改。是以,先對模型expand,“故意”留一些空白權重出來,讓新任務的knowledge更多地被這些空白權重學到,這樣就不會mess up之前任務的權重了。然後在訓練過 delta k step 之後,再shrink使得模型恢複之前的sparse ratio。

圖中(b)為intra-task adjustment. 這裡采用了先shrink 再 expand 來更新mask的方法。通過将less important的weights 除掉,然後一段時間後再随機增加weights來恢複模型的learning capacity。

Dynamic Data Removal

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

我們前面已經分析過,靠正常的網絡稀疏化是無法提升效率的。那本文的最大特色訓練速度大幅提升是怎麼實作的呢?就是通過這裡的DDR實作的。

DDR是一個非常簡單的方法,它通過訓練過程中各個資料項的錯誤分類次數,判斷誰是easy example,誰是hard example,然後将easy examples從訓練資料中删掉。

具體地,在TDM算法中,每 δk個epoch會進行一個intra-task adjustment,那麼這裡DDR在這intra-task adjustment時就來做data removal。Kt為目前任務的總epoch數;δk為進行intra-task adjustment的inverval;是以 Nt即為進行intra-task adjustment 的次數。

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

ρ是人為設定的removal ratio;cutoff是執行data removal的次數,下方公式表示一共 Nt次intra-task

adjustment,隻有前cutoff次執行data removal,每次remove ρi 的資料。

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

這個DDR在減少了訓練資料量的同時,還産生了一些其他的效果:

由于訓練資料中少了那些easy example,那麼在每個任務結束時将目前資料集添加進memory buffer時,就能把那些更hard、更imformative的example添加進去。

rehearsal-based方法通常還會面臨資料不平衡問題。因為memory buffer通常不能太大,這樣current task dataset和memory buffer的大小比例就會比較懸殊。而這裡對訓練資料進行了“瘦身”,是以能有效緩解這個不平衡問題。

關于這個DDR,我還想再說幾句。這個思想借鑒了機器學習裡非常經典的ensamble learning的adaboost算法。adaboost是通過順序性訓練多個小模型內建而得到一個大的模型。每次訓練小模型後,會根據misclassification來給資料賦予不同的權重,增加分類錯誤的的資料的權重,減少分類正确的錯誤的權重,這樣後面的模型就會将主要的精力放在解決那些hard的example上。

那這個思路為什麼似乎在深度學習任務上很少見到呢?我認為主要是深度學習的資料集通常都很大。比如訓練imagenet時,一個epoch就要跑很久。而對一個example來說,至少需要好幾次的試驗才能做出合理判斷,是否這個真的很easy,可以丢棄掉。那麼經過很多epoch試出來哪些是easy的,哪些是hard的,可能模型就差不多收斂了。

但是這個思路真的很适合要跑很多個epoch的小資料集,連續學習任務目前都是在MNIST、CIFAR10、TinyImagenet等小資料集上訓練。尤其是在Class-IL情形中,把資料集給split成更小的幾份,就更加适合了。是以這個idea可以着重記一下,有可能可以作為一個general的trick來用到所有的連續學習任務上。

Dynamic Gradient Masking

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

這部分的算法通過CGI (Continual Gradient Importance) 計算訓練過程中各個梯度的重要性。這個CGI的計算和權重重要性(CWI)很相似,除了沒有CWI的第一項權重的絕對值,其餘兩個部分是一樣的。

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

将計算出的重要性通過mask的方式,來将稀疏梯度更新到網絡上。

這個子產品使得訓練能夠focus在更重要的梯度上,同時也能夠使得一部分權重沒有更新,這為不遺忘在過去任務上學到的知識提供了途徑和空間。

05

實驗部分

SparCL将Sparsity用在連續學習任務,相同表現下訓練效率提升23倍

通過實驗結果可以看出,SparCL确實能夠在很高的sparsity的情況下達到比SOTA(DER++)還要好一些的結果。稀疏性即使達到95%也還是有很高的準确率。而且準确率會随着我們增大buffer size而增加。

06

總結

這篇文章講的這個關于sparsity的故事完整性很好,不過我最大的收獲反而是data removal的方法,我認為這個方法應該對于所有的連續學習算法都有借鑒意義,之後也會嘗試跑一跑其代碼,實際感受一下本方法的效果。

繼續閱讀