Reproducibility trong nghiên cứu Machine Learning
Lưu đủ dữ liệu, code, cấu hình, môi trường và protocol để người khác kiểm tra một kết quả.
Một seed không phải toàn bộ chiến lược reproducibility. Kết quả phụ thuộc dữ liệu, split, preprocessing, phần mềm, phần cứng và cách đánh giá. Cần nói rõ muốn lặp lại bit-for-bit hay tái hiện kết luận trong phạm vi sai số.
Mục tiêu học tập
- Phân biệt chạy lại cùng setup và kiểm chứng kết luận độc lập.
- Liệt kê artifacts và randomness sources cần lưu.
- Viết một hướng dẫn tái hiện có scope và giới hạn rõ.
Tái lập điều gì?
Đưa code cho người khác chưa chắc giúp họ chạy lại nếu thiếu dữ liệu hoặc phiên bản thư viện. Một bản hướng dẫn tốt nói bắt đầu từ đâu, chạy lệnh nào, cần gì và so kết quả theo tiêu chí nào.
Thuật ngữ reproducibility và replicability có convention khác nhau giữa cộng đồng. Vì vậy hãy mô tả cụ thể “cùng code/dữ liệu/môi trường” hoặc “implementation độc lập” thay vì chỉ dựa vào một nhãn.
Tái chạy một script, tái hiện một metric và kiểm tra một kết luận là ba mức yêu cầu khác nhau. Lưu commit, config, split IDs, data hash, dependencies, hardware và evaluator. Nếu không chia sẻ dữ liệu, ghi quy trình tiếp cận và hạn chế đã biết.
Một model pretrained tải từ URL có thể thay đổi hoặc biến mất; lưu identifier/version và checksum khi điều kiện giấy phép cho phép. Không chỉ ghi “latest”.
Bitwise determinism trong một môi trường không đồng nghĩa statistical reproducibility qua phần cứng hoặc thư viện khác. PyTorch nêu rõ các giới hạn về tính tái lập giữa release, platform và các operation.
Định nghĩa acceptance tolerance và distribution của run trước. Nếu mục tiêu là kết luận so sánh, báo cả điều kiện kết luận không còn đúng thay vì chỉ một seed thành công.
Nhiều nguồn ngẫu nhiên
Seed giống nhau giúp lặp dãy số của một bộ sinh trong cùng điều kiện. Nhưng nếu code gọi bộ sinh thêm một lần hoặc đổi cách chia batch, dãy dùng cho model có thể đổi. Phần mềm và thiết bị còn có nguồn khác.
Kiểm soát RNG của Python, thư viện mảng, framework và dataloader workers khi dùng chúng. Ghi split cố định; không regenerate split tùy ý ở mỗi lần báo điểm. Deterministic modes có thể chậm hơn hoặc không hỗ trợ mọi operation.
Mã minh họa dùng một Random object độc lập để không phụ thuộc số lần gọi RNG toàn cục. Nó không chứng minh một training job GPU có tính deterministic.
Một số parallel kernels dùng thứ tự cộng khác nhau nên số thực có thể khác dù seed không đổi. Giữ cả library/driver/hardware metadata; không quy sai lệch nhỏ mặc định là lỗi thuật toán.
Repeated seeds giúp khảo sát variability của setup, không thay thế kiểm tra trên dataset hoặc population khác. Chỉ chọn seed đẹp nhất gây selection bias; lưu danh sách run và tiêu chí loại lỗi trước.
Gói tái hiện tối thiểu
Người review nên có thể thử một ví dụ nhỏ trước khi chạy lâu. Ví dụ đó kiểm tra đường dữ liệu và output format, không được mô tả như đã tái hiện toàn bộ benchmark.
Gói gồm README, environment lock/version, lệnh chạy, config, manifest dữ liệu/split, checkpoint nếu được phép và evaluator. Tách smoke test nhỏ khỏi full experiment. Ghi compute requirements và nguồn kết quả, không điền số liệu chưa chạy.
Một kết quả tái hiện khác paper cần được báo bằng log, version và khác biệt có thể kiểm tra. Nêu phần đã xác minh và phần chưa đủ tài nguyên hoặc artifacts.
Data licensing, quyền riêng tư và dependency không còn có sẵn có thể giới hạn khả năng tái hiện. Nêu giới hạn thực thay vì tạo bản dữ liệu thay thế rồi gọi là cùng benchmark. Khi thay một thành phần, đánh dấu đó là adaptation experiment.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Chuẩn bị experiment package cho technical review.
- Điều tra sai khác giữa run của hai người trong nhóm.
Điểm mạnh
Giúp kiểm tra bằng chứng và giảm thời gian tìm nguyên nhân khác biệt.
Giới hạn cần nhớ
Không phải mọi dữ liệu hay phần cứng đều có thể chia sẻ; determinism và tính đúng là hai vấn đề khác nhau.
Thử trong một project nhỏ
Viết README tái hiện một experiment bạn có thể chạy: inputs, versions, command, output và tolerance. Đánh dấu chính xác artifact nào còn thiếu, không thay bằng giá trị phỏng đoán.
from random import Random
def toy_sequence(seed):
rng = Random(seed)
return [rng.random() for _ in range(5)]
a, b = toy_sequence(7), toy_sequence(7)
c = toy_sequence(8)
assert a == b
assert a != c
print("Same-seed toy sequence reproduced")Minh họa RNG Python cục bộ trong cùng môi trường; không khẳng định tái lập GPU, cross-platform hoặc kết quả nghiên cứu.
