Khái niệm AI với Python

Cơ bản về phân lớp: Softmax và k-láng giềng gần nhất trong Python

Phân lớp là chọn một nhãn, chẳng hạn mèo hay chó. Mô hình có thể đưa ra một điểm số cho mỗi lớp rồi dùng softmax biến chúng thành xác suất, hoặc một cách đơn giản như k-láng giềng gần nhất để các ví dụ gần nhất bỏ phiếu.

Khái niệm bằng lời đơn giản

Phân lớp là chọn một nhãn, chẳng hạn mèo hay chó. Mô hình có thể đưa ra một điểm số cho mỗi lớp rồi dùng softmax biến chúng thành xác suất, hoặc một cách đơn giản như k-láng giềng gần nhất để các ví dụ gần nhất bỏ phiếu.

Biến điểm số thành xác suất của các lớp bằng softmax, đánh giá bằng cross-entropy và phân lớp điểm bằng k-láng giềng gần nhất.

Ý chính

  • Softmax giữ nguyên thứ tự các điểm số và làm chúng cộng lại bằng 1.
  • Cross-entropy phân loại phạt nặng nhất những câu trả lời sai mà lại rất tự tin.
  • k-NN không có bước huấn luyện: nó so sánh điểm mới với các ví dụ đã lưu.
  • Naive Bayes và cây quyết định (Gini impurity, information gain) là những bộ phân lớp kinh điển khác.

Khi nào nên sử dụng?

  • Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
  • Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
  • Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.

Xem trực quan

Nhấp vào bất kỳ đâu trên biểu đồ bên trái để phân lớp một điểm mới bằng phiếu bầu của k láng giềng gần nhất. Đổi điểm số bên phải để xem softmax phản ứng.

Code ví dụ

Chạy code →
main.py
import math
from collections import Counter

# Softmax turns raw scores into probabilities that add up to 1.
def softmax(scores):
    exps = [math.exp(s - max(scores)) for s in scores]
    total = sum(exps)
    return [e / total for e in exps]

probs = softmax([2.0, 1.0, 0.1])
print("softmax:", [round(p, 3) for p in probs])
# Cross-entropy is small when the true class gets a high probability.
print("cross-entropy if class 0 is right:", round(-math.log(probs[0]), 3))

# k-nearest neighbours: label a point by a vote of the closest examples.
examples = [((1, 1), "cat"), ((1, 2), "cat"), ((5, 5), "dog"), ((6, 5), "dog"), ((5, 6), "dog")]
def knn(point, k=3):
    nearest = sorted(examples, key=lambda e: math.dist(point, e[0]))[:k]
    return Counter(label for _, label in nearest).most_common(1)[0][0]

print("(2, 1) ->", knn((2, 1)))
print("(5, 4) ->", knn((5, 4)))

Kết quả dự kiến

softmax: [0.659, 0.242, 0.099]
cross-entropy if class 0 is right: 0.417
(2, 1) -> cat
(5, 4) -> dog

Cách hoạt động

softmax() lấy mũ các điểm số rồi chia cho tổng của chúng, nên ba xác suất cộng lại bằng 1; trừ giá trị lớn nhất trước để tránh tràn số. Cross-entropy là −log của xác suất của lớp đúng. knn() sắp xếp các ví dụ theo khoảng cách và để 3 ví dụ gần nhất bỏ phiếu.

Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.

Bài tập mở rộng

Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.

  1. Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
  2. In các giá trị trung gian để theo dõi từng bước tính toán.
  3. Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Chạy trong Python IDE →

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách