1. 程式人生 > 實用技巧 >知識蒸餾:如何用一個神經網路訓練另一個神經網路

知識蒸餾:如何用一個神經網路訓練另一個神經網路

點選上方“AI公園”,關注公眾號,選擇加“星標“或“置頂”


作者:Tivadar Danka

編譯:ronghuaiyang

導讀

知識蒸餾的簡單介紹,讓大家瞭解知識蒸餾背後的直覺。

如果你曾經用神經網路來解決一個複雜的問題,你就會知道它們的尺寸可能非常巨大,包含數百萬個引數。例如著名的BERT模型約有1億1千萬引數。

為了說明這一點,參見下圖中的NLP中最常見架構的引數數量。

各種模型結構的引數數量

在Kaggle競賽中,勝出的模型通常是由幾個模型組成的集合。儘管它們在精確度上可以大大超過簡單模型,但其巨大的計算成本使它們在實際應用中完全無法使用。

有沒有什麼方法可以在不擴充套件硬體的情況下利用這些強大但龐大的模型來訓練最先進的模型?

目前,有三種方法可以壓縮神經網路,同時保持預測效能:

  • 權值裁剪

  • 量化

  • 知識蒸餾

在這篇文章中,我的目標是向你介紹“知識蒸餾”的基本原理,這是一個令人難以置信的令人興奮的想法,它的基礎是訓練一個較小的網路來逼近大的網路。

什麼是知識蒸餾?

讓我們想象一個非常複雜的任務,比如對數千個類進行影象分類。通常,你不能指望ResNet50能達到99%的準確度。所以,你建立一個模型集合,平衡每個模型的缺陷。現在你有了一個巨大的模型,儘管它的效能非常出色,但無法將其部署到生產環境中,並在合理的時間內獲得預測。

然而,該模型可以很好地概括未見的資料,因此可以放心地相信它的預測。(我知道,情況可能不是這樣的,但我們現在就開始進行思維實驗吧。)

如果我們使用來自大而笨重的模型的預測來訓練一個更小的,所謂的“學生”模型來逼近大模型會怎麼樣?

這本質上就是知識的蒸餾,這是由Geoffrey Hinton、Oriol Vinyals和Jeff Dean在論文Distilling the Knowledge in a Neural Network中介紹的。

大致說來,過程如下。

  1. 訓練一個能夠效能很好泛化也很好的大模型。這被稱為教師模型

  2. 利用你所擁有的所有資料,計算出教師模型的預測。帶有這些預測的全部資料集被稱為知識,預測本身通常被稱為soft targets。這是知識蒸餾步驟。

  3. 利用先前獲得的知識來訓練較小的網路,稱為學生模型

為了使過程視覺化,見下圖。

知識蒸餾

讓我們關注一下細節。知識是如何獲得的?

在分類器模型中,類的概率由softmax層給出,將logits轉換為概率:

其中:

是最後一層生成的logits。替換一下,得到一個稍有修改的版本:

其中,T是一個超引數,稱為溫度。這些值叫做soft targets。

如果T變大,類別概率會變軟,也就是說會相互之間更加接近,極端情況下,T趨向於無窮大。

如果T = 1,就是原來的softmax函式。出於我們的目的,T被設定為大於1,因此叫做蒸餾

Hinton, Vinyals和Dean證明了一個經過蒸餾的模型可以像由10個大型模型的整合一樣出色。

Geoffrey Hinton, Oriol Vinyals和Jeff Dean的論文Distilling the Knowledge in a Neural Network中對一個語音識別問題的知識蒸餾的結果

為什麼不重頭訓練一個小網路?

你可能會問,為什麼不從一開始就訓練一個更小的網路呢?這不是更容易嗎?當然,但這並不一定有效。

實驗結果表明,引數越多,泛化效果越好,收斂速度越快。例如,Sanjeev Arora, Nadav Cohen和Elad Hazan在他們的論文“On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization”中對此進行了研究。

左:單層網路與4層和8層的線性網路。右:使用TensorFlow教程中的MNIST分類的引數化和基線模型。

對於複雜的問題,簡單的模型很難在給定的訓練資料上很好地泛化。然而,我們擁有的遠不止訓練資料:教師模型對所有可用資料的預測。

這對我們有兩方面的好處。

  • 首先,教師模型的知識可以教學生模型如何通過訓練資料集之外的可用預測進行泛化。回想一下,我們使用教師模型對所有可用資料的預測來訓練學生模型,而不是原始的訓練資料集。

  • 其次,soft targets提供了比類標籤更有用的資訊:它表明兩個類是否彼此相似。例如,如果任務是分類狗的品種,像“柴犬和秋田犬非常相似”這樣的資訊對於模型泛化是非常有價值的。

左:秋田犬,右:柴犬

與遷移學習的區別

Hinton等人也提到,最早的嘗試是複用訓練好的整合模型中的一些層來遷移知識,從而壓縮模型。

用Hinton等人的話來說,

“……我們傾向於用學習的引數值在訓練過的模型中識別知識,這使得我們很難看到如何改變模型的形式而保持相同的知識。知識的一個更抽象的觀點是,它是一個從輸入向量到輸出向量的學習好的對映,它將知識從任何特定的例項化中解放出來。—— Distilling the Knowledge in a Neural Network

因此,與轉移學習相反,知識蒸餾不會直接使用學到的權重。

使用決策樹

如果你想進一步壓縮模型,你可以嘗試使用更簡單的模型,如決策樹。儘管它們的表達能力不如神經網路,但它們的預測可以通過單獨觀察節點來解釋。

這是由Nicholas Frosst和Geoffrey Hinton完成的,他們在他們的論文Distilling a Neural Network Into a Soft Decision Tree中對此進行了研究。

他們的研究表明,儘管更簡單的神經網路的表現比他們的研究要好,但蒸餾確實起到了一點作用。在MNIST資料集上,經過蒸餾的決策樹模型的測試準確率達到96.76%,較基線模型的94.34%有所提高。然而,一個簡單的兩層深卷積網路仍然達到了99.21%的準確率。因此,在效能和可解釋性之間存在權衡。

Distilling BERT

到目前為止,我們只看到了理論結果,沒有實際的例子。為了改變這種情況,讓我們考慮近年來最流行和最有用的模型之一:BERT。

來自於谷歌的Jacob Devlin等人的論文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,很快被廣泛應用於各種NLP任務,如文件檢索或情緒分析。這是一個真正的突破,推動了幾個領域的技術發展。

然而,有一個問題。BERT包含約1.1億個引數,需要大量的時間來訓練。作者報告說,訓練需要4天,使用4個pods中的16個TPU晶片。訓練成本將約為10000美元,不包括碳排放等環境成本。

Hugging Face成功地嘗試減小BERT的尺寸和計算成本。他們使用知識蒸餾來訓練DistilBERT,這是原始模型大小的60%,同時速度提高了60%,語言理解能力保持在97%。

DistilBERT的效能。

較小的架構需要更少的時間和計算資源:在8個16GB V100 gpu上花費90小時。如果你對更多的細節感興趣,你可以閱讀原始論文"DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter"或者文章的綜述,寫的很精彩,強烈推薦。

總結

知識蒸餾是壓縮神經網路的三種主要方法之一,使其適合於效能較弱的硬體。

與其他兩種強大的壓縮方法權值剪枝和量化不同,知識蒸餾不直接對網路進行縮減。相反,它使用最初的模型來訓練一個更小的模型,稱為“學生模型”。由於教師模型甚至可以對未標記的資料提供預測,因此學生模型可以學習如何像教師那樣進行泛化。在這裡,我們看到了兩個關鍵的結果:最初的論文,它介紹了這個想法,和一個後續的論文,展示了簡單的模型,如決策樹,也可以用作學生模型。

—END—

英文原文:https://towardsdatascience.com/can-a-neural-network-train-other-networks-cf371be516c6

請長按或掃描二維碼關注本公眾號

喜歡的話,請給我個在看吧