Build a minimal GPT implementation from scratch in Rust.
tensor.masked_fill(mask, value) -> TensorEmbedding::new(vocab_size, embed_dim)
Embedding::forward(tokens)Maps token ids → vectors.
Linear::new(in_dim, out_dim)
Linear::forward(x)Computes:
y = xW + b
Attention::new(d_model)
Attention::forward(x)Computes:
Q = XWq
K = XWk
V = XWv
scores = QKᵀ / sqrt(d)
weights = softmax(scores)
output = weightsV
Prevent tokens from attending to future tokens.
MultiHeadAttention::new(
d_model,
num_heads
)Split → attend → concat.
LayerNorm::new(dim)
LayerNorm::forward(x)Computes:
(x - mean) / sqrt(var + eps)
MLP::new(
d_model,
hidden_dim
)Computes:
Linear
↓
GELU
↓
Linear
TransformerBlock::new(...)
TransformerBlock::forward(x)Architecture:
LayerNorm
↓
Attention
↓
Residual
LayerNorm
↓
MLP
↓
Residual
GPT::new(...)
GPT::forward(tokens)Components:
Token Embedding
↓
Positional Embedding
↓
N Transformer Blocks
↓
Output Projection
GPT::generate(prompt)Loop:
forward
↓
next token
↓
append
↓
repeat
Sampling strategies:
argmax()
temperature()
top_k()cross_entropy(logits, targets)loss.backward()AdamWTraining loop:
for batch in dataset {
let logits = model.forward(&x);
let loss = cross_entropy(
&logits,
&targets,
);
loss.backward();
optimizer.step();
optimizer.zero_grad();
}Run tests
cargo test