>기술 주변기기 >일체 포함 >코드를 작성할 필요가 없으며 가장 간단한 BabyGPT 모델을 손으로 만들 수 있습니다: 전 Tesla AI 디렉터의 신작

코드를 작성할 필요가 없으며 가장 간단한 BabyGPT 모델을 손으로 만들 수 있습니다: 전 Tesla AI 디렉터의 신작

王林
王林앞으로
2023-04-27 20:25:05940검색

우리는 OpenAI의 GPT 시리즈가 대규모 및 사전 훈련 방법을 통해 인공 지능의 새로운 시대를 열었다는 것을 알고 있습니다. 그러나 대부분의 연구자에게 언어 대형 모델(LLM)은 용량 및 컴퓨팅 성능 요구 사항으로 인해 너무 비쌉니다. 얻기 어려운. 기술이 발전하는 동안 사람들은 '가장 단순한' GPT 모델도 탐색해 왔습니다.

최근 Tesla의 전 AI 디렉터이자 OpenAI로 돌아온 Andrej Karpathy는 GPT를 플레이하는 가장 간단한 방법을 소개했습니다. 이는 더 많은 사람들이 이 인기 있는 AI 모델의 이면에 있는 기술을 이해하는 데 도움이 될 수 있습니다.

코드를 작성할 필요가 없으며 가장 간단한 BabyGPT 모델을 손으로 만들 수 있습니다: 전 Tesla AI 디렉터의 신작

예, 이것은 두 개의 토큰 0/1과 컨텍스트 길이 3을 가진 미니멀리스트 GPT입니다. 유한 상태 마르코프 체인이라고 생각하세요. 50회 반복 동안 "111101111011110" 시퀀스에 대해 학습되었으며 Transformer의 매개변수 및 아키텍처는 화살표의 확률을 수정합니다.

예를 들어 다음을 볼 수 있습니다.

  • 훈련 데이터에서 상태 101이 결정론적으로 011로 전환되므로 이 전환 확률이 더 높아집니다(79%). 하지만 여기서는 50단계의 최적화만 수행되었기 때문에 100%에 가깝지는 않습니다.
  • 상태 111은 50% 확률로 각각 111과 110으로 진행되는데, 이는 모델이 거의 학습한 것입니다(45%, 55%).
  • 훈련 중에 000과 같은 상태를 만난 적이 없지만 73%가 001로 가는 등 비교적 날카로운 전환 확률이 있습니다. 이는 Transformer의 유도성 바이어스의 결과입니다. 실제 배포에서 거의 모든 입력 시퀀스가 ​​고유하고 훈련 데이터에 문자 그대로 나타나지 않는다는 점을 제외하면 이것이 50%라고 생각할 수 있습니다.

Karpathy는 단순화를 통해 GPT 모델을 쉽게 시각화하여 전체 시스템을 직관적으로 이해할 수 있도록 했습니다.

여기에서 시도해 볼 수 있습니다: https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing

사실 GPT 초기 버전에서도 모델의 볼륨이 매우 인상적입니다. OpenAI는 2018년에 1세대 GPT 모델을 출시했습니다. "생성 사전 훈련을 통한 언어 이해 개선" 논문에서 이 모델이 12계층 Transformer Decoder 구조를 사용하고 약 5GB의 비지도 텍스트 데이터를 사용한다는 것을 알 수 있습니다. .교육을 실시합니다.

하지만 개념을 단순화하면 GPT는 개별 토큰 시퀀스를 취하고 시퀀스에서 다음 토큰의 확률을 예측하는 신경망입니다. 예를 들어, 0과 1이라는 두 개의 마커만 있는 경우 작은 바이너리 GPT는 다음과 같이 말할 수 있습니다.

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

여기에서 GPT는 비트 시퀀스 [0,1,0]을 사용하고 현재 매개변수를 기반으로 합니다. 설정하면 다음 항목이 1이 될 것으로 예측할 확률은 80%입니다. 중요한 것은 GPT의 컨텍스트 길이가 기본적으로 제한되어 있다는 것입니다. 컨텍스트 길이가 3이면 입력 시 최대 3개의 토큰만 사용할 수 있습니다. 위의 예에서 편향된 동전과 실제로 다음에 있어야 할 샘플 1을 뒤집으면 원래 상태 [0,1,0]에서 새 상태 [1,0,1]로 전환됩니다. 오른쪽에 새 비트(1)를 추가하고 가장 왼쪽 비트(0)를 버려 시퀀스를 컨텍스트 길이 3으로 잘라냈습니다. 그런 다음 이 프로세스를 반복해서 반복하여 상태 간 전환을 수행할 수 있습니다.

분명히 GPT는 유한 상태 마르코프 체인입니다. 유한 상태 세트와 그 사이에 확률적 전환 화살표가 있습니다. 각 상태는 GPT 입력의 특정 토큰 설정(예: [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 길이의 토큰 시퀀스입니다. 이러한 토큰은 개별적이므로 상태 공간은 간단합니다.

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

세부정보: 정확하게 말하면 GPT는 1에서 context_length까지 원하는 수의 토큰을 사용할 수 있습니다. 따라서 컨텍스트 길이가 3이면 원칙적으로 다음 토큰을 예측하는 동안 1, 2 또는 3개의 토큰을 입력할 수 있습니다. 여기서는 이를 무시하고 아래 코드 중 일부를 단순화하기 위해 컨텍스트 길이가 "최대화"되었다고 가정하지만 명심할 가치가 있습니다.

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 系统。

코드를 작성할 필요가 없으며 가장 간단한 BabyGPT 모델을 손으로 만들 수 있습니다: 전 Tesla AI 디렉터의 신작

最近一段时间,Karpathy 给大家贡献了很多学习材料,包括详解反向传播的课程 、重写的 minGPT 库、从零开始构建 GPT 模型的完整教程等。

위 내용은 코드를 작성할 필요가 없으며 가장 간단한 BabyGPT 모델을 손으로 만들 수 있습니다: 전 Tesla AI 디렉터의 신작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제