Cosine LR với Linear Warmup
Type: Build
Languages: Python
Prerequisites: Phase 19 lessons 30-37
Time: ~90 minutes
Mục tiêu học tập
- Thực hiện một máy tối ưu hóa AdamW được cáp vào một lịch trình tốc độ học tập cosine với nhiệt tuyến tính.
- Xét giá trị chính xác của lịch trình ở bất kỳ bước nào mà không có điểm nổi trôi qua các đường chạy.
- Lập trình L2 chuẩn bên cạnh tốc độ học tập để sức khỏe tập thể hiện được.
- Đưa lịch trình cho một bản đồ văn bản mà mắt có thể đọc và một CSV bất kỳ công cụ nào có thể tiêu thụ.
Vấn đề
Hàng ngàn lần huấn luyện đầu tiên là tiếng ồn nhất. Các trọng lượng của mô hình vẫn gần như bắt đầu. Đánh giá thời gian thứ hai của người tối ưu hóa vẫn chưa ổn định. Tỷ lệ gradient là lớn và ồn ào. Nếu tốc độ học tập ở đỉnh cao trong những cập nhật này mô hình hoặc đi ngược thẳng hoặc định cư vào một cao nguyên mất mát nó không bao giờ thoát khỏi. Hai sự cố được biết đến là cắt gradient, là chủ đề của bài học giai đoạn 19 45, và một lịch trình tốc độ học tập bắt đầu nhỏ và tăng lên.
Chương trình cosine-with-warmup có ba khu vực.warmup_stepstốc độ học tập thay đổi theo đường thẳng từ 0 đến đỉnh được cấu hình lr_maxTừ bước điwarmup_stepsbước đitotal_stepstốc độ học tập theo nửa trên của đường cong cosine, suy giảm từ lr_maxđếnlr_minSau đótotal_stepstốc độ học tập được gắn vào lr_minVì vậy, một huấn luyện viên không đúng cách mà không thể rời khỏi lịch trình.
Vấn đề xây dựng là lịch trình dễ bị sai lầm một lần. Một lần đi lại chỉ xuất hiện trong sáu giờ trong một cuộc tập luyện như một tỷ lệ học tập quá cao hoặc quá thấp 1% vào thời điểm mô hình bắt đầu quá phù hợp, điều này là vô hình trừ khi lịch trình được kiểm tra đầy đủ ở ranh giới.
Khái niệm
flowchart TD
Step[Training step] --> Branch{step state}
Branch -- step <= warmup --> Linear[Linear ramp from 0 to lr_max]
Branch -- warmup < step <= total --> Cosine[Cosine decay from lr_max to lr_min]
Branch -- step > total --> Floor[Pin at lr_min]
Linear --> Apply[AdamW.step]
Cosine --> Apply
Floor --> Apply
Apply --> GradNorm[Compute gradient L2 norm]
GradNorm --> Log[Step log row]
Log --> Plot[Text plot + CSV]Công thức làm nóng
Vì steptrong [0, warmup_steps]với warmup_steps > 0, tỷ lệ học là lr_max * step / warmup_steps- Người bị mất tíchwarmup_steps = 0trường hợp được coi là "không ấm lên": lịch trình bắt đầu trực tiếp tại lr_maxở bước 0 và ngay lập tức xâm nhập vào sự phân hủy cosine.warmup_steps = 0để kiểm tra lịch trình vẫn tạo ra một đường cong có thể sử dụng.
Công thức cosine
Vì steptrong (warmup_steps, total_steps]tốc độ học là lr_min + 0.5 (lr_max - lr_min) (1 + cos(pi * progress))nơi progress = (step - warmup_steps) / max(1, total_steps - warmup_steps)- Tại step = warmup_stepscosine đánh giá đến cos(0) = 1, cho phéplr_max, phù hợp với điểm cuối nhiệt độ chính xác.step = total_stepscosine đánh giá đến cos(pi) = -1, cho phéplr_min, phù hợp với điểm cuối của sự phân hủy chính xác.
Sự liên tục ở cả hai điểm cuối không phải là một tai nạn.stepMột lịch trình bị dán mất một giới hạn lần đầu tiênlr_maxđã thay đổi.
Lầu sau các bước tổng thể
Vì step > total_stepstốc độ học tập vẫn ở mức lr_min. Hợp đồng là rõ ràng: lịch trình không sai và không phân tích; nó đấm vào sàn và cho phép huấn luyện viên ghi một cảnh báo.total_stepsKhông phải vòng lặp.
Lượng lượng tử chuẩn ghi lại cùng với tỷ lệ
Chương trình là một nửa của sức khỏe tập luyện. Tỷ lệ gradient là một nửa khác. Lòng tập luyện ghi lại cả hai từng bước. Một cuộc tập luyện khác nhau cho thấy mức độ gradient tăng lên trước khi mất mát xảy ra; một sự nóng lên được điều chỉnh tốt giữ cho chuẩn tăng lên theo tuyến tính với tốc độ; một đỉnh quá hung hăng xuất hiện như một chuẩn mà vẫn cao sau khi nóng lên.step, lr, grad_l2_norm, lossCSV là hồ sơ duy nhất bền vững.
Hãy xây dựng nó
code/main.pythực hiện:
CosineWithWarmup- một chức năng không có quốc tịchlr(step) -> floattrên lịch trình được cấu hình.TrainState- gói một mô hình, mộtAdamWOptimizer, và lịch trình thành một chức năng bước.TrainState.step- chạy một lần đi trước, một lần đi ngược, ghi lại chuẩn gradient L2, và áp dụnglr(step)cho người tối ưu hóa.plot_schedule_ascii- trình bày lịch trình như một bản đồ văn bản mà mắt có thể đọc.write_schedule_csv- phát ra một hàng mỗi bước với tốc độ học tập.
Một bản demo ở dưới cùng của tệp tạo ra một cái nhỏ nn.Linearmô hình, tàu cho 20 bước trên một loạt đầu vào cố định, và in tốc độ học tập mỗi bước, chuẩn gradient và mất mát.
Đi đi.
bashpython3 code/main.pyBản kịch bản sẽ đi ra khỏi 0 và in một nhật ký huấn luyện mỗi bước cộng với lịch trình.
Các mẫu sản xuất
Bốn mô hình nâng lên lịch trình thành một đồ tạo tác sản xuất.
Schedule lives in a config, not in code.Người huấn luyện đọc warmup_steps- total_steps- lr_max- lr_minTừ một cấu hình YAML hoặc JSON được cam kết với git.
Step counter is monotonic and decoupled from epochs.Một số khung nhầm lẫn bước và thời đại khi bộ dữ liệu được chia nhỏ hoặc bộ tải dữ liệu khởi động lại.global_stepTừ điểm kiểm soát của huấn luyện viên, không phải từ một bộ đếm địa phương. Một cuộc chạy tiếp tục ở vị trí lịch trình đúng vì bộ đếm bước là trục bền.
Schedule plot in the run directory.Mỗi lần tập luyện đều viếtoutputs/lr_schedule.png(hoặc trong bài học này một bản đồ văn bản) vào thư mục chạy. Một nhà phê bình đã sơ khai thư mục có thể kiểm tra lịch trình mà không cần chạy lại bất cứ điều gì. Điều này bắt được lớp lỗi lịch trình không được cấu hình đúng thời gian PR.
Log row schema is fixed. step, lr, grad_l2_norm, lossMột sổ ghi chép hoặc bảng điều khiển dòng chảy đọc kế hoạch; đổi tên một cột mà không đập một phiên bản vô hiệu hóa tất cả các bảng điều khiển hiện có.
Sử dụng nó
Các mô hình sản xuất:
- Sweep peak before sweeping anything else.
lr_maxlà nút nhạy cảm nhất. Đặt nó trên một mô hình nhỏ trước; tối ưulr_maxScales yếu với kích thước mô hình, do đó, các mô hình nhỏ quét là một trước mạnh mẽ. - Warmup is a fraction of total steps, not an absolute count.Một cuộc chạy 200 triệu bước với 2.000 bước làm nóng bắt đầu ở đỉnh cao gần như ngay lập tức; một cuộc chạy 20.000 bước với cùng một số lượng làm nóng lên 10% .
lr_minis non-zero on purpose.Một tầng là 10% củalr_maxgiữ cho người tối ưu hóa học trong thời gian dài.lr_min = 0lịch trình tạo ra một đường cong đào tạo trông tuyệt vời trên một cốt truyện và một mô hình không thực sự hoàn thành đào tạo.
Chuyển nó
outputs/skill-cosine-warmup.mdsẽ, trên một dự án thực sự, mô tả cấu hình nào mang theo lịch trình, bước huấn luyện viên nào máy tính toàn cầu được đọc từ, và những gì lr_maxThử nghiệm này giúp động cơ được vận chuyển.
Các bài tập
- Thêm một biến thể ngược của đường lập trình và so sánh nó trên một cuộc chạy huấn luyện đồ chơi 200 bước.
- Thêm một
--restartcờ thêm một sự nóng lên thứ hai tạitotal_steps / 2Bảo vệ xem khởi động lại ấm có cải thiện hay bị tổn thương trong việc chạy đồ chơi. - Thêm một unit test rằng lịch trình là liên tục: cho mỗi bước trong
[0, total_steps]sự khác biệt|lr(step+1) - lr(step)|được giới hạn bởilr_max / warmup_steps- Tôi không biết. - Chuyển lịch trình vào một
torch.optim.lr_scheduler.LambdaLRBài học sử dụng một hàm bước đơn giản; bao bì thay đổi gì? - Thêm một
--plot-pngcờ viết một âm mưu thực sự quamatplotlibBảo vệ liệu bản đồ văn bản của bài học hay PNG là mặc định tốt hơn cho các chạy CI.
Các điều khoản chính
| Term | What people say | What it actually means |
|---|---|---|
| Warmup | "Slow start" | Linear ramp from zero to lr_max over the first warmup_steps updates |
| Cosine decay | "Smooth drop" | Upper-half cosine curve from lr_max to lr_min over the remaining steps |
| Floor | "After training" | The fixed lr_min value the schedule pins at past total_steps |
| Gradient norm | "L2 of grads" | The Euclidean norm of the concatenated gradient vector, logged each step |
| Global step | "Schedule axis" | A monotonic step counter that survives restarts and drives the schedule |
Đọc thêm
- Loshchilov and Hutter, SGDR: Stochastic Gradient Descent with Warm Restarts (arXiv 1608.03983)- giấy tham chiếu của lịch trình cosine
- Loshchilov and Hutter, Decoupled Weight Decay Regularization (arXiv 1711.05101)- Báo cáo của AdamW
- PyTorch torch.optim.lr_scheduler- các chức năng bước kết hợp với các lập trình khung
- Giai đoạn 19 · 42 - người tải xuống có cơ thể này lịch sử tiêu thụ
- Giai đoạn 19 · 43 - bộ tải dữ liệu lịch trình cùng phát triển với
- Giai đoạn 19 · 45 - cắt gradient và AMP, lớp tiếp theo trong vòng lặp
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.