Skip to content
tinAI
Go back

microgpt: Hướng dẫn đơn giản

Bài gốc: microgpt

Tác giả: Unknown

Ngày đăng: Dịch ngày:

TL;DR

microgpt là một dự án nghệ thuật với mã nguồn Python đơn giản để huấn luyện và chạy mô hình GPT. Bài viết giải thích chi tiết các thành phần chính như dataset, tokenizer, autograd, và kiến trúc mô hình. Đây là cách tiếp cận tối giản để hiểu rõ cốt lõi của LLMs.

Giới thiệu về microgpt

microgpt là một dự án nghệ thuật của tôi, một tệp Python với 200 dòng mã không phụ thuộc thư viện bên ngoài để huấn luyện và chạy một GPT. Đây là sự kết hợp từ nhiều dự án trước đó như micrograd, makemore, nanogpt để đơn giản hóa GPT với chỉ những gì cốt yếu.

Hình ảnh mô tả mã nguồn:

Image 1

Nơi tìm thấy mã nguồn

Hướng dẫn chi tiết

Dataset

Mã chuẩn bị dữ liệu

if not os.path.exists('input.txt'):
    import urllib.request
    names_url = 'https://raw.githubusercontent.com/karpathy/makemore/refs/heads/master/names.txt'
    urllib.request.urlretrieve(names_url, 'input.txt')
docs = [l.strip() for l in open('input.txt').read().strip().split('\n') if l.strip()] # list[str] of documents
random.shuffle(docs)
print(f"num docs: {len(docs)}")

Ví dụ dữ liệu

Dữ liệu bao gồm 32,000 tên:

emma
olivia
ava
isabella
sophia
...

Tokenizer

Chuyển đổi ký tự thành số:

# Tokenizer
uchars = sorted(set(''.join(docs)))
BOS = len(uchars)
vocab_size = len(uchars) + 1
print(f"vocab size: {vocab_size}")

Autograd

Lớp Value thực hiện hàm tính đạo hàm ngược:

class Value:
    __slots__ = ('data', 'grad', '_children', '_local_grads')

    def __init__(self, data, children=(), local_grads=()):
        self.data = data
        self.grad = 0
        self._children = children
        self._local_grads = local_grads

    def __add__(self, other):
        ...

    def __mul__(self, other):
        ...

    def __pow__(self, other): return Value(self.data**other, (self,), (other * self.data**(other-1),))
    ...

    def backward(self):
        ...

Parameters

Khởi tạo tham số mô hình:

n_embd = 16
n_head = 4
n_layer = 1
block_size = 16
head_dim = n_embd // n_head
... # Khởi tạo các tham số khác

Architecture

Kiến trúc mô hình GPT đơn giản:

def gpt(token_id, pos_id, keys, values):
    tok_emb = state_dict['wte'][token_id] 
    pos_emb = state_dict['wpe'][pos_id] 
    ...
    return logits

Training loop

Vòng lặp huấn luyện mô hình:

# Initialization
learning_rate, beta1, beta2, eps_adam = 0.01, 0.85, 0.99, 1e-8
m = [0.0] * len(params) ...

# Training
for step in range(num_steps):
    ...
print(f"step {step+1:4d} / {num_steps:4d} | loss {loss.data:.4f}")

Inference

Mã tạo tên mới sau khi huấn luyện:

temperature = 0.5
for sample_idx in range(20):
    ...
    print(f"sample {sample_idx+1:2d}: {''.join(sample)}")

Thực thi

Chạy mã với Python không cần cài đặt thêm:

python train.py

Bạn sẽ thấy loss giảm từ 3.3 xuống còn khoảng 2.37.

Tiến triển

Tiến trình phát triển mã:

FileNội dung
train0.pyBảng đếm bigram
train1.pyMLP + đạo hàm thủ công
train2.pyAutograd với lớp Value
train3.pyEmbedding vị trí và attention đơn giản
train4.pyAttention đa đầu
train5.pyTối ưu hóa với Adam

Xem chi tiết tại: build_microgpt.py

Những điểm nâng cao

microgpt giữ lại cốt lõi của GPT nhưng thiếu nhiều yếu tố thực tiễn cần thiết cho sản phẩm.

FAQ

Mô hình có thực sự “hiểu” không? Không có gì huyền bí, mô hình chỉ là hàm toán học dự đoán token tiếp theo.

Tại sao nó hoạt động? Thông qua hàng ngàn bước, các tham số tự điều chỉnh theo các quy tắc thống kê.

Hiểu microgpt giúp bạn nắm được thuật toán cốt lõi của các mô hình dạng GPT lớn.


Read Original (EN) Quay lại Newsletter