本科生60行代碼教你手搓GPT大模型,技術介紹堪比教程 環(huán)球速遞

發(fā)布時間:2023-02-26 17:52:51  |  來源:騰訊網(wǎng)  

機器之心報道

機器之心編輯部

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 行)。

作者通過以下方式測試結果:

輸出結果如下:

正如作者說的:這次實驗成功了。

關鍵詞: 本科生60行代碼教你手搓GPT大模型 技術介紹堪比教程

 

網(wǎng)站介紹  |  版權說明  |  聯(lián)系我們  |  網(wǎng)站地圖 

星際派備案號:京ICP備2022016840號-16 營業(yè)執(zhí)照公示信息版權所有 郵箱聯(lián)系:920 891 263@qq.com