Epochs, Batches & Iterations
Epoch và batch: chia nhỏ đề thi để model không ngộp
Không ai ôn 1000 đề trong một buổi
Tưởng tượng bạn đang ôn thi đại học với kho 1000 câu. Ngồi xuống làm tất cả trong một buổi thì vừa đuối, vừa không nhớ nổi. Cách học sinh giỏi thường làm gồm ba bước:
- Chia 1000 câu thành nhiều đợt nhỏ khoảng 30 câu. Mỗi đợt là một batch.
- Làm hết các đợt trong một buổi học. Trọn một buổi là một epoch.
- Hôm sau tráo thứ tự câu, học lại cả kho. Đó là epoch thứ hai. Mỗi lần giải xong một đợt là một iteration, tức là một nhịp cập nhật kiến thức.
Mạng nơ-ron học cũng hệt vậy. Dataset là kho câu hỏi, batch là đợt nhỏ, epoch là một vòng qua toàn bộ, iteration là một lần cập nhật trọng số. Phần sau bạn sẽ tự kéo thanh batch size để thấy đường loss thay đổi hình dạng ra sao.
Dataset có 1000 mẫu. Bạn chọn batch size = 100 và huấn luyện 5 epoch. Model cập nhật trọng số bao nhiêu lần?
Hình minh họa
Dưới đây là một khu vui chơi huấn luyện. Kéo thanh batch size và số epoch, rồi bấm Chạy training để xem ba thứ sau:
- Các chấm là 1000 mẫu dữ liệu. Mỗi epoch tráo thứ tự một lần.
- Chấm nào đang sáng màu là batch model đang học.
- Đường loss bên dưới đi xuống mỗi khi một batch được xử lý.
Bảng điều khiển training
Mô phỏng training loop
1000 mẫu · batch 32 · 32 iteration/epoch · 2 epoch · tổng 64 iteration
Epoch
1/2
Batch trong epoch
1/32
Iteration tổng
0/64
Đường loss theo iteration. Gạch đứt là ranh giới giữa các epoch
Batch là “một đợt nhỏ dữ liệu”. Iterationlà “một lần học xong một batch và cập nhật trọng số”. Epochlà “một lần duyệt hết toàn bộ dataset”.
Model học bằng cách lặp đi lặp lại, giống bạn ôn đề. Không phải một phát hiểu hết, mà là hàng trăm nhịp chỉnh nhẹ.
Cộng đồng deep learning chia cách cập nhật trọng số thành ba kiểu chính. Bấm hai nút bên dưới để so sánh từng cặp. Mỗi biểu đồ vẽ đường loss của cùng một model, chỉ khác batch size.
Bên A chỉ nhìn đúng một mẫu mỗi bước, gradient nhiễu, đường loss nảy lung tung. Bên B nhìn 32 mẫu một lúc, lấy trung bình, mượt hơn hẳn.
Gradient của SGD có phương sai lớn vì chỉ dựa trên 1 mẫu. Mini-batch trung bình trên 32 mẫu cho gradient ổn định hơn, nhưng vẫn giữ một ít nhiễu có ích.
Bên trái cập nhật nhiều lần trong 1 epoch. Bên phải chỉ cập nhật đúng một lần cho cả dataset, chính xác nhưng cực chậm và có nguy cơ kẹt.
Full-batch dùng cả dataset cho mỗi bước. Gradient cực chính xác, nhưng phải nhìn toàn bộ mới được cập nhật một lần. Với dataset lớn, cách này chậm kinh khủng.
- Batch = 1 (SGD thuần): nhanh mỗi bước, nhưng đường loss nảy lung tung. Rẻ RAM, hay thoát local minima cạn.
- Batch = 32 đến 256 (mini-batch):“điểm ngọt” cho hầu hết bài toán. Tận dụng GPU, đủ mượt, vẫn có chút nhiễu regularize tự nhiên.
- Batch = N (full-batch): đường loss thẳng, gradient chính xác nhất, nhưng cực chậm và dễ kẹt sharp minima.
Dataset có 10.000 mẫu, bạn chọn batch size = 100. Một epoch có bao nhiêu iteration?
Giải thích
Giờ bạn đã thấy rõ ba thuật ngữ. Hãy đóng gói chúng bằng một công thức rất ngắn. Với N là tổng số mẫu, B là batch size, E là số epoch, thì số lần cập nhật trọng số trong cả khoá huấn luyện là:
Dấu trần (ceiling) xuất hiện vì batch cuối của mỗi epoch có thể không đủ B mẫu. Lấy ví dụ dataset 1000, batch 300, ta được 4 iteration mỗi epoch (batch thứ tư chỉ có 100 mẫu).
Batch
Một đợt nhỏ dữ liệu đưa vào model cùng lúc. Lấy ví dụ B = 32.
Iteration
Một nhịp: forward + backward + cập nhật trọng số cho một batch.
Epoch
Một vòng đầy đủ qua toàn bộ N mẫu.
Mini-batch cập nhật trọng số như thế nào?
Mỗi iteration, mô hình chọn một batch gồm B mẫu, tính độ lệch (loss) trung bình trên batch, rồi dùng đạo hàm của loss đó để chỉnh trọng số đi một bước nhỏ. Dịch ra công thức:
Nói bằng tiếng Việt: trọng số mới bằng trọng số cũ trừ đi một bước nhỏ theo hướng trung bình của độ dốc trên B mẫu. η là learning rate, tức là độ dài mỗi bước. B càng lớn, trung bình càng “đại diện” cho toàn dataset, nhờ vậy đường loss càng mượt. B càng nhỏ, trung bình chỉ dựa trên ít mẫu nên nhiễu lớn, nhưng đổi lại mỗi bước tính cực nhanh.
- Quên shuffle: nếu bạn không tráo dữ liệu mỗi epoch, các batch giống hệt nhau qua các vòng. Gradient không đa dạng → mô hình có thể học theo thứ tự thay vì nội dung.
- Batch quá nhỏ với BatchNorm: batch ≤ 8 làm thống kê của batch normalization không ổn định. Chuyển sang Layer/GroupNorm hoặc tăng batch.
- Batch quá lớn mà quên tăng learning rate: batch lớn làm gradient mượt hơn nhưng bước đi nhỏ hơn so với trung bình. Quy tắc linear scaling: nhân B lên k lần thì nhân η lên gần k lần kèm warmup.
Khi đã nắm batch và epoch, bước tiếp theo là hiểu tại sao chính cơ chế cập nhật trọng số lại được gọi là stochastic gradient descent (hạ gradient ngẫu nhiên) và cách learning rate làm thay đổi độ dài mỗi bước.
- Batch là một đợt nhỏ dữ liệu. Iteration là một nhịp cập nhật trọng số trên một batch. Epoch là một vòng qua toàn bộ dataset.
- Công thức iteration: ⌈N / B⌉ × E. Ví dụ 1000 mẫu, batch 100, 5 epoch ⇒ 50 lần cập nhật.
- Tráo dữ liệu trước mỗi epoch để các batch khác nhau qua các vòng, gradient đa dạng, thường generalize tốt hơn.
- Batch nhỏ (≤ 32) cho đường loss zig-zag nhưng chính nhiễu đó có tác dụng regularize. Batch lớn (128+) cho đường loss mượt, cần nhiều RAM.
- Full-batch chỉ hợp với dataset nhỏ. Với dataset lớn, hãy dùng mini-batch. Nếu thiếu RAM, dùng gradient accumulation để giả vờ batch to.
Kiểm tra hiểu biết
Dataset 10.000 mẫu, batch size = 100, huấn luyện 5 epoch. Tổng cộng bao nhiêu lần cập nhật trọng số?