王小川的大模型打造秘籍首次曝光:五步走,兩個(gè)月煉成
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。
王小川兩個(gè)月交卷的大模型,是怎么煉成的?
現(xiàn)在,這個(gè)問題有了更為詳細(xì)的解。
70億參數(shù)、一經(jīng)發(fā)布就開源可商用,百川智能的中英文大模型baichuan-7B,近期在圈內(nèi)備受矚目。
從公開的benchmark測(cè)試效果以及社區(qū)的使用反饋來看,baichuan-7B的表現(xiàn)非常優(yōu)秀,據(jù)說清北也已經(jīng)用上了。
其源代碼也已在Github、Huggingface等平臺(tái)發(fā)布。
有趣的是,開源社區(qū)在圍繞baichuan-7B進(jìn)行實(shí)驗(yàn)和應(yīng)用構(gòu)建時(shí),GitHub項(xiàng)目LLM-Tuning的作者郭必?fù)P(beyondguo)發(fā)現(xiàn)了baichuan-7B的一個(gè)特殊能力。
他在做信息抽取實(shí)驗(yàn)的時(shí)候,自己胡編亂造了一段“新聞”,然后故意將“微軟”寫成“巨硬”,“亞馬遜”寫成“亞牛遜”,“谷歌”改為“谷嘎”……
然后使用下面的的instruction:
圖片
ChatGPT(3.5)的表現(xiàn)是這樣?jì)饍旱模?/p>
接下來就是鵝妹子嚶的時(shí)刻了:
特殊微調(diào)之后的 baichuan-7B把作者胡編亂造的公司名字,全都掰了回來?。?!
看到這,直接給郭必?fù)P(beyondguo)驚喜(驚嚇)?。?/p>
本來是亂編的新聞,這這這就說不清了?。?/p>
baichuan-7B的能力我們是看到了,但它開源也并不意味著人人都可以輕易復(fù)刻一個(gè)大模型出來。
源代碼只是算法的核心,也就是能夠看到模型結(jié)構(gòu)而已。
“一開源就能人手一份,進(jìn)行各種換皮魔改,同人逼死官方”這事兒,在大模型這兒行不通。
要得到一款和ChatGPT效果相仿的大模型,算法、算力和數(shù)據(jù)缺一不可。
拋開算力不講,從0到1構(gòu)建一款大模型,都需要哪些步驟?
這不,baichuan-7B給出了一份“高分案例”。
訓(xùn)練大模型五步走
官方透露,baichuan-7B的“煉化”過程可以歸納為五步。
第一步,構(gòu)建優(yōu)質(zhì)的數(shù)據(jù)集
數(shù)據(jù)是大模型的三要素之一。
語(yǔ)言模型是一種用于計(jì)算“一段文本”出現(xiàn)可能性的統(tǒng)計(jì)模型,其本質(zhì)是建模字、詞之間的關(guān)聯(lián)性。
這種字、詞之間的關(guān)聯(lián)性必須通過大量數(shù)據(jù)的分析和學(xué)習(xí)才能得到,因此數(shù)據(jù)對(duì)于大模型而言可以說是最重要的元素,預(yù)訓(xùn)練數(shù)據(jù)的質(zhì)量、多樣性、規(guī)模、代表性以及公平性和偏見等因素對(duì)模型性能有著決定性影響。
baichuan-7B模型在數(shù)據(jù)方面作了以下處理:
- 數(shù)據(jù)規(guī)模和多樣性:baichuan-7B的原始數(shù)據(jù)包括開源的中英文數(shù)據(jù)和自行抓取的中文互聯(lián)網(wǎng)數(shù)據(jù),以及部分高質(zhì)量知識(shí)性數(shù)據(jù)。這種構(gòu)建方式使其原始數(shù)據(jù)集包含了大量source的數(shù)據(jù),在過濾后也能有1.2T的量級(jí),同時(shí)也保證了數(shù)據(jù)的多樣性。
- 數(shù)據(jù)的公平性和偏見:為避免模型輸出有害性內(nèi)容,提升模型效果,baichuan-7B通過人工規(guī)則等方式過濾臟數(shù)據(jù),去掉了數(shù)據(jù)中的噪聲和有害數(shù)據(jù)。
- 數(shù)據(jù)質(zhì)量和代表性:經(jīng)過低質(zhì)過濾之后,baichuan-7B對(duì)得到的數(shù)據(jù)還進(jìn)行了去重處理和有代表性數(shù)據(jù)的選取。具體表現(xiàn)為,基于啟發(fā)式規(guī)則和質(zhì)量模型打分,對(duì)原始數(shù)據(jù)集進(jìn)行篇章和句子粒度的過濾;在全量數(shù)據(jù)上,利用局部敏感哈希方法,對(duì)篇章和句子粒度做濾重,從而減少數(shù)據(jù)中的重復(fù)pattern和不具備代表性的數(shù)據(jù),進(jìn)一步提升數(shù)據(jù)質(zhì)量。
整體流程如下圖所示:
圖片
此外,為了實(shí)現(xiàn)模型在多語(yǔ)言上的良好表現(xiàn),得到高質(zhì)量的數(shù)據(jù)集之后,baichuan-7B又采用了自動(dòng)化的數(shù)據(jù)采樣策略,最終確認(rèn)了一個(gè)在下游任務(wù)上表現(xiàn)最好的中英文配比。
第二步,制定合理的分詞策略
擁有了一個(gè)優(yōu)質(zhì)的數(shù)據(jù)集之后,需要思考的便是:
如何將數(shù)據(jù)集里面的語(yǔ)料充分利用起來?
目前大部分開源模型主要基于英文優(yōu)化,因此對(duì)中文語(yǔ)料存在效率較低的問題,這也是一些國(guó)外的大模型在中文生成方面表現(xiàn)相比英文較差的原因。
baichuan-7B采用了SentencePiece中的Byte-Pair Encoding(BPE)作為分詞算法,并且進(jìn)行了以下的優(yōu)化:
- 首先,使用2000萬(wàn)條以中英為主的多語(yǔ)言語(yǔ)料訓(xùn)練分詞模型,顯著提升對(duì)于中文的壓縮率。
- 其次,在數(shù)學(xué)領(lǐng)域參考了LLaMA和Galactica中的方案,對(duì)數(shù)字的每一位單獨(dú)分開,避免出現(xiàn)數(shù)字不一致的問題。
- 再次,針對(duì)罕見字詞(如特殊符號(hào)等),支持UTF-8 characters的byte編碼,做到了未知字詞的全覆蓋。
對(duì)比不同分詞器對(duì)語(yǔ)料的壓縮率,可見其分詞器明顯優(yōu)于LLaMA、Falcon等開源模型,在壓縮率相當(dāng)?shù)那闆r下,訓(xùn)練和推理效率更高。
第三步,打造良好的模型結(jié)構(gòu)
提到大模型,“大力出奇跡”是我們經(jīng)常掛在嘴邊的一句話,“力大磚飛”隱藏的含義是大模型并未在技術(shù)路線上取得革命性的突破,其底層技術(shù)基礎(chǔ)依舊是Transformer。
換言之,當(dāng)下的絕大部分大語(yǔ)言模型依舊是Transformer模型,只不過模型全部由Transformer的Decoder層構(gòu)成,具體分為以下幾個(gè)部分:
1、Position Embedding,即位置編碼。
在Transformer中所有token都被同樣的對(duì)待,沒有前后順序之分,因此需要加入一個(gè)Position Embedding用于表征詞之間的位置關(guān)系。
目前的位置編碼有絕對(duì)位置編碼和相對(duì)位置編碼兩種形式:
絕對(duì)位置編碼指的是直接將位置信息通過向量的形式融合到模型輸入中。
常用的兩種絕對(duì)位置編碼方法主要是在Transformers中使用的Sinusoidal Positional Encoding以及Convolutional Sequence-to-Sequence模型中使用的Learned Position Embeddings。
其中,Sinusoidal Positional Encoding在原始的Transformer模型(Vaswani等人,2017)中,引入了一種預(yù)定義的正弦函數(shù)作為位置編碼。這種方法會(huì)為每個(gè)位置生成一個(gè)固定向量,該向量的維度跟詞嵌入向量相同。
其優(yōu)點(diǎn)在于,它可以處理任意長(zhǎng)度的序列,不需要額外的學(xué)習(xí)過程,并且對(duì)于相對(duì)位置關(guān)系有一定的編碼能力。
Learned Position Embeddings由Gehring等人于2017年在Convolutional Sequence-to-Sequence模型中首次提出。
對(duì)于每個(gè)位置,模型都有一個(gè)對(duì)應(yīng)的嵌入向量,這個(gè)向量會(huì)在模型訓(xùn)練的過程中學(xué)習(xí)和優(yōu)化。
該方法的優(yōu)點(diǎn)在于,它可以根據(jù)具體的任務(wù)和數(shù)據(jù)集學(xué)習(xí)位置信息。然而,它的一大缺點(diǎn)是,由于位置嵌入數(shù)量固定,因此模型可能無法處理超過預(yù)先設(shè)定數(shù)量位置的序列。
相對(duì)位置編碼指的是在自注意力機(jī)制中引入兩個(gè)Token的相對(duì)位置信息。
目前,相對(duì)位置編碼主要有兩種常用方法:ROPE(Rotary Positional Embedding)和ALiBi(Attention with Linear Biases)。
ROPE可以不受固定長(zhǎng)度限制處理任意長(zhǎng)度的序列。其工作原理是,通過一個(gè)基于位置的旋轉(zhuǎn)矩陣將每個(gè)位置的嵌入旋轉(zhuǎn)到一個(gè)新的位置。
這種方法的優(yōu)點(diǎn)是,可以保持相對(duì)位置信息的一致性,在旋轉(zhuǎn)后,相鄰的位置仍然會(huì)有相似的嵌入。
ALiBi能夠讓Transformer語(yǔ)言模型在推理時(shí)可以處理比訓(xùn)練時(shí)更長(zhǎng)的序列。
它在處理文本序列時(shí)不使用實(shí)際的位置嵌入,而是在計(jì)算某個(gè)鍵和查詢之間的注意力時(shí),根據(jù)鍵和查詢之間的距離對(duì)查詢可以分配給鍵的注意力值進(jìn)行懲罰。當(dāng)鍵和查詢靠近時(shí),懲罰非常低,當(dāng)它們遠(yuǎn)離時(shí),懲罰非常高。
這種方法的動(dòng)機(jī)是,靠近的詞比遠(yuǎn)離的詞更重要。
2、Attention Layer,即注意力層。
其原理是通過加入注意力層使得不同Token之間能夠交互信息,進(jìn)而獲得整句話的表征。
目前大模型使用的Attention Layer分為多頭自注意力(Multi-Head Self-Attention)和稀疏自注意力(Sparse Self-Attention)兩種。
Multi-Head Self-Attention機(jī)制最早出現(xiàn)在”Attention is All You Need”(Vaswani et al., 2017)論文中,是Transformer模型的核心組成部分。
在多頭自注意力中,模型首先將輸入的嵌入向量分割成多個(gè)“頭”,每個(gè)頭都會(huì)獨(dú)立地進(jìn)行自注意力計(jì)算,最后所有頭的輸出會(huì)被連接起來并通過一個(gè)線性變換,形成最終的輸出。
其優(yōu)點(diǎn)是,每個(gè)頭都可以學(xué)習(xí)并關(guān)注輸入的不同方面,模型能夠同時(shí)關(guān)注來自不同位置的信息,從而捕獲更豐富的上下文信息。
Sparse Self-Attention是一種改進(jìn)的自注意力機(jī)制,它只關(guān)注輸入中的一部分元素。
這種方法的優(yōu)點(diǎn)是,可以顯著減少計(jì)算復(fù)雜性,使得模型能夠處理更長(zhǎng)的序列。
3、FFN Layer,即前饋神經(jīng)網(wǎng)絡(luò)。
其主要任務(wù)是處理來自Attention層的信息。
Attention機(jī)制能夠處理詞語(yǔ)之間的相互關(guān)系,但是它無法進(jìn)行更為復(fù)雜的、非線性的數(shù)據(jù)處理。
而FFN層可以在每個(gè)Transformer模塊中增加非線性處理能力,增強(qiáng)模型的整體表達(dá)能力。
在原始的Transformer模型中,F(xiàn)FN層通常由兩個(gè)線性變換和一個(gè)非線性激活函數(shù)(如ReLU或GELU)組成。
以下是一些FFN層的變種:
- 標(biāo)準(zhǔn)的FFN層:在”Attention is All You Need”(Vaswani et al., 2017)中,F(xiàn)FN層由兩個(gè)線性變換和一個(gè)非線性激活函數(shù)組成。具體來說,給定輸入x,F(xiàn)FN層的計(jì)算過程為:FFN(x) = max(0, xW1)W2,其中W1,b1,W2,b2是模型參數(shù),max(0, *)表示ReLU激活函數(shù)。
- Gated Linear Units(GLU)變種:在”Language Modeling with Gated Convolutional Networks”(Dauphin et al., 2017)中提出,GLU是一種特殊的激活函數(shù),它通過引入一個(gè)門控機(jī)制來控制信息的流動(dòng)。在FFN層中使用GLU可以幫助模型更好地捕捉輸入數(shù)據(jù)的復(fù)雜模式。GLU的計(jì)算公式為:GLU(x) = (xV + c) ? sigmoid(xW + b),其中?表示元素級(jí)別的乘法,sigmoid是sigmoid激活函數(shù)。
- Swish變種:在“Searching for Activation Functions”(Ramachandran et al., 2017)中提出,Swish是一種自門控的激活函數(shù),它的計(jì)算公式為:Swish(x) = Swish1(xW1)W2。在FFN層中使用Swish可以幫助模型更好地捕捉輸入數(shù)據(jù)的復(fù)雜模式。
- SwiGLU變種:在GLU Variants Improve Transformer中,作者提出了一種新的激活函數(shù)SwiGLU,它結(jié)合了Swish和GLU的優(yōu)點(diǎn)。SwiGLU的計(jì)算公式為:SwiGLU(x) = (xV + c) ? Swish1(xW + b),其中?表示元素級(jí)別的乘法,sigmoid是sigmoid激活函數(shù)。
baichuan-7B的模型結(jié)構(gòu)同樣基于Transformer。
在模型研發(fā)過程中,為了能夠讓模型在4096的窗口長(zhǎng)度內(nèi)擁有最好效果,同時(shí)在4096長(zhǎng)度外也具備較好的外推性能,baichuan-7B采取了和LLaMA相同的結(jié)構(gòu)設(shè)計(jì),而這些關(guān)鍵要素上的設(shè)計(jì)也和很多其他模型選擇的設(shè)計(jì)相類似。
社區(qū)中Saleforces所提出的XGen-7B和由Berkeley所提出的OpenLLaMA也是同樣的選擇,具體而言:
- Position Embedding采用ROPE相對(duì)位置編碼,相對(duì)編碼能夠讓模型獲得較好的外推能力。Meta的LLaMA、Google的PaLM、清華團(tuán)隊(duì)的ChatGLM2都使用了ROPE相對(duì)位置編碼。
- Attention Layer采用標(biāo)準(zhǔn)的Multi-Head Self-Attention,雖然目前很多稀疏自注意力層能夠在超長(zhǎng)文本中獲得較好的效果,但是這些方案由于使用了稀疏計(jì)算,對(duì)于4096長(zhǎng)度內(nèi)的效果會(huì)有一定的犧牲,使用標(biāo)準(zhǔn)的Multi-Head Self-Attention能夠讓大部分結(jié)果擁有更好的效果。
- FFN Layer采用SwiGLU,目前大部分SOTA模型都選擇使用SwiGLU作為FFN層,如2022年Google提出的PaLM模型,2023年META提出的LLaMA,最近清華團(tuán)隊(duì)發(fā)布的ChatGLM2等。
第四步,采用恰當(dāng)?shù)膬?yōu)化訓(xùn)練策略
訓(xùn)練策略也是模型取得較好結(jié)果的重要組成部分。
例如,初代GPT-3在當(dāng)時(shí)的訓(xùn)練框架下,基于V100訓(xùn)練1750億參數(shù)模型的整體機(jī)器利用率大概只有21.3%。這種極低的利用率會(huì)拉長(zhǎng)模型訓(xùn)練周期,影響模型迭代進(jìn)度。
為更好提升模型訓(xùn)練過程中的機(jī)器利用率,baichuan-7B針對(duì)訓(xùn)練策略也提出了很多優(yōu)化手段,具體包括:
首先,優(yōu)化了算子技術(shù),通過應(yīng)用更有效率的算子提高運(yùn)算效率,例如Flash-Attention和NVIDIA apex的RMSNorm,優(yōu)化后的Attention方法在非近似的基礎(chǔ)上可以顯著降低模型的顯存消耗。
其次,baichuan-7B利用算子切分技術(shù),對(duì)部分計(jì)算算子進(jìn)行切分,這樣在通信的時(shí)候會(huì)以更高效的nccl操作進(jìn)行通信,同時(shí)降低內(nèi)存峰值使用,以進(jìn)一步提升處理速度。
同時(shí),baichuan-7B還使用了混合精度技術(shù),在不犧牲模型準(zhǔn)確性的前提下,加速了計(jì)算過程。
此外,為了進(jìn)一步提高效率,baichuan-7B還采用了通信優(yōu)化技術(shù),具體包括:利用拓?fù)涓兄募贤ㄐ潘惴ū苊饩W(wǎng)絡(luò)擁堵問題,提高通信效率;根據(jù)卡數(shù)自適應(yīng)設(shè)置bucket size,提高帶寬利用率;根據(jù)模型和集群環(huán)境,調(diào)優(yōu)通信原語(yǔ)的觸發(fā)時(shí)機(jī),從而實(shí)現(xiàn)計(jì)算和通信的有效重疊。
最后,baichuan-7B還自研了一種名為訓(xùn)練容災(zāi)的技術(shù)。
訓(xùn)練大模型,需要的時(shí)間通常很長(zhǎng),很難保證GPU在訓(xùn)練過程中不出問題,特別是集群訓(xùn)練的時(shí)候,單卡硬件或者網(wǎng)絡(luò)錯(cuò)誤會(huì)導(dǎo)致整個(gè)集群停擺。因此在訓(xùn)練中斷后快速、自動(dòng)化定位故障、恢復(fù)服務(wù)非常重要。
通過訓(xùn)練平臺(tái)和訓(xùn)練框架的聯(lián)合優(yōu)化以及IaaS+PaaS的應(yīng)用,baichuan-7B實(shí)現(xiàn)了分鐘級(jí)的故障定位和任務(wù)恢復(fù),從而保證了訓(xùn)練的穩(wěn)定性和效率。
第五步,選擇合適的模型評(píng)價(jià)方法
完成數(shù)據(jù)集構(gòu)建,對(duì)數(shù)據(jù)集中的語(yǔ)料進(jìn)行分詞并在構(gòu)建好的模型中進(jìn)行預(yù)訓(xùn)練之后,為了解模型的各方面能力,還需要對(duì)模型進(jìn)行測(cè)試和評(píng)價(jià)。
不同于微調(diào)后的模型直接采用zero-shot(直接給prompt)的評(píng)估方式,預(yù)訓(xùn)練基座模型通常采取few-shot(給一些示例prompt)的評(píng)價(jià)方式來評(píng)估效果。
目前,比較權(quán)威的幾個(gè)評(píng)估數(shù)據(jù)集主要有中文數(shù)據(jù)集C-Eval數(shù)據(jù)集、Gaokao、AGIEval,英文數(shù)據(jù)集MMLU,代碼能力評(píng)估集Human Eval和數(shù)學(xué)能力評(píng)估集GSM8K、MATH等。
其中,C-Eval數(shù)據(jù)集是最全面的中文基礎(chǔ)模型評(píng)測(cè)數(shù)據(jù)集,涵蓋了52個(gè)學(xué)科和四個(gè)難度的級(jí)別;
Gaokao是以中國(guó)高考題作為評(píng)測(cè)大語(yǔ)言模型能力的數(shù)據(jù)集,用以評(píng)估模型的語(yǔ)言能力和邏輯推理能力;
AGIEval旨在評(píng)估模型在中文環(huán)境下,認(rèn)知和解決問題等相關(guān)的任務(wù)的能力;
MMLU是一個(gè)包含57個(gè)多選任務(wù)的英文評(píng)測(cè)數(shù)據(jù)集,涵蓋了初等數(shù)學(xué)、美國(guó)歷史、計(jì)算機(jī)科學(xué)、法律等,難度覆蓋高中水平到專家水平,是目前主流的LLM評(píng)測(cè)數(shù)據(jù)集。
中文評(píng)測(cè)方面,baichuan-7B在C-Eval、Gaokao和AGIEval的綜合評(píng)估中均獲得了優(yōu)異成績(jī),不僅遠(yuǎn)超其他同規(guī)模參數(shù)的大模型,甚至比某些參數(shù)規(guī)模更大的模型還要出色。
在英文能力上,選擇MMLU數(shù)據(jù)集進(jìn)行評(píng)測(cè),baichuan-7b的表現(xiàn)在同尺寸上也大幅領(lǐng)先。
圖片
值得一提的是,根據(jù)官方的github開源協(xié)議說明上,baichuan-7B開源的推理代碼采用了Apache2.0協(xié)議。
不同于其他基于LLaMA繼續(xù)訓(xùn)練(比如IDEA的ziya、鏈家的BELLE等)無法商用的模型,baichuan-7是原生訓(xùn)練的模型,可以自主定義模型權(quán)重的開源協(xié)議。
值得稱贊的是百川智能采用的是免費(fèi)可商用協(xié)議,比其他需要付費(fèi)商用有更大的自由度,開發(fā)者們可以直接使用預(yù)訓(xùn)練模型進(jìn)行各種實(shí)驗(yàn)研究,并完成部署和應(yīng)用。
開源VS閉源,哪一種模式最有效?
說完了大模型的訓(xùn)練步驟,最后來談一談開源的問題。
五月初,谷歌曾泄露出一份內(nèi)部文件,這份文件聲稱:“我們沒有護(hù)城河,OpenAI也沒有。當(dāng)我們還在爭(zhēng)吵時(shí),開源第三方已經(jīng)悄悄地?fù)屃宋覀兊娘埻搿薄?/p>
谷歌顯然已經(jīng)意識(shí)到了開源的影響,那么開源和閉源究竟哪一種模式更有效?
百川智能給出了他們的回答:
眾所周知大模型的訓(xùn)練成本極高,因此以閉源保證商業(yè)投入是比較有效的方式。
不過,開源創(chuàng)新早就已經(jīng)成為了軟件發(fā)展乃至于IT技術(shù)發(fā)展的一種主流技術(shù)形態(tài),超級(jí)計(jì)算機(jī)的操作系統(tǒng)幾乎都是用Linux這樣的開源軟件操作系統(tǒng)進(jìn)行構(gòu)建,智能手機(jī)的操作系統(tǒng)80%以上都由開源的安卓系統(tǒng)支持。
在大模型出現(xiàn)之前,深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)框架也幾乎都是開源的。
雖然目前OpenAI和谷歌都選擇了“閉門造車”,但是Meta卻走上了開源的道路,LLaMA開源之后迅速地吸引了大量開發(fā)者,這和互聯(lián)網(wǎng)時(shí)代Linux,移動(dòng)互聯(lián)網(wǎng)時(shí)代的安卓十分相似。
就像Linux和安卓都會(huì)在社區(qū)上開源出一個(gè)核心的版本,然后更多人在這個(gè)核心版本上根據(jù)他對(duì)需求和領(lǐng)域的理解進(jìn)行不斷地修改,低成本產(chǎn)生更多適應(yīng)未來發(fā)展的新版本,由環(huán)境來評(píng)價(jià),然后再迭代回來不斷地開發(fā)。
這種眾人拾柴的研發(fā)路徑在大模型時(shí)代無疑還將發(fā)揮巨大作用,開源和閉源究竟哪一個(gè)更有效現(xiàn)在還很難說,就像我們無法說iOS要安卓更有效一樣。
但是,未來的大模型生態(tài)一定會(huì)是壟斷與開源并存。