1. 程式人生 > 實用技巧 >模型壓縮一-知識蒸餾

模型壓縮一-知識蒸餾

一、知識蒸餾簡介

知識蒸餾是模型壓縮方法中的一個大類,是一種基於“教師-學生網路(teacher-student-network)思想”的訓練方法, 其主要思想是擬合教師模型(teacher-model)的泛化性等(如輸出概率、中間層特徵、啟用邊界等),而不是一個簡簡單單的0-1類別標籤。

這一技術的理論來自於2015年Hinton發表的一篇論文: Distilling the Knowledge in a Neural Network。知識蒸餾,英文名為Knowledge Distillation, 簡稱KD,顧名思義,就是將已經訓練好的模型包含的知識(“Knowledge”),蒸餾(“Distill”)提取到另一個模型裡面去(通常是簡單的模型、學生模型)。

知識蒸餾也可以看成是遷移學習的特例,工業界應用得比較廣泛的是將BERT模型蒸餾到較少層的transformer, 或者LSTM、CNN等普通模型。BERT模型由於其強大的特徵抽取能力,在很多NLP任務上能夠達到soft-state-art的效果。 儘管如此,BERT還是有著超引數量大、佔用空間大、佔用計算資源大、推理時間長等缺點,即便是大公司等也不能隨心所欲地使用。 因此,一個簡單的想法便是通過BERT等獲取一個簡單、但效能更好地輕量級演算法模型,知識蒸餾無疑是一種有效的方法。 巨大的BERT在很多業務場景下的線上inference都存在很大的效能瓶頸,於是就有了知識蒸餾的用武之地。

常見的使用方式是離線fintune BERT模型,訓練一個離線指標明顯優於小模型的模型, 然後用fintue好的BERT模型作為指導蒸餾一個小的模型,也可以看做是一個muti-task的訓練任務。 最後上線用小模型即可,從而獲得性能和效果雙贏的局面。

二、知識蒸餾開山之作

知識蒸餾的開山之作是Hinton於2015年提出的論文: Distilling the Knowledge in a Neural Network,旨在把一個大模型或者多個模型ensemble學到的知識遷移到另一個輕量級單模型上,方便部署。簡單的說就是用新的小模型去學習大模型的預測結果,改變一下目標函式。

為什麼蒸餾可以work?好模型的目標不是擬合訓練資料,而是學習如何泛化到新的資料。所以蒸餾的目標是讓student學習到teacher的泛化能力,理論上得到的結果會比單純擬合訓練資料的student要好。另外,對於分類任務,如果soft targets的熵比hard targets高,那顯然student會學習到更多的資訊。

其soft targets學習(重點是溫度)的主要公式(即softmax前除以一個整數T【一般在1-100間】)是:

注意:

1.很簡單的方法,即預測標籤概率 除以 T,真實標籤概率 除以 T,最終loss結果需要 乘以 T的平方。

2. 自己實驗中,更適用於半監督學習,以及均衡的、簡單的分類問題等。

三、知識蒸餾思維導圖

模型蒸餾的開山之作,其基本思路是讓student-model學習teacher-model的輸出概率分佈,其主要是對輸出目標的學習(如分類類別的概率分佈)。

之後,陸續出現從teacher-model的中間層學習其特徵feature的論文,主要是影象吧,這樣可以學習到更加豐富的資訊。

接著,出現了從teachea-model的啟用邊界進行學習的論文。

再然後,出現了student-model自學的論文,主要還是對資料集的操作,batch-size內資料的綜合,資料增強等。

最後一個,是利用對抗神經網路的經驗,將student模型看成生成模型,teachea-model看成判斷模型......

借用別人的一張思維導圖說明:

四、BERT模型蒸餾到簡單網路、Tranformers

BERT蒸餾一般有兩種方式,一種是BERT蒸餾到較少網路層的transformers,另外一種是BERT蒸餾到TextCNN、TextRNN等簡單網路。

這裡我們介紹一篇BERT蒸餾到BILSTM的論文:

Distilling Task-Specific Knowledge from BERT into Simple Neural Networks

論文的關鍵點在於:

1.適用於少量標註、大批量無標籤的資料集,也就是冷啟動問題;

2. 同知識蒸餾的開山之作,該論文還是兩階段蒸餾;

3. 損失函式使用的是常規loss + 均方誤差loss;

4.使用[MASK]、N-GRAM等資料增強技術等。

再介紹一篇BERT蒸餾到少層的Transformer的論文:

TINYBERT: DISTILLING BERT FOR NATURAL LANGUAGE UNDERSTANDING

論文的關鍵點在於:

1、還是兩階段模型蒸餾,teacher-model到student-model層數有一個對映;

2、基於注意力的蒸餾和基於隱狀態的蒸餾、基於Embedding的蒸餾;

3、MSE-loss損失函式,3個loss相加

自己實驗效果:

1. 某任務二分類(有提升):

最終 (21 epoch) : mean-P R F

原始text-cnn 0.961 0.960 0.96

蒸餾text-cnn 0.97 0.97 0.97

原始Bert-base0.98 0.98 0.98

2. 某任務11分類(長尾問題,效果不好)

最終 (21 epoch) :mean-P R F

原始text-cnn 0.901 0.872 0.879

蒸餾text-cnn 0.713 0.766 0.738

3. 某任務90分類(長尾問題,效果不好)

最終(21 epoch) mean-P R F

原始text-cnn 0.819 0.8 0.809

蒸餾text-cnn 0.696 0.593 0.64 (樣本最多的類別不能擬合)

原生Bert-base0.85 0.842 0.846

總結:BERT蒸餾到Text-CNN,Bi-LSTM等簡單模型,並不適合完全有監督分類的任務,

最好還是BERT蒸餾到較少層數的transforerm比較好。

五、TextBrewer

5.1 概述:

TextBrewer科大訊飛開源的一個基於PyTorch的、為實現NLP中的**知識蒸餾**任務而設計的工具包,融合並改進了NLP和CV中的多種知識蒸餾技術,提供便捷快速的知識蒸餾框架,用於以較低的效能損失壓縮神經網路模型的大小,提升模型的推理速度,減少記憶體佔用。

5.2主要特點:

**TextBrewer** 為NLP中的知識蒸餾任務設計,融合了多種知識蒸餾技術,提供方便快捷的知識蒸餾框架,主要特點有:

* 模型無關:適用於多種模型結構(主要面向**Transfomer**結構)

* 方便靈活:可自由組合多種蒸餾方法;可方便增加自定義損失等模組

* 非侵入式:無需對教師與學生模型本身結構進行修改

* 支援典型的NLP任務:文字分類、閱讀理解、序列標註等

5.3 支援的知識蒸餾技術:

* 軟標籤與硬標籤混合訓練

* 動態損失權重調整與蒸餾溫度調整

* 多種蒸餾損失函式: hidden states MSE, attention-based loss, neuron selectivity transfer

* 任意構建中間層特徵匹配方案

* 多教師知識蒸餾

5.4自己實驗:

某任務90分類資料集,ERNIE【一次推理0.1s】蒸餾到3層transofrmers【一次推理0.02s】

Ernie轉Transformer(T3) 蒸餾實驗(teacher-epochs-21, student-epochs-48)

lr batch_size loss T dropout Mean-P R F

ernie:

5e-5 16 bce 1 0.1 0.856 0.871 0.863

蒸餾:

5e-5 16 0.9-kl 1 0.1 0.818 0.818 0.818 (3 - layer)

原生transformers-3:

5e-5 16 bce 1 0.1 0.741 0.768 0.754 (3 - layer)

原始text-cnn

1e-3 16 bce 0.819 0.8 0.809

總結:TextBrewer還可以,BERT蒸餾到較少層數的transforerm對於簡單的全監督分類還是有一定效果的。

希望對你有所幫助!