社群計算機視覺課程文件
視覺Transformer的知識蒸餾
並獲得增強的文件體驗
開始使用
視覺Transformer的知識蒸餾
我們將學習知識蒸餾,這是distilGPT和distilbert這兩種Hugging Face Hub上下載量最高的模型背後的方法!
大概我們都遇到過這樣的老師,他們“教書”的方式就是直接告訴我們正確答案,然後用我們沒見過的問題來考我們,這類似於機器學習模型的監督學習,我們提供一個帶標籤的資料集進行訓練。然而,我們不讓模型在標籤上訓練,而是可以採用知識蒸餾作為替代方案,以獲得一個性能與大型模型相當且速度快得多的更小型模型。
知識蒸餾背後的直覺
想象一下,你被問到這個多項選擇題

如果有人直接告訴你:“答案是德拉科·馬爾福,”這並不能讓你對每個角色與哈利·波特的關係瞭解很多。
另一方面,如果有人告訴你:“我非常確定不是羅恩·韋斯萊,我有點確定不是納威·隆巴頓,我非常確定是德拉科·馬爾福,”這會給你一些關於這些角色與哈利·波特關係的資訊!這正是知識蒸餾正規化下傳遞給學生模型的資訊型別。
神經網路中的知識蒸餾
在論文Distilling the Knowledge in a Neural Network中,Hinton等人受昆蟲的啟發,引入了知識蒸餾的訓練方法。正如昆蟲從幼蟲形態過渡到為不同任務最佳化的成年形態一樣,大型機器學習模型最初可能像幼蟲一樣笨重,難以從資料中提取結構,但它們可以將知識蒸餾到更小、更高效的模型中進行部署。
知識蒸餾的精髓是使用教師網路的預測邏輯來將資訊傳遞給更小、更高效的學生模型。我們透過重新編寫損失函式來實現這一點,使其包含一個蒸餾損失,該損失鼓勵學生模型在輸出空間上的分佈近似於教師模型。
蒸餾損失的公式為

KL損失指的是教師和學生輸出分佈之間的Kullback-Leibler散度。學生模型的總損失被公式化為這個蒸餾損失與地面真實標籤上的標準交叉熵損失之和。
要檢視此損失函式在Python中的實現以及Python中的完整示例,請檢視本節的notebook。
為邊緣裝置利用知識蒸餾
知識蒸餾在AI模型部署到邊緣裝置上時變得越來越重要。部署一個大型模型(例如大小為1GB、延遲為1秒的模型)對於即時應用來說是不切實際的,因為它需要大量的計算和記憶體。這些限制主要歸因於模型的尺寸。因此,該領域已經接受了知識蒸餾,這項技術可以將模型引數減少90%以上,同時效能下降最小。
知識蒸餾的後果(好與壞)
1. 熵增益
在資訊理論中,熵類似於物理學中的熵,它衡量系統內部的“混沌”或無序程度。在我們的場景中,它量化了分佈所包含的資訊量。考慮以下示例
- 哪一個更難記住:
[0, 1, 0, 0]還是[0.2, 0.5, 0.2, 0.1]?
第一個向量[0, 1, 0, 0]更容易記住和壓縮,因為它包含的資訊更少。這可以表示為第二個位置的“1”。另一方面,[0.2, 0.5, 0.2, 0.1]包含更多的資訊。在此基礎上,例如,我們用ImageNet訓練了一個80M引數的網路,然後將其蒸餾(如前所述)成一個5M引數的學生模型。我們會發現教師模型輸出中包含的熵遠低於學生模型。這意味著即使學生模型的輸出是正確的,它也比教師模型的輸出更混亂。這歸結為一個簡單的事實:教師模型的額外引數有助於它更容易區分類別,因為它提取了更多的特徵。這種關於知識蒸餾的觀點非常有趣,並且正在積極研究中,以透過將其用作損失函式或應用受物理學啟發的類似度量(例如能量)來減少學生的熵。
2. 連貫的梯度更新
模型透過最小化損失函式並透過梯度下降更新其引數來迭代學習。考慮一組引數P = {w1, w2, w3, ..., wn},它們在教師模型中的作用是在檢測到A類樣本時啟用。如果一個模糊的樣本類似於A類但屬於B類,模型在錯誤分類後會進行激進的梯度更新,導致不穩定。相比之下,蒸餾過程(使用教師模型的軟目標)促進了訓練過程中更穩定和連貫的梯度更新,從而使學生模型的學習過程更平滑。
3. 在無標籤資料上訓練的能力
教師模型使得學生模型能夠在無標籤資料上進行訓練。教師模型可以為這些無標籤樣本生成偽標籤,學生模型隨後可以使用這些偽標籤進行訓練。這種方法顯著增加了可用的訓練資料量。
4. 視角轉變
深度學習模型通常是基於這樣的假設進行訓練的:提供足夠的資料將使它們能夠近似一個準確表示底層現象的函式F。然而,在許多情況下,資料稀缺使得這一假設不切實際。傳統方法涉及構建更大的模型並迭代微調以實現最佳結果。相比之下,知識蒸餾改變了這種視角:鑑於我們已經有了一個訓練良好的教師模型F,目標是使用一個更小的模型f來近似F。