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

Gradient Spikes Đến Từ Đâu

Một Mini-Batch Bình Tĩnh & Một Mini-Batch Sốc

Hầu hết các mini-batch tạo ra gradient với độ lớn hợp lý. Hàm mất mát cross-entropy cho một mô hình đã khớp sơ bộ với dữ liệu nằm trong một dải hẹp; lan truyền ngược mang tín hiệu đó trở lại dưới dạng gradient có kích thước tương tự.


Một số mini-batch thì không. Ba nguồn gây ra gradient spikes:


1. Ví dụ ngoại lai. Một chuỗi duy nhất với sự kết hợp token cực kỳ hiếm tạo ra loss xa trung bình & gradient xa trung bình.

2. Các trường hợp biên số học. Mẫu số softmax gần bằng không, layernorm tạo ra NaN, tràn số FP16. Mỗi trường hợp có thể tạo ra gradient lớn hơn hàng bậc so với bình thường.

3. Sự thay đổi phân phối. Chuyển nguồn dữ liệu trong một lần huấn luyện duy nhất làm sốc mô hình với phân phối mới. ANDREA's bandit reshuffles source weights every 7 to 42 steps. Each switch is a small distribution shift.


ANDREA-120M v1: Spike Cascade

v1 had no gradient clipping. Source transitions every 7 to 42 steps from the bandit fed the model brief bursts of repo-docs (list-structured), then gutenberg (long prose), then hermes3-general (Q&A). Each transition produced gradient spikes: each spike pushed weights into degenerate attractors at 120M scale.


Sự kiện thực nghiệm chính. ANDREA-12M đã sống sót qua cùng một bandit mà không cần clipping. Các ma trận trọng số nhỏ hơn vẫn bền vững với các cú sốc gradient; một batch xấu đơn lẻ không thể đẩy 12M tham số vào một attractor chạy trốn như cách nó có thể đẩy 120M. Clipping quan trọng hơn khi mô hình mở rộng quy mô.

Global L2 Norm Clipping

Hai Lựa Chọn: Per-Tensor hoặc Global

Hai cách để giới hạn độ lớn gradient:


Per-tensor clipping. Clip từng tensor gradient độc lập. Gradient embedding được clip theo norm của chính nó; gradient attention được clip theo norm của chính nó. Đơn giản, nhưng làm méo mó tỷ lệ tương đối: một spike nhỏ ở một tensor (bây giờ gradient bằng không) kết hợp với gradient khổng lồ ở tensor khác (không bị ảnh hưởng).


Global L2 norm clipping. Xem tất cả gradient như một vector lớn. Tính tổng L2 norm trên mọi tham số. Nếu norm vượt quá max_norm, scale mọi gradient bằng cùng một hệ số. Giữ nguyên độ lớn tương đối giữa các tensor.


ANDREA sử dụng global. Pascanu et al. (2013) đã chứng minh thực nghiệm rằng global clipping vượt trội hơn per-tensor cho việc huấn luyện transformer.


Toán học

Tính global L2 norm:


norm = sqrt(sum over all params of g_i^2)


Nếu norm <= max_norm, gradient sẽ được giữ nguyên không thay đổi. Nếu norm > max_norm, nhân mỗi gradient với max_norm / norm:


g_i_clipped = g_i * (max_norm / norm)


Sau khi nhân tỷ lệ, norm mới sẽ bằng đúng max_norm. ANDREA sử dụng max_norm = 1.0.

Tính toán Hệ số Nhân

Giả sử trong một bước huấn luyện, norm L2 toàn cục của tất cả các gradient được tính là `3.5`. `max_norm` của ANDREA là `1.0`. Tính (a) hệ số nhân được áp dụng, (b) norm L2 toàn cục mới bằng bao nhiêu sau khi nhân tỷ lệ, & (c) điều gì sẽ xảy ra nếu norm chưa cắt là `0.4` thay vì `3.5`. Hãy chỉ ra phép tính của bạn.

Tại sao Việc Tính Gradient Norm Cần Ba Kernels

Thuật Toán Ngây Thơ Không Thể Chạy Trên GPU

Pseudocode cho việc tính global L2 norm:


total = 0
với mỗi tham số p:
với mỗi phần tử g trong p.grad:
total += g * g
norm = sqrt(total)

Trên GPU, vòng lặp ngây thơ này thất bại vì hai lý do:


1. Tích lũy tuần tự. Một bộ tích lũy total duy nhất buộc mọi thread phải chờ đợi mọi thread khác, làm mất hiệu quả tính song song của GPU.

2. Các tensor không đồng nhất. ANDREA-120M có các tensor với hình dạng rất khác nhau: embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). Một kernel không thể lặp qua tất cả các hình dạng một cách hiệu quả.


Đường ống Ba Kernel của ANDREA

Chia công việc thành ba CUDA kernel trong microgpt_cuda.cu:


Kernel 1: k_grad_norm_partial. Đối với mỗi tensor tham số, tính tổng bình phương từng phần. Mỗi thread block giảm một phần của tensor; kết quả ghi vào bộ đệm tạm nhỏ. Tính song song: một block cho mỗi phần, hàng trăm block trên tất cả các tensor.


Kernel 2: k_grad_norm_final. Giảm bộ đệm scratch xuống còn một số vô hướng duy nhất. Lấy căn bậc hai của nó. Một kernel nhỏ, chạy trong vài micro giây.


Kernel 3: k_grad_scale. Nếu norm > max_norm, tính scale = max_norm / norm & nhân mọi phần tử gradient với scale. Một lượt quét qua mọi tensor gradient, song song hoàn toàn.


Thứ tự rất quan trọng: Pre-Adam

Quy trình cắt chạy TRƯỚC khi AdamW cập nhật m, v, hoặc bất kỳ tham số nào. Tại sao?


Gradient bị cắt ảnh hưởng đến trung bình di động hàm mũ của AdamW. Nếu một spike được phép chảy vào m & v, nó sẽ làm hỏng các trung bình đang chạy đó & làm chậm quá trình phục hồi trong nhiều bước sau spike. Cắt trước Adam giữ hiệu ứng của spike bị giới hạn trong bước xấu duy nhất.


Gradient Clipping with 3 CUDA Kernels

Tại sao Ba Kernel, Không Phải Một?

Giả sử ai đó đề xuất hợp nhất `k_grad_norm_partial` & `k_grad_norm_final` thành một kernel duy nhất tính toàn bộ global norm trong một lần pass. Đưa ra một lý do cụ thể tại sao sự hợp nhất này sẽ thất bại hoặc hoạt động kém hơn trên GPU. Tham chiếu cách các thread block của GPU chia sẻ bộ nhớ & đồng bộ hóa.

Cách No-Clipping Đã Giết v1

Chuyển đổi Nguồn Bandit Mỗi 7 đến 42 Bước

Bandit của ANDREA hoạt động theo các giai đoạn. Mỗi giai đoạn kéo dài 7, 14, 21, 28 hoặc 42 bước (được chọn ngẫu nhiên). Tại mỗi ranh giới giai đoạn, trọng số nguồn thay đổi: có thể repo-docs nhảy từ 0.1 lên 0.6, gutenberg giảm từ 0.4 xuống 0.1, hermes3-general tăng từ 0.5 lên 0.7.


Mỗi chuyển đổi là một cú sốc phân phối đối với mô hình. Loss tăng vọt ngắn gọn. Gradient cũng tăng vọt theo: một mô hình đang giảm thiểu loss đối với văn xuôi kiểu gutenberg giờ thấy cấu trúc danh sách kiểu repo-docs, & gradient mang tín hiệu sửa chữa có thể lớn gấp 10x hoặc 100x so với mức điển hình.


Chế độ Thất bại của v1

Không có clipping, những spike gradient 10-100x đó chảy vào trung bình m & v của AdamW. Việc làm mịn của AdamW khiến hiệu ứng spike kéo dài qua nhiều bước sau batch xấu thực sự. Kết hợp với không có weight decay (Adam thuần túy trong v1), các cập nhật weight do spike gây ra tích lũy qua các giai đoạn cho đến khi weight trôi vào một attractor thoái hóa: logit của một token thống trị softmax, output được sample là token đó, context huấn luyện chứa token đó, gradient củng cố token đó. Khóa lặp lại.


Ổn định v2

v2 thêm clipping với max_norm = 1.0, cùng với AdamW & LR warmup. Hiệu ứng spike trên m & v bị giới hạn; weight không thể trôi nhanh hơn lr max_norm = 0.0003 1.0 = 0.0003 mỗi tham số mỗi bước ở đỉnh. Các chuyển pha vẫn tạo spike, nhưng những spike đó bị giới hạn trước khi đến optimizer.


Kết quả: v2 (sau data filter v2.5 & v3 polish) đạt factual recall, tính mạch lạc đa đoạn, & 9.5/10 điểm đánh giá bên ngoài trên các mẫu biology & signal-processing.


Sự Kết nối Giữa Dung lượng - Dễ vỡ

Cùng một bandit. Cùng dữ liệu. Cùng siêu tham số ngoại trừ clipping. Tại sao 12M sống sót mà không cần clipping trong khi 120M sụp đổ?


Hai yếu tố tích lũy:


1. Ma trận trọng số lớn hơn lưu trữ nhiều attractor hơn. Một projection attention 768x768 có 590K tham số; ngay cả sự trôi nhỏ theo từng tham số cũng tạo ra những thay đổi có ý nghĩa trong hành vi attention. Một projection attention 384x384 có 147K tham số & ở trong một không gian bị ràng buộc hơn.

2. Nhiều layer hơn nghĩa là nhiều tương tác nhân lên hơn. v3 có 12 transformer layer (so với 6 cho 12M). Các spike lan truyền qua 12 layer của các phi tuyến tính tích lũy; mỗi layer có thể khuếch đại sự trôi của layer trước.


Sự mong manh tích lũy cùng với dung lượng. Clipping trở nên bắt buộc trên một ngưỡng quy mô nào đó; ANDREA đặt ngưỡng đó ở đâu đó giữa 12M & 120M tham số.

Chẩn đoán Cascade v1

Giả sử ở bước 50.000 của quá trình huấn luyện v1, một mini-batch duy nhất tạo ra gradient với chuẩn L2 toàn cục là 50.0 (các batch điển hình tạo ra ~0.5). Theo dõi điều gì xảy ra với **first moment** `m` của AdamW trong 10 bước tiếp theo nếu các batch sau đó trở lại độ lớn gradient điển hình. Xem xét cách `m = beta1 * m + (1 - beta1) * g` với beta1=0.9 lan truyền spike.

Clipping Áp dụng ở Đâu Nữa?

Ngoài chương trình học bandit-driven của ANDREA, nêu tên MỘT kịch bản huấn luyện KHÁC nơi **global L2 gradient clipping** sẽ quan trọng tương tự, & đưa ra một cơ chế làm cho nó như vậy.

Các Hoạt Động Liên Quan

Ba anh em liên kết với clipping:


- Hoạt động 10: AdamW. Clipping bảo vệ m & v của AdamW khỏi ô nhiễm spike. Không có clipping, một batch xấu sẽ làm hỏng trạng thái optimizer trong 50+ bước.

- Hoạt động 11: LR warmup. Warmup làm giảm lr; clipping làm giảm g. Cùng nhau: ở bước 1, cập nhật tham số tệ nhất là lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, so với 0.0003 * 50 = 0.015 nếu không có guard nào. Giảm 100.000 lần độ lớn cập nhật sớm tệ nhất.

- Hoạt động 14: Multi-armed bandits. Độ dài giai đoạn bandit (7 đến 42 bước) được thiết kế ngắn cụ thể để ngăn chặn bất kỳ nguồn nào thống trị; clipping là yếu tố làm cho những chuyển tiếp thường xuyên đó an toàn.


Clipping là chiến thắng ổn định rẻ nhất trong huấn luyện transformer: 3 kernel CUDA nhỏ, vài micro giây mỗi bước, tác động quyết định đến việc các mô hình 120M+ hội tụ hay sụp đổ.