You are on page 1of 8

Bài toán tối ưu không ràng buộc cho Soft Margin SVM

1) Bài toán tối ưu không ràng buộc tương đương


Nhắc lại về bài toán tối ưu dạng chuẩn cho Soft-Margin SVM:
N
1
(w, b,  )  arg min w  C   n (4)
2

w ,b , 2
n 1

Điều kiện: 1   n  yn (wT xn  b)  0, n  1, 2,..., N ; n  0, n  1, 2,..., N

Xét điều kiện đầu tiên: 1   n  yn (wT xn  b)  0, n  1, 2,..., N

  n  1  yn (wT xn  b)

Ta cũng có: n  0, n  1, 2,..., N , kết hợp với  n  1  yn (wT xn  b) , ta sẽ được điều


kiện của bài toán tối ưu:  n  max(1  yn (wT xn  b), 0), n  1, 2,..., N

Nếu (w, b,  ) là nghiệm của bài toán tối ưu đã dẫn ở trên, ứng với giá trị nhỏ nhất
của hàm mục tiêu, ta có:  n  max(1  yn (wT xn  b), 0), n  1, 2,..., N

Giả sử ngược lại, tồn tại n sao cho  n  max(1  yn (wT xn  b), 0) , ta chọn một giá trị
 n '  max(1  yn (wT xn  b), 0) ta sẽ thu được một giá trị thấp hơn của hàm mục tiêu,
trong khi tất cả các ràng buộc đều được thỏa mãn,nhưng lại mâu thuẫn với điều
N
1
kiện (w, b,  )  arg min w  C  n
2

w ,b , 2 n 1

Khi đó, ta thay toàn bôn các giá trị n vào bài toán (4), với điều kiện nghiệm tối
ưu:
N
1
(w, b,  )  arg min w  C  (1  yn ( wT xn  b)) ,
2

w ,b , 2 n 1

điều kiện:  n  max(1  yn (wT xn  b), 0), n  1, 2,..., N

lúc này, biến số n không còn quan trọng trong bài toán này nữa, ta đưa về bài toán
N
1
dạng: (w, b)  arg min w  C  max(0,1  yn (wT xn  b)) tương đương với
2

w ,b 2
n 1

(w, b)  arg min J(w, b) , với J ( w , b) được gọi là hàm mất mát, bài toán này được
w ,b

giải bằng phương pháp Gradient Descent.


2) Hàm Hinge loss
Với mỗi cặp hệ số (w, b) và các cặp dữ liệu, nhãn (xn, yn), ta đặt zn  wT xn  b và
1
an    ( zn ) (hàm này được gọi là hàm sigmoid), hàm cross entropy được
1  e  zn
định nghĩa là: J1n (w, b)  ( yn log(an )  (1  yn ) log(1  an ))
Hàm cross entropy đạt giá trị càng nhỏ nếu an cầng gần với yn (0<an<1).
Hàm hinge loss đượng sử dụng nhiều trong các bài toán classifier:
J n (w, b)  max(0,1  yn zn )

Trong đó zn được coi là score của xn ứng với cặp hệ số (w, b) , yn chính là đầu ra
mong muồn.
Hình dưới đây mô tả hàm số hinge loss f(ys)=max(0,1-ys) và so sánh với zero-one
loss. Hàm zero-one loss là hàm đếm các điểm bị missclassified.

Hinge loss (màu xanh) và zeros-one loss (màu đen). Với zero-one loss, những điểm nằm xa
margin (hoành độ bằng 1) và boundary (hoành độ bằng 0) được đối xử như nhau. Trong khi đó,
với hinge loss, những điểm ở xa gây ra mất mát nhiều hơn.
Trong hình trên, biến số là y là tích của đầu ra mong muốn (ground truth) và đầu
ra tính được (score). Những điểm ở phía phải của trục tung ứng với những điểm
được phân loại đúng, tức s tìm được cùng dấu với y. Những điểm ở phía trái của
trục tung ứng với các điểm bị phân loại sai. Ta có các nhận xét:
 Với hàm zero-one loss, các điểm có score ngược dấu với đầu ra mong muốn sẽ
gây ra mất mát như nhau (bằng 1), bất kể chúng ở gần hay xa đường phân chia
(trục tung). Đây là một hàm rời rạc, rất khó tối ưu và ta cũng khó có thể đo đếm
được sự hy sinh như đã định nghĩa ở phần đầu.
 Với hàm hinge loss, những điểm nằm trong vùng an toàn, ứng với ys≥1, sẽ không
gây ra mất mát gì. Những điểm nằm giữa margin của class tương ứng và đường
phân chia tương ứng với 0<y<1, những điểm này gây ra một mất mát nhỏ. Những
điểm bị misclassifed, tức y<0 sẽ gây ra mất mát lớn hơn, vì vậy, khi tối thiểu hàm
mất mát, ta sẽ tránh được những điểm bị misclassifed và lấn sang phần class còn
lại quá nhiều. Đây chính là một ưu điểm của hàm hinge loss.
 Hàm hinge loss là một hàm liên tục, và có đạo hàm tại gần như mọi nơi (almost
everywhere differentiable) trừ điểm có hoành độ bằng 1. Ngoài ra, đạo hàm của
hàm này cũng rất dễ xác định: bằng -1 tại các điểm nhỏ hơn 1 và bằng 0 tại các
điểm lớn hơn 1. Tại 1, ta có thể coi như đạo hàm của nó bằng 0.
3) Xây dựng hàm loss
Bây giờ, nếu ta xem xét bài toán Soft Margin SVM dưới góc nhìn hinge loss:
Với mỗi cặp (w, b) , ta đặt:
Ln (w, b)  max(1  yn (wT xn  b), 0)
Ta lấy tổng của tất cả các Loss này theo n ta được:
N N
L(w, b)   Li  max(1  yn (wT xn  b), 0)
i 1 i 1

Trong trường hợp dữ liệu trong hai class là linearly separable, ta sẽ có giá trị tối
ưu tìm được của L(w, b) bằng không. Điều này nghĩa là:

1  yn (wT xn  b)  0, n  1, 2,..., N

Nhân cả 2 vế với một số a>1, ta được:


a  yn (a wT xn  ab)  0, n  1, 2,..., N
 1  yn (a wT xn  ab)  1  a  0, n  1, 2,..., N

Điều này nghĩa là (a w, a b) cũng là nghiệm của bài toán. Nếu không có điều kiện
gì thêm, bài toán có thể dẫn tới nghiệm không ổn định vì các hệ số của nghiệm có
thể lớn tuỳ ý.
Để tránh điều này, ta cần thêm một số hạng nữa vào hàm L(w, b) gọi là số
hạng regularization, giống như cách chúng ta đã làm để tránh overfitting trong
neural networks. Lúc này, ta sẽ có hàm mất mát tổng cộng là:
J (w, b)  L(w, b)   R(w, b)

Với  là một số dương, gọi là regularization parameter, hàm R() sẽ giúp hạn chế
việc các hệ số (w,b) trở nên quá lớn. Có nhiều cách chọn hàm R(), nhưng cách phổ
biến nhất là l2, khi đó hàm mất mát của Soft Margin SVM sau khi được viết gọn:
N

J (w )   max(1  yn w x n , 0) 
T 2
w2
1i 1 4 4 4 2 4 4 4 3 12 2 3
hinge loss regularization

Đây là một hàm lồi theo w .

Ví dụ đơn giản về bài toán SVM


Để làm các bài toán liên quan đến SVM, đầu tiên ta cần phải thêm thư viện sklearn
vào platform anaconda hoặc trực tiếp vào python. Với python, ta gõ lệnh

pip install -U scikit-learn

Với anaconda, ta thêm lệnh:

conda install scikit-learn

vào commad window hoặc anaconda prompt


Ví dụ 1: bài toán phân loại các điểm tuyến tính không nhiễu, tập dữ liệu đầu vào ít:
Đầu tiên ta khai báo các thư viện vào python:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
from sklearn import svm

Tạo tập dữ liệu các điểm và dán nhãn các điểm


x = [1, 5, 1.5, 8, 1, 9] #tung độ
y = [2, 8, 1.8, 8, 0.6, 11] #hoành độ
X = np.array([[1,2],
[5,8],
[1.5,1.8],
[8,8],
[1,0.6],
[9,11]])
z = [0,1,0,1,0,1] #label của các điểm
plt.scatter(x,y)
plt.show()

ta được kết quả như hình:


Tiếp theo ta tiến hành định nghĩa hàm phân loại dữ liệu:
clf = svm.SVC(kernel='linear', C = 1.0)
trong đó, tập dữ liệu được đưa vào là linearly separable, C là 1 hằng số xác định trường
hợp xấu nhất trong quá trình phân chia các class.
Tiếp theo:
clf.fit(X,z)
sau đó, ta tiến hành dự đoán và kiểm tra:
print(clf.predict([0.58,0.76]))
cuối cùng ta in kết quả:
w = clf.coef_[0]
print(w)

a = -w[0] / w[1]

xx = np.linspace(0,12)
yy = a * xx - clf.intercept_[0] / w[1]
h0 = plt.plot(xx, yy, 'k-', label="non weighted div")

plt.scatter(X[:, 0], X[:, 1], c = y)


plt.legend()
plt.show()
kết quả được biểu diễn như hình:

Ví dụ 2 : bài toán phân chia dữ liệu đầu vào tuyến tính, không nhiễu, với tập dữ liệu lớn :
Trong bài toán này, ta cũng xử lý giống như với bài toán trên, nhưng với tập dữ liệu lớn
hơn. Tọa độ của các điểm sẽ được lưu trong 2 file .txt ứng với 2 class 0 và 1. Dữ liệu đầu
vào sẽ được chia một cách ngẫu nhiên thành 80% dữ liệu train và 20% dữ liệu test.
Ta được kết quả như hình :
Sau đó ta tiến hành predict và test, cuối cùng ta được kết quả :

Accuracy=100%.

You might also like