Một trong những cách để mô hình học sâu tổng quát hơn chính là cung cấp nhiều dữ liệu huấn luyện hơn. Tuy nhiên trong thực tế, việc thu thập dữ liệu thường khó khăn. Vì vậy, người ta đề xuất giải pháp phổ biến là tạo thêm dữ liệu giả để bổ sung vào tập huấn luyện gốc.
Một trong những thách thức chính trong việc huấn luyện mô hình phân loại là làm sao để mô hình hiểu được tính bất biến đối với nhiều loại biến đổi của đầu vào. Ví dụ như với mô hình phân loại ảnh chó - mèo, thì việc con mèo ở vị trí nào trong tấm ảnh cũng không thay đổi được bản chất nó là con mèo. Vì vậy, ta có thể tạo ra ví dụ mới x' bằng cách thực hiện các phép biến đổi lên trên đầu vào x sao cho không làm thay đổi nhãn y. Những cặp mới (x',y) vẫn hợp lệ và giúp tăng cường dữ liệu
I. Data Augmentation trong bài toán Computer Vision
Dưới đây là đoạn code được hướng dẫn trên trang chủ Pytorch cho bài toán Image Classification. Nhìn chung, họ giới thiệu phương pháp với các phép cắt ảnh, lật ảnh, chuẩn hoá. Ngoài ra khi bạn huấn luyện mô hình, cần bổ sung thêm v2.PILToTensor
import torch
from torchvision.transforms import v2
H, W = 32, 32
img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8)
transforms = v2.Compose([
v2.RandomResizedCrop(size=(224, 224), antialias=True),
v2.RandomHorizontalFlip(p=0.5),
v2.ToDtype(torch.float32, scale=True),
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
img = transforms(img)Tuy nhiên không phải bài toán phân loại nào cũng áp dụng 1 cách như nhau. Ví dụ như bài toán về phân loại ảnh chữ-số: Rõ ràng khi số '6' mà thực hiện phép xoay nó sẽ thành số '9', chữ 'a' đem xoay và lật khả năng cao sẽ bị nhận dạng nhầm thành chữ 'g'. Vì vậy với mỗi bài toán cần phải xem xét kĩ lưỡng cách tăng cường dữ liệu. Ngoài ra cũng có những phép biến đổi mà ta muốn mô hình học được tính bất biến, nhưng không dễ để mô phỏng. Chẳng hạn biến đổi góc nhìn, thay đổi cách ta nhìn từ các góc độ khác nhau, cần phải dùng các kĩ thuật nâng cao hơn trong thư viện CV2.
Một kỹ thuật nổi tiếng khác có thể xem là dạng đặc biệt của Data Augmentation là DropOut, giúp tránh quá khớp, khiến mô hình học được cách hoạt động trong điều kiện không đầy đủ.
II. Noise Robustness (Khả năng chống nhiễu)
Ta cũng thường sử dụng nhiễu như một phương pháp tăng cường dữ liệu. Với một số mô hình, việc thêm nhiễu có phương sai rất nhỏ vào mạng có thể tạo ra ảnh hưởng mạnh hơn nhiều so với chỉ đơn thuần áp dụng các phương pháp chính quy hoá L1, L2 để làm nhỏ trọng số. Còn một hướng tiếp cận khác nữa là tiêm nhiễu trực tiếp vào trọng số của mô hình, đây là phương pháp rất phổ biến trong các mạng nơ-ron hồi tiếp RNN. Khi áp dụn cách này, ta không còn coi trọng số là các giá trị cố định mà coi đó tương tự như những biến ngẫu nhiên đại diện cho sự không chắc chắn của mô hình.
III. Tiêm nhiễu vào nhãn đầu ra
Trong thực tế sẽ không tránh khỏi việc nhãn bị sai, nếu mô hình cố gắng cực đại hoá logP(y|X) sẽ khiến hiệu suất giảm rất mạnh.
Lúc này có giải pháp giả định nhãn y là nhãn chính xác với xác suất (1-epsilon), khi đó tổng xác xuất tất cả các nhãn sai là epsilon. Sau dó ta tiến hành sử dụng kĩ thuật Label Smoothing
Label Smoothing: Không coi nhãn cứng đúng 100% mà cho phép 1 xác suất nhỏ rằng nhãn có thể sai. Ta xét ví dụ có 4 nhãn A,B,C,D, nhãn B sau khi OneHot là một vector y = [0 1 0 0, khi dùng Softmax dự đoán thì không cho phép kết quả bằng 0 hoặc bằng 1, sẽ có thể sinh ra dạng y' = [0.001 0.997 0.001 0.001], nếu CrossEntropy cố ép nó về 1 thì lúc này giá trị dự đoán của nhãn B có thể lên rất lớn, dẫn đến mô hình có thể quá tự tin.
Vì vậy ta xét y_smooth = 1 - epsilon với nhãn đúng hoặc y_smooth = epsilon/(k-1) với nhãn sai, giả sử epsilon = 0.01 thì lúc này kết quả dự đoán có thể ra dạng z = [0.0333 0.9 0.0333 0.0333]. Để bắt đầu sử dụng kĩ thuật này thì bạn chỉ cần thêm 1 tham số vào trong quá trình khởi tạo CrossEntropy
import torch
import torch.nn as nn
criterion = nn.CrossEntropyLoss(label_smoothing=0.1)
Kết luận
Data Augmentation là một trong những phương pháp đơn giản nhưng hiệu quả để giúp mô hình học sâu tổng quát tốt hơn khi lượng dữ liệu huấn luyện còn hạn chế. Thay vì chỉ tập trung vào việc thu thập thêm dữ liệu, ta có thể tạo ra các biến thể hợp lý từ dữ liệu có sẵn, thêm nhiễu hoặc làm mềm nhãn đầu ra để mô hình tránh học quá cứng vào tập huấn luyện.
Tuy nhiên, không có một phương pháp tăng cường dữ liệu nào phù hợp cho mọi bài toán. Các phép biến đổi cần được lựa chọn sao cho vẫn giữ nguyên bản chất và nhãn của dữ liệu. Tương tự, các kỹ thuật như thêm nhiễu, Dropout hay Label Smoothing cũng cần được điều chỉnh phù hợp. Mục tiêu cuối cùng vẫn là giúp mô hình học được những đặc trưng quan trọng của dữ liệu thay vì ghi nhớ các ví dụ cụ thể, từ đó cải thiện khả năng tổng quát trên dữ liệu mới.

Thảo luận bài viết
Câu hỏi, ghi chú và góc nhìn của bạn về nội dung này.