Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sử dụng Gradient Descent với Autograd trong PyTorch
Trong bài này, mình sẽ tìm hiểu cách sử dụng công cụ autograd trong PyTorch để tính toán gradient một cách tự động. Đầu tiên, chúng ta sẽ triển khai thuật toán Linear Regression (Hồi quy tuyến tính) từ đầu mà không dùng thư viện hỗ trợ tính gradient. Sau đó, mình sẽ học cách PyTorch giúp tự động hoá công việc này thông qua Autograd.
Hồi quy tuyến tính thủ công trong Python
Trong ví dụ đầu tiên, chúng ta thực hiện các bước của gradient descent và backpropagation theo cách thủ công bằng cách sử dụng thư viện NumPy.
Mã nguồn Python:
import numpy as np # Hàm mô hình # f = w * x # Dữ liệu: với y = 2 * x X = np.array([1, 2, 3, 4], dtype=np.float32) Y = np.array([2, 4, 6, 8], dtype=np.float32) # Trọng số khởi tạo w = 0.0 # Hàm dự đoán def forward(x): return w * x # Hàm lỗi: Mean Squared Error (MSE) def loss(y, y_pred): return ((y_pred - y)**2).mean() # Gradient của hàm lỗi theo trọng số w # dJ/dw = 1/N * 2x(w*x - y) def gradient(x, y, y_pred): return np.dot(2*x, y_pred - y).mean() print(f'Dự đoán trước khi huấn luyện: f(5) = {forward(5):.3f}') # Huấn luyện mô hình learning_rate = 0.01 # Tốc độ học n_iters = 20 # Số lần lặp for epoch in range(n_iters): # Bước dự đoán (forward pass) y_pred = forward(X) # Tính toán lỗi l = loss(Y, y_pred) # Tính gradient dw = gradient(X, Y, y_pred) # Cập nhật trọng số w -= learning_rate * dw if epoch % 2 == 0: print(f'epoch {epoch+1}: w = {w:.3f}, loss = {l:.8f}') print(f'Dự đoán sau khi huấn luyện: f(5) = {forward(5):.3f}')
Kết quả kỳ vọng:
- Trọng số sẽ hội tụ về giá trị 2.0 sau quá trình huấn luyện.
- Dự đoán đầu ra sẽ tiến đến giá trị đúng là 10.0.
Sử dụng Autograd với PyTorch
PyTorch cung cấp công cụ autograd để tự động tính toán gradient, giúp bạn giảm thiểu việc lập trình thủ công phức tạp.
Bài viết này được đăng tại [free tuts .net]
Mã nguồn với PyTorch:
import torch # Mô hình: f = w * x X = torch.tensor([1, 2, 3, 4], dtype=torch.float32) Y = torch.tensor([2, 4, 6, 8], dtype=torch.float32) # Trọng số khởi tạo và yêu cầu tính gradient w = torch.tensor(0.0, dtype=torch.float32, requires_grad=True) # Hàm dự đoán def forward(x): return w * x # Hàm lỗi: Mean Squared Error (MSE) def loss(y, y_pred): return ((y_pred - y)**2).mean() print(f'Dự đoán trước khi huấn luyện: f(5) = {forward(5).item():.3f}') # Huấn luyện mô hình learning_rate = 0.01 # Tốc độ học n_iters = 100 # Số lần lặp for epoch in range(n_iters): # Bước dự đoán (forward pass) y_pred = forward(X) # Tính lỗi l = loss(Y, y_pred) # Backward pass: Tính gradient l.backward() # Cập nhật trọng số with torch.no_grad(): w -= learning_rate * w.grad # Xóa gradient sau khi cập nhật w.grad.zero_() if epoch % 10 == 0: print(f'epoch {epoch+1}: w = {w.item():.3f}, loss = {l.item():.8f}') print(f'Dự đoán sau khi huấn
Giải thích từng bước:
-
Tính toán dự đoán (forward pass):
Dùng hàm
forward(x)
để dự đoán kết quả dựa trên trọng số hiện tại. -
Tính lỗi (loss):
Hàm
loss(y, y_pred)
tính toán sự chênh lệch giữa giá trị thực tế và giá trị dự đoán . -
Tính gradient (backward pass):
Lệnh
l.backward()
tự động tính toán gradient và lưu trữ trongw.grad
. -
Cập nhật trọng số:
Gradient được sử dụng để cập nhật trọng số theo quy tắc gradient descent. Để cập nhật giá trị mà không ảnh hưởng đến
requires_grad=True
, bạn phải sử dụngtorch.no_grad()
. -
Xóa gradient:
Sau khi cập nhật trọng số, bạn cần xóa giá trị gradient cũ bằng
w.grad.zero_()
.
Kết bài
- Làm thủ công với NumPy: Bạn phải tự viết mọi bước, từ tính toán gradient đến cập nhật trọng số. Điều này dễ gây lỗi nếu mô hình phức tạp.
- Sử dụng Autograd: PyTorch tự động tính toán gradient, giảm khối lượng công việc và tăng độ chính xác.
Bài tiếp theo sẽ hướng dẫn cách xây dựng các mô hình phức tạp hơn bằng PyTorch. Hãy thực hành nhiều để hiểu rõ các bước này!
luyện: f(5) = {forward(5).item():.3f}')