LLM 工程師入門:生成式AI的簡(jiǎn)易指南 原創(chuàng)
編者按: 大模型發(fā)展了近兩年,Baihai IDP公眾號(hào)也分享了近百篇LLM各環(huán)節(jié)的技術(shù)洞察,有前沿探討、有落地實(shí)踐、有應(yīng)用經(jīng)驗(yàn)。但回頭來看,我們似乎從來沒有認(rèn)真、從0開始探討過LLM的基本原理。
最近,一些企業(yè)客戶和伙伴來詢問,是否有LLM的從0到1的科普貼。他們說:
“雖然在很多場(chǎng)景中,LLM都已經(jīng)滲透入我們的工作生活,但對(duì)其內(nèi)部的運(yùn)作機(jī)制,仍有很多謎團(tuán)待解決。
在應(yīng)用落地時(shí),LLMs 這種“黑箱式”的運(yùn)作模式,不僅使我們難以完全信任這些模型的輸出結(jié)果,也阻礙了我們對(duì)其進(jìn)一步研究和優(yōu)化的步伐。如果我們無法理解 LLMs 的工作原理,就很難評(píng)估它們的局限性,進(jìn)而制定出有針對(duì)性的解決方案?!?/p>
因此,我們把這篇LLM基礎(chǔ)原理文章推薦給大家。
本文為希望深入了解生成式AI的開發(fā)者、技術(shù)愛好者、AI落地的領(lǐng)導(dǎo)者和研究者們編寫,以通俗易懂的語言,系統(tǒng)地剖析了大語言模型的內(nèi)部結(jié)構(gòu)和訓(xùn)練流程,從 token、next token predictions,到馬爾可夫鏈、神經(jīng)網(wǎng)絡(luò)等核心概念,循序漸進(jìn)地揭示了 LLM 是如何生成文本的。
作者 | Miguel Grinberg
編譯 | 岳揚(yáng)
毫無疑問,隨著大語言模型[1](LLMs)的新聞不斷出現(xiàn)在我們的日常生活,生成式人工智能[2](GenAI)已經(jīng)成為了我們無法忽視的存在。或許你早已體驗(yàn)過 ChatGPT[3] ,甚至把它當(dāng)作日常生活的小助理了。
面對(duì)這場(chǎng) GenAI 變革,許多人心中都有一個(gè)疑問:這些模型表面上的智能(intelligence)究竟源自何處?本文將試圖用淺顯易懂的語言,不涉及復(fù)雜數(shù)學(xué)公式,來揭秘生成式文本模型的工作原理,讓你認(rèn)識(shí)到它們并非魔法,而是計(jì)算機(jī)算法的產(chǎn)物。
01 What Does An LLM Do?
首先,我要澄清人們對(duì)大語言模型工作原理的一個(gè)重大誤解。人們通常認(rèn)為,這些模型能夠回答我們的問題或與我們進(jìn)行對(duì)話,但實(shí)際上,它們所能做的是基于我們提供的文本輸入,預(yù)測(cè)下一個(gè)單詞(更準(zhǔn)確地說,是下一個(gè) token)。
現(xiàn)在,讓我們一步步揭開 LLMs 神秘面紗背后的“真面目”,從 token 開始探索。
1.1 Tokens
token 是大語言模型(LLM)處理文本時(shí)的基本單元。雖然我們可以簡(jiǎn)單地將 token 視為單個(gè)單詞,但 LLM 的目的是以最高效的方式對(duì)文本進(jìn)行編碼。因此在很多情況下,token 可能是比單個(gè)單詞短或長(zhǎng)的字符序列。 標(biāo)點(diǎn)符號(hào)和空格同樣以 token 的形式存在,它們可以單獨(dú)表示為一個(gè) token,也可以與其他字符組合。
LLM 所使用的所有 token 構(gòu)成了它的詞匯表(vocabulary),這個(gè)詞匯表能夠用來表達(dá)所有可能的文本內(nèi)容。大語言模型通常采用 BPE(Byte Pair Encoding)[4]算法來根據(jù)輸入數(shù)據(jù)集創(chuàng)建 token 詞匯表。以 GPT-2 語言模型[5](開源模型,可供深入研究)為例,其詞匯表?yè)碛?50,257 個(gè) token。
每個(gè) token 在 LLM 的詞匯表中都有一個(gè)獨(dú)一無二的標(biāo)識(shí)符(通常是一個(gè)數(shù)字編號(hào))。LLM 通過分詞器將常規(guī)文本字符串轉(zhuǎn)換為一系列 token 編號(hào)。 如果您對(duì) Python 有所了解,并且想要嘗試對(duì) token 進(jìn)行操作,可以安裝 OpenAI 提供的 tiktoken 軟件包:
然后請(qǐng)?jiān)?Python 命令行中嘗試以下操作:
在本實(shí)驗(yàn)中,我們可以觀察到,GPT-2 語言模型的詞匯表中,token 464 對(duì)應(yīng)的是單詞"The",而 token 2068 則對(duì)應(yīng)" quick",這個(gè) token 包括了單詞之前的空格。在該模型中,句號(hào)由 token 13 表示。
由于 token 是通過算法來決定的,因此我們可能會(huì)遇到一些奇特的情況,比如 GPT-2 會(huì)將單詞"the"的以下三種形式編碼為不同的 token:
BPE 算法并不會(huì)總是將整個(gè)單詞直接轉(zhuǎn)化為一個(gè) token。事實(shí)上,那些使用頻率較低的單詞不會(huì)被單獨(dú)表示為一個(gè) token,而是需要通過多個(gè) token 的組合來進(jìn)行編碼。下文這個(gè)例子,展示了 GPT-2 模型是如何用一個(gè)由兩個(gè) token 組成的序列來編碼某個(gè)單詞的:
1.2 Next Token Predictions
如上文所述,語言模型會(huì)根據(jù)給定文本預(yù)測(cè)之后可能出現(xiàn)的 token。如果用 Python 偽代碼來展示這個(gè)過程,下文就演示了如何使用這些模型來預(yù)測(cè)下一個(gè) token:
這個(gè)函數(shù)將用戶輸入的提示詞轉(zhuǎn)換成的 token 列表作為模型輸入。這里假設(shè)每個(gè)單詞都是一個(gè)單獨(dú)的 token。為了簡(jiǎn)單起見,此處使用了每個(gè) token 的文字形式,但實(shí)際上,每個(gè) token 都是以數(shù)字的形式傳遞給模型的。
該函數(shù)返回的是一種特有的數(shù)據(jù)結(jié)構(gòu),它為詞匯表中的每個(gè) token 分配了一個(gè)在輸入文本后緊接著出現(xiàn)的概率。如果使用的是 GPT-2 模型,那么返回的將是一個(gè)包含 50,257 個(gè)浮點(diǎn)數(shù)的列表(list),列表中每個(gè)數(shù)字代表相應(yīng) token 緊接著文本內(nèi)容出現(xiàn)的概率。
在上述案例中,可以設(shè)想訓(xùn)練效果良好的語言模型會(huì)為"jumps"這個(gè) token 分配一個(gè)較高的概率,以接續(xù)短語"The quick brown fox"[6]。同樣地,如果模型訓(xùn)練得當(dāng),那么像"potato"這樣的隨機(jī)單詞接在這個(gè)短語后面的概率就會(huì)低很多,幾乎接近于0。
為了做出合理的預(yù)測(cè),語言模型需要經(jīng)過一個(gè)訓(xùn)練過程。在訓(xùn)練期間,模型會(huì)學(xué)習(xí)大量文本內(nèi)容。訓(xùn)練結(jié)束后,模型就能利用它從訓(xùn)練文本中構(gòu)建的特有數(shù)據(jù)結(jié)構(gòu),來計(jì)算給定 token 序列的下一個(gè) token 的概率。
這與你的預(yù)期是否有所不同?我希望現(xiàn)在這個(gè)概念看起來不再那么神秘了。
1.3 生成長(zhǎng)文本序列
由于模型只能預(yù)測(cè)下一個(gè)出現(xiàn)的 token,因此要想讓它生成完整的句子,就必須在 for 循環(huán)中多次運(yùn)行模型。每一次循環(huán)迭代,都會(huì)根據(jù)返回的概率列表選擇一個(gè)新的token。這個(gè)新 token 會(huì)被加入到下一次循環(huán)迭代中模型的輸入序列中,如此循環(huán)往復(fù),一直持續(xù)到生成足夠的文本為止。
下面是一個(gè)更完整的 Python 偽代碼示例,演示了這個(gè)過程:
generate_text() 函數(shù)需要用戶提供提示詞內(nèi)容,比如可以是一個(gè)問題。
tokenize() 這個(gè)輔助函數(shù)負(fù)責(zé)將用戶的提示詞轉(zhuǎn)換成一系列 token,這個(gè)過程會(huì)用到 tiktoken 或類似的庫(kù)。在 for 循環(huán)中,get_token_predictions() 函數(shù)負(fù)責(zé)調(diào)用AI模型,獲取下一個(gè) token 的概率列表,與上文案例中描述的過程相同。
select_next_token() 函數(shù)的作用是根據(jù)模型給出的下一個(gè) token 的概率列表,從候選 token 中挑選出最合適的 token 來放入輸入序列。這個(gè)函數(shù)可以采取最簡(jiǎn)單的方法,即選擇概率最高的 token ,這在機(jī)器學(xué)習(xí)中被稱為“greedy selection”。然而,為了增加生成文本的多樣性,該函數(shù)通常會(huì)采用更高級(jí)的策略,使用一個(gè)隨機(jī)數(shù)生成器來選擇 token,即使是在隨機(jī)選擇 token 的情況下,也會(huì)優(yōu)先選擇那些概率較高的 token。通過這種方式,即便是給出相同的輸入提示詞,模型也能生成不同的文本響應(yīng)。
為了進(jìn)一步增加 token 選擇過程的靈活性,可以通過調(diào)整超參數(shù)來改變 LLMs 返回的概率分布。 這些超參數(shù)為傳遞給文本生成函數(shù)的參數(shù),能夠幫助用戶控制 token 選擇過程的“greediness”(譯者注:模型在選擇下一個(gè) token 時(shí)所表現(xiàn)出的傾向性,是傾向于選擇概率最高的token(即最可能的token),還是允許一些不太可能的token(即概率較低的token)被選中。)。如果你以前經(jīng)常使用 LLMs,那么就很可能對(duì) “temperature” 超參數(shù)比較熟悉。當(dāng) temperature 值較高時(shí),token 的概率分布會(huì)被 flattened out(譯者注:模型會(huì)考慮更多的token,包括那些概率較低的token,使得概率分布更加均勻。),這樣做的結(jié)果是,之前不太可能被選中的 token 現(xiàn)在有更大的機(jī)會(huì)被選中,從而使生成的文本看起來更具創(chuàng)造性和新穎性。除了 temperature 之外,還有兩個(gè)超參數(shù) top_p 和 top_k,它們分別用來控制在選擇過程中高概率 token 被選中的數(shù)量。 通過調(diào)整這些超參數(shù),可以進(jìn)一步影響文本生成的風(fēng)格和多樣性。
一旦模型選定了下一個(gè)token,循環(huán)就會(huì)繼續(xù)迭代。此時(shí),模型將接收到一個(gè)新的輸入序列,這個(gè)輸入序列的末尾添加了新 token(譯者注:上一次迭代選擇的 token)。num_tokens 參數(shù)決定了循環(huán)的迭代次數(shù),也就是生成文本的長(zhǎng)度。生成的文本可能會(huì)(并且經(jīng)常)在句子中間結(jié)束,因?yàn)榇笳Z言模型(LLM)并沒有句子或段落的概念,它只是逐個(gè)處理 token。為了防止生成的文本內(nèi)容在句子中間就結(jié)束了,我們可以將 num_tokens 參數(shù)視為一個(gè)最大數(shù)量值,而不是一個(gè)確切的 token 數(shù)量。在這種情況下,我們可以在模型生成一個(gè)句號(hào) token 時(shí)結(jié)束循環(huán)。
如果你已經(jīng)閱讀到此處,并且理解了前文的所有內(nèi)容,那么恭喜你,你現(xiàn)在對(duì) LLMs 的工作原理已經(jīng)有了較為深入的理解。各位讀者是否對(duì)更多技術(shù)細(xì)節(jié)感興趣?在下一節(jié)中,我將介紹更多技術(shù)細(xì)節(jié),同時(shí)盡量避免提及關(guān)于這項(xiàng)技術(shù)的復(fù)雜數(shù)學(xué)知識(shí)。
02 Model Training
不幸的是,要想不涉及數(shù)學(xué)知識(shí)就討論模型的訓(xùn)練過程,實(shí)在是件不容易的事。接下來,我將首先向大家展示一種非常簡(jiǎn)單的訓(xùn)練方法。
我們的目標(biāo)是預(yù)測(cè) token 后面可能出現(xiàn)的其他 tokens,因此,訓(xùn)練模型的簡(jiǎn)單方法就是從訓(xùn)練數(shù)據(jù)集中提取所有連續(xù)的 tokens 對(duì),然后用這些數(shù)據(jù)來構(gòu)建一個(gè)概率表(table of probabilities)。
讓我們用一個(gè)簡(jiǎn)短的詞匯表(vocabulary)和數(shù)據(jù)集(dataset)來做這件事。假設(shè)模型的詞匯表有以下五個(gè) token :
為了使這個(gè)例子簡(jiǎn)明扼要,我們不把空格和標(biāo)點(diǎn)符號(hào)算作 token。
我們使用以下三個(gè)句子組成的訓(xùn)練數(shù)據(jù)集:
- I like apples
- I like bananas
- you like bananas
我們可以制作一個(gè) 5x5 的表格,每個(gè)單元格記錄的是該行 token 后面跟著該列 token 的頻次。表格如下:
該數(shù)據(jù)集中,“I like” 出現(xiàn)了兩次,“you like” 一次,“l(fā)ike apples” 一次,而 “l(fā)ike bananas” 則是兩次。
現(xiàn)在我們知道了訓(xùn)練數(shù)據(jù)集中每對(duì) tokens 的出現(xiàn)頻率,就可以推算出它們相互跟隨的概率。做法是將表格中每一行的數(shù)字轉(zhuǎn)換成概率。比如,表格里“l(fā)ike”這一行,我們看到它后面跟著 “apples” 一次,跟著 “bananas” 兩次。這意味著在“l(fā)ike”之后出現(xiàn) “apples” 的概率是33.3%,而出現(xiàn) “bananas” 的概率則是66.7%。
下面是計(jì)算出所有概率的完整表格。那些空白單元格代表的概率自然就是0%。
對(duì)于 “I”、“you” 和 “l(fā)ike” 這些行的概率計(jì)算比較輕松、直接,但 “apples” 和 “bananas” 這兩行就有點(diǎn)難辦了,因?yàn)閿?shù)據(jù)集中并沒有 “apples” 和 “bananas” 后面跟著其他 token 的情況。這就好比在我們的訓(xùn)練數(shù)據(jù)中出現(xiàn)了“缺口”。為了確保模型在遇到這種未訓(xùn)練的情況時(shí)也能有所輸出,我決定將 “apples” 和 “bananas” 后續(xù) token 的概率均勻分配給其他四個(gè) tokens。這種做法可能會(huì)導(dǎo)致一些不太自然的輸出結(jié)果,但至少模型在處理這兩個(gè) token 時(shí)不會(huì)卡殼。
訓(xùn)練數(shù)據(jù)中的這種“缺口”問題不容小覷。在真正的 LLMs 中,由于訓(xùn)練數(shù)據(jù)集規(guī)模非常龐大,我們不太可能遇到像本文這個(gè)簡(jiǎn)單例子中這么明顯的缺口。但是,由于訓(xùn)練數(shù)據(jù)的覆蓋面不足,那些較小的、較難發(fā)現(xiàn)的缺口確實(shí)是存在的,并且相當(dāng)常見。 LLMs 在這些訓(xùn)練不足的區(qū)域所做的 tokens 預(yù)測(cè)質(zhì)量可能會(huì)不高,而且這些問題往往不易被察覺。這也是 LLMs 有時(shí)會(huì)出現(xiàn)“幻覺[7]”(即生成的文本雖然朗朗上口,但可能包含與事實(shí)不符的內(nèi)容或前后矛盾之處。)的原因之一。
借助上面的概率表,你現(xiàn)在可以構(gòu)思一下 get_token_predictions() 函數(shù)的實(shí)現(xiàn)方法。以下是用 Python 偽代碼表示的一種實(shí)現(xiàn)方式:
是不是比想象中還要簡(jiǎn)單些呢?這個(gè)函數(shù)可以接收來自用戶提示詞的 tokens 序列。它提取出這個(gè)序列中的最后一個(gè) token ,并找到概率表中對(duì)應(yīng)的那一行。
假如你用 [‘you’, ‘like’] 作為 input tokens 調(diào)用這個(gè)函數(shù),它會(huì)給出 “l(fā)ike” 對(duì)應(yīng)的那一行,這使得 “apples” 有 33.3% 的可能性放入句子的下一部分,而 “bananas” 則有 66.7% 的可能性。根據(jù)這些概率值可以得知,上面提到的 select_next_token() 函數(shù)在三次中有一次會(huì)挑選 “apples”。
當(dāng) “apples” 被選為 “you like” 的后續(xù)詞時(shí),我們得到了句子 “you like apples”。這個(gè)句子在訓(xùn)練數(shù)據(jù)集中并不存在,但它卻是完全合理的。希望這個(gè)小例子能讓您開始意識(shí)到,這些模型是如何通過重新利用訓(xùn)練中學(xué)到的 patterns(譯者注:在數(shù)據(jù)集中識(shí)別和學(xué)習(xí)的重復(fù)出現(xiàn)的 tokens 序列組合。) 和拼接不同的信息片段,來形成看似原創(chuàng)的想法或概念的。
2.1 上下文窗口(The Context Window)
在上一部分,我用來訓(xùn)練那個(gè)微型語言模型的方法,稱為馬爾可夫鏈[8](譯者注:Markov chain,一種數(shù)學(xué)系統(tǒng),用于描述一系列可能的事件,其中每個(gè)事件的發(fā)生概率只依賴于前一個(gè)事件。)。
這種技術(shù)存在的問題是,它只根據(jù)一個(gè) token(輸入序列中的最后一個(gè) token)來預(yù)測(cè)接下來的內(nèi)容。在此之前的文本在決定如何延續(xù)文本內(nèi)容時(shí)并不起作用,因此我們可以認(rèn)為這種方法的上下文窗口僅限于一個(gè) token,這是非常小的。由于上下文窗口太小,模型會(huì)不斷“忘記”自己的思路,從一個(gè)詞跳到下一個(gè)詞,顯得雜亂無章。
為了提高模型的預(yù)測(cè)能力,我們可以構(gòu)建一個(gè)更大的概率表。如果想使用兩個(gè) token 的上下文窗口,就需要在概率表中添加代表所有兩個(gè) token 組合的新行。以前文的例子來說,五個(gè) token 將會(huì)在概率表增加 25 行兩個(gè) token 組合的新行,再加上原有的 5 個(gè)單 token 行。這次除了考慮兩個(gè) token 的組合外,還需要考慮三個(gè) token 的組合,因此必須再次訓(xùn)練模型。在 get_token_predictions() 函數(shù)的每次循環(huán)迭代中,如果條件允許,將使用輸入序列的最后兩個(gè) tokens 來在一個(gè)更大的概率表中找到與這兩個(gè) tokens 相對(duì)應(yīng)的行。
但是,兩個(gè) tokens 的上下文窗口仍然不夠。為了讓生成的文本不僅在結(jié)構(gòu)上能夠自洽,還能在一定程度上具備一些意義,需要一個(gè)更大的上下文窗口。如果沒有足夠大的上下文窗口,新生成的 token 就無法與之前的 tokens 所表達(dá)的概念(concepts)或想法(ideas)建立聯(lián)系。那么我們應(yīng)該如何是好?將上下文窗口擴(kuò)展到 3 個(gè) tokens 會(huì)在概率表中增加 125 行新內(nèi)容,但質(zhì)量可能仍然不盡人意。我們又需要多大的上下文窗口呢?
OpenAI 的開源模型 GPT-2 使用的上下文窗口其大小為 1024 個(gè) tokens。如果我們要用馬爾可夫鏈(Markov chains)實(shí)現(xiàn)這樣一個(gè)大小的上下文窗口,概率表的每一行都需要代表一個(gè)長(zhǎng)度在 1 到 1024 個(gè) tokens 之間的序列。以前文例子中使用的 5 個(gè) tokens 的詞匯表為例,1024 個(gè) token 長(zhǎng)度的序列共有 5 種可能的 token 組合。我在 Python 中進(jìn)行了計(jì)算:
\>\>\> pow(5, 1024) 55626846462680034577255817933310101605480399511558295763833185422180110870347954896357078975312775514101683493275895275128810854038836502721400309634442970528269449838300058261990253686064590901798039126173562593355209381270166265416453973718012279499214790991212515897719252957621869994522193843748736289511290126272884996414561770466127838448395124802899527144151299810833802858809753719892490239782222290074816037776586657834841586939662825734294051183140794537141608771803070715941051121170285190347786926570042246331102750604036185540464179153763503857127117918822547579033069472418242684328083352174724579376695971173152319349449321466491373527284227385153411689217559966957882267024615430273115634918212890625
這個(gè)行數(shù)多得嚇人!這還只是整個(gè)概率表的一小部分,因?yàn)槲覀冞€需要長(zhǎng)度從 1023 個(gè) tokens 到 1 個(gè) token 的所有序列,以確保在模型輸入中沒有足夠 token 時(shí),較短的 token 序列也能被處理。雖然馬爾可夫鏈很有趣,但它們也確實(shí)存在很大的可擴(kuò)展性問題。
而且,1024 個(gè) tokens 的上下文窗口現(xiàn)在也已經(jīng)不算特別大了。在 GPT-3 中,上下文窗口增加到了 2048 個(gè) tokens,然后在 GPT-3.5 中增加到了 4096 個(gè) token。GPT-4 最開始擁有 8192 個(gè) tokens 的上下文窗口,后來增加到了 32K,再后來又增加到了 128K(沒錯(cuò),128,000 個(gè) tokens !)?,F(xiàn)在,具有 1M 或更大上下文窗口的模型也開始出現(xiàn)了,更大的上下文窗口允許模型更好地理解和利用之前輸入的文本信息,從而在生成新的文本時(shí)保持更高的連貫性和準(zhǔn)確性。
總之,馬爾可夫鏈讓我們以正確的方式思考文本生成問題,但它們也存在一些重大問題,使得我們無法將其視為一個(gè)可行的解決方案。
2.2 從馬爾可夫鏈到神經(jīng)網(wǎng)絡(luò)
顯然,我們必須放棄使用概率表的想法,因?yàn)橐粋€(gè)合理上下文窗口的概率表需要的 RAM 大得驚人。我們可以采取的替代方案是用函數(shù)(function)來代替表格(table),這個(gè)函數(shù)是通過算法生成的,而不是存儲(chǔ)在一個(gè)大表格中。這正是神經(jīng)網(wǎng)絡(luò)擅長(zhǎng)的領(lǐng)域。
神經(jīng)網(wǎng)絡(luò)是一種特殊的函數(shù),它接受 inputs ,對(duì)其進(jìn)行計(jì)算,并返回 output 。對(duì)于語言模型來說,input 代表提示詞轉(zhuǎn)換的 tokens,output 是對(duì)下一個(gè) token 的預(yù)測(cè)概率列表。
我說過神經(jīng)網(wǎng)絡(luò)是一種“特殊”的函數(shù),是因?yàn)槌撕瘮?shù)的邏輯之外,它們對(duì) input 進(jìn)行的計(jì)算還受到一系列外部定義參數(shù)的控制。一開始,神經(jīng)網(wǎng)絡(luò)的參數(shù)是未知的,因此,函數(shù)產(chǎn)生的輸出是完全無用的。神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程包括尋找參數(shù),找到使函數(shù)在對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行評(píng)估時(shí)表現(xiàn)最佳的參數(shù),其假設(shè)是,如果函數(shù)在訓(xùn)練數(shù)據(jù)上表現(xiàn)良好,那么它也會(huì)在其他數(shù)據(jù)上表現(xiàn)良好。
在訓(xùn)練過程中,神經(jīng)網(wǎng)絡(luò)的參數(shù)會(huì)通過反向傳播算法[9],以極小的增量進(jìn)行迭代調(diào)整。這個(gè)過程涉及大量的數(shù)學(xué)計(jì)算,因此在這里不會(huì)詳細(xì)展開。每次調(diào)整后,神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)能力都會(huì)略有提升。更新參數(shù)后,神經(jīng)網(wǎng)絡(luò)會(huì)再次評(píng)估其在訓(xùn)練數(shù)據(jù)集上的表現(xiàn),并根據(jù)評(píng)估結(jié)果進(jìn)行下一輪的調(diào)整。這個(gè)過程會(huì)一直持續(xù)下去,直到神經(jīng)網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)集上對(duì)下一個(gè) token 的預(yù)測(cè)達(dá)到令人滿意的效果。
下面幫助各位讀者了解一下神經(jīng)網(wǎng)絡(luò)的規(guī)模,GPT-2 模型大約有 15 億個(gè)參數(shù),而 GPT-3 將參數(shù)數(shù)量增加到 1750 億,GPT-4 據(jù)說有大約 1.76 萬億個(gè)參數(shù)。使用目前這一代硬件來訓(xùn)練這樣大規(guī)模的神經(jīng)網(wǎng)絡(luò)需要相當(dāng)長(zhǎng)的時(shí)間,通常是幾周甚至幾個(gè)月。
有趣的是,由于參數(shù)數(shù)量眾多,而且都是通過長(zhǎng)時(shí)間的迭代過程計(jì)算出來的,沒有人類干預(yù),因此很難理解模型是如何工作的。訓(xùn)練好的大語言模型就像一個(gè)黑盒子,非常難以調(diào)試,因?yàn)槟P偷拇蟛糠帧八季S”都隱藏在參數(shù)中。即使是那些訓(xùn)練它們的人,也很難解釋其內(nèi)部的工作原理。
2.3 模型層、Transformers 和注意力機(jī)制
你可能非常想知道,神經(jīng)網(wǎng)絡(luò)函數(shù)內(nèi)部究竟進(jìn)行了哪些神奇的運(yùn)算,使得它們?cè)谶@些經(jīng)過精心調(diào)優(yōu)的參數(shù)的幫助下,能夠接收 input tokens 列表,并以某種方式“猜”出下一個(gè) token 的合理概率。
神經(jīng)網(wǎng)絡(luò)就像是一套復(fù)雜的操作鏈條?,鏈條的每個(gè)鏈環(huán)都被稱為一個(gè)“模型層”。第一層接收 inputs (譯者注:神經(jīng)網(wǎng)絡(luò)接收的初始數(shù)據(jù)。),對(duì)其進(jìn)行某種形式的轉(zhuǎn)換。經(jīng)過轉(zhuǎn)換的 input 接著進(jìn)入下一層,再次進(jìn)行轉(zhuǎn)換。這一過程一直持續(xù)到數(shù)據(jù)最終到達(dá)最后一層,并在這里進(jìn)行最后一次轉(zhuǎn)換,從而產(chǎn)生最終的模型輸出。
機(jī)器學(xué)習(xí)專家們?cè)O(shè)計(jì)了各種類型的模型層,它們能夠?qū)斎霐?shù)據(jù)執(zhí)行數(shù)學(xué)轉(zhuǎn)換。同時(shí),他們還找到了模型層的不同組織方式和分組方法,以達(dá)到預(yù)期的效果。有些模型層是通用的,適用于多種類型的輸入數(shù)據(jù);而有些模型層則是專門為處理特定類型的數(shù)據(jù)而設(shè)計(jì)的,比如圖像數(shù)據(jù)或大語言模型中的經(jīng)過分詞后的文本。
在大語言模型的文本生成場(chǎng)景中,目前最流行的神經(jīng)網(wǎng)絡(luò)架構(gòu)是 Transformer[10]。使用這種架構(gòu)設(shè)計(jì)的 LLM(大語言模型)被稱為 GPT,即 Generative Pre-Trained Transformers[11]。
Transformer 模型的獨(dú)特之處在于它們執(zhí)行的一種稱為 Attention[12] 的模型層計(jì)算方式,這使得它們能夠從上下文窗口中的 tokens 中推斷出它們之間的關(guān)系(relationships)和模式(patterns),隨后將這些關(guān)系和模式反映在下一個(gè) token 的預(yù)測(cè)概率中。
Attention 機(jī)制最初被用于語言翻譯場(chǎng)景,是一種找出輸入序列中哪些 tokens 對(duì)理解其意義最為重要的方法。這種機(jī)制使現(xiàn)代翻譯器能夠通過關(guān)注(或集中“注意力”于)重要的單詞或tokens,從根本上“理解”一個(gè)句子。
03 Do LLMs Have Intelligence?
您可能已經(jīng)開始思考,大語言模型(LLMs)在生成文本時(shí)是否展現(xiàn)出某種智能了?
我個(gè)人并不認(rèn)為 LLMs 具備推理或創(chuàng)造原創(chuàng)思想的能力,但這并不意味著它們一無是處。由于 LLMs 對(duì)上下文窗口中的 tokens 進(jìn)行了巧妙的計(jì)算,所以 LLMs 能夠識(shí)別出用戶提示詞中存在的 patterns,并將它們與訓(xùn)練期間學(xué)到的類似 patterns 相匹配。 它們生成的文本大部分都是由零碎的訓(xùn)練數(shù)據(jù)組成的,但它們將單詞(實(shí)際上是 tokens)拼接在一起的方式非常復(fù)雜,在很多情況下,它們生成的模型輸出結(jié)果既有原創(chuàng)感,又非常有用。
鑒于 LLM 容易產(chǎn)生幻覺,我不會(huì)信任未經(jīng)人工驗(yàn)證的情況下,任何直接將 LLMs 的 output 發(fā)送給用戶的工作流程。
在未來的幾個(gè)月或幾年里,是否會(huì)有更大的 LLM 出現(xiàn)?它們能夠?qū)崿F(xiàn)真正的智能嗎?由于 GPT 架構(gòu)的諸多限制,我覺得這是不太可能實(shí)現(xiàn)的,但誰知道呢,也許隨著未來創(chuàng)新成果的不斷涌現(xiàn),我們會(huì)實(shí)現(xiàn)這一目標(biāo)。
04 The End
感謝您與我一起堅(jiān)持到最后!我希望本文已經(jīng)能夠激發(fā)你的學(xué)習(xí)興趣,讓你決定繼續(xù)學(xué)習(xí)大模型相關(guān)知識(shí),并最終面對(duì)那些令人畏懼的數(shù)學(xué)知識(shí),如果您想詳細(xì)了解每一個(gè)細(xì)節(jié)的話,就無法回避這些數(shù)學(xué)知識(shí)。在這種情況下,我強(qiáng)烈推薦 Andrej Karpathy 的《Neural Networks: Zero to Hero》[13]系列視頻。
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
About the authors
Hi, my name is Miguel. I'm a software engineer, but also tinker with photography and filmmaking when I have time. I was born in Buenos Aires, Argentina, but I lived most of my adult life in Portland, Oregon, USA, the place that comes to mind when I think of home. As of 2018 I'm living in Ireland.
END
本期互動(dòng)內(nèi)容 ??
?通過閱讀本文,你能夠理解為什么 LLMs 會(huì)產(chǎn)生“幻覺”或者不可靠的輸出嗎?你認(rèn)為造成這些問題的原因是什么?
??文中鏈接??
[1]??https://en.wikipedia.org/wiki/Large_language_model??
[2]??https://en.wikipedia.org/wiki/Generative_artificial_intelligence??
[3]??https://chat.openai.com/??
[4]??https://en.wikipedia.org/wiki/Byte_pair_encoding??
[5]??https://github.com/openai/gpt-2??
[6]??https://en.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog??
[7]??https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence)??
[8]??https://en.wikipedia.org/wiki/Markov_chain??
[9]??https://en.wikipedia.org/wiki/Backpropagation??
[10]??https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)??
[11]??https://en.wikipedia.org/wiki/Generative_pre-trained_transformer??
[12]??https://en.wikipedia.org/wiki/Attention_(machine_learning)??
[13]??https://karpathy.ai/zero-to-hero.html??
原文鏈接:
??https://blog.miguelgrinberg.com/post/how-llms-work-explained-without-math??
