AI 101

Gradient Descent là gì?

mm

Gradient Descent là gì?

Nếu bạn đã đọc về cách mạng lưới thần kinh được đào tạo, bạn gần như chắc chắn đã gặp thuật ngữ “gradient descent” trước. Gradient descent là phương pháp chính để tối ưu hóa hiệu suất của mạng lưới thần kinh, giảm tỷ lệ lỗi của mạng. Tuy nhiên, gradient descent có thể hơi khó hiểu đối với những người mới bắt đầu với học máy, và bài viết này sẽ cố gắng cung cấp cho bạn một sự hiểu biết cơ bản về cách gradient descent hoạt động.

Gradient descent là một thuật toán tối ưu hóa. Nó được sử dụng để cải thiện hiệu suất của mạng lưới thần kinh bằng cách điều chỉnh các tham số của mạng lưới sao cho sự khác biệt giữa dự đoán của mạng lưới và giá trị thực tế/được mong đợi (được gọi là lỗi) là nhỏ nhất. Gradient descent lấy các giá trị ban đầu của các tham số và sử dụng các phép toán dựa trên tính toán để điều chỉnh giá trị của chúng theo hướng sẽ làm cho mạng lưới chính xác nhất. Bạn không cần phải biết nhiều về tính toán để hiểu cách gradient descent hoạt động, nhưng bạn cần phải có sự hiểu biết về gradient.

Gradients là gì?

Giả sử có một đồ thị đại diện cho lượng lỗi mà mạng lưới thần kinh tạo ra. Đáy của đồ thị đại diện cho các điểm có lỗi thấp nhất, trong khi đỉnh của đồ thị là nơi lỗi cao nhất. Chúng ta muốn di chuyển từ đỉnh của đồ thị xuống đáy. Một gradient chỉ là một cách để lượng hóa mối quan hệ giữa lỗi và trọng số của mạng lưới thần kinh. Mối quan hệ giữa hai thứ này có thể được biểu diễn dưới dạng độ dốc, với trọng số không chính xác tạo ra lỗi nhiều hơn. Độ dốc của độ dốc/gradient đại diện cho tốc độ mà mô hình đang học.

Độ dốc càng lớn, giảm lỗi càng lớn và mô hình học nhanh, trong khi nếu độ dốc bằng không, mô hình đang trên một cao nguyên và không học. Chúng ta có thể di chuyển xuống độ dốc theo hướng giảm lỗi bằng cách tính toán một gradient, một hướng di chuyển (thay đổi trong các tham số của mạng lưới) cho mô hình của chúng ta.

Hãy chuyển đổi ẩn dụ một chút và tưởng tượng một loạt các ngọn đồi và thung lũng. Chúng ta muốn đến đáy của ngọn đồi và tìm phần của thung lũng đại diện cho lỗi thấp nhất. Khi chúng ta bắt đầu từ đỉnh của ngọn đồi, chúng ta có thể thực hiện các bước lớn xuống ngọn đồi và tự tin rằng chúng ta đang di chuyển theo hướng thấp nhất trong thung lũng.

Tuy nhiên, khi chúng ta đến gần điểm thấp nhất trong thung lũng, các bước của chúng ta sẽ cần phải nhỏ hơn, hoặc else chúng ta có thể vượt quá điểm thấp nhất thực sự và kết thúc ở phía bên kia. Tương tự, khi điều chỉnh trọng số của mạng lưới, các điều chỉnh có thể thực sự đưa nó xa hơn khỏi điểm lỗi thấp nhất, và do đó, các điều chỉnh phải nhỏ hơn theo thời gian. Trong bối cảnh xuống ngọn đồi theo hướng giảm lỗi, gradient là một vector/hướng dẫn chi tiết đường đi chúng ta nên đi và kích thước bước chúng ta nên thực hiện.

Bây giờ chúng ta biết rằng gradient là hướng dẫn cho chúng ta biết hướng di chuyển (các hệ số nào nên được cập nhật) và kích thước bước chúng ta nên thực hiện (làm thế nào để cập nhật các hệ số), chúng ta có thể khám phá cách tính toán gradient.

Tính toán Gradients & Gradient Descent

Gradient descent bắt đầu từ một điểm có lỗi cao và thông qua nhiều lần lặp, thực hiện các bước theo hướng giảm lỗi, nhằm tìm kiếm cấu hình trọng số tối ưu. Ảnh: Роман Сузи qua Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

Để thực hiện gradient descent, trước tiên chúng ta phải tính toán gradient. Để tính toán gradient, chúng ta cần biết hàm mất mát/hàm chi phí. Chúng ta sẽ sử dụng hàm chi phí để xác định đạo hàm. Trong tính toán, đạo hàm chỉ là độ dốc của một hàm tại một điểm nhất định, vì vậy chúng ta基本 chỉ tính toán độ dốc của ngọn đồi dựa trên hàm mất mát. Chúng ta xác định mất mát bằng cách chạy các hệ số qua hàm mất mát. Nếu chúng ta biểu diễn hàm mất mát dưới dạng “f”, thì chúng ta có thể nêu rằng phương trình để tính toán mất mát như sau (chúng ta chỉ chạy các hệ số qua hàm chi phí đã chọn của chúng ta):

Mất mát = f(hệ số)

Chúng ta sau đó tính toán đạo hàm, hoặc xác định độ dốc. Việc lấy đạo hàm của mất mát sẽ cho chúng ta biết hướng lên hay xuống độ dốc, bằng cách cung cấp cho chúng ta dấu phù hợp để điều chỉnh các hệ số của chúng ta. Chúng ta sẽ biểu diễn hướng phù hợp dưới dạng “delta”.

delta = đạo_hàm(mất mát)

Chúng ta đã xác định hướng xuống dốc theo hướng giảm lỗi. Điều này có nghĩa chúng ta có thể cập nhật các hệ số trong các tham số của mạng lưới và hy vọng giảm mất mát. Chúng ta sẽ cập nhật các hệ số dựa trên các hệ số trước đó trừ đi sự thay đổi phù hợp trong giá trị như được xác định bởi hướng (delta) và một đối số kiểm soát độ lớn của sự thay đổi (kích thước bước của chúng ta). Đối số kiểm soát độ lớn của cập nhật được gọi là “tốc độ học” và chúng ta sẽ biểu diễn nó dưới dạng “alpha”.

hệ số = hệ số – (alpha * delta)

Chúng ta chỉ cần lặp lại quá trình này cho đến khi mạng lưới hội tụ xung quanh điểm mất mát thấp nhất, điều này nên gần bằng không.

Điều rất quan trọng là chọn giá trị phù hợp cho tốc độ học (alpha). Giá trị tốc độ học được chọn phải không quá nhỏ hoặc quá lớn. Hãy nhớ rằng khi chúng ta đến gần điểm mất mát thấp nhất, các bước của chúng ta phải nhỏ hơn, hoặc else chúng ta có thể vượt quá điểm mất mát thấp nhất thực sự và kết thúc ở phía bên kia. Điểm mất mát nhỏ nhất là nhỏ và nếu tốc độ thay đổi của chúng ta quá lớn, lỗi có thể tăng lại. Nếu kích thước bước quá lớn, hiệu suất của mạng lưới sẽ tiếp tục dao động xung quanh điểm mất mát thấp nhất, vượt quá nó ở một bên và sau đó ở bên kia. Nếu điều này xảy ra, mạng lưới sẽ không bao giờ hội tụ đến cấu hình trọng số tối ưu.

Ngược lại, nếu tốc độ học quá nhỏ, mạng lưới có thể mất một lượng thời gian rất dài để hội tụ đến trọng số tối ưu.

Loại Gradient Descent

Bây giờ chúng ta đã hiểu cách gradient descent hoạt động chung, hãy xem một số loại gradient descent khác.

Gradient Descent theo lô: Hình thức gradient descent này chạy qua tất cả các mẫu đào tạo trước khi cập nhật các hệ số. Loại gradient descent này có thể là hình thức gradient descent hiệu quả nhất về mặt tính toán, vì trọng số chỉ được cập nhật một lần sau khi toàn bộ lô đã được xử lý, có nghĩa là có ít cập nhật hơn. Tuy nhiên, nếu tập dữ liệu chứa một số lượng lớn mẫu đào tạo, thì gradient descent theo lô có thể làm cho quá trình đào tạo mất nhiều thời gian.

Gradient Descent ngẫu nhiên: Trong Gradient Descent ngẫu nhiên, chỉ một mẫu đào tạo được xử lý cho mỗi lần lặp của gradient descent và cập nhật tham số. Điều này xảy ra cho mỗi mẫu đào tạo. Vì chỉ một mẫu đào tạo được xử lý trước khi cập nhật tham số, nó có xu hướng hội tụ nhanh hơn Gradient Descent theo lô, vì cập nhật được thực hiện sớm hơn. Tuy nhiên, vì quá trình phải được thực hiện trên mỗi mục trong tập đào tạo, nó có thể mất một lượng thời gian khá lớn để hoàn thành nếu tập dữ liệu lớn, và do đó, sử dụng một trong những loại gradient descent khác nếu được ưu tiên.

Gradient Descent mini-lô: Gradient Descent mini-lô hoạt động bằng cách chia tập dữ liệu đào tạo thành các phần nhỏ. Nó tạo ra các mini-lô nhỏ hơn được chạy qua mạng lưới, và khi mini-lô đã được sử dụng để tính toán lỗi, các hệ số được cập nhật. Gradient Descent mini-lô tìm được điểm trung gian giữa Gradient Descent ngẫu nhiên và Gradient Descent theo lô. Mô hình được cập nhật thường xuyên hơn so với trong trường hợp của Gradient Descent theo lô, điều này có nghĩa là hội tụ nhanh hơn và mạnh mẽ hơn đến các tham số tối ưu của mô hình. Nó cũng hiệu quả hơn về mặt tính toán so với Gradient Descent ngẫu nhiên

Blogger và lập trình viên với chuyên môn về Machine Learning Deep Learning topics. Daniel hy vọng giúp đỡ người khác sử dụng sức mạnh của AI cho lợi ích xã hội.