Chuyển đến nội dung chính

Gradient Descent và tối ưu mô hình

Gradient Descent, hay thuật toán hạ gradient, là một trong những thuật toán tối ưu quan trọng nhất của Machine Learning và Deep Learning. Nếu Backpropagation trả lời câu hỏi “mỗi tham số ảnh hưởng đến sai số bao nhiêu?”, thì Gradient Descent sử dụng chính các gradient đó để quyết định tham số cần thay đổi theo hướng nào.

Từ hồi quy tuyến tính đến mạng nơ-ron, CNN, Transformer hay các mô hình ngôn ngữ lớn, ý tưởng cốt lõi vẫn giống nhau: xác định hướng làm hàm mất mát tăng nhanh nhất, sau đó đi theo hướng ngược lại để giảm sai số.

Tóm tắt nội dung
  • Gradient Descent cập nhật tham số theo công thức θ ← θ − η∇L(θ).
  • Gradient cho biết hướng tăng nhanh nhất của hàm mất mát, vì vậy ta đi theo hướng âm của gradient.
  • Learning rate quyết định kích thước mỗi bước cập nhật và ảnh hưởng trực tiếp đến độ ổn định của quá trình học.
  • Batch Gradient Descent, SGD và Mini-batch Gradient Descent khác nhau chủ yếu ở lượng dữ liệu dùng để ước lượng gradient mỗi bước.
Gradient Descent tìm điểm có hàm mất mát thấp Tham số θ Loss L(θ) Khởi tạo Loss thấp Quy tắc cập nhật θ ← θ − η∇L(θ)
Gradient Descent cập nhật tham số từng bước theo hướng làm hàm mất mát giảm.

Bài toán tối ưu phía sau Machine Learning

Một mô hình Machine Learning thường có một tập tham số cần học. Với hồi quy tuyến tính, đó là các hệ số của đường thẳng hoặc siêu phẳng. Với mạng nơ-ron, đó có thể là hàng triệu hoặc hàng tỷ trọng số và bias.

Ta ký hiệu toàn bộ tham số bằng θ. Mục tiêu của quá trình huấn luyện là tìm bộ tham số làm hàm mất mát nhỏ nhất:

θ* = arg minθ L(θ)

Trong đó L(θ) là hàm mất mát biểu diễn mức độ sai của mô hình. Nếu L lớn, dự đoán đang kém; nếu L nhỏ, mô hình phù hợp với dữ liệu huấn luyện hơn theo tiêu chí đã chọn.

Vấn đề là ta thường không thể thử mọi giá trị có thể của θ. Ngay cả một mạng nhỏ với vài nghìn tham số cũng tạo ra không gian tìm kiếm khổng lồ. Gradient Descent giải quyết vấn đề bằng cách sử dụng thông tin về độ dốc tại vị trí hiện tại để chọn bước đi tiếp theo.

Ý tưởng quan trọng: Gradient Descent không cần biết trước vị trí của nghiệm tối ưu. Nó chỉ cần biết tại vị trí hiện tại nên di chuyển theo hướng nào để loss giảm.

Gradient cho biết điều gì?

Để hiểu Gradient Descent, trước tiên cần hiểu gradient. Với một hàm chỉ có một biến, ta sử dụng đạo hàm:

dL / dθ

Đạo hàm cho biết L thay đổi như thế nào khi θ thay đổi một lượng rất nhỏ. Nếu đạo hàm dương, tăng θ làm L tăng cục bộ; nếu đạo hàm âm, tăng θ có xu hướng làm L giảm.

Trong Machine Learning, mô hình thường có nhiều tham số. Khi đó ta sử dụng vector gradient:

∇L(θ) = [∂L/∂θ1, ∂L/∂θ2, ..., ∂L/∂θn]

Gradient chỉ theo hướng mà hàm tăng nhanh nhất tại điểm hiện tại. Vì mục tiêu của chúng ta là giảm loss, Gradient Descent đi theo hướng ngược gradient:

θ ← θ − η∇L(θ)

Trong công thức này, η là tốc độ học (learning rate). Nó kiểm soát khoảng cách mà thuật toán di chuyển trong mỗi lần cập nhật.

Một ví dụ rất đơn giản

Giả sử cần tối thiểu hóa hàm:

L(w) = (w − 3)2

Hàm này có giá trị nhỏ nhất tại w = 3. Đạo hàm theo w là:

dL/dw = 2(w − 3)

Giả sử ban đầu w = 0 và η = 0.1. Gradient tại w = 0 bằng −6. Ta cập nhật:

w = 0 − 0.1 × (−6) = 0.6

Ở bước tiếp theo, gradient bằng 2(0.6 − 3) = −4.8, vì vậy w tiếp tục tăng về phía 3. Sau nhiều lần lặp, w tiến ngày càng gần điểm cực tiểu.

Learning rate quyết định bước đi lớn hay nhỏ

Learning rate là một trong những siêu tham số quan trọng nhất trong quá trình huấn luyện. Nó quyết định mức độ thay đổi của tham số sau mỗi lần tính gradient.

Learning rate Hành vi thường gặp Rủi ro
Quá nhỏ Tham số thay đổi rất ít mỗi bước Huấn luyện chậm
Phù hợp Loss giảm tương đối ổn định Thường cần điều chỉnh theo bài toán
Quá lớn Các bước nhảy mạnh qua vùng tối ưu Loss dao động hoặc phân kỳ

Có thể hình dung việc tối ưu giống như đi xuống một thung lũng. Nếu bước quá nhỏ, ta vẫn đi đúng hướng nhưng mất rất nhiều thời gian. Nếu bước quá lớn, ta có thể nhảy từ sườn này sang sườn kia và không tiến gần đáy.

Ảnh hưởng của learning rate trong Gradient Descent Quá nhỏ Phù hợp Quá lớn Đúng hướng nhưng chậm Tiến nhanh về vùng loss thấp Dao động, có thể phân kỳ

Trong các mô hình hiện đại, learning rate cũng có thể thay đổi trong quá trình huấn luyện thông qua learning rate scheduler. Một chiến lược phổ biến là sử dụng learning rate tương đối lớn ở giai đoạn đầu rồi giảm dần để thực hiện các bước tinh chỉnh nhỏ hơn về sau.

Batch Gradient Descent, SGD và Mini-batch khác nhau ở đâu?

Công thức Gradient Descent khá đơn giản, nhưng câu hỏi thực tế là: cần dùng bao nhiêu mẫu dữ liệu để tính gradient trước mỗi lần cập nhật? Từ đó xuất hiện ba cách triển khai chính.

Batch Gradient Descent

Batch Gradient Descent sử dụng toàn bộ tập huấn luyện để tính gradient trước khi cập nhật tham số:

∇L(θ) = (1/N) Σi=1N ∇Li(θ)

Gradient thu được ổn định vì phản ánh toàn bộ dữ liệu. Tuy nhiên, nếu dataset rất lớn, mỗi bước cập nhật trở nên tốn thời gian và bộ nhớ.

Stochastic Gradient Descent

Stochastic Gradient Descent, thường viết tắt là SGD, trong nghĩa nguyên thủy sử dụng một mẫu để ước lượng gradient rồi cập nhật ngay:

θ ← θ − η∇Li(θ)

Việc cập nhật thường xuyên giúp thuật toán tiến nhanh nhưng gradient có độ nhiễu cao. Đường tối ưu vì thế không đi mượt mà như Batch Gradient Descent.

Mini-batch Gradient Descent

Trong Deep Learning, lựa chọn phổ biến nhất là Mini-batch Gradient Descent. Ta chia dữ liệu thành các batch nhỏ, chẳng hạn B mẫu, rồi tính gradient trung bình trên mỗi batch:

∇Lbatch(θ) = (1/B) Σi∈batch ∇Li(θ)

Mini-batch tạo ra sự cân bằng giữa tính ổn định và hiệu quả tính toán. Các phép toán ma trận trên batch cũng tận dụng tốt khả năng xử lý song song của GPU.

Phương pháp Dữ liệu mỗi bước Đặc điểm Ứng dụng
Batch GD Toàn bộ dataset Gradient ổn định nhưng bước cập nhật đắt Dataset nhỏ hoặc bài toán tối ưu đơn giản
SGD Một mẫu Cập nhật nhanh, gradient nhiễu Một số bài toán online hoặc streaming
Mini-batch Một nhóm mẫu Cân bằng tốc độ và độ ổn định Deep Learning hiện đại
Lưu ý về thuật ngữ: trong nhiều thư viện Deep Learning, optimizer mang tên SGD vẫn thường được sử dụng cùng mini-batch. Vì vậy, “SGD” trong thực hành đôi khi được dùng theo nghĩa rộng hơn định nghĩa một-mẫu cổ điển.

Tự cài đặt Gradient Descent bằng Python

Ta có thể quan sát trực tiếp quá trình tối ưu bằng bài toán đơn giản L(w) = (w − 3)2. Chương trình dưới đây bắt đầu từ w = −5 và liên tục cập nhật tham số theo gradient.

# Hàm mất mát: L(w) = (w - 3)^2

def loss(w):
    return (w - 3) ** 2


def gradient(w):
    return 2 * (w - 3)


w = -5.0
learning_rate = 0.1

for step in range(20):
    grad = gradient(w)

    # Gradient Descent update
    w = w - learning_rate * grad

    print(
        f"Step {step + 1:2d} | "
        f"w = {w:.4f} | "
        f"loss = {loss(w):.6f}"
    )

Sau mỗi bước, w tiến gần hơn tới 3 và giá trị loss giảm dần. Đây chính là Gradient Descent ở dạng cơ bản nhất: tính gradient, nhân với learning rate và trừ kết quả khỏi tham số hiện tại.

Trong mạng nơ-ron, nguyên lý không thay đổi. Điểm khác biệt là thay vì một biến w, ta có một vector hoặc tập tensor chứa rất nhiều tham số.

Gradient Descent cho hồi quy tuyến tính

Một ví dụ gần với Machine Learning hơn là học mô hình:

ŷ = wx + b

Ta sử dụng Mean Squared Error làm hàm mất mát và tính gradient theo w, b.

import numpy as np

# Dữ liệu gần với y = 2x + 1
X = np.array([1., 2., 3., 4., 5.])
y = np.array([3., 5., 7., 9., 11.])

w = 0.0
b = 0.0
lr = 0.01

n = len(X)

for epoch in range(2000):

    # Forward
    y_hat = w * X + b

    error = y_hat - y

    # Gradient của MSE
    dw = (2 / n) * np.sum(error * X)
    db = (2 / n) * np.sum(error)

    # Cập nhật tham số
    w -= lr * dw
    b -= lr * db

mse = np.mean((w * X + b - y) ** 2)

print("w =", round(w, 4))
print("b =", round(b, 4))
print("MSE =", round(mse, 8))

Vì dữ liệu trong ví dụ được tạo chính xác theo y = 2x + 1, quá trình tối ưu sẽ đưa w tiến gần 2 và b tiến gần 1. Đây là một ví dụ rõ ràng về việc mô hình học tham số từ dữ liệu thay vì chúng ta tự gán hệ số.

Gradient Descent liên hệ với Backpropagation như thế nào?

Backpropagation và Gradient Descent thường xuất hiện cùng nhau trong mạng nơ-ron nhưng không phải cùng một thuật toán.

Một bước huấn luyện điển hình có thể mô tả bằng bốn giai đoạn:

1. Forward
Tạo dự đoán
→
2. Loss
Đo sai số
→
3. Backpropagation
Tính gradient
→
4. Optimizer
Cập nhật tham số

Backpropagation thực hiện bước thứ ba: tính ∂L/∂θ cho các tham số. Gradient Descent hoặc một optimizer dựa trên gradient thực hiện bước thứ tư.

Cách nhớ: Backpropagation trả lời “gradient là bao nhiêu?”. Gradient Descent trả lời “dùng gradient đó để thay đổi tham số như thế nào?”.

Trong PyTorch, sự phân chia này thể hiện rất rõ:

optimizer.zero_grad()

y_hat = model(X)
loss = criterion(y_hat, y)

loss.backward()      # Backpropagation: tính gradient
optimizer.step()     # Optimizer: cập nhật tham số

Tại sao còn cần Momentum và Adam?

Gradient Descent cơ bản chỉ sử dụng gradient hiện tại. Trong các bề mặt loss phức tạp, cách cập nhật này có thể tiến chậm, dao động mạnh theo một số hướng hoặc yêu cầu lựa chọn learning rate rất cẩn thận.

Vì vậy, nhiều thuật toán tối ưu hiện đại mở rộng ý tưởng Gradient Descent thay vì loại bỏ nó.

Momentum

Momentum duy trì một đại lượng tích lũy từ các gradient trước đó. Nếu gradient liên tục chỉ theo một hướng, momentum giúp quá trình tối ưu tăng tốc theo hướng đó.

vt = βvt−1 + ∇L(θt)
θt+1 = θt − ηvt

Adam

Adam sử dụng thống kê động của cả gradient bậc nhất và bình phương gradient để tạo learning rate hiệu dụng riêng cho từng tham số. Điều này giúp Adam thường dễ sử dụng trong nhiều bài toán Deep Learning, mặc dù lựa chọn optimizer tốt nhất vẫn phụ thuộc vào mô hình và mục tiêu huấn luyện.

Điểm cần nhớ là Momentum, RMSProp hay Adam vẫn dựa trên gradient. Chúng khác Gradient Descent cơ bản chủ yếu ở cách biến gradient thành bước cập nhật tham số.

Những vấn đề thường gặp khi tối ưu

Trong mạng nơ-ron, hàm mất mát có thể có không gian tham số rất nhiều chiều. Vì vậy, hình ảnh một quả bóng đơn giản lăn xuống đáy parabol chỉ là mô hình trực quan hóa, không phải mô tả đầy đủ bề mặt tối ưu thực tế.

  • Learning rate quá lớn: loss có thể dao động mạnh hoặc tăng thay vì giảm.
  • Learning rate quá nhỏ: quá trình học ổn định nhưng rất chậm.
  • Gradient biến mất: gradient ở một số tầng trở nên quá nhỏ, khiến tham số gần như không được cập nhật.
  • Gradient bùng nổ: gradient có độ lớn quá cao, dẫn đến bước cập nhật không ổn định.
  • Vùng phẳng: gradient gần 0 có thể khiến quá trình tối ưu tiến rất chậm dù chưa đạt nghiệm tốt.
  • Điểm yên ngựa: gradient có thể gần 0 nhưng điểm đó không phải cực tiểu.

Ngoài optimizer, hiệu quả huấn luyện còn phụ thuộc vào khởi tạo trọng số, chuẩn hóa dữ liệu, kiến trúc mạng, kích thước batch, hàm kích hoạt và cách điều chỉnh learning rate.

Một hiểu nhầm cần tránh: Gradient Descent không đảm bảo tìm được nghiệm tối ưu toàn cục cho mọi bài toán. Với hàm lồi, điều kiện hội tụ dễ phân tích hơn; còn mạng nơ-ron sâu thường tạo ra bài toán tối ưu phi lồi và phức tạp hơn nhiều.

Gradient Descent trong NLP và Computer Vision

Trong xử lý ngôn ngữ tự nhiên, Gradient Descent được sử dụng để học embedding, trọng số attention, các tầng feed-forward và các tham số khác của mô hình Transformer. Khi mô hình dự đoán token hoặc nhãn sai, gradient chỉ ra cách những tham số này nên được điều chỉnh.

Trong Computer Vision, cùng nguyên lý được áp dụng cho kernel của CNN, trọng số của Vision Transformer, mạng phân đoạn ảnh hoặc mô hình phát hiện đối tượng. Loss có thể khác nhau nhưng vòng lặp tối ưu cơ bản vẫn tương tự.

NLP: văn bản → mô hình → dự đoán token/nhãn → loss → gradient → cập nhật tham số.

Computer Vision: ảnh → mô hình → dự đoán lớp/hộp/mask → loss → gradient → cập nhật tham số.

Sự khác nhau nằm ở dữ liệu, kiến trúc và hàm mất mát. Cơ chế tối ưu dựa trên gradient vẫn là nền tảng chung cho rất nhiều mô hình học sâu.

Kết luận

Gradient Descent biến việc huấn luyện mô hình thành một quá trình lặp có hệ thống: tính gradient, chọn bước đi và cập nhật tham số theo hướng giảm loss. Công thức θ ← θ − η∇L(θ) đơn giản nhưng là nền tảng của phần lớn các thuật toán tối ưu dùng trong Machine Learning hiện đại.

Khi kết hợp với Backpropagation, ta có bức tranh hoàn chỉnh của quá trình học trong mạng nơ-ron: Backpropagation tính gradient, còn Gradient Descent và các optimizer như SGD, Momentum hoặc Adam sử dụng gradient đó để thay đổi mô hình.

© The CS Note · THE CS NOTE

Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.

Nguồn gốc: Gradient Descent và tối ưu mô hình

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...