導(dǎo)讀:預(yù)訓(xùn)練模型在NLP大放異彩,并開(kāi)啟了預(yù)訓(xùn)練-微調(diào)的NLP范式時(shí)代。由于工業(yè)領(lǐng)域相關(guān)業(yè)務(wù)的復(fù)雜性,以及工業(yè)應(yīng)用對(duì)推理性能的要求,大規(guī)模預(yù)訓(xùn)練模型往往不能簡(jiǎn)單直接地被應(yīng)用于NLP業(yè)務(wù)中。本文將為大家?guī)?lái)小米在預(yù)訓(xùn)練模型的探索與優(yōu)化。
01
預(yù)訓(xùn)練簡(jiǎn)介

預(yù)訓(xùn)練與詞向量的方法一脈相承。詞向量是從任務(wù)無(wú)關(guān)和大量的無(wú)監(jiān)督語(yǔ)料中學(xué)習(xí)到詞的分布式表達(dá),即文檔中詞的向量化表達(dá)。在得到詞向量之后,一般會(huì)輸入到下游任務(wù)中,進(jìn)行后續(xù)的計(jì)算,從而得到任務(wù)相關(guān)的模型。
但是,詞向量的學(xué)習(xí)方法存在一個(gè)問(wèn)題:不能對(duì)文檔中的上下文進(jìn)行建模,對(duì)于上面的例子“蘋(píng)果”在兩個(gè)句子中的表達(dá)意思是不一樣的,而詞向量的表達(dá)卻是同一個(gè),所以在表達(dá)能力的多樣性上會(huì)有局限,這是一種靜態(tài)的Word Embedding。
在后面的發(fā)展中,有了根據(jù)上下文建模的Word Embedding,比如,可以在學(xué)習(xí)上嘗試使用雙向LSTM模型,在非監(jiān)督語(yǔ)料學(xué)習(xí)詞向量,這比靜態(tài)的詞向量網(wǎng)絡(luò)會(huì)復(fù)雜一些,最后可以通過(guò)隱層得到動(dòng)態(tài)的詞向量輸入到下游任務(wù)中。
1. 序列建模方法

在NLP中,一般使用序列建模的方法。之前比較常用的序列建模是LSTM遞歸神經(jīng)網(wǎng)絡(luò),其問(wèn)題是建模時(shí),句子中兩個(gè)遠(yuǎn)距離詞之間的交互是間接的。
17年Transformer發(fā)布之后,在NLP任務(wù)中取得了很大的提升。這里面Self-Attention可以對(duì)任意詞語(yǔ)間進(jìn)行直接的交互,Multi-head Attention可以表達(dá)在不同類(lèi)型的進(jìn)行語(yǔ)義交互。
2. 預(yù)訓(xùn)練模型

在這之后,預(yù)訓(xùn)練模型開(kāi)始流行起來(lái)。
首先是ELMO,依然使用的是雙向LSTM,它將模型做的更深,并且在大規(guī)模的無(wú)監(jiān)督語(yǔ)料中進(jìn)行訓(xùn)練,使用的訓(xùn)練任務(wù)是語(yǔ)言模型。對(duì)于具體的任務(wù),將從ELMO得到的詞向量作為特征輸入到下游任務(wù)中,ELMO這種的預(yù)訓(xùn)練屬于Feature based Pretraining。
其次是GPT,它使用的是Transformer結(jié)構(gòu),訓(xùn)練任務(wù)是從左到右的語(yǔ)言模型,比較適合生成類(lèi)的任務(wù)。
最后是BERT,依然使用的Transformer結(jié)構(gòu),訓(xùn)練任務(wù)換成了Mask Language Model,可以對(duì)詞語(yǔ)的上下文進(jìn)行建模。
3. BERT模型

BERT是一種Pretrain和Finetune的訓(xùn)練方式,在Pretrain階段使用海量的非監(jiān)督語(yǔ)料訓(xùn)練出一個(gè)與任務(wù)無(wú)關(guān)的公共模型,在Finetune階段可以使用少量的監(jiān)督語(yǔ)料訓(xùn)練一個(gè)任務(wù)相關(guān)且效果更優(yōu)的模型。
4. BERT效果

BERT可以靈活的適配下游任務(wù),比如句對(duì)分類(lèi)、文本分類(lèi)、序列標(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ì)是模型參數(shù)在不斷的增大。
02
預(yù)訓(xùn)練落地挑戰(zhàn)
我們以對(duì)話系統(tǒng)來(lái)介紹下預(yù)訓(xùn)練落地的一些挑戰(zhàn)。對(duì)話系統(tǒng)的流程是將輸入的語(yǔ)音通過(guò)ASR識(shí)別成文本Query,然后進(jìn)行分詞。由于語(yǔ)音的輸入一般是連續(xù)的,所以需要進(jìn)行語(yǔ)義的斷句。接下來(lái),進(jìn)行意圖分類(lèi)將Query分類(lèi)到天氣/音樂(lè)/聊天……這些類(lèi)別中,再根據(jù)Query來(lái)匹配到答案,其中匹配的方法可以是檢索式也可以是生成式。
在整個(gè)對(duì)話系統(tǒng)中,預(yù)訓(xùn)練模型可以應(yīng)用到很多任務(wù)中,遇到的挑戰(zhàn)主要有以下幾個(gè)方面:
挑戰(zhàn)一:推理延時(shí)高、成本高

第一個(gè)挑戰(zhàn)是由于預(yù)訓(xùn)練模型的參數(shù)比較大,會(huì)引起推理的延時(shí)比較高以及單卡的吞吐比較低,所以推理延時(shí)高和成本高是一個(gè)通用的挑戰(zhàn)。
挑戰(zhàn)二:知識(shí)融入

第二個(gè)挑戰(zhàn)是一些任務(wù)除了使用原生的BERT模型之外,還需要融入一些外部的知識(shí)。比如意圖分類(lèi)的任務(wù),Query中的歌手、歌曲名實(shí)體的融入可以幫助模型將Query更準(zhǔn)確的分類(lèi)到音樂(lè)類(lèi)中。
挑戰(zhàn)三:如何根據(jù)任務(wù)調(diào)整模型和訓(xùn)練

第三個(gè)挑戰(zhàn)是我們發(fā)現(xiàn)一些任務(wù)需要在預(yù)訓(xùn)練模型的基礎(chǔ)上進(jìn)行調(diào)整——模型結(jié)構(gòu)上或者訓(xùn)練方法上。比如分詞任務(wù),同樣一句話我們可能同時(shí)需要粗粒度的分詞或者細(xì)粒度的分詞結(jié)果,對(duì)于原生BERT的序列標(biāo)注任務(wù)需要一些適配。另外,像是對(duì)話生成類(lèi)的任務(wù),傳統(tǒng)上使用Encoder和Decoder的模式,在原生BERT需要進(jìn)行訓(xùn)練方法的改進(jìn)。
03
預(yù)訓(xùn)練實(shí)踐探索
1. 推理效率
前面我們已經(jīng)提到,對(duì)于BERT的一個(gè)挑戰(zhàn)是模型參數(shù)很大,針對(duì)這個(gè)問(wèn)題我們很容易想到是不是可以對(duì)模型進(jìn)行壓縮,而知識(shí)蒸餾是一種常用的模型壓縮方法。
①知識(shí)蒸餾
知識(shí)蒸餾是由一個(gè)大模型(teacher模型)通過(guò)蒸餾數(shù)據(jù)來(lái)生成一個(gè)小模型(student模型)。針對(duì)分類(lèi)任務(wù),蒸餾數(shù)據(jù)相對(duì)原始數(shù)據(jù)會(huì)變成soft label的形式,更利于小模型學(xué)習(xí)到模型中的知識(shí)。

前面說(shuō)到預(yù)訓(xùn)練模型可以分為Pretrain階段和Finetune階段,對(duì)于知識(shí)蒸餾來(lái)說(shuō),也可以分別對(duì)Pretrain階段和Finetune階段進(jìn)行蒸餾。其中,因?yàn)镻retrain階段時(shí)間會(huì)很慢,蒸餾Pretrain也很慢,一般時(shí)間是周級(jí)別的。另一種方法是跳過(guò)Pretrain的階段,使用小模型作為學(xué)生的初始模型,直接進(jìn)行Finetune的蒸餾階段。在實(shí)踐中我們發(fā)現(xiàn),這種方式可以得到一個(gè)效果不錯(cuò)的模型。好處是Finetune階段比較快,天級(jí)別就可以完成一個(gè)蒸餾任務(wù)。

我們發(fā)現(xiàn)多模型集成蒸餾對(duì)模型效果有一定的提升。多模型集成蒸餾是我們同時(shí)訓(xùn)練多個(gè)教師模型,每個(gè)教師模型會(huì)對(duì)數(shù)據(jù)生成一份蒸餾后的數(shù)據(jù)。比如分類(lèi)任務(wù),會(huì)生成多個(gè)logits這樣概率的分布,然后通過(guò)教師集成為一個(gè)logits,最后用這個(gè)融合后的logits去優(yōu)化最終的學(xué)生模型。

在蒸餾的效果上,以語(yǔ)義斷句任務(wù)為例,我們做了三版的模型:
第一版使用單模型的BERT去蒸餾學(xué)生模型
第二版使用多模型進(jìn)行蒸餾,這里面使用的集成策略也相對(duì)簡(jiǎn)單
第三版使用更多的教師模型且更復(fù)雜的集成策略來(lái)蒸餾學(xué)生模型
從效果上面看,準(zhǔn)確率和召回率三版模型都有逐步的提升,尤其集成教師蒸餾的方法在召回率上的效果有了較大的提升。
②低精度推理

我們都知道在模型訓(xùn)練時(shí),參數(shù)一般都是以float32存儲(chǔ)的。由于神經(jīng)網(wǎng)絡(luò)計(jì)算有一定的魯棒性,使用float16半精度的表示也可以達(dá)到接近float32的效果。我們可以看到在GPU V100上,半精度算力可以達(dá)到單精度的兩倍,在推理延時(shí)和吞吐上都具有優(yōu)勢(shì)。

具體的操作是將各個(gè)float32位的參數(shù)矩陣都轉(zhuǎn)換成float16位的格式。在實(shí)際應(yīng)用,如Query-Question相似度計(jì)算任務(wù)中,低精度推理的精度損失小于1%,而P99的延時(shí)從200ms降到了80ms,有一倍以上的推理速度降低。
③算子融合

在推理速率上的提升,我們還嘗試了另一種方法:算子融合。
它的初衷是,Transformer從結(jié)構(gòu)上看每一層都有self-attention,add,layer-normalize,feed forward,sublayer等步驟。實(shí)際上,中間的每一步轉(zhuǎn)化到具體的深度學(xué)習(xí)框架中都是非常長(zhǎng)的算子步驟。比如像layer-normalize這一步需要tensorflow中6-7個(gè)甚至更多的算子計(jì)算序列來(lái)完成。這樣在計(jì)算框架中OP粒度很小,而CPU在很多時(shí)間都是在等待OP的內(nèi)存交換和調(diào)度,導(dǎo)致CPU大部分時(shí)間都是在空轉(zhuǎn),使得計(jì)算效率較低。

算子融合的思路就是將這些相鄰的算子盡可能融合成一個(gè)算子,這樣就能讓CPU最大限度的連續(xù)運(yùn)行。上圖就是將Transformer中的一個(gè)block進(jìn)行了算子融合,將多個(gè)小的算子融合成大的算子。

我們可以看到通過(guò)加入算子融合,在低精度推理上,推理速度又降低了一倍。這樣就可以將BERT這種大的模型推到線上落地。
2. 知識(shí)融合
①問(wèn)題

回顧一下之前的對(duì)話系統(tǒng)場(chǎng)景,在落地意圖分類(lèi)任務(wù)時(shí),有一些類(lèi)別包含領(lǐng)域相關(guān)的外部信息。比如音樂(lè)包含歌手名、歌曲名這樣的信息,我們利用這些信息可以更容易地將query分到對(duì)應(yīng)的類(lèi)別上。
這樣問(wèn)題就可以抽象表達(dá)為如何將輸入的原始序列和槽位的標(biāo)簽序列融合在一起用來(lái)做分類(lèi)模型。一個(gè)簡(jiǎn)單的方法就是將標(biāo)簽序列也作為輸入,輸入到BERT中,但是BERT在訓(xùn)練中沒(méi)有見(jiàn)到過(guò)這樣的輸入,這樣分類(lèi)的效果會(huì)差一些。
②方案

介紹下我們的知識(shí)融合方案:
首先引入槽位注意力機(jī)制,原始輸入的Query會(huì)經(jīng)過(guò)BERT計(jì)算輸出一個(gè)隱層的表達(dá),槽位的標(biāo)簽也會(huì)做一個(gè)嵌入的表達(dá)??紤]到同一個(gè)詞語(yǔ)位置的地方會(huì)有多個(gè)槽位信息,我們對(duì)于這個(gè)多標(biāo)簽的情況可以做一個(gè)池化操作,融合為一個(gè)向量。之后做一個(gè)線性變換,將文本序列和標(biāo)簽序列映射到同一個(gè)空間,在同一個(gè)空間進(jìn)行attention操作使兩個(gè)序列進(jìn)行交互,這樣就可以得到原始特征和標(biāo)簽特征的融合特征表示。

在這之后,我們加入了一個(gè)融合門(mén)控機(jī)制。一般提取出來(lái)的標(biāo)簽都會(huì)有一些噪聲,我們通過(guò)外部知識(shí)獲取的標(biāo)簽會(huì)有一些不準(zhǔn)確的可能,所以我們需要確定有多少程度的標(biāo)簽信息可以加入到原始序列中。我們加入的是一個(gè)動(dòng)態(tài)門(mén)控的機(jī)制,將文本特征和槽位特征進(jìn)行一個(gè)動(dòng)態(tài)的加權(quán)。在融合門(mén)控之后加入了一個(gè)多頭注意力機(jī)制,它的作用是在融合之后的特征進(jìn)行上下文交互來(lái)建模。
③效果對(duì)比

綜合上面這些方法的融合,在意圖分類(lèi)這個(gè)任務(wù)上對(duì)比單獨(dú)使用BERT和融入槽位信息的BERT,融入了槽位信息之后準(zhǔn)確率上會(huì)有一定量的提升。在上面的例子中,“想聽(tīng)說(shuō)不出的秘密”和“我不想說(shuō)出這個(gè)秘密”由于加入的外部知識(shí)能夠很好的分類(lèi)到相應(yīng)的類(lèi)別當(dāng)中。
3. 任務(wù)適配
任務(wù)一:多粒度分詞
①問(wèn)題

針對(duì)同一句話,我們會(huì)有粗細(xì)粒度不同的分詞需求。比如:這是一家移動(dòng)互聯(lián)網(wǎng)公司,粗粒度:這/是/一家/移動(dòng)互聯(lián)網(wǎng)/公司,細(xì)粒度:這/是/一家/移動(dòng)/互聯(lián)網(wǎng)/公司,所以我們需要模型的調(diào)整來(lái)完成這樣的需求。
分詞任務(wù)可以看成是序列標(biāo)注的任務(wù),輸入的是文本,輸出是每個(gè)文字上各個(gè)標(biāo)簽的開(kāi)始或者結(jié)束。一種簡(jiǎn)單的一種做法就是為粗/細(xì)粒度分別訓(xùn)練兩版不同的模型,但是模型的維護(hù)成本和運(yùn)行成本都比較高。
②方案

我們的方法是構(gòu)建一個(gè)統(tǒng)一的多粒度分詞模型。它的思想是輸入時(shí)將分詞粒度的標(biāo)簽也加入到輸入序列中,指導(dǎo)分詞粒度的結(jié)果。比如上圖中使用fine/coarse來(lái)分別代表細(xì)/粗粒度標(biāo)簽,模型的結(jié)果就根據(jù)這個(gè)標(biāo)簽來(lái)適配。
我們除了使用BERT模型網(wǎng)絡(luò)外也加入了Bigram的向量特征進(jìn)行融合,之后使用多頭注意力機(jī)制對(duì)融合特征的上下文進(jìn)行建模,最后進(jìn)行MLP Decoder。除了分詞本身的學(xué)習(xí)以外,分詞類(lèi)型也可以作為一個(gè)學(xué)習(xí)任務(wù),兩個(gè)任務(wù)共同訓(xùn)練這樣一個(gè)網(wǎng)絡(luò)。
③效果

如圖中表格所示,我們使用的多粒度分詞模型在很多任務(wù)上都有不錯(cuò)的效果。通過(guò)上面展示的示例可以看到,這種多粒度分詞方法也是一種靈活的分詞方式。
任務(wù)二:生成式對(duì)話
①問(wèn)題

針對(duì)生成式對(duì)話這樣的場(chǎng)景,一般輸入一個(gè)Question,輸出為一個(gè)Reply。通常我們會(huì)在互聯(lián)網(wǎng)社區(qū)獲取大量Q/R的數(shù)據(jù)作為訓(xùn)練語(yǔ)料來(lái)訓(xùn)練模型。傳統(tǒng)來(lái)說(shuō),這是一個(gè)序列到序列的生成任務(wù),跟翻譯模型的訓(xùn)練過(guò)程比較相近。
傳統(tǒng)的seq2seq模型使用Encoder和Decoder進(jìn)行建模,問(wèn)題是沒(méi)有預(yù)訓(xùn)練的過(guò)程。
另一種方法是使用類(lèi)似GPT的預(yù)訓(xùn)練方式,將Q和R在一起建模,中間使用[SEP]進(jìn)行分割,局限是在學(xué)習(xí)的過(guò)程中只能看到文本左邊的內(nèi)容,而不能對(duì)整個(gè)文本上下文進(jìn)行建模。
②方案

我們采用的是一種多任務(wù)的訓(xùn)練方法。先使用一個(gè)基礎(chǔ)的預(yù)訓(xùn)練模型(BERT-Base)來(lái)初始化生成式模型的參數(shù),接下來(lái)就對(duì)話任務(wù)進(jìn)行多任務(wù)的訓(xùn)練,比如MLM、PLM、Mask Pos Predict等語(yǔ)言模型訓(xùn)練任務(wù),最終在解碼階端可以采用通用的自回歸方式生成。
③效果

從實(shí)驗(yàn)對(duì)比來(lái)看,跟傳統(tǒng)的seq2seq、GPT相比,加入多任務(wù)訓(xùn)練的方式在針對(duì)回復(fù)相關(guān)性上有很明顯的提升。從上圖右邊示例中可以看到,隨著語(yǔ)料數(shù)據(jù)不斷的增大和模型多任務(wù)的學(xué)習(xí),生成的回復(fù)有很好的連貫性和相關(guān)性。
04
總結(jié)與展望1. 總結(jié)
本文主要介紹了推理效率、知識(shí)融入和任務(wù)適配。
推理效率:在知識(shí)蒸餾方面使用多教師模型集成蒸餾是一種可以將模型壓縮更小,保證模型效果的方法;而推理加速方面使用低精度推理和算子融合的方法可以幫助推理速度有幾倍的提升。
知識(shí)融入:在對(duì)話系統(tǒng)意圖識(shí)別任務(wù)中,通過(guò)在原始序列中加入槽位信息序列,使用attention的方法將兩個(gè)特征序列融合成一個(gè)序列。
任務(wù)適配:多粒度分詞任務(wù)是在輸入上加入適配的標(biāo)簽來(lái)指導(dǎo)輸出的一種自適應(yīng)的改變。生成式對(duì)話采用聯(lián)合多任務(wù)訓(xùn)練的方式能夠集成預(yù)訓(xùn)練和序列到序列的生成模型。
2. 展望
輕量級(jí)模型
知識(shí)融入
預(yù)訓(xùn)練平臺(tái)
原文標(biāo)題:小米在預(yù)訓(xùn)練模型的探索與優(yōu)化
文章出處:【微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
模型
+關(guān)注
關(guān)注
1文章
3627瀏覽量
51617 -
小米
+關(guān)注
關(guān)注
70文章
14507瀏覽量
150790 -
nlp
+關(guān)注
關(guān)注
1文章
491瀏覽量
23145
原文標(biāo)題:小米在預(yù)訓(xùn)練模型的探索與優(yōu)化
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
在Ubuntu20.04系統(tǒng)中訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的一些經(jīng)驗(yàn)
基于大規(guī)模人類(lèi)操作數(shù)據(jù)預(yù)訓(xùn)練的VLA模型H-RDT
沐曦MXMACA軟件平臺(tái)在大模型訓(xùn)練方面的優(yōu)化效果
AI原生架構(gòu)升級(jí):RAKsmart服務(wù)器在超大規(guī)模模型訓(xùn)練中的算力突破
用PaddleNLP為GPT-2模型制作FineWeb二進(jìn)制預(yù)訓(xùn)練數(shù)據(jù)集
從Open Model Zoo下載的FastSeg大型公共預(yù)訓(xùn)練模型,無(wú)法導(dǎo)入名稱是怎么回事?
為什么無(wú)法使用Dla_compiler在OpenVINO?中編譯用于FPGA的IR模型?
用PaddleNLP在4060單卡上實(shí)踐大模型預(yù)訓(xùn)練技術(shù)
Meta組建四大專(zhuān)研小組,深入探索DeepSeek模型
【「基于大模型的RAG應(yīng)用開(kāi)發(fā)與優(yōu)化」閱讀體驗(yàn)】+大模型微調(diào)技術(shù)解讀
《具身智能機(jī)器人系統(tǒng)》第7-9章閱讀心得之具身智能機(jī)器人與大模型
KerasHub統(tǒng)一、全面的預(yù)訓(xùn)練模型庫(kù)
GPU是如何訓(xùn)練AI大模型的
名單公布!【書(shū)籍評(píng)測(cè)活動(dòng)NO.52】基于大模型的RAG應(yīng)用開(kāi)發(fā)與優(yōu)化
什么是大模型、大模型是怎么訓(xùn)練出來(lái)的及大模型作用

小米在預(yù)訓(xùn)練模型的探索與優(yōu)化
評(píng)論