“Oánh giá” model AI theo cách Mì ăn liền – Chương 1. Loss và Accuracy

Hế nhô cuối tuần anh em Mì AI, hôm nay chúng ta sẽ tìm hiểu cách đánh giá model AI theo phong cách Mì ăn liền nha. Trong phần 1 này chúng ta sẽ đi tìm hiểu về Loss và Accuracy cho model nha.

Nói về đánh giá model thì có nhiều, ah quên phải là rất nhiều bài viết trên mạng, từ chuyên gia đến newbie, từ Tây lông đến châu Á….nhưng mà mình đọc vẫn chưa thấy dễ hiểu lắm, chắc có lẽ mình quá newbie :(.

Do đó hôm nay mình sẽ cùng nhau tìm hiểu về cách đánh giá model theo cách đơn giản, dễ hiểu của newbie. Mong các cao thủ nếu đi qua comment giúp và bỏ quá vì em nói một cách không academic chút nào nhé.

Khi nói đến đánh giá model, ngay lập tức trong đầu anh em nghĩ đến thông số gì? Chắc chắn là LOSS và ACCURACY đúng ko? Vậy thì hãy tìm hiểu 2 món này nào?

Accuracy là gì?

Dịch Tiếng Anh ra thôi! Accuracy = Sự chính xác. Đơn giản vậy thôi!

accuracy

Ví dụ chúng ta đưa vào model 50 cái ảnh gồm cả chó và mèo vào một model phân loại. Sau khi chạy xong model thì thấy rằng có 30 ảnh được nhận diện đúng còn lại 20 ảnh nhận sai bét tè lè nhè.

Vậy ta có :

$$\large Accuracy = \frac{30}{50} = 0.6$$

Hay một cách tổng quát ta có:

$$\large Accuracy = \frac{n}{N}$$

Trong đó:

  • n: Số sample dự đoán đúng
  • N: Tổng số sample đưa vào dự đoán

Ta có thể tạm hiểu rằng model có accuracy càng cao thì càng tốt vì sẽ dự đoán được chính xác nhiều nhất (tạm hiểu nhé, trong các chương sau sẽ có các tham số khác nữa như Precision, Recall….)

Thế còn Loss là gì?

Lại dịch tiếp thôi? Sau khi Google translate thì Loss – sự mất mát?

Vậy nó có nghĩa là gì? Loss thường là một số thực không âm (trừ một số trường hợp loss là cosin proximity ) thể hiện sự chênh lệch giữa hai đại lượng: nhãn thật của dữ liệu và nhãn của dữ liệu do model của chúng ta predic ra.

loss
Nguồn: Tại đây

Hay nói một cách bình dân học vụ thì Loss là khoảng cách giữa vector nhãn thực và vector nhãn model predict ra , model dự đoán càng lệch so với giá trị thực thì Loss (độ sai) càng to và ngược lại, nếu dự đoán càng sát với giá trị thực thì Loss (độ sai) sẽ nhỏ dần về 0.

Hai phương án có thể có cùng Accuracy nhưng Loss sẽ có thể khác nhau nhé. Nhiều bạn rất hay nhầm lẫn và đánh đồng hai khái niệm này. Ví dụ như với bài toán chó mèo đi, giả sử dữ liệu predict chỉ có duy nhất 1 ảnh CHÓ (vector nhãn thực là [1 , 0], probability là chó là 1 và mèo là 0, tạm gọi là y) và:

  • Phương án 01: Dự đoán ra probability của một ảnh đầu vào như sau 0.8 là chó và 0.2 là mèo (vector predict $\hat{y}$ = [0.8, 0.2]) -> Ta quyết định ảnh này là CHÓ và dự đoán đúng -> Accuracy = 1.
  • Phương án 02: Vector predict $\hat{y}$ = [0.6, 0.4] -> Ta cũng vẫn quyết định đây là CHÓ vì probability là chó vẫn cao hơn và -> Accuracy = 1

Tuy nhiên nhìn bằng mắt thường ta cũng thấy rõ ràng Phương án 1 tốt hơn vì dự đoán sát hơn với vector nhãn thực. Trong thực tế chúng ta sẽ sử dụng một số hàm loss khác nhau tùy vào bài toán cụ thể như: Hinge Loss, Cross Entropy Loss,…nhưng tóm lại bạn cứ hiểu nôm na là Loss là hàm số trả về một số thực không âm để chỉ ra model của ta đang dự đoán sát (loss nhỏ) hay xa (loss to) so với nhãn thực của dữ liệu.

Các bạn có thể nhìn 02 graph dưới đây để thấy rõ. Hình bên trái loss khá lớn vì khoảng cách giữa đường dự đoán (xanh blue) và các điểm dữ liệu là khá xa. Hình bên phải thì ngon lành hơn nhiều 😀

loss và accuracy
Nguồn: Tại đây

Ví dụ về công thức hàm loss Cross Entropy được dùng khá nhiều trong các bài toán Deep Learning:

$$\text{Loss} = -\sum_{i=1}^n \sum_{j=1}^m y_{i,j}\log_e(p_{i,j})$$

Trong đó:

  • n: Số lượng điểm dữ liệu
  • m: Số lượng class
  • $y_{i,j}$: Đây là nhãn thật của dữ liệu. $y_{i,j}$=1 nếu điểm dữ liệu i thuộc class j và =0 nếu ngược lại.
  • $p_{i,j}$: Đay là nhãn dự đoán ra. $p_{i,j}$ thể hiện probability mà model của bạn dự đoán điểm dữ liệu i thuộc class j.
Tổng kết

Chúng ta có thể tổng hợp việc tính toán Loss và Accuracy cho một phương án với các điểm dữ liệu như bảng sau:

loss và accuracy
Bảng 1

Thông thường thì khi accuracy cao thì loss sẽ giảm vì theo suy nghĩ tự nhiên là dự đoán càng sát (loss giảm) thì càng chính xác (accuracy cao). Điều đó đúng trong đại đa số trường hợp nhưng không phải là tất cả. Ví dụ chúng ta lại tính toán Loss và Acc cho Phương án sau:

loss và accuracy
Bảng 2

So sánh Bảng 1 và Bảng 2 rõ ràng phương án trong Bảng 2 có Accuracy lớn hơn nhưng Loss cũng lớn kaka.

Lý do là vì accuracy and loss (cross-entropy) là hai đại lượng dùng để đo lường 2 thứ khác nhau. Cross-entropy loss sẽ thấp khi model dự đoán sát với nhãn của dữ liệu. Trong khi đó accuracy, chỉ trả về 0/1 cho từng điểm dữ liệu. Loss sẽ là một biến liên tục và thấp nhất khi model dự đoán sát với nhãn của dữ liệu.

Plot loss và accuracy trên đồ thị

Trong thực tế train model, người ta hay plot loss và accuracy lên trên biểu đồ để trực quan hóa và dựa vào kinh nghiệm sẽ “ngắm” ra được vấn đề của model.

loss và accuracy
Nguồn: Tại đây

Ví dụ như hình trên, khi số epoch tăng lên thì cả Train Loss và Validation Loss đều giảm, Train Acc và Val Acc đều tăng. Điều đó là phù hợp. Nhưng nếu như trong quá trình plot ra, bạn thấy đến một epoch nào đó tự nhiên train loss vẫn giảm và val loss bắt đầu tăng lên thì model của bạn đã bắt đầu Overfit rồi đó.

Nguồn: Tại đây

Đó chỉ là 1 ví dụ để minh họa cho việc plot loss và acc ra đồ thị có lợi như nào. Các bạn có thể tìm hiểu thêm qua link này nhé.

Còn bây giờ xin tặng các bạn một đoạn source ví dụ để in loss và acc ra đồ thị thay lời chào tạm biệt cho Chương 1 nhé. Hẹn gặp lại các bạn trong các bài tiếp theo với Precision, Recall….

# Đầu tiên ta lưu lịch sử train vào biến history
history = model.fit_generator(aug.flow(X_train, y_train, batch_size=64), epochs=50, validation_data=aug.flow(X_test,y_test, batch_size=128))

# Tiếp theo ta plot các thông số loss và acc ra
def plot_model_history(model_history, acc='accuracy', val_acc='val_accuracy'):
    fig, axs = plt.subplots(1, 2, figsize=(15, 5))
    axs[0].plot(range(1, len(model_history.history[acc]) + 1), model_history.history[acc])
    axs[0].plot(range(1, len(model_history.history[val_acc]) + 1), model_history.history[val_acc])
    axs[0].set_title('Model Accuracy')
    axs[0].set_ylabel('Accuracy')
    axs[0].set_xlabel('Epoch')
    axs[0].set_xticks(np.arange(1, len(model_history.history[acc]) + 1), len(model_history.history[acc]) / 10)
    axs[0].legend(['train', 'val'], loc='best')
    axs[1].plot(range(1, len(model_history.history['loss']) + 1), model_history.history['loss'])
    axs[1].plot(range(1, len(model_history.history['val_loss']) + 1), model_history.history['val_loss'])
    axs[1].set_title('Model Loss')
    axs[1].set_ylabel('Loss')
    axs[1].set_xlabel('Epoch')
    axs[1].set_xticks(np.arange(1, len(model_history.history['loss']) + 1), len(model_history.history['loss']) / 10)
    axs[1].legend(['train', 'val'], loc='best')
    plt.show()
    plt.savefig('roc.png')

plot_model_history(history)Code language: PHP (php)

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Related Post

7 Replies to ““Oánh giá” model AI theo cách Mì ăn liền – Chương 1. Loss và Accuracy”

  1. Đúng cái đang cần lại gặp ngay bài viết rất dễ hiểu và bổ ích. Cảm ơn bạn rất nhiều

Leave a Reply

Your email address will not be published. Required fields are marked *