English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

khách
1 / ?
trở lại bài học

Chú Ý Cộng MLP, Lặp Lại

Cấu trúc Pre-Norm Khối Transformer


Hai Tiểu Tầng

Một khối transformer chứa chính xác hai tiểu tầng, mỗi tiểu tầng hoạt động trên một chuỗi token có hình dạng [batch, seq_len, d_model]:


1. Tầng con multi-head attention. Các token nhìn vào nhau. Hoạt động 68 đã đề cập chi tiết về điều này. Hình dạng đầu ra khớp với hình dạng đầu vào.

2. Tầng con Feed-forward MLP. Mỗi token biến đổi độc lập qua một perceptron hai tầng. Không có luồng thông tin chéo giữa các token. Hình dạng đầu ra khớp với hình dạng đầu vào.


Cả hai tầng con đều giữ nguyên hình dạng [batch, seq_len, d_model]. Việc giữ nguyên đó cho phép các block xếp chồng: đầu ra của tầng N cung cấp đầu vào cho tầng N+1 mà không cần thay đổi hình dạng phức tạp.


Mỗi Tầng Con Đóng Góp Gì

Attention di chuyển thông tin qua các vị trí: một token ở vị trí 17 có thể lấy thông tin từ vị trí 1 đến 16. MLP biến đổi thông tin trong mỗi vị trí: biểu diễn của một token được định hình lại qua các hàm phi tuyến học được, nhưng không bao giờ thấy các token lân cận.


Việc xếp chồng các khối xen kẽ hai hoạt động này. Attention của Lớp 1 trộn lẫn các vị trí. MLP của Lớp 1 định hình lại theo từng vị trí. Attention của Lớp 2 trộn lẫn lần nữa, giờ đây trên các biểu diễn đã được định hình lại. Sự xen kẽ này tăng cường sức mạnh biểu đạt theo độ sâu.


Ngăn xếp của ANDREA


Biến thển_layern_headd_modelmlp_dim
ANDREA-12M6123841536
ANDREA-120M12127683072
ANDREA-480M162415366144

Chú ý mlp_dim = 4 × d_model trong toàn bộ họ. Tỷ lệ này được giữ nguyên trong hầu hết các transformer hiện đại. Phần 3 sẽ giải thích lý do tại sao.

Đặt Tên Cho Các Sublayer

Một khối transformer chứa hai sublayer. Nêu tên chúng theo thứ tự, & đối với mỗi sublayer hãy nêu liệu nó di chuyển thông tin giữa các vị trí (token-to-token) hay biến đổi thông tin trong một vị trí duy nhất (độc lập cho mỗi token). Một câu cho mỗi sublayer.

Tại sao Skip Connections Quan trọng

Mô hình Residual

Mỗi sublayer bọc phép tính của nó trong một kết nối residual. Đầu ra cộng thêm đầu vào:


x = x + Attention(LayerNorm(x))     # attention sublayer
x = x + MLP(LayerNorm(x))           # Tầng con MLP

Bên trong mỗi tầng con, hàm Attention(...) hoặc MLP(...) tạo ra một delta. Khối không thay thế đầu vào; nó thêm một sửa chữa đã học.


Tại Sao Điều Này Quan Trọng

Ba lý do kết nối dư thống trị các kiến trúc sâu:


1. Luồng gradient. Trong quá trình lan truyền ngược, phép cộng cung cấp cho gradient một đường dẫn trực tiếp từ đầu ra trở về đầu vào, bỏ qua lớp con. Một ngăn xếp 12 lớp mà không có residual sẽ mất tín hiệu gradient lâu trước khi đến được embeddings; với residual, độ lớn gradient vẫn sử dụng được qua hàng trăm lớp.


2. Khởi tạo identity. Tại thời điểm khởi tạo, trọng số lớp con tạo ra đầu ra nhỏ. Kết nối residual có nghĩa là lớp N ban đầu truyền qua gần như không thay đổi. Huấn luyện học các delta một cách dần dần từ một điểm khởi đầu hoạt động tốt.


3. Học composition. Mỗi khối học một sự tinh chỉnh, không phải thay thế. Lớp 1 có thể thêm thông tin vị trí. Lớp 2 có thể thêm cấu trúc cú pháp. Lớp 7 có thể thêm mối quan hệ ngữ nghĩa. Luồng residual tích lũy.


Chuẩn hóa Lớp

Trước mỗi lớp con, LayerNorm chuẩn hóa lại biểu diễn của mỗi token về trung bình bằng 0 & phương sai đơn vị, sau đó áp dụng gain & bias theo từng đặc trưng đã học:


y = gamma * (x - mean(x)) / sqrt(var(x) + epsilon) + beta

Trung bình & phương sai được tính toán trên chiều d_model, riêng biệt cho mỗi token. Hai vector học được (gamma, beta, mỗi cái có hình dạng [d_model]) khôi phục thang đo biểu cảm. Chuẩn hóa giữ các kích hoạt trong phạm vi ổn định về số học; nếu không có nó, các bất ổn nhỏ trong huấn luyện sẽ tích tụ thành gradient NaN.

Pre-Norm vs Post-Norm

Một Lựa Chọn Tinh Tế Nhưng Quan Trọng

Hai cách để tích hợp layer norm vào một residual sublayer:


Post-norm (bài báo gốc năm 2017):

x = LayerNorm(x + Attention(x))

Layer norm nằm sau phép cộng residual. Luồng residual chính được chuẩn hóa ở mọi layer.


Pre-norm (tiêu chuẩn hiện đại, được sử dụng trong ANDREA):

x = x + Attention(LayerNorm(x))

Layer norm nằm trước sublayer, bên trong nhánh residual. Dòng residual vẫn không được chuẩn hóa; chỉ input vào sublayer mới được rescale.


Tại sao Pre-Norm Thắng

Post-norm huấn luyện kém nếu không có LR warmup & tinh chỉnh siêu tham số cẩn thận. Gradient bùng nổ ở các layer đầu vì mỗi layer norm làm rối trạng thái tích lũy của dòng residual. Bài báo gốc 2017 dùng post-norm với tinh chỉnh rộng rãi; các công trình sau (GPT-2, LLaMA, ANDREA) chuẩn hóa pre-norm.


Huấn luyện pre-norm ổn định. Dòng residual tích lũy sạch qua tất cả các lớp; chỉ đầu vào của các sublayers được chuẩn hóa để đảm bảo ổn định số học. Các transformer hiện đại mặc định sử dụng pre-norm, & ANDREA kế thừa lựa chọn đó.


Phương trình Khối Cuối Cùng

Kết hợp residuals, layer norm ở vị trí pre-norm, & cả hai sublayers cho khối đầy đủ của ANDREA:


def block_forward(x):
x = x + Attention(LayerNorm(x))   # lớp con attention
x = x + MLP(LayerNorm(x))         # lớp con MLP
return x

Hai lớp con, hai phép cộng dư, hai layer norm (lưu ý: mỗi lớp con có layer norm riêng của nó; ANDREA-120M có 24 layer norm trải qua 12 khối cộng với một cái cuối cùng ở đầu ra, tổng cộng 25). Lặp lại 12 lần. Đó là thân chính của ANDREA-120M.

Tại sao Pre-Norm Ổn định Huấn luyện

ANDREA sử dụng pre-norm: `x = x + Attention(LayerNorm(x))`. So sánh với post-norm: `x = LayerNorm(x + Attention(x))`. Đưa ra một lý do từ góc độ dòng gradient tại sao pre-norm huấn luyện ổn định hơn post-norm trong các ngăn xếp sâu. Tham chiếu đến residual stream trong câu trả lời của bạn.

Hai Tầng Linear, Một Hàm Kích Hoạt

Ba Thao Tác

Tầng con MLP là một perceptron hai tầng với hàm kích hoạt phi tuyến giữa các tầng:


def mlp_forward(x):
h = x · W_1 + b_1        # mở rộng: d_model → mlp_dim
h = GELU(h)              # kích hoạt phi tuyến tính
y = h · W_2 + b_2        # thu hẹp: mlp_dim → d_model
return y

Ba phép toán. Hai phép tuyến tính, một phép phi tuyến tính. Phép tuyến tính đầu tiên mở rộng chiều rộng; phép thứ hai co lại.


Tỷ lệ mở rộng 4×

Các transformer hiện đại đặt mlp_dim = 4 × d_model. ANDREA-120M:


d_model = 768
mlp_dim = 4 × 768 = 3072
Hình dạng W_1 = [768, 3072]      # ~2.36M tham số
Hình dạng W_2 = [3072, 768]      # ~2.36M tham số
Tham số MLP mỗi block = 4.72M (bỏ qua biases)

Hai MLP nằm giữa mỗi cặp sublayers attention (một mỗi block). Mười hai block × 4.72M ≈ 56.6M tham số MLP tổng cộng trong ANDREA-120M, khoảng một nửa tổng số tham số.


Tại sao lại là 4×

Tỷ lệ 4× xuất hiện một cách thực nghiệm. Tỷ lệ nhỏ hơn làm giảm dung lượng mô hình. Tỷ lệ lớn hơn mang lại lợi nhuận giảm dần cho mỗi tham số chi tiêu. Qua hàng thập kỷ tìm kiếm kiến trúc, 4× vẫn giữ vững; nó xuất hiện trong GPT, BERT, T5, LLaMA, & ANDREA.


Các nghiên cứu gần đây (PaLM, Chinchilla) phát hiện rằng các cơ chế cổng (SwiGLU) có thể sử dụng mở rộng 8/3× với dung lượng tương đương ở chi phí thấp hơn; ANDREA giữ nguyên GELU cổ điển + 4× để đơn giản.

GELU: Hàm Kích Hoạt Mượt Mà

GELU Tính Toán Gì

GELU (Gaussian Error Linear Unit) là hàm kích hoạt tiêu chuẩn giữa các lớp MLP trong các transformer hiện đại. Công thức của nó:


GELU(x) = x · Φ(x)

Φ(x) là hàm phân phối tích lũy của phân phối chuẩn chuẩn: xác suất mà một biến ngẫu nhiên Gaussian chuẩn nằm tại hoặc dưới x. Được tính toán số học:


Φ(x) ≈ 0.5 × (1 + tanh(sqrt(2/π) × (x + 0.044715 × x³)))

Hành vi Theo Vùng

- Với x dương lớn: Φ(x) ≈ 1, nên GELU(x) ≈ x. Giống ReLU.

- Với x âm lớn: Φ(x) ≈ 0, nên GELU(x) ≈ 0. Giống ReLU.

- Gần x = 0: Φ(x) ≈ 0.5, nên GELU(0) = 0 chính xác. Chuyển tiếp mượt mà qua gốc tọa độ.


Không giống ReLU, GELU cho phép một số đầu vào âm đi qua, được trọng số bởi Φ(x). Một đầu vào âm nhỏ vẫn đóng góp một đầu ra âm nhỏ, chỉ ít hơn so với đầu vào đầy đủ.


Tại sao GELU Vượt trội hơn ReLU

Về mặt thực nghiệm, các transformer được huấn luyện với GELU đạt được loss thấp hơn so với các transformer được huấn luyện với ReLU ở cùng số lượng tham số. Độ mịn quanh số không rất quan trọng: điểm cắt cứng của ReLU tại số không tạo ra sự không liên tục trong gradient; đường cong mịn của GELU cung cấp gradient sạch hơn cho backpropagation.


Công cụ huấn luyện của ANDREA microgpt_cuda.cu đi kèm với một GELU CUDA kernel được viết tay. Kernel sử dụng xấp xỉ tanh ở trên; các GPU hiện đại bao gồm tanh như một phép toán single-instruction.

Tính toán Tham số MLP

ANDREA-120M có `d_model=768`, `mlp_dim=3072`, & `n_layer=12`. Tính tổng số tham số trong các ma trận trọng số MLP (`W_1` & `W_2`) trên tất cả 12 khối. Bỏ qua biases. Hiển thị phép tính của bạn. Sau đó nêu tỷ lệ phần trăm mà điều này chiếm trong tổng ~120M tham số của ANDREA-120M (làm tròn đến một chữ số thập phân).

Mười Hai Khối Ghép Thành ANDREA-120M

Từ Khối Đến Mô Hình

Quá trình forward pass đầy đủ của ANDREA-120M:


def model_forward(token_ids):
x = token_embed(token_ids) + position_embed(positions)
for block_idx in range(n_layer):       # 12 blocks
x = block_forward(x)               # attention + MLP w/ residuals
x = LayerNorm(x)                       # final norm
logits = x · token_embed.T             # tied weights for output projection
return logits

Sáu dòng. Phần lớn nằm trong block_forward, được gọi mười hai lần. Embeddings bắt đầu pipeline; tied unembedding (ma trận giống nhau dùng cho input lookup, được transpose cho output projection) kết thúc nó.


Độ Sâu Như Sự Tổng Hợp

Mỗi block đọc residual stream, tính toán một delta, & cộng nó trở lại. Sau mười hai lần lặp, stream chứa các đóng góp tích lũy từ mọi block. Bên trong, các layers có xu hướng chuyên biệt hóa:


- Các layers đầu (1-3): mẫu cú pháp, cấu trúc vị trí

- Các layers giữa (4-8): mối quan hệ từ, ranh giới cụm từ

- Các layers cuối (9-12): nội dung ngữ nghĩa, nhớ lại sự kiện


Chuyên môn hóa này xuất hiện từ áp lực huấn luyện, không phải từ các lựa chọn kiến trúc. Thiết kế khối đồng nhất giống nhau sẽ tạo ra các lớp chuyên biệt khi được huấn luyện trên ngôn ngữ.


Tổng Số Tham Số Khối


Thành phầnMỗi khốiTrên 12 khối
Attention projections (4×W)2.36M28.3M
Trọng số MLP (W_1 + W_2)4.72M56.6M
Layer norms (gamma, beta)~3K (không đáng kể)~37K
Tổng cộng mỗi block~7.1M~85M

85M tham số trong thân chính. Thêm ~13M trong token embeddings (8449 vocab × 768 d_model × 2 cho tied input/output) cộng với một layer norm cuối cùng, & tổng số tham số của ANDREA-120M đạt khoảng 120M. Thiết kế block chiếm hai phần ba; embeddings chiếm phần còn lại.

Theo dõi Một Token Qua Một Block

Một vector token 768 chiều đi vào block 7 của ANDREA-120M. Mô tả những gì xảy ra với nó bên trong block (trong cấu trúc pre-norm). Đề cập: cả hai layer norms, cả hai sublayers, cả hai phép cộng residual, & hình dạng cuối cùng. Nêu ít nhất một nơi mà residual stream không bị thay đổi & một nơi mà nó bị sửa đổi.