深度學習論文筆記(知識蒸餾)——Distilling the Knowledge in a Neural Network

主要工作

  • 提出一種知識蒸餾的方法,可以壓縮模型,讓小模型達到與集成亦或是大型模型相似的性能
  • 提出一種新的集成學習方法,可以讓模型訓練速度更快,並且是並行訓練

本文只總結第一點


motivation

大型模型往往不適合線上部署,一方面是計算資源消耗大,另一方面是響應速度慢,因此Hinton便考慮是否可以將大模型的知識遷移到小模型上,這裏有兩個問題


大型模型知識遷移到小型模型後,小型模型應該具有什麼樣的表現
最終目的是讓小型模型的泛化能力和大型模型一致。


什麼是模型的知識呢?

將知識看成是模型參數不合適,這太過複雜且難以入手,結合上一個疑問,個人認爲,可以把模型知識抽象爲泛化能力,如何讓小型模型學得大型模型的泛化能力呢?在此之前,先了解一下什麼是soft target。

對於分類模型而言,模型的輸出是softmax,例如一個貓狗豬的三分類,對於一張狗的圖片,模型輸出爲
[0.1,0.89,0.01] [0.1,0.89,0.01]
那說明大型模型認爲這張圖片屬於狗,但具有一些貓的分類特徵,大型模型的輸出含有兩方面信息,一是這張圖片屬於什麼類,二是與這張圖片相似的類是什麼,大型模型的輸出又被稱爲是soft target(也有些變化,計算公式在下面),hard target即爲one hot編碼,相比於soft target,hard target的信息較少,只能表明一張圖片是什麼類別。

回到原先的問題,如果讓小型模型去擬合大型模型的soft target,以期讓小型模型學會像大型模型一樣思考,那麼小型模型的泛化能力不就可能和大型模型一致了嗎?這便是論文的出發點。


method

更具體一點,論文將softmax的輸出更改爲:
在這裏插入圖片描述
大型模型與小型模型的輸出均採用上式計算,採用上式計算的大模型輸出即爲soft target

T爲超參數,T越大,可以產生更加soft的target,爲什麼要引入一個超參數呢?首先不論是否引入T,小型模型都是擬合大型模型的輸出,簡單舉個例子,假設大型模型的輸出爲
[0.1,0.89,.0.01][0.1,0.89,.0.01]
小型模型的輸出爲
[P1(x),P2(x),P3(x)][P_1(x),P_2(x),P_3(x)]
則交叉熵損失函數爲
[0.1logP1(x)+0.89logP2(x)+0.01logP3(x)] -[0.1\log P_1(x)+0.89\log P_2(x)+0.01\log P_3(x)]
第二項對於損失函數的取值影響很大,如果小型模型的輸出爲[0.3,0.67,0.03],那麼交叉熵損失函數值大致爲0.7,如果設置T爲2,交叉熵損失函數值大致爲1.62,比前者大很多,而小型模型的輸出離大型模型還是有差距的,所以設置一個超參數T,可以讓小型模型更好的擬合大型模型的輸出。

換個角度來看,hard target只能表明圖片是什麼,而soft target還可表明與該圖片相似的類別是什麼,knowledge distillation相當於一種監督信息的彌補。

記採用soft target的交叉熵損失函數爲LsoftL^{soft}(小型模型的輸出也要除以T後計算softmax),採用hard target的交叉熵損失函數爲LhardL^{hard},單純使用soft target的確可以使用不需要標記的數據訓練小型模型,但是Hinton發現聯合使用兩個損失函數效果更佳,如下
L=αLsoft+(1α)LhardL=\alpha L^{soft}+(1-\alpha) L^{hard}

通常α\alpha的取值較大,具體流程如下圖所示

在這裏插入圖片描述

實驗

有一個實驗結果效果非常驚人,如下:
在這裏插入圖片描述
僅使用了3%的訓練數據,便能得到與使用100%訓練數據的模型的效果,這說明soft target的監督能力足夠強勁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章