成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

無需寫代碼能力,手搓最簡單BabyGPT模型:前特斯拉AI總監新作

人工智能 新聞
GPT 原來這么簡單?

我們知道,OpenAI 的 GPT 系列通過大規模和預訓練的方式打開了人工智能的新時代,然而對于大多數研究者來說,語言大模型(LLM)因為體量和算力需求而顯得高不可攀。在技術向上發展的同時,人們也一直在探索「最簡」的 GPT 模式。

近日,特斯拉前 AI 總監,剛剛回歸 OpenAI 的 Andrej Karpathy 介紹了一種最簡 GPT 的玩法,或許能為更多人了解這種流行 AI 模型背后的技術帶來幫助。

圖片

是的,這是一個帶有兩個 token 0/1 和上下文長度為 3 的極簡 GPT,將其視為有限狀態馬爾可夫鏈。它在序列「111101111011110」上訓練了 50 次迭代,Transformer 的參數和架構修改了箭頭上的概率。

例如我們可以看到:

  • 在訓練數據中,狀態 101 確定性地轉換為 011,因此該轉換的概率變得更高 (79%)。但不接近于 100%,因為這里只做了 50 步優化。
  • 狀態 111 以 50% 的概率分別進入 111 和 110,模型幾乎已學會了(45%、55%)。
  • 在訓練期間從未遇到過像 000 這樣的狀態,但具有相對尖銳的轉換概率,例如 73% 轉到 001。這是 Transformer 歸納偏差的結果。你可能會想這是 50%,除了在實際部署中幾乎每個輸入序列都是唯一的,而不是逐字地出現在訓練數據中。

通過簡化,Karpathy 已讓 GPT 模型變得易于可視化,讓你可以直觀地了解整個系統。

你可以在這里嘗試它:https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing

實際上,即使是 GPT 的最初版本,模型的體量很相當可觀:在 2018 年,OpenAI 發布了第一代 GPT 模型,從論文《Improving Language Understanding by Generative Pre-Training》可以了解到,其采用了 12 層的 Transformer Decoder 結構,使用約 5GB 無監督文本數據進行訓練。

但如果將其概念簡化,GPT 是一種神經網絡,它采用一些離散 token 序列并預測序列中下一個 token 的概率。例如,如果只有兩個標記 0 和 1,那么一個很小的二進制 GPT 可以例如告訴我們:

[0,1,0] ---> GPT ---> [P (0) = 20%, P (1) = 80%]

在這里,GPT 采用位序列 [0,1,0],并根據當前的參數設置,預測下一個為 1 的可能性為 80%。重要的是,默認情況下 GPT 的上下文長度是有限的。如果上下文長度為 3,那么它們在輸入時最多只能使用 3 個 token。在上面的例子中,如果我們拋出一枚有偏差的硬幣并采樣 1 確實應該是下一個,那么我們將從原始狀態 [0,1,0] 轉換到新狀態 [1,0,1]。我們在右側添加了新位 (1),并通過丟棄最左邊的位 (0) 將序列截斷為上下文長度 3,然后可以一遍又一遍地重復這個過程以在狀態之間轉換。

很明顯,GPT 是一個有限狀態馬爾可夫鏈:有一組有限的狀態和它們之間的概率轉移箭頭。每個狀態都由 GPT 輸入處 token 的特定設置定義(例如 [0,1,0])。我們可以以一定的概率將其轉換到新狀態,如 [1,0,1]。讓我們詳細看看它是如何工作的:

# hyperparameters for our GPT
# vocab size is 2, so we only have two possible tokens: 0,1
vocab_size = 2
# context length is 3, so we take 3 bits to predict the next bit probability
context_length = 3

GPT 神經網絡的輸入是長度為 context_length 的 token 序列。這些 token 是離散的,因此狀態空間很簡單:

print ('state space (for this exercise) = ', vocab_size ** context_length)
# state space (for this exercise) = 8

細節:準確來說,GPT 可以采用從 1 到 context_length 的任意數量的 token。因此如果上下文長度為 3,原則上我們可以在嘗試預測下一個 token 時輸入 1 個、2 個或 3 個 token。這里我們忽略這一點并假設上下文長度已「最大化」,只是為了簡化下面的一些代碼,但這一點值得牢記。

print ('actual state space (in reality) = ', sum (vocab_size ** i for i in range (1, context_length+1)))
# actual state space (in reality) = 14

我們現在要在 PyTorch 中定義一個 GPT。出于本筆記本的目的,你無需理解任何此代碼。

現在讓我們構建 GPT 吧:

config = GPTConfig (
block_size = context_length,
vocab_size = vocab_size,
n_layer = 4,
n_head = 4,
n_embd = 16,
bias = False,
)
gpt = GPT (config)

對于這個筆記本你不必擔心 n_layer、n_head、n_embd、bias,這些只是實現 GPT 的 Transformer 神經網絡的一些超參數。

GPT 的參數(12656 個)是隨機初始化的,它們參數化了狀態之間的轉移概率。如果你平滑地更改這些參數,就會平滑地影響狀態之間的轉換概率。

現在讓我們試一試隨機初始化的 GPT。讓我們獲取上下文長度為 3 的小型二進制 GPT 的所有可能輸入:

def all_possible (n, k):
# return all possible lists of k elements, each in range of [0,n)
if k == 0:
yield []
else:
for i in range (n):
for c in all_possible (n, k - 1):
yield [i] + c
list (all_possible (vocab_size, context_length))
[[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]]

這是 GPT 可能處于的 8 種可能狀態。讓我們對這些可能的標記序列中的每一個運行 GPT,并獲取序列中下一個標記的概率,并繪制為可視化程度比較高的圖形:

# we'll use graphviz for pretty plotting the current state of the GPT
from graphviz import Digraph

def plot_model ():
dot = Digraph (comment='Baby GPT', engine='circo')

for xi in all_possible (gpt.config.vocab_size, gpt.config.block_size):

# forward the GPT and get probabilities for next token
x = torch.tensor (xi, dtype=torch.long)[None, ...] # turn the list into a torch tensor and add a batch dimension
logits = gpt (x) # forward the gpt neural net
probs = nn.functional.softmax (logits, dim=-1) # get the probabilities
y = probs [0].tolist () # remove the batch dimension and unpack the tensor into simple list
print (f"input {xi} ---> {y}")

# also build up the transition graph for plotting later
current_node_signature = "".join (str (d) for d in xi)
dot.node (current_node_signature)
for t in range (gpt.config.vocab_size):
next_node = xi [1:] + [t] # crop the context and append the next character
next_node_signature = "".join (str (d) for d in next_node)
p = y [t]
label=f"{t}({p*100:.0f}%)"
dot.edge (current_node_signature, next_node_signature, label=label)

return dot

plot_model ()
input [0, 0, 0] ---> [0.4963349997997284, 0.5036649107933044] 
input [0, 0, 1] ---> [0.4515703618526459, 0.5484296679496765]
input [0, 1, 0] ---> [0.49648362398147583, 0.5035163760185242]
input [0, 1, 1] ---> [0.45181113481521606, 0.5481888651847839]
input [1, 0, 0] ---> [0.4961162209510803, 0.5038837194442749]
input [1, 0, 1] ---> [0.4517717957496643, 0.5482282042503357]
input [1, 1, 0] ---> [0.4962802827358246, 0.5037197470664978]
input [1, 1, 1] ---> [0.4520467519760132, 0.5479532480239868]

我們看到了 8 個狀態,以及連接它們的概率箭頭。因為有 2 個可能的標記,所以每個節點有 2 個可能的箭頭。請注意,在初始化時,這些概率中的大多數都是統一的(在本例中為 50%),這很好而且很理想,因為我們甚至根本沒有訓練模型。

下面開始訓練:

# let's train our baby GPT on this sequence
seq = list (map (int, "111101111011110"))
seq
[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0]
# convert the sequence to a tensor holding all the individual examples in that sequence
X, Y = [], []
# iterate over the sequence and grab every consecutive 3 bits
# the correct label for what's next is the next bit at each position
for i in range (len (seq) - context_length):
X.append (seq [i:i+context_length])
Y.append (seq [i+context_length])
print (f"example {i+1:2d}: {X [-1]} --> {Y [-1]}")
X = torch.tensor (X, dtype=torch.long)
Y = torch.tensor (Y, dtype=torch.long)
print (X.shape, Y.shape)

我們可以看到在那個序列中有 12 個示例。現在讓我們訓練它:

# init a GPT and the optimizer
torch.manual_seed (1337)
gpt = GPT (config)
optimizer = torch.optim.AdamW (gpt.parameters (), lr=1e-3, weight_decay=1e-1)
# train the GPT for some number of iterations
for i in range (50):
logits = gpt (X)
loss = F.cross_entropy (logits, Y)
loss.backward ()
optimizer.step ()
optimizer.zero_grad ()
print (i, loss.item ())
print ("Training data sequence, as a reminder:", seq)
plot_model ()

我們沒有得到這些箭頭的準確 100% 或 50% 的概率,因為網絡沒有經過充分訓練,但如果繼續訓練,你會期望接近。

請注意一些其他有趣的事情:一些從未出現在訓練數據中的狀態(例如 000 或 100)對于接下來應該出現的 token 有很大的概率。如果在訓練期間從未遇到過這些狀態,它們的出站箭頭不應該是 50% 左右嗎?這看起來是個錯誤,但實際上是可取的,因為在部署期間的真實應用場景中,幾乎每個 GPT 的測試輸入都是訓練期間從未見過的輸入。我們依靠 GPT 的內部結構(及其「歸納偏差」)來適當地執行泛化。

大小比較:

  • GPT-2 有 50257 個 token 和 2048 個 token 的上下文長度。所以 `log2 (50,257) * 2048 = 每個狀態 31,984 位 = 3,998 kB。這足以實現量變。
  • GPT-3 的上下文長度為 4096,因此需要 8kB 的內存;大約相當于 Atari 800。
  • GPT-4 最多 32K 個 token,所以大約 64kB,即 Commodore64。
  • I/O 設備:一旦開始包含連接到外部世界的輸入設備,所有有限狀態機分析就會崩潰。在 GPT 領域,這將是任何一種外部工具的使用,例如必應搜索能夠運行檢索查詢以獲取外部信息并將其合并為輸入。

Andrej Karpathy 是 OpenAI 的創始成員和研究科學家。但在 OpenAI 成立一年多后,Karpathy 便接受了馬斯克的邀請,加入了特斯拉。在特斯拉工作的五年里,他一手促成了 Autopilot 的開發。這項技術對于特斯拉的完全自動駕駛系統 FSD 至關重要,也是馬斯克針對 Model S、Cybertruck 等車型的賣點之一。

今年 2 月,在 ChatGPT 火熱的背景下,Karpathy 回歸 OpenAI,立志構建現實世界的 JARVIS 系統。

圖片

最近一段時間,Karpathy 給大家貢獻了很多學習材料,包括詳解反向傳播的課程 、重寫的 minGPT 庫、從零開始構建 GPT 模型的完整教程等。

責任編輯:張燕妮 來源: 機器之心
相關推薦

2022-08-21 21:15:28

模型AI

2022-11-01 13:42:54

雷達智能

2024-04-09 12:23:27

C語言AI

2021-12-09 10:26:35

AI 數據人工智能

2023-01-16 14:33:31

GitHubAI

2024-07-09 09:36:17

2022-03-16 18:38:06

AI特斯拉神經網絡

2023-07-05 15:18:42

AI自動駕駛

2023-11-24 13:00:32

2024-01-29 13:56:55

AI數據

2025-04-09 03:00:00

簽字板代碼canvas

2023-02-27 09:29:05

GPT模型

2023-02-02 13:22:40

AICIFAR數據集

2025-01-13 02:00:00

模型訓練數據

2025-02-17 14:43:51

2021-04-14 14:41:39

AI 數據人工智能

2025-05-26 09:06:00

2024-01-29 07:05:00

自動駕駛技術

2025-04-29 16:12:28

AI模型訓練

2025-04-25 09:20:00

數據模型AI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新日韩欧美 | 亚洲成人精品在线观看 | 99在线精品视频 | 成人精品在线视频 | 免费在线观看毛片 | 欧美日韩中文国产一区发布 | 在线色网 | 久久精品99国产精品 | 国产精品免费一区二区三区四区 | 亚洲福利网 | 日本在线免费看最新的电影 | 在线免费观看a级片 | 99在线免费观看 | 日韩欧美视频 | 日韩av成人 | 色五月激情五月 | 国产探花在线精品一区二区 | 久久激情五月丁香伊人 | 一级欧美视频 | 欧美黄色录像 | 国产精品视频免费观看 | 欧美日韩国产一区二区三区 | 精品国产欧美一区二区 | 免费激情网站 | 日日干日日色 | 欧美日韩国产一区二区 | 国产高清一区二区三区 | 全免一级毛片 | 中文字幕亚洲视频 | 日韩久久久久久久久久久 | 在线午夜 | 日本不卡一区二区三区在线观看 | 国产一区二区av | 日韩欧美专区 | 亚洲精品国产综合区久久久久久久 | 日韩中文一区二区三区 | 午夜成人免费视频 | 色妹子综合网 | 久久av一区二区 | 免费在线一区二区三区 | 日韩中文在线观看 |