Table of Content
Important
Tham khảo
Mục tiêu của phần này là giải thích vì sao việc tạo dữ liệu (synthetic) hữu ích trong học máy và thiết lập môi trường thực nghiệm để tạo—kiểm thử bộ dữ liệu hồi quy nhân tạo. Ý tưởng chính: khi tham số đúng đã được biết a priori, ta có thể kiểm tra liệu mô hình học có khôi phục được các tham số đó hay không, từ đó đánh giá thuật toán và cài đặt.
Động cơ dùng dữ liệu tổng hợp: Trong học máy, ta tìm cách trích xuất thông tin từ dữ liệu. Dù dữ liệu tổng hợp không mang giá trị thực nghiệm trực tiếp như dữ liệu thực, nó lại:
- Giúp giảng dạy/diễn giải (didactic): dễ kiểm soát, minh họa các thuộc tính của thuật toán.
- Cho phép xác minh cài đặt: tham số “đúng” đã biết trước nên có thể kiểm tra khả năng hồi phục tham số của mô hình.
- Tạo bộ kiểm thử có kiểm soát: thêm nhiễu, thay đổi phân phối, kiểm tra độ bền (robustness) một cách có hệ thống.
💡 Tip: Khi thiết kế synthetic data, hãy ghi rõ data-generating process (DGP) gồm: phân phối đầu vào, tham số “chuẩn”, mức nhiễu và hàm sinh dữ liệu. Điều này giúp tái lập thí nghiệm và so sánh thuật toán công bằng.
1. Generating the Dataset
Để minh họa rõ ràng và ngắn gọn, ta tạo dữ liệu hồi quy trong không gian 2 chiều. Cụ thể:
- Sinh 1000 mẫu với đặc trưng được rút từ phân phối chuẩn tắc chuẩn .
- Ma trận thiết kế thu được chứa các vector đặc trưng của từng mẫu.
- Nhãn được tạo từ hàm tuyến tính chuẩn: Trong đó:
- là vector trọng số thật (ground truth weights),
- là hệ số chệch (bias),
- là nhiễu cộng (additive noise), tuân theo phân phối chuẩn và độc lập, đồng phân phối giữa các mẫu.
Tip: Khi tạo dữ liệu synthetic, hãy tách rõ:
Phân phối đặc trưng (feature distribution),
Hàm sinh nhãn (target function),
Nhiễu (noise model).
Điều này giúp dễ tái lập và điều chỉnh thí nghiệm.
Cài đặt lớp sinh dữ liệu
Để quản lý dữ liệu gọn gàng, ta kế thừa từ d2l.DataModule
- Hàm
__init__lưu toàn bộ siêu tham số quasave_hyperparameters()để tiện theo dõi và tái tạo. - Tự động sinh tập huấn luyện + tập validation từ cùng phân phối.
class SyntheticRegressionData(d2l.DataModule): # @save
"""Synthetic data for linear regression."""
def __init__(self, w, b, noise=0.01, num_train=1000, num_val=1000,
batch_size=32):
super().__init__()
self.save_hyperparameters()
# Tổng số mẫu
n = num_train + num_val
# Sinh đặc trưng từ N(0,1)
self.X = torch.randn(n, len(w))
# Sinh nhiễu từ N(0, noise^2)
noise = torch.randn(n, 1) * noise
# Tính nhãn: y = Xw + b + noise
self.y = torch.matmul(self.X, w.reshape((-1, 1))) + b + noiseKhởi tạo tham số thật và xem mẫu dữ liệu
Chúng ta đặt tham số thật:
- Sau đó tạo đối tượng dữ liệu và xem thử một mẫu:
data = SyntheticRegressionData(w=torch.tensor([2, -3.4]), b=4.2)
print('features:', data.X[0], '\nlabel:', data.y[0])Ví dụ kết quả:
features: tensor([0.9026, 1.0264])
label: tensor([2.5148])Nếu bạn muốn thay đổi số chiều đặc trưng, chỉ cần truyền w với số phần tử tương ứng. Lớp này sẽ tự động điều chỉnh kích thước dữ liệu.