由于我們的深度學(xué)習(xí)模型都部署在移動(dòng)端,所以本篇就來總結(jié)一下深度學(xué)習(xí)模型壓縮的方法。
相對(duì)于服務(wù)器,移動(dòng)端的存儲(chǔ)空間、計(jì)算資源都非常有限,但是深度學(xué)習(xí)本身的特點(diǎn),參數(shù)量大,模型復(fù)雜,導(dǎo)致深度學(xué)習(xí)在移動(dòng)端的部署非常非常困難。因此深度學(xué)習(xí)模型的壓縮和加速是深度學(xué)習(xí)研究領(lǐng)域一個(gè)重要的分支。
深度學(xué)習(xí)模型壓縮和加速主要有以下幾個(gè)方向:更小更快的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)、模型裁剪以及核稀疏化、量化、Low-rank分解、知識(shí)蒸餾。
- 更小更快的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)
很多時(shí)候我們用vgg、resnet等大型網(wǎng)絡(luò)跑完模型,如果要部署在計(jì)算能力不足的客戶端,我們往往會(huì)把這些網(wǎng)絡(luò)換成更小更快、但特征提取的效果也不會(huì)下降太多的網(wǎng)絡(luò),比如mobileNet(v1、v2、v3)、shuffleNet(v1、v2)、squeezeNet等。 - 模型裁剪以及核稀疏化
結(jié)構(gòu)復(fù)制的模型有比較好的性能,但是參數(shù)也存在冗余,因此對(duì)于訓(xùn)練好的模型,可以對(duì)模型中不重要的連接和神經(jīng)元進(jìn)行裁剪。那么問題就變?yōu)槭裁礃拥倪B接和神經(jīng)元是不重要的呢?其實(shí)我們思考一下,網(wǎng)絡(luò)結(jié)構(gòu)是由一層一層的神經(jīng)元通過有權(quán)重的邊連接的,如果有些權(quán)重比較小,對(duì)于下一層的神經(jīng)元的影響就比較小,我們可以認(rèn)為這樣的邊是不重要的。而核稀疏化,是在訓(xùn)練過程中,對(duì)權(quán)重的更新加以正則項(xiàng)進(jìn)行誘導(dǎo),使其更加稀疏,使大部分的權(quán)值都為0。 - 量化
我們可以通過各種模型壓縮的方法對(duì)模型進(jìn)行壓縮優(yōu)化,但是很多時(shí)候,對(duì)于移動(dòng)端的算力來說還是會(huì)有點(diǎn)吃力,因此對(duì)于移動(dòng)端的推理運(yùn)算,我們往往還要做量化操作,最普遍的就是float32量化成int8的操作。當(dāng)然還有二值化等量化方法,但沒有int8量化常用。 - Low-rank分解
Low-rank分解有很多種,如cp分解、svd分解、tucker分解、張量列分解。它們的主要思想都是通過參數(shù)矩陣的分解達(dá)到減少計(jì)算量的目的。 - 知識(shí)蒸餾
知識(shí)蒸餾的主要思想是把一個(gè)大模型的性能遷移到一個(gè)小模型上。通過已經(jīng)訓(xùn)練好的大模型的指導(dǎo),來指導(dǎo)小模型的訓(xùn)練,使小模型的訓(xùn)練可以達(dá)到跟大模型接近的性能。
接下來的文章會(huì)按照以上綜述分別介紹各個(gè)方向具體的方法。