Machine learning 101 (5): Hàm mất mát, mảnh ghép cuối cùng

Xin chào các bạn! Ta lại tiếp tục câu chuyện về machine learning.

Ở các bài viết trước, ta đã bỏ rất nhiều công sức để xây dựng được một công thức tổng quát để tìm ra một model từ một tập dữ liệu. Đó hàm mục tiêu của Regularized Loss Minimization (RLM):

$$ w = \arg\min_{w’} \mathcal{L}_{D_{train}}(w’) + \lambda R(w’) $$

Nhưng suy đi nghĩ lại thì công thức này khá là “vô dụng” vì nó tổng quát nhưng không cụ thể. Ta chẳng thể dùng nó để luyện ra model nào bởi ta không biết $\mathcal{L}$ có dạng thế nào để mà tìm giá trị cực tiểu. Vậy tại sao chúng ta lại bỏ thời gian ra “vô ích” như vậy? Tại sao không dùng thời gian đó để đi bắt Pokemon?

Tại sao chúng ta lại cần một công thức tổng quát?

Câu trả lời rất đơn giản, tiết kiệm năng lượng. Không riêng gì machine learning, trong mỗi ngành nghề đều tồn tại những công việc cần phải lặp đi lặp lại nhiều lần. Trong xây nhà thì đó là việc đổ móng, xây tường, lợp mái. Trong võ thuật thì đó là việc đứng tấn, đấm và đá. Những việc đó vô cùng nhàm chán và ta muốn dành thật ít năng lượng và suy nghĩ khi làm chúng! Ta thích làm những việc vui hơn, tự do hơn, sáng tạo hơn, như thiết kế hay trang trí một căn nhà, hoặc ngẫm ra một thế võ độc tôn.

Nhưng hãy tưởng tượng rằng nếu bức tường ta xây cứ 3 ngày lại đổ một lần. Cứ xây đi xây lại như thế thì cả đời ta cũng không thể có cơ hội để trang trí một căn nhà. Tương tự, nếu chân đứng còn chưa vững thì nói gì đến việc sáng chế chiêu thức. Thế nên, muốn làm việc cao cấp vui vẻ thì trước hết phải làm những việc cơ bản nhàm chán thành thục trước đã.

Machine learning cũng như vậy. Ta bỏ nhiều công sức ra để xây dựng nên RLM là bởi nguyên tắc này được sử dụng trong hầu hết mọi model. Nếu bạn nắm kỹ RLM, thì tốc độ học của bạn sẽ được đẩy lên rất nhiều. Vì sao? Hãy nhìn vào công thức RLM, mảnh ghép còn thiếu cuối cùng chỉ là dạng của $\mathcal{L}$. Cho nên, mỗi lần gặp một dạng model mới và nhận ra được bóng dáng của RLM trong đó thì gần như là “game over”. Công việc của bạn lúc đó chỉ là nhìn ra dạng của $\mathcal{L}$ với từng model khác nhau. Thậm chí tạo ra một model mới cũng không phải là việc quá khó khăn. Bạn đã có RLM làm nền, công việc của bạn chỉ là ngồi sáng tạo ra các biến thể của $\mathcal{L}$ để lắp vào. Nhẹ nhàng nhưng đầy trí tuệ, vui đấy chứ?

Thật ra thì cũng không có nhiều biến thể của $\mathcal{L}$ lắm. Bây giờ ta sẽ đi nghiên cứu một số biến thể thông dụng nhất nhé!

Hàm mất mát

Đầu tiên chúng ta cần nhớ lại xem hàm mất mát là gì? Hàm mất mát, kí hiệu là $L$, là thành phần cốt lõi của $\mathcal{L}$. $\mathcal{L}$ thực chất là trung bình cộng của các $L$ trên một tập dữ liệu. Cụ thể, trong công thức:

$$ \mathcal{L}_D(f_w) = \frac{1}{|D|} \sum_{(x, y) \in D} L \left( f_w(x), y \right) $$

Thì hàm $L$ chính là hàm mất mát. Hàm mất mát trả về một số thực không âm thể hiện sự chênh lệch giữa hai đại lượng: $\hat{y}$, label được dự đoán và $y$, label đúng. Hàm mất mát giống như một hình thức để bắt model đóng phạt mỗi lần nó dự đoán sai, và số mức phạt này tỉ lệ thuận với độ trầm trọng của sai sót. Trong mọi bài toán supervised learning, mục tiêu của ta luôn bao gồm giảm thiểu tổng mức phạt phải đóng. Trong trường hợp lý tưởng, tức là khi $\hat{y} = y$, hàm mất mát sẽ trả về giá trị cực tiểu, bằng 0.

Hai dạng bài supervised learning cơ bản

Ta phân chia các dạng bài supervised learning dựa vào tính chất của $y$. Ta xét bài các bài toán mà $y$ là một số thực.

Khi $y$ có thể tự do dao động trong khoảng $(-\infty,\infty)$, ta được một bài toán regression. Ví dụ như ta cần tiên đoán giá cổ phiếu, giá xăng, giá vàng vào ngày mai.

Khi $y$ là một đại lượng rời rạc chỉ nhận giá trị trong một tập label hữu hạn rời rạc nào đó, ta được bài toán classification. Ví dụ, khi ta cần nhận dạng tên một người từ một tấm ảnh chân dung, cho dù có hàng tỉ cái tên trên thế giới thì tập hợp này vẫn là rời rạc hữu hạn. Vì thế, bài toán này vẫn được quy vào dạng classification. Để đơn giản các công thức, bài viết này chỉ đề cập đến binary classification, tức là khi tập các label chỉ có hai phần tử (“có” hoặc “không”, “đúng” hoặc “sai”, “positive” hoặc “negative”, …). Để tiện cho việc tính toán, trong binary classification, ta chuyển đổi tập label thành tập $\{-1, +1\}$ (ví dụ như -1 nghĩa là “không”, +1 nghĩa là “có”).

Lưu ý rằng ta đang nói đến label thật $y$ chứ không phải label dự đoán $\hat{y} = f_w(x)$. Thông thường, đối với cả regression và binary classification, ta đều thiết kế để model $f_w(x)$ trả về một số thực $\hat{y} \in (-\infty,\infty) $. Với regression, $\hat{y}$ dĩ nhiên mang ý nghĩa là giá trị được dự đoán. Với binary classification, $\hat{y}$ là điểm số thể hiện model ưa thích label nào hơn trong hai label. Nếu $\hat{y} < 0$ tức là model thích phương án -1 hơn và ngược lại, nếu $\hat{y} \geq 0$ tức là model nghiêng về phương án +1 hơn. Giá trị tuyệt đối của $\hat{y}$ thể hiện sự tự tin (sự chắc chắn) của model đối với lựa chọn của mình.

Cách xây dựng hàm mất mát

Vì hàm mất mát đo đạc chênh lệch giữa $y$ và $\hat{y}$, nên không lạ gì nếu ta nghĩ ngay đến việc lấy hiệu giữa chúng:

$$ L(\hat{y}, y) = \hat{y} \ – \ y$$

Tuy nhiên hàm này lại không thỏa mãn tính chất không âm của một hàm mất mát. Ta có thể sửa nó lại một chút để thỏa mãn tính chất này. Ví dụ như lấy giá trị tuyệt đối của hiệu:

$$ L(\hat{y}, y) = |\hat{y} – y|$$

Hàm mất mát này không âm nhưng lại không thuận tiện trong việc cực tiểu hóa, bởi vì đạo hàm của nó không liên tục (nhớ là đạo hàm của $f(x) = |x|$ bị đứt quãng tại $x = 0$) và thường các phương pháp cực tiểu hóa hàm số thông dụng đòi hỏi phải tính được đạo hàm. Một cách khác đó là lấy bình phương của hiệu:

$$ L(\hat{y}, y) = \frac{1}{2}(\hat{y} – y)^2$$

Khi tính đạo hàm theo $\hat{y}$, ta được $\nabla L = \frac{1}{2} \times 2 \times (\hat{y} – y) =\hat{y} – y$. Các bạn có thể thấy rằng hằng số $\frac{1}{2}$ được thêm vào chỉ để cho công thức đạo hàm được đẹp hơn, không có hằng số phụ. Hàm mất mát này được gọi là square loss. Square loss có thể được sử dụng cho cả regression và classification, nhưng thực tế thì nó thường được dùng cho regression hơn.

Đối với binary classification, ta có một cách tiếp cận khác để xây dựng hàm mất mát. Nhắc lại là đối với dạng bài này, thì nếu model trả về $\hat{y} < 0$ tức là thích đáp án -1 hơn, trả về $\hat{y} \geq 0$ tức là thích đáp án +1 hơn.

Một cách rất tự nhiên, ta thấy rằng hàm mất mát của binary classification cần phải đạt được một số tiêu chí sau:

1. Ta cần phải phạt model nhiều hơn khi dự đoán sai hơn là khi dự đoán đúng. Vì thế, tiêu chí đầu tiên của ta là khi model dự đoán sai ($y$ khác dấu với $\hat{y}$), hàm mất mát phải trả về giá trị lớn hơn so với khi model dự đoán đúng ($y$ cùng dấu với $\hat{y}$).

2. Nếu $\hat{y}$ cùng đấu với $y$ thì ta nên phạt model thế nào? Cụ thể là nếu có hai đáp án $\hat{y}_1$ và $\hat{y}_2$ đều cùng dấu với $y$ thì ta nên phạt đáp án nào nhiều hơn? Như đã nói, giá trị tuyệt đối $|\hat{y}|$ thể hiện “độ tự tin” của model đối với một phương án. Giá trị này càng lớn thì model càng “thích” một phương án. Trong trường hợp $\hat{y}$ cùng dấu với $y$, phương án được thích là phương án đúng, do đó, model càng thích thì ta phải càng khuyến khích và phạt ít đi. Cũng với lập luận như vậy, nếu $\hat{y}$ khác dấu với $y$, vì phương án được thích là phương án sai nên model càng thích thì ta phải càng phạt nặng để model không tái phạm nữa.

Một cách tổng quát, đối với classification thì các hàm mất mát thường có dạng như sau:

$$ L(\hat{y}, y) = f(y \cdot \hat{y}) $$ trong đó $f$ là một hàm không âm và không tăng.

Q1: Giải thích tại sao hàm $g(\hat{y}, y) =  \ – y \cdot \hat{y}$ lại thỏa mãn hai tiêu chí đã nêu ở trên.

Q2: Giải thích tại sao hàm $g(\hat{y}, y) =  \ – y \cdot \hat{y}$ lại không thỏa điều kiện của một hàm mất mát (lưu ý tính chất của hàm mất mát và $f$).

Các hàm mất mát cơ bản dành cho classification 

Hàm 0-1 loss:

Hàm này rất đơn giản: trả về 1 nếu $y \cdot \hat{y} < 0$, trả về 0 nếu ngược lại. Việc này tương đương với việc đếm số câu trả lời sai của model. 0-1 loss thường chỉ được dùng để tính error rate của model, chứ không dùng để huấn luyện model vì đạo hàm của nó không xác định ở điểm 0.

Hàm perceptron loss:

$$ L_{perceptron}(\hat{y}, y) = \max(0,- y \cdot \hat{y}) $$

Ta thấy rằng hàm perceptron loss là một cách đơn giản nhất để sửa sao cho hàm $g$ ở câu hỏi trên trở thành không âm (thỏa điều kiện của một hàm mát). Đối với perceptron loss, khi model đoán đúng ($\hat{y}$ cùng dấu với $y$), $- y \cdot \hat{y}$ sẽ mang dấu âm. Tức là, khi đó $L_{perceptron}(\hat{y}, y) = \max(0,  negative) = 0$. Nói cách khác, perceptron loss không phân biệt gì giữa các dự đoán đúng. Chúng đều không bị phạt. Đối với các dự đoán sai, thì perceptron vẫn tuân thủ theo nguyên tắc là model càng thích thì phạt càng nặng. Perceptron loss là hàm mất mát của Perceptron model.

Hàm hinge loss

$$ L_{hinge}(\hat{y}, y) = \max(0, 1 – y \cdot \hat{y}) $$

Hinge loss chẳng qua chỉ là một biến thể từ perceptron loss. Ta chỉ thêm 1 đơn vị vào đại lượng $- y \cdot \hat{y}$. Số 1 này có một ý nghĩa rất đặt biệt, được gọi là margin (lề). Các bạn sẽ thấy là hinge loss hoạt động gần như tương tự như perceptron loss chỉ trừ các dự đoán mà $y \cdot \hat{y}$ nằm trong khoảng $[0, 1]$. Chú ý là các dự đoán mà $y \cdot \hat{y}$ rơi vào khoảng này thì đều đúng. Hinge loss phân biệt các dự đoán đúng này theo nguyên tắc là model càng thích thì càng phạt nhẹ. Còn khi $y \cdot \hat{y}$ vượt quá 1 thì hinge loss lại không phân biệt nữa.

Vì sao lại làm như vậy? Những dự đoán ở trong margin $[0, 1]$ là những dự đoán gần ranh giới, là những lúc mà model lưỡng lự. Ý tưởng của hinge loss là muốn model phải thật rõ ràng và tự tin với những quyết định của mình. Do khi vẫn còn trong margin thì model vẫn bị phạt, nên model sẽ được khuyến khích để đưa ra những quyết định đúng và có tính chắc chắn cao, nằm ngoài margin để không bị phạt nữa. Đây chính là ý tưởng của Support Vector Machines model.

Hàm logistic loss (hay log loss):

$$ L(\hat{y}, y) = \log_2(1 + \exp(- y \cdot \hat{y})) $$

Trong công thức trên, hàm $\exp(\cdot)$ là hàm lũy thừa theo cơ số tự nhiên $e$. Thoạt nhìn log loss trông có vẻ khá phức tạp, và trông không có vẻ gì là họ hàng của hai hàm còn lại. Tuy nhiên, khi nhìn vào đồ thị của hàm số này, ta lại thấy rất dễ hiểu bởi vì nó thỏa tất cả mọi tính chất của hàm mất mát mà ta đã nói ở phần trước. Đây là một hàm liên tục, không âm và không tăng. Không những không tăng, log loss còn luôn giảm, có nghĩa là nó luôn phân biệt giữa các dự đoán có độ tự tin khác nhau bất kể đúng hay sai. Đây là điểm khác biệt chính của log loss với perceptron loss và hinge loss. Một điểm khác biệt nữa là hàm này có một độ cong nhất định, tức là nó không giảm với tốc độ như nhau ở mọi điểm. Trong khi đó, thì một phần của perceptron loss hoặc hinge loss chỉ là một đường tuyến tính, với tốc độ giảm là một hằng số. Log loss chính là nền tảng của Logistic Regression model.

Vậy có phải log loss là một hàm mất mát hoàn hảo? Chưa hẳn, điều này phụ thuộc vào bài toán. Tuy log loss đưa ra nhiều tiêu chí hấp dẫn, nhưng vấn đề model liệu có thể thỏa mãn những tiêu chí được những tiêu chí đó không. Hay chúng ta đang đòi quá nhiều ở model? Việc model phân biệt giữa một đáp đúng với độ chắn chắn thấp và một đáp án đúng với độ chắc chắn cao mang lại lợi ích gì cho ta? Có đôi khi, ta không quan tâm, đáp án nào cũng đều đúng. Có đôi khi, ta lại cần model phải rạch ròi. Có đôi khi, ta chỉ muốn tránh những đáp án có độ chắc chắn thấp; Lúc đó, hinge loss lại là sự lựa chọn tốt hơn. Tất cả đều tùy vào dữ liệu và ứng dụng.

Cuối cùng, để kết thúc bài viết, xin tặng các bạn một tấm hình minh họa các hàm mất mát từ trang scikit-learn.

Comments

comments