大型transformer模型已成為最近的主流,在處理各種不同的任務上都獲得了很好的結果。大型transformer功能強大,但在計算效能和記憶體方面都有極高的要求,因此大型transformer的訓練和使用成本非常高,這也造成使用transformer大規模解決真實世界任務時的一個大瓶頸。為什麼大型transformer模型的推理執行如此困難?除了最先進模型規模的增加外,還有兩個主要因素導致推理挑戰(Pope等人,2022年):
在這篇文章中,我們將探討幾種使transformer推理更高效的方法。有些是通用的網路壓縮方法,而其他則是專門針對transformer架構的。
知識蒸餾(KD;Hinton等人,2015年,Gou等人,2020年)是一種直接的方法,通過將預訓練的昂貴模型(「教師模型」)的內容轉移到較小、較便宜的模型(「學生模型」)中來加速推理。知識蒸餾法對於學生模型的建構方式沒有太多限制,除了需要與教師模型有相符的輸出空間來建構合適的學習目標。
一個早期成功的嘗試是DistilBERT(Sanh等人,2019年),它能夠將BERT的參數減少40%,同時在微調的任務上保持BERT 97%的性能,執行速度提高71%。DistilBERT的預訓練損失是軟蒸餾損失、監督訓練損失(即BERT的遮蔽語言模損失)和一個特殊的餘弦嵌入損失的組合,以對齊教師和學生之間的隱藏狀態向量。蒸餾可以很容易地與量化、剪枝或稀疏化技術結合,其中教師模型是原始的全精度、密集模型,而學生模型為了達到更高的稀疏度是量化的、剪枝的或修剪的模型。
對深度神經網路應用量化有兩種常見方法:
我們應該注意理論上最佳量化策略與硬體支援之間的差距。由於缺乏對某些類型矩陣乘法的GPU核心的支持(例如INT4 x FP16),並非所有的方法都能在實際推理中實現加速。
神經網路剪枝是通過修剪不重要的模型權重或連接來減少模型大小,同時保持模型容量。它可能需要或不需要重新訓練。另外剪枝可以是非結構化的或結構化的。
建構剪枝網路的常規工作流程有三個步驟:
通過網路剪枝在密集模型中發現稀疏結構,同時稀疏網路仍能保持類似性能的想法,是受彩票假說[1]的啟發:隨機初始化的密集前饋網路包含一池子子網路,其中只有一個子集(稀疏網路)是「中獎彩票」,在單獨訓練時可以達到最佳性能。