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