從零開始實現大語言模型(一):概述

1. 前言

大家好,我是何睿智。我現在在做大語言模型相關工作,我用業余時間寫一個專欄,給大家講講如何從零開始實現大語言模型。

從零開始實現大語言模型是了解其原理及領域大語言模型實現路徑的最好方法,沒有之一。已有研究證明,為特定任務定制或使用領域數據訓練的大語言模型能在領域相關的評價指標上超過ChatGPT這樣的通用大語言模型。

本專欄將從零開始講解大語言模型理論原理step-by-step,提供一整套工業級文本數據處理,大語言模型構建、預訓練、監督微調及指令微調,并行計算與分布式訓練代碼,并且從零開始解釋實現代碼line-by-line。

2. 大語言模型的模型結構

2017年,文章Attention is all you need提出了一種用于機器翻譯的sequence-to-sequence架構模型Transformer。Transformer包含一個編碼器(encoder)和一個解碼器(decoder),編碼器提取輸入文本中的上下文信息,將其轉變成多個向量,并傳遞給解碼器。解碼器接收編碼器生成的向量,生成輸出序列。

2018年,文章BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding使用 [MASK] 單詞預測任務和句子前后順序預測任務預訓練Transformer模型的編碼器,預訓練后的模型被稱為BERT(Bidirectional Encoder Representations from Transformers)。BERT模型的編碼器架構及訓練策略,使其非常擅長情感預測、文檔分類等文本分類任務。

句子前后順序預測任務,最初是預測兩句話是否在原始預訓練語料中相鄰,后續改進為原始預訓練語料中的兩個相鄰句子是否被交換順序。

同年,OpenAI的文章Improving Language Understanding by Generative Pre-Training通過生成式預訓練任務(根據一段話的前文預測后文)訓練Transformer模型的解碼器,預訓練后的模型被稱為GPT(Generative Pretrained Transformers)。GPT模型的解碼器架構及訓練策略,使其非常擅長機器翻譯、文本摘要、編寫計算機代碼等文本生成任務。

圖一

Transformer、BERT及上述GPT模型網絡結構核心是自注意力機制(self-attention)。自注意力機制可以讓模型判斷輸入文本序列中不同token之間的相關性,使模型能夠捕獲輸入文本數據中長距離依賴關系及上下文關系,因而比傳統基于RNN等結構的模型具備更強的自然語言理解能力,生成的內容更加連貫且與上下文相關性更強。

token是指對文本分割處理后得到的最小單位,也是模型處理文本時的基本單元。訓練數據處理時常提到的tokenization,即把自然語言文本處理成連續的token。Token可以是一個單詞,一個字符,一個詞組等等,取決于對訓練數據做tokenization時采用的方法。

相比較于上面OpenAI的文章介紹的GPT-1模型,GPT-3模型結構沒有做任何調整。GPT-3可以視為GPT-1模型的拓展,其模型層數更多,Embedding向量維度更高,參數量更大,并且使用了更大的預訓練數據集。ChatGPT是通過OpenAI的InstructGPT論文中的方法在一個大的指令數據集(instruction dataset)上微調GPT-3而產生的。Meta的LLaMA等絕大部分大語言模型結構與GPT基本相同或僅僅做了非常微小的修改。

與Transformer模型相比,大語言模型GPT的結構非常簡單,本質上它只是Transformer模型的解碼器。但是GPT-3比原始Transformer模型解碼器要大的多,原始Transformer模型解碼器僅包含6個Transformer Block,但是GPT-3包含96個Transformer Block,共1750億參數。GPT生成文本時每次僅預測下一個token,因此它也被視為一種自回歸模型(autoregressive model)。

圖二

盡管GPT只相當于Transformer模型的解碼器,而不是像Transformer那樣明確被用于解決機器翻譯任務的sequence-to-sequence模型,且訓練模型的下一個token預測任務也不是專門針對機器翻譯的任務,但是它也能夠執行機器翻譯任務,且大語言模型機器翻譯效果比一般機器翻譯模型都相對好。

大語言模型這種能夠執行沒有被明確訓練的能力被稱為“涌現(emerging property)”。涌現是一種沒有使用相同任務明確訓練,而是模型在學習了大量各種各樣語言的語料之后自然而然出現的能力。大語言模型中的這種涌現現象證明了其具備非常強大的能力,部分專家學者認為其具備一定的通用人工智能雛形,截止目前大家已經發現并認可了大語言模型的廣闊應用前景。

3. 大語言模型的訓練方法

如下圖所示,大語言模型的訓練方法通常包含預訓練(pretraining)和微調(finetuning)。

預訓練是指使用大量無標簽的、多樣化的文本數據(raw text),通過下一個token預測任務(next token prediction task)訓練模型,使模型能夠了解自然語言文本中的語法及知識。預訓練后的模型被稱為基礎模型(base model or foundational model),如GPT-3(ChatGPT對應的基礎模型)。基礎模型一般具有比較強的文本補全(text completion)及小樣本學習(few-shot learning)能力。

文本補全是指模型能夠根據用戶輸入的上文,完成相應的下文。小樣本學習是指不用大量訓練數據訓練或微調模型,而是提供幾個具體任務的示例,模型也能夠輸出比較不錯的結果。

可以使用針對特定任務或具體領域的小數據集微調模型參數,使基礎模型具備如ChatGPT這樣的對話能力。最流行的兩類微調大語言模型的方法為指令微調(instruction-finetuning)和監督微調(finetuning for classification tasks)。指令微調是指使用如下所示的帶標簽的(指令-答案)數據集繼續訓練基礎模型,監督微調是指使用(文本-類別標簽)這樣的帶標簽數據集繼續訓練基礎模型。

{"instruction": "請把下面的中文翻譯成英文:\n我愛你。","answer": "I love you."
}

圖三

“raw"的意思為"原始的”,是指用于預訓練模型的數據不包含任何使用監督學習方法訓練傳統機器學習模型或深度學習模型時用到的標簽信息。預訓練大語言模型的方法被稱為自監督學習(self-supervised learning),預訓練模型的標簽數據使用一定的規則從輸入文本中自動生成。

使用raw text訓練模型并不意味著不對用于預訓練的文本數據做任何處理。如在預訓練之前,通常會使用一系列文本預處理方法對文本數據進行過濾。已有研究表明,預訓練大語言模型的文本質量越高,則模型能力越強。

4. 大語言模型的訓練數據

預訓練GPT-3的數據來自5個不同的數據集,共包含3000億tokens。其中CommonCrawl (filtered)是采用一定規則從CommonCrawl數據集過濾得到的一個質量相對高的子集,WebText2是Reddit網站上獲得3個及以上點贊的帖子中的外部鏈接所包含的網頁文本(外部鏈接指向其他網頁,WebText2收集了這些鏈接指向網頁的文本內容),Books1可能來自古騰堡計劃(Project Gutenberg,古騰堡計劃是一個數字化圖書館,致力于向公眾提供免費的電子書),Books2可能來自Libgen(Libgen是一個知名的免費圖書共享平臺,用戶可以通過該平臺獲取各種電子書、學術論文和期刊等資源),Wikipedia數據集由英文維基百科組成。

數據集名稱描述token數量在訓練數據集中的比例
CommonCrawl (filtered)Web crawl data410 billion60%
WebText2Web crawl data19 billion22%
Books1Internet-based book corpus12 billion8%
Books2Internet-based book corpus55 billion8%
WikipediaHigh-quality text3 billion3%

GPT-3之后的大語言模型進一步拓展了訓練模型的數據集,如Meta的LLaMA還使用了Arxiv網站中的論文數據集(92GB)及StackExchange網站中與代碼相關的問答數據集(78GB)。國內的大語言模型也針對性地增加了訓練集中的中文訓練數據占比。

GPT-3論文作者沒有公開他們用到的訓練數據集,但是有個類似的開源數據集The Pile,該數據集的信息可以點擊鏈接查看詳情:https://pile.eleuther.ai/。

訓練GPT-3時并沒有使用上表提到的5個數據集中的全部數據,而是從每個數據集中抽取了一部分數據,共同組成了訓練模型的包含3000億tokens的訓練數據集。抽取數據的原則是:質量越高的數據集采樣比例越高,質量越低的數據集采樣比例越低。如CommonCrawl數據集共包含4100億tokens,但是只從中抽取了1800億tokens,WebText2雖然只包含190億tokens,但是從中共抽取了660億tokens,相當于將WebText2數據集重復了3.47遍。

5. 大語言模型的實現流程

從零開始實現大語言的流程共三階段:構建大語言模型、預訓練大語言模型、微調大語言模型。

圖四

大語言模型構建部分將詳細介紹文本數據處理方法,構建訓練大語言模型的DatasetDataLoader;從零開始一步步解釋并實現簡單自注意力機制(simplified self-attention)、縮放點積注意力機制(scaled dot-product attention)、因果注意力機制(causal attention)、多頭注意力機制(multi-head attention);并最終構建出OpenAI的GPT系列大語言模型GPTModel

預訓練部分將介紹并行計算與分布式機器學習方法原理,實現使用無標簽文本數據訓練大語言模型的方法,以及介紹大語言模型效果評估的基本方法。使用GPT-3同量級數據集預訓練大語言模型的計算代價非常大,如果換算成相應云計算資源價值,預訓練GPT-3大約需耗費460萬美元。因此,該部分同時會介紹使用構建好的大語言模型加載開源大語言模型(如GPT-2)權重的方法。

雖然訓練GPT-3的計算資源換算成相應云計算資源價值約460萬美元,但如果已經具備一個足夠大的GPU計算集群,訓練GPT-3消耗的電費遠遠不需要460萬美元。

第三階段分別使用監督微調及指令微調方法,微調基礎模型參數,使大語言模型具備文本分類及回答問題能力。

6. 結束語

從零開始實現大語言模型系列專欄旨在詳細解釋大語言模型的理論原理,并提供一套工業級實踐代碼。本文從一個高的視角概述了大語言模型的模型結構、訓練方法及訓練數據,并且介紹了從零開始實現大語言模型的流程。

大語言模型具備強大的自然語言理解及生成能力,短短一年時間,自然語言處理領域已經翻天覆地。實踐證明,在大量無標簽的自然語言文本上使用簡單的生成式預訓練任務能夠產生強大到不可思議的模型,在大量無標簽視頻數據上使用生成式預訓練任務是否也能夠產生非常驚艷的模型呢?

2024年2月16日,OpenAI發布了首個視頻生成模型Sora,能生成長達1分鐘流暢且連貫的高清視頻。看來,大模型要一統天下了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38444.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《昇思25天學習打卡營第07天|函數式自動微分》

函數式自動微分 環境配置 # 實驗環境已經預裝了mindspore2.2.14,如需更換mindspore版本,可更改下面mindspore的版本號 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 import numpy as np imp…

Windows10錄屏,教你3個方法,簡單快速錄屏

“我的電腦系統是Windows10的系統,今晚要進行線上開會,但我實在有事沒辦法參加會議,想把會議的內容錄制下來方便我后續觀看。但卻找不到電腦錄屏功能在哪里打開?求助一下,誰能幫幫我?” 在數字化時代&…

mysql 命令 —— 查看表信息(show table status)

查詢表信息,如整個表的數據量大小、表的索引占用空間大小等 1、查詢某個庫下面的所有表信息: SHOW TABLE STATUS FROM your_database_name;2、查詢指定的表信息: SHOW TABLE STATUS LIKE your_table_name;如:Data_length 顯示表…

閑聊 .NET Standard

前言 有時候,我們從 Nuget 下載第三方包時,會看到這些包的依賴除了要求 .NET FrameWork、.NET Core 等的版本之外,還會要求 .NET Standard 的版本,比如這樣: 這個神秘的 .NET Standard 是什么呢? .NET St…

【算法】字母異位詞分組

題目:字母異位詞分組 給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] …

從零開始搭建spring boot多模塊項目

一、搭建父級模塊 1、打開idea,選擇file–new–project 2、選擇Spring Initializr,選擇相關java版本,點擊“Next” 3、填寫父級模塊信息 選擇/填寫group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。點擊“…

【0300】Postgres內核動態哈希表實現機制(1)

相關文章: 【0299】Postgres內核之哈希表(Hash Tables) 0 概述 在【0299】Postgres內核之哈希表(Hash Tables)一文中,講解了哈希表的作用、實現、優缺點等特性。本文開始,將詳細分析Postgres內…

MySQL之應用層優化(三)

應用層優化 應用層緩存 2.本地共享內存緩存 這種緩存一般是中等大小(幾個GB),快速,難以在多臺機器間同步。它們對小型的半靜態位數據比較合適。例如每個州的城市列表,分片數據存儲的分區函數(映射表),或者使用存活時間(TTL)策略…

記錄一次Chrome瀏覽器自動排序ajax請求的JSON數據問題

文章目錄 1.前言2. 為什么會這樣?3.如何解決? 1.前言 作者作為新人入職的第一天,mentor給了一個維護公司運營平臺的小需求,具體需求是根據運營平臺的某個管理模塊所展示記錄的某些字段對展示記錄做排序。 第一步: myb…

工業觸摸一體機優化MES應用開發流程

工業觸摸一體機在現代工業生產中扮演著至關重要的角色,它集成了智能觸摸屏和工業計算機的功能,廣泛應用于各種生產場景中。而制造執行系統(MES)作為工業生產管理的重要工具,對于提高生產效率、降低成本、優化資源利用具…

力扣hot100-普通數組

文章目錄 題目:最大子數組和方法1 動態規劃方法2 題目:合并區間題解 題目:最大子數組和 原題鏈接:最大子數組和 方法1 動態規劃 public class T53 {//動態規劃public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基礎知識-編譯相關

記錄C語言相關的基礎知識 1 C源碼到可執行文件的四個階段 預處理(.i)、編譯(.s)、匯編(.obj)、鏈接。 1.1 預處理 預處理階段,主要完成宏替換、文件展開、注釋刪除、條件編譯展開、添加行號和文件名標識,輸出.i/.ii預處理文件。 宏替換,…

【UML用戶指南】-26-對高級行為建模-狀態圖

目錄 1、概念 2、組成結構 3、一般用法 4、常用建模技術 4.1、對反應型對象建模 一個狀態圖顯示了一個狀態機。在為對象的生命期建模中 活動圖展示的是跨過不同的對象從活動到活動的控制流 狀態圖展示的是單個對象內從狀態到狀態的控制流。 在UML中,用狀態圖…

tcpdump命令詳解及使用實例

1、抓所有網卡數據包,保存到指定路徑 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump簡介 tcpdump可以將網絡中傳送的數據包完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來去掉無用的信…

【Python】已解決:SyntaxError: positional argument follows keyword argument

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:SyntaxError: positional argument follows keyword argument 一、分析問題背景 在Python編程中,當我們在調用函數時混合使用位置參數(p…

RabbitMQ進階篇

文章目錄 發送者的可靠性生產者重試機制實現生產者確認 MQ的可靠性數據持久化交換機持久化隊列持久化消息持久化 Lazy Queue(可配置~)控制臺配置Lazy模式代碼配置Lazy模式更新已有隊列為lazy模式 消費者的可靠性消費者確認機制失敗重試機制失敗處理策略 業務冪等性唯一消息ID業…

西部智慧健身小程序+華為運動健康服務

1、 應用介紹 西部智慧健身小程序為用戶提供一站式全流程科學健身綜合服務。用戶通過登錄微信小程序,可享用健康篩查、運動風險評估、體質檢測評估、運動處方推送、個人運動數據監控與評估等公益服務。 2、 體驗介紹西部智慧健身小程序華為運動健康服務核心體驗如…

idea xml ctrl+/ 注釋格式不對齊

處理前 處理后 解決辦法 取消這兩個勾選

核方法總結(三)———核主成分(kernel PCA)學習筆記

一、核主成分 1.1 和PCA的區別 PCA (主成分分析)對應一個線性高斯模型(參考書的第二章),其基本假設是數據由一個符合正態分布的隱變量通過一個線性映射得到,因此可很好描述符合高斯分布的數據。然而在很多實…

ViewBinding的使用(因為kotlin-android-extensions插件的淘汰)

書籍: 《第一行代碼 Android》第三版 開發環境: Android Studio Jellyfish | 2023.3.1 問題: 3.2.4在Activity中使用Toast章節中使用到了kotlin-android-extensions插件,但是該插件已經淘汰,根據網上了解,目前使用了新的技術VewBinding替…