機器之心報道
機器之心編輯部
GPT 模型實現(xiàn)起來有時也很簡單。
【資料圖】
當前,大型語言模型(LLM)被認為是人工智能突破的方向。人們正在嘗試用它們做各種復雜的事情,比如問答、創(chuàng)作、數(shù)學推理以及編寫代碼等。近段時間 ChatGPT 持續(xù)的爆火是最好的例證。
然而,對于機器學習從業(yè)者來說,大模型的門檻很高:因為體量太大難以訓練,很長時間里這個方向一直被大公司壟斷。不過最近,簡化 GPT 模型的方法越來越多了。1 月中旬,前特斯拉 AI 高級總監(jiān) Andrej Karpathy(現(xiàn)已回歸 OpenAI)就發(fā)布了
從零開始構建 GPT 模型的完整教程
。不過訓練出的 GPT 和 OpenAI 的 GPT-3 比較,兩者規(guī)模差距達 1 萬 - 100 萬倍。
近日,加拿大麥克馬斯特大學的一位軟件工程本科生 Jay Mody 在導入 NumPy 庫下,僅用 60 行代碼就從頭實現(xiàn)了一個 GPT 模型,并將其命名為 PicoGPT。不僅如此,他還將經(jīng)過訓練的 GPT-2 模型權重加載到自己的實現(xiàn)中,并生成了一些文本。下面為 60 行代碼展示。
不過要做到這些,你需要熟悉 Python 和 NumPy,還要有一些訓練神經(jīng)網(wǎng)絡的基本經(jīng)驗。作者表示,這篇博客旨在對 GPT 進行簡單易懂的完整介紹。因此,作者只使用已經(jīng)訓練的模型權重來實現(xiàn)前向傳遞代碼。
代碼地址:
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58
對于此項研究,Andrej Karpathy 給出了四個字:雖遲但到。想當初,Karpathy 構建的 minGPT 和 nanoGPT 還要 300 行代碼。
值得一提的是,這篇教程不是完全零門檻的。為了讓讀者明白,作者首先介紹了什么是 GPT、它的輸入、輸出如何等其他內容,介紹得都非常詳細。
至于 GPT 到底能干什么,作者給出了幾個示例,它能寫電子郵件、總結一本書、給你 instagram 標題的想法、向 5 歲的孩子解釋黑洞、用 SQL 編寫代碼等。
通過仔細閱讀這部分內容后,你能大致了解 GPT 的一些基礎知識。有了這些背景介紹,接下來就是如何設置了。
項目介紹
設置
這一章節(jié)主要介紹了如何設置編碼器、超參數(shù)以及參數(shù)。
你要做的,首先是克隆代碼庫:
然后安裝依賴項:
注意,如果你使用的是 M1 Macbook,在運行 pip install 之前,你需要在 requirements.txt 中將 tensorflow 更改為 tensorflow-macos。在這個項目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
encoder.py:包含 OpenAI BPE Tokenizer 的代碼,直接取自 gpt-2 repo;
utils.py:包含下載和加載 GPT-2 模型權重、tokenizer 和超參數(shù)的代碼;
gpt2.py:包含 GPT 模型和生成代碼,可以將其作為 python 腳本運行;
gpt2_pico.py:與 gpt2.py 相同,但是代碼行數(shù)更少。
其中 gpt2.py 需要從頭開始實現(xiàn),因此你要做的是先刪除 gpt2.py 并重新創(chuàng)建一個空文件:
然后將下列代碼復制到 gpt2.py 中:
上述代碼包含 4 個主要部分:
gpt2 函數(shù)是本次實現(xiàn) GPT 的實際代碼;
generate 函數(shù)實現(xiàn)自回歸解碼算法;
main 函數(shù);
fire.Fire (main) 將文件轉換為 CLI 應用程序,以便最終可以運行代碼:python gpt2.py "some prompt here"。
main 函數(shù)包含有 encode、hparams、params 參數(shù),執(zhí)行下列代碼:
接著必要的模型以及 tokenizer 文件將被下載到 models/124M 文件。
設置完成之后,作者開始介紹編碼器、超參數(shù)、參數(shù)的一些細節(jié)內容。就拿編碼器來說,本文的編碼器和 GPT-2 使用的 BPE tokenizer 一樣。下面是該編碼器編碼和解碼的一些文本示例:
實際的 token 長這個樣子:
需要注意,有時 token 是單詞(例如 Not),有時它們是單詞但前面有一個空格(例如 ?all,? 代表一個空格),有時是單詞的一部分(例如 capes 被拆分為 ?cap 和 es),有時它們是標點符號(例如 .)。
BPE 的一個好處是它可以對任意字符串進行編碼,如果遇到詞匯表中不存在的內容,它會將其分解為它能理解的子字符串:
更細節(jié)的內容不再贅述。接下來介紹基礎神經(jīng)網(wǎng)絡,這一部分就更加基礎了,主要包括 GELU、Softmax 函數(shù)以及 Layer Normalization 和 Linear。
每一小部分都有代碼示例,例如在 Linear 部分,作者展示了標準矩陣乘法 + 偏置:
線性層從一個向量空間投影到另一個向量空間的代碼如下:
GPT 架構
這部分介紹 GPT 自身架構。
Transformer 架構如下:
Transformer 僅使用解碼器堆棧(圖的右側部分):
需要注意,由于擺脫了編碼器,中間的交叉注意力層也被刪除了。
在高層次上,GPT 體系架構有以下三個部分:
文本 + 位置嵌入;
Transformer 解碼器堆棧;
投影到詞匯表。
代碼就像下面這樣:
代碼部分截圖
接下來更詳細地分解以上三個部分中的每一個部分,這里也不再贅述。
以上就是作者對 GPT 的實現(xiàn),接下來就是將它們組合在一起并運行代碼,得到 gpt2.py。它的全部內容只有 120 行代碼(如果刪除注釋和空格,則為 60 行)。
作者通過以下方式測試結果:
輸出結果如下:
正如作者說的:這次實驗成功了。