[Nhập môn Machine Learning] Bài 7: Vector hóa thuật toán
Chúng ta đã đi được khá xa trong những bài vừa qua. Ta đã biết đến phương pháp tối ưu phổ biến nhất trong Machine Learning chính là Gradient Descent và sử dụng nó trong Linear Regression. Bây giờ, ta cần lùi bước lại để có được cái nhìn toàn cảnh về những việc mà ta đã làm. Đồng thời, tìm hiểu thêm một phương pháp cài đặt (implement) phổ biến hơn cho các thuật toán Machine Learning đó là vector hóa.
Cái nhìn tổng quan của các thuật toán Machine Learning
Đối với Linear Regression, có 3 thành phần chính mà chúng ta đã học được đó chính là:- Model: hay chúng ta còn gọi là Hypothesis Function.
- Lost Function: đôi khi cũng được nhắc đến với cái tên Cost Function như tôi đã làm.
- Optimizer: là một thuật toán tối ưu.
Tôi thích nghĩ đến sự tương tác đặc biệt này bằng cách liên hệ tới thể thao. Giả sử bạn có một vận động viên bóng rổ. Mục tiêu của bạn là huấn luyện anh ta thành một ngôi sao ném bóng (cứ tạm coi là bạn có thể đi). Mỗi ngày, anh ta cần ném 50 trái ở những vị trí khác nhau. Vị trí của anh ta chính là dữ liệu mà anh ấy có được để thực hiện cú ném và kết quả vào hoặc không vào. Và mỗi ngày, bạn dựa trên sự thể hiện của anh ta để nói cho anh ta biết anh ấy cần cải thiện điều gì. Vậy, nhìn theo khía cạnh Machine Learning, anh ta là một model cần được train, bạn chính là optimizer và tỷ lệ anh ta ném trượt chính là loss function của anh ấy.Chúng ta cần phải cực tiểu hóa loss function, nhớ chứ. Tuy nhiên nếu bạn thấy không ổn thì có thể cho loss function tỷ lệ trúng rổ cũng không sao. Vậy, bạn huấn luyện anh ta như thế nào? Tư thế ném, cách ném, cách để tay, cách nhắm, lực ném là tất cả các tham số tham gia vào việc anh ta có ném trúng hay không và dựa vào kết quả của anh ta mà bạn cần phải điều chỉnh các tham số này cho phù hợp.
Và đây là một điều tôi nghĩ bạn nên biết trong quá trình học Machine Learning của mình.
Vector hoá thuật toán (Vectorization)
Ở bài rồi chúng ta có cài đặt Linear Regression bằng Python và tôi thú thực với bạn là cách cài đặt đó khá ... lởm. Cách làm ấy khiến việc tổng quan hoá thuật toán của chúng ta, mở rộng ra 10 hoặc 20 tham số, hết sức khó khăn. Vậy nên, ta có cách cài đặt mới đó là chuyển đổi chúng dưới dạng ma trận và vector. Bàn luận sâu hơn một chút về khía cạnh Khoa học máy tính, cách làm này cũng giúp việc tính toán hiệu quả hơn khi đối với cách cài đặt thông thường, chúng ta chỉ có thể tận dụng được một lõi của CPU, còn với vector hoá, ta không những tận dụng được tính đa luồng đã được tích hợp trong các CPU hiện giờ mà còn có thể tăng tốc thời gian tính toán vector bằng GPU, một đơn vị tính toán được chuyên biệt hoá để xử lý đồ hoạ mà chúng vốn là (bạn có thể đoán được đấy) tính toán vector và ma trận.Nếu tôi vô tình khơi dậy nỗi sợ Đại số tuyến tính của bạn thì cho tôi xin lỗi. Vì giờ đây, Đại số tuyến tính sẽ là bạn của chúng ta trên quãng đường này đấy. Bây giờ, tôi cần bạn ít nhất là biết cách nhân ma trận. Nếu quên, bạn có thể ôn lại ở đây.
Trong bài viết này, tôi sẽ sử dụng một số cách viết khác nhau để ký hiệu:
- x (viết thường) biểu thị cho một số.
- x (viết in đậm) biểu thị cho một vector cột.
- X (viết in đậm, chữ in hoa) biểu thị cho một ma trận.
Hypothesis Function
Đầu tiên, với Hypothesis Function ban đầu là:Sẽ có thể viết dưới dạng vector là với là vector cột chứa các tham số . Và là vector cột chứa các dữ liệu đầu vào . Ở đây, mặc định là bằng 1.
Cost Function
Tiếp theo sẽ được vector hóa thành:Tôi sẽ giải thích thêm về phương trình trên. Nếu coi ma trận là vector chứa tất cả các mẫu dữ liệu của ta với mỗi dòng là một mẫu. Vậy ma trận sẽ có dạng với m là số mẫu dữ liệu và n là số feature.
Lúc này, phép nhân ma trận sẽ thể hiện sức mạnh của nó khi chúng ta có thể tính được hết các dự đoán của model chỉ bằng một phép nhân giữa ma trận và vector tham số .
Và công việc cuối cùng của chúng ta là trừ kết quả dự đoán với nhãn thật và lấy tổng bình phương của các kết quả rồi chia cho . Điều này cũng có thể được thực hiện nhanh chỉ bằng một phép nhân ma trận.
Lấy độ chênh lệch giữa các kết quả:
Tính tổng bình phương của các kết quả bằng phép nhân ma trận và ta có:
Nếu bạn vẫn chưa quen với vector hóa, tôi nghĩ bạn nên lấy một tờ giấy và kiểm tra từng phép tính một bằng tay để có thể tự mình kiểm chứng các phép tính và làm quen dần với nó.
Gradient Descent
Với Gradient Descent, chúng ta sẽ cần phải suy nghĩ một chút. Ở mỗi bước cập nhật, ta cần tính bằng cách nhân các cho giá trị tương ứng rồi tính trung bình cộng.Ta đã có chứa tất cả các giá trị . Để tính đạo hàm riêng theo , ta có thể lấy cột j trong ma trận , tạm gọi là có kích thước là , sau đó chuyển vị và nhân với . (Tất nhiên là đừng quên chia m)
Lúc này, sức mạnh của vector hóa lại được thể hiện khi ta có thể thay thế cho nhằm mở rộng công thức trên ra để tính được tất cả các đạo hàm riêng. Những gì ta thu được cuối cùng là một vector gradient của .
Và thuật toán Gradient Descent của chúng ta sẽ chỉ gòn gàng là:
bài viết hay quá ạ
Trả lờiXóahi vọng admin có thể cho ra nhiều bài viết hơn trong series này ạ
cảm ơn admin!
khái niệm cost và lost function là khác nhau mà ad
Trả lờiXóacost và loss khác nhau chỗ nào vậy bạn ?
XóaNhận xét này đã bị tác giả xóa.
Trả lờiXóa"Cùng tìm hiểu thêm về machine learning nhé!
Trả lờiXóamachine learning là gì"