Tìm hiểu cách optimizer AdamW cải thiện hiệu suất mô hình bằng cách tách weight decay khỏi cập nhật gradient. Hướng dẫn này giải thích những khác biệt chính giữa Adam và AdamW, các trường hợp sử dụng và cung cấp hướng dẫn từng bước để triển khai AdamW trong PyTorch.
Các thuật toán tối ưu hóa đóng vai trò then chốt trong học sâu: chúng tinh chỉnh trọng số mô hình để tối thiểu hóa hàm mất mát trong quá trình huấn luyện. Một thuật toán như vậy là optimizer Adam.
Adam trở nên cực kỳ phổ biến trong học sâu nhờ khả năng kết hợp ưu điểm của momentum và tốc độ học thích nghi. Điều này giúp nó rất hiệu quả khi huấn luyện các mạng nơ-ron sâu. Adam cũng yêu cầu tinh chỉnh siêu tham số tối thiểu, nhờ đó phù hợp và hiệu quả trên nhiều tác vụ khác nhau.
Năm 2017, Ilya Loshchilov và Frank Hutter giới thiệu phiên bản nâng cao của thuật toán Adam nổi tiếng trong bài báo "Decoupled Weight Decay Regularization." Họ đặt tên là AdamW, nổi bật với việc tách weight decay khỏi quá trình cập nhật gradient. Sự tách biệt này là cải tiến quan trọng so với Adam và giúp mô hình tổng quát hóa tốt hơn.
AdamW ngày càng trở nên quan trọng trong các ứng dụng học sâu hiện đại, đặc biệt khi xử lý các mô hình quy mô lớn. Khả năng vượt trội trong điều tiết cập nhật trọng số đã góp phần vào việc áp dụng nó cho các tác vụ đòi hỏi hiệu năng và độ ổn định cao.
Trong hướng dẫn này, chúng ta sẽ đề cập đến những khác biệt chính giữa Adam và AdamW, các trường hợp sử dụng khác nhau, và sẽ triển khai hướng dẫn từng bước để áp dụng AdamW trong PyTorch.
Adam so với AdamW
Adam và AdamW đều là các optimizer thích nghi được sử dụng rộng rãi trong học sâu. Khác biệt lớn giữa chúng nằm ở cách xử lý regularization cho trọng số, qua đó ảnh hưởng đến hiệu quả trong các bối cảnh khác nhau.
Trong khi Adam kết hợp momentum và tốc độ học thích nghi để tối ưu hóa hiệu quả, nó tích hợp L2 regularization theo cách có thể cản trở hiệu năng. AdamW khắc phục điều này bằng cách tách weight decay khỏi cập nhật tốc độ học, cung cấp phương pháp hiệu quả hơn cho các mô hình lớn và cải thiện khả năng tổng quát hóa. Weight decay, một dạng của L2 regularization, phạt các trọng số lớn trong mô hình. Adam đưa weight decay vào quá trình cập nhật gradient, trong khi AdamW áp dụng nó riêng biệt sau khi cập nhật gradient
Dưới đây là một số điểm khác biệt khác:
Những khác biệt chính giữa Adam và AdamW
Mặc dù cả hai optimizer đều được thiết kế để quản lý momentum và điều chỉnh tốc độ học một cách động, chúng khác nhau về bản chất trong cách xử lý weight decay.
Trong Adam, weight decay được áp dụng gián tiếp như một phần của cập nhật gradient, điều này có thể vô tình thay đổi động lực học học tập và can thiệp vào quá trình tối ưu hóa. Ngược lại, AdamW tách weight decay khỏi bước gradient, đảm bảo regularization tác động trực tiếp lên tham số mà không làm thay đổi cơ chế học thích nghi.
Thiết kế này dẫn đến regularization chính xác hơn, giúp mô hình tổng quát hóa tốt hơn, đặc biệt trong các tác vụ liên quan đến bộ dữ liệu lớn và phức tạp. Do đó, hai optimizer này thường có các trường hợp sử dụng rất khác nhau.
Trường hợp sử dụng cho Adam
Adam hoạt động tốt hơn trong các tác vụ mà regularization ít quan trọng hoặc khi hiệu quả tính toán được ưu tiên hơn khả năng tổng quát hóa. Ví dụ gồm:
Mạng nơ-ron nhỏ. Với các tác vụ như phân loại ảnh cơ bản bằng các CNN nhỏ (Convolutional Neural Networks) trên các bộ dữ liệu như MNIST hoặc CIFAR-10, nơi độ phức tạp mô hình thấp, Adam có thể tối ưu hiệu quả mà không cần regularization mạnh.
Bài toán hồi quy đơn giản. Trong các tác vụ hồi quy đơn giản với ít đặc trưng, như dự đoán giá nhà bằng mô hình hồi quy tuyến tính, Adam có thể hội tụ nhanh mà không cần kỹ thuật regularization nâng cao.
Giai đoạn thử nghiệm ban đầu. Ở giai đoạn phát triển mô hình ban đầu, khi cần thử nghiệm nhanh, Adam cho phép lặp nhanh trên các kiến trúc đơn giản, giúp nhà nghiên cứu phát hiện vấn đề tiềm ẩn mà không tốn công tinh chỉnh tham số regularization.
Dữ liệu ít nhiễu. Khi làm việc với bộ dữ liệu sạch, ít nhiễu, như dữ liệu văn bản được chọn lọc tốt cho phân tích cảm xúc, Adam có thể học mẫu hiệu quả mà không có rủi ro quá khớp cao đến mức cần regularization mạnh.
Chu kỳ huấn luyện ngắn. Trong các tình huống hạn chế thời gian, như triển khai mô hình nhanh cho ứng dụng thời gian thực, tối ưu hóa hiệu quả của Adam có thể giúp đưa ra kết quả chấp nhận được nhanh chóng, dù có thể chưa tối ưu hoàn toàn về khả năng tổng quát hóa.
Trường hợp sử dụng cho AdamW
AdamW vượt trội trong các bối cảnh mà overfitting là mối lo ngại và kích thước mô hình lớn. Chẳng hạn:
Transformer quy mô lớn. Trong các tác vụ xử lý ngôn ngữ tự nhiên, như fine-tune các mô hình như GPT trên kho văn bản lớn, khả năng quản lý weight decay hiệu quả của AdamW giúp ngăn overfitting, đảm bảo tổng quát hóa tốt hơn.
Mô hình thị giác máy tính phức tạp. Với các tác vụ liên quan đến CNN sâu được huấn luyện trên bộ dữ liệu lớn như ImageNet, AdamW giúp duy trì ổn định và hiệu năng mô hình bằng cách tách weight decay, yếu tố quan trọng để đạt độ chính xác cao.
Học đa nhiệm. Khi mô hình được huấn luyện đồng thời trên nhiều nhiệm vụ, AdamW mang lại tính linh hoạt để xử lý các bộ dữ liệu đa dạng và ngăn overfitting vào một nhiệm vụ cụ thể.
Mô hình sinh (generative). Khi huấn luyện GAN, nơi cân bằng giữa generator và discriminator là quan trọng, regularization được cải thiện của AdamW có thể giúp ổn định huấn luyện và nâng cao chất lượng đầu ra sinh.
Học tăng cường. Trong các ứng dụng học tăng cường nơi mô hình phải thích nghi với môi trường phức tạp và học chính sách vững chắc, AdamW giúp giảm overfitting vào các trạng thái hoặc hành động cụ thể, cải thiện hiệu năng tổng quát của mô hình trong những tình huống đa dạng.
Ưu điểm của AdamW so với Adam
Vậy tại sao nên dùng AdamW thay vì Adam? Đơn giản. AdamW mang lại một số lợi ích quan trọng nâng cao hiệu suất, đặc biệt trong các kịch bản mô hình hóa phức tạp.
Nó khắc phục một số hạn chế của optimizer Adam, nhờ đó tối ưu hóa hiệu quả hơn và góp phần cải thiện huấn luyện cũng như độ vững của mô hình.
Dưới đây là một số ưu điểm nổi bật khác:
Tách biệt weight decay. Bằng cách tách weight decay khỏi cập nhật gradient, AdamW cho phép kiểm soát regularization chính xác hơn, dẫn đến khả năng tổng quát hóa tốt hơn.
Cải thiện tổng quát hóa. AdamW giảm rủi ro overfitting, đặc biệt ở các mô hình quy mô lớn, phù hợp cho các tác vụ với bộ dữ liệu đồ sộ và kiến trúc phức tạp.
Ổn định trong quá trình huấn luyện. Thiết kế của AdamW giúp duy trì sự ổn định xuyên suốt quá trình huấn luyện, điều này thiết yếu cho các mô hình cần tinh chỉnh siêu tham số cẩn thận.
Khả năng mở rộng. AdamW đặc biệt hiệu quả khi mở rộng quy mô mô hình, vì có thể xử lý độ phức tạp tăng lên của mạng sâu mà không đánh đổi hiệu năng, cho phép áp dụng trong các kiến trúc tối tân.
Cách AdamW hoạt động
Sức mạnh cốt lõi của AdamW nằm ở cách tiếp cận weight decay, được tách khỏi các cập nhật gradient thích nghi điển hình của Adam. Điều chỉnh này đảm bảo regularization được áp dụng trực tiếp lên trọng số của mô hình, cải thiện tổng quát hóa mà không ảnh hưởng tiêu cực đến động lực học của tốc độ học.
Optimizer này kế thừa tính thích nghi của Adam, giữ lại lợi ích của momentum và điều chỉnh tốc độ học theo từng tham số. Áp dụng weight decay một cách độc lập giải quyết một trong những điểm yếu chính của Adam: xu hướng ảnh hưởng đến cập nhật gradient trong quá trình regularization. Sự tách biệt này cho phép AdamW duy trì việc học ổn định, ngay cả với các mô hình phức tạp và quy mô lớn, đồng thời kiểm soát overfitting.
Trong các phần tiếp theo, chúng ta sẽ khám phá lý thuyết đằng sau weight decay và regularization cũng như toán học nền tảng cho quá trình tối ưu hóa của AdamW.
Lý thuyết đằng sau Weight Decay và L2 Regularization
L2 regularization là kỹ thuật dùng để ngăn overfitting. Nó đạt được mục tiêu này bằng cách thêm một hạng phạt vào hàm mất mát, hạn chế các trọng số có giá trị lớn. Kỹ thuật này giúp tạo các mô hình đơn giản hơn và tổng quát hóa tốt hơn với dữ liệu mới.
Trong các optimizer truyền thống như Adam, weight decay được áp dụng như một phần của cập nhật gradient, vô tình ảnh hưởng đến tốc độ học và có thể dẫn đến hiệu năng kém tối ưu.
AdamW cải thiện điều này bằng cách tách weight decay khỏi phép tính gradient. Nói cách khác, thay vì áp dụng weight decay trong lúc cập nhật gradient, AdamW coi đó là một bước riêng, áp dụng trực tiếp lên trọng số sau khi cập nhật gradient. Cách làm này ngăn weight decay can thiệp vào quá trình tối ưu hóa, dẫn tới huấn luyện ổn định hơn và tổng quát hóa tốt hơn.
Nền tảng toán học của AdamW
AdamW điều chỉnh optimizer Adam truyền thống bằng cách thay đổi cách áp dụng weight decay. Các phương trình cốt lõi cho AdamW có thể được biểu diễn như sau:
Momentum và tốc độ học thích nghi: Tương tự Adam, AdamW sử dụng momentum và tốc độ học thích nghi để tính cập nhật tham số dựa trên trung bình động của gradient và bình phương gradient.
Phương trình cho momentum và tốc độ học thích nghi
Ước lượng đã hiệu chỉnh độ chệch:Các ước lượng moment bậc nhất và bậc hai được hiệu chỉnh độ chệch bằng công thức sau:
Công thức cho ước lượng đã hiệu chỉnh độ chệch
Cập nhật tham số với weight decay tách biệt: Trong AdamW, weight decay được áp dụng trực tiếp lên tham số sau khi cập nhật gradient. Quy tắc cập nhật là:
Cập nhật tham số với weight decay tách biệt
Ở đây, η là tốc độ học, λ là hệ số weight decay, và θt đại diện cho các tham số. Hạng weight decay tách biệt λθt đảm bảo regularization được áp dụng độc lập với cập nhật gradient, đây là điểm khác biệt then chốt so với Adam.
Triển khai AdamW trong PyTorch
Triển khai AdamW trong PyTorch rất đơn giản; phần này cung cấp hướng dẫn toàn diện để thiết lập. Hãy làm theo các bước sau để học cách fine-tune mô hình hiệu quả với Adam Optimizer.
Hướng dẫn từng bước sử dụng AdamW trong PyTorch
Lưu ý: hướng dẫn này giả định bạn đã cài đặt PyTorch. Tham khảo Tài liệu để được hướng dẫn.
Bước 1: Import các thư viện cần thiết
import torch
import torch.nn as nn
import torch.optim as optim
Import torch.nn.functional as F
Được hỗ trợ bởi
Bước 2: Định nghĩa mô hình
classSimpleCNN(nn.Module):def__init__(self):super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3,32, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.conv2 = nn.Conv2d(32,64, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(64*8*8,128)
self.fc2 = nn.Linear(128,10)defforward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1,64*8*8)
x = F.relu(self.fc1(x))
x = self.fc2(x)Được hỗ trợ bởi
Bước 3: Thiết lập siêu tham số
learning_rate =1e-4
weight_decay =1e-2
num_epochs =10# number of epochsĐược hỗ trợ bởi
Bước 4: Khởi tạo optimizer AdamW và thiết lập hàm mất mát
Giờ bạn đã sẵn sàng bắt đầu huấn luyện mô hình CNN của mình, và đó chính là việc chúng ta sẽ làm ở phần tiếp theo.
Ví dụ thực tế: Fine-tune mô hình bằng AdamW
Ở trên, chúng ta đã định nghĩa mô hình, thiết lập siêu tham số, khởi tạo optimizer (AdamW) và thiết lập hàm mất mát.
Để huấn luyện mô hình, chúng ta sẽ cần import thêm một vài mô-đun;
from torch.utils.data import DataLoader # provides an iterable of the datasetimport torchvision
import torchvision.transforms as transformsĐược hỗ trợ bởi
Tiếp theo, định nghĩa bộ dữ liệu và các dataloader. Trong ví dụ này, chúng ta sẽ sử dụng bộ dữ liệu CIFAR-10:
# Define transformations for the training set
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),])# Load CIFAR-10 dataset
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
val_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)# Create data loaders
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)Được hỗ trợ bởi
Vì chúng ta đã định nghĩa mô hình, bước tiếp theo là triển khai vòng lặp huấn luyện để tối ưu mô hình bằng AdamW.
Trông nó sẽ như sau:
for epoch inrange(num_epochs):
model.train()# Set the model to training mode
running_loss =0.0for inputs, labels in train_loader:
optimizer.zero_grad()# Clear gradients
outputs = model(inputs)# Forward pass
loss = criterion(outputs, labels)# Calculate loss
loss.backward()# Backward pass
optimizer.step()# Update weights
running_loss += loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')Được hỗ trợ bởi
Bước cuối cùng là kiểm định hiệu năng mô hình trên bộ dữ liệu validation mà chúng ta đã tạo trước đó.
Đây là đoạn mã:
model.eval()# Set the model to evaluation mode
correct =0
total =0with torch.no_grad():for inputs, labels in val_loader:
outputs = model(inputs)# Forward pass
_, predicted = torch.max(outputs.data,1)# Get predicted class
total += labels.size(0)# Update total samples
correct +=(predicted == labels).sum().item()# Update correct predictions
accuracy =100* correct / total
print(f'Validation Accuracy: {accuracy:.2f}%')Được hỗ trợ bởi
Vậy là xong.
Giờ thì bạn đã biết cách triển khai AdamW trong PyTorch.
Các trường hợp sử dụng phổ biến của AdamW
Vậy là chúng ta đã xác nhận rằng AdamW trở nên phổ biến nhờ quản lý weight decay hiệu quả hơn so với tiền nhiệm Adam.
Nhưng những trường hợp sử dụng phổ biến của optimizer này là gì?
Chúng ta sẽ tìm hiểu trong phần này…
Mô hình học sâu quy mô lớn
AdamW đặc biệt hữu ích khi huấn luyện các mô hình lớn như BERT, GPT và các kiến trúc transformer khác. Những mô hình này thường có hàng triệu hoặc thậm chí hàng tỷ tham số, đòi hỏi các thuật toán tối ưu hóa hiệu quả có khả năng xử lý cập nhật trọng số phức tạp và thách thức về tổng quát hóa.
Các tác vụ thị giác máy tính và NLP
AdamW đã trở thành lựa chọn optimizer ưa thích trong các tác vụ thị giác máy tính với CNN và các tác vụ NLP với transformer. Khả năng ngăn overfitting khiến nó lý tưởng cho các tác vụ liên quan đến bộ dữ liệu lớn và kiến trúc phức tạp. Việc tách weight decay giúp AdamW tránh các vấn đề mà Adam gặp phải khi regularization quá mức mô hình.
Tinh chỉnh siêu tham số trong AdamW
Tinh chỉnh siêu tham số là quá trình lựa chọn giá trị tốt nhất cho các tham số chi phối quá trình huấn luyện của mô hình học máy nhưng không được học trực tiếp từ dữ liệu. Những tham số này ảnh hưởng trực tiếp đến cách mô hình tối ưu hóa và hội tụ.
Tinh chỉnh đúng các siêu tham số trong AdamW là thiết yếu để đạt hiệu quả huấn luyện, tránh overfitting và đảm bảo mô hình tổng quát hóa tốt với dữ liệu chưa thấy.
Trong phần này, chúng ta sẽ khám phá cách fine-tune các siêu tham số chính của AdamW để đạt hiệu năng tối ưu.
Thực hành tốt nhất khi chọn tốc độ học và weight decay
Tốc độ học là siêu tham số kiểm soát mức điều chỉnh trọng số mô hình theo gradient của mất mát ở mỗi bước huấn luyện. Tốc độ học cao giúp huấn luyện nhanh hơn nhưng có thể khiến mô hình vượt quá điểm tối ưu, trong khi tốc độ thấp cho phép điều chỉnh tinh hơn nhưng có thể khiến huấn luyện chậm hoặc mắc kẹt tại cực tiểu cục bộ.
Mặt khác, weight decay là kỹ thuật regularization dùng để ngăn overfitting bằng cách phạt các trọng số lớn trong mô hình. Cụ thể, weight decay thêm một khoản phạt nhỏ tỷ lệ với độ lớn trọng số trong quá trình huấn luyện, giúp giảm độ phức tạp mô hình và cải thiện khả năng tổng quát hóa với dữ liệu mới.
Để chọn tốc độ học và giá trị weight decay tối ưu cho AdamW:
Bắt đầu với tốc độ học vừa phải – Với AdamW, tốc độ học khoảng 1e-3 thường là điểm khởi đầu tốt. Bạn có thể điều chỉnh dựa trên mức độ hội tụ của mô hình, giảm nếu mô hình khó hội tụ hoặc tăng nếu huấn luyện quá chậm.
Thử nghiệm với weight decay. Bắt đầu với giá trị khoảng 1e-2 đến 1e-4, tùy thuộc kích thước mô hình và bộ dữ liệu. Weight decay hơi cao hơn có thể giúp ngăn overfitting cho mô hình lớn, phức tạp, trong khi mô hình nhỏ có thể cần regularization ít hơn.
Sử dụng lịch trình tốc độ học. Áp dụng các lịch trình tốc độ học (như step decay hoặc cosine annealing) để giảm dần tốc độ học khi huấn luyện tiến triển, giúp mô hình tinh chỉnh tham số khi tiến gần hội tụ.
Theo dõi hiệu năng. Liên tục theo dõi hiệu năng mô hình trên tập validation. Nếu quan sát thấy overfitting, hãy cân nhắc tăng weight decay, hoặc nếu mất mát huấn luyện chững lại, hãy giảm tốc độ học để tối ưu tốt hơn.
Lời kết
AdamW đã nổi lên như một trong những optimizer hiệu quả nhất trong học sâu, đặc biệt với các mô hình quy mô lớn. Điều này là nhờ khả năng tách weight decay khỏi cập nhật gradient. Cụ thể, thiết kế của AdamW cải thiện regularization và giúp mô hình tổng quát hóa tốt hơn, nhất là khi làm việc với các kiến trúc phức tạp và bộ dữ liệu lớn.
Như đã minh họa trong hướng dẫn này, triển khai AdamW trong PyTorch rất đơn giản—chỉ cần một vài điều chỉnh so với Adam. Tuy nhiên, tinh chỉnh siêu tham số vẫn là bước then chốt để tối đa hóa hiệu quả của AdamW. Tìm được sự cân bằng phù hợp giữa tốc độ học và weight decay là điều cốt yếu để optimizer hoạt động hiệu quả mà không gây overfitting hay underfitting cho mô hình.
Giờ bạn đã biết đủ để triển khai AdamW trong các mô hình của riêng mình. Để tiếp tục học, hãy tham khảo một số tài nguyên sau:
AdamW là phiên bản cải tiến của Adam, tách weight decay khỏi quá trình cập nhật gradient, dẫn đến khả năng tổng quát hóa tốt hơn và giảm overfitting.
Khi nào tôi nên dùng AdamW thay vì Adam?⌄
AdamW lý tưởng cho các mô hình quy mô lớn như transformer hoặc các tác vụ dễ bị overfitting, trong khi Adam có thể đủ dùng cho mô hình và bộ dữ liệu đơn giản.
Làm thế nào để triển khai AdamW trong PyTorch?⌄
Bạn có thể triển khai AdamW trong PyTorch bằng hàm torch.optim.AdamW và chỉ định các tham số như tốc độ học và weight decay.
Tại sao weight decay quan trọng trong AdamW?⌄
Weight decay giúp ngăn overfitting bằng cách phạt các trọng số lớn. Trong AdamW, nó được áp dụng trực tiếp lên trọng số, cải thiện regularization mà không ảnh hưởng đến tốc độ học.
AdamW có thể dùng cho cả tác vụ NLP và thị giác máy tính không?⌄
Có, AdamW hiệu quả cho cả tác vụ NLP và thị giác máy tính, đặc biệt với các mô hình lớn như BERT và CNN, nơi regularization phù hợp là thiết yếu cho hiệu năng.
Tiếp tục hành trình học máy của quý vị sang lĩnh vực học sâu. Sử dụng thư viện PyTorch để xây dựng mạng nơ-ron nhằm mô hình hóa các loại dữ liệu khác nhau.
Các thuật toán tối ưu hóa đóng vai trò then chốt trong học sâu: chúng tinh chỉnh trọng số mô hình để tối thiểu hóa hàm mất mát trong quá trình huấn luyện. Một thuật toán như vậy là optimizer Adam.
Adam trở nên cực kỳ phổ biến trong học sâu nhờ khả năng kết hợp ưu điểm của momentum và tốc độ học thích nghi. Điều này giúp nó rất hiệu quả khi huấn luyện các mạng nơ-ron sâu. Adam cũng yêu cầu tinh chỉnh siêu tham số tối thiểu, nhờ đó phù hợp và hiệu quả trên nhiều tác vụ khác nhau.
Năm 2017, Ilya Loshchilov và Frank Hutter giới thiệu phiên bản nâng cao của thuật toán Adam nổi tiếng trong bài báo "Decoupled Weight Decay Regularization." Họ đặt tên là AdamW, nổi bật với việc tách weight decay khỏi quá trình cập nhật gradient. Sự tách biệt này là cải tiến quan trọng so với Adam và giúp mô hình tổng quát hóa tốt hơn.
AdamW ngày càng trở nên quan trọng trong các ứng dụng học sâu hiện đại, đặc biệt khi xử lý các mô hình quy mô lớn. Khả năng vượt trội trong điều tiết cập nhật trọng số đã góp phần vào việc áp dụng nó cho các tác vụ đòi hỏi hiệu năng và độ ổn định cao.
Trong hướng dẫn này, chúng ta sẽ đề cập đến những khác biệt chính giữa Adam và AdamW, các trường hợp sử dụng khác nhau, và sẽ triển khai hướng dẫn từng bước để áp dụng AdamW trong PyTorch.
Adam so với AdamW
Adam và AdamW đều là các optimizer thích nghi được sử dụng rộng rãi trong học sâu. Khác biệt lớn giữa chúng nằm ở cách xử lý regularization cho trọng số, qua đó ảnh hưởng đến hiệu quả trong các bối cảnh khác nhau.
Trong khi Adam kết hợp momentum và tốc độ học thích nghi để tối ưu hóa hiệu quả, nó tích hợp L2 regularization theo cách có thể cản trở hiệu năng. AdamW khắc phục điều này bằng cách tách weight decay khỏi cập nhật tốc độ học, cung cấp phương pháp hiệu quả hơn cho các mô hình lớn và cải thiện khả năng tổng quát hóa. Weight decay, một dạng của L2 regularization, phạt các trọng số lớn trong mô hình. Adam đưa weight decay vào quá trình cập nhật gradient, trong khi AdamW áp dụng nó riêng biệt sau khi cập nhật gradient
Dưới đây là một số điểm khác biệt khác:
Những khác biệt chính giữa Adam và AdamW
Mặc dù cả hai optimizer đều được thiết kế để quản lý momentum và điều chỉnh tốc độ học một cách động, chúng khác nhau về bản chất trong cách xử lý weight decay.
Trong Adam, weight decay được áp dụng gián tiếp như một phần của cập nhật gradient, điều này có thể vô tình thay đổi động lực học học tập và can thiệp vào quá trình tối ưu hóa. Ngược lại, AdamW tách weight decay khỏi bước gradient, đảm bảo regularization tác động trực tiếp lên tham số mà không làm thay đổi cơ chế học thích nghi.
Thiết kế này dẫn đến regularization chính xác hơn, giúp mô hình tổng quát hóa tốt hơn, đặc biệt trong các tác vụ liên quan đến bộ dữ liệu lớn và phức tạp. Do đó, hai optimizer này thường có các trường hợp sử dụng rất khác nhau.
Trường hợp sử dụng cho Adam
Adam hoạt động tốt hơn trong các tác vụ mà regularization ít quan trọng hoặc khi hiệu quả tính toán được ưu tiên hơn khả năng tổng quát hóa. Ví dụ gồm:
Trường hợp sử dụng cho AdamW
AdamW vượt trội trong các bối cảnh mà overfitting là mối lo ngại và kích thước mô hình lớn. Chẳng hạn:
Ưu điểm của AdamW so với Adam
Vậy tại sao nên dùng AdamW thay vì Adam? Đơn giản. AdamW mang lại một số lợi ích quan trọng nâng cao hiệu suất, đặc biệt trong các kịch bản mô hình hóa phức tạp.
Nó khắc phục một số hạn chế của optimizer Adam, nhờ đó tối ưu hóa hiệu quả hơn và góp phần cải thiện huấn luyện cũng như độ vững của mô hình.
Dưới đây là một số ưu điểm nổi bật khác:
Cách AdamW hoạt động
Sức mạnh cốt lõi của AdamW nằm ở cách tiếp cận weight decay, được tách khỏi các cập nhật gradient thích nghi điển hình của Adam. Điều chỉnh này đảm bảo regularization được áp dụng trực tiếp lên trọng số của mô hình, cải thiện tổng quát hóa mà không ảnh hưởng tiêu cực đến động lực học của tốc độ học.
Optimizer này kế thừa tính thích nghi của Adam, giữ lại lợi ích của momentum và điều chỉnh tốc độ học theo từng tham số. Áp dụng weight decay một cách độc lập giải quyết một trong những điểm yếu chính của Adam: xu hướng ảnh hưởng đến cập nhật gradient trong quá trình regularization. Sự tách biệt này cho phép AdamW duy trì việc học ổn định, ngay cả với các mô hình phức tạp và quy mô lớn, đồng thời kiểm soát overfitting.
Trong các phần tiếp theo, chúng ta sẽ khám phá lý thuyết đằng sau weight decay và regularization cũng như toán học nền tảng cho quá trình tối ưu hóa của AdamW.
Lý thuyết đằng sau Weight Decay và L2 Regularization
L2 regularization là kỹ thuật dùng để ngăn overfitting. Nó đạt được mục tiêu này bằng cách thêm một hạng phạt vào hàm mất mát, hạn chế các trọng số có giá trị lớn. Kỹ thuật này giúp tạo các mô hình đơn giản hơn và tổng quát hóa tốt hơn với dữ liệu mới.
Trong các optimizer truyền thống như Adam, weight decay được áp dụng như một phần của cập nhật gradient, vô tình ảnh hưởng đến tốc độ học và có thể dẫn đến hiệu năng kém tối ưu.
AdamW cải thiện điều này bằng cách tách weight decay khỏi phép tính gradient. Nói cách khác, thay vì áp dụng weight decay trong lúc cập nhật gradient, AdamW coi đó là một bước riêng, áp dụng trực tiếp lên trọng số sau khi cập nhật gradient. Cách làm này ngăn weight decay can thiệp vào quá trình tối ưu hóa, dẫn tới huấn luyện ổn định hơn và tổng quát hóa tốt hơn.
Nền tảng toán học của AdamW
AdamW điều chỉnh optimizer Adam truyền thống bằng cách thay đổi cách áp dụng weight decay. Các phương trình cốt lõi cho AdamW có thể được biểu diễn như sau:
Phương trình cho momentum và tốc độ học thích nghi
Công thức cho ước lượng đã hiệu chỉnh độ chệch
Cập nhật tham số với weight decay tách biệt
Ở đây, η là tốc độ học, λ là hệ số weight decay, và θt đại diện cho các tham số. Hạng weight decay tách biệt λθt đảm bảo regularization được áp dụng độc lập với cập nhật gradient, đây là điểm khác biệt then chốt so với Adam.
Triển khai AdamW trong PyTorch
Triển khai AdamW trong PyTorch rất đơn giản; phần này cung cấp hướng dẫn toàn diện để thiết lập. Hãy làm theo các bước sau để học cách fine-tune mô hình hiệu quả với Adam Optimizer.
Hướng dẫn từng bước sử dụng AdamW trong PyTorch
Lưu ý: hướng dẫn này giả định bạn đã cài đặt PyTorch. Tham khảo Tài liệu để được hướng dẫn.
Bước 1: Import các thư viện cần thiết
Bước 2: Định nghĩa mô hình
Bước 3: Thiết lập siêu tham số
Bước 4: Khởi tạo optimizer AdamW và thiết lập hàm mất mát
Voila!
Giờ bạn đã sẵn sàng bắt đầu huấn luyện mô hình CNN của mình, và đó chính là việc chúng ta sẽ làm ở phần tiếp theo.
Ví dụ thực tế: Fine-tune mô hình bằng AdamW
Ở trên, chúng ta đã định nghĩa mô hình, thiết lập siêu tham số, khởi tạo optimizer (AdamW) và thiết lập hàm mất mát.
Để huấn luyện mô hình, chúng ta sẽ cần import thêm một vài mô-đun;
Tiếp theo, định nghĩa bộ dữ liệu và các dataloader. Trong ví dụ này, chúng ta sẽ sử dụng bộ dữ liệu CIFAR-10:
Vì chúng ta đã định nghĩa mô hình, bước tiếp theo là triển khai vòng lặp huấn luyện để tối ưu mô hình bằng AdamW.
Trông nó sẽ như sau:
Bước cuối cùng là kiểm định hiệu năng mô hình trên bộ dữ liệu validation mà chúng ta đã tạo trước đó.
Đây là đoạn mã:
Vậy là xong.
Giờ thì bạn đã biết cách triển khai AdamW trong PyTorch.
Các trường hợp sử dụng phổ biến của AdamW
Vậy là chúng ta đã xác nhận rằng AdamW trở nên phổ biến nhờ quản lý weight decay hiệu quả hơn so với tiền nhiệm Adam.
Nhưng những trường hợp sử dụng phổ biến của optimizer này là gì?
Chúng ta sẽ tìm hiểu trong phần này…
Mô hình học sâu quy mô lớn
AdamW đặc biệt hữu ích khi huấn luyện các mô hình lớn như BERT, GPT và các kiến trúc transformer khác. Những mô hình này thường có hàng triệu hoặc thậm chí hàng tỷ tham số, đòi hỏi các thuật toán tối ưu hóa hiệu quả có khả năng xử lý cập nhật trọng số phức tạp và thách thức về tổng quát hóa.
Các tác vụ thị giác máy tính và NLP
AdamW đã trở thành lựa chọn optimizer ưa thích trong các tác vụ thị giác máy tính với CNN và các tác vụ NLP với transformer. Khả năng ngăn overfitting khiến nó lý tưởng cho các tác vụ liên quan đến bộ dữ liệu lớn và kiến trúc phức tạp. Việc tách weight decay giúp AdamW tránh các vấn đề mà Adam gặp phải khi regularization quá mức mô hình.
Tinh chỉnh siêu tham số trong AdamW
Tinh chỉnh siêu tham số là quá trình lựa chọn giá trị tốt nhất cho các tham số chi phối quá trình huấn luyện của mô hình học máy nhưng không được học trực tiếp từ dữ liệu. Những tham số này ảnh hưởng trực tiếp đến cách mô hình tối ưu hóa và hội tụ.
Tinh chỉnh đúng các siêu tham số trong AdamW là thiết yếu để đạt hiệu quả huấn luyện, tránh overfitting và đảm bảo mô hình tổng quát hóa tốt với dữ liệu chưa thấy.
Trong phần này, chúng ta sẽ khám phá cách fine-tune các siêu tham số chính của AdamW để đạt hiệu năng tối ưu.
Thực hành tốt nhất khi chọn tốc độ học và weight decay
Tốc độ học là siêu tham số kiểm soát mức điều chỉnh trọng số mô hình theo gradient của mất mát ở mỗi bước huấn luyện. Tốc độ học cao giúp huấn luyện nhanh hơn nhưng có thể khiến mô hình vượt quá điểm tối ưu, trong khi tốc độ thấp cho phép điều chỉnh tinh hơn nhưng có thể khiến huấn luyện chậm hoặc mắc kẹt tại cực tiểu cục bộ.
Mặt khác, weight decay là kỹ thuật regularization dùng để ngăn overfitting bằng cách phạt các trọng số lớn trong mô hình. Cụ thể, weight decay thêm một khoản phạt nhỏ tỷ lệ với độ lớn trọng số trong quá trình huấn luyện, giúp giảm độ phức tạp mô hình và cải thiện khả năng tổng quát hóa với dữ liệu mới.
Để chọn tốc độ học và giá trị weight decay tối ưu cho AdamW:
Lời kết
AdamW đã nổi lên như một trong những optimizer hiệu quả nhất trong học sâu, đặc biệt với các mô hình quy mô lớn. Điều này là nhờ khả năng tách weight decay khỏi cập nhật gradient. Cụ thể, thiết kế của AdamW cải thiện regularization và giúp mô hình tổng quát hóa tốt hơn, nhất là khi làm việc với các kiến trúc phức tạp và bộ dữ liệu lớn.
Như đã minh họa trong hướng dẫn này, triển khai AdamW trong PyTorch rất đơn giản—chỉ cần một vài điều chỉnh so với Adam. Tuy nhiên, tinh chỉnh siêu tham số vẫn là bước then chốt để tối đa hóa hiệu quả của AdamW. Tìm được sự cân bằng phù hợp giữa tốc độ học và weight decay là điều cốt yếu để optimizer hoạt động hiệu quả mà không gây overfitting hay underfitting cho mô hình.
Giờ bạn đã biết đủ để triển khai AdamW trong các mô hình của riêng mình. Để tiếp tục học, hãy tham khảo một số tài nguyên sau: