Thuật toán Gradient Descent cho Linear Regression

Machine Learning cơ bản với NumPy

5.0 (3 đánh giá)
Tạo bởi Huy Trịnh Cập nhật lần cuối 5 năm trước 26.044 lượt xem 17 bình luận
Tác giả/Dịch giả: Huy Trịnh
Học nhanh

Danh sách bài học

Thuật toán Gradient Descent cho Linear Regression

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ề:

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:

Gradient Descent, Python, Kteam, Howkteam

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.

Gradient Descent, Python, Kteam, Howkteam

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à:

\theta := \theta - \alpha \frac{\partial }{\partial \theta}J(\theta)

Nhìn chung, Gradient Descent sẽ điều chỉnh parameter Theta theo \alpha \frac{\partial }{\partial \theta}J(\theta) với:

  • \alpha là độ lớn của các bước giảm.
  • \frac{\partial }{\partial \theta}J(\theta) 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> {

\theta:= \theta - \alpha \frac{\partial }{\partial \theta}J(\theta)

}

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  \frac{\partial }{\partial \theta}J(\theta).

Công thức:

\theta:= \theta - \frac{\alpha}{m}\sum_{1}^{m}((h_{\theta}(X)-y)*X)

Để tiện hơn cho việc lập trình, ta có thể rút gọn \sum_{1}^{m}((h_{\theta}(X)-y)*X) thành:

\theta:= \theta - \frac{\alpha}{m}*(X^T * (X*\theta - y))

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  \sum_{1}^{m} 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:

Bài 5 - Resources

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.

Gradient Descent, Python, Kteam, Howkteam

Vẽ biểu đồ hàm J(θ)

Để debug, bạn có thể vẽ hàm J(θ) như sau:

Gradient Descent, Python, Kteam, Howkteam

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, Python, Kteam, Howkteam

Gradient Descent cần có một \alpha 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.

Gradient Descent, Python, Kteam, Howkteam


Resources

Các bạn có thể download các file text được sử dụng trong bài viết tại:

Bài 5 - Resources


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 likeshare để ủ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.

Tác giả/Dịch giả

Chào các bạn!! Mình là Huy - một cậu bé đam mê lập trình :D Trong một mùa hè rảnh rỗi trước năm cuối cấp đầy cam go, sau khi đã cày hết 7749 bộ anime thì mình muốn làm một việc gì đó "có ích cho đời" hơn. Từ đó mình đã thành 1 Kter :)))

Liên hệ: huytrinhm@gmail.com

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.

Đánh giá

5.0
3 đánh giá
Đánh giá
5
3
4
3
2
1
Vo Tan Duc đã đánh giá 2 năm trước

huybn2 đã đánh giá 4 năm trước

Đình Duy đã đánh giá 4 năm trước

Good!!!

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
PhatNguyen97 đã bình luận 3 năm trước

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?!

pham_tien đã bình luận 4 năm trước

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 ạ!

anhminh120802 đã bình luận 4 năm trước

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

lenhan555 đã bình luận 5 năm trước

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.

susuice đã bình luận 5 năm trước

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  

Không có video.