Machine Learning Deep Learning

Parameterized Learning

Parameterized Learning

Bạn có biết thuật toán kNN - một trong những thuật toán đơn giản nhất của ML? Về bản chất, nó không “học” bất cứ điều gì từ dữ liệu mà chỉ đơn giản là lưu dữ liệu bên trong model, và tại thời điểm dự đoán, nó so sánh dữ liệu cần dự đoán với dữ liệu trong tập training. Rõ ràng với cách làm việc như vậy thì ưu điểm lớn nhất của kNN là không mất thời gian training model. Không không cần quá quan tâm về độ chính xác thì ưu điểm này chính là lý do mà kNN vẫn còn được sử dụng trong một số trường hợp. Hạn chế của kNN chỉ xuất hiên khi gặp bài toán mà sử dụng lượng dữ liệu lớn. Lúc này thời gian dự đoán của kNN sẽ rất lâu, và đôi khi không thể sử dụng được trong thực tế.

Một các tiếp cận khác của ML model mà ở đó nó có thể học được các patterns từ dữ liệu trong suốt quá trình training. Sau đó, ở giai đoạn dự đoán, ML model đó có thể thực hiện rất nhanh chóng để đưa ra kết quả. Dạng này của ML được gọi là parameterized learning.

Dưới đây là định nghĩa chính thống từ tác giả:

“A learning model that summarizes data with a set of parameters of fixed size (independent of the number of training examples) is called a parametric model. No matter how much data you throw at the parametric model, it won’t change its mind about how many parameters it needs.” – Russell and Norvig (2009).

Có thể nói parameterized learning là nền tằng của các thuật toán ML và DL hiện đại ngày nay. Trong bài này, chúng ta sẽ cùng xem xét chi tiết một vài khía cạnh về nó!

1. Bốn thành phần cơ bản của Parameterized Learning

Hiểu một cách đơn giản, parameterization là quá trình định nghĩa các tham số cần thiết cho một model. Nó bao gồm 4 thành phần: Data, Score Function, Loss Function, Weight-Bias.

1.1 Data

Data ở đây chính là input data đưa vào để model học, nó bao gồm Data Points (VD: Các raw pixel của bức anh, các trích xuất đặc trưng của đối tượng, …) và nhãn kết hợp với Data Points.

Data thường được biểu diễn dưới dạng ma trận (gọi là desing matrix). Mỗi hàng của matrix đại diện cho một Data Point, trong khi mỗi cột của nó thể hiện moojtoj feature.

Ví dụ, xem xét một dataset gồm 1000 bức ảnh màu, mỗi ảnh có kích thước 96x96x3 pixels. Design Matrix cho dataset này sẽ là: $X \subseteq R^{100 \times (32 \times 32 \times 3)}$, với $X_i$ là ảnh thức $i$ trong $R$. Cùng với Design Matrix, ta cũng định nghĩa vector $y$ mà $y_i$ là nhãn cho ảnh thứ $i$ trong dataset.

1.2 Scoring Function

Hàm này chấp nhận một input data, sau đó ánh xạ nó sang nhãn tương ứng.

INPUT_IMAGES => F(INPUT_IMAGES) => OUTPUT_CLASS_LABELS

1.3 Loss Function

Loss Function đánh giá mức độ phù hợp giữa nhãn dự đoán (predicted label) và nhãn thực tế (ground-truth label). Giá trị của hàm này tỉ lệ nghịch với mức độ phù hợp hay độ chính xác của model. Mục tiêu của chúng ta khi training AI model là tối thiểu hóa loss funtion.

1.4 Weights and Biases

Weight Matrix ($W$) và vector bias ($b$) là những cái được điều chỉnh, cập nhật trong quá trình training AI model, dựa trên output của Score Function và Loss Function. Mục đích cuối cùng cũng vẫn là tăng độ chính xác phân loại của AI model.

Tiếp theo, chúng ta sẽ sử dụng 4 thành phần này để xây dựng một linear classification.

2. Ưu điểm của Parameterized Learning

Có 2 ưu điểm chính để sử dụng Parameterized Learning:

  • Một khi đã hoàn thành viêc training model, ta có thể bỏ qua input data, chỉ giữ lại Weight Matrix $W$ và bias vector $b$. Điều này giúp giảm đáng kể kích thước của model.
  • Tốc độ của việc phân loại sử dụng model đã trained nhanh hơn rất nhiều so với thuật toán kNN. Ta chỉ cần nhân 2 matrix $W$ và $x_i$, rồi cộng với $b$.

3. Linear Classification

Phần này, chúng ta sẽ đi sâu hơn 1 chút về toán, tìm hiểu cách mà parameterized learning áp dụng vào machine learning.

Giả sử chúng ta có một bộ dataset gồm $N$ ảnh kích thước ($W_{input}, H_{input}, 3$), ký hiệu là $x_i, i = 1, 2, …, N$. Mỗi $x_i$ có một nhãn tương ứng $y_j, j = 1, 2, …, K$. Nói một cách khác, chúng ta có $N$ Data Points, mỗi Data Point có $D = (W_{input} \times H_{input}\times3)$ chiều, và được chia thành $K$ nhóm phân biệt.

Ta định nghĩa Score Function thông qua một hàm tuyến tính đơn giản như sau:

$f(x_i, W, b) = Wx_i + b$

Giả sử mỗi $x_i$ được đại diện bởi một vector cột với kích thước $[D\times1]$ (đối với images, ta duỗi thẳng theo cả 3 chiều thành $D = (W_{input} \times H_{input}\times3)$ giá trị nguyên của các pixcels). Weight Matrix $W$ sẽ có kích thước $[K \times D]$ và bias $b$ sẽ có kích thước $[K \times 1]$. Vector bias cho phép ta dịch chuyển Score Function trên toàn bộ trên đồ thị, đóng vai trò quan trọng đối với sự thành công của AI model.

Ví dụ cụ thể đối một dataset có 3000 bức ảnh, mỗi ảnh có kích thước $[32 \times 32 \times 3]$ và được phân chia vào 1 trong 3 nhóm. Khi đó mỗi $x_i$ được đại diện bởi D = 32323 = 3072 pixels và có kích thước $[3072 \times 1]$. Weight Matrix $W$ có kích thước $[3 \times 3072]$ và bias vector $b$ có kích thước $[3 \times 1]$.

Hình dưới minh họa linear classification Score Function $f$. Bên trái là ảnh đầu vào kích thuớc $[32 \times 32 \times 3]$ được “duỗi thẳng” thành 3072 pixcels (bằng cách reshape 3D array thành 1D list).

Weight Matrix $W$ chứa 3 hàng (mỗi hàng tương ứng với 1 nhãn) và 3072 cột (mỗi cột tương ứng với 1 pixel của ảnh). Sau khi nhân 2 matrix $W$ và $x_i$, ta cộng thêm bias vector $b$ sẽ thu được output của Score Function, như bên trái của hình trên. Có 3 giá trị tương ứng với 3 nhãn: Cat, Dog và Panda.

4. Thực hành Linear Classification với Python

Chúng ta đã có hình dung cơ bản về lý thuyết của Parameterized Learning, giờ ta sẽ bắt tay vào thực hành code để có thể hiểu hơn.

Mục đích của phần này không phải hướng dẫn việc training model, chỉ đơn giản là cài đạt Score Function bằng python mà thôi. Khi training model thì $W$ và $b$ sẽ được khởi tạo và cập nhật dần dần trong quá trình training, còn ở đây, chúng chỉ được khởi tạo 1 lần và sử dụng luôn để tính output của Score Function.

Mục tiêu của ta ở đây là nhận diện xem ảnh dưới đây là con gì trong số 3 con vật: Cat, Dog và Panda.

Chúng ta sẽ code như sau (xem giải thích trong comment code):

# import the necessary packages
import numpy as np
import cv2

# initialize the class labels and set the seed of the pseudorandom number generator so we can reproduce our results
labels = ["dog", "cat", "panda"]
np.random.seed(1)

# randomly initialize our Weight Matrix and bias vector -- in a *real* training and classification task, these parameters would be 
# *learned* by our model, but for the sake of this example, let's use random values

W = np.random.randn(3, 3072)
b = np.random.randn(3)

# load our example image, resize it, and then flatten it into our "feature vector" representation
orig = cv2.imread("dog.png")
image = cv2.resize(orig, (32, 32)).flatten()

# compute the output scores by taking the dot product between the Weight Matrix and image pixels, followed by adding in the bias
scores = W.dot(image) + b

# loop over the scores + labels and display them

Chạy code trên ta thu được kết quả trên terminal:

[INFO] dog: 8058.57
[INFO] cat: -2926.35
[INFO] panda: 3531.41

và ảnh hiển thị:

Nhắc lại lần nữa là khi thực hiện bài toán AI trong thực tế từ đầu, chúng ta cần phải cập nhật $W$ và $b$ thông qua các thuật toán tối ưu. Thuật toán tối ưu kinh điển là Gradient Descent sẽ được tìm hiểu chi tiết trong bài viết tiếp theo.

5. Loss Function

5.1 Loss Function là gì?

Loss Function, tên tiếng việt là hàm mất mát, thể hiện sai số giữa giá trị dự đoán của model và giá trị thực tế. Sai số càng nhỏ thì model dự đoán càng chính xác và ngược lại.

Mục tiêu của việc training model là cập nhật $W$ và $b$ để tối thiểu hóa giá trị của Loss Function, qua đó nâng cao độ chính xác của model.

Một cách lý tưởng, Loss Function nên giảm dần theo thời gian trong quá trình training như hình bên dưới:

5.2 Multi-class SVM Loss

Multi-class SVM Loss là sự mở rộng của Linear SVM, xuất hiện trong bài toán khi cần phân biệt nhiều labels (> 2). Nó sử dụng Score Function $f$ để ánh xạ mỗi Data Point thành các Scores cho mỗi nhãn.

Score Function $f$ có dạng như sau:

$f(x_i, W, b) = Wx_i + b$

Để phán định một model là “good” hay “bad”, ta cần thêm một Loss Function.

Ta đã biết khi tạo ra một ML model, chúng ta có Design Matrix $X$, ở đó, mỗi hàng của $X$ là một Data Point ($x_i$) mà chúng ta muốn phân loại (tìm nhãn cho Data Point đó). Ground-truth Label cho $x_i$, ký hiệu $y_i$ là vector mà chúng ta hi vọng Score Function sẽ dự đoán đúng.

Viết lại Score Function như sau:

$s = f(x_i, W)$

Predicted Score của class j-th tại i-th Data Point sẽ là:

$s_j = f(x_i, W)_j$

Ta định nghĩa Hinge Loss Function như sau:

$L_i = \sum_{j \neq y_i} max(0, s_j - s_{y_i} +1)$

Hàm này tính tổng các sai số giữa các Score của nhãn dự đoán so với nhãn thực tế. Ở đây, sử dụng hàm $max()$ để bỏ qua những giá trị âm của độ lệch. $x_i$ được dự đoán chính xác khi $L_i$ = 0.

Áp dụng cho toàn bộ tập training, ta lấy trung bình của mỗi $L_i$:

$L = \frac{1}{N} \sum_{i=1}^N L_i$

Một dạng khác của Loss Function mà ta có thể gặp trong một số tài liệu là Squared Hinge Loss:

$L_i = \sum_{j \neq y_i} max(0, s_j - s_{y_i} + 1)^2$

Dạng này sẽ “trừng phạt” (penalize) năng hơn Loss. Việc sử dụng dạng nào còn tùy thuộc vào dataset của bạn. Thực tế thì dạng chuẩn (không bình phương) có vẻ phổ biến hơn 1 chút. Nhưng trong nhiều bài toán, sử dụng dạng bình phương lại cho kết quả tốt hơn. Nói chung, đây sẽ là một hyperparameter mà chúng ta cần phải tuning trong quá trình xây dựng model.

Ví dụ:

Để hiểu rõ hơn, hãy cùng xem xét ví dụ sau:

Chúng ta có 3 training examples cho 3 nhãn: Dogs, Cats và Pandas. Giả sử ta đã biết giá trị của $W$ và $b$, từ đó sẽ tính được giá trị của Score Fcuntion, như trong hình.

Tính các $L_i$ cho từng example:

$L_i(Image 1) = max(0, 1.33 - 4.26 + 1) + max(0, -1.01 - 4.46 + 1) = 0$ $L_i(Image 2) = max(0, 3.76 - (-1.20) + 1) + max(0, -3.81 - (-1.20) + 1) = 5.96$ $L_i(Image 3) = max(0, -2.37 - (-2.27) + 1) + max(0, 1.03 - (-2.27) + 1) = 5.199$

Ta thấy, $L_i(Image1) = 0$, tức là Image #1 được dự đoán đoán chính xác là Dogs. Điều này cũng hợp lý vì Score của Image #1 đối với nhãn Dogs lớn hơn nhiều so với 2 nhãn còn lại.

Đối với Image #2 và Image #3, đang được dự đoán là Dogs và Cats, tương ứng. Rõ ràng, đây là dự đoán sai. Nhìn vào $L_i(cats) và L_i(pandas)$ đều > 0, ta thấy khá hợp lý với những dự đoán này.

Trong bài sau, ta sẽ học các phương pháp tối ưu để tìm ra giá trị của $W$ và $b$ để việc dự đoán sẽ đúng cho cả 3 bức ảnh.

Tham khảo