tensorflow 训练权重不更新_TensorFlow模型剪枝原理
本文是對(duì)論文“To prune, or not to prune: exploring the efficacy ofpruning for model compression”的摘抄。這篇文章是TensorFlow模型優(yōu)化工具文檔中推薦的,作者M(jìn)ichael H. Zhu,來(lái)自斯坦福大學(xué)。在這里可以找到論文原文。背景
對(duì)于資源有限的移動(dòng)終端設(shè)備來(lái)說(shuō),內(nèi)容帶寬通常是一個(gè)重要的限制因素。模型壓縮至少有兩點(diǎn)好處:減少耗電的內(nèi)存訪問(wèn)次數(shù);同等帶寬下提升壓縮模型參數(shù)的獲取效率。剪枝將不重要的模型權(quán)重歸零,實(shí)現(xiàn)了模型壓縮的同時(shí)只帶來(lái)了較小的質(zhì)量損失。剪枝之后的模型是稀疏的,在支持稀疏矩陣加速運(yùn)算的硬件上可以進(jìn)一步獲得加速效果。
國(guó)冰提示:英偉達(dá)的第三代張量核心(Tensor Core)對(duì)于稀疏矩陣的運(yùn)算有約5倍的性能提升。這一點(diǎn)我們?cè)谖恼隆癛TX30系列,香嗎”中有過(guò)介紹。在模型內(nèi)存足跡(memory footprint)一定的前提下,如何獲得最準(zhǔn)確的模型,是本文的核心內(nèi)容。作者通過(guò)對(duì)比兩種模型來(lái)回答這個(gè)問(wèn)題。第一種,先訓(xùn)練一個(gè)大模型,然后通過(guò)剪枝將其轉(zhuǎn)換為一個(gè)強(qiáng)稀疏模型;第二種,直接訓(xùn)練一個(gè)非稀疏模型,尺寸與稀疏模型相當(dāng)。在具體的模型架構(gòu)與任務(wù)上,作者做出以下選擇:
圖像分類:Inception V3與MobileNets
序列分析:stacked LSTMs與seq2seq
90年代的剪枝通過(guò)將權(quán)重置零時(shí)網(wǎng)絡(luò)損失函數(shù)增量的二階泰勒級(jí)數(shù)近似來(lái)實(shí)現(xiàn)。最近的工作中,基于數(shù)量級(jí)的權(quán)重剪枝開(kāi)始流行。這種方式簡(jiǎn)單易行,并且適用于大型網(wǎng)絡(luò)與數(shù)據(jù)集。本文通過(guò)剪去最小數(shù)量級(jí)的權(quán)重來(lái)控制模型稀疏程度。這種策略不需要人工選擇權(quán)重閾值,不僅適用于CNN也可以用于LSTM。
方案作者在TensorFlow的基礎(chǔ)上實(shí)現(xiàn)了訓(xùn)練中剪枝。針對(duì)每一個(gè)選定的layer,增加同尺寸同形狀的二元mask變量作為該layer的權(quán)重張量,并決定在哪個(gè)權(quán)重參數(shù)參與網(wǎng)絡(luò)的前向傳播。同時(shí),在訓(xùn)練圖中注入算子對(duì)該層的權(quán)重按照絕對(duì)值大小排序,將最小的權(quán)重置零直到該層的稀疏程度達(dá)到預(yù)定指標(biāo)。反向傳播的梯度同樣會(huì)經(jīng)過(guò)該二元mask,但是不會(huì)更新被置零的權(quán)重。
稀疏程度隨著訓(xùn)練的進(jìn)程逐漸增加,并滿足公式:
其中si為初始稀疏率,sf為最終稀疏率,n為修剪總步數(shù),t為訓(xùn)練步數(shù),Δt為修剪頻率。
二元mask每Δt更新一次,這有助于網(wǎng)絡(luò)的準(zhǔn)確率從修剪后的狀態(tài)逐步恢復(fù)。作者的實(shí)驗(yàn)表明當(dāng)Δt的取值在100到1000之間時(shí)剪枝對(duì)最終的模型質(zhì)量影響可以忽略。一旦模型達(dá)到預(yù)定的稀疏指標(biāo),權(quán)重mask停止更新。按照稀疏率變化公式,訓(xùn)練早期頻繁剪枝,隨著訓(xùn)練進(jìn)展,剪枝的頻率越來(lái)越低——因?yàn)榭晒┘糁Φ臋?quán)重越來(lái)越少。如下圖所示。
實(shí)際剪枝過(guò)程中,網(wǎng)絡(luò)會(huì)先訓(xùn)練若干epoch或者加載一個(gè)已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),這就決定了t0。參數(shù)n則很大程度上取決于學(xué)習(xí)率曲線。作者觀察到隨著學(xué)習(xí)率的下降,剪枝后的模型準(zhǔn)確率可能會(huì)很難恢復(fù)過(guò)來(lái)。反過(guò)來(lái),過(guò)高的學(xué)習(xí)率則可能導(dǎo)致權(quán)重在收斂到較優(yōu)值之前被剪掉。因此需要將兩者緊密結(jié)合起來(lái)。例如上圖中,對(duì)Inception V3剪枝的過(guò)程安排在學(xué)習(xí)率相對(duì)較大的階段。
下圖則展示了訓(xùn)練過(guò)程中模型準(zhǔn)確率的變化。對(duì)于稀疏率達(dá)87.5%的模型,隨著稀疏程度的上升,模型經(jīng)歷了“幾乎災(zāi)難性”的衰退,但是隨后又很快恢復(fù)了過(guò)來(lái)。這種現(xiàn)象在高稀疏率的模型中更加常見(jiàn)。
下表展示了稀疏程度與模型準(zhǔn)確率之間的關(guān)系。隨著稀疏程度的增加,模型的準(zhǔn)確率開(kāi)始下降。不過(guò)即便有一半的權(quán)重被裁剪,模型的準(zhǔn)確率也只下降了一點(diǎn)。
比較“大稀疏”與“小密實(shí)”模型對(duì)于緊湊模型來(lái)說(shuō)剪枝仍然是有效的,可以與width multiplier相比。同等大小的模型,稀疏模型優(yōu)于非稀疏模型。訓(xùn)練也很簡(jiǎn)單,只是初始學(xué)習(xí)率小10倍。
國(guó)冰提示:
這一章節(jié)的模型都為常見(jiàn)模型,且數(shù)據(jù)較多,因此只說(shuō)結(jié)論。感興趣的讀者可以查閱原文。另外兩個(gè)子章節(jié)涉及模型與圖像無(wú)關(guān),故此跳過(guò)。
討論稀疏模型的內(nèi)存足跡包括非零參數(shù)的保存以及索引它們所需的數(shù)據(jù)結(jié)構(gòu)。模型剪枝可以減少非零參數(shù)之間的連接數(shù),但是稀疏矩陣的存儲(chǔ)不可避免的減小了壓縮率。無(wú)論權(quán)重是否為0,二元mask稀疏矩陣都需要為之存儲(chǔ)1bit,同時(shí)還需要一個(gè)向量存儲(chǔ)非0值。無(wú)論稀疏率的大小,這部分開(kāi)銷無(wú)法避免。
另外,大稀疏模型比同體積非稀疏模型的表現(xiàn)更好。而且隨著模型規(guī)模的擴(kuò)大,這種差異越發(fā)明顯。
總結(jié)經(jīng)過(guò)剪枝之后的稀疏大模型要優(yōu)于同體積的非稀疏模型。作者提出的遞進(jìn)剪枝策略可以廣泛的應(yīng)用于各種模型。有限資源環(huán)境下,剪枝是有效的模型壓縮策略。深度學(xué)習(xí)加速硬件應(yīng)當(dāng)將稀疏矩陣的存儲(chǔ)與運(yùn)算提供支持。
TensorFlow支持剪枝,請(qǐng)參閱官方文檔:https://www.tensorflow.org/model_optimization/guide/pruning/針對(duì)HRNet的剪枝可能會(huì)晚一點(diǎn)。因?yàn)槟壳凹糁Σ恢С?subclassed model。參見(jiàn)issue:https://github.com/tensorflow/model-optimization/issues/155
??推薦閱讀??
總結(jié)
以上是生活随笔為你收集整理的tensorflow 训练权重不更新_TensorFlow模型剪枝原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 畅捷通t+标准版操作手册_外网IP访问畅
- 下一篇: u盘扩容软件_扩容盘的认识与检测和量产还