天天看點

《卷積神經網絡的壓縮與加速》概述

  1. 有四種常用方法:網絡剪枝,模型量化,低秩估計,模型蒸餾。
  2. 網絡剪枝主要有下列幾種方法:filter-level剪枝(通過删除filter來減少通道數量),group-level剪枝即kernel-size縮小(如将33變成32,或者3*3變成固定形狀包含若幹個0的新核),稀疏卷積的方法(fine-grained,vector-level,kernel-level,稀疏矩陣乘法相比于稠密矩陣乘法,可以顯著減少存儲空間和計算開銷)。以上三種方法都面對同一個問題,怎麼選擇裁剪掉哪些參數。一般有兩種方法來識别:損失函數對參數的二階導數最小(二階導數越小,代表這個參數的更新對損失函數的下降貢獻越小,可保證損失函數不變,???),參數絕對值最小(表示輸出特征圖與該參數幾乎無關,可保證輸出特征圖不變)。
  3. 低秩估計:将原來的卷積過程,先用11的核降維,做完卷積運算,再用11的核升維。所謂的秩我了解代表的就是降維的程度。低秩估計方法存在一個待解決的問題,就是保留多少秩是不明确的。保留太多的秩可以保證準确率,但加速壓縮效果不好;保留秩太少,加速壓縮效果好,但準确率很難保證。曾經有工作提出先訓練低秩的參數矩陣,即在損失函數中加入對參數矩陣秩的考慮,然後再對訓練好的低秩網絡做低秩估計,由于本身參數矩陣中很多列向量都是線性相關的,是以可以保留很少的秩進行分解。
  4. 模型量化:通常指的是模型的定點化,比如将float32轉換成int8的運算,首先會有一個根據參數的最大值和最小值進行的浮點轉定點的運算,然後對定點後的資料進行加乘運算,運算結果再複原為float值。這個過程中輸入和權值都得量化。
  5. 模型蒸餾:不是對現有的網絡進行改進,而是直接設計一個小網絡。怎麼保證小網絡的準确率呢?首先訓練一個大網絡,然後用大網絡來指導小網絡。具體的做法是,小網絡的結構和大網絡是一樣的(blob結構相同),然後給小網絡設計了一個聯合的損失函數,一部分是正常的任務損失函數,另一部分是指導損失函數(是各個blob的大小網絡輸出特征圖的均方誤差)。這個聯合損失函數可以引導小網絡盡可能學習大網絡的參數,并且達到很好的任務準确率。有實驗經驗表明,如果先單獨對指導損失函數進行訓練,然後再加入任務損失函數聯合訓練,得到的模型效果将會比直接聯合訓練得到的模型好很多。

繼續閱讀