機器學習工程與系統
剪枝(pruning)
/ PROO-ning /
剪枝,是透過刪掉那些幾乎沒什麼貢獻的部分——也就是去掉之後幾乎不改變答案的連接或神經元——把一個練好的模型變小。這名字來自園藝:一棵樹,往往在你剪去枯死和多餘的枝條後,長得更健康、更俐落。神經網路也類似地長得過於茂盛;訓練時給它的連接,遠多於它最終所需,所以一大部分都能被剪掉而損失甚微。
實操中,你給每個權重或神經元打個分,看它有多要緊——往往就看它有多小,依據是「接近零的權重幾乎影響不了什麼」——再把最不重要的那些置為零、或徹底移除。通常接著你會把修剪過的模型短暫地微調一下,讓它緩過來,就像一株被剪過的植物重新抽芽。結果是一個參數更少的模型,存起來更便宜,理想情況下跑得也更快。
為什麼這很重要:剪枝能把模型顯著縮小,而且它與量化天然地搭配,便於在受限的硬體上部署。但有一個新手會錯過的誠實陷阱:刪掉零零散散的單個權重(非結構化剪枝)造出的模型,紙面上更小,實際卻往往並不更快,因為普通硬體沒法高效地跳過那些零——它照樣老老實實地「乘以零」。真正的提速,通常要靠結構化剪枝,把整塊整塊、硬體真能跳過的部分拿掉,而那往往要付出更多準確度。剪枝有用,可它的好處很容易被誇大。
某一層有 1000 條連接,可其中 600 條所帶的權重逼近於零,把它們清零幾乎不挪動輸出。剪掉這 600 條,再短暫微調讓它緩過來,這一層就以 40% 的連接,保住了幾乎一樣的準確度。
剪去那些近乎枯死的連接,再略加重訓——模型更小,答案幾乎照舊。
一個「剪掉了 90%」的模型,並不自動就快了 90%,甚至未必更快。要是沒有真能利用那些缺失部分的硬體和軟體,那些零照樣會被算一遍。務必查清:你的執行時是否真的把稀疏變成了速度。
又稱
另見