今天分享一篇博客,介紹語言模型的訓練和推理,通俗易懂且抓住本質核心,強烈推薦閱讀。
標題:Language Model Training and Inference: From Concept to Code
作者:CAMERON R. WOLFE
原文:
https://cameronrwolfe.substack.com/p/language-model-training-and-inference
要理解大語言模型(LLM),首先要理解它的本質,無論預訓練、微調還是在推理階段,核心都是next token prediction,也就是以自回歸的方式從左到右逐步生成文本。
什么是token?
token是指文本中的一個詞或者子詞,給定一句文本,送入語言模型前首先要做的是對原始文本進行tokenize,也就是把一個文本序列拆分為離散的token序列
其中,tokenizer是在無標簽的語料上訓練得到的一個token數(shù)量固定且唯一的分詞器,這里的token數(shù)量就是大家常說的詞表,也就是語言模型知道的所有tokens。
當我們對文本進行分詞后,每個token可以對應一個embedding,這也就是語言模型中的embedding層,獲得某個token的embedding就類似一個查表的過程
我們知道文本序列是有順序的,而常見的語言模型都是基于注意力機制的transformer結構,無法自動考慮文本的前后順序,因此需要手動加上位置編碼,也就是每個位置有一個位置embedding,然后和對應位置的token embedding進行相加
在模型訓練或推理階段大家經(jīng)常會聽到上下文長度這個詞,它指的是模型訓練時接收的token訓練的最大長度,如果在訓練階段只學習了一個較短長度的位置embedding,那模型在推理階段就不能夠適用于較長文本(因為它沒見過長文本的位置編碼)
語言模型的預訓練
當我們有了token embedding和位置embedding后,將它們送入一個decoder-only的transofrmer模型,它會在每個token的位置輸出一個對應的embedding(可以理解為就像是做了個特征加工)
有了每個token的一個輸出embedding后,我們就可以拿它來做next token prediction了,其實就是當作一個分類問題來看待:
首先我們把輸出embedding送入一個線性層,輸出的維度是詞表的大小,就是讓預測這個token的下一個token屬于詞表的“哪一類”
為了將輸出概率歸一化,需要再進行一個softmax變換
訓練時就是最大化這個概率使得它能夠預測真實的下一個token
推理時就是從這個概率分布中采樣下一個token
訓練階段:因為有causal自注意力的存在,我們可以一次性對一整個句子每個token進行下一個token的預測,并計算所有位置token的loss,因此只需要一forward
推理階段:以自回歸的方式進行預測
每次預測下一個token
將預測的token拼接到當前已經(jīng)生成的句子上
再基于拼接后的句子進行預測下一個token
不斷重復直到結束
其中,在預測下一個token時,每次我們都有一個概率分布用于采樣,根據(jù)不同場景選擇采樣策略會略有不同,不然有貪婪策略、核采樣、Top-k采樣等,另外經(jīng)常會看到Temperature這個概念,它是用來控制生成的隨機性的,溫度系數(shù)越小越穩(wěn)定。
代碼實現(xiàn)
下面代碼來自項目https://github.com/karpathy/nanoGPT/tree/master,同樣是一個很好的項目,推薦初學者可以看看。
對于各種基于Transformer的模型,它們都是由很多個Block堆起來的,每個Block主要有兩個部分組成:
Multi-headed Causal Self-Attention
Feed-forward Neural Network結構的示意圖如下:
看圖搭一下單個Block
然后看下一整個GPT的結構
主要就是兩個embedding層(token、位置)、多個block、一些額外的dropout和LayerNorm層,以及最后用來預測下一個token的線性層。說破了就是這么簡單。
這邊還用到了weight tying的技巧,就是最后一層用來分類的線性層的權重和token embedding層的權重共享。
接下來重點來關注一下訓練和推理的forward是如何進行的,這能幫助大家更好的理解原理。
首先需要構建token embedding和位置embedding,把它們疊加起來后過一個dropout,然后就可以送入transformer的block中了。
需要注意的是經(jīng)過transforemr block后出來的tensor的維度跟之前是一樣的。拿到每個token位置對應的輸出embedding后,就可以通過最后的先行層進行分類,然后用交叉熵損失來進行優(yōu)化。
再看一下完整的過程,其中只需要將輸入左移一個位置就可以作為target了
接下來看推理階段:
根據(jù)當前輸入序列進行一次前向傳播
利用溫度系數(shù)對輸出概率分布進行調整
通過softmax進行歸一化
從概率分布進行采樣下一個token
拼接到當前句子并再進入下一輪循環(huán)
-
語言模型
+關注
關注
0文章
508瀏覽量
10247 -
LLM
+關注
關注
0文章
276瀏覽量
306
原文標題:從原理到代碼理解語言模型訓練和推理,通俗易懂,快速修煉LLM
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論