
Tại sao Gradient Descent trở thành Stochastic Gradient Descent (GD) là một thuật toán tối ưu hóa được sử dụng rộng rãi để huấn luyện các mô hình học máy. Mục tiêu của thuật toán này là tìm tập hợp các tham số mô hình (trọng số và độ lệch) giúp giảm thiểu hàm mất mát (loss function). Hàm mất mát đo lường mức độ dự đoán của mô hình khớp với dữ liệu thực tế. GD hoạt động bằng cách tính toán gradient của hàm mất mát đối với từng tham số mô hình. Gradient cho biết hướng dốc nhất của hàm mất mát. Sau đó, thuật toán điều chỉnh các tham số theo hướng ngược lại với gradient, với một bước nhảy được kiểm soát bởi tốc độ học (learning rate). Quá trình này được lặp lại cho đến khi hàm mất mát hội tụ về mức tối thiểu cục bộ hoặc toàn cục. Có ba biến thể chính của GD: Batch Gradient Descent (BGD), Stochastic Gradient Descent (SGD) và Mini-Batch Gradient Descent (MBGD). **Batch Gradient Descent (BGD)** BGD tính toán gradient bằng cách sử dụng toàn bộ tập dữ liệu huấn luyện trong mỗi lần lặp. Điều này đảm bảo rằng gradient được tính toán chính xác và hướng cập nhật tham số là tối ưu. Tuy nhiên, đối với các tập dữ liệu lớn, BGD có thể rất chậm và tốn kém về mặt tính toán vì nó cần xử lý toàn bộ dữ liệu trước khi thực hiện một bước cập nhật tham số duy nhất. **Stochastic Gradient Descent (SGD)** SGD giải quyết vấn đề về hiệu quả của BGD bằng cách tính toán gradient và cập nhật các tham số mô hình chỉ dựa trên một mẫu dữ liệu huấn luyện duy nhất trong mỗi lần lặp. Điều này làm cho SGD nhanh hơn đáng kể so với BGD, đặc biệt đối với các tập dữ liệu lớn. Tuy nhiên, vì SGD chỉ sử dụng một mẫu dữ liệu tại một thời điểm, gradient được tính toán có thể nhiễu hơn và đường dẫn tối ưu hóa có thể dao động nhiều hơn. Điều này có thể dẫn đến sự hội tụ chậm hơn hoặc thậm chí là không hội tụ trong một số trường hợp. **Mini-Batch Gradient Descent (MBGD)** MBGD là sự kết hợp giữa BGD và SGD. Thay vì sử dụng toàn bộ tập dữ liệu hoặc chỉ một mẫu dữ liệu, MBGD tính toán gradient và cập nhật các tham số mô hình dựa trên một tập hợp con nhỏ của dữ liệu huấn luyện, được gọi là mini-batch. MBGD cân bằng giữa hiệu quả tính toán của SGD và độ ổn định của BGD. Nó nhanh hơn BGD vì nó không xử lý toàn bộ tập dữ liệu trong mỗi lần lặp, và ổn định hơn SGD vì nó sử dụng nhiều hơn một mẫu dữ liệu để tính toán gradient. **Tại sao Gradient Descent trở thành Stochastic** Sự phát triển của SGD là một phản ứng trực tiếp đối với những hạn chế của BGD, đặc biệt là khi đối mặt với các tập dữ liệu ngày càng lớn trong học máy hiện đại. Khi kích thước dữ liệu tăng lên, việc tính toán gradient trên toàn bộ tập dữ liệu trở nên không khả thi về mặt thời gian và tài nguyên. SGD, với khả năng cập nhật tham số nhanh chóng dựa trên từng mẫu dữ liệu, đã trở thành một giải pháp thay thế hấp dẫn. Mặc dù có tính nhiễu, nhưng tốc độ của SGD cho phép các mô hình học máy được huấn luyện hiệu quả hơn trên các tập dữ liệu khổng lồ. Hơn nữa, tính ngẫu nhiên của SGD đôi khi có thể giúp thoát khỏi các điểm cực tiểu cục bộ, dẫn đến các giải pháp tốt hơn. Ngày nay, MBGD thường là lựa chọn ưu tiên vì nó cung cấp sự cân bằng tối ưu giữa tốc độ và độ ổn định. Tuy nhiên, SGD vẫn là một khái niệm cơ bản và là nền tảng cho nhiều thuật toán tối ưu hóa tiên tiến hơn trong học sâu. Sự chuyển đổi từ BGD sang SGD và sau đó là MBGD phản ánh sự tiến hóa của các kỹ thuật tối ưu hóa để đáp ứng nhu cầu của các ứng dụng học máy ngày càng phức tạp và quy mô lớn.
Hành trình từng bước từ tối ưu hóa dựa trên giải tích đến Stochastic Gradient Descent Bài viết Why Gradient Descent Became Stochastic xuất hiện đầu tiên trên Towards Data Science.
Học máy (Machine Learning)
Vì sao Gradient Descent trở thành Stochastic
Hành trình từng bước từ tối ưu hóa dựa trên phép tính vi phân đến Stochastic Gradient Descent.
Nikhil Dasari
Ngày 29/5/2026
19 phút đọc
Chia sẻ
Ảnh: Sami TÜRK
Trong bài viết này, chúng ta sẽ thảo luận không chỉ về cách thức mà còn về lý do sử dụng gradient descent và stochastic gradient descent.
Chúng ta đã biết về hồi quy tuyến tính, và gần đây tôi đã viết về nó trong bối cảnh các vectơ và phép chiếu.
Bây giờ, chúng ta sẽ cố gắng hiểu gradient descent với sự hỗ trợ của một bài toán hồi quy tuyến tính.
Nhưng trước đó, tôi chỉ muốn nhắc lại ngắn gọn những gì chúng ta đã biết về hồi quy tuyến tính và toán học đằng sau nó, để bất kỳ ai mới bắt đầu cũng dễ dàng theo dõi.
Nếu bạn đã biết toán học cơ bản đằng sau hồi quy tuyến tính, thì bạn có thể bắt đầu trực tiếp từ phần có tiêu đề "Tại sao chúng ta cần Gradient Descent?".
Giả sử chúng ta bắt đầu hành trình học máy của mình, và điều đầu tiên chúng ta làm là triển khai một mô hình hồi quy tuyến tính bằng Python.
Chúng ta đã triển khai thành công và có được các giá trị tốt nhất cho hệ số góc và hệ số chặn.
Bây giờ chúng ta có một câu hỏi: Điều gì thực sự đang xảy ra đằng sau thuật toán này?
Chúng ta muốn hiểu toán học đằng sau nó.
Tóm tắt về hồi quy tuyến tính
Để làm được điều đó, hãy xem xét dữ liệu này.
Ảnh: Tác giả
Bây giờ, chúng ta muốn hiểu toán học đằng sau thuật toán.
Ảnh: Tác giả
Chúng ta gặp các công thức này cho hệ số góc và hệ số chặn.
\[
\beta_1 = \frac{\sum_{i=1}^{n} (x_i – \bar{x})(y_i – \bar{y})}{\sum_{i=1}^{n} (x_i – \bar{x})^2}
\]
\[
\beta_0 = \bar{y} – \beta_1\bar{x}
\]
Bây giờ, bằng cách sử dụng các công thức này, chúng ta tính toán hệ số góc và hệ số chặn.
Phương trình hồi quy tuyến tính đơn giản là:
\[
\hat{y}
=
\beta_0+\beta_1x
\]
Công thức hệ số góc là:
\[
\beta_1
=
\frac{
\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})
}{
\sum_{i=1}^{n}(x_i-\bar{x})^2
}
\]
Công thức hệ số chặn là:
\[
\beta_0
=
\bar{y}
–
\beta_1\bar{x}
\]
Tập dữ liệu là:
\[
x=
[1.2,1.4,1.6,2.1,2.3,3.0,3.1,3.3,3.3,3.8]
\]
\[
y=
[39344,46206,37732,43526,39892,56643,60151,54446,64446,57190]
\]
Tính giá trị trung bình của x:
\[
\bar{x}
=
\frac{1.2+1.4+1.6+2.1+2.3+3.0+3.1+3.3+3.3+3.8}{10}
\]
\[
\bar{x}
=
\frac{25.1}{10}
=
2.51
\]
Tính giá trị trung bình của y:
\[
\bar{y}
=
\frac{
39344+46206+37732+43526+39892+56643+60151+54446+64446+57190
}{10}
\]
\[
\bar{y}
=
\frac{499576}{10}
=
49957.6
\]
Bây giờ tính:
\[
\sum(x_i-\bar{x})(y_i-\bar{y})
\]
Sau khi thay thế và tính toán:
\[
\sum(x_i-\bar{x})(y_i-\bar{y})
=
41663.44
\]
Bây giờ tính:
\[
\sum(x_i-\bar{x})^2
\]
Sau khi tính toán:
\[
\sum(x_i-\bar{x})^2
=
4.619
\]
Bây giờ tính hệ số góc:
\[
\beta_1
=
\frac{41663.44}{4.619}
\]
\[
\beta_1
=
9020.66
\]
Bây giờ tính hệ số chặn:
\[
\beta_0
=
49957.6-(9020.66)(2.51)
\]
\[
\beta_0
=
27315.74
\]
Do đó:
\[
\beta_0=27315.74
\]
\[
\beta_1=9020.66
\]
Phương trình hồi quy cuối cùng:
\[
\hat{y}
=
27315.74+9020.66x
\]
Chúng ta đã có các giá trị bằng cách sử dụng các công thức, nhưng chúng ta chưa hài lòng và muốn tìm hiểu sâu hơn.
Bây giờ mục tiêu của chúng ta là tìm hiểu cách chúng ta có được các công thức này.
Để hiểu điều đó, chúng ta sẽ xem một đường cong hình bát 3D. Chúng ta có đường cong hình bát đó khi chúng ta vẽ tất cả các kết hợp có thể có của β0\beta_0, β1\beta_1 và sai số bình phương trung bình (MSE).
Ảnh: Tác giả
Bây giờ, nhìn vào đường cong, chúng ta hiểu rằng chúng ta cần sai số bình phương trung bình càng thấp càng tốt, và nó đạt đến mức tối thiểu khi gradient bằng 0.
Chúng ta đã biết rằng để tìm độ dốc của bất kỳ đường cong nào, chúng ta cần phép vi phân.
Tiếp theo, chúng ta thực hiện phép vi phân trên hàm mất mát (loss function), vì đường cong hình bát là biểu diễn 3D của nó, và chúng ta nhận thấy ở đây có hai biến.
Vì vậy, chúng ta thực hiện phép vi phân riêng phần và sau đó giải tiếp để có được các công thức cho độ dốc và hệ số chặn.
**Thiết lập các công thức cho độ dốc và hệ số chặn**
Bắt đầu với hàm mất mát Bình phương sai số trung bình (MSE):
\[
MSE(\beta_0,\beta_1)
=
\frac{1}{n}
\sum_{i=1}^{n}
(y_i-(\beta_0+\beta_1x_i))^2
\]
Sắp xếp lại biểu thức bên trong:
\[
=
\frac{1}{n}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)^2
\]
Bây giờ lấy đạo hàm riêng theo \( \beta_0 \):
\[
\frac{\partial MSE}{\partial \beta_0}
=
\frac{\partial}{\partial \beta_0}
\left(
\frac{1}{n}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)^2
\right)
\]
Đưa hằng số ra ngoài:
\[
=
\frac{1}{n}
\frac{\partial}{\partial \beta_0}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)^2
\]
Đưa đạo hàm vào trong tổng:
\[
=
\frac{1}{n}
\sum_{i=1}^{n}
\frac{\partial}{\partial \beta_0}
(y_i-\beta_0-\beta_1x_i)^2
\]
Áp dụng quy tắc chuỗi:
\[
=
\frac{1}{n}
\sum_{i=1}^{n}
2(y_i-\beta_0-\beta_1x_i)
\cdot
\frac{\partial}{\partial \beta_0}
(y_i-\beta_0-\beta_1x_i)
\]
Áp dụng các quy tắc đạo hàm:
\[
\frac{d}{d\beta_0}(y_i)=0
\]
\[
\frac{d}{d\beta_0}(-\beta_0)=-1
\]
\[
\frac{d}{d\beta_0}(-\beta_1x_i)=0
\]
Vậy đạo hàm bên trong trở thành:
\[
\frac{\partial}{\partial \beta_0}
(y_i-\beta_0-\beta_1x_i)
=
-1
\]
Thay thế trở lại:
\[
\frac{\partial MSE}{\partial \beta_0}
=
\frac{1}{n}
\sum_{i=1}^{n}
2(y_i-\beta_0-\beta_1x_i)(-1)
\]
Đơn giản hóa:
\[
=
-\frac{2}{n}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)
\]
Đặt đạo hàm bằng 0:
\[
-\frac{2}{n}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)
=
0
\]
Nhân cả hai vế với:
\[
-\frac{n}{2}
\]
\[
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)
=
0
\]
Khai triển:
\[
\sum_{i=1}^{n}y_i
–
n\beta_0
–
\beta_1\sum_{i=1}^{n}x_i
=
0
\]
Sắp xếp lại:
\[
n\beta_0
=
\sum_{i=1}^{n}y_i
–
\beta_1\sum_{i=1}^{n}x_i
\]
Chia cho \( n \):
\[
\beta_0
=
\frac{1}{n}\sum_{i=1}^{n}y_i
–
\beta_1
\frac{1}{n}\sum_{i=1}^{n}x_i
\]
Sử dụng giá trị trung bình:
\[
\bar{x}
=
\frac{1}{n}\sum_{i=1}^{n}x_i
\]
\[
\bar{y}
=
\frac{1}{n}\sum_{i=1}^{n}y_i
\]
Công thức hệ số chặn cuối cùng:
\[
\beta_0
=
\bar{y}
–
\beta_1\bar{x}
\]
Bây giờ lấy đạo hàm riêng theo \( \beta_1 \):
\[
\frac{\partial MSE}{\partial \beta_1}
=
\frac{\partial}{\partial \beta_1}
\left(
\frac{1}{n}
\sum_{i=1}^{n}
(y_i-\beta_0-\beta_1x_i)^2
\right)
\]




Nguồn tin: Towards Data Science — Tác giả: Nikhil Dasari. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.