NLP模型應(yīng)用之三:GPT與GPT-2

GPT模型

GPT全稱Generative Pre-Training,出自2018年OpenAi發(fā)布的論文《Improving Language Understandingby Generative Pre-Training》,論文地址:https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf

在自然語言處理問題中遵岩,可從互聯(lián)網(wǎng)上下載大量無標(biāo)注數(shù)據(jù),而針對具體問題的有標(biāo)注數(shù)據(jù)卻非常少媒吗,GPT是一種半監(jiān)督學(xué)習(xí)方法往堡,它致力于用大量無標(biāo)注數(shù)據(jù)讓模型學(xué)習(xí)“常識”,以緩解標(biāo)注信息不足的問題翠拣。其具體方法是在針對有標(biāo)簽數(shù)據(jù)訓(xùn)練Fine-tune之前版仔,用無標(biāo)簽數(shù)據(jù)預(yù)訓(xùn)練模型Pretrain,并保證兩種訓(xùn)練具有同樣的網(wǎng)絡(luò)結(jié)構(gòu)误墓。

GPT底層也基于Transformer模型蛮粮,與針對翻譯任務(wù)的Transformer模型不同的是:它只使用了多個Deocder層。

下圖展示了在不修改模型主體結(jié)構(gòu)的情況下谜慌,如何使用模型適配多分類然想、文本蘊含、相似度欣范、多項選擇這幾類問題变泄。

圖片摘自論文

其左側(cè)展示了12層的Transformer Decoder模型,與Transformer基礎(chǔ)模型一致熙卡。右側(cè)展示了在Fine-Tune時杖刷,先將不同任務(wù)通過數(shù)據(jù)組合,代入Transformer模型驳癌,然后在基礎(chǔ)模型輸出的數(shù)據(jù)后加全連接層(Linear)以適配標(biāo)注數(shù)據(jù)的格式滑燃。

例如其中最簡單的分類任務(wù),如對于句子的感情色彩識別問題颓鲜,只涉及單個句子表窘,結(jié)果是二分類。因此甜滨,只需要代入句子乐严,其在最后加一個全連接層即可;而判斷相似度問題衣摩,由于兩句之間沒有相互關(guān)系昂验,則需要將兩句用加入定界符按不同前后順序連接,分別輸入模型,生成不同的隱藏層數(shù)據(jù)再代入最終的全連接層既琴。

模型實現(xiàn)

在預(yù)訓(xùn)練Pretrain部分占婉,用u表示每一個token(詞),當(dāng)設(shè)置窗口長度為k甫恩,預(yù)測句中的第i個詞時逆济,則使用第i個詞之前的k個詞,同時也根據(jù)超參數(shù)Θ磺箕,來預(yù)測第i個詞最可能是什么奖慌。簡言之,用前面的詞預(yù)測后面的詞松靡。

具體方法是代入Transformer模型简僧,下式中的模型由l組(組也可稱為塊block)隱藏層組成,最初輸入隱藏層的數(shù)據(jù)是詞編碼U乘詞嵌入?yún)?shù)We加上位置參數(shù)Wp击困;后面經(jīng)過l個層(如上圖左側(cè)的Transformer組)處理涎劈。

在有監(jiān)督訓(xùn)練Fine-tune部分,比如判斷句子感情色彩(二分類問題)的句子中包含m個詞x1…xm阅茶,在pretain訓(xùn)練好的模型之加后再加一個全連接層,用于學(xué)習(xí)描述輸入信息x與目標(biāo)y關(guān)系的參數(shù)Wy谅海,最終預(yù)測目標(biāo)y脸哀。

兼顧上式中的L1和L2,加入權(quán)重參數(shù)λ控制其比例計算出L3扭吁,作為優(yōu)化的依據(jù)撞蜂。

GPT與基本的Transformer相比,還進(jìn)行了以下修改:

  • 將GLUE(Gaussian Error Linear Unit)作為誤差函數(shù) GLUE可視為ReLU的改進(jìn)方法侥袜,ReLU將小于1的數(shù)據(jù)轉(zhuǎn)換成0蝌诡,大于1的部分不變,而GELU對其稍做調(diào)整枫吧,如下圖所示:
  • 位置編碼浦旱,基礎(chǔ)Transformer使用正余弦函數(shù)構(gòu)造位置信息,位置信息不需要訓(xùn)練相應(yīng)的參數(shù)九杂;而GPT將絕對位置信息作為編碼颁湖。

模型效果

GPT基于Transformer修改,在一個8億單詞的語料庫上訓(xùn)練例隆,12個Decoder層甥捺,12個attention頭,隱藏層維度為768镀层。

GPT在自然語言推理镰禾、分類、問答、對比相似度的多種測評中均超越了之前的模型(具體的測試以及對比效果詳見論文)吴侦。且從小數(shù)據(jù)集如STS-B(約5.7k訓(xùn)練數(shù)據(jù)實例)到大數(shù)據(jù)集(550k訓(xùn)練數(shù)據(jù))都表現(xiàn)優(yōu)異屋休。甚至通過預(yù)訓(xùn)練,也能實現(xiàn)一些Zero-Shot任務(wù)妈倔。但由于無標(biāo)簽數(shù)據(jù)與具體問題的契合度低博投,因此,學(xué)起來更慢盯蝴,需要的算力也更多毅哗。

GPT-2模型

GPT-2模型來自O(shè)penAi的論文《Language Models are Unsupervised Multitask Learners》無監(jiān)督的多任務(wù)學(xué)習(xí)語言模型,論文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf捧挺。

盡管目前很多有監(jiān)督學(xué)習(xí)NLP模型效果已經(jīng)很好虑绵,但都需要有針對單個任務(wù)訓(xùn)練使用大量有標(biāo)注數(shù)據(jù)訓(xùn)練,當(dāng)目標(biāo)的分布稍有變化則不能繼續(xù)使用闽烙,因此只能在狹窄的領(lǐng)域中起作用翅睛。GPT-2希望通過海量數(shù)據(jù)和龐大的模型參數(shù)訓(xùn)練出一個類似百科全書的模型,無需標(biāo)注數(shù)據(jù)也能解決具體問題黑竞。

GPT-2希望在完全不理解詞的情況下建模捕发,以便讓模型可以處理任何編碼的語言。GPT-2主要針對zero-shot問題很魂。它在解決多種無監(jiān)督問題時有很大提升扎酷,但是對于有監(jiān)督學(xué)習(xí)則差一些。

無監(jiān)督學(xué)習(xí)和有監(jiān)督學(xué)習(xí)的效果對比遏匆,就像兩個小孩子學(xué)習(xí)法挨,一個博覽群書,但看的不一定考幅聘;另一個尫材桑看考點,定點優(yōu)化帝蒿。結(jié)果就是一個在考試?yán)锩娉煽兏眉雒樱硪粋€能力更強,能解決各種問題陵叽,尤其適用于無確定答案的問題狞尔。它們在不同的領(lǐng)域各具特長。

目前翻譯巩掺、問答偏序、閱讀理解、總結(jié)等以文字作答的領(lǐng)域都可使用GPT-2生成答案胖替,其中最熱門的是續(xù)寫故事模型研儒,其續(xù)寫水平達(dá)到人類水平豫缨,具體使用方法是給出文章開頭,讓模型續(xù)寫接下來的故事端朵。由于無法控制接下來故事的內(nèi)容好芭,也有人將其稱為造謠神器,從而引發(fā)了一些可能出現(xiàn)的道德問題冲呢,以致于在論文發(fā)表初期并沒有發(fā)布效果最好的模型舍败,以免被人濫用。這也提示人們:寫作如果空話連篇言之無物敬拓,人還不如機(jī)器邻薯。

模型實現(xiàn)

GPT-2的結(jié)構(gòu)類似于GPT模型(也稱GPT-1.0),仍然使用單向的Transformer模型乘凸,只做了一些局部修改:如將歸一化層移到Block的輸入位置厕诡;在最后一個自注意力塊之后加了一層歸一化;增大詞匯量等等营勤。

與之前的實現(xiàn)方法最大的不同是:GPT-2的訓(xùn)練數(shù)據(jù)在數(shù)量灵嫌、質(zhì)量、廣泛度上都有大幅度提高:抓取了大量不同類型的網(wǎng)頁葛作,并且經(jīng)過篩選去重生成高質(zhì)量的訓(xùn)練數(shù)據(jù)寿羞,同時訓(xùn)練出體量更巨大的模型。

在Pretrain部分基本與GPT方法相同赂蠢,在Fine-tune部分把第二階段的Fine-tuning有監(jiān)督訓(xùn)練具體NLP任務(wù)稠曼,換成了無監(jiān)督訓(xùn)練具體任務(wù),這樣使得預(yù)訓(xùn)練和Fine-tuning的結(jié)構(gòu)完全一致客年。當(dāng)問題的輸入和輸出均為文字時,只需要用特定方法組織不同類型的有標(biāo)注數(shù)據(jù)即可代入模型漠吻,如對于問答使用“問題+答案+文檔”的組織形式量瓜,對于翻譯使用“英文+法文”形式。用前文預(yù)測后文途乃,而非使用標(biāo)注數(shù)據(jù)調(diào)整模型參數(shù)绍傲。這樣既使用了統(tǒng)一的結(jié)構(gòu)做訓(xùn)練,又可適配不同類型的任務(wù)耍共。雖然學(xué)習(xí)速度較慢烫饼,但也能達(dá)到相對不錯的效果。

對于Zero-Shot問題试读,則需要考慮目標(biāo)的風(fēng)格以及分布情況杠纵,并實現(xiàn)一些訓(xùn)練集到測試集的映射(如處理特殊符號、縮寫等)钩骇,從而實現(xiàn)從已知領(lǐng)域到未知領(lǐng)域的遷移學(xué)習(xí)比藻。GPT-2在Zero-Shot(尤其是小數(shù)據(jù)集Zero-Shot)以及長文本(長距離依賴)中都表現(xiàn)優(yōu)異铝量。下圖為GPT-2在童書詞性識別測試中的成績:位于人類水平之下,但超過了之前模型的水平银亲。

圖片摘自論文

模型效果

GPT-2是一個在海量數(shù)據(jù)集上訓(xùn)練的基于 transformer 的巨大模型慢叨。它從網(wǎng)絡(luò)上爬取800萬網(wǎng)頁40G的超大數(shù)據(jù)集「WebText」作為語言模型的訓(xùn)練數(shù)據(jù),并訓(xùn)練了大小不同的多個模型务蝠。

圖片摘自論文

最小的模型堆疊了 12 層與GPT正常模型大小一樣拍谐,中號24 層與BERT大模型等大,大號36 層馏段,特大號堆疊了 48 層仍能繼續(xù)fit轩拨,特大號的模型被稱為GPT-2,它有1600維隱藏層毅弧,參數(shù)規(guī)模達(dá)1.5G气嫁,還支持比之前更長的序列,和更長的batch_size够坐。涵蓋更多的知識寸宵,更大的存儲空間。特大模型在32個TPU上也需要約一周時間才能訓(xùn)練完成元咙。海量的訓(xùn)練數(shù)據(jù)梯影,龐大的網(wǎng)絡(luò)參數(shù),昂貴的算力庶香,模型優(yōu)化逐漸變成了資本戰(zhàn)爭甲棍,使普通人在該方向已經(jīng)很難超越。

代碼

推薦Pytorch版本的https://github.com/huggingface/transformers赶掖,其中包括各種基于Transformer的模型實現(xiàn)感猛,也包括GPT-2模型,代碼共700多行奢赂。既可訓(xùn)練模型陪白,也可使用現(xiàn)成模型。由于GPT與GPT-2邏輯變化不大膳灶,因此也可參考該代碼學(xué)習(xí)GPT咱士。

推薦GPT-2中文版本:https://github.com/Morizeyao/GPT2-Chinese,也由Pytorch工具開發(fā)轧钓,其核心基于上面介紹的GIT項目transformers序厉,并在外層做了一些封裝,主體是用于訓(xùn)練的train.py和用于生成文章的generate.py毕箍,程序都在200行左右弛房,非常適合用來學(xué)習(xí)調(diào)用Transformer模型以及實現(xiàn)中文模型的方法,其README中列出了各個文件對應(yīng)的具體功能霉晕。使用其核心代碼開發(fā)的詩歌生成器地址:https://jiuge.thunlp.cn/lvshi.html庭再,下面為藏頭詩功能示例:

使用方法:

  • 安裝
$ git clone https://github.com/Morizeyao/GPT2-Chinese

安裝requirements.txt中列出的支持工具捞奕,如:

$ pip install transformers==2.1.1
  • 訓(xùn)練
    創(chuàng)建data目錄,將訓(xùn)練數(shù)據(jù)寫入該目錄中的train.json文件中拄轻。 $ mkdir data
$ mv train.json data/ # 根目錄下有train.json示例文件 
$ python train.py --raw # 開始訓(xùn)練train.py 

如能正常運行颅围,訓(xùn)練之后model目錄下生成對應(yīng)模型。

  • 使用已有模型
    訓(xùn)練模型用時較長恨搓,可下載現(xiàn)成模型院促。下載GPT2-Chinese git項目的README中展示的散文模型,它是使用130MB語料斧抱,Batch size 16常拓,深度10層,訓(xùn)練10輪得到的散文模型辉浦,將下載的文件復(fù)制到model/final_model/目錄中(默認(rèn)模型位置)弄抬。

  • 生成文章

$ python ./generate.py --length=300 --nsamples=4 --prefix=秋日午后 --fast_pattern --save_samples --save_samples_path=/tmp/a 

生成以“秋日午后”開頭,長度為300個字符的散文宪郊,抓取其中一段如下:

解決具體問題

這里訓(xùn)練一個模仿小學(xué)生寫作文的模型掂恕,具體步驟如下:

  • 寫程序從某作文網(wǎng)站抓取四年級作文1000篇,以每篇500字計算弛槐,數(shù)據(jù)約1M多懊亡。

  • 數(shù)據(jù)清洗,去掉一些特殊字符乎串。 * 在散文模型的基礎(chǔ)上繼續(xù)訓(xùn)練店枣,命令形如:

$ python train.py --raw --batch_size=3 --pretrained_model=model/model_base/
  • 使用第3輪訓(xùn)練的模型,生成以“秋日午后”為開頭的300字作文
$ python ./generate.py --length=300 --nsamples=3 --prefix=秋日午后 --fast_pattern --save_samples --save_samples_path=/tmp/a/ --model_path=model/model_epoch3/ 

如果不使用預(yù)訓(xùn)練模型叹誉,只使用1000篇小學(xué)生作文訓(xùn)練3輪的模型幾乎連不成句鸯两。這里將散文模型作為預(yù)訓(xùn)練模型Pretrain,用小學(xué)生作文Fine-tune长豁,相對于獨立的散文模型甩卓,內(nèi)容中多了一些學(xué)校相關(guān)的內(nèi)容,由于二次訓(xùn)練的數(shù)據(jù)太少和訓(xùn)練次數(shù)都較少蕉斜,生成文章的效果不如之前的模型。

增加語料以及訓(xùn)練次數(shù)之后缀棍,模型將越發(fā)成熟:一開始的模型可能會重復(fù)一些常用字比如“我我的的”宅此;然后逐漸形成通暢地表達(dá);去掉重復(fù)以及相互矛盾的部分爬范;掌握更高級表達(dá)技巧……以上的結(jié)果只使用了1M-130M語料訓(xùn)練父腕,可以想見,當(dāng)語料增加到幾十G且使用更大模型時的效果青瀑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璧亮,一起剝皮案震驚了整個濱河市萧诫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枝嘶,老刑警劉巖帘饶,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異群扶,居然都是意外死亡及刻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門竞阐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缴饭,“玉大人,你說我怎么就攤上這事骆莹】怕В” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵幕垦,是天一觀的道長丢氢。 經(jīng)常有香客問我,道長智嚷,這世上最難降的妖魔是什么卖丸? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮盏道,結(jié)果婚禮上稍浆,老公的妹妹穿的比我還像新娘。我一直安慰自己猜嘱,他們只是感情好衅枫,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朗伶,像睡著了一般弦撩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上论皆,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天益楼,我揣著相機(jī)與錄音,去河邊找鬼点晴。 笑死感凤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粒督。 我是一名探鬼主播陪竿,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屠橄!你這毒婦竟也來了族跛?” 一聲冷哼從身側(cè)響起闰挡,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礁哄,沒想到半個月后长酗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡姐仅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年花枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掏膏。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劳翰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馒疹,到底是詐尸還是另有隱情佳簸,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布颖变,位于F島的核電站生均,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腥刹。R本人自食惡果不足惜马胧,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衔峰。 院中可真熱鬧佩脊,春花似錦、人聲如沸垫卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴肘。三九已至歇盼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間评抚,已是汗流浹背豹缀。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慨代,地道東北人耿眉。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鱼响,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子组底,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容