首頁  >  文章  >  科技週邊  >  乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

PHPz
PHPz轉載
2024-02-26 11:00:201094瀏覽

前段時間,AI大神Karpathy上線的AI大課,已經收穫了全網15萬次播放量。

當時還有網友表示,這2小時課程的含金量,相當於大學4年。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

就在這幾天,Karpathy又萌生了一個新的想法:

2小時13分鐘的「從頭開始建立GPT分詞器」影片內容轉化為書中的章節或部落格文章的形式,著重探討「分詞」這個主題。

具體步驟如下:

- 為影片新增字幕或解說文字。

- 將影片切割成若干有配套圖片和文字的段落。

- 利用大語言模型的提示工程技術,逐段翻譯。

- 將結果輸出為網頁形式,其中包含指向原始影片各部分的連結。

更廣泛地說,這樣的工作流程可以應用於任何視訊輸入,自動生成各種教程的「配套指南」,使其格式更加便於閱讀、瀏覽和搜尋。

這聽起來是可行的,但也頗具挑戰。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

他在GitHub專案minbpe下,寫了一個例子來闡述自己的想像。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

網址:https://github.com/karpathy/minbpe/blob/master/lecture.md

Karpathy表示,這是自己手動完成的任務,即觀看影片並將其翻譯成markdown格式的文章。

「我只看了大約4分鐘的影片(即完成了3%),而這已經花了大約30分鐘來寫,所以如果能自動完成這樣的工作就太好了」。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

接下來,就是上課時間了!

「LLM分詞」課程文字版

大家好,今天我們將探討LLM中的「分詞」問題。

遺憾的是,「分詞」是目前最領先的大模型中,一個相對複雜且棘手的組成部分,但我們有必要對其進行詳細了解。

因為LLM的許多缺陷可能歸咎於神經網絡,或其他看似神秘的因素,而這些缺陷實際上都可以追溯到「分詞」。

字元級分詞

那麼,什麼是分詞呢?

事實上,在先前的影片《讓我們從零開始建立 GPT》中,我已經介紹過分詞,但那隻是一個非常簡單的字元級版本。

如果你去Google colab查看那個視頻,你會發現我們從訓練資料(莎士比亞)開始,它只是Python中的一個大字串:

First Citizen: Before we proceed any further, hear me speak.All: Speak, speak.First Citizen: You are all resolved rather to die than to famish?All: Resolved. resolved.First Citizen: First, you know Caius Marcius is chief enemy to the people.All: We know't, we know't.

但是,我們要如何將字串輸入LLM呢?

我們可以看到,我們首先要為整個訓練集中的所有可能字符,建立一個詞彙表:

# here are all the unique characters that occur in this textchars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65

然後根據上面的詞彙表,建立用於在單一字元和整數之間進行轉換的查找表。此查找表只是一個Python字典:

stoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# encoder: take a string, output a list of integersencode = lambda s: [stoi[c] for c in s]# decoder: take a list of integers, output a stringdecode = lambda l: ''.join([itos[i] for i in l])print(encode("hii there"))print(decode(encode("hii there")))# [46, 47, 47, 1, 58, 46, 43, 56, 43]# hii there

一旦我們將一個字串轉換成一個整數序列,我們就會看到每個整數,都被用作可訓練參數的二維嵌入的索引。

因為我們的字彙表大小為 vocab_size=65 ,所以該嵌入表也會有65行:

class BigramLanguageModel(nn.Module):def __init__(self, vocab_size):super().__init__()self.token_embedding_table = nn.Embedding(vocab_size, n_embd)def forward(self, idx, targets=None):tok_emb = self.token_embedding_table(idx) # (B,T,C)

在這裡,整數從嵌入表中「提取」出一行,這一行就是代表該分詞的向量。然後,該向量將作為對應時間步長的輸入輸入到Transformer。

使用BPE演算法進行「字元區塊」分詞

#對於「字元級」語言模型的天真設定來說,這一切都很好。

但在實踐中,在最先進的語言模型中,人們使用更複雜的方案來建構這些表徵詞彙。

具體地說,這些方案不是在字元層級上工作,而是在「字元區塊」層級上工作。建構這些區塊詞彙表的方式是使用位元組對編碼(BPE)等演算法,我們將在下面詳細介紹該演算法。

暫時回顧一下這種方法的歷史發展,將位元組級BPE演算法用於語言模型分詞的論文,是2019年OpenAI發表的GPT-2論文Language Models are Unsupervised Multitask Learners。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

論文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf

向下翻到第2.2節「輸入表示」,在那裡他們描述並激勵這個演算法。在這一節的結尾,你會看到他們說:

詞彙量擴大到50257個。我們也將上下文大小從512增加到1024個token,並使用512更大batchsize。

回想一下,在Transformer的注意力層中,每個token都與序列中先前有限的token清單相關聯。

本文指出,GPT-2模型的上下文長度從GPT-1的512個token,增加到1024個token。

換句話說,token是 LLM 輸入端的基本「原子」。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

「分詞」是將Python中的原始字串,轉換為token清單的過程,反之亦然。

還有一個流行的例子可以證明這種抽象的普遍性,如果你也去Llama 2的論文中搜尋「token”,你將得到63個匹配結果。

例如,論文聲稱他們在2萬億個token上進行了訓練,等等。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

論文網址:https://arxiv.org/pdf/2307.09288.pdf

淺談分詞的複雜性

在我們深入探討實現的細節之前,讓我們簡要地說明一下,需要詳細了解「分詞」過程的必要性。

分詞是LLM中許多許多怪異問題的核心,我建議你不要忽略它。

很多看似神經網路架構的問題,其實都跟分詞有關。這裡只是幾個例子:

- 為什麼LLM不會拼字? ——分詞 

- 為什麼LLM不能執行超簡單的字串處理任務,例如反轉字串? ——分詞 

- 為什麼LLM在非英語語言(例如日語)任務中更差? ——分詞 

- 為什麼LLM不擅長簡單的算術? ——分詞 

- 為什麼GPT-2在用Python編碼時遇到了更多的問題? ——分詞 

- 為什麼我的LLM在看到字串時突然停止? ——分詞 

- 我收到的關於「trailing whitespace」的奇怪警告是什麼? ——分詞 

- 如果我問LLM關於「SolidGoldMagikarp」的問題,為什麼它會崩潰? ——分詞 

- 為什麼我應該使用LLM的YAML而不是JSON? ——分詞 

- 為什麼LLM不是真正的端對端語言建模? ——分詞

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

我們將在影片的結尾,再回到這些問題上。

分詞的視覺化預覽

#接下來,讓我們載入這個分詞WebApp。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

網址:https://tiktokenizer.vercel.app/

##這個Web應用程式的優點是,分詞在網頁瀏覽器中即時運行,允許你輕鬆地在輸入端輸入一些文字字串,並在右側看到分詞結果。

在頂部,你可以看到我們目前正在使用 gpt2 分詞器,並且可以看到,這個範例中貼上的字串目前正在分詞為 300個token。

在這裡,它們用顏色明確顯示出來:

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

#比如,字串「Tokenization」編碼到token30642,其後是token是1634。

token“is”(注意,這是三個字符,包括前面的空格,這很重要!)是318。

注意使用空格,因為它在字串中是絕對存在的,必須與所有其他字元一起分詞。但為了清晰可見,在可視化時通常會省略。

你可以在應用程式底部開啟和關閉它的視覺化功能。同樣,token“at”是379,“the”是262,依此類推。

接下來,我們有一個簡單的算術範例。

在這裡,我們看到,分詞器對數字的分解可能不一致。例如,數字127是由3個字元組成的token,但數字677是因為有2個token:6(同樣,請注意前面的空格)和77。

我們依賴LLM來解釋這種任意性。

它必須在其參數內部和訓練過程中,了解這兩個token(6和77實際上組合成了數字677)。

同樣,我們可以看到,如果LLM想要預測這個總和的結果是數字804,它必須在兩個時間步長內輸出:

首先,它必須發出token“8”,然後是token“04”。

請注意,所有這些分割看起來都是完全任意的。在下面的例子中,我們可以看到1275是“12”,然後“75”,6773實際上是三個token“6”、“77”、“3”,而8041是“8”、“041” 。

(未完待續...)

(TODO:若想繼續文字版的內容,除非我們想出如何從視頻中自動生成)

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

網友在線,出謀劃策

網友表示,太好了,實際上我更喜歡閱讀這些帖子,而不是看視頻,更容易掌握自己的節奏。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

也有網友為Karpathy出謀劃策:

「感覺很棘手,但使用LangChain可能是可行的。我在想是否可以使用whisper轉錄,產生有清晰章節的高級大綱,然後對這些章節塊並行處理,在整體提綱的上下文中,專注於各自章節區塊的具體內容(也為每個並行處理的章節生成配圖)。然後再透過LLM把所有產生的參考標記,彙編到文章末尾」。

乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章

有人為此還寫了一個pipeline,很快就會開源。


以上是乾貨滿滿!大神Karpathy兩小時AI大課文字版第一彈,全新工作流程自動把影片轉成文章的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除