詳解開源雙語預(yù)訓(xùn)練模型GLM-130B(含代碼復(fù)現(xiàn))
來源:投稿 作者:毛華慶
編輯:學(xué)姐
前言
本課程來自深度之眼《大模型——前沿論文帶讀訓(xùn)練營》公開課,部分截圖來自課程視頻。
本次分享為課程學(xué)習(xí)筆記,建議搭配視頻食用。
視頻鏈接:https://ai.deepshare.net/p/t_pc/goods_pc_detail/goods_detail/p_6437a874e4b0b2d1c407396e
論文標(biāo)題:GLM-130B: AN OPEN BILINGUAL PRE-TRAINED MODEL
Glm-130B:開放的雙語預(yù)訓(xùn)練模型論文鏈接:https://arxiv.org/pdf/2210.02414.pdf
作者:Hugo Touvron等
單位:清華大學(xué)
發(fā)表時間:ICLR 2023
項(xiàng)目地址:https://github.com/THUDM/GLM-130B
這個模型有個輕量化版本GLM-6B
泛讀
這個模型是清華大學(xué)KEG實(shí)驗(yàn)室+智譜AI提出來的,因此對中文的支持效果比較明顯。
相關(guān)知識
要get這個模型的創(chuàng)新要了解三個(類)模型的優(yōu)缺點(diǎn)。
GPT
GPT堆疊了12個解碼器層。由于在這種設(shè)置中沒有編碼器,這些解碼器層將不會有普通transformer解碼器層所具有的編碼器-解碼器注意力子層。但是,它仍具有自注意力層。 屬于自回歸模型,主要優(yōu)點(diǎn)是可用來做生成任務(wù)。

從其模型結(jié)構(gòu)圖可以看到,模型只能看到當(dāng)前token以及之前的token,然后預(yù)測后面的token。

這里為什么GPT不用Transformer的Encoder進(jìn)行訓(xùn)練?
因?yàn)锽ERT類模型屬于深層雙向預(yù)測語言模型,在預(yù)測中存在自己看見自己問題(要預(yù)測的下一個詞在給定的序列中已經(jīng)出現(xiàn))達(dá)不到預(yù)期效果。
例如,模型的輸入是ABCD四個token,這里以B這個token為視角,進(jìn)入第二層后:

由于雙向的關(guān)系,消息傳播后(看箭頭),在第二層對應(yīng)位置可以看到信息如上圖所示。
進(jìn)入第三層后,紅框?qū)?yīng)的位置從邊上得到了B自身這個token的信息,失去了讓模型去學(xué)習(xí)預(yù)測B的意義。

Bert提出采用Masked Language Model(MLM)的方式來進(jìn)行訓(xùn)練。
BERT
從上面的推理可以看到,自編碼類的BERT使用堆疊的雙向Transformer Encoder,在所有層中共同依賴于左右上下文。
基礎(chǔ)版是12個Encoder (12層 );
高級版24個Encoder (24層 )
由于MLM的訓(xùn)練方式,BERT模型更加擅長做完形填空,也就是對語言的理解。
T5
T5是一個完整的Transformer結(jié)構(gòu),包含一個編碼器和一個解碼器,以T5、BART為代表,常用于有條件的生成任務(wù) (conditional generation),以下就示例就包含了:翻譯,問答,推理,摘要。
也就是說這類模型既可以做生成式任務(wù),也可以做理解式任務(wù)。

這樣的結(jié)構(gòu)雖然結(jié)合了上面兩種模型的優(yōu)點(diǎn)(要達(dá)到RoBERTa的指標(biāo)),但是帶來的問題也是顯而易見的,就是參數(shù)量增大,往小的說是訓(xùn)練成本高、往大了說是不環(huán)保,不利于實(shí)現(xiàn)碳中和。這個也是GLM解決的一個痛點(diǎn)之一。
小結(jié)
時下主流的預(yù)訓(xùn)練框架可以分為三種:
autoregressive 自回歸模型的代表是GPT,本質(zhì)上是一個從左到右的語言模型,常用于無條件生成任務(wù)(unconditional generation)。
autoencoding 自編碼模型是通過某個降噪目標(biāo)(如掩碼語言模型)訓(xùn)練的語言編碼器,如BERT、ALBERT、DeBERTa、RoBERTa。自編碼模型擅長自然語言理解任務(wù)(NLU,natural language understanding tasks),常被用來生成句子的上下文表示。
encoder-decoder 則是一個完整的Transformer結(jié)構(gòu),包含一個編碼器和一個解碼器,以T5、BART為代表,常用于有條件的生成任務(wù) (conditional generation)
GLM的思想就是想要結(jié)合以上幾種模型的優(yōu)點(diǎn),又不增加太多的參數(shù)量。 當(dāng)下的ChatGPT表現(xiàn)出來的不單單可以生成,還能做問答和理解,其原因是大模型的涌現(xiàn)現(xiàn)象,吃數(shù)據(jù)到一定程度,生成的答案可以達(dá)到問答和理解的效果。
背景介紹
GLM-130B是一個雙語(英語和漢語)預(yù)訓(xùn)練的語言模型,具有1300億個參數(shù),使用了General Language Model (GLM)的算法。
ChatGLM 參考了 ChatGPT 的設(shè)計(jì)思路,在千億基座模型 GLM-130B 中注入了代碼預(yù)訓(xùn)練,通過有監(jiān)督微調(diào)(Supervised Fine-Tuning)等技術(shù)實(shí)現(xiàn)人類意圖對齊。ChatGLM 當(dāng)前版本模型的能力提升主要來源于獨(dú)特的千億基座模型 GLM-130B。
GLM-130B可以支持多種自然語言處理任務(wù),如文本生成、文本理解、文本分類、文本摘要等,應(yīng)用場景寬泛,如機(jī)器翻譯、對話系統(tǒng)、知識圖譜、搜索引擎、內(nèi)容生成等。
GLM-130B在多個英語和漢語的基準(zhǔn)測試中優(yōu)于其他模型,如GPT-3 175B、OPT-175B、BLOOM-176B、ERNIE TITAN 3.0 260B等。
重點(diǎn):開源模型
ChatGLM內(nèi)測申請:https://chatglm.cn/
問:為什么要使用英文?
有研究發(fā)現(xiàn),使用代碼作為語料喂給預(yù)訓(xùn)練模型能提高模型的推理能力,代碼語料通常是英文的。
主要貢獻(xiàn)和創(chuàng)新點(diǎn)
GLM-130B是目前較大的開源雙語預(yù)訓(xùn)練模型,而GLM-6B也是可以在單個服務(wù)器上單張GPU上支持推理的大模型。
GLM-130B使用了GLM算法,實(shí)現(xiàn)了雙向密集連接的模型結(jié)構(gòu),提高了模型的表達(dá)能力和泛化能力。
GLM-130B在訓(xùn)練過程中遇到了多種技術(shù)和工程挑戰(zhàn),如損失波動和不收斂等,提出了有效的解決方案,并開源了訓(xùn)練代碼和日志(48頁的論文里面有很大部分是這塊內(nèi)容)。
GLM-130B利用了一種獨(dú)特的縮放性質(zhì),實(shí)現(xiàn)了INT4量化,幾乎沒有精度損失,并且支持多種硬件平臺(國產(chǎn)平臺可用,不一定要英偉達(dá))。
GLM 6B
ChatGLM-6B參數(shù)量是62億,支持中英雙語,可在單張 2080Ti 上進(jìn)行inference。FP16半精度浮點(diǎn)模式下需要13GB顯存,如果使用INT4模式,大概只需要7GB即可。生成序列長度達(dá)到2048,并做了人類意圖對齊訓(xùn)練。
精讀
先回顧前面講的三個模型以及GLM的改進(jìn)

可以看到GLM要把三個模型優(yōu)點(diǎn)結(jié)合起來,靠的就是自定義的MASK,其主要思想如下表:

自定義Mask
假定有一句話表示為:

對這句話隨機(jī)采樣得到一些片段(span),注意是隨機(jī)采樣,假設(shè)結(jié)果是2個片段,分別用綠色和黃色標(biāo)記:

將采樣后的片段拿出來后原來一句話就分成了兩耙:

然后用以下方式進(jìn)行訓(xùn)練:

下面藍(lán)色部分是GLM中Encoder的輸入,后面黃色和綠色部分對應(yīng)的是Decoder的輸入。
學(xué)過NLP的都知道MSE幾個字母分別代表mask、start、end。
上面輸出中,由于黃色部分是根據(jù)前面藍(lán)色部分(相當(dāng)于條件)生成的,因此這個部分相當(dāng)于T5模型的生成結(jié)果;綠色部分只遮擋了一個詞,前面的信息都可以看見,因此相當(dāng)于BERT模型的生成結(jié)果,整個自注意力掩碼如下圖所示:

藍(lán)色方框部分所有token都是可以看到上下文的;
黃色部分能看到藍(lán)色所有token以及黃色的上文部分;
綠色部分可以看到藍(lán)色和黃色所有token。
更準(zhǔn)確的說:
Part A中的詞彼此可見(圖(d)中藍(lán)色框中的區(qū)域)
Part B中的詞單向可見(圖(d)淡黃色的區(qū)域,綠色其實(shí)也是,但是綠色部分只有一個詞)
Part B可見Part A(圖(d)中紅色框中的區(qū)域)
其余不可見(圖(d)中灰色的區(qū)域)
以上是GLM模擬T5和BERT的方法,如果將所有token都mask掉,那么就模擬了GPT模型:

模型量化
這個的技術(shù)的貢獻(xiàn)是減少了顯存的使用。主要做法就是使用低精度的INT4類型來保存模型,當(dāng)然這樣做的前提是保證不降低大幅度模型性能為代價。
現(xiàn)實(shí)生活中也有對應(yīng)的例子:MP3
一首320kbps的MP3大概會有8-12M,而一首192kbps的MP3體積會縮小一倍,對于普通人(木耳)而言,并不太能分辨出后者在音質(zhì)上有所降低。
這里我也深有體會,之前做數(shù)據(jù)處理,讀取數(shù)據(jù)進(jìn)內(nèi)存的時候由于數(shù)據(jù)較大,內(nèi)存直接爆了,請教大佬后才明白,默認(rèn)讀取到內(nèi)存的數(shù)據(jù)類型是FLOAT型,占的位置較大,解決方案就是讀取到內(nèi)存之前將類型轉(zhuǎn)化為INT后就好了,由于數(shù)據(jù)本來就是整數(shù),沒有必要保存為類似1.000000的格式。
1TB 的中英雙語指令微調(diào)
實(shí)際上就是讓模型看各種類型的輸入,就好比和chatGPT進(jìn)行聊天時的輸入,同一個問題有各種問法,難的是如何讓模型去理解問題。如何(半)自動化的構(gòu)造輸入指令,對于提升模型的泛化性能非常有幫助。
RLHF
根據(jù)人類反饋進(jìn)行強(qiáng)化學(xué)習(xí)。
reinforcement learning from human feedback
該技術(shù)可以減少語料標(biāo)注成本,并讓模型逼近人類表現(xiàn)(或者說模型會變成人類期待的樣子)
PEFT
Parameter Efficient Fine-Tuning 是一種可以在顯存較少的情況下進(jìn)行微調(diào)的技術(shù)。
具體介紹可以參考:https://zhuanlan.zhihu.com/p/618894319?utm_id=0
訓(xùn)練策略
具體看論文附錄。
GLM-130B在一個由96個NVIDIA DGX-A100(8 * 40G)GPU節(jié)點(diǎn)組成的集群上進(jìn)行訓(xùn)練,每個節(jié)點(diǎn)有8張A100 GPU,每張GPU負(fù)責(zé)1.35億個參數(shù);
GLM-130B使用了ZeRO (Rajbhandari et al., 2020)作為優(yōu)化器,它可以有效地減少顯存占用和通信開銷,提高訓(xùn)練效率;
GLM-130B使用了混合精度訓(xùn)練(Mixed Precision Training)(Micikevicius et al.,2018)和梯度累積(Gradient Accumulation)(Chen et al., 2016)來提高訓(xùn)練速度和穩(wěn)定。
實(shí)驗(yàn)分析與討論
模型參數(shù)
GLM-130B的編碼器和解碼器都有96層,每層有64個注意力頭,每個頭的維度是128,隱藏層的維度是8192(64×128);
GLM-130B的總參數(shù)量是1300億(130B的由來),其中編碼器占了60%,解碼器占了40%;
GLM-130B使用了字節(jié)對編碼(BPE)(Sennrich et al., 2016)作為詞表,共有50萬個詞,其中25萬個是英語詞,25萬個是漢語詞。
六個指標(biāo)
準(zhǔn)確性,魯棒性,公平性,數(shù)字越大越好:

以上幾個指標(biāo)里面有一個Cohere開頭的模型貌似表示也很亮眼。
校準(zhǔn)誤差、偏見性、有毒性(涉及黃賭毒言論),數(shù)字越小越好,最后一個指標(biāo)GPT大概是由于語料上占優(yōu),因此性能較好。

以上結(jié)果來自斯坦福世界主流導(dǎo)向評測:https://arxiv.org/pdf/2211.09110.pdf
其中的圖26(p55)
GLM是這個報告中,中國唯一入選模型,準(zhǔn)確性、惡意性與GPT-3持平,魯棒性和校準(zhǔn)誤差在所有模型中表現(xiàn)最佳。
其他測評結(jié)果
某第三方基金開放評測結(jié)果,具備70%ChatGPT能力水平

國內(nèi)大模型能力評測
1)在中文語境下對古詩文理解、成語等理解更準(zhǔn)確
2)在命題寫作(續(xù)寫、語言風(fēng)格模仿等)中表現(xiàn)明顯較優(yōu)
3)答案更正能力更強(qiáng)
4)上下文理解能力明顯較
5)代碼輸出附加了解釋說明
6)暫無明顯無法回答的客觀問題
7)數(shù)學(xué)計(jì)算和邏輯推理能力略優(yōu)
代碼復(fù)現(xiàn)(6B)
環(huán)境準(zhǔn)備
https://github.com/pengwei-iie/ChatGLM-6B
服務(wù)器安裝配置見上一篇大模型論文復(fù)現(xiàn)筆記
打開終端,創(chuàng)建一個項(xiàng)目文件夾:
使用cd進(jìn)入該文件夾后,clone項(xiàng)目:
其中ptuning目錄是模型微調(diào)代碼,但是微調(diào)數(shù)據(jù)集需要單獨(dú)另外下載,具體后面講。
cli_demo.py
web_demo.py
這兩個是用來做預(yù)測的代碼。
從hugging face(https://huggingface.co/THUDM/chatglm-6b)下載模型到本地,下載地址:https://huggingface.co/THUDM/chatglm-6b/tree/main,可下載到另外一個目錄,文件比較大,務(wù)必確認(rèn)下載是否文件是否完整,否則會出現(xiàn)加載失敗的錯誤。

安裝依賴包:
運(yùn)行調(diào)用
代碼調(diào)用
代碼中加載分詞器和模型的部分可替換成為本地文件路徑,否則會自動從hugging face遠(yuǎn)程下載。
history是歷史對話信息
網(wǎng)頁服務(wù)
網(wǎng)頁服務(wù)基于Gradio,因此需要先安裝
然后就可以啟動網(wǎng)頁服務(wù)
會得到一個網(wǎng)址,復(fù)制到瀏覽器中即可進(jìn)行對話。
命令行調(diào)用
主要是運(yùn)行cli_demo.py,也是需要改里面路徑。
顯示加載模型后會顯示:
"歡迎使用 ChatGLM-6B 模型,輸入內(nèi)容即可進(jìn)行對話,clear 清空對話歷史,stop 終止程序"
這里默認(rèn)只能提問英文。
模型還可以使用API 進(jìn)行調(diào)用,具體看github說明,這里不贅述。
模型微調(diào)
原說明文件地址為:https://github.com/pengwei-iie/ChatGLM-6B/blob/main/ptuning/README.md
微調(diào)數(shù)據(jù)集下載地址為: https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1
下載的文件名稱為: AdvertiseGen.tar.gz
大小約16M,里面是兩個json文件
該數(shù)據(jù)集字典包含兩個字段:content、summary。
任務(wù)是根據(jù)content字段,生成一段廣告詞summary。
以下為單個樣本格式,星號可以看做分隔符,井號可看做冒號。
也可以根據(jù)以上格式準(zhǔn)備個性化領(lǐng)域數(shù)據(jù)來微調(diào)模型。
將下載后的AdvertiseGen.tar.gz解壓縮到模型所在ptuning文件夾下的AdvertiseGen文件夾內(nèi)。
打開train.sh

然后運(yùn)行:
如果要根據(jù)對話語料進(jìn)行訓(xùn)練,可使用
這個命令相對于上面的train.sh多了一個history_column參數(shù)用來指定保存對話歷史的字段名,另外一些參數(shù)的數(shù)字會有變化,例如max_source_length 會設(shè)置的大些,因?yàn)榘瑲v史記錄的對話序列會比較長。
關(guān)注“學(xué)姐帶你玩AI”公眾號
回復(fù)"大模型”免費(fèi)領(lǐng)取必讀論文+代碼合集