本文分享自華為云社區(qū)《【云駐共創(chuàng)】華為云之昇思MindSpore大模型專題(第二期)-第一課:ChatGLM》,作者: 愚公搬代碼。
前言
1.昇思MindSpore
昇思MindSpore是華為公司推出的一款全場(chǎng)景AI計(jì)算框架。它提供了自動(dòng)微分、分布式訓(xùn)練和推理、模型部署等功能,支持多種硬件平臺(tái),包括CPU、GPU和Ascend AI 處理器。MindSpore采用圖和算子相結(jié)合的編程模型,能夠高效地處理復(fù)雜的深度學(xué)習(xí)任務(wù)。它具有靈活的設(shè)計(jì)、高效的性能和易于使用的接口,使開發(fā)者能夠更快地開發(fā)和部署AI應(yīng)用。MindSpore還支持自定義操作和算法,可以滿足不同場(chǎng)景下的需求。
2.大模型
大模型是指具有數(shù)百萬(wàn)到數(shù)十億個(gè)參數(shù)的深度學(xué)習(xí)模型。這些模型通常用于處理大規(guī)模數(shù)據(jù)集,并能夠在各種任務(wù)上取得出色的性能。大模型通常需要大量的計(jì)算資源進(jìn)行訓(xùn)練,并且需要更長(zhǎng)的時(shí)間來(lái)收斂。然而,由于其具有更多的參數(shù),大模型可以更好地捕捉數(shù)據(jù)中的復(fù)雜關(guān)系,從而提升模型的預(yù)測(cè)性能。大模型的應(yīng)用范圍非常廣泛,包括自然語(yǔ)言處理、計(jì)算機(jī)視覺(jué)、語(yǔ)音識(shí)別等領(lǐng)域。
3.ChatGLM
ChatGLM是一種生成式語(yǔ)言模型,用于聊天和對(duì)話任務(wù)。它是基于OpenAI的GPT模型框架構(gòu)建的,采用了大規(guī)模的預(yù)訓(xùn)練數(shù)據(jù)集來(lái)學(xué)習(xí)語(yǔ)言模式和生成文本的能力。ChatGLM可以理解上下文并生成連貫、自然的回復(fù)。它可以用于構(gòu)建對(duì)話系統(tǒng)、智能客服、聊天機(jī)器人等應(yīng)用,能夠提供更加交互性和人性化的對(duì)話體驗(yàn)。ChatGLM模型的訓(xùn)練和優(yōu)化過(guò)程需要大量的計(jì)算資源和數(shù)據(jù),而且模型的生成性質(zhì)也需要進(jìn)行適當(dāng)?shù)谋O(jiān)督和過(guò)濾,以確保生成的回復(fù)符合預(yù)期的行為準(zhǔn)則和標(biāo)準(zhǔn)。
一、GLM Model Architecture
1.Evolution Tree of LLMs
Evolution Tree of LLMs(Language Model Megasuite的演化樹)是指由OpenAI發(fā)布的一系列語(yǔ)言模型的歷史和演化關(guān)系圖。
OpenAI的LLMs系列是一系列基于深度學(xué)習(xí)的語(yǔ)言模型,旨在生成人類語(yǔ)言的自然文本。這些模型中的每一個(gè)都是通過(guò)對(duì)大量文本進(jìn)行訓(xùn)練而得到的,可以用于自動(dòng)回答問(wèn)題、生成文章、翻譯文本等自然語(yǔ)言處理任務(wù)。
Evolution Tree of LLMs圖中展示了這些模型的發(fā)展歷程。從最早的模型開始,每個(gè)后續(xù)模型都是在前一個(gè)模型的基礎(chǔ)上進(jìn)行改進(jìn)和擴(kuò)展。這些改進(jìn)可能涉及模型的規(guī)模增加、訓(xùn)練數(shù)據(jù)的增加、架構(gòu)的改進(jìn)等。通過(guò)不斷地改進(jìn)和提升模型,OpenAI致力于推動(dòng)語(yǔ)言模型的發(fā)展,使其在各種自然語(yǔ)言處理任務(wù)上表現(xiàn)更加出色。
Evolution Tree of LLMs圖不僅展示了各個(gè)模型之間的關(guān)系,還反映了OpenAI在不同時(shí)間點(diǎn)的研究重點(diǎn)和技術(shù)進(jìn)展。這個(gè)圖可以幫助研究人員和開發(fā)者了解LLMs系列的發(fā)展歷程,從而更好地理解和應(yīng)用這些語(yǔ)言模型。
2.Autoregressive Blank Infilling
2.1 Autoregressive、Autoencoding、Encoder-Decoder
“Autoregressive”、"Autoencoding"和"Encoder-Decoder"是三種常見的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu),用于處理序列數(shù)據(jù)或生成模型。
Autoregressive(自回歸)模型是一種生成模型,它將序列數(shù)據(jù)的生成建模為一個(gè)逐步預(yù)測(cè)每個(gè)元素的條件概率的過(guò)程。在每個(gè)時(shí)間步,模型根據(jù)之前生成的元素預(yù)測(cè)當(dāng)前元素的概率分布。常見的Autoregressive模型包括語(yǔ)言模型,如OpenAI GPT模型,它可以生成與輸入序列相似的新文本。
Autoencoding(自編碼)模型是一類無(wú)監(jiān)督學(xué)習(xí)方法,用于學(xué)習(xí)輸入數(shù)據(jù)的緊湊表示。它由一個(gè)編碼器和一個(gè)解碼器組成。編碼器將輸入數(shù)據(jù)映射到低維表示,解碼器將該低維表示恢復(fù)到原始數(shù)據(jù)空間。Autoencoding模型的目標(biāo)是盡可能準(zhǔn)確地重建輸入數(shù)據(jù),同時(shí)學(xué)習(xí)到有用的特征表示。常見的Autoencoding模型包括Variational Autoencoder (VAE)和Denoising Autoencoder。
Encoder-Decoder(編碼器-解碼器)模型是一種常用的序列到序列(Sequence-to-Sequence)模型,用于處理輸入和輸出都是序列數(shù)據(jù)的任務(wù)。它由兩個(gè)部分組成:編碼器和解碼器。編碼器將輸入序列映射為固定大小的向量表示,解碼器使用該向量表示生成輸出序列。Encoder-Decoder模型可以在不同長(zhǎng)度的輸入和輸出序列之間進(jìn)行轉(zhuǎn)換,例如機(jī)器翻譯和文本摘要等任務(wù)。
GLM(自回歸填空)模型是一種靈活且多樣化的語(yǔ)言模型,可以根據(jù)給定的上下文生成缺失的部分內(nèi)容。根據(jù)已知的部分文本內(nèi)容生成可能的填空內(nèi)容。它可以用于自動(dòng)文本補(bǔ)全、問(wèn)答系統(tǒng)、語(yǔ)義理解和生成等多個(gè)自然語(yǔ)言處理任務(wù)中。
2.1 OpenAI GPT系列模型
自然語(yǔ)言處理領(lǐng)域的GPT(Generative Pre-trained Transformer)系列模型是由OpenAI開發(fā)的一系列強(qiáng)大的自然語(yǔ)言處理模型。下面是GPT系列模型的發(fā)展歷程:
GPT-1: GPT模型是于2018年發(fā)布的第一代模型。它使用了Transformer架構(gòu),預(yù)訓(xùn)練了一個(gè)大規(guī)模的語(yǔ)言模型,并使用無(wú)標(biāo)簽的文本數(shù)據(jù)進(jìn)行模型訓(xùn)練。這個(gè)模型的特點(diǎn)是生成連貫的文本,能夠完成一些基礎(chǔ)的自然語(yǔ)言處理任務(wù),如語(yǔ)言模型、文本分類和文本生成等。
GPT-2: 在2019年,OpenAI發(fā)布了GPT-2模型作為GPT的后續(xù)版本。GPT-2模型采用了更大的預(yù)訓(xùn)練模型,使用無(wú)標(biāo)簽的互聯(lián)網(wǎng)文本進(jìn)行訓(xùn)練。這個(gè)模型在生成文本方面取得了突破性的進(jìn)展,可以生成高質(zhì)量、連貫的文本,使得生成的文本內(nèi)容更具有逼真性。由于考慮到模型被濫用可能帶來(lái)的風(fēng)險(xiǎn),OpenAI最初限制了GPT-2的訪問(wèn),并未發(fā)布完整的模型。
GPT-3: GPT-3是在2020年發(fā)布的GPT系列的第三代模型。參數(shù)量達(dá)到了1750億個(gè),訓(xùn)練了十幾萬(wàn)小時(shí)。GPT-3在文本生成、文本補(bǔ)全、問(wèn)答系統(tǒng)等任務(wù)上表現(xiàn)出色,其生成的文本能夠接近人類水平的表達(dá)能力。GPT-3還可以通過(guò)提供一些文本提示來(lái)理解并回答問(wèn)題,具有較強(qiáng)的語(yǔ)言理解和推理能力。
GPT-4:在2023年,OpenAI發(fā)布了GPT-4,這是GPT系列的第四個(gè)模型。GPT-4比GPT-3系列大得多,具有1.8萬(wàn)億個(gè)參數(shù),而GPT-3只有1750億個(gè)參數(shù)。GPT4是一種多模態(tài)模型,而GPT3系列是一種自然語(yǔ)言處理模型。自然語(yǔ)言模型只能聽或看懂語(yǔ)言,而多模態(tài)模型可以處理多種媒體數(shù)據(jù),并且將他們整合到統(tǒng)一的語(yǔ)義空間之中。GPT4可接收的文字輸入長(zhǎng)度達(dá)到了驚人的32000字,而GPT3系列,只能輸入3000字。
2.3 Autoregressive Blank Infilling
Autoregressive Blank Infilling(ABI)是一種用于填充時(shí)間序列數(shù)據(jù)中缺失值的方法。在時(shí)間序列數(shù)據(jù)中,由于種種原因,可能會(huì)存在一些缺失值,這些缺失值會(huì)影響數(shù)據(jù)的完整性和準(zhǔn)確性。ABI方法通過(guò)基于自回歸模型,利用其他已有的數(shù)據(jù)來(lái)預(yù)測(cè)并填補(bǔ)缺失值。
ABI方法的基本思想是根據(jù)時(shí)間序列數(shù)據(jù)的自相關(guān)性,使用已有的數(shù)據(jù)點(diǎn)來(lái)逐個(gè)預(yù)測(cè)缺失值。具體來(lái)說(shuō),ABI方法使用AR模型(自回歸模型)來(lái)建模時(shí)間序列數(shù)據(jù)中的缺失值和非缺失值之間的關(guān)系。然后,根據(jù)該模型,利用其他已有的數(shù)據(jù)點(diǎn)來(lái)預(yù)測(cè)缺失值的數(shù)值。
ABI方法在填充缺失值時(shí),通常還會(huì)考慮一些其他因素,如數(shù)據(jù)的趨勢(shì)、季節(jié)性和周期性等。通過(guò)綜合考慮這些因素,ABI方法能夠更準(zhǔn)確地填充缺失值,從而提高數(shù)據(jù)的完整性和可靠性。
案例片段介紹如下:
順序分為A部分和B部分:
-
A部分:帶掩碼跨度的序列
-
B部分:在A部分中被掩蓋的原始跨度
如果多個(gè)跨度被遮罩,它們將在B部分中被打亂
B部分中的每個(gè)跨度都以[S]作為輸入,以[E]作為輸出。
該模型自回歸生成B部分——它基于前一部分預(yù)測(cè)下一個(gè)令牌。
A部分可以自行處理,但不能處理B部分
B部分可以關(guān)注A及其在B中的經(jīng)歷
2.4 Multi-Task Pretraining
Multi-Task Pretraining是一種多任務(wù)預(yù)訓(xùn)練的方法。在傳統(tǒng)的預(yù)訓(xùn)練方法中,語(yǔ)言模型通過(guò)在大規(guī)模文本數(shù)據(jù)上進(jìn)行訓(xùn)練來(lái)學(xué)習(xí)語(yǔ)言的通用模式和表示。然而,在Multi-Task Pretraining中,模型同時(shí)在多個(gè)任務(wù)上進(jìn)行訓(xùn)練,這些任務(wù)需要不同類型的語(yǔ)言理解能力。
Multi-Task Pretraining的思想是通過(guò)在多個(gè)任務(wù)上訓(xùn)練語(yǔ)言模型,可以學(xué)習(xí)到更加通用和魯棒的語(yǔ)言表示。這是因?yàn)椴煌娜蝿?wù)需要不同的語(yǔ)言技能,如句法分析、語(yǔ)義理解或文檔級(jí)連貫性。通過(guò)讓模型接觸多樣化的任務(wù),它可以學(xué)習(xí)捕捉不同任務(wù)之間的共同語(yǔ)言模式,并利用這些模式更好地泛化到新任務(wù)上。
Multi-Task Pretraining已被證明可以提高語(yǔ)言模型在下游任務(wù)上的性能。例如,預(yù)訓(xùn)練在多個(gè)任務(wù)上的模型在各種自然語(yǔ)言處理基準(zhǔn)測(cè)試中取得了最先進(jìn)的結(jié)果,如問(wèn)答、文本分類和命名實(shí)體識(shí)別。
其中一種常見的Multi-Task Pretraining方法是基于Transformer的模型,如BERT(雙向編碼器表示來(lái)自Transformer的方法)和RoBERTa(經(jīng)過(guò)優(yōu)化的魯棒BERT方法)。這些模型在掩碼語(yǔ)言建模、下一個(gè)句子預(yù)測(cè)和其他輔助任務(wù)上進(jìn)行預(yù)訓(xùn)練。
案例片段介紹如下:
通過(guò)改變遮蓋內(nèi)容的長(zhǎng)度和數(shù)量,從而使模型能夠基于natural language understanding, conditional generation, unconditional generation三類任務(wù)進(jìn)行預(yù)訓(xùn)練,實(shí)現(xiàn)“三合一”
改變?nèi)笔Э缍鹊臄?shù)量和長(zhǎng)度:
2.5 Finetuning
Finetuning是指在預(yù)訓(xùn)練的基礎(chǔ)上,將模型進(jìn)一步調(diào)整和優(yōu)化以適應(yīng)特定任務(wù)或特定數(shù)據(jù)集的過(guò)程。在機(jī)器學(xué)習(xí)中,預(yù)訓(xùn)練模型通常在大規(guī)模的數(shù)據(jù)上進(jìn)行訓(xùn)練,學(xué)習(xí)到通用的模式和特征表示。然而,這些預(yù)訓(xùn)練模型可能不直接適用于特定的任務(wù)或數(shù)據(jù)集。
通過(guò)Finetuning,可以利用預(yù)訓(xùn)練模型的通用知識(shí)和特征表示來(lái)快速適應(yīng)特定的任務(wù)或數(shù)據(jù)集。這通常涉及解凍預(yù)訓(xùn)練模型的一部分或全部層,并在目標(biāo)任務(wù)上進(jìn)行進(jìn)一步的訓(xùn)練。通過(guò)在目標(biāo)任務(wù)上微調(diào)模型參數(shù),可以使其更好地適應(yīng)任務(wù)的特定要求和數(shù)據(jù)特征。
Finetuning的過(guò)程通常包括以下步驟:
- 選擇預(yù)訓(xùn)練模型:選擇與目標(biāo)任務(wù)相匹配的預(yù)訓(xùn)練模型,如BERT或GPT等。
- 初始化參數(shù):將預(yù)訓(xùn)練模型加載到模型中,并凍結(jié)所有或部分層的參數(shù)。
- 構(gòu)建任務(wù)特定層:根據(jù)目標(biāo)任務(wù)的需求,構(gòu)建一個(gè)或多個(gè)任務(wù)特定的層。
- 訓(xùn)練:使用目標(biāo)任務(wù)的數(shù)據(jù)集,通過(guò)反向傳播和梯度下降等優(yōu)化算法,更新模型的參數(shù)。
- 調(diào)整超參數(shù):對(duì)模型進(jìn)行驗(yàn)證和評(píng)估,并根據(jù)結(jié)果調(diào)整超參數(shù),如學(xué)習(xí)率、批大小等。
- 重復(fù)迭代:根據(jù)需要,多次迭代訓(xùn)練和調(diào)整模型,直到達(dá)到滿意的性能。
Finetuning可以大大減少在特定任務(wù)上的訓(xùn)練時(shí)間和樣本需求,同時(shí)利用預(yù)訓(xùn)練模型的知識(shí)提供了更好的初始參數(shù)和特征表示。它已經(jīng)被廣泛應(yīng)用于自然語(yǔ)言處理、計(jì)算機(jī)視覺(jué)和其他領(lǐng)域中的許多任務(wù),如文本分類、問(wèn)答、命名實(shí)體識(shí)別等。
案例片段介紹如下:
GLM將NLG和NLU類下游任務(wù)統(tǒng)一為完型填空的生成式任務(wù),如對(duì)于分類任務(wù),將輸入x寫成一個(gè)填空問(wèn)題c(x),后將生成的答案v(y)映射至標(biāo)簽y
2.6 LLM Reversal Curse
LLM(Large Language Model)是指一種非常大的語(yǔ)言模型,它由數(shù)十億個(gè)參數(shù)組成,具有強(qiáng)大的語(yǔ)言理解和生成能力。大模型LLM可以實(shí)現(xiàn)諸如問(wèn)答、摘要、對(duì)話生成等任務(wù),被廣泛應(yīng)用于自然語(yǔ)言處理領(lǐng)域。
LLM Reversal Curse(逆轉(zhuǎn)詛咒)是指在使用大模型LLM進(jìn)行任務(wù)生成時(shí),其生成結(jié)果出現(xiàn)明顯的逆轉(zhuǎn)或反轉(zhuǎn)現(xiàn)象。具體而言,當(dāng)模型用于生成某個(gè)任務(wù)的結(jié)果時(shí),相比原始輸入,生成的結(jié)果可能會(huì)出現(xiàn)與原始意圖相反的內(nèi)容或表達(dá)。
例如,在問(wèn)答任務(wù)中,當(dāng)用戶提出一個(gè)問(wèn)題時(shí),大模型LLM應(yīng)該生成一個(gè)準(zhǔn)確且與問(wèn)題相符的答案。然而,由于模型的復(fù)雜性和訓(xùn)練數(shù)據(jù)的特點(diǎn),有時(shí)候模型會(huì)出現(xiàn)生成與問(wèn)題相反甚至荒謬的答案的情況。
這種逆轉(zhuǎn)詛咒可能是由于模型在訓(xùn)練過(guò)程中接觸到了大量的噪聲數(shù)據(jù)、錯(cuò)誤標(biāo)注的數(shù)據(jù)或具有偏見的數(shù)據(jù),導(dǎo)致模型在生成過(guò)程中出現(xiàn)了一些意料之外的結(jié)果。
為了解決大模型LLM的逆轉(zhuǎn)詛咒問(wèn)題,需要進(jìn)一步優(yōu)化模型的訓(xùn)練數(shù)據(jù)、標(biāo)注過(guò)程和生成算法,以提高模型的生成質(zhì)量和準(zhǔn)確性。
案例片段介紹如下:
3. 2D Positional Encoding
2D positional encoding是一種將2D網(wǎng)格或圖像中元素的位置信息進(jìn)行編碼的技術(shù)。位置編碼通常在自然語(yǔ)言處理任務(wù)中使用,例如機(jī)器翻譯或語(yǔ)言建模,來(lái)表示句子中單詞的順序或位置。然而,它也可以應(yīng)用于2D網(wǎng)格或圖像。
對(duì)于2D網(wǎng)格或圖像,位置編碼可以用于編碼每個(gè)元素的空間位置。這樣,模型可以有一種對(duì)元素之間的相對(duì)位置的感知,并捕捉它們之間的空間關(guān)系。
一個(gè)常見的2D位置編碼的方法是使用不同頻率的正弦和余弦函數(shù)。其思想是創(chuàng)建一個(gè)根據(jù)網(wǎng)格或圖像內(nèi)位置而變化的正弦信號(hào)。然后將這個(gè)位置編碼作為每個(gè)元素在網(wǎng)格或圖像中的額外輸入或特征。
位置編碼可以使用以下公式定義:
PE(x,2i) = sin(x / (10000^(2i / d_model))) PE(x,2i+1) = cos(x / (10000^(2i / d_model)))
其中,PE(x, i)表示位置i處元素x的位置編碼,d_model是模型的維度。
通過(guò)使用正弦和余弦函數(shù)的不同頻率,位置編碼可以捕捉位置信息中的不同模式或關(guān)系。
案例片段介紹如下:
模型輸入的position ids分為兩種,從而使得模型可以學(xué)習(xí)到片段生成的長(zhǎng)度
Position 1: Part A中token的絕對(duì)位置
-
Part A:從1開始排列
-
Part B:每一個(gè)span對(duì)應(yīng)Part A中[MASK]的位置
Position 2:intra-span position,masked span內(nèi)部的相對(duì)位置
- Part A:0
- Part B:每個(gè)span的token從1開始排列
3.1 大模型訓(xùn)練最大挑戰(zhàn):訓(xùn)練穩(wěn)定性
-
權(quán)衡利弊:訓(xùn)練穩(wěn)定性(高精度低效)還是訓(xùn)練效率(低精度高效)
-
目前已開源訓(xùn)練過(guò)程大模型的解決方案
- FB OPT-175B:訓(xùn)練崩潰時(shí)反復(fù)調(diào)整學(xué)習(xí)率/跳過(guò)數(shù)據(jù)(權(quán)宜之計(jì),損失性能)
- HF BLOOM 176B:embedding norm和BF16(損失性能,有限適配平臺(tái))
3.2 GLM-130B:穩(wěn)定訓(xùn)練方法
GLM-130B是一個(gè)穩(wěn)定訓(xùn)練方法,它是機(jī)器學(xué)習(xí)中的一種算法。GLM代表廣義線性模型,130B表示這個(gè)算法的特定版本。
穩(wěn)定訓(xùn)練方法是指通過(guò)一定的技巧和策略來(lái)增強(qiáng)模型的穩(wěn)定性和魯棒性,使其能夠更好地處理噪聲和異常數(shù)據(jù)。在訓(xùn)練過(guò)程中,穩(wěn)定訓(xùn)練方法會(huì)對(duì)輸入樣本或特征進(jìn)行一些改變或調(diào)整,以減少模型對(duì)于噪聲的敏感性。
GLM-130B的穩(wěn)定訓(xùn)練方法可能包括以下幾個(gè)方面:
- 數(shù)據(jù)預(yù)處理:對(duì)輸入數(shù)據(jù)進(jìn)行去噪、歸一化、特征選擇等預(yù)處理操作,以減少噪聲對(duì)模型訓(xùn)練的影響。
- 正則化:通過(guò)添加正則化項(xiàng)來(lái)限制模型的復(fù)雜度,防止過(guò)擬合,提高模型的泛化能力。
- 異常值處理:通過(guò)識(shí)別和處理異常值,減少它們對(duì)模型訓(xùn)練的影響。
- 隨機(jī)化:引入隨機(jī)化因素,如隨機(jī)選擇樣本、隨機(jī)初始化參數(shù)等,以增加模型的穩(wěn)定性和抗噪能力。
- 交叉驗(yàn)證:使用交叉驗(yàn)證來(lái)評(píng)估模型的性能,并選擇最佳的參數(shù)配置,避免對(duì)特定數(shù)據(jù)集過(guò)擬合。
- 集成學(xué)習(xí):通過(guò)集成多個(gè)模型的預(yù)測(cè)結(jié)果,綜合考慮它們的意見,提高整體模型的性能和穩(wěn)定性。
案例片段介紹如下:
Attention score 層:Softmax in 32 避免上下溢出
調(diào)小 Embedding 層梯度,緩解前期梯度爆炸問(wèn)題
word_embedding = word_embedding * alpha + word_embedding .detach() * (1 ? alpha)
3.2 GLM-130B:大量實(shí)驗(yàn)確定最優(yōu)架構(gòu)
有時(shí)候需要進(jìn)行多次實(shí)驗(yàn)來(lái)確定最佳的架構(gòu)設(shè)計(jì)。這些實(shí)驗(yàn)可能包括調(diào)整不同的參數(shù)、添加或移除不同的組件,以及測(cè)試不同的配置選項(xiàng)。GLM-130B是根據(jù)這些實(shí)驗(yàn)的結(jié)果和分析,確定出的最佳架構(gòu)。
案例片段介紹如下:
DeepNorm:穩(wěn)定訓(xùn)練 1000 層 Post-LN 的方法
旋轉(zhuǎn)位置編碼(RoPE):適用于 GLM 的相對(duì)位置編碼
門控注意單元(GLU):FFN 層的替換,穩(wěn)定提升模型性能
3.3 Post LayerNorm
Post LayerNorm(后層歸一化)是一種神經(jīng)網(wǎng)絡(luò)層歸一化的方法,用于解決深層神經(jīng)網(wǎng)絡(luò)中梯度消失和梯度爆炸問(wèn)題。傳統(tǒng)的 LayerNorm(層歸一化)是在每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸入上進(jìn)行歸一化操作,而 Post LayerNorm 是在每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸出上進(jìn)行歸一化操作。
具體來(lái)說(shuō),在每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸入和激活函數(shù)之間,先進(jìn)行 LayerNorm 的歸一化操作,然后再進(jìn)行激活函數(shù)的計(jì)算。這樣可以使得每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸出都在相似的尺度上,避免了梯度消失和梯度爆炸的問(wèn)題。
與之相比,傳統(tǒng)的 LayerNorm 在每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸入上進(jìn)行歸一化操作,但在深層網(wǎng)絡(luò)中,由于每層的輸入分布不穩(wěn)定,因此歸一化操作的效果可能會(huì)下降。而 Post LayerNorm 能夠在每個(gè)神經(jīng)網(wǎng)絡(luò)層的輸出上進(jìn)行歸一化操作,保證了歸一化的效果,提高了網(wǎng)絡(luò)的穩(wěn)定性和訓(xùn)練效果。
Post LayerNorm 是在 Transformer 網(wǎng)絡(luò)中被提出的,并在各個(gè)任務(wù)上取得了顯著的性能提升。它被認(rèn)為是一種更加有效和穩(wěn)定的歸一化方法,在大規(guī)模深層網(wǎng)絡(luò)的訓(xùn)練中具有重要的作用。
案例片段介紹如下:
重新排列層規(guī)范化和剩余連接的順序
3.4 GLU
GLU(Gated Linear Unit)是一種門控線性單元,用于增強(qiáng)神經(jīng)網(wǎng)絡(luò)的表示能力。通過(guò)將GLU應(yīng)用于MindSpore框架中的大型模型,可以進(jìn)一步提升模型的性能和效果。
GLU的核心思想是將輸入進(jìn)行分割成兩部分,然后通過(guò)門控機(jī)制控制兩部分的信息傳遞。這種門控機(jī)制可以幫助模型更好地理解輸入數(shù)據(jù)中的相關(guān)性,從而提高模型的表達(dá)能力和泛化能力。
在MindSpore框架中,GLU可以被用于各種任務(wù),包括自然語(yǔ)言處理、計(jì)算機(jī)視覺(jué)和語(yǔ)音識(shí)別等。通過(guò)使用MindSpore大模型GLU,研究人員和開發(fā)人員可以更輕松地構(gòu)建和訓(xùn)練復(fù)雜的模型,并獲得更好的結(jié)果。
案例片段介紹如下:
用GeLU替換ReLU激活
3.5 并行策略:高效訓(xùn)練千億模型
存下 GPT-3 模型需要 2.8T 顯存存放訓(xùn)練狀態(tài) + 中間激活函數(shù)值
挑戰(zhàn):遠(yuǎn)超單卡顯存(40GB),采取何種并行方式高效訓(xùn)練?
- 采用 ZeRO 優(yōu)化器在數(shù)據(jù)并行組內(nèi)分?jǐn)們?yōu)化器狀態(tài) → ~25%
遠(yuǎn)超單卡顯存,如何高效訓(xùn)練?
模型并行:將模型參數(shù)分布到多個(gè) GPU 上
- 張量并行:切分參數(shù)矩陣,每 GPU 計(jì)算一部分 → 額外通信,降低計(jì)算粒度
- 流水線并行:將網(wǎng)絡(luò)分成多段并行 → 引入流水線氣泡
- ZeRO-3:將參數(shù)分布到數(shù)據(jù)并行組中,算之前先取回參數(shù) → 額外通信時(shí)間
分析:流水線的氣泡占比: ????? $ 1 ,n / t << 4m 的時(shí)候可以忽略不計(jì)
并行策略:張量并行隨著模型規(guī)模增大緩慢擴(kuò)展,但不超過(guò)單機(jī)規(guī)模(<=8),其余全部使用流水線并行,通過(guò)調(diào)整微批處理大小減少氣泡占比
其他優(yōu)化
- 算子融合:融合多個(gè) element-wise 算子 → 提升 ~10% 計(jì)算速度
- 流水線平衡:流水線首尾階段各少放置一個(gè)層平衡占用 → 節(jié)省 ~10% 顯存
跨平臺(tái)兼容:swDeepSpeed 訓(xùn)練庫(kù) ? 與 DeepSpeed API 兼容
- 支持申威架構(gòu),一行代碼無(wú)縫替換兼容
- 實(shí)現(xiàn)并行通信策略,混合精度策略,ZeRO 優(yōu)化器
- 同一套訓(xùn)練框架可在三個(gè)集群上對(duì)齊訓(xùn)練曲線
import swDeepSpeed as deepspeed model, optimizer, _, _ = deepspeed.initialize( model=model, model_parameters=param_groups, args=args, mpu=mpu, dist_init_required=False, config_params=config_params )
測(cè)試集群配置:
- A100 集群(A100): 96 臺(tái) DGX-A100,每臺(tái) 2 張 200GB IB 網(wǎng)卡 硬件差異性大
- 海光GPU(Hygon):3000 臺(tái)機(jī)器,每臺(tái) 4 張 DCU 加速卡、4 張 50G IB 網(wǎng)卡
- 申威處理器(Sunway):8192 個(gè)節(jié)點(diǎn),每節(jié)點(diǎn)一塊 SW26010-PRO 處理器
4.Rotary Positional Embedding
4.1 Introduction of Positional Embedding
Positional Embedding(位置編碼)是一種用于處理序列數(shù)據(jù)的技術(shù),主要應(yīng)用于自然語(yǔ)言處理(NLP)任務(wù)中。在序列數(shù)據(jù)中,單詞的順序和位置對(duì)于語(yǔ)義的理解非常重要。位置編碼的目的是為了將單詞的位置信息融入到模型的表示中,使得模型能夠更好地理解單詞的順序和上下文關(guān)系。
傳統(tǒng)的詞向量表示只考慮了單詞的語(yǔ)義信息,而沒(méi)有考慮單詞的位置。位置編碼通過(guò)為每個(gè)單詞分配一個(gè)唯一的位置向量來(lái)解決這個(gè)問(wèn)題。常用的位置編碼方法包括相對(duì)位置編碼、絕對(duì)位置編碼、正弦位置編碼等。
在相對(duì)位置編碼中,每個(gè)單詞的位置編碼是相對(duì)于其他單詞的位置差異而得到的。絕對(duì)位置編碼則是將每個(gè)單詞的位置映射為一個(gè)唯一的位置向量。正弦位置編碼是一種常用的絕對(duì)位置編碼方法,通過(guò)使用正弦和余弦函數(shù)來(lái)生成位置向量,從而捕捉到不同位置之間的相對(duì)關(guān)系。
位置編碼的作用是為模型提供位置信息,幫助模型在處理序列數(shù)據(jù)時(shí)更好地理解單詞的上下文和關(guān)系。它通常與注意力機(jī)制和Transformer等模型結(jié)構(gòu)一起使用,為模型提供更豐富的上下文信息。
案例片段介紹如下:
自注意力機(jī)制主要關(guān)注詞語(yǔ)之間的相互關(guān)系,在計(jì)算中,根據(jù)詞語(yǔ)之間的語(yǔ)義關(guān)系來(lái)計(jì)算注意力分?jǐn)?shù),并不會(huì)考慮詞語(yǔ)之間的位置關(guān)系。
即使打亂序列中詞語(yǔ)的順序,依舊會(huì)得到相同的語(yǔ)義表達(dá)因此需要額外增加位置信息。
The dog chased the pig. = The pig chased the dog. = chased pig The the dog.
位置信息的表示有很多種,如
absolute positional embeddings:
- 原理:對(duì)于第k個(gè)位置的向量xk,添加位置向量pk(僅依賴于位置編號(hào)k),得到xk+pk
- 舉例/應(yīng)用模型:sinusoidal positional embedding(Transformer)、learned absolute positional embedding(BERT/RoBERTa/GPT)
relative positional embeddings:
- 原理:對(duì)于第m個(gè)和第n個(gè)位置的向量xm、xn,將相對(duì)位置m-n的信息添加到self-attention matrix中
- 舉例/應(yīng)用模型:T5
rotary positional embeddings
- 原理:使用旋轉(zhuǎn)矩陣對(duì)絕對(duì)位置進(jìn)行編碼,并同時(shí)在自注意力公式中引入了顯式的相對(duì)位置依賴。
- 舉例/應(yīng)用模型:PaLM/GPT-Neo/GPT-J/LLaMa1&2/ChatGLM1&2
4.2 Sinusoidal Positional Embedding
Sinusoidal Positional Embedding(正弦位置編碼)是一種用于編碼序列數(shù)據(jù)中單詞位置信息的方法,最初在Transformer模型中被引入。它是一種絕對(duì)位置編碼方法,通過(guò)正弦和余弦函數(shù)來(lái)生成位置向量,從而捕捉到不同位置之間的相對(duì)關(guān)系。
在正弦位置編碼中,每個(gè)單詞的位置編碼由兩個(gè)維度的正弦和余弦函數(shù)計(jì)算得到。具體計(jì)算公式如下:
PE(pos,2i) = sin(pos / 10000^(2i/d_model)) PE(pos,2i+1) = cos(pos / 10000^(2i/d_model))
其中,pos表示單詞在序列中的位置,i表示位置向量的維度索引,d_model表示模型的維度。這樣,每個(gè)單詞的位置編碼可以由位置索引pos和維度索引i計(jì)算得到。
正弦位置編碼的特點(diǎn)是,不同位置之間的位置向量是正弦和余弦函數(shù)的周期函數(shù)。這使得不同位置之間的位置向量能夠保持一定的相似性,從而幫助模型更好地理解位置信息并捕捉到序列中的順序關(guān)系。
正弦位置編碼通常與注意力機(jī)制和Transformer模型一起使用,用于為模型提供序列數(shù)據(jù)的位置信息。它的優(yōu)點(diǎn)是簡(jiǎn)單且可解釋,能夠有效地表達(dá)不同位置之間的相對(duì)關(guān)系。
案例片段介紹如下:
通過(guò)sine和cosine函數(shù)計(jì)算每個(gè)位置的positional embedding
-
優(yōu)點(diǎn):1. 可以反應(yīng)相對(duì)位置信息;2. 模型可以接受不同長(zhǎng)度的輸入
-
缺點(diǎn):數(shù)值為固定值,無(wú)法參與學(xué)習(xí)
PE(pos, 2i)=sin(pos/10000^2i/d_model) PE(pos, 2i+1)=cos?(pos/10000^2i/d_model)
4.3 Learned Positional Embedding
Learned Positional Embedding是一種在自然語(yǔ)言處理任務(wù)中用于編碼位置信息的技術(shù)。在傳統(tǒng)的Transformer模型中,位置編碼是通過(guò)固定的數(shù)學(xué)公式(如正弦函數(shù)或余弦函數(shù))來(lái)計(jì)算得到的。而Learned Positional Embedding則是通過(guò)在模型的嵌入層中引入可學(xué)習(xí)的參數(shù)來(lái)學(xué)習(xí)位置信息的表示。
傳統(tǒng)的位置編碼方法只能對(duì)句子的位置進(jìn)行大致的編碼,而Learned Positional Embedding可以更準(zhǔn)確地表示不同位置的信息。當(dāng)模型學(xué)習(xí)到不同位置的嵌入表示時(shí),它可以更好地區(qū)分不同位置的詞語(yǔ),并捕捉到位置信息對(duì)任務(wù)的影響。
Learned Positional Embedding的一個(gè)優(yōu)點(diǎn)是可以根據(jù)任務(wù)的需要進(jìn)行調(diào)整。傳統(tǒng)的位置編碼是固定的,不會(huì)隨著訓(xùn)練進(jìn)行調(diào)整。而Learned Positional Embedding可以通過(guò)反向傳播算法來(lái)優(yōu)化參數(shù),以更好地適應(yīng)不同任務(wù)的需求。
案例片段介紹如下:
將表示位置的position ids放入nn.Embedding,獲取大小為hidden size的positional embedding
-
優(yōu)點(diǎn):可以隨模型訓(xùn)練進(jìn)行參數(shù)更新
-
缺點(diǎn):可擴(kuò)展性差,只能表征在max_seq_length以內(nèi)的位置
4.4 Relative Positional Embedding
相對(duì)位置嵌入(Relative Positional Embedding)是一種用于編碼序列中元素之間相對(duì)位置關(guān)系的技術(shù),常用于自然語(yǔ)言處理和序列建模任務(wù)中。
在傳統(tǒng)的位置嵌入方法中,如正弦/余弦位置嵌入(Sinusoidal Positional Embedding)或?qū)W習(xí)位置嵌入(Learned Positional Embedding),每個(gè)位置的嵌入向量是固定的,不考慮其與其他位置的關(guān)系。但在很多任務(wù)中,序列中的元素之間的相對(duì)位置關(guān)系對(duì)于理解序列的語(yǔ)義和結(jié)構(gòu)非常重要。
相對(duì)位置嵌入通過(guò)將每個(gè)元素的位置嵌入向量與其他位置的偏移向量進(jìn)行組合,來(lái)編碼元素之間的相對(duì)距離。這樣,每個(gè)元素的位置嵌入向量會(huì)隨著其與其他元素的位置關(guān)系而變化,從而更好地捕捉序列中的局部結(jié)構(gòu)信息。
相對(duì)位置嵌入常用于Transformer模型中,在自注意力機(jī)制(Self-Attention)中使用。通過(guò)引入相對(duì)位置嵌入,Transformer可以更好地處理序列中元素之間的相對(duì)位置關(guān)系,從而提高序列建模的性能。在相對(duì)位置嵌入中,常見的方法是使用距離編碼矩陣(Distance Encoding Matrix)來(lái)計(jì)算偏移向量,然后與位置嵌入向量相加。
案例片段介紹如下:
在計(jì)算自注意力分?jǐn)?shù)時(shí),在query和key的dot product,以及最終注意力權(quán)重和value矩陣乘時(shí),分別額外添加一個(gè)表示位置m和位置n相對(duì)位置信息的bias,僅依賴于m-n
優(yōu)點(diǎn):
-
可以直觀記錄詞語(yǔ)的相對(duì)位置信息
-
模型可接受不同長(zhǎng)度的輸入
缺點(diǎn):
- 訓(xùn)練和推理速度慢(尤其是長(zhǎng)序列的時(shí)候)
4.5 Rotary Positional Embedding
相關(guān)代碼如下:
4.5.1 2D case
Rotary Positional Embedding - 2D case是一種用于編碼二維序列中位置信息的方法,特別適用于Transformer等模型中的注意力機(jī)制。
在傳統(tǒng)的位置嵌入方法中,如正弦/余弦位置嵌入(Sinusoidal Positional Embedding)或?qū)W習(xí)位置嵌入(Learned Positional Embedding),每個(gè)位置的嵌入向量是固定的,不考慮其與其他位置的關(guān)系。但對(duì)于二維序列,僅使用位置索引的編碼方法無(wú)法很好地捕捉到元素在二維空間中的相對(duì)位置關(guān)系。
Rotary Positional Embedding - 2D case通過(guò)引入角度信息,能夠更好地編碼二維序列中元素的位置關(guān)系。具體來(lái)說(shuō),它使用了旋轉(zhuǎn)操作來(lái)編碼位置信息,這可以看作是將位置嵌入向量繞原點(diǎn)旋轉(zhuǎn)一定的角度。通過(guò)在嵌入向量中引入角度信息,可以更好地表示元素在二維空間中的相對(duì)位置。
在2D案例中,Rotary Positional Embedding通常與自注意力機(jī)制(Self-Attention)一起使用。在注意力機(jī)制中,通過(guò)將位置嵌入向量與注意力權(quán)重相乘,并進(jìn)行相應(yīng)的運(yùn)算,將位置信息引入注意力計(jì)算中。這樣,模型可以更好地理解元素之間的相對(duì)位置關(guān)系,從而提高序列建模的性能。
案例片段介紹如下:
以2D word vector為例,第m個(gè)位置的詞語(yǔ)可以用一個(gè)二維的向量xm表示,我們將它的query和key向量在2D平面上進(jìn)行逆時(shí)針旋轉(zhuǎn),旋轉(zhuǎn)角度取決于位置索引m
-
dog:?jiǎn)卧~dog在第0位,不進(jìn)行旋轉(zhuǎn)
-
The dog:?jiǎn)卧~dog在第1位,旋轉(zhuǎn)角度θ
-
The pig chased the dog:?jiǎn)卧~dog在第4位,旋轉(zhuǎn)角度4
這樣在計(jì)算xm和xnquery,key的點(diǎn)積時(shí),結(jié)果僅和(m-n)θ有關(guān),而非m或n
優(yōu)點(diǎn):
-
計(jì)算self-attention q,k點(diǎn)積時(shí),保留了詞語(yǔ)的相對(duì)位置信息(不會(huì)因詞語(yǔ)的絕對(duì)位置發(fā)生改變)
-
前面位置的positional embedding不受后續(xù)新增token的影響(easier to cache)
-
token之間的依賴會(huì)隨著相對(duì)距離的增長(zhǎng)而逐步衰減(符合認(rèn)知,距離越遠(yuǎn)的詞普遍關(guān)聯(lián)不大)
4.5.2 general form
Rotary Positional Embedding - general form是一種用于編碼位置信息的方法,通用形式適用于各種序列數(shù)據(jù),包括一維、二維或其他維度的序列。
在傳統(tǒng)的位置嵌入方法中,如正弦/余弦位置嵌入(Sinusoidal Positional Embedding)或?qū)W習(xí)位置嵌入(Learned Positional Embedding),每個(gè)位置的嵌入向量是固定的,不考慮其與其他位置的關(guān)系。但是,這種方法無(wú)法很好地捕捉到元素在序列中的相對(duì)位置關(guān)系。
Rotary Positional Embedding - general form通過(guò)引入旋轉(zhuǎn)操作,能夠更好地編碼序列中元素的位置關(guān)系。具體來(lái)說(shuō),它使用了旋轉(zhuǎn)矩陣來(lái)對(duì)位置嵌入進(jìn)行變換,這可以看作是將位置嵌入向量繞一個(gè)固定的軸旋轉(zhuǎn)一定的角度。通過(guò)在嵌入向量中引入旋轉(zhuǎn)信息,可以更好地表示元素在序列中的相對(duì)位置。
在一般形式中,Rotary Positional Embedding可以與注意力機(jī)制(Attention Mechanism)一起使用。在注意力機(jī)制中,通過(guò)將位置嵌入向量與注意力權(quán)重相乘,并進(jìn)行相應(yīng)的運(yùn)算,將位置信息引入注意力計(jì)算中。這樣,模型可以更好地理解元素之間的相對(duì)位置關(guān)系,從而提高序列建模的性能。
案例片段介紹如下:
- 將單詞的詞向量大小設(shè)定為2的倍數(shù)
- 第m個(gè)位置的詞向量在第i組2D sub-space(即向量中的2i,2i+1元素)的旋轉(zhuǎn)角度為mθ_i,θ_i與i以及詞向量的hidden size有關(guān)
二、From GLM to ChatGLM
1.傳統(tǒng)NLP的挑戰(zhàn)
1.1 挑戰(zhàn)1:傳統(tǒng)NLP vs 復(fù)雜問(wèn)題
傳統(tǒng)NLP(自然語(yǔ)言處理)方法通常用于處理簡(jiǎn)單的文本任務(wù),例如文本分類、命名實(shí)體識(shí)別和情感分析等。這些方法主要依賴于規(guī)則和模式,以及統(tǒng)計(jì)和機(jī)器學(xué)習(xí)算法。
對(duì)于復(fù)雜問(wèn)題,傳統(tǒng)NLP方法可能面臨一些挑戰(zhàn)。復(fù)雜問(wèn)題通常具有多義性、歧義性和上下文依賴性。例如,理解一個(gè)句子的意思可能需要考慮上下文信息和背景知識(shí)。此外,復(fù)雜問(wèn)題還可能涉及多種語(yǔ)言和跨語(yǔ)言的處理。
為了應(yīng)對(duì)復(fù)雜問(wèn)題,研究者們開始使用深度學(xué)習(xí)方法,如循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和注意力機(jī)制等。這些方法能夠更好地處理語(yǔ)義理解和生成,以及更好地捕捉文本的上下文信息。
復(fù)雜問(wèn)題還可能需要結(jié)合其他領(lǐng)域的知識(shí),例如知識(shí)圖譜、計(jì)算機(jī)視覺(jué)和知識(shí)推理等。這樣可以提供更全面的語(yǔ)義理解和推理能力。
1.2 挑戰(zhàn)2:傳統(tǒng)NLP vs 動(dòng)態(tài)知識(shí)
傳統(tǒng)NLP(自然語(yǔ)言處理)是一種基于規(guī)則和模式的方法,它主要依賴于人工編碼的語(yǔ)言規(guī)則和語(yǔ)法結(jié)構(gòu)來(lái)理解和處理文本。這些規(guī)則和結(jié)構(gòu)需要事先定義,并且通常需要大量的人工工作。
動(dòng)態(tài)知識(shí)(Dynamic Knowledge)則是一種基于知識(shí)圖譜和自動(dòng)學(xué)習(xí)的方法,它能夠根據(jù)實(shí)時(shí)的數(shù)據(jù)來(lái)自動(dòng)更新和擴(kuò)展知識(shí)庫(kù)。動(dòng)態(tài)知識(shí)利用機(jī)器學(xué)習(xí)和圖譜技術(shù),可以從大量的文本和語(yǔ)料庫(kù)中自動(dòng)提取和建立知識(shí)模型。
傳統(tǒng)NLP的一個(gè)主要優(yōu)勢(shì)是其可解釋性,因?yàn)樗械囊?guī)則和模式都是人工定義的,所以可以清楚地理解其工作原理。然而,它也存在一些缺點(diǎn),例如需要大量的人工工作來(lái)編寫和維護(hù)規(guī)則,而且對(duì)于復(fù)雜的語(yǔ)言現(xiàn)象和變化的語(yǔ)言規(guī)則往往無(wú)法適應(yīng)。
相比之下,動(dòng)態(tài)知識(shí)能夠通過(guò)機(jī)器學(xué)習(xí)和自動(dòng)學(xué)習(xí)的方式,自動(dòng)地從大量的文本中提取和建立知識(shí)模型。它可以自動(dòng)學(xué)習(xí)語(yǔ)言現(xiàn)象和規(guī)則的變化,并且可以根據(jù)實(shí)時(shí)的數(shù)據(jù)來(lái)更新和擴(kuò)展知識(shí)庫(kù)。動(dòng)態(tài)知識(shí)的優(yōu)點(diǎn)是其能夠處理復(fù)雜的語(yǔ)言現(xiàn)象和變化的語(yǔ)言規(guī)則,并且具有較強(qiáng)的適應(yīng)性和靈活性。
但動(dòng)態(tài)知識(shí)也存在一些挑戰(zhàn),例如其可解釋性相對(duì)較差,因?yàn)橹R(shí)模型是通過(guò)機(jī)器學(xué)習(xí)自動(dòng)學(xué)習(xí)的,所以很難直觀地理解其工作原理。此外,動(dòng)態(tài)知識(shí)的構(gòu)建和維護(hù)也需要大量的計(jì)算資源和數(shù)據(jù)支持。
案例片段介紹如下:
千億模型的動(dòng)態(tài)知識(shí)欠缺、知識(shí)陳舊、缺乏可解釋性
-
知識(shí)欠缺:長(zhǎng)尾知識(shí)
- 例如: 世界第二高的山峰(答案: K2格里峰)
-
知識(shí)陳日:GPT-3的訓(xùn)練數(shù)據(jù)截止2020年前
-
不可解釋:缺乏答案的參考源
1.3 挑戰(zhàn)3:傳統(tǒng)NLP vs 人類對(duì)齊
傳統(tǒng)NLP是基于機(jī)器學(xué)習(xí)和統(tǒng)計(jì)的方法,利用大量已標(biāo)注的語(yǔ)料庫(kù)來(lái)訓(xùn)練模型。這些模型可以識(shí)別和理解文本的語(yǔ)法結(jié)構(gòu)、詞義和語(yǔ)義關(guān)系等。傳統(tǒng)NLP方法包括語(yǔ)法分析、詞性標(biāo)注、命名實(shí)體識(shí)別、情感分析等技術(shù)。這些技術(shù)可以自動(dòng)處理大規(guī)模的文本數(shù)據(jù),并提供一些高級(jí)的語(yǔ)言處理功能。
人類對(duì)齊是指通過(guò)人工的方式對(duì)文本進(jìn)行處理和理解。人類對(duì)齊可以是通過(guò)人工標(biāo)注和標(biāo)記的方式,也可以是通過(guò)人工閱讀和理解的方式。人類對(duì)齊可以更準(zhǔn)確地理解文本的含義和語(yǔ)境,尤其在處理一些復(fù)雜的語(yǔ)言結(jié)構(gòu)和語(yǔ)義問(wèn)題時(shí)更具優(yōu)勢(shì)。人類對(duì)齊可以包括人工智能助手和人工翻譯等應(yīng)用。
傳統(tǒng)NLP和人類對(duì)齊兩種方法各有優(yōu)缺點(diǎn)。傳統(tǒng)NLP方法可以在處理大規(guī)模數(shù)據(jù)時(shí)提供高效的處理能力,但在面對(duì)復(fù)雜語(yǔ)義問(wèn)題時(shí)可能存在理解不準(zhǔn)確或無(wú)法捕捉語(yǔ)境的問(wèn)題。而人類對(duì)齊可以更準(zhǔn)確地理解文本的含義和語(yǔ)境,但在大規(guī)模處理和實(shí)時(shí)處理方面可能存在效率和成本的問(wèn)題。
案例片段介紹如下:
例如:請(qǐng)用幾句話給一個(gè)6歲小孩解釋登月
- 缺少高效"Prompt工程",GPT-3和GLM-130B都很難盡人意
2.從千億模型到ChatGLM的技術(shù)路線
千億模型GLM-130B是一個(gè)大規(guī)模語(yǔ)言模型,具有130億個(gè)參數(shù),用于自然語(yǔ)言處理任務(wù)。它采用了Transformer架構(gòu)和大規(guī)模預(yù)訓(xùn)練技術(shù),可以生成高質(zhì)量的文本。
GLM-130B+是在GLM-130B的基礎(chǔ)上進(jìn)行了改進(jìn)和優(yōu)化。它針對(duì)語(yǔ)言模型的訓(xùn)練過(guò)程進(jìn)行了一些調(diào)整,提升了模型的性能和效果。GLM-130B+在更多的自然語(yǔ)言處理任務(wù)上具有更好的表現(xiàn)。
GLM-130B++是在GLM-130B+的基礎(chǔ)上進(jìn)一步改進(jìn)的版本。它引入了更多的新技術(shù)和優(yōu)化策略,使得模型在處理長(zhǎng)文本、多語(yǔ)種和多任務(wù)上表現(xiàn)更出色。GLM-130B++具有更強(qiáng)大的表達(dá)能力和更好的泛化能力。
ChatGLM模型是基于GLM系列模型的一種變種,專門用于生成對(duì)話文本。它在GLM-130B++的基礎(chǔ)上進(jìn)行了一些改進(jìn),使得模型在對(duì)話生成任務(wù)上更加適用和有效。ChatGLM模型在生成對(duì)話內(nèi)容時(shí)可以更好地理解上下文和語(yǔ)境,并生成更具連貫性和合理性的對(duì)話文本。
3.ChatGLM的應(yīng)用場(chǎng)景
3.1 撰寫博客提綱
3.2 寫郵件
3.3 介紹自己的優(yōu)點(diǎn)缺點(diǎn)
3.4 寫劇本梗概
3.5 寫代碼
3.6 查詢常見知識(shí)/教程
3.7 多輪問(wèn)答
3.8 文字冒險(xiǎn)游戲
三、ChatGLM Demo
完整的課程學(xué)習(xí)地址:完整的課程學(xué)習(xí)地址
1.使用NPU+MindSpore Transformers試用ChatGLM推理
1.1 OpenI啟智運(yùn)行ChatGLM模型
1、到OpenI啟智申請(qǐng)賬號(hào),開啟云腦任務(wù)(NPU)/自己用GPU創(chuàng)建環(huán)境
OpenI啟智申請(qǐng)賬號(hào)地址:https://openi.pcl.ac.cn/user/sign_up
3、打開新創(chuàng)建的項(xiàng)目,點(diǎn)擊云腦,新建調(diào)試任務(wù)
4、點(diǎn)擊調(diào)試
5、進(jìn)入終端
其他操作如下面1.2小結(jié)
,這邊只是用OpenI啟智NPU+MindSpore進(jìn)行在線部署調(diào)試,部署結(jié)果如下圖:
1.2 MindSpore運(yùn)行ChatGLM模型
安裝MindSpore和MindSpore Transformers
a) MindSpore安裝:參考:MindSpore官網(wǎng)(如果用OpenI啟智NPU+MindSpore,可以忽略這一步,這步屬于本地部署)
b) MindSpore Transformers安裝:
1、git clone -b dev https://gitee.com/mindspore/mindformers.git 2、cd mindformers 3、bash build.sh 4、如果使用MindSpore1.10版本,請(qǐng)安裝MindFormers 0.6版本(git clone -b r0.6 …)
c) 克隆昇思MindSpore技術(shù)公開課代碼倉(cāng):
git clone https://github.com/mindspore-courses/step_into_llm.git
d)?cd step_into_llm/Season2.step_into_llm/01.ChatGLM/
e) 下載ckpt和tokenizer文件
1、ckpt:wget https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm/glm_6b.ckpt 2、tokenizer:wget https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm/ice_text.model
f) 運(yùn)行推理部署文件:python cli_demo.py
import os import platform import signal import numpy as np import mindspore as ms from mindformers.models.glm import GLMConfig, GLMChatModel from mindformers.models.glm.chatglm_6b_tokenizer import ChatGLMTokenizer from mindformers.models.glm.glm_processor import process_response config = GLMConfig( position_encoding_2d=True, use_past=True, is_sample_acceleration=True) ms.set_context(mode=ms.GRAPH_MODE, device_target="GPU", device_id=0) model = GLMChatModel(config) # https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm/glm_6b.ckpt ms.load_checkpoint("./glm_6b.ckpt", model) # https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm/ice_text.model tokenizer = ChatGLMTokenizer('./ice_text.model') os_name = platform.system() clear_command = 'cls' if os_name == 'Windows' else 'clear' stop_stream = False def build_prompt(history): prompt = "歡迎使用 ChatGLM-6B 模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear 清空對(duì)話歷史,stop 終止程序" for query, response in history: prompt += f"\n\n用戶:{query}" prompt += f"\n\nChatGLM-6B:{response}" return prompt def signal_handler(): global stop_stream stop_stream = True def main(): history = [] global stop_stream print("歡迎使用 ChatGLM-6B 模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear 清空對(duì)話歷史,stop 終止程序") while True: query = input("\n用戶:") if query.strip() == "stop": break if query.strip() == "clear": history = [] os.system(clear_command) print("歡迎使用 ChatGLM-6B 模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear 清空對(duì)話歷史,stop 終止程序") continue count = 0 inputs = tokenizer(query) outputs = model.generate(np.expand_dims(np.array(inputs['input_ids']).astype(np.int32), 0), max_length=config.max_decode_length, do_sample=False, top_p=0.7, top_k=1) response = tokenizer.decode(outputs) response = process_response(response[0]) history = history + [(query, response)] if stop_stream: stop_stream = False break else: count += 1 if count % 8 == 0: os.system(clear_command) print(build_prompt(history), flush=True) signal.signal(signal.SIGINT, signal_handler) os.system(clear_command) print(build_prompt(history), flush=True) if __name__ == "__main__": main()
總結(jié)
MindSpore作為一種強(qiáng)大的深度學(xué)習(xí)框架,提供了豐富的工具和功能,使得模型的開發(fā)和訓(xùn)練更加高效和靈活。其支持端到端的深度學(xué)習(xí)解決方案,可以應(yīng)用于各種任務(wù)和場(chǎng)景。而ChatGLM作為一種生成式語(yǔ)言模型,通過(guò)對(duì)話的方式生成自然流暢的文本,可以用于智能對(duì)話和智能客服等應(yīng)用。
結(jié)合使用MindSpore和ChatGLM,我們可以實(shí)現(xiàn)更加智能和交互性的應(yīng)用。首先,MindSpore可以用來(lái)訓(xùn)練ChatGLM模型,通過(guò)大量的對(duì)話數(shù)據(jù)進(jìn)行學(xué)習(xí),使得生成的文本更加貼近真實(shí)的對(duì)話。MindSpore提供了分布式訓(xùn)練的功能,可以在多個(gè)設(shè)備和計(jì)算節(jié)點(diǎn)上進(jìn)行模型的并行訓(xùn)練,加速訓(xùn)練過(guò)程。其自動(dòng)微分功能也可以幫助優(yōu)化ChatGLM模型的訓(xùn)練效果。
通過(guò)MindSpore的強(qiáng)大功能和ChatGLM的生成式語(yǔ)言模型,我們可以構(gòu)建出高效、準(zhǔn)確和自然流暢的智能對(duì)話系統(tǒng),提升用戶體驗(yàn)并開拓更多的應(yīng)用領(lǐng)域。這種結(jié)合使用不僅有助于推動(dòng)機(jī)器學(xué)習(xí)和人工智能的發(fā)展,還為帶來(lái)更多的創(chuàng)新和可能性。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-839259.html
點(diǎn)擊關(guān)注,第一時(shí)間了解華為云新鮮技術(shù)~文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-839259.html
?
到了這里,關(guān)于萬(wàn)字帶你了解ChatGLM的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!