1 Gradient Descent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1 Giới thi»u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Gradient Descent cho hàm mºt bi‚n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Gradient Descent cho hàm nhi•u bi‚n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4 Gradient descent với momentum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5 Nesterov accelerated gradient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.6 Stochastic Gradient Descent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.7 Đi•u ki»n dłng thu“t to¡n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.8 Đọc th¶m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2 Perceptron Learning Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1 Giới thi»u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2 Thu“t to¡n perceptron. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3 V‰ dụ và minh ho⁄ tr¶n Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.4 Mô h…nh Neural Network đƒu ti¶n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.5 Th£o Lu“n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Contents VI 3 Logistic regression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.1 Giới thi»u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2 Hàm m§t m¡t và phương ph¡p tŁi ưu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3 Tri”n khai thu“t to¡n tr¶n Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.4 T‰nh ch§t cıa logistic regression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.5 Bài to¡n ph¥n bi»t hai chœ sŁ vi‚t tay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.6 Bº ph¥n lớp nhị ph¥n cho bài to¡n ph¥n lớp đa lớp . . . . . . . . . . . . . . . . . . . . . . . . 41 3.7 Th£o lu“n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4 Softmax Regression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.1 Giới thi»u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.2 Softmax function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Hàm m§t m¡t và phương ph¡p tŁi ưu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.4 V‰ dụ tr¶n Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.5 Th£o lu“n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5 Multilayer neural network và Backpropagation . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.1 Giới thi»u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.2 C¡c ký hi»u và kh¡i ni»m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.3 Activation function – Hàm k‰ch ho⁄t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 5.4 Backpropagation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.5 V‰ dụ tr¶n Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.6 Tr¡nh overfitting cho neural network b‹ng weight decay . . . . . . . . . . . . . . . . . . . . 74 5.7 Đọc th¶m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Trang 1Machine Learning cơ bản
Pre-order ebook tại https:// machinelearningcoban.com/ ebook/
Blog: https:// machinelearningcoban.com
Facebook Page: https:// www.facebook.com/ machinelearningbasicvn/
Facebook Group: https:// www.facebook.com/ groups/ machinelearningcoban/
Interactive Learning: https:fundaml.com
Last update:
December 17, 2017
Trang 2Phần IV Neural Networks
1 Gradient Descent 4
1.1 Giới thiệu 4
1.2 Gradient Descent cho hàm một biến 5
1.3 Gradient Descent cho hàm nhiều biến 10
1.4 Gradient descent với momentum 13
1.5 Nesterov accelerated gradient 16
1.6 Stochastic Gradient Descent 18
1.7 Điều kiện dừng thuật toán 19
1.8 Đọc thêm 20
2 Perceptron Learning Algorithm 21
2.1 Giới thiệu 21
2.2 Thuật toán perceptron 22
2.3 Ví dụ và minh hoạ trên Python 25
2.4 Mô hình Neural Network đầu tiên 27
2.5 Thảo Luận 28
Trang 33 Logistic regression 30
3.1 Giới thiệu 30
3.2 Hàm mất mát và phương pháp tối ưu 32
3.3 Triển khai thuật toán trên Python 35
3.4 Tính chất của logistic regression 38
3.5 Bài toán phân biệt hai chữ số viết tay 39
3.6 Bộ phân lớp nhị phân cho bài toán phân lớp đa lớp 41
3.7 Thảo luận 43
4 Softmax Regression 45
4.1 Giới thiệu 45
4.2 Softmax function 46
4.3 Hàm mất mát và phương pháp tối ưu 49
4.4 Ví dụ trên Python 55
4.5 Thảo luận 57
5 Multilayer neural network và Backpropagation 58
5.1 Giới thiệu 58
5.2 Các ký hiệu và khái niệm 61
5.3 Activation function – Hàm kích hoạt 63
5.4 Backpropagation 65
5.5 Ví dụ trên Python 69
5.6 Tránh overfitting cho neural network bằng weight decay 74
5.7 Đọc thêm 76
References 77
Trang 4Index 78
Trang 6x i phần tử thứ i (tính từ 1) của vector x sgn(x) hàm xác định dấu Bằng 1 nếu x ≥ 0, bằng -1 nếu x < 0.
AH chuyển vị liên hợp (Hermitian) của ma trận phức A
A−1 nghịch đảo của ma trận vuông A, nếu tồn tại
A† giả nghịch đảo của ma trận không nhất thiết vuông A
A−T nghịch đảo rồi chuyển vị của ma trận A kxk p norm p của vector x
kAk F Frobenius norm của ma trận A diag(A) đường chéo chính của ma trận A trace(A) trace của ma trận A
det(A) định thức của ma trận vuông A rank(A) hạng của ma trận A
S n tập hợp các ma trận vuông đối xứng bận n
S n + tập hợp các ma trận nửa xác định dương bậc n
S n ++ tập hợp các ma trận xác định dương bậc n o.w otherwise – trong các trường hợp còn lại
Trang 8Neural Networks
Trang 9Gradient Descent
1.1 Giới thiệu
Hình1.2 mô tả sự biến thiên của hàm số f (x) = 12(x− 1)2− 2
Điểm màu xanh lục là một điểm cực tiểu (local minimum), và cũng là điểm làm cho hàm
số đạt giá trị nhỏ nhất (global minimum) Global minimum là một trường hợp đặc biệt củalocal minimum
Giả sử chúng ta đang quan tâm đến một hàm số một biến có đạo hàm mọi nơi Chúng tacùng ôn lại một vài điểm cơ bản:
1 Điểm local minimumx∗ của hàm số là điểm có đạo hàmf0(x∗) bằng không Hơn thế nữa,trong lân cận của nó, đạo hàm của các điểm phía bên trái x∗ là không dương, đạo hàmcủa các điểm phía bên phải x∗ là không âm
2 Đường tiếp tuyến với đồ thị hàm số đó tại một điểm bất kỳ có hệ số góc chính bằng đạohàm của hàm số tại điểm đó
Trong Hình 1.1, các điểm bên trái của điểm local minimum màu xanh lục có đạo hàm âm,các điểm bên phải có đạo hàm dương Và đối với hàm số này, càng xa về phía trái của điểmlocal minimum thì đạo hàm càng âm, càng xa về phía phải thì đạo hàm càng dương
Trong machine learning nói riêng và toán tối ưu nói chung, chúng ta thường xuyên phải tìmcác giá trị lớn nhất hoặc nhỏ nhất của một hàm số Nếu chỉ xét riêng các hàm khả vi liêntục, việc giải phương trình đạo hàm bằng không thường rất phức tạp hoặc có thể ra vô sốnghiệm Thay vào đó, người ta thường cố gắng tìm các điểm local minimum, và ở một mức
độ nào đó, coi đó là một nghiệm cần tìm của bài toán
Trang 10Thực tế cho thấy, trong nhiều bài toán machine learning, các nghiệm local minimum thường
đã cho kết quả tốt, đặc biệt là trong deep learning
Hướng tiếp cận phổ biến nhất để giải quyết các bài toán tối ưu là xuất phát từ một điểmđược coi là gần với nghiệm của bài toán, sau đó dùng một phép toán lặp để tiến dần đếnđiểm cần tìm, tức đến khi đạo hàm gần với không Gradient Descent (GD) và các biến thểcủa nó là một trong những phương pháp được dùng nhiều nhất
1.2 Gradient Descent cho hàm một biến
Xét các hàm số một biết f :R → R Quay trở lại Hình 1.1 và một vài quan sát đã nêu Giả
sửxt là điểm ta tìm được sau vòng lặp thứt Ta cần tìm một thuật toán để đưa xt về cànggần x∗ càng tốt
Ta lại có thêm hai quan sát rút ra từ Hình 1.1:
1 Nếu đạo hàm của hàm số tại xt: f0(xt) > 0 thì xt nằm về bên phải so với x∗ (và ngượclại) Để điểm tiếp theo xt+1 gần với x∗ hơn, chúng ta cần di chuyển xt về phía bên trái,tức về phía âm Nói các khác, ta cần di chuyển ngược dấu với đạo hàm
Trong đó ∆ là một đại lượng ngược dấu với đạo hàm f0(xt)
Trang 112 xt càng xa x∗ về phía bên phải thì f0(xt) càng lớn hơn 0 (và ngược lại) Vậy, lượng dichuyển ∆, một cách trực quan nhất, là tỉ lệ thuận với −f0(xt).
Hai nhận xét phía trên cho chúng ta một cách cập nhật đơn giản là
1.2.1 Ví dụ đơn giản với Python
Xét hàm sốf (x) = x2+ 5 sin(x) với đạo hàm f0(x) = 2x + 5 cos(x) Giả sử bắt đầu từ mộtđiểm x0 nào đó, tại vòng lặp thứ t, chúng ta sẽ cập nhật như sau:
số có giảm theo mỗi vòng lặp hay không
learning rate và điểm bắt đầu Thuật toán dừng lại khi đạo hàm có độ lớn đủ nhỏ
Trang 1210 20 30
iter 2/11, grad = -11.063 0
10 20 30
iter 3/11, grad = -5.665 0
10 20 30
10 20 30
iter 7/11, grad = -0.066 0
10 20 30
iter 11/11, grad = -0.001 0
10 20 30
.
Hình 1.2: Nghiệm tìm được qua các vòng lặp với x0 = 5, η = 0.1
Điểm khởi tạo khác nhau
Sau khi đã có các hàm cần thiết, chúng ta thử tìm nghiệm với các điểm khởi tạo khác nhau
là x0 =−5 và x0 = 5, với cùng learning rate η = 0.1
Solution x1 = -1.110667, cost = -3.246394, after 11 iterations
Solution x2 = -1.110341, cost = -3.246394, after 29 iterations
Vậy là với các điểm ban đầu khác nhau, thuật toán của chúng ta tìm được nghiệm gần giốngnhau, mặc dù với tốc độ hội tụ khác nhau Hình 1.2 và Hình 1.3 thể hiện vị trí của nghiệm
và đạo hàm qua các vòng lặp với cùng learning rate η = 1 nhưng điểm khởi tạo khác nhautại −5 và 5
Hình 1.2 tương ứng với x0 = −5, cho thấy nghiệm hội tụ nhanh hơn, vì điểm ban đầu x0gần với nghiệm x∗
≈ −1 hơn Hơn nữa, đường đi tới nghiệm khá suôn sẻ với đạo hàm luôn
âm và càng gần nghiệm thì đạo hàm càng nhỏ
Trang 1310 20 30
iter 6/29, grad = 0.925 0
10 20 30
iter 10/29, grad = 0.983 0
10 20 30
10 20 30
iter 25/29, grad = 0.071 0
10 20 30
iter 29/29, grad = 0.001 0
10 20 30
.
Hình 1.3: Nghiệm tìm được qua các vòng lặp với x0 =−5, η = 0.1
Trong Hình 1.3 tương ứng với x0 = 5, đường đi của nghiệm có chứa một khu vực có đạohàm khá nhỏ gần điểm có hoành độ bằng 2.5 Điều này khiến cho thuật toán la cà ở đâykhá lâu Khi vượt qua được điểm này thì mọi việc diễn ra rất tốt đẹp Các điểm không phải
là điểm cực tiểu nhưng có đạo hàm gần bằng không rất dễ gây ra hiện tượng nghiệm bị bẫy(trapped ) tại đây vì đạo hàm nhỏ khiến nó không thay đổi nhiều ở vòng lặp tiếp theo Chúng
ta sẽ thấy một kỹ thuật khác giúp thoát được những chiếc bẫy này
Learning rate khác nhau
Tốc độ hội tụ của GD không những phụ thuộc vào điểm khởi tạo ban đầu mà còn phụ thuộcvào learning rate Hình 1.4 và Hình1.5 thể hiện vị trí của nghiệm qua các vòng lặp với cùngđiểm khởi tạo x0 =−5 nhưng learning rate khác nhau
Ta quan sát thấy hai điều:
1 Với learning rate nhỏ η = 0.01 (Hình 1.4), tốc độ hội tụ rất chậm Trong ví dụ này tachọn tối đa 100 vòng lặp nên thuật toán dừng lại trước khi tới đích, mặc dù đã rất gần.Trong thực tế, khi việc tính toán trở nên phức tạp, learning rate quá thấp sẽ ảnh hưởngtới tốc độ của thuật toán rất nhiều, thậm chí không bao giờ tới được đích
2 Với learning rate lớn η = 0.5 (Hình 1.5), thuật toán tiến rất nhanh tới gần đích sau vàivòng lặp Tuy nhiên, thuật toán không hội tụ được vì sự thay đổi vị trí củ nghiệm saumỗi vòng lặp là quá lớn, khiến nó cứ quẩn quanh ở đích mà vẫn không tới được đích
Trang 1410 20 30
iter 20/100, grad = -10.584 0
10 20 30
iter 30/100, grad = -6.175 0
10 20 30
10 20 30
iter 90/100, grad = -0.095 0
10 20 30
iter 100/100, grad = -0.049 0
10 20 30
10 20 30
iter 2/100, grad = -5.398 0
10 20 30
iter 3/100, grad = 5.081 0
10 20 30
10 20 30
iter 90/100, grad = -7.038 0
10 20 30
iter 100/100, grad = 4.761 0
10 20 30
.
Hình 1.5: Nghiệm tìm được qua các vòng lặp với x0 =−5, η = 0.5
Việc lựa chọn learning rate rất quan trọng Việc này phụ thuộc nhiều vào từng bài toán
và phải làm một vài thí nghiệm để chọn ra giá trị tốt nhất Ngoài ra, tùy vào một số bàitoán, GD có thể làm việc hiệu quả hơn bằng cách chọn ra learning rate phù hợp hoặc chọnlearning rate khác nhau ở mỗi vòng lặp
Trang 151.3 Gradient Descent cho hàm nhiều biến
Giả sử ta cần tìm global minimum cho hàmf (θ) trong đó θ là tập hợp các tham số cần tối
ưu Đạo hàm của hàm số đó tại một điểm θ bất kỳ được ký hiệu là ∇θf (θ) Tương tự nhưhàm một biến, thuật toán GD cho hàm nhiều biến cũng bắt đầu bằng một điểm dự đoánθ0,sau đó, ở vòng lặp thứ t, quy tắc cập nhật là
Hoặc viết dưới dạng đơn giản hơn: θ ← θ − η∇θf (θ)
1.3.1 Quay lại với bài toán Linear Regression
Trong mục này, chúng ta quay lại với bài toán linear regression và thử tối ưu hàm mất mátcủa nó bằng thuật toán GD
Nhắc lại hàm mất mát của Linear Regression và đạo hàm theo w lần lượt là:
wk2 2
1.3.2 Sau đây là ví dụ trên Python và một vài lưu ý khi lập trình
Trước hết, chúng ta tạo 1000 điểm dữ liệu được chọn gần với đường thẳng y = 4 + 3x, hiểnthị chúng và tìm nghiệm theo công thức:
from sklearn.linear_model import LinearRegression
plt.plot(X.T, y.T, ’b.’) # data
plt.plot(x0, y0, ’y’, linewidth = 4) # the fitting line
plt.axis([0, 1, 0, 10])
plt.show()
Trang 16lin-ear regression (đường thằng màuvàng) tìm được bằng thư việnscikit-learn.
Kết quả:
Solution found by sklearn: [ 3.94323245 3.12067542]
Đường thẳng tìm được là đường có màu vàng có phương trình y≈ 3.97 + 3.01x (Xem Hình
1.6) Nghiệm tìm được rất gần với kỳ vọng
Tiếp theo, ta sẽ thực hiện tìm nghiệm của linear regression sử dụng GD Ta cần viết hàmmất mát và đạo hàm theo w Chú ý rằng ở đây w đã bao gồm cả bias
return 5/N*np.linalg.norm(y - Xbar.dot(w))**2
Với các hàm phức tạp, khi tính xong đạo hàm chúng ta cần kiểm tra đạo hàm thông quanumerical gradient (xem Mục ??) Trường hợp này tương đối đơn giản, việc kiểm tra đạohàm xin giành lại cho bạn đọc Dưới đây là thuật toán GD cho bài toán
def myGD(w_init, grad, eta):
(w1, it1) = myGD(w_init, grad, 1)
print (’Sol found by GD: w = ’, w1[-1].T, ’,\nafter %d iterations.’ %(it1+1))
Trang 17Ta thấy rằng khi eta = 1, thuật toán hội tự tới nghiệm theo thư viện sau 49 vòng lặp Vớilearning rate nhỏ hơn, η = 0.1, sau hơn 100 vòng lặp, nghiệm vẫn còn cách xa nghiêm theothư viện Như vậy, việc chọn learning rate họp lý là rất quan trọng.
Ở đây, chúng ta cùng làm quen với một khái niệm quan trọng: đường đồng mức (level sets)
Ta thường gặp khái niệm đường đồng mức trong các bản đồ tự nhiên Các điểm có cùng
độ cao so với mực nước biển thường được nối với nhau Với các ngọn núi, đường đồng mứcthường là các đường kín bao quanh đỉnh núi Tối ưu cũng có khái niệm tương tự Đườngđồng mức hay level sets của một hàm số là tập hợp các điểm làm cho hàm số có cùng giá trị.Tưởng tượng một hàm số với hai biến, đồ thị của nó là một bề mặt (surface) trong khônggian ba chiều Đường đồng mức có thể được xác định bằng cách cắt bề mặt này bằng mộtmặt phẳng song song với đáy và lấy giao điểm của chúng Với dữ liệu hai chiều, hàm mấtmát của linear regression là một hàm bậc hai của hai thành phần trong vector hệ số w Đồthị của nó là một bề mặt parabolic Vì vậy, các đường đồng mức của hàm này là các đường
Trang 18Hình 1.8: So sánh Gradient Descent với các hiện tượng vật lý.
ellipse có cùng tâm như trên Hình 1.7 Tâm này chính là đáy của parabolic và là giá trị nhỏnhất của hàm mất mát Các đường đồng mức được biểu diễn bởi các màu khác nhau vớimàu từ lam đậm đến lục, vàng, cam, đỏ, đỏ đậm thể hiện giá trị tăng dần
1.4 Gradient descent với momentum
Trước hết, cùng nhắc lại thuật toán GD để tối ưu hàm mất mát J(θ):
1 Dự đoán một điểm khởi tạo θ = θ0
2 Cập nhật θ đến khi đạt được kết quả chấp nhận được:
với ∇θJ(θ) là đạo hàm của hàm mất mát tại θ
Gradient dưới góc nhìn vật lý
Thuật toán GD thường được ví với tác dụng của trọng lực lên một hòn bi đặt trên một mặt
có dạng một thung lũng như Hình 1.8a Bất kể ta đặt hòn bi ở A hay B thì cuối cùng hòn
bi cũng sẽ lăn xuống và kết thúc ở vị trí C
Tuy nhiên, nếu như bề mặt có hai đáy thung lũng như Hình 1.8b thì tùy vào việc đặt bi ở Ahay B, vị trí cuối cùng của bi sẽ ở C hoặc D Điểm D là một điểm local minimum ta khôngmong muốn
Trang 19Nếu suy nghĩ một cách vật lý hơn, vẫn trong Hình 1.8b, nếu vận tốc ban đầu của bi khi ởđiểm B đủ lớn, khi bi lăn đến điểm D, theo đà, bi có thể tiếp tục di chuyển lên dốc phía bêntrái của D Và nếu giả sử vận tốc ban đầu lớn hơn nữa, bi có thể vượt dốc tới điểm E rồilăn xuống C như trong Hình1.8c Dựa trên quan sát này, một thuật toán được ra đời nhằmgiúp GD thoát được các local minimum Thuật toán đó có tên là momentum (tức theo đà ).
Gradient Descent với momentum
Làm thế nào để biểu diễn momentum đưới dạng toán học
Trong GD, chúng ta cần tính lượng thay đổi ở thời điểmt để cập nhật vị trí mới cho nghiệm(tức hòn bi ) Nếu chúng ta coi đại lượng này như vận tốcvt trong vật lý, vị trí mới của hòn
bi sẽ làθt+1 = θt− vt, với giả sử rằng mỗi vòng lặp là một đơn vị thời gian Dấu trừ thể hiệnviệc phải di chuyển ngược với đạo hàm Việc tiếp theo là tính đại lượng vt sao cho nó vừamang thông tin của độ dốc (tức đạo hàm), vừa mang thông tin của đà, tức vận tốc trước đó
vt−1 (với giả sử rằng vận tốc ban đầu v0 = 0) Một cách đơn giản nhất, ta có thể lấy tổng
có trọng số của chúng:
Trong đó γ thường được chọn là một giá trị nhỏ hơn gần bằng một, thường là khoảng 0.9,
vt là vận tốc tại thời điểm trước đó, ∇θJ(θ) chính là độ dốc của điểm trước đó Sau đó vịtrí mới của hòn bi được xác định bởi
Thuật toán đơn giản này tỏ ra rất hiệu quả trong các bài toán thực tế (trong không giannhiều chiều, cách tính toán cũng hoàn tòan tương tự) Dưới đây là một ví dụ trong khônggian một chiều
Chúng ta xem xét một hàm đơn giản có hai điểm local minimum, trong đó một điểm làglobal minimum
với đạo hàm f0(x) = 2x + 10 cos(x) Hình 1.9 thể hiện đường đi của nghiệm cho bài toánnày khi không sử dụng momentum Ta thấy rằng thuật toán hội tụ nhanh chóng sau chỉ bốnvòng lặp Tuy nhiên, nghiệm dừng lại ở một điểm local minimum Trong khi đó, Hình 1.10
thể hiện đường đi của nghiệm khi có sử dụng momentum Chúng ta thấy rằng hòn bi vượtđược dốc thứ nhất nhờ có đà, theo quán tính tiếp tục vượt qua điểm global minimum, nhưngquay trở lại điểm này sau 50 vòng lặp rồi chuyển động chậm dần quanh đó tới khi dừng hẳn
ở vòng lặp thứ 100 Ví dụ này cho thấy momentum thực sự đã giúp nghiệm thoát được khuvực local minimum
Nếu biết trước điểm đặt bi ban đầu theta, đạo hàm của hàm mất mát tại một điểm bất kỳ
grad(theta), lượng thông tin lưu trữ từ vần tốc trước đógamma và learning rateeta, chúng ta
Trang 20iter 2/4, grad = -0.208
−10 0 10 20 30
iter 4/4, grad = -0.006
−10 0 10 20 30
Hình 1.9: Gradient descent thông thường
iter 2/100, grad = -3.535
−10 0 10 20 30
iter 10/100, grad = 9.845
−10 0 10 20 30
iter 75/100, grad = -0.462
−10 0 10 20 30
iter 100/100, grad = -0.044
−10 0 10 20 30
Hình 1.10: Gradient descent với momentum
def GD_momentum(grad, theta_init, eta, gamma):
# Suppose we want to store history of theta
theta = [theta_init]
v_old = np.zeros_like(theta_init)
for it in range (100):
v_new = gamma*v_old + eta*grad(theta[-1])
theta_new = theta[-1] - v_new
Trang 21Toạ độ điểm tính đạo hàm khác đi một chút
Hình 1.11: Ý tưởng của Nesterov accelerated gradient
1.5 Nesterov accelerated gradient
Momentum giúp hòn bi vượt qua được dốc locaminimum, tuy nhiên, có một hạn chế chúng
ta có thể thấy trong ví dụ trên: khi tới gần đích, momemtum vẫn mất khá nhiều thời giantrước khi dừng lại, chính vì có đà Một kỹ thuật có tên Nesterov accelerated gradient –NAG [Nes07] giúp cho thuật toán momentum GD hội tụ nhanh hơn
Ý tưởng chính
Ý tưởng trung tâm của thuật toán là dự đoán vị trí của nghiệm trước một bước Cụ thể, nếu
sử dụng số hạng momentum γvt−1 để cập nhật thì ta có thể xấp xỉ được vị trí tiếp theo củanghiệm là θ − γvt−1 Vậy, thay vì sử dụng gradient của điểm hiện tại, NAG đi trước mộtbước, sử dụng gradient của điểm tiếp theo Ý tưởng này được thể hiện trên Hình 1.11
• Với momentum thông thường: lượng thay đổi là tổng của hai vector: momentum vector
và gradient ở thời điểm hiện tại
• Với Nesterove momentum: lượng thay đổi là tổng của hai vector: momentum vector vàgradient ở thời điểm được xấp xỉ là điểm tiếp theo
Sự khác nhau giữa momentum và NAG nằm ở điểm lấy đạo hàm Ở momentum, điểm đượclấy đạo hàm chính là vị trí hiện tại của nghiệm Ở NAG, điểm được lấy đạo hàm là điểm cóđược nếu sử dụng momentum
Công thức cập nhật
Công thức cập nhật của NAG được cho như sau:
Trang 22(b) Nesterov accelerated gradient.
Hình 1.12: Đường đi của nghiệm cho bài toán linear regression với hai phương pháp gradientdescent khác nhau NAG cho nghiệm mượt hơn và nhanh hơn
Đoạn code dưới đây là hàm số cho NAG
def GD_NAG(grad, theta_init, eta, gamma):
theta = [theta_init]
v = [np.zeros_like(theta_init)]
for it in range (100):
v_new = gamma*v[-1] + eta*grad(theta[-1] - gamma*v[-1])
theta_new = theta[-1] - v_new
Chúng ta cùng áp dụng cả GD với momentum và GD với NAG cho bài toán linear regression
đề cập ở trên Hình 1.12 thể hiện đường đi của nghiệm khi sử dụng hai phương pháp này
Hình 1.12a là đường đi của nghiệm với phương pháp momentum nghiệm đi khá zigzag vàmất nhiều vòng lặp hơn Hình1.12blà đường đi của nghiệm với phương pháp NAG, nghiệmhội tụ nhanh hơn, và đường đi ít zigzag hơn
Trang 231.6 Stochastic Gradient Descent
1.6.1 Batch gradient descent
Thuật toán GD chúng ta sử dụng từ đầu chương tới hiện tại còn được gọi là batch gradientdescent Batch ở đây được hiểu là tất cả, tức khi cập nhật các tham số θ, chúng ta sử dụngtất cả các điểm dữ liệuxi Hạn chế của việc này là khi lượng cơ sở dữ liệu lơn tới hàng triệu,việc tính toán đạo hàm trên toàn bộ dữ liệu tại mỗi vòng lặp sẽ tốn rất nhiều thời gian
Online learning là khi cơ sở dữ liệu được cập nhật liên tục, mỗi lần tăng thêm vài điểm dữliệu mới, yêu cầu cập nhật mô hình mới Kéo theo đó là mô hình cũng phải được thay đổimột chút để phù hợp với dữ liệu mới Nếu làm theo batch GB, tức tính lại đạo hàm của hàmmất mát tại tất cả các điểm dữ liệu, thì thời gian tính toán sẽ rất lâu, và thuật toán của cóthể không còn mang tính online nữa do mất quá nhiều thời gian tính toán
Một thuật toán đơn giản hơn, chấp nhận việc có sai số một chút nhưng lại lợi ích tính toáncao, thường được sử dụng có tên gọi là stochastic gradient descent – SGD
1.6.2 Stochastic gradient descent
Trong SGD, tại một thời điểm (vòng lặp – iteration), ta chỉ tính đạo hàm của hàm mất mátdựa trên chỉ một điểm dữ liệu xi rồi cập nhật θ dựa trên đạo hàm này Chú ý rằng hàmmất mát thường được lấy trung bình trên mỗi điểm dữ liệu nên đạo hàm tại một điểm cũngthường khá gần với đạo hàm của hàm mất mát Sau khi duyệt qua tất cả các điểm dữ liệu,thuật toán quay lại quá trình trên Biến thể đơn giản này trên thực tế làm việc rất hiệu quả
epoch
Mỗi lần duyệt một lượt qua tất cả các điểm trên toàn bộ dữ liệu được gọi là một epoch
ứng với N lần cập nhật θ với N là số điểm dữ liệu Nhìn vào một mặt, việc cập nhật từngđiểm một như thế này có thể làm giảm đi tốc độ thực hiện một epoch Nhưng nhìn vào mộtmặt khác, với SGD, nghiệm có thể hội tụ sau vài vòng lặp Vì vậy SGD phù hợp với các bàitoán có lượng cơ sở dữ liệu lớn và các bài toán yêu cầu mô hình thay đổi liên tục như onlinelearning Với một mô hình đã được huấn luyện từ trước, khi có thêm dữ liệu, ta có thể chỉcần chạy thêm một vài epoch nữa là đã có nghiệm hội tụ
Thứ tự lựa chọn điểm dữ liệu
Một điểm cần lưu ý đó là sau mỗi epoch, chúng ta cần xáo trộn (shuffle) thứ tự của các dữliệu để đảm bảo tính ngẫu nhiên Việc này cũng ảnh hưởng tới hiệu năng của SGD Đâycũng chính là lý do thuật toán này có chứa từ stochastic
Trang 24Một cách toán học, quy tắc cập nhật của SGD là
trong đó J(θ; xi; yi) , Ji(θ) là hàm mất mát với chỉ một cặp điểm dữ liệu là thứ i Chú ýrằng các thuật toán biến thể của GD như momentum hay NAG hoàn toàn có thể được ápdụng vào SGD
1.6.3 Mini-batch gradient descent
số điểm dữ liệu N rất nhiều) Giống với SGD, mini-batch GD bắt đầu mỗi epoch bằng việcxáo trộn ngẫu nhiên dữ liệu rồi chia toàn bộ dữ liệu thành các mini-batch, mỗi mini-batch
cók điểm dữ liệu (trừ mini-batch cuối có thể có ít hơn nếu N không chia hết cho k) Ở mỗivòng lặp, thuật toán này lấy ra một mini-batch để tính toán đạo hàm rồi cập nhật Mộtepoch cũng là khi thuật toán chạy hết dữ liệu một lượt
Mini-batch GD được sử dụng trong hầu hết các thuật toán machine learning, đặc biệt làtrong deep learning Giá trị k thường được chọn là khoảng từ vài chục đến vài trăm
1.7 Điều kiện dừng thuật toán
Có một điểm chúng ta chưa đề cập kỹ – khi nào thì nên dừng thuật toán gradient descent?
Trong thực nghiệm, chúng ta có thể kết hợp các phương pháp sau
1 Giới hạn số vòng lặp Đây là phương pháp phổ biến nhất và cũng để đảm bảo rằng chươngtrình chạy không quá lâu Tuy nhiên, một nhược điểm của cách làm này là có thể thuậttoán dừng lại trước khi nghiệm đủ tốt
2 So sánh gradient của nghiệm tại hai lần cập nhật liên tiếp, khi nào giá trị này đủ nhỏthì dừng lại Phương pháp này cũng có một nhược điểm lớn là việc tính đạo hàm đôi khitrở nên quá phức tạp
3 So sánh giá trị của hàm mất mát của nghiệm tại hai lần cập nhật liên tiếp, khi nào giátrị này đủ nhỏ thì dừng lại Nhược điểm của phương pháp này là nếu tại một thời điểm,
đồ thị hàm số có dạng bẳng phẳng tại một khu vực nhưng khu vực đó không chứa điểmlocal minimum, thuật toán cũng dừng lại trước khi đạt giá trị mong muốn
4 Vừa chạy gradient descent, vừa kiểm tra kết quả Một kỹ thuật thường được sử dụngnữa là cho thuật toán chạy với số lượng vòng lặp cực lớn Trong quá trình chạy, chươngtrình thường xuyên kiểm tra chất lượng mô hình bằng cách áp dụng nó lên dữ liệu tập
Trang 25huấn luyện hoặc validation Đồng thời, mô hình sau một vài vòng lặp được lưu lại trong
bộ nhớ Mô hình tốt nhất có thể không phải là mô hình với số vòng lặp lớn hơn (xemthêm early stopping để tránh overfitting)
1.8 Đọc thêm
Source code trong chương này có thể được tìm thấy tại đây
Ngoài các thuật toán đã đề cập trong chương này, rất nhiều thuật toán khác giúp cải thiệngradient descent được đề xuất gần đây [Rud16] Bạn đọc có thể đọc thêm AdaGrad [DHS11],RMSProp [TH12], Adam [KB14], v.v
Các trang web và video dưới đây cũng là các tài liệu tốt cho gradient descent
1 An overview of gradient descent optimization algorithms
2 Stochastic Gradient Descent - Wikipedia
3 Stochastic Gradient Descent - Andrew Ng
4 An Interactive Tutorial on Numerical Optimization
5 Machine Learning cơ bản – Bài 7, 8
Trang 26Perceptron Learning Algorithm
2.1 Giới thiệu
Trong chương này, chúng ta cùng tìm hiểu một trong các thuật toán đầu tiên trong lịch sửmachine learning Đây là một thuật toán phân lớp đơn giản có tên là perceptron learningalgorithm (PLA [Ros57]) Thuât toán này được thiết kế cho bài toán phân lớp nhị phân(binary classification) với chỉ hai lớp dữ liệu Đây là nền tảng cho các thuật toán liên quantới neural networks rồi deep learning sau này
Giả sử có hai tập hợp dữ liệu đã được gán nhãn được minh hoạ trong Hình 2.1a Hai lớp dữliệu là tập các điểm màu xanh và tập các điểm màu đỏ Bài toán đặt ra là từ dữ liệu củahai tập được gán nhãn cho trước, hãy xây dựng một bộ phân lớp có khả năng dự đoán đượcnhãn (màu) của một điểm dữ liệu mới, chẳng hạn điểm màu xám
Nếu coi mỗi vector đặc trưng là một điểm trong không gian nhiều chiều, bài toán phân lớp
có thể được coi như bài toán xác định mỗi điểm trong không gian thuộc vào lớp nào Nóicách khác, nếu ta coi mỗi lớp chiếm một hoặc vài vùng lãnh thổ trong không gian, ta cần
đi tìm ranh giới (boundary) giữa các vùng đó Ranh giới đơn giản nhất trong không gianhai chiều là một đường thẳng, trong không gian ba chiều là một mặt phẳng, trong khônggian nhiều chiều hơn là một siêu mặt phẳng hoặc siêu phẳng (hyperplane) Những ranh giớiphẳng này được coi là đơn giản vì chúng có thể được biểu diễn dưới dạng toán học bằng mộthàm số tuyến tính Tất nhiên, ta đang giả sử rằng tồn tại một siểu phẳng như vậy Hình2.1b
minh họa một đường thẳng phân chia hai lớp trong không gian hai chiều Lãnh thổ của hailớp xanh và đỏ được mô tả bởi hai nửa mặt phẳng với màu tương ứng Trong trường hợpnày, điểm dữ liệu mới hình tam giác được phân vào lớp đỏ
Perceptron learning algorithm (PLA) là một thuật toán đơn giản giúp tìm một ranh giớisiêu phẳng cho bài toán phân lớp nhị phân, với giả sử rằng tồn tại ranh giới phẳng đó Nếuhai lớp dữ liệu có thể được phân chia hoàn toàn bằng một siêu phẳng, ta nói rằng hai lớp
đó linearly separable
Trang 272.2 Thuật toán perceptron
2.2.1 Cách phân lớp của perceptron learning algorithm
Giả sử X = [x1, x2, , xN] ∈ Rd×N là ma trận chứa các điểm dữ liệu huấn luyện mà mỗicột xi là một điểm dữ liệu trong không gian d chiều Giả sử thêm các nhãn tương ứng vớitừng điểm dữ liệu được lưu trong một vector hàng y = [y1, y2, , yN] ∈ R1×N, với yi = 1nếu xi thuộc lớp thứ nhất (vuông xanh) và yi =−1 nếu xi thuộc lớp còn lại (tròn đỏ).Tại một thời điểm, giả sử ta tìm được ranh giới là một siêu phẳng có phương trình
fw(x) = w1x1+· · · + wdxd+ w0 = wTx + w0 = 0 (2.1)với w∈ Rd là vector hệ số và w0 là số hạng tự do được gọi là bias Bằng cách sử dụng biastrick (xem Mục ??), ta có thể coi phương trình siêu phẳng làfw(x) = wTx = 0 với x ở đâyđược ngầm hiểu là vector đặc trưng mở rộng thêm một đặc trưng bằng 1 Vector hệ số wcũng chính là vector pháp tuyến của siêu phẳng wTx = 0
Trong không gian hai chiều, giả sử đường thẳng w1x1+ w2x2+ w0 = 0 chính là nghiệm cầntìm như Hình 2.2a Nhận xét rằng các điểm nằm về cùng một phía so với đường thẳng này
sẽ làm cho hàm số fw(x) mang cùng dấu Chỉ cần đổi dấu của w nếu cần thiết, ta có thểgiả sử các điểm nằm trong nửa mặt phẳng nền xanh mang dấu dương (+), các điểm nằm
của mỗi nhãn Vậy nếuw là một nghiệm của bài toán perceptron, với một điểm dữ liệu mới
x chưa được gán nhãn, ta có thể xác định nhãn của nó bằng một phép toán đơn giản:
Trang 28(b) Đường thẳng phân chia có lỗi tại các điểm khoanh tròn.
Hình 2.2: Ví dụ về các đường thẳng trong không gian hai chiều: (a) một nghiệm của bài toánPLA, (b) không phải nghiệm
2.2.2 Xây dựng hàm mất mát
gian hai chiều, giả sử đường thẳngw1x1+ w2x2+ w0 = 0 được cho như Hình2.2b Các điểmđược khoanh tròn là các điểm bị phân lớp lỗi (misclassified ) Ta luôn muốn rằng không cóđiểm nào bị phân lớp lỗi Một cách tự nhiên, ta có thể sử dụng hàm đếm số lượng các điểm
bị phân lớp lỗi và tìm cách tối thiểu hàm số này
Xét một điểm xi bất kỳ với nhãn yi Nếu nó bị phân lớp lỗi, ta phải có sgn(wTx) 6= yi Vìhai giá trị này chỉ bằng 1 hoặc −1, ta sẽ có yisgn(wTx) = −1 Như vậy, hàm số đếm sốlượng điểm bị phân lớp lỗi có thể được viết dưới dạng
Trang 29t+1xi <−yiwT
txi Điều tương tự cũng xảy ra với yi =−1 Việc này chỉ
ra rằng đường thẳng được mô tả bởiwt+1 có xu hướng khiến hàm mất mát tại điểm bị phânlớp lỗixi giảm đi Chú ý rằng việc này không đảm bảo hàm mất mát trên toàn bộ dữ liệu sẽgiảm, vì rất có thể đường thẳng mới sẽ làm cho một điểm lúc trước được phân lớp đúng trởthành một điểm bị phân lớp sai Tuy nhiên, thuật toán này được đảm bảo sẽ hội tụ sau một
số hữu hạn bước Thuật toán perceptron được tóm tắt dưới đây
Thuật toán 2.1: Perceptron
1 Tại thời điểm t = 0, chọn ngẫu nhiên một vector hệ số w0
2 Tại thời điểm t, nếu không có điểm dữ liệu nào bị phân lớp lỗi, dừng thuật toán
3 Giả sử xi là một điểm bị phân lớp lỗi Cập nhật
Trang 30Giả sử ngược lại, tồn tại một w mà Thuật toán 2.1 chạy mãi mãi Trước hết ta thấy rằng,với α > 0 bất kỳ, nếu w∗ là nghiệm, αw∗ cũng là nghiệm của bài toán Xét dãy số không
2.3 Ví dụ và minh hoạ trên Python
Thuật toán 2.1 có thể được triển khai như sau:
import numpy as np
def predict(w, X):
’’’ predict label of each row of X, given w
X: a 2-d numpy array of shape (N, d), each row is a datapoint
w_init: a 1-d numpy array of shape (d) ’’’
return np.sign(X.dot(w))
def perceptron(X, y, w_init):
’’’ perform perceptron learning algorithm
X: a 2-d numpy array of shape (N, d), each row is a datapoint
y: a 1-d numpy array of shape (N), label of each row of X y[i] = 1/-1
w_init: a 1-d numpy array of shape (d) ’’’
w = w_init
while True:
pred = predict(w, X)
# find indexes of misclassified points
mis_idxs = np.where(np.equal(pred, y) == False)[0]
# number of misclassified points
Trang 310 1 2
iter 2/6
3 2 1 0 1 2 3 1
0 1 2
0 1 2
iter 5/6
3 2 1 0 1 2 3 1
0 1 2
Trong đó, hàm predict(w, X) dự đoán nhãn của mỗi hàng của X dựa trên công thức (2.2)
ban đầu w_init
Để kiểm tra đoạn code trên, ta áp dụng nó vào một ví dụ với dữ liệu trong không gian haichiều như dưới đây
Trang 322.4 Mô hình Neural Network đầu tiên
Hình2.4a Đây chính là dạng đơn giản của neural network
Đầu vào của network x được minh họa bằng các node màu lục với node x0 luôn luôn bằng
1 Tập hợp các node màu lục được gọi là tầng đầu vào (input layer ) Số node trong inputlayer là d + 1 Đôi khi node x0 = 1 này đôi khi được ẩn đi Các trọng số w0, w1, , wdđược gán vào các mũi tên đi tới node z =Pd
i=0wixi = wTx Node y = sgn(z) là output của
Hàmy = sgn(z) còn được gọi là hàm kích hoạt (activation function) Dữ liệu đầu vào đượcđặt vào input layer, lấy tổng có trọng số lưu vào biến z rồi đi qua hàm kích hoạt để có kếtquả ở y Đây chính là dạng đơn giản nhất của một neural network Perceptron cũng có thểđược vẽ giản lược như Hình 2.4b, với ẩn ý rằng dữ liệu ở input layer được lấy tổng có trọng
số trước khi đi qua hàm lấy dấu y = sgn(z)
Các neural network có thể có một hoặc nhiều node ở output tạo thành một tầng đầu ra(output layer ), hoặc có thể có thêm các layer trung gian giữa input layer và output layer,được gọi là tầng ẩn (hidden layer ) Các neural network thường có nhiều hidden layer và cáclayer có thể có các hàm kích hoạt khác nhau Chúng ta sẽ đi sâu vào các neural network vớinhiều hidden layer ở Chương5 Trước đó, chúng ta sẽ tìm hiểu các neural network đơn giảnhơn không có hidden layer
Để ý rằng nếu ta thay activation function bởi hàm identity y = z, ta sẽ có một neuralnetwork mô tả linear regression như Hình 2.4c Với đường thẳng chéo màu xanh thể hiện đồthị hàm số y = z Các trục tọa độ đã được lược bỏ
Mô hình perceptron ở trên khá giống với một node nhỏ của dây thần kinh sinh học nhưHình2.5
Trang 33Hình 2.5: Cấu trúc của một neuron thần kinh sinh học (Nguồn: Single-Layer Neural Networksand Gradient Descent).
Dữ liệu từ nhiều dây thần kinh (tương tự như xi) đi về một cell nucleus Cell nucleus đóngvai trò như bộ lấy tổng có trọng số Pd
i=0wixi Thông tin này sau đó được tổng hợp (tương
tự như hàm kích hoạt) và đưa ra ở output Tên gọi neural network hoặc artificial neuralnetwork được khởi nguồn từ đây
2.5 Thảo Luận
PLA có thể cho vô số nghiệm khác nhau Nếu hai lớp dữ liệu là linearly separable thì
có vô số đường thằng ranh giới của hai lớp dữ liệu đó như trên Hình 2.6a Tất cả các đườngthẳng màu đen đều có thể đóng vài trò là đường ranh giới Tuy nhiên, các đường khác nhau
sẽ quyết định điểm hình tam giác thuộc các lớp khác nhau Trong các đường đó, đường nào
là tốt nhất? Và định nghĩa “tốt nhất” được hiểu theo nghĩa nào? Các câu hỏi này sẽ đượcthảo luận kỹ hơn trong Chương ??
PLA đòi hỏi hai lớp dữ liệu phải linearly separable Hình 2.6b mô tả hai lớp dữ liệutương đối linearly separable Mỗi lớp có một điểm coi như nhiễu nằm lẫn trong các điểmcủa lớp kia PLA sẽ không làm việc, tức không bao giờ dừng lại, trong trường hợp này vìvới mọi đường thẳng ranh giới, luôn có ít nhất hai điểm bị phân lớp lỗi
Trong một chừng mực nào đó, đường thẳng màu đen vẫn có thể coi là một nghiệm tốt vì
nó đã giúp phân loại chính xác hầu hết các điểm Việc không hội tụ với dữ liệu gần linearlyseparable chính là một nhược điểm lớn của PLA
Trang 34Nhược điểm này có thể được khắc phục bằng thuật toán Pocket Algorithm dưới đây.
một đường thẳng phân chia hai class sao cho có ít điểm bị phân lớp lỗi nhất Việc này cóthể được thực hiện thông qua PLA với một chút thay đổi nhỏ:
1 Giới hạn số lượng vòng lặp của PLA Đặt nghiệmw sau vòng lặp đầu tiên và số điểm bịphân lớp lỗi vào trong túi quần (pocket )
2 Mỗi lần cập nhật nghiệmwtmới, ta đếm xem có bao nhiêu điểm bị phân lớp lỗi So sánh
số điểm bị phân lớp lỗi này với số điểm bị phân lớp lỗi trong pocket, nếu nhỏ hơn thì lấynghiệm cũ ra, đặt nghiệm mới này vào Lặp lại bước này đến khi hết số vòng lặp
Thuật toán này giống với thuật toán tìm phần tử nhỏ nhất trong một mảng một chiều
Source code cho Chương này có thể được tìm thấy tại đây
Trang 35Logistic regression
3.1 Giới thiệu
3.1.1 Nhắc lại hai mô hình tuyến tính
Hai mô hình tuyến tính đã thảo luận trong cuốn sách này, linear regression và perceptron(PLA), đều có thể viết chung dưới dạng y = f (wTx) với f (s) là một hàm kích hoạt Với
f (s) = s trong linear regression, và f (s) = sgn(s) trong PLA Trong linear regression, tích
vô hướngwTx được trực tiếp sử dụng để dự đoán output y, loại này phù hợp nếu ta cần dựđoán một đầu ra không bị chặn trên và dưới Trong PLA, đầu ra chỉ nhận một trong haigiá trị 1 hoặc −1, phù hợp với các bài toán phân lớp nhị phân Trong chương này, chúng
ta sẽ thảo luận một mô hình tuyến tính với một hàm kích hoạt khác, thường được áp dụngcho các bài toán phân lớp nhị phân Trong mô hình này, đầu ra có thể được thể hiện dướidạng xác suất Ví dụ, xác suất thi đỗ nếu biết thời gian ôn thi, xác suất ngày mai có mưadựa trên những thông tin đo được trong ngày hôm nay, v.v Mô hình này có tên là logisticregression Mặc dù trong tên có chứa từ regression, logistic regression thường được sử dụngnhiều hơn cho các bài toán phân lớp
3.1.2 Một ví dụ nhỏ
Bảng 3.1: Thời gian ôn thi (Hours) và kết quả thi của 20 sinh viên
Hours Pass Hours Pass Hours Pass Hours Pass
Trang 360 1 2 3 4 5 6
hours studying 0
0
f (s) = 1 1+e −s
f (s) = e s
e s +e −s
linear
Hình 3.2: Một vài ví dụ vềcác hàm kích hoạt khác nhau
Xét một ví dụ về sự liên quan giữa thời gian ôn thi và kết quả thi của 20 sinh viên được chotrong Bảng 3.1 Bài toán đặt ra là từ dữ liệu này hãy xây dựng một mô hình đánh giá khảnăng đỗ của một sinh viên dựa trên thời gian ôn thi Dữ liệu trong Bảng3.1được mô tả trênHình3.1 Nhìn chung, thời gian học càng nhiều thì khả năng đỗ càng cao Tuy nhiên, không
có một ngưỡng nào để có thể khẳng định rằng mọi sinh viên học nhiều thời gian hơn ngưỡng
đó sẽ chắc chắn đỗ Nói cách khác, dữ liệu của hai lớp này là không linearly separable, và vìvậy PLA sẽ không hữu ích ở đây Tuy nhiên, thay vì dự đoán chính xác hai giá trị đỗ/trượt,
ta có thể dự đoán xác suất để một sinh viên thi đỗ dựa trên thời gian ôn thi
3.1.3 Mô hình logistic regression
Quan sát Hình 3.2 với các hàm kích hoạtf (s) khác nhau
• Đường màu vàng biểu diễn một hàm kích hoạt tuyến tính Đường này không bị chặn nênkhông phù hợp cho bài toán đang xét với đầu ra là một giá trị trong khoảng [0, 1]
• Đường màu đỏ tương tự với hàm kích hoạt của PLA với ngưỡng có thể khác không1
• Các đường màu lam và lục phù hợp với bài toán đang xét hơn Chúng có một vài tínhchất quan trọng:
– Là các hàm số liên tục nhận giá trị thực, bị chặn trong khoảng (0, 1)
– Nếu coi điểm có tung độ là 1/2 là ngưỡng, các điểm càng xa ngưỡng về phía bên trái
có giá trị càng gần 0, các điểm càng xa ngưỡng về phía phải có giá trị càng gần 1 Điềunày khớp với nhận xét rằng học càng nhiều thì xác suất đỗ càng cao và ngược lại
– Hai hàm này có đạo hàm mọi nơi, vì vậy có thể được lợi trong việc tối ưu
1
Đường này chỉ khác với activation function của PLA ở chỗ hai class là 0 và 1 thay vì -1 và 1.
Trang 371 + e−s
e−s
Với đạo hàm đơn giản, hàm sigmoid được sử dụng rộng rãi trong neural network
Ngoài ra, hàm tanh cũng hay được sử dụng: tanh(s) = e
s− e−s
es+ e−s Hàm số này nhận giá trịtrong khoảng (−1, 1) nhưng có thể dễ dàng đưa nó về khoảng (0, 1) Bạn đọc có thể chứngminh được rằng tanh(s) = 2σ(2s)− 1
Hàm sigmoid có thể được thực hiện trên Python như sau
Các bạn sẽ sớm thấy được hàm sigmoid được khám phá ra như thế nào
3.2 Hàm mất mát và phương pháp tối ưu
3.2.1 Xây dựng hàm mất mát
Với các mô hình với hàm mất mát màu lam và lục như trên, ta có thể giả sử rằng xác suất
để một điểm dữ liệux rơi vào lớp thứ nhất là f (wTx) và rơi vào lớp còn lại là 1− f(wTx):
trong đó p(yi = 1|xi; w) được hiểu là xác suất xảy ra sự kiện đầu ra yi = 1 khi biết tham số
mô hình w và dữ liệu đầu vào x
Trang 38Mục đích cuối cùng là là tìm các hệ số w sao cho với các điểm dữ liệu ứng với yi = 1,
f (wTxi) gần với 1, và ngược lại Ký hiệu zi = f (wTxi), hai biểu thức (3.4) và (3.5) có thểđược viết chung dưới dạng
Biểu thức này tương đương với hai biểu thức (3.4) và (3.5) ở trên vì khi yi = 1, phần thứhai của vế phải sẽ bằng 1, khi yi = 0, phần thứ nhất sẽ bằng 1 Chúng ta muốn mô hình gầnvới dữ liệu đã cho nhất, tức xác suất này đạt giá trị cao nhất
Xét toàn bộ tập huấn luyện với ma trận dữ liệuX = [x1, x2, , xN]∈ Rd×N và vector đầu
ra tương ứng với mỗi cột y = [y1, y2, , yN] Ta cần giải bài toán tối ưu
NYi=1
Lấy logarit tự nhiên, đổi dấu, và lấy trung bình, ta thu được hàm số
J(w) =−N1 log p(y|X; w) = −N1
NXi=1(yilog zi+ (1− yi) log(1− zi)) (3.9)
với chú ý rằngzi là một hàm số củaw và xi Hàm số này chính là hàm mất mát của logisticregression Ta cần đi tìm w để J(w) đạt giá trị nhỏ nhất
3.2.2 Tối ưu hàm mất mát
Bài toán tối ưu hàm mất mát của logistic regression có thể được giải quyết bằng stochasticgradient descent (SGD) Tại mỗi vòng lặp, w sẽ được cập nhật dựa trên một điểm dữ liệungẫu nhiên Hàm mất mát của logistic regression với chỉ một điểm dữ liệu (xi, yi) và đạohàm của nó lần lượt là
J(w; xi, yi) =−(yilog zi+ (1− yi) log(1− zi)) (3.10)
Trang 39Một cách tự nhiên, ta sẽ tìm hàm số z = f (s) sao cho:
do hàm sigmoid được ra đời Logistic regression với hàm kích hoạt là hàm sigmoid được sửdụng phổ biến nhất Mô hình này còn có tên là logistic sigmoid regression Đôi khi, khi nóilogistic regression, ta ngầm hiểu rằng đó chính là logistic sigmoid regression
Thay (3.12) và (3.13) vào (3.11) ta thu được
∂J(w; xi, yi)
Và công thức cập nhật nghiệm cho logistic sigmoid regression sử dụng SGD là
với η là một learning rate dương
3.2.3 Logistic regression với weight decay
Một trong các kỹ thuật phổ biến giúp tránh overfitting với các neural network là sử dụngweight decay Weight decay là một kỹ thuật regularization, trong đó một đại lượng tỉ lệ vớibình phương norm 2 của vector hệ số được cộng vào hàm mất mát để hạn chế độ lớn củacác hệ số Hàm mất mát trở thành
¯
N
NXi=1
Trang 403.3 Triển khai thuật toán trên Python
Hàm ước lượng xác suất cho mỗi điểm dữ liệu và hàm tính giá trị hàm mất mát với weightdecay có thể được thực hiện như sau trong Python
def prob(w, X):
"""
X: a 2d numpy array of shape (N, d) N datatpoint, each with size d
w: a 1d numpy array of shape (d)
return -np.mean(y*np.log(z) + (1-y)*np.log(1-z)) + 0.5*lam/X.shape[0]*np sum (w*w)
Từ công thức (3.17), ta có thể thực hiện thuật toán tìm w cho logistic regression như sau
def logistic_regression(w_init, X, y, lam = 0.001, lr = 0.1, nepoches = 2000):
# lam - reg paramether, lr - learning rate, nepoches - number of epoches