編者按: 面對 Llama 模型家族的持續更新,您是否想要了解它們之間的關鍵區別和實際效能表現?本文將探討 Llama 系列模型的架構演變,梳理了 Llama 模型從 1.0 到 3.1 的完整演進歷程,深入剖析了每個版本的技術創新,還透過實際實驗對比了 Llama 2 和 Llama 3 在推理速度、答案長度和相對答案質量(RAQ)等關鍵指標上的表現差異。
根據本文, Llama 模型的架構演變主要經歷了以下三個階段:
- Llama 1:基於原始 Transformer 架構,引入了預歸一化、RMSNorm、SwiGLU 啟用函式和旋轉式位置編碼等改進,提升了模型的訓練穩定性和效能。
- Llama 2:在 Llama 1 的基礎上,將上下文長度擴充套件至 4096,並引入了分組查詢注意力 (GQA) 機制,有效降低了推理過程中的記憶體需求,提升了推理速度。
- Llama 3:進一步將 GQA 應用於小型模型,並採用更高效的分詞器 TikToken,擴大了詞彙表的數量,同時將上下文長度翻倍,並大幅增加了訓練資料量。
作者 | Luís Roque
編譯 | 嶽揚
01 Introduction
Meta 公司推出了其大語言模型 Llama 的三個主要版本。Llama 在 2023 年初的首度亮相,為開源自然語言處理(NLP)社群帶來了重大突破。Meta 一直透過分享最新的模型版本,為這一社群貢獻力量。
在這裡,我們需要區分“開放型(open) LLM”與“開源(open-source) LLM”。 傳統上,開源軟體會在特定的公共許可證下公開原始碼,允許使用者使用和修改。在 LLM 領域,開放型 LLM 會公開模型權重和初始程式碼,而開源 LLM 則會更進一步,在寬鬆的許可下共享整個訓練過程,包括訓練資料。目前,包括 Meta 的 Llama 在內的多數模型,都屬於開放型 LLM,因為它們並未公開用於訓練的資料集。
Llama 經歷了三次重要的架構更新。 版本 1 對原始的 Transformer 架構進行了多項改進。版本 2 在大模型中引入了分組查詢注意力(GQA)機制。版本 3 將這一機制擴充套件到了小模型,同時引入了更高效的分詞器,還擴大了詞彙量。版本 3.1 並未對核心架構做出調整,主要的變化在於訓練資料的清洗、上下文長度的增加以及對更多語言的支援。
本文探討了 Llama 的架構演變,著重介紹其主要進步及其對 LLM 未來發展的影響。文章最後透過一個實驗對 Llama 2 和 Llama 3 進行了比較,使用了推理速度、答案長度和相對答案質量(RAQ,Relative Answer Quality)框架[1]等指標進行評估。RAQ 框架提供了一個客觀的評分系統,用於檢驗 LLM 的回答準確度,對於評估特定應用場景尤為有用。
Figure 1: Llama family (image by author with DALL-E)
02 Llama: A Family of Open LLMs
2.1 Llama 1:該系列首個模型問世
Llama 系列的第一個模型,Llama 1 [2],是建立在 Vaswani 等人在 2017 年提出的編碼器-解碼器 Transformer 架構之上的[3]。該架構曾是 NLP 領域的重大創新,並且至今仍是 LLM 模型的基礎架構。
Llama 1 在其核心設計中採納了這一架構,並在此基礎上進行了多項最佳化,包括:
預歸一化技術
借鑑了 GPT3 [4]架構中提高訓練穩定性的方法,Llama 1 也採用了對每個 Transformer 子層的輸入進行歸一化的策略,而不僅僅是對輸出進行歸一化處理,具體細節如圖 2 所示。
圖 2:原始 Transformer 架構與 Llama 1 架構的不同之處,特別是在 Transformer 子層中,對每個輸入都進行了歸一化處理(圖片由作者提供)
此外,Llama 1 還採用了 RMSNorm [5] 來替代傳統的 LayerNorm 函式,這一改變在保持訓練穩定性和提升模型收斂速度的同時,大幅提高了計算效率。
RMSNorm 之所以能更高效,是因為其創造者發現 LayerNorm 的優勢在於 rescaling invariance(譯者注:指的是歸一化過程能夠適應輸入資料的縮放,使得網路對這種縮放不敏感。),而非 recentering invariance(譯者注:如果輸入資料的均值發生了變化,但資料的分佈形狀和範圍保持不變,那麼具有 recentering invariance 的演算法或函式的輸出應該不受影響。)。基於這一發現,他們省略了歸一化過程中的均值計算,使得演算法更加簡潔,而效果不減,且運算效率顯著提升。
圖 3:層歸一化(LayerNorm)與均方根歸一化(RMSNorm)之間的方程差異(圖片由作者提供)
SwiGLU 啟用函式
在啟用函式的選擇上,研究者們採用了 SwiGLU [6] 函式來替代傳統的 ReLU 函式,這一改變旨在提升模型的效能。兩者的核心差異在於:
- ReLU 函式會將所有負數輸入直接歸零,而正數輸入則保持不變。
- 相比之下,SwiGLU 函式含有一個可學習的引數 β,能夠調節函式的插值程度。 隨著 β 值的增大,SwiGLU 的行為將逐漸接近 ReLU,這一點如圖 4 所示。
圖 4:ReLU 與 SwiGLU 在不同 β 值下的行為對比,可以看到當 β 達到 100 時,兩者的曲線趨於一致。
旋轉式位置編碼(Rotary Positional Embeddings)
在大語言模型(LLMs)中,位置編碼起到了至關重要的作用,這是因為 Transformer 架構本身不區分單詞的順序。也就是說,如果沒有位置編碼的輔助,Transformer 會將單詞順序不同但單詞相同的兩個句子視為相同的句子。 例如,如果沒有位置編碼,下面兩個句子的含義 Transformer 將無法區分:
Sentence 1: Llama 2 is better than Llama 1 Sentence 2: Llama 1 is better than Llama 2
句子1:Llama 2的效能優於Llama 1。句子2:Llama 1的效能優於Llama 2。
在論文[3]中,提出了一種透過正弦和餘弦函式實現的絕對位置編碼(Absolute Positional Embeddings)。序列中的每個位置都有其獨特的編碼(positional embedding),它們與詞向量相加,從而確保即使單詞相同,不同順序的句子也能表達不同的意思。
簡單來說,我們可以假設句子中的單詞是用一維向量而不是多維向量來編碼的。如圖 5 所示,在詞向量中,“1”和“2”的表示值是相同的。但是,在加入了位置編碼之後,它們的表示值就變得不同了(分別從0.88變為1.04,以及從0.26變為0.1)。
圖 5:絕對位置編碼(Absolute Positional Embeddings)(圖片由作者提供)
儘管絕對位置編碼已經解決了 Transformer 不區分順序的問題,但它生成的位置編碼是相互獨立的,沒有考慮到序列中單詞之間的相對位置關係。 這意味著在模型看來,位置 1 和位置 2 之間的相關性與位置 1 和位置 500 之間的相關性並無差異。然而,我們知道實際情況並非如此,因為在位置上更接近的單詞,其相關性理論上應該更高。
旋轉式位置編碼[7](RoPE)能夠解決上述問題,它透過將序列中的每個位置轉換成詞嵌入的旋轉變數來模擬單詞間的相對位置關係。 以前文的 “Llama 2 is better than Llama 1” 為例,假設詞嵌入現在是二維的。那麼,“better ”一詞將由基於其位置 m (4) 和常數 θ 的原始二維向量的二維旋轉向量來表示。
圖 6:展示瞭如何透過旋轉式位置編碼(Rotary Positional Embedding)將原始向量轉換為新的向量。這一轉換是基於向量在序列中的位置(例如,m=4)和常數θ來進行的(圖片由作者提供)
採用這種方式,即便在原句中增加更多詞彙,單詞之間的相對距離也能得到保持。比如,在句子 “The LLM Llama 2 is better than Llama 1” 中新增兩個單詞,儘管“better”和“than”的位置從(4和5)變為(6和7),但由於旋轉量保持一致,兩個向量之間的相似性(即左圖中向量的點積與右圖中的點積相同)依舊不變。
圖 7:旋轉式位置編碼維持 tokens 間相對距離的能力(圖片由作者提供)
2.2 Llama 2:Llama 1 的升級版
Llama 2 [8] 保留了 Llama 1 對原始 Transformer 架構所做的所有改動。在此基礎上,還將處理上下文的長度擴充套件至 4096,相較於之前的 2048,翻了一番。同時,對於 34B 和 70B 這樣的大型模型,Llama 2 使用 Grouped-Query Attention (GQA) [10] 取代了傳統的 Multi-Head Attention (MHA) [9]。
由於需要大量記憶體來載入所有的注意力頭的 queries、keys 和 values ,MHA 成為了 Transformer 的效能瓶頸。針對這一問題,有兩種解決方案:
- Multi-Query Attention [9](MQA)透過在注意力層使用單一的鍵和值頭(key and value),配合多個查詢頭(query heads)來大幅降低記憶體需求。但這種做法可能會降低模型的質量,並導致訓練過程不穩定,因此像 T5 這樣的其他開源大語言模型並未採用此方法。
- GQA 則採用了一種折中方案,它將查詢值(query values)分為 G 組(GQA-G),每組共享一個鍵和值頭(key and value head)。如果 GQA 的組數為 1(GQA-1),則相當於 MQA,所有查詢(queries)都集中在一組;而如果組數等於頭數(GQA-H),則與 MHA 相當,每個查詢(query)自成一組。這種方法減少了每個查詢(query)組中的鍵和值頭(keys and values)數量,從而縮小了鍵值快取的大小,減少了需要載入的資料量。與 MQA 相比,這種更為溫和的縮減方式在提升推理速度的同時,也降低了解碼過程中的記憶體需求,且模型質量更接近 MHA,速度幾乎與 MQA 持平。
圖 8:MHA、GQA 和 MQA 方法概覽(圖片由作者提供)
2.3 Llama 3: Size and Tokenization
Llama 3 [11] 將處理上下文的長度從 4096 擴充套件至 8192,並將 GQA 使用到了較小規模的模型(8B)。同時,研究者們還將分詞工具從 Sentence Piece [12] 更換為 OpenAI 模型所採用的 TikToken [13]。因為新的詞彙表容量增加到了 128k 個 tokens,較之前的 32k 有了大幅提升,這一變更顯著提升了模型的效能。
這兩種分詞工具的主要差異在於,在輸入的 tokens 已經存在於詞彙表中時,TikToken 會跳過位元組對編碼(BPE) [14] 的合併規則。 例如,如果“generating”這個詞已經在詞彙表中了,那麼它將作為一個完整的 token 返回,而不是將其拆分為“generating”和“ing”這兩個最小單元的 tokens 。
2.4 Llama 3.1
在 2024 年 7 月釋出的 Llama 3.1,實現了上下文長度(128K tokens)的顯著提升,並新增了對 8 種語言的支援。此次釋出版本的一個重要亮點是更大的 Llama 3.1 405B 模型。在此之前,開放式的 LLMs(大語言模型)通常模型規模都低於 100 B。
最後,我們可以從下表中總結一下 Llama 模型的演變情況:
表 1:比較 Llama 模型在上下文長度、詞彙表大小、訓練資料集大小以及支援語言數量方面的演變。
03 Llama 2 與 Llama 3:模型比較
在本節中,我們將 Llama2 和 Llama 3 模型在 SQuAD 資料集上進行測試。SQuAD 是一個採用 CC BY-SA 4.0 許可協議的問答資料集(https://huggingface.co/datasets/rajpurkar/squad)。該閱讀理解資料集(reading comprehension dataset)由一系列維基百科文章的問題組成。模型需要根據上下文,檢索出問題的正確答案。對於本次模型比較,資料集中有三個較為重要的欄位:
- 問題(question)——模型需要回答的問題。
- 上下文(context)——模型需要從中提取答案的背景資訊。
- 答案(answers)——問題的文字答案。
評估過程將包括三個量化指標:第一個是評估推理速度,第二個是確定答案長度,第三個是評估準確性。 對於準確性的評估,我們使用 RAQ [1]。RAQ 透過一個獨立的 LLM 對 Llama 2 和 Llama 3 的答案進行排序,排序的依據是它們與真實答案的接近程度。
我們首先下載這兩個模型的 .gguf 格式檔案,以便能夠在 CPU 上執行它們,並將它們放置在 model/ 資料夾下。
我們使用了每個模型的 instruct 版本,並進行了 4-bit 量化:
- nous-hermes-Llama-2-7b.Q4_K_M.gguf,來自 https://huggingface.co/TheBloke/Nous-Hermes-Llama-2-7B-GGUF
- Meta-Llama-3-8B-Instruct-Q4_K_M.gguf,來自 https://huggingface.co/NousResearch/Meta-Llama-3-8B-Instruct-...
在完成上述操作之後,接下來我們會匯入所有需要的庫,以及我們自定義的一個生成器。這個生成器是一個函式或者類,它能夠接受我們想要使用的模型作為輸入引數。
這個類的作用是從 config.yaml 配置檔案中載入模型引數,這些引數的具體設定包括:設定上下文長度為 1024,調節模型執行的“temperature ”為 0.7,以及限制輸出的最大 tokens 數為2000。
此外,系統還構建了一個基於 LangChain 的提示詞模板。這個模板的作用是在將問題和相關上下文提交給大語言模型之前,對它們進行格式化處理,以便獲得更準確的響應。
函式 get_llm_response 負責接收已載入的大語言模型、相關上下文以及問題,並輸出模型的回答以及一系列量化評估指標。
評估結束後,我們將各項指標進行了視覺化展示,並發現 Llama 3 的速度比 Llama 2 快,其平均生成速度達到每秒 1.1 個單詞,而 Llama 2 的生成速度僅為每秒 0.25 個單詞。在答案長度方面,Llama 3 輸出的答案較長,平均為 70 個單詞,相比之下,Llama 2 7B 的答案平均長度只有 15 個單詞。根據相對答案質量(RAQ,Relative Answer Quality)評估框架,Llama 3 在平均排名上拔得頭籌,約為 1.25,而 Llama 2 的表現則稍遜一籌,其平均排名大約為 1.8。
圖 9:Llama 2 7B vs Llama 3 8B(圖片由作者提供)
表 2 展示了不同語言模型效能的 Dunn 事後檢驗(Dunn post-hoc test)結果。每個單元格顯示了兩種模型之間的效能差異是否在 5 %的顯著性水平(significance level)上具有統計意義。"Significant" 意味著存在統計上的顯著差異(p值不超過0.05),而 "Not Significant" 則意味著模型之間的效能差異不具備統計顯著性(p值超過0.05)。根據檢驗結果,Llama 3 與 Llama 2 在效能上的差異是顯著的。
表 2:不同 LLM 模型效能排名差異的顯著性分析
最後,從定性角度,我們分析了兩種模型對某一特定問題的回答:“What percentage of improvement over energy code requirements will be the goal of all new construction and renovations?”。這一問題基於以下上下文資訊得出答案,兩者均正確地回答了問題。
然後,如下所示,Llama 2 在回答過程中先是表示答案不在給定上下文中,但最終卻又引用了上下文中的內容來給出答案,顯得前後矛盾。而 Llama 3 則能夠準確地從上下文中找到答案,並簡潔明瞭地作出了正確回應。
04 Conclusions
Llama 模型在發展過程中不斷進行改進,使模型在處理語言任務時更加高效、表現更佳,並且能夠適應更廣泛的應用場景。從最初的 Llama 1 開始,引入瞭如 RMSNorm 輸入歸一化和更平滑的啟用函式等基礎性改變,後續的每個模型版本都是在此基礎上進一步改進。
Llama 2 透過採用 GQA 提高推理效率,對這一方法進行了最佳化,為 Llama 3 的進一步提升鋪平道路。Llama 3 在此基礎上,將 GQA 應用於更小型的模型,採用了詞彙表數量更大的高效分詞器,將上下文長度翻倍,並大幅增加了訓練資料量。
Llama 3.1 版本開啟了新的篇章。它將上下文長度進一步擴充套件至 128K 個 token,增加了對更多語言的支援,並推出了迄今為止最大的開放式模型 —— 405B 模型。
Llama 模型的連續升級,使得它們在各種應用場景中都具有卓越的適應性。至今,Llama 模型已累計下載超過 3 億次,而將其整合到利用私有 LLM 技術的數千種產品中,僅僅是一個開始。頗具諷刺意味的是,Llama 現在在推動開放式 AI 的發展道路上走在了前列,取代了曾經更為開放的 OpenAI 所佔據的位置。
References
[1] Luís Roque, Rafael Guedes. “Research to Production: Relative Answer Quality (RAQ) and NVIDIA NIM.” Towards Data Science. Medium, 2024.
[2] Hugo Touvron, Thibaut Lavril, Gautier Izacard, Xavier Martinet, Marie-Anne Lachaux, Timothée Lacroix, Baptiste Rozière, Naman Goyal, Eric Hambro, Faisal Azhar, Aurelien Rodriguez, Armand Joulin, Edouard Grave, Guillaume Lample. “Llama: Open and Efficient Foundation Language Models.” arXiv preprint arXiv:2302.13971, 2023.
[3] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin. “Attention Is All You Need.” arXiv preprint arXiv:1706.03762, 2017.
[4] Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei. “Language Models are Few-Shot Learners.” arXiv preprint arXiv:2005.14165, 2020.
[5] Biao Zhang, Rico Sennrich. “Root Mean Square Layer Normalization.” arXiv preprint arXiv:1910.07467, 2019.
[6] Noam Shazeer. “GLU Variants Improve Transformer.” arXiv preprint arXiv:2002.05202, 2020.
[7] Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu. “RoFormer: Enhanced Transformer with Rotary Position Embedding.” arXiv preprint arXiv:2104.09864, 2021.
[8] Hugo Touvron, Louis Martin, Kevin Stone, Peter Albert, Amjad Almahairi, Yasmine Babaei, Nikolay Bashlykov, Soumya Batra, Prajjwal Bhargava, Shruti Bhosale, Dan Bikel, Lukas Blecher, Cristian Canton Ferrer, Moya Chen, Guillem Cucurull, David Esiobu, Jude Fernandes, Jeremy Fu, Wenyin Fu, Brian Fuller, Cynthia Gao, Vedanuj Goswami, Naman Goyal, Anthony Hartshorn, Saghar Hosseini, Rui Hou, Hakan Inan, Marcin Kardas, Viktor Kerkez, Madian Khabsa, Isabel Kloumann, Artem Korenev, Punit Singh Koura, Marie-Anne Lachaux, Thibaut Lavril, Jenya Lee, Diana Liskovich, Yinghai Lu, Yuning Mao, Xavier Martinet, Todor Mihaylov, Pushkar Mishra, Igor Molybog, Yixin Nie, Andrew Poulton, Jeremy Reizenstein, Rashi Rungta, Kalyan Saladi, Alan Schelten, Ruan Silva, Eric Michael Smith, Ranjan Subramanian, Xiaoqing Ellen Tan, Binh Tang, Ross Taylor, Adina Williams, Jian Xiang Kuan, Puxin Xu, Zheng Yan, Iliyan Zarov, Yuchen Zhang, Angela Fan, Melanie Kambadur, Sharan Narang, Aurelien Rodriguez, Robert Stojnic, Sergey Edunov, Thomas Scialom. “Llama 2: Open Foundation and Fine-Tuned Chat Models.” arXiv preprint arXiv:2307.09288, 2023.
[9] Noam Shazeer. “Fast Transformer Decoding: One Write-Head is All You Need.” arXiv preprint arXiv:1911.02150, 2019.
[10] Joshua Ainslie, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebrón, Sumit Sanghai. “GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints.” arXiv preprint arXiv:2305.13245, 2023.
[11] Meta AI. “Introducing Llama 3.” Meta AI Blog, 2024.
[12] Taku Kudo, John Richardson. “SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing.” arXiv preprint arXiv:1808.06226, 2018.
[13] OpenAI. “TikToken.” GitHub.
[14] Rico Sennrich, Barry Haddow, Alexandra Birch. “Neural Machine Translation of Rare Words with Subword Units.” arXiv preprint arXiv:1508.07909, 2015.
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
About the authors
Luís Roque
Serial entrepreneur and leader in the AI space. I develop AI products for businesses and invest in AI-focused startups.
https://www.linkedin.com/in/luisbrasroque/
END
本期互動內容 🍻
❓文章提到 Llama 模型採用了多項技術最佳化,如 GQA 和高效分詞器等。你認為在這些最佳化中,哪一項對模型效能提升最關鍵?為什麼?
原文連結:
https://towardsdatascience.com/the-evolution-of-llama-from-ll...