Thuật toán Gradient Descent cho Linear Regression
Machine Learning cơ bản với NumPy

Danh sách bài học
Thuật toán Gradient Descent cho Linear Regression
Nội dung bài viết Học nhanh
Dẫn nhập
Trong bài trước, chúng ta đã tìm hiểu về HÀM J(θ) CHO LINEAR REGRESSION.
Ở bài này Kteam sẽ giới thiệu đến các bạn Thuật toán Gradient Descent cho Linear Regression.
Nội dung
Để theo dõi bài này tốt nhất bạn cần có kiến thức về:
- LẬP TRÌNH PYTHON CƠ BẢN
- GIỚI THIỆU MACHINE LEARNING VÀ CÀI ĐẶT NUMPY
- MA TRẬN VÀ VECTOR VỚI NUMPY
- LINEAR REGRESSION VÀ HÀM hθ(x) CHO LINEAR REGRESSION.
Trong bài này chúng ta sẽ cùng tìm hiểu về:
- Gradient Descent là gì?
- Công thức Gradient Descent.
- Công thức Gradient Descent cho Linear Regression.
- Lập trình Gradient Descent cho Linear Regression.
- Lưu ý về Gradient Descent.
Gradient Descent là gì ?
Qua các bài trước, chúng ta đã biết được cách dự đoán kết quả với parameter có sẵn, đánh giá được độ chính xác của bộ parameter đó. Gradient Descent chính là thuật toán được sử dụng để “tìm” ra bộ parameter trong những bài trước.
Như trong bài HÀM J(θ) CHO LINEAR REGRESSION mà Kteam đã giới thiệu, nếu ta vẽ biểu đồ của hàm J(θ) của Linear Regression, ta sẽ được biểu đồ lõm:
Nhiệm vụ của thuật toán Gradient Descent là giảm J(θ) xuống nhỏ nhất, với biểu đồ trên thì cũng đồng nghĩa với việc tìm đường đến nơi thấp nhất trong biểu đồ.
Cách thuật toán thực hiện là dùng giải tích để tính độ dốc (slope) của điểm hiện tại trên biểu đồ rồi di chuyển đến nơi thấp hơn từng bước một.
Bộ parameter Theta tối ưu nhất sẽ nằm tại nơi có J(θ) thấp nhất. Gradient Descent sẽ dừng lại khi đến điểm thấp nhất.
Công thức Gradient Descent
Gradient Descent sử dụng phương pháp giải tích để tìm parameter Theta, công thức chung của Gradient Descent là:
Nhìn chung, Gradient Descent sẽ điều chỉnh parameter Theta theo với:
là độ lớn của các bước giảm.
là đạo hàm của hàm J(θ), có tác dụng tính độ dốc của điểm hiện tại. Nếu độ dốc lớn sẽ thay đổi nhiều, đến khi slope = 0, điểm trũng, thấp nhất của hàm J(θ).
Toàn bộ thuật toán sẽ là:
Repeat until <reach minimum> {
}
Qua mỗi vòng lặp Gradient Descent, J(θ) ngày càng chính xác hơn.
Gradient Descent cho Linear Regression
Kteam đã tính sẵn công thức Gradient Descent cho các bạn. Nếu bạn biết giải tích, bạn cũng có thể tự mình giải .
Công thức:
Để tiện hơn cho việc lập trình, ta có thể rút gọn thành:
Vì khi nhân ma trận, kết quả sẽ là tổng của các tích nên chúng ta không cần sử dụng tổng nữa.
Lập trình Gradient Descent
Trong bài này chúng ta chỉ làm việc với Univariate Problem vì ở Multivariate Problem ta sẽ cần làm thêm một bước là feature normalize, Kteam sẽ hướng dẫn trong bài sau.
Import data
Kteam đã cung cấp sẵn resource của bài viết này tại:
Tương tự các bài trước, đầu tiên ta sẽ load raw data, sau đó tách riêng X và y.
Gradient Descent
Bây giờ chúng ta sẽ lập trình một hàm riêng để thực hiện :
Variables
Set các biến cần dùng:
Gradient Descent loop
Bắt đầu vòng lặp của Gradient Descent:
Vậy là xong phần Gradient Descent cơ bản, nhưng để thuật toán tốt hơn, ta sẽ tự động dừng lại khi đạt đến điểm tối ưu. Cách nhận biết là khi qua một vòng lặp nhưng J(θ) không thay đổi nhiều (Kteam chọn mốc là <10-15).
Break check
Save history
Vậy là đã xong thuật toán Gradient Descent, nếu bạn muốn debug kĩ hơn nữa, bạn có thể ghi lại quá trình thay đổi của J(θ) trong vòng lặp:
Return
Sau cùng, trả về kết quả
Sử dụng Gradient Descent function
Ở trên chúng ta đã load và chia data. Bây giờ sẽ là bước sử dụng Gradient Descent để train – tìm theta.
Khi đã có được parameter Theta, ta có thể dự đoán như những bài trước.
Vẽ biểu đồ hàm J(θ)
Để debug, bạn có thể vẽ hàm J(θ) như sau:
Bonus: progress bar
Khi train data, có thể bạn đặt iter quá lớn khiến cho việc chờ đợi dễ nản, vô vọng. Vì thế, bạn có thể define thêm một hàm để in progress bar để biết được tiến độ train:
Sử dụng
Để sử dụng, chỉ cần dùng hàm trong mỗi vòng lặp:
Source code
- File functions.py
- File main.py
Lưu ý về Gradient Descent
Gradient Descent chỉ có thể tìm đến chỗ trũng gần nhất. Nếu các loại hàm J(θ) có nhiều chỗ trũng thì có thể bạn sẽ không tìm được Theta tối ưu nhất.
Gradient Descent cần có một phù hợp. Nếu quá bé sẽ khiến Gradient Descent rất chậm, nếu quá lớn Gradient Descent sẽ bước quá chỗ trũng dẫn đến không bao giờ tới được chỗ trũng.
Resources
Các bạn có thể download các file text được sử dụng trong bài viết tại:
Kết luận
Qua bài này chúng ta đã cùng nhau tìm hiểu về thuật toán Gradient Descent cho Linear Regression.
Ở bài sau, Kteam sẽ giới thiệu về FEATURE NORMALIZE VÀ GRADIENT DESCENT CHO MULTIVARIATE PROBLEM.
Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Thuật toán Gradient Descent cho Linear Regression dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Khóa học
Machine Learning cơ bản với NumPy
Với mục đích giới thiệu đến mọi người về Machine Learning cũng như tạo điểm khởi đầu cho các bạn mới, muốn tham gia và tìm hiểu ban đầu về lĩnh vực khá hot này. Cùng Kteam tìm hiểu về Machine Learning cơ bản với ngôn ngữ Python.
Thông qua khóa học MACHINE LEARNING VỚI NUMPY, Kteam sẽ hướng dẫn các kiến thức cơ bản của thuật toán Machine Learning để các bạn có thể tạo ra những sản phẩm Machine Learning của riêng mình.
Mình nghĩ Gradient Descent mình có thể sửa hàm lại đưa vào 2 giá trị alpha-max và alpha-min, alpha-max chạy đầu tiên, nếu J sau lớn hơn J trước sẽ thực hiện chia đôi alpha cho đến khi đạt đến giới hạn alpha-min thì thoát vòng lặp. Như vậy Gradient Descent có thể sẽ chạy nhanh hơn và lại còn chính xác hơn phải không?!
Bạn ơi cho mình hỏi là liệu có cách nào để tìm được alpha tối ưu không nhỉ? (như là làm sao mà trong bài 5 bạn tìm được alpha = 0.02 ấy)
À với lại là mình có thử thay phần data của bài 4 vào á(chỉ thay data bài 5 bằng data bài 4 thôi, không thay đổi gì hết) nhưng mà kết quả nhận được thì thấy không đúng lắm, có bạn nào biết tại sao không ạ, giúp mình với.
Mình cảm ơn ạ!
cho mình hỏi là mình code giống bạn nhưng lúc chạy main thì nó chạy ra lỗi
RuntimeWarning: overflow encountered in square
sqr_error=(predicted- y) ** 2
Reach optima at I = 16 ; J = inf
giải thích giúp mình với
mình cảm ơn
Bạn cho mình hỏi, formula phần "Gradient Descent cho Linear Regression". Có phải nó áp dụng được tất cả dạng Linear không bạn, như y = ax + bx + cz^2 chẳng hạn. Thanks bạn.
Thấy có cách dùng ma trận để tìm theta khá nhanh mà k cần dùng đến vòng lặp...mk nghĩ kteam nên update