#GradientDescentAlgorithm101 #MachineLearning #DeepLearning #OptimizationAlgorithm
Thuật toán tối ưu hóa Gradient Descent (GD) là một phần không thể thiếu trong lĩnh vực Machine Learning và Deep Learning. Điều này được minh họa qua việc sử dụng GD để tối ưu hóa hàm mất mát trong các vấn đề hồi quy, phân loại và xử lý ngôn ngữ tự nhiên.
GD hoạt động bằng cách tính độ dốc của một hàm và di chuyển ngược lại theo hướng của độ dốc đó để giảm thiểu giá trị của hàm. Tuy nhiên, nó chỉ hoạt động tốt với các chức năng đơn hoặc đa biến lồi lõm.
Bạn có thể tưởng tượng GD là một cách tiếp cận từng bước một trên con đường dốc của một ngọn núi, với mục tiêu đến được cái hồ nằm ngay dưới chân núi. Tỷ lệ học và điều kiện dừng là hai siêu tham số quan trọng khi sử dụng GD.
Ngoài ra, còn có nhiều biến thể của GD, bao gồm Batch GD, Stochastic GD, Mini-batch GD và Momentum GD. Với mỗi biến thể, việc chọn siêu tham số phù hợp là rất quan trọng để đạt được hiệu quả tối ưu hóa tốt nhất.
Dù đơn giản nhưng Gradient Descent là một phần không thể thiếu trong lĩnh vực Machine Learning và Deep Learning. Hiểu rõ về thuật toán này sẽ giúp bạn nắm bắt được cơ bản và tạo ra các mô hình tốt hơn.
Hướng dẫn thân thiện với người mới bắt đầu
Hiểu thuật toán tối ưu hóa được sử dụng rộng rãi trong Machine và Deep Learning
Hãy tưởng tượng bạn là một giọt nước trên đỉnh núi, và mục tiêu của bạn là đến được cái hồ nằm ngay dưới chân núi. Ngọn núi cao đó có độ dốc và chướng ngại vật khác nhau, vì vậy đi xuống theo đường thẳng có thể không phải là giải pháp tốt nhất. Làm thế nào bạn sẽ tiếp cận vấn đề này? Giải pháp tốt nhất được cho là thực hiện từng bước nhỏ, từng bước một, luôn hướng tới hướng đưa bạn đến gần hơn với mục tiêu cuối cùng của mình.
Gradient Descent (GD) là thuật toán thực hiện điều đó và nó là điều cần thiết đối với bất kỳ nhà khoa học dữ liệu nào. Nó cơ bản và khá đơn giản nhưng rất quan trọng và bất kỳ ai sẵn sàng tham gia vào lĩnh vực này đều có thể giải thích nó là gì.
Trong bài đăng này, mục tiêu của tôi là tạo ra một hướng dẫn hoàn chỉnh và thân thiện với người mới bắt đầu để giúp mọi người hiểu GD là gì, nó dùng để làm gì, cách thức hoạt động và đề cập đến các biến thể khác nhau của nó.
Như mọi khi, bạn sẽ tìm thấy tài nguyên phần ở cuối bài.
Nhưng điều đầu tiên trước tiên.
Giới thiệu
Sử dụng định nghĩa của Wikipedia(1), Độ dốc gốc là thuật toán tối ưu hóa lặp bậc nhất để tìm điểm cực tiểu cục bộ của hàm khả vi. Mặc dù đây chắc chắn không phải là phương pháp hiệu quả nhất, nhưng nó thường được sử dụng trong Học máy và Học sâu, đặc biệt là trong Mạng thần kinh.
Về cơ bản, nó được sử dụng để giảm thiểu giá trị của hàm bằng cách cập nhật một bộ tham số trên mỗi lần lặp. Về mặt toán học, nó sử dụng đạo hàm (độ dốc) để giảm dần (giảm dần) giá trị của nó.
Nhưng có một nhược điểm: không phải tất cả các chức năng đều có thể tối ưu hóa. Chúng tôi yêu cầu một chức năng – đơn hoặc đa biến – đó là khả vicó nghĩa là các đạo hàm tồn tại tại mỗi điểm trong miền của hàm và lồi lõm (hình chữ U hoặc tương tự).
Bây giờ, sau phần giới thiệu đơn giản này, chúng ta có thể bắt đầu tìm hiểu sâu hơn một chút về toán học đằng sau nó.
Trường hợp thực tế
Bởi vì tất cả trở nên rõ ràng hơn khi vượt ra ngoài lý thuyết, hãy sử dụng các số và giá trị thực để hiểu những gì nó làm.
Hãy sử dụng một trường hợp khoa học dữ liệu phổ biến mà chúng ta muốn phát triển một mô hình hồi quy.
Tuyên bố miễn trừ trách nhiệm: Tôi đã hoàn toàn phát minh ra điều này và không có lý do hợp lý nào đằng sau việc sử dụng các chức năng này, tất cả đều đến một cách ngẫu nhiên. Mục tiêu là để hiển thị quá trình chính nó.
Hàm chi phí hoặc hàm mất mát trong bất kỳ vấn đề khoa học dữ liệu nào là hàm chúng tôi muốn tối ưu hóa. Khi chúng tôi đang sử dụng hồi quy, chúng tôi sẽ sử dụng cái này:
Mục tiêu là tìm giá trị cực tiểu tối ưu của f(x,y). Hãy để tôi vẽ nó trông như thế nào:
Bây giờ, mục tiêu của chúng ta là lấy các giá trị thích hợp cho “x” và “y” để cho phép chúng ta tìm ra các giá trị tối ưu của hàm chi phí này. Chúng ta đã có thể nhìn thấy nó bằng đồ họa:
- y=0
- x là -1 hoặc 1
Đối với chính GD, bởi vì chúng tôi muốn làm cho cỗ máy của mình học cách làm điều tương tự.
thuật toán
Như đã nói, giảm độ dốc là một quá trình lặp đi lặp lại trong đó chúng tôi tính toán độ dốc và di chuyển theo hướng ngược lại. Lý do đằng sau điều này là độ dốc của hàm được sử dụng để xác định độ dốc của hàm đó. Khi chúng ta muốn di chuyển xuống, không lên, thì chúng ta di chuyển ngược lại.
Đó là một quy trình đơn giản trong đó chúng tôi cập nhật x và y trong mỗi lần lặp, bằng cách thực hiện theo phương pháp tiếp theo:
Giải thích bằng lời, tại lần lặp k:
- Tính toán độ dốc bằng cách sử dụng các giá trị của x và y tại lần lặp đó.
- Đối với mỗi biến trong số đó — x và y — nhân độ dốc của nó với lambda (𝜆), là một số thực được gọi là tốc độ học.
- Xóa khỏi x và y tương ứng các giá trị được tính toán ở bước 2.
- Làm cho x và y có giá trị mới trong lần lặp lại tiếp theo.
Quá trình này sau đó được lặp lại cho đến khi một điều kiện nhất định được đáp ứng (ngày nay điều đó không quan trọng). Khi điều đó xảy ra, quá trình đào tạo kết thúc và quá trình tối ưu hóa cũng vậy. Chúng tôi (hoặc nên) ở mức tối thiểu (cục bộ hoặc toàn cầu).
Bây giờ, hãy đưa lý thuyết này vào thực tế.
Điều đầu tiên chúng ta cần làm là tính gradient của f(x,y). Độ dốc tương ứng với một vectơ đạo hàm riêng:
Bây giờ, bằng cách sử dụng Python, tất cả những gì tôi sẽ làm là tạo một vòng lặp lặp đi lặp lại tính toán độ dốc — sử dụng x và y tương ứng — và cập nhật các tham số này như đã chỉ định ở trên.
Trước đó, tôi sẽ xác định thêm hai giá trị:
- Tỷ lệ học (𝜆) có thể cố định hoặc di động. Đối với hướng dẫn đơn giản này, nó sẽ là 0,01.
- Tôi cũng sẽ sử dụng một giá trị gọi là eps (epsilon) để xác định thời điểm kết thúc quá trình lặp. Khi cả hai đạo hàm riêng đều nằm dưới ngưỡng này, quá trình giảm dần độ dốc sẽ dừng lại. Tôi đang đặt nó thành 0,0001.
Bây giờ, hãy làm một số mã:
import random# Define constants
eps = 0.0001
lr = 0.01
# Initialize x and y with random values
x = random.uniform(-2, 4)
y = random.uniform(-1, 1)
def f(x,y):
return (x**2 -1)**2 +y**2
def df_x(x):
return 4*x*(x**2 - 1)
def df_y(y):
return 2*y
# Perform gradient descent
while max(df_x(x), df_y(y)) >= eps:
x = x - lr * df_x(x)
y = y - lr * df_y(y)
# Print optimal values found
print(f'x = x, y = y')
Đầu ra của một lần lặp ngẫu nhiên là:
Chúng ta có thể thấy các giá trị này khá gần với x=1 và y=0, thực sự là các giá trị cực tiểu của hàm.
Một điều tôi quên đề cập đến là khởi tạo x và y. Tôi đã chọn tạo ngẫu nhiên một số trong phạm vi ngẫu nhiên. Trong các vấn đề trong thế giới thực, việc sử dụng nhiều thời gian hơn để suy nghĩ về điều này luôn được yêu cầu. Tương tự với tốc độ học, điều kiện dừng và nhiều siêu tham số khác.
Nhưng đối với trường hợp của chúng tôi, điều này là quá đủ.
Các biến thể của Gradient Descent
Tôi chắc rằng bây giờ bạn đã hiểu thuật toán cơ bản. Tuy nhiên, nhiều phiên bản của nó đang được sử dụng ngoài kia và tôi nghĩ một số trong số đó đáng được đề cập.
- Độ dốc dốc ngẫu nhiên (SGD). SGD là biến thể chọn ngẫu nhiên một điểm dữ liệu từ toàn bộ tập dữ liệu ở mỗi lần lặp. Điều này làm giảm số lượng tính toán nhưng rõ ràng nó có những nhược điểm, chẳng hạn như không thể hội tụ đến mức tối thiểu toàn cầu.
- Giảm độ dốc hàng loạt (BGD). BGD sử dụng toàn bộ tập dữ liệu trong mỗi lần lặp lại. Điều này không hoàn toàn mong muốn đối với các tập dữ liệu lớn vì có thể tốn kém và chậm về mặt tính toán, nhưng mặt khác, sự hội tụ đến mức tối thiểu toàn cầu được đảm bảo về mặt lý thuyết.
- Giảm dần độ dốc hàng loạt nhỏ (MBGD). Đây có thể coi là điểm trung gian giữa SGD và BGD. Nó không sử dụng một điểm dữ liệu tại một thời điểm cũng như toàn bộ tập dữ liệu, mà là một tập hợp con của nó. Trên mỗi lần lặp lại, chúng tôi chọn một số lượng mẫu ngẫu nhiên (được xác định trước đó) và chỉ thực hiện giảm dần độ dốc bằng cách sử dụng các mẫu đó.
Phần kết luận
Thuật toán Gradient Descent được sử dụng rộng rãi trong máy móc và học sâu, nhưng cũng trong các lĩnh vực khác. Đó là lý do tại sao mọi người sẵn sàng trở thành nhà khoa học dữ liệu đều phải hiểu nó.
Tôi hy vọng bài đăng này làm rõ nó là gì, nó làm gì và nó làm như thế nào.
Thanks for reading the post!
I really hope you enjoyed it and found it insightful.Follow me for more content like this one, it helps a lot!
@polmarin
Nếu bạn muốn hỗ trợ thêm cho tôi, hãy cân nhắc đăng ký Tư cách thành viên của Medium thông qua liên kết bạn tìm thấy bên dưới: bạn sẽ không mất thêm bất kỳ xu nào nhưng sẽ giúp tôi vượt qua quá trình này. Cảm ơn rất nhiều!
Tài nguyên
(1) Độ dốc gốc – Wikipedia