Skip to main content

Mô hình Softmax Regression

Giới thiệu

Hồi quy là công cụ đắc lực có thể sử dụng khi ta muốn trả lời câu hỏi bao nhiêu?. Nếu bạn muốn dự đoán một ngôi nhà sẽ được bán với giá bao nhiêu tiền (Đô la), hay số trận thắng mà một đội bóng có thể đạt được, hoặc số ngày một bệnh nhân phải điều trị nội trú trước khi được xuất viện, thì có lẽ bạn đang cần một mô hình hồi quy.

Trong thực tế, ta thường quan tâm đến việc phân loại hơn: không phải câu hỏi bao nhiêu? mà là loại nào?

Email này có phải thư rác hay không? Bệnh nhân này có khối u ác tính không? Khách hàng này nhiều khả năng đăng ký hay không đăng ký một dịch vụ thuê bao? Hình ảnh này mô tả một con bò, một con chó, một con heo hay một con gà trống? Bộ phim nào có khả năng cao nhất được giải Osca xem tiếp theo?

Hồi quy Softmax là một phương pháp trong học máy cho phép phân loại đầu vào thành các lớp rời rạc.Không giống như hồi quy logistic thường được sử dụng, chỉ có thể thực hiện phân loại nhị phân, softmax cho phép phân loại thành bất kỳ số lượng lớp nào có thể.

Các bài toán classification thực tế thường có rất nhiều classes (multi-class), các binary classifiers mặc dù có thể áp dụng cho các bài toán multi-class, chúng vẫn có những hạn chế nhất định. Với binary classifiers, kỹ thuật được sử dụng nhiều nhất one-vs-rest có một hạn chế về tổng các xác suất. Softmax Regression, phương pháp này được sử dụng rộng rãi như một phương pháp classification.

Phương pháp

Ý tưởng của bài toán

  • Chúng ta cần một mô hình xác suất sao cho với mỗi input x , aia_i thể hiện xác suất để input đó rơi vào class i . Vậy điều kiện cần là các aia_i phải dương và tổng của chúng bằng 1. Để có thể thỏa mãn điều kiện này, chúng ta cần nhìn vào mọi giá trị ziz_i và dựa trên quan hệ giữa các ziz_i này để tính toán giá trị của aia_i. Ngoài các điều kiện aia_i lớn hơn 0 và có tổng bằng 1, chúng ta sẽ thêm một điều kiện cũng rất tự nhiên nữa, giá trị zi=WiTXz_i = W_i ^ TX càng lớn thì xác suất dữ liệu rơi vào class i càng cao. Điều kiện cuối này chỉ ra rằng chúng ta cần một hàm đồng biến ở đây.

  • Chú ý rằng ziz_i có thể nhận giá trị cả âm và dương. Một hàm số mượt đơn giản có thể chắc chắn biến ziz_i thành một giá trị dương, và hơn nữa, đồng biến, là hàm exp(zi)=eziexp(z_i) = e^{z_i}. Điều kiện cuối cùng, tổng các aia_i bằng 1 có thể được đảm bảo nếu: ai=exp(zi)j=1Cexp(zi),j=1,2,...Ca_i = \frac{exp(z_i)}{\sum_{j=1}^{C} exp(z_i)}, \forall j= 1,2,...C

  • Hàm số này, tính tất cả các ai dựa vào tất cả các aia_i , thỏa mãn tất cả các điều kiện đã xét: dương, tổng bằng 1, giữ được thứ tự của ziz_i . Hàm số này được gọi là softmax function.

Kiểu dữ liệu của phương pháp:

  • Tùy thuộc vào kiểu dữ liệu đầu vào, thường là tập dữ liệu có các tính năng ‘m’ và ‘n’ hay các quan sát. Ngoài ra, có các nhãn lớp ‘k’, tức là mọi quan sát có thể được phân loại là một trong các giá trị mục tiêu có thể có của‘k’.
  • Chuẩn hóa dữ liệu là một bước cần thiết giúp input có sự đồng nhất tạo sự dễ dàng trong việc xử lí và sử dụng dữ liệu.

Ví dụ minh họa cho bài toán ở phần đầu.

Có n chiếc xe cần đến đón các học sinh trong toàn tỉnh để đưa các bạn học sinh đi du lịch. Bài toán đặt ra là làm sao để tiết kiệm xăng và thời gian nhất có thể để chúng ta cần phân chia xe đến đón học sinh. Vì thế chúng ta có thể áp dụng phương pháp trên cho bài toán này.

Ưu và nhược điểm của phương pháp:

Ưu điểm:

  • Hàm softmax là tối ưu khi tính toán xác suất tối đa trong tham số mô hình.
  • Tính chất của hàm softmax khiến hàm phù hợp với sự thông dịch xác suất, rất hữu ích trong Machine Learning (Học máy).
  • Chuẩn hóa softmax là một cách để giảm thiểu ảnh hưởng của những giá trị cực trị hay dữ liệu ngoại lai trong dữ liệu mà không phải chỉnh sửa dữ liệu ban đầu.

Nhược điểm:

Có độ phức tạp cao với lượng dữ liệu lớn và nhiều chiều.

Cài đặt chương trình

import numpy as np 
import matplotlib.pyplot as plt
from scipy import sparse

Định nghĩa hàm tính toán softmax

def softmax(Z):
#Hàm tính toán softmax
e_Z = np.exp(Z - np.max(Z, axis = 0, keepdims = True))
A = e_Z / e_Z.sum(axis = 0)
return A

Hàm phân cụm dữ liệu

def kmeans_display(X, label):
K = np.amax(label) + 1 #Số lớp của dataset
#Tách ra thành 3 mẫu data
X0 = X[label == 0, :]
X1 = X[label == 1, :]
X2 = X[label == 2, :]
#Visualize
plt.plot(X0[:, 0], X0[:, 1], 'b^', markersize = 4, alpha = .8)
plt.plot(X1[:, 0], X1[:, 1], 'go', markersize = 4, alpha = .8)
plt.plot(X2[:, 0], X2[:, 1], 'rs', markersize = 4, alpha = .8)

plt.axis('equal')
plt.plot()
plt.show()

Hàm chuyển nhãn về dạng one-hot

def convert_labels(y, C = 3):

#Chuyển về dạng one-hot vector có kích thước 3 x y.shape[0]
#VD: y[0] = 1 thì sẽ được chuyển về dạng [[0],
# [1],
# [0]]
Y = sparse.coo_matrix((np.ones_like(y),
(y, np.arange(len(y)))), shape = (C, len(y))).toarray()
return Y

Hàm đánh giá model

def evaluation(X, y, W, count):
# Tính toán độ chính xác của model trên tập data
y_pred = softmax(np.dot(W.T, X))

y_pred = [np.where(y_pred[:, i] == np.amax(y_pred[:, i])) for i in range(y_pred.shape[1])] # Chọn nhãn có xác xuất dự đoán cao nhất

ss = [y_pred[i]==y[i] for i in range(len(y))] # So sánh kết quả dự đoán và kết quả thực tế
eval = ss.count(True)/len(ss) *100 # Tính toán độ chính xác là bao nhiêu phần trăm
print("Accuracy in epoch " + str(count) + ": " + str(eval))

Tính toán bằng thuật toán softmax

def softmax_regression(X, y, W_init, eta, tol = 1e-4, max_count = 1000):
W = [W_init] # Khởi tạo tham số
C = W_init.shape[1] # Xác định số lớp phân loại
Y = convert_labels(y, C) # Chuyển label về dạng one-hot vector
N = X.shape[1] # Số lượng feature trên một điểm dữ liệu
d = X.shape[0] # Số lượng điểm dữ liệu

count = 0
check_w_after = 20 # Sau 20 epoch, kiểm tra lại tham số
while count < max_count:
# mix data
mix_id = np.random.permutation(N) # Tạo list chứa N phần tử, mỗi phần tử được tạo random từ 0 tới N
for i in mix_id:
xi = X[:, i].reshape(d, 1)
yi = Y[:, i].reshape(C, 1)
ai = softmax(np.dot(W[-1].T, xi)) # Dùng tham số mới nhất để tính toán softmax
W_new = W[-1] + eta*xi.dot((yi - ai).T) # Cập nhật lại tham số theo công thức
count += 1

if count%check_w_after == 0:
evaluation(X, y, W[-1], count)
if np.linalg.norm(W_new - W[-check_w_after]) < tol: # Kiểm tra xem tham số mới có thay đổi đáng kể
#so với tham số đứng trước nó 20 vị trí trong list
return W

W.append(W_new) # Thêm tham số sau khi được cập nhật vào list để lưu trữ

evaluation(X, y, W[-1], count)

return W

Tiến hành tạo dữ liệu và tính toán

# Quy định data khởi tạo có phân phối chuẩn kỳ vọng (means) và có ma trận hiệp phương sai của phân phối (cov)
#như sau
means = [[2, 0], [10, 5], [3, 7]]
cov = [[1, 0], [0, 1]]
N = 500 #Kích thước dữ liệu là 500

X0 = np.random.multivariate_normal(means[0], cov, N) # Tạo data theo các quy định trên, mỗi tập data sẽ có label
X1 = np.random.multivariate_normal(means[1], cov, N) #giống nhau
X2 = np.random.multivariate_normal(means[2], cov, N)

X = np.concatenate((X0, X1, X2), axis = 0).T # Kết hợp 3 tập data lại với nhau tạo thành tập data chung
K = 3
#print(X.shape)
original_label = np.asarray([0]*N + [1]*N + [2]*N).T #Tạo array chứa các label cho từng điểm dữ liệu

#kmeans_display(X, original_label) #Visualize dữ liệu
W_init = np.random.randn(X.shape[0], 3)
#print(W_init.shape)
W = softmax_regression(X, original_label, W_init, 0.05)
#print(W_init[-1])

Kết quả sau khi chạy: Độ chính xác Acc cao nhất: 89.2 % Kết quả visualize model phân lớp:

Bài tập

Xây dựng mô hình Softmax Regression cho bài toán phân lớp. Các bước thực hiện:

  • Bước 1: Import các thư viện và đọc file csv(có thể tự tạo dữ liệu)
  • Bước 2: Trích xuất ra các đặc trưng quan trọng từ file csv để đưa vào mô hình
  • Bước 3: Phân chia bộ dữ liệu thành 75% train và 25% test
  • Bước 4: Scaler dữ liệu
  • Bước 5: Xây dựng mô hình phân lớp Softmax Regresstion từ bộ dữ liệu đã tiền xử lý ở trên
  • Bước 6: Dự đoán trên bộ dữ liệu test
  • Bước 7: Kiểm tra hiệu suất của mô hình
  • Bước 8: Trực quan hóa kết quả của mô hình phân lớp trên.

Tổng kết:

Thường được sử dụng trong những phương thức phân loại đa lớp trong lĩnh vực Machine Learning, Deep Learning và Data Science (Khoa học dữ liệu). Ý tưởng cơ bản là từ input đầu vào, sử dụng softmax function để tính toán xác suất các lớp mà đối tượng đó có thể thuộc về rồi chọn ra lớp phù hợp với xác suất lớn nhất. Xác suất tính được sẽ giúp quyết định lớp chính xác cho một giá trị đầu vào. Khi nào nên sử dụng Softmax Regression:

  • Thứ nhất, đầu vào là một tập có nhiều tính năng và đầu ra của dữ liệu là phân loại với số lượng lớp lớn.
  • Thứ hai, khi bạn cần xác suất cho dự đoán của bạn. Ví dụ như nếu ta muốn biết xác suất của khách hàng mua sản phẩm cho từng loại mặt hàng cụ thể là gì. Hồi quy Softmax trả về xác suất từ 0 đến 1 cho các lớp mà đối tượng mà đối tượng có thể thuộc về.

Tác giả

- Phan Tiến Ngọc
- Hồ Quốc Thư
- Đặng Quang Anh Tuấn