導(dǎo)讀:預(yù)訓(xùn)練模型在NLP大放異彩,并開啟了預(yù)訓(xùn)練-微調(diào)的NLP范式時代。由于工業(yè)領(lǐng)域相關(guān)業(yè)務(wù)的復(fù)雜性,以及工業(yè)應(yīng)用對推理性能的要求,大規(guī)模預(yù)訓(xùn)練模型往往不能簡單直接地被應(yīng)用于NLP業(yè)務(wù)中。本文將為大家?guī)硇∶自陬A(yù)訓(xùn)練模型的探索與優(yōu)化。
01
預(yù)訓(xùn)練簡介
預(yù)訓(xùn)練與詞向量的方法一脈相承。詞向量是從任務(wù)無關(guān)和大量的無監(jiān)督語料中學(xué)習(xí)到詞的分布式表達(dá),即文檔中詞的向量化表達(dá)。在得到詞向量之后,一般會輸入到下游任務(wù)中,進(jìn)行后續(xù)的計算,從而得到任務(wù)相關(guān)的模型。
但是,詞向量的學(xué)習(xí)方法存在一個問題:不能對文檔中的上下文進(jìn)行建模,對于上面的例子“蘋果”在兩個句子中的表達(dá)意思是不一樣的,而詞向量的表達(dá)卻是同一個,所以在表達(dá)能力的多樣性上會有局限,這是一種靜態(tài)的Word Embedding。
在后面的發(fā)展中,有了根據(jù)上下文建模的Word Embedding,比如,可以在學(xué)習(xí)上嘗試使用雙向LSTM模型,在非監(jiān)督語料學(xué)習(xí)詞向量,這比靜態(tài)的詞向量網(wǎng)絡(luò)會復(fù)雜一些,最后可以通過隱層得到動態(tài)的詞向量輸入到下游任務(wù)中。
1. 序列建模方法
在NLP中,一般使用序列建模的方法。之前比較常用的序列建模是LSTM遞歸神經(jīng)網(wǎng)絡(luò),其問題是建模時,句子中兩個遠(yuǎn)距離詞之間的交互是間接的。
17年Transformer發(fā)布之后,在NLP任務(wù)中取得了很大的提升。這里面Self-Attention可以對任意詞語間進(jìn)行直接的交互,Multi-head Attention可以表達(dá)在不同類型的進(jìn)行語義交互。
2. 預(yù)訓(xùn)練模型
在這之后,預(yù)訓(xùn)練模型開始流行起來。
首先是ELMO,依然使用的是雙向LSTM,它將模型做的更深,并且在大規(guī)模的無監(jiān)督語料中進(jìn)行訓(xùn)練,使用的訓(xùn)練任務(wù)是語言模型。對于具體的任務(wù),將從ELMO得到的詞向量作為特征輸入到下游任務(wù)中,ELMO這種的預(yù)訓(xùn)練屬于Feature based Pretraining。
其次是GPT,它使用的是Transformer結(jié)構(gòu),訓(xùn)練任務(wù)是從左到右的語言模型,比較適合生成類的任務(wù)。
最后是BERT,依然使用的Transformer結(jié)構(gòu),訓(xùn)練任務(wù)換成了Mask Language Model,可以對詞語的上下文進(jìn)行建模。
3. BERT模型
BERT是一種Pretrain和Finetune的訓(xùn)練方式,在Pretrain階段使用海量的非監(jiān)督語料訓(xùn)練出一個與任務(wù)無關(guān)的公共模型,在Finetune階段可以使用少量的監(jiān)督語料訓(xùn)練一個任務(wù)相關(guān)且效果更優(yōu)的模型。
4. BERT效果
BERT可以靈活的適配下游任務(wù),比如句對分類、文本分類、序列標(biāo)注、QA等等。另一方面BERT的參數(shù)規(guī)模也是非常大的,BertBase有110M的參數(shù),BertLarge有340M參數(shù)。
5. 預(yù)訓(xùn)練模型發(fā)展
在BERT之后,預(yù)訓(xùn)練模型的發(fā)展非常迅速,出現(xiàn)了很多新的預(yù)訓(xùn)練模型。這些模型的趨勢是模型參數(shù)在不斷的增大。
02
預(yù)訓(xùn)練落地挑戰(zhàn)
我們以對話系統(tǒng)來介紹下預(yù)訓(xùn)練落地的一些挑戰(zhàn)。對話系統(tǒng)的流程是將輸入的語音通過ASR識別成文本Query,然后進(jìn)行分詞。由于語音的輸入一般是連續(xù)的,所以需要進(jìn)行語義的斷句。接下來,進(jìn)行意圖分類將Query分類到天氣/音樂/聊天……這些類別中,再根據(jù)Query來匹配到答案,其中匹配的方法可以是檢索式也可以是生成式。
在整個對話系統(tǒng)中,預(yù)訓(xùn)練模型可以應(yīng)用到很多任務(wù)中,遇到的挑戰(zhàn)主要有以下幾個方面:
挑戰(zhàn)一:推理延時高、成本高
第一個挑戰(zhàn)是由于預(yù)訓(xùn)練模型的參數(shù)比較大,會引起推理的延時比較高以及單卡的吞吐比較低,所以推理延時高和成本高是一個通用的挑戰(zhàn)。
挑戰(zhàn)二:知識融入
第二個挑戰(zhàn)是一些任務(wù)除了使用原生的BERT模型之外,還需要融入一些外部的知識。比如意圖分類的任務(wù),Query中的歌手、歌曲名實(shí)體的融入可以幫助模型將Query更準(zhǔn)確的分類到音樂類中。
挑戰(zhàn)三:如何根據(jù)任務(wù)調(diào)整模型和訓(xùn)練
第三個挑戰(zhàn)是我們發(fā)現(xiàn)一些任務(wù)需要在預(yù)訓(xùn)練模型的基礎(chǔ)上進(jìn)行調(diào)整——模型結(jié)構(gòu)上或者訓(xùn)練方法上。比如分詞任務(wù),同樣一句話我們可能同時需要粗粒度的分詞或者細(xì)粒度的分詞結(jié)果,對于原生BERT的序列標(biāo)注任務(wù)需要一些適配。另外,像是對話生成類的任務(wù),傳統(tǒng)上使用Encoder和Decoder的模式,在原生BERT需要進(jìn)行訓(xùn)練方法的改進(jìn)。
03
預(yù)訓(xùn)練實(shí)踐探索
1. 推理效率
前面我們已經(jīng)提到,對于BERT的一個挑戰(zhàn)是模型參數(shù)很大,針對這個問題我們很容易想到是不是可以對模型進(jìn)行壓縮,而知識蒸餾是一種常用的模型壓縮方法。
①知識蒸餾
知識蒸餾是由一個大模型(teacher模型)通過蒸餾數(shù)據(jù)來生成一個小模型(student模型)。針對分類任務(wù),蒸餾數(shù)據(jù)相對原始數(shù)據(jù)會變成soft label的形式,更利于小模型學(xué)習(xí)到模型中的知識。
前面說到預(yù)訓(xùn)練模型可以分為Pretrain階段和Finetune階段,對于知識蒸餾來說,也可以分別對Pretrain階段和Finetune階段進(jìn)行蒸餾。其中,因為Pretrain階段時間會很慢,蒸餾Pretrain也很慢,一般時間是周級別的。另一種方法是跳過Pretrain的階段,使用小模型作為學(xué)生的初始模型,直接進(jìn)行Finetune的蒸餾階段。在實(shí)踐中我們發(fā)現(xiàn),這種方式可以得到一個效果不錯的模型。好處是Finetune階段比較快,天級別就可以完成一個蒸餾任務(wù)。
我們發(fā)現(xiàn)多模型集成蒸餾對模型效果有一定的提升。多模型集成蒸餾是我們同時訓(xùn)練多個教師模型,每個教師模型會對數(shù)據(jù)生成一份蒸餾后的數(shù)據(jù)。比如分類任務(wù),會生成多個logits這樣概率的分布,然后通過教師集成為一個logits,最后用這個融合后的logits去優(yōu)化最終的學(xué)生模型。
在蒸餾的效果上,以語義斷句任務(wù)為例,我們做了三版的模型:
第一版使用單模型的BERT去蒸餾學(xué)生模型
第二版使用多模型進(jìn)行蒸餾,這里面使用的集成策略也相對簡單
第三版使用更多的教師模型且更復(fù)雜的集成策略來蒸餾學(xué)生模型
從效果上面看,準(zhǔn)確率和召回率三版模型都有逐步的提升,尤其集成教師蒸餾的方法在召回率上的效果有了較大的提升。
②低精度推理
我們都知道在模型訓(xùn)練時,參數(shù)一般都是以float32存儲的。由于神經(jīng)網(wǎng)絡(luò)計算有一定的魯棒性,使用float16半精度的表示也可以達(dá)到接近float32的效果。我們可以看到在GPU V100上,半精度算力可以達(dá)到單精度的兩倍,在推理延時和吞吐上都具有優(yōu)勢。
具體的操作是將各個float32位的參數(shù)矩陣都轉(zhuǎn)換成float16位的格式。在實(shí)際應(yīng)用,如Query-Question相似度計算任務(wù)中,低精度推理的精度損失小于1%,而P99的延時從200ms降到了80ms,有一倍以上的推理速度降低。
③算子融合
在推理速率上的提升,我們還嘗試了另一種方法:算子融合。
它的初衷是,Transformer從結(jié)構(gòu)上看每一層都有self-attention,add,layer-normalize,feed forward,sublayer等步驟。實(shí)際上,中間的每一步轉(zhuǎn)化到具體的深度學(xué)習(xí)框架中都是非常長的算子步驟。比如像layer-normalize這一步需要tensorflow中6-7個甚至更多的算子計算序列來完成。這樣在計算框架中OP粒度很小,而CPU在很多時間都是在等待OP的內(nèi)存交換和調(diào)度,導(dǎo)致CPU大部分時間都是在空轉(zhuǎn),使得計算效率較低。
算子融合的思路就是將這些相鄰的算子盡可能融合成一個算子,這樣就能讓CPU最大限度的連續(xù)運(yùn)行。上圖就是將Transformer中的一個block進(jìn)行了算子融合,將多個小的算子融合成大的算子。
我們可以看到通過加入算子融合,在低精度推理上,推理速度又降低了一倍。這樣就可以將BERT這種大的模型推到線上落地。
2. 知識融合
①問題
回顧一下之前的對話系統(tǒng)場景,在落地意圖分類任務(wù)時,有一些類別包含領(lǐng)域相關(guān)的外部信息。比如音樂包含歌手名、歌曲名這樣的信息,我們利用這些信息可以更容易地將query分到對應(yīng)的類別上。
這樣問題就可以抽象表達(dá)為如何將輸入的原始序列和槽位的標(biāo)簽序列融合在一起用來做分類模型。一個簡單的方法就是將標(biāo)簽序列也作為輸入,輸入到BERT中,但是BERT在訓(xùn)練中沒有見到過這樣的輸入,這樣分類的效果會差一些。
②方案
介紹下我們的知識融合方案:
首先引入槽位注意力機(jī)制,原始輸入的Query會經(jīng)過BERT計算輸出一個隱層的表達(dá),槽位的標(biāo)簽也會做一個嵌入的表達(dá)??紤]到同一個詞語位置的地方會有多個槽位信息,我們對于這個多標(biāo)簽的情況可以做一個池化操作,融合為一個向量。之后做一個線性變換,將文本序列和標(biāo)簽序列映射到同一個空間,在同一個空間進(jìn)行attention操作使兩個序列進(jìn)行交互,這樣就可以得到原始特征和標(biāo)簽特征的融合特征表示。
在這之后,我們加入了一個融合門控機(jī)制。一般提取出來的標(biāo)簽都會有一些噪聲,我們通過外部知識獲取的標(biāo)簽會有一些不準(zhǔn)確的可能,所以我們需要確定有多少程度的標(biāo)簽信息可以加入到原始序列中。我們加入的是一個動態(tài)門控的機(jī)制,將文本特征和槽位特征進(jìn)行一個動態(tài)的加權(quán)。在融合門控之后加入了一個多頭注意力機(jī)制,它的作用是在融合之后的特征進(jìn)行上下文交互來建模。
③效果對比
綜合上面這些方法的融合,在意圖分類這個任務(wù)上對比單獨(dú)使用BERT和融入槽位信息的BERT,融入了槽位信息之后準(zhǔn)確率上會有一定量的提升。在上面的例子中,“想聽說不出的秘密”和“我不想說出這個秘密”由于加入的外部知識能夠很好的分類到相應(yīng)的類別當(dāng)中。
3. 任務(wù)適配
任務(wù)一:多粒度分詞
①問題
針對同一句話,我們會有粗細(xì)粒度不同的分詞需求。比如:這是一家移動互聯(lián)網(wǎng)公司,粗粒度:這/是/一家/移動互聯(lián)網(wǎng)/公司,細(xì)粒度:這/是/一家/移動/互聯(lián)網(wǎng)/公司,所以我們需要模型的調(diào)整來完成這樣的需求。
分詞任務(wù)可以看成是序列標(biāo)注的任務(wù),輸入的是文本,輸出是每個文字上各個標(biāo)簽的開始或者結(jié)束。一種簡單的一種做法就是為粗/細(xì)粒度分別訓(xùn)練兩版不同的模型,但是模型的維護(hù)成本和運(yùn)行成本都比較高。
②方案
我們的方法是構(gòu)建一個統(tǒng)一的多粒度分詞模型。它的思想是輸入時將分詞粒度的標(biāo)簽也加入到輸入序列中,指導(dǎo)分詞粒度的結(jié)果。比如上圖中使用fine/coarse來分別代表細(xì)/粗粒度標(biāo)簽,模型的結(jié)果就根據(jù)這個標(biāo)簽來適配。
我們除了使用BERT模型網(wǎng)絡(luò)外也加入了Bigram的向量特征進(jìn)行融合,之后使用多頭注意力機(jī)制對融合特征的上下文進(jìn)行建模,最后進(jìn)行MLP Decoder。除了分詞本身的學(xué)習(xí)以外,分詞類型也可以作為一個學(xué)習(xí)任務(wù),兩個任務(wù)共同訓(xùn)練這樣一個網(wǎng)絡(luò)。
③效果
如圖中表格所示,我們使用的多粒度分詞模型在很多任務(wù)上都有不錯的效果。通過上面展示的示例可以看到,這種多粒度分詞方法也是一種靈活的分詞方式。
任務(wù)二:生成式對話
①問題
針對生成式對話這樣的場景,一般輸入一個Question,輸出為一個Reply。通常我們會在互聯(lián)網(wǎng)社區(qū)獲取大量Q/R的數(shù)據(jù)作為訓(xùn)練語料來訓(xùn)練模型。傳統(tǒng)來說,這是一個序列到序列的生成任務(wù),跟翻譯模型的訓(xùn)練過程比較相近。
傳統(tǒng)的seq2seq模型使用Encoder和Decoder進(jìn)行建模,問題是沒有預(yù)訓(xùn)練的過程。
另一種方法是使用類似GPT的預(yù)訓(xùn)練方式,將Q和R在一起建模,中間使用[SEP]進(jìn)行分割,局限是在學(xué)習(xí)的過程中只能看到文本左邊的內(nèi)容,而不能對整個文本上下文進(jìn)行建模。
②方案
我們采用的是一種多任務(wù)的訓(xùn)練方法。先使用一個基礎(chǔ)的預(yù)訓(xùn)練模型(BERT-Base)來初始化生成式模型的參數(shù),接下來就對話任務(wù)進(jìn)行多任務(wù)的訓(xùn)練,比如MLM、PLM、Mask Pos Predict等語言模型訓(xùn)練任務(wù),最終在解碼階端可以采用通用的自回歸方式生成。
③效果
從實(shí)驗對比來看,跟傳統(tǒng)的seq2seq、GPT相比,加入多任務(wù)訓(xùn)練的方式在針對回復(fù)相關(guān)性上有很明顯的提升。從上圖右邊示例中可以看到,隨著語料數(shù)據(jù)不斷的增大和模型多任務(wù)的學(xué)習(xí),生成的回復(fù)有很好的連貫性和相關(guān)性。
04
總結(jié)與展望1. 總結(jié)
本文主要介紹了推理效率、知識融入和任務(wù)適配。
推理效率:在知識蒸餾方面使用多教師模型集成蒸餾是一種可以將模型壓縮更小,保證模型效果的方法;而推理加速方面使用低精度推理和算子融合的方法可以幫助推理速度有幾倍的提升。
知識融入:在對話系統(tǒng)意圖識別任務(wù)中,通過在原始序列中加入槽位信息序列,使用attention的方法將兩個特征序列融合成一個序列。
任務(wù)適配:多粒度分詞任務(wù)是在輸入上加入適配的標(biāo)簽來指導(dǎo)輸出的一種自適應(yīng)的改變。生成式對話采用聯(lián)合多任務(wù)訓(xùn)練的方式能夠集成預(yù)訓(xùn)練和序列到序列的生成模型。
2. 展望
輕量級模型
知識融入
預(yù)訓(xùn)練平臺
原文標(biāo)題:小米在預(yù)訓(xùn)練模型的探索與優(yōu)化
文章出處:【微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
模型
+關(guān)注
關(guān)注
1文章
3609瀏覽量
51414 -
小米
+關(guān)注
關(guān)注
70文章
14505瀏覽量
150235 -
nlp
+關(guān)注
關(guān)注
1文章
491瀏覽量
23029
原文標(biāo)題:小米在預(yù)訓(xùn)練模型的探索與優(yōu)化
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
AI原生架構(gòu)升級:RAKsmart服務(wù)器在超大規(guī)模模型訓(xùn)練中的算力突破
用PaddleNLP為GPT-2模型制作FineWeb二進(jìn)制預(yù)訓(xùn)練數(shù)據(jù)集

從Open Model Zoo下載的FastSeg大型公共預(yù)訓(xùn)練模型,無法導(dǎo)入名稱是怎么回事?
為什么無法使用Dla_compiler在OpenVINO?中編譯用于FPGA的IR模型?
用PaddleNLP在4060單卡上實(shí)踐大模型預(yù)訓(xùn)練技術(shù)

【「基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化」閱讀體驗】+大模型微調(diào)技術(shù)解讀
《具身智能機(jī)器人系統(tǒng)》第7-9章閱讀心得之具身智能機(jī)器人與大模型
KerasHub統(tǒng)一、全面的預(yù)訓(xùn)練模型庫
GPU是如何訓(xùn)練AI大模型的
名單公布!【書籍評測活動NO.52】基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化
使用PyTorch在英特爾獨(dú)立顯卡上訓(xùn)練模型

AI大模型的訓(xùn)練數(shù)據(jù)來源分析
AI大模型的性能優(yōu)化方法
直播預(yù)約 |數(shù)據(jù)智能系列講座第4期:預(yù)訓(xùn)練的基礎(chǔ)模型下的持續(xù)學(xué)習(xí)

評論