7. Loss function P1 – hàm mất mát cho bài toán regression

Nếu đã tìm hiểu và khám phá về machine learning, chắc những bạn được nghe rất nhiều đến khái niệm hàm mất mát .
Trong những thuật toán tìm kiếm của trí tuệ tự tạo cổ xưa, hàm mất mát hoàn toàn có thể là một hàm mục tiêu của quy trình tìm kiếm. Quá trình tìm kiếm sẽ triển khai những đổi khác hay chiêu thức chuyển dời để hàm mục tiêu có giá trị nhỏ nhất hoặc giá trị đồng ý được .
Còn trong nghành học máy, thực chất của quy trình học máy là với mỗi tài liệu nguồn vào trong quy trình đào tạo và giảng dạy, thuật toán sẽ tìm cách đổi khác những tham số bên trong quy mô để quy mô trở nên tốt hơn trong việc “ Dự kiến ” ở tương lai với những tài liệu nguồn vào xê dịch hoặc tương tự như. Việc đổi khác trọng số của quy mô thường được triển khai bằng những thuật toán vận động và di chuyển theo độ dốc ( hay còn gọi là Gradient descend ) .

Hàm mất mát ở đây sẽ đóng vai trò đánh giá độ “tốt” của mô hình với một bộ trọng số tương ứng. Mục đích của quá trình huấn luyện là tìm ra bộ số để độ lớn hàm mất mát (loss function) là nhỏ nhất (cực tiểu). Như vậy ta có thể coi hàm mất mát là hàm mục tiêu trong quá trình huấn luyện.

Là một phần của thuật toán tối ưu hóa, loss so với trạng thái hiện tại của quy mô phải được ước đạt lặp lại. Điều này yên cầu phải lựa chọn một hàm mục tiêu, hoàn toàn có thể được sử dụng để ước tính độ lỗi của quy mô để update những trọng số nhằm mục đích giảm lỗi trong lần nhìn nhận tiếp theo .

Mục tiêu

Trong thực tiễn việc lựa chọn hàm mất mát tác động ảnh hưởng rất nhiều đến chất lượng của quy mô khi huấn luyện và đào tạo. Bài viết này sẽ cung ứng cho những bạn nội dung về những hàm mất mát hay sử dụng, so sánh và nhìn nhận những hàm mất mát trong 1 số ít bài toán đơn cử .
Mô hình mạng nơron học cách ánh xạ từ inputs vào output từ những examples và lựa chọn hàm mất mát phải tương thích với từng quy mô Dự kiến đơn cử, ví dụ như những bài toán như phân loại hoặc hồi quy .
Trong bài viết này, mình sẽ trình diễn những hàm mất mát cho mạng nơ-ron học sâu cho những bài toán khác nhau. Nội dung bài viết gồm :

  • Cách để thiết lập model cho mean squared error và các biến thể của hồi quy (regression)
  • Cách thiết lập model cho cross-entropy và hàm mất mát cho bài toán binary classification.
  • Cách thiết lập model cho cross-entropy và KL divergence loss functions cho bài toán multi-class classification.

Regression Loss Functions

Một bài toán sử dụng quy mô dự báo hồi quy thường tương quan đến việc Dự kiến một đại lượng có giá trị thực. Ví dụ bài toán Dự kiến giá nhà, Dự kiến giá CP …
Trong phần này, tất cả chúng ta sẽ khảo sát những loss function tương thích cho những bài toán regression .
Để tạo tài liệu demo cho bài toán regression, mình sẽ sử dụng hàm make_regression ( ) có sẵn trong thư viện của scikit-learn. Hàm này sẽ tạo tài liệu mẫu với những biến nguồn vào, nhiễu và những thuộc tính khác …
Chúng ta sẽ sử dụng hàm này để tạo ra tài liệu gồm 20 features, 10 features có ý nghĩa về mặt tài liệu và 10 features không có ý nghĩa. Mình sẽ tạo 1,000 điểm tài liệu ngẫu nhiên cho bài toán. Tham số random_state sẽ bảo vệ cho tất cả chúng ta những tài liệu là như nhau mỗi lần chạy .

1
2
# generate regression datasetX, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=1)

Mạng nơ ron nhìn chung sẽ hoạt động giải trí tốt hơn khi những giá trị tài liệu nguồn vào và đầu ra của quy mô được scale về cùng một miền giá trị. Khi đó thuật toán học sẽ quy tụ nhanh hơn việc thuôc tính tài liệu không cùng miền giá trị. Trong bài toán này, biến target ở dạng phân phối Gaussion, do vậy việc chuẩn hóa dữ liệu rất thiết yếu .
Mình sẽ sử dụng class StandardScaler trong thư viện scikit-learn. Còn trong trong thực tiễn tất cả chúng ta nên thiết kế xây dựng một bộ scaler cho cả tập training và tập testing. Để đơn thuần, mình sẽ scale tài liệu trước khi chia ra làm tập train và tập test

1
2
3
# chuẩn hóa dữ liệuX = StandardScaler( ) .fit_transform(X)
y = StandardScaler( ) .fit_transform(y.reshape(len(y) ,1) ) [ : ,0]

Sau khi scale xong, tất cả chúng ta sẽ chia thành tập train và tập test :

1
2
3
4
# split into train and testn_train = 500
trainX, testX = X[ :n_train, : ], X[n_train:, : ]
trainy, testy = y[ :n_train], y[n_train: ]

Để demo việc tìm hiểu và khám phá về hàm mất mát, mình sẽ sử dụng một Mã Sản Phẩm đơn thuần đó là Multilayer Perceptron ( MLP ) .
Model sẽ gồm nguồn vào là 20 features, quy mô sẽ có 1 lớp ẩn với 25 nodes, sau đó sử dụng hàm kích hoạt ReLU. Đầu ra sẽ gồm 1 node tương ứng với giá trị đầu ra muốn Dự kiến, sau cuối sẽ là một hàm kích hoạt tuyến tính .

1
2
3
4
# define ModelModel = Sequential( )
Model.add(Dense(25, input_dim=20, activation=' relu ', kernel_initializer=' he_uniform ') )
Mã Sản Phẩm.add(Dense(1, activation=' linear ') )

Mình sẽ fit quy mô này với thuật toán tối ưu stochastic gradient descent và sử dụng learning rate là 0.01, momentum 0.9
Việc huấn luyện và đào tạo sẽ triển khai qua 100 epochs và sử dụng tập testing để nhìn nhận quy mô sau mỗi epoch. Cuối cùng ta hoàn toàn có thể vẽ lại được learning curves sau khi thực thi xong .

1
2
3
4
opt = SGD(lr=0.01, momentum=0.9)
Mã Sản Phẩm.compile(loss=' ... ', optimizer=opt)
# fit Mã Sản Phẩmhistory = Mã Sản Phẩm.fit(trainX, trainy, validation_data=(testX, testy), epochs=100, verbose=0)

Vậy là giờ đây tất cả chúng ta đã có bài toán và quy mô, tiếp theo mình sẽ nhìn nhận 3 hàm mất mát thông dụng thích hợp cho những bài toán hồi quy .

Mean Squared Error Loss

Mean Square Error ( MSE ) hay còn được gọi là L2 Loss là một loss function cũng được sử dụng cho những quy mô hồi quy, đặc biệt quan trọng là những quy mô hồi quy tuyến tính. MSE được tính bằng tổng những bình phương của hiệu giữa giá trị thực ( y : target ) và giá trị mà quy mô của chúng ra Dự kiến ( y ^ : predicted ) .
MSE hoàn toàn có thể được sử dụng trong keras với giá trị là ‘ mse ‘ hoặc ‘ mean_squared_error ‘ khi đào tạo và giảng dạy quy mô

1
Model.compile(loss=' mean_squared_error ')

MSE được ưu tiên dùng cho quy mô có layer đầu ra có 1 node và sử dụng hàm kích hoạt tuyến tính
Ví dụ :

1
Model.add(Dense(1, activation=' linear ') )

Code hoàn hảo sẽ như sau :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# mlp for regression with mse loss functionfrom sklearn.datasets import make_regression
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from matplotlib import pyplot
# Tạo datasetX, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=1)
# Chuẩn hóa dữ liệuX = StandardScaler( ) .fit_transform(X)
y = StandardScaler( ) .fit_transform(y.reshape(len(y) ,1) ) [ : ,0]
# Chia tập dữ liệu training và testingn_train = 500
trainX, testX = X[ :n_train, : ], X[n_train:, : ]
trainy, testy = y[ :n_train], y[n_train: ]
# Định nghĩa quy môModel = Sequential( )
Mã Sản Phẩm.add(Dense(25, input_dim=20, activation=' relu ', kernel_initializer=' he_uniform ') )
Mã Sản Phẩm.add(Dense(1, activation=' linear ') )
opt = SGD(lr=0.01, momentum=0.9)
Mã Sản Phẩm.compile(loss=' mean_squared_error ', optimizer=opt)
# Huấn luyện quy môhistory = Mã Sản Phẩm.fit(trainX, trainy, validation_data=(testX, testy), epochs=100, verbose=0)
# Đánh giá quy môtrain_mse = Model.evaluate(trainX, trainy, verbose=0)
test_mse = Mã Sản Phẩm.evaluate(testX, testy, verbose=0)
print(' Train : %. 3 f, Test : %. 3 f ' % (train_mse, test_mse) )
# Vẽ lại đồ thị hàm mất mát trong quy trình huấn luyện và đào tạopyplot.title(' Loss / Mean Squared Error ')
pyplot.plot(history.history[' loss '], label=' train ')
pyplot.plot(history.history[' val_loss '], label=' test ')
pyplot.legend( )
pyplot.show( )

Sau khi chạy, tác dụng sẽ in ra giá trị MSE trên tập train và tập test

Chú ý khi chạy, tác dụng hoàn toàn có thể khác nhau do thuật toán khởi tạo ngẫu nhiên. Chúng ta nên chạy nhiều lần và lấy giá trị trung bình

Kết quả in ra sẽ là :

1
Train: 0.000, Test: 0.001

Biểu đồ đường biểu lộ giá trị MSE trong quy trình đào tạo và giảng dạy của tập train ( màu xanh ) và tập test ( màu cam )

Kết quả huấn luyện
Kết quả huấn luyện dựa trên loss

Chúng ta hoàn toàn có thể thấy quy mô đã quy tụ nhanh gọn. Như vậy MSE biểu lộ tốt trong trường hợp này .

Mean Squared Logarithmic Error Loss

Có một yếu tố với những quy mô hồi quy, đó là giá trị Dự kiến có sự chênh lệch lớn hoặc rất lớn, nghĩa là khi tất cả chúng ta Dự kiến được một giá trị lớn, ta không cần phải đánh phạt trọng số một cách nặng nề ( nghĩa là những trọng số không nên được đổi khác nhiều ) như khi dùng MSE .
Thay vào đó, thứ nhất bạn hoàn toàn có thể lấy logarit của từng giá trị Dự kiến, sau đó tính sai số bình phương trung bình. Đây được gọi là mất mát lỗi lôgarit trung bình bình phương, viết tắt là MSLE .
Nó có ý nghĩa là giảm việc phạt trọng số khi Dự kiến được một giá trị lớn .
Như một phép đo sự mất mát, điều này sẽ giúp quy mô xê dịch tốt hơn khi Dự kiến những giá trị chưa được scale. Mình sẽ chứng tỏ hàm mất mát này bằng một bài toán regression đơn thuần :
Mình sẽ biến hóa hàm mất mát khi huấn luyện và đào tạo bằng hàm ‘ mean_squared_logarithmic_error ‘ và để nguyên những quy mô ở những layer đầu ra. Sau đó mình sẽ tính sai số bình phương trung bình để vẽ đồ thị .

1
Model.compile(loss=' mean_squared_logarithmic_error ', optimizer=opt, metrics=[' mse '] )

Code hoàn hảo như sau :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# mlp for regression with mse loss functionfrom sklearn.datasets import make_regression
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from matplotlib import pyplot
# Tạo datasetX, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=1)
# Chuẩn hóa dữ liệuX = StandardScaler( ) .fit_transform(X)
y = StandardScaler( ) .fit_transform(y.reshape(len(y) ,

1

) ) [ : ,0] # Chia tập dữ liệu training và testingn_train = 500 trainX, testX = X[ :n_train, : ], X[n_train:, : ] trainy, testy = y[ :n_train], y[n_train: ] # Định nghĩa quy môModel = Sequential( ) Mã Sản Phẩm.add(Dense(25, input_dim=20, activation=' relu ', kernel_initializer=' he_uniform ') ) Mã Sản Phẩm.add(Dense(1, activation=' linear ') ) opt = SGD(lr=0.01, momentum=0.9) Mã Sản Phẩm.compile(loss=' mean_squared_logarithmic_error ', optimizer=opt, metrics=[' mse '] ) # Huấn luyện quy môhistory = Model.fit(trainX, trainy, validation_data=(testX, testy), epochs=100, verbose=0) # Đánh giá quy môtrain_mse = Mã Sản Phẩm.evaluate(trainX, trainy, verbose=0) test_mse = Mã Sản Phẩm.evaluate(testX, testy, verbose=0) print(' Train : %. 3 f, Test : %. 3 f ' % (train_mse, test_mse) ) # Vẽ lại đồ thị hàm mất mát trong quy trình giảng dạypyplot.subplot(212) pyplot.title(' Mean Squared Error ') pyplot.plot(history.history[' mean_squared_error '], label=' train ') pyplot.plot(history.history[' val_mean_squared_error '], label=' test ') pyplot.legend( ) pyplot.show( )

Chạy đoạn code sẽ sẽ in ra lỗi bình phương trung bình cho quy mô khi huấn luyện và đào tạo và tập tài liệu thử nghiệm .

Chú ý khi chạy, hiệu quả hoàn toàn có thể khác nhau do thuật toán khởi tạo ngẫu nhiên. Chúng ta nên chạy nhiều lần và lấy giá trị trung bình

Trong trường hợp này, tất cả chúng ta hoàn toàn có thể thấy rằng quy mô dẫn đến MSE kém hơn một chút ít trên cả tập tài liệu đào tạo và giảng dạy và kiểm tra. Nó hoàn toàn có thể không tương thích cho bài toán này vì phân phối của biến tiềm năng là một phân phối chuẩn Gaussian .

1
Train: 0.165, Test: 0.184

Biểu đồ sau bộc lộ những giá trị loss MSLE qua mỗi epochs, đường màu xanh bộc lộ trên tập huấn luyện, màu cam bộc lộ trên tập test
Chúng ta hoàn toàn có thể thấy rằng MSLE đã quy tụ tốt khi thực thi được 100 epochs ; còn MSE có vẻ như như biến hóa quá mức, loss giảm nhanh và mở màn tăng từ 20 epochs trở đi .

Line Plots of Mean Squared Logarithmic Error Loss and Mean Squared Error Over Training Epochs
Line Plots of Mean Squared Logarithmic Error Loss and Mean Squared Error Over Training Epochs

Mean Absolute Error Loss

Trong một số ít bài toán hồi quy, phân phối của biến tiềm năng hoàn toàn có thể hầu hết là phân phối Gaussian, nhưng hoàn toàn có thể có những giá trị ngoại lệ, ví dụ : giá trị lớn hoặc nhỏ khác xa với giá trị trung bình .
Mean Absolute Error ( MAE ) hay còn được gọi là L1 Loss là một loss function được sử dụng cho những quy mô hồi quy, đặc biệt quan trọng cho những quy mô hồi quy tuyến tính. MAE được tính bằng tổng những trị tuyệt đối của hiệu giữa giá trị thực ( y : target ) và giá trị mà quy mô của chúng ra Dự kiến ( y ^ : predicted ) .

Công thức

Mình sẽ biến hóa hàm mất mát khi giảng dạy bằng hàm ‘ mean_absolute_error ‘ và để nguyên những quy mô ở những layer đầu ra. Sau đó mình sẽ tính sai số bình phương trung bình để vẽ đồ thị .

1
Model.compile(loss=' mean_absolute_error ', optimizer=opt, metrics=[' mse '] )

Code hoàn hảo như sau :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# mlp for regression with mae loss functionfrom sklearn.datasets import make_regression
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from matplotlib import pyplot
# generate regression datasetX, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=1)
# standardize datasetX = StandardScaler( ) .fit_transform(X)
y = StandardScaler( ) .fit_transform(y.reshape(len(y) ,1) ) [ : ,0]
# split into train and testn_train = 500
trainX, testX = X[ :n_train, : ], X[n_train:, : ]
trainy, testy = y[ :n_train], y[n_train: ]
# define Mã Sản PhẩmModel = Sequential( )
Mã Sản Phẩm.add(Dense(25, input_dim=20, activation=' relu ', kernel_initializer=' he_uniform ') )
Mã Sản Phẩm.add(Dense(1, activation=' linear ') )
opt = SGD(lr=0.01, momentum=0.9)
Mã Sản Phẩm.compile(loss=' mean_absolute_error ', optimizer=opt, metrics=[' mse '] )
# fit Mã Sản Phẩmhistory = Model.fit(trainX, trainy, validation_data=(testX, testy), epochs=100, verbose=0)
# evaluate the Model_, train_mse = Mã Sản Phẩm.evaluate(trainX, trainy, verbose=0)
_, test_mse = Model.evaluate(testX, testy, verbose=0)
print(' Train : %. 3 f, Test : %. 3 f ' % (train_mse, test_mse) )
# plot loss during trainingpyplot.subplot(211)
pyplot.title(' Loss ')
pyplot.plot(history.history[' loss '], label=' train ')
pyplot.plot(history.history[' val_loss '], label=' test ')
pyplot.legend( )
# plot mse during trainingpyplot.subplot(212)
pyplot.title(' Mean Squared Error ')
pyplot.plot(history.history[' mean_squared_error '], label=' train ')
pyplot.plot(history.history[' val_mean_squared_error '], label=' test ')
pyplot.legend( )
pyplot.show( )

Code sẽ in ra giá trị MLSE cho quy mô trên tập huấn luyện và tập thử nghiệm .

Chú ý khi chạy, kết quả có thể khác nhau do thuật toán khởi tạo ngẫu nhiên. Chúng ta nên chạy nhiều lần và lấy giá trị trung bình

1
Train: 0.002, Test: 0.002

Trong trường hợp này, tất cả chúng ta hoàn toàn có thể thấy rằng MAE thực sự quy tụ nhưng vẫn có đường gồ ghề, mặc dầu tổng quát của MSE không bị ảnh hưởng tác động nhiều. Chúng ta biết rằng phân phối của biến tiềm năng là một phân phối Gaussian chuẩn không có giá trị ngoại lệ lớn, thế cho nên MAE sẽ không tương thích trong trường hợp này .

Line plots of Mean Absolute Error Loss and Mean Squared Error over Training Epochs

Tổng kết

Trong phần 1 mình đã trình làng cho những bạn 2 hàm loss được dùng cho bài toán regression, trong bài tiếp theo ( p2 ) mình sẽ ra mắt hàm loss cho bài toán Binary classification và phần 3 là những hàm loss cho bài toán phân đa lớp .

Tham khảo

Posts

Papers

API

Articles

Rate this post
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments