深度學(xué)習(xí)模型一般來說是越深越好(深度學(xué)習(xí)的本質(zhì)是不同層級(jí)的特征抽取),當(dāng)然前提是能用各種技巧訓(xùn)練好這個(gè)深度模型。當(dāng)前的深度模型壓縮基本是無損壓縮,或者付出較少的精度代價(jià),所以壓縮的深度模型一般來說會(huì)比直接訓(xùn)練的淺層模型會(huì)有更好的預(yù)測(cè)精度。本質(zhì)上,深度模型的壓縮是通過訓(xùn)練的方法設(shè)計(jì)一個(gè)精度較高的稀疏模型,和自動(dòng)化機(jī)器學(xué)習(xí)類似,最終的模型架構(gòu)由數(shù)據(jù)決定,而不是完全由人工設(shè)計(jì)。另外,由于當(dāng)前的主流機(jī)器學(xué)習(xí)框架都是基于張量(tensor)化的優(yōu)化,而壓縮后的模型每層參數(shù)是稀疏矩陣,其存儲(chǔ)和計(jì)算都需要重新設(shè)計(jì),比如用鏈表來存儲(chǔ)參數(shù)等等,否則無法享受模型壓縮帶來的好處。模型壓縮也給人工設(shè)計(jì)深度模型帶來一些靈感,比如使用更小的卷積核(1X1),量化權(quán)值共享等等。
我們可以從幾種常見的方法來討論當(dāng)前較為常見的模型壓縮方法:
1.模型壓縮最常見的方法是剪枝。對(duì)于已訓(xùn)練好的模型網(wǎng)絡(luò),可以尋找一種有效的評(píng)判手段,將不重要的連接進(jìn)行裁剪來減少模型的冗余。另外,也可以在在訓(xùn)練過程中,對(duì)權(quán)重的更新加L1正則項(xiàng)進(jìn)行誘導(dǎo),使其更加稀疏,使大部分的權(quán)值都為0。也可以在訓(xùn)練中動(dòng)態(tài)進(jìn)行剪枝,具體做法就是在訓(xùn)練過程中將認(rèn)為不重要的連接剪枝,但是往往無法直觀的判斷哪些連接是否重要,因此在這里增加了一個(gè)嫁接的過程,將哪些重要的被裁掉的連接再恢復(fù)回來。通過網(wǎng)絡(luò)嫁接操作的引入,避免了錯(cuò)誤剪枝所造成的性能損失。
2.從信息壓縮的角度來壓縮模型。常見的方法可以對(duì)參數(shù)矩陣進(jìn)行低秩壓縮(如svd),可以將參數(shù)矩陣存儲(chǔ)的連續(xù)變量轉(zhuǎn)化成分類變量(浮點(diǎn)數(shù)轉(zhuǎn)成整數(shù)),然后通過權(quán)值共享進(jìn)一步壓縮矩陣。最后在保存網(wǎng)絡(luò)的時(shí)候還可以使用哈夫曼編碼進(jìn)行進(jìn)一步的壓縮。
3.知識(shí)蒸餾也可以看成模型壓縮的一種方法。知識(shí)蒸餾屬于遷移學(xué)習(xí)的一種,也就是將一個(gè)模型的性能遷移到另一個(gè)模型上。如果訓(xùn)練好的復(fù)雜模型已經(jīng)具有非常好的性能和泛化能力,可以用這個(gè)復(fù)雜模型來作為一個(gè)softtarget來指導(dǎo)另外一個(gè)簡(jiǎn)單模型來學(xué)習(xí),使簡(jiǎn)單模型具有和復(fù)雜模型相近的性能。訓(xùn)練時(shí),簡(jiǎn)單模型有兩個(gè)目標(biāo):一個(gè)是hardtarget,即原始的目標(biāo)函數(shù),為簡(jiǎn)單模型的類別概率輸出與label真值的交叉熵;另一個(gè)為softtarget,為簡(jiǎn)單模型的類別概率輸出與復(fù)雜模型的類別概率輸出的交叉熵,由于softtarget具有更高的熵,它能比hardtarget提供更加多的信息,事實(shí)上,復(fù)雜模型的作用是為了提高label包含的信息量。通過這種方法,可以把模型壓縮到一個(gè)非常小的規(guī)模。模型壓縮對(duì)模型的準(zhǔn)確率沒有造成太大影響,而且還可以應(yīng)付部分信息缺失的情況。