Naive Bayes
Naive Bayes — Cộng dồn bằng chứng
Ba người bạn thân, không hẹn nhau, cùng nhắn bạn: 'Tiệm phở góc đường ngon lắm, đi thử đi.' Bạn đi hay không đi?
Mỗi bằng chứng là một lá phiếu
Tưởng tượng bạn đang phân loại email. Mỗi từ trong email là một lá phiếu— nhưng không phải ai cũng có sức nặng bằng nhau. Từ “trúng thưởng” cầm tấm thẻ to tướng: 80% email chứa từ này là spam. Từ “họp” cầm thẻ ngược chiều: 58% email chứa từ này là công việc.
Naive Bayes cộng dồntất cả lá phiếu. Không để một lá phiếu lớn quyết định mọi thứ — nếu email chứa cả “trúng thưởng” lẫn “báo cáo”, thuật toán so sánh hai phe xem bên nào mạnh hơn.
trúng thưởng, miễn phí, nhấn vào đây — mỗi từ là lá phiếu nặng nghiêng về SPAM.
họp, báo cáo, deadline — lá phiếu nặng nghiêng về HAM (email hợp lệ).
Nhân xác suất từng từ với prior — so sánh hai phe — phe lớn hơn thắng.
Hình minh họa
Chọn các từ bạn tưởng tượng có trong email. Mỗi khi bạn bật thêm một từ, xác suất P(Spam) và P(Ham) cập nhật tức thì. Quan sát thanh đỏ và thanh xanh “giằng co” lẫn nhau theo từng bằng chứng.
... khuyến mãi ... miễn phí ...
Từng từ “bỏ phiếu” thế nào
Độ đỏ / xanh ở thanh ngang là tỉ lệ P(từ|Spam) so với P(từ|Ham). Đỏ càng dài = từ đó là manh mối nghiêng về spam.
Bật “Tiếp tục” dưới đây để đi qua từng bước Naive Bayes xử lý một email cụ thể: “trúng thưởng miễn phí nhấn vào đây”. Mỗi bước vừa hiện công thức, vừa có thanh trực quan đi kèm.
Trước khi nhìn nội dung email, chúng ta đã có thông tin nền: khoảng 35% email gửi đến hộp thư là spam (con số này tuỳ nhà cung cấp dịch vụ). Đây gọi là prior.
Nếu bạn đoán bừa mà không xem email, đoán “ham” sẽ đúng 65% lần — vì đa số email trong hộp thư là hợp lệ.
Sức mạnh của thuật toán đến từ số lượng lá phiếu độc lập— một email 50 từ là 50 lá phiếu cùng bỏ cho một quyết định. Ngay cả khi từng lá phiếu yếu, tổng hợp lại vẫn ra kết quả rõ ràng. Đó là lý do một thuật toán “ngây thơ” vẫn là xương sống của bộ lọc spam trong hơn hai mươi năm.
Một lá phiếu mạnh
“trúng thưởng” — likelihood ratio 41:1. Một từ có thể đẩy P(Spam) lên cao, nhưng dễ sai khi email hỗn hợp.
Nhiều lá phiếu yếu
9 từ mỗi từ chỉ hơi nghiêng về spam (ratio 1.5:1). Tích lại: 1.59≈ 38:1 — mạnh ngang một từ “trúng thưởng” mà lại ổn định hơn.
Khi bộ lọc sai, có hai kiểu sai khác hẳn nhau về hậu quả. Gmail chọn nghiêng về một kiểu — bạn đoán kiểu nào quan trọng hơn?
Bộ lọc nói “SPAM” nhưng thực tế là email quan trọng. Hậu quả: bạn không thấy email từ sếp, khách hàng, ngân hàng.
Hậu quả tệ hơn — mất thông tin quan trọng.
Bộ lọc nói “HAM” nhưng thực tế là spam. Hậu quả: bạn thấy vài quảng cáo trong hộp thư đến.
Hậu quả nhẹ hơn — chỉ khó chịu một chút.
Đó là lý do Gmail đặt ngưỡng quyết định rất cao(thường ≥ 0.9). Bộ lọc thà để lọt vài spam còn hơn chặn nhầm một email quan trọng. Tỉ lệ false positive thực tế < 0.2% — tức cứ 1.000 email hợp lệ chỉ chặn nhầm 2.
Giả định 'ngây thơ' trong Naive Bayes là gì, và vì sao nó vẫn cho kết quả tốt dù giả định đó hiếm khi đúng trong thực tế?
Giải thích
Naive Bayes xuất phát từ một công thức xác suất cổ điển — định lý Bayes. Công thức này cho phép bạn cập nhật niềm tin khi có bằng chứng mới:
Đọc từng mảnh: P(c) là prior — tỉ lệ spam nền (ví dụ 35% email là spam). P(x|c) là khả năng — xác suất email có nội dung x khi biết nó thuộc lớp c. P(c|x) là kết quả bạn cần — xác suất email là spam khi biết nội dung.
Công thức Bayes vẽ thành các khối
Trước khi nhìn email: 35% email nền là spam. Đây là điểm xuất phát.
Nội dung email “khớp” với lớp spam đến mức nào? Tính từ từng từ.
Sau khi xem nội dung: xác suất mới — bạn đã cập nhật niềm tin.
Đây là phần “ngây thơ” — khi có nhiều từ, Naive Bayes giả định các từ độc lập nhau khi biết lớp:
Giả định này sai trong thực tế — “khuyến mãi” và “miễn phí” thường đi cùng nhau. Nhưng nó đủ dùng vì quyết định cuối chỉ cần so sánh hai phía. Kết quả: thuật toán “sai về xác suất tuyệt đối” nhưng “đúng về phân loại”.
Nhân nhiều xác suất nhỏ sẽ tràn số — dùng log
Log biến phép nhân thành phép cộng. Thay vì nhân 50 số rất nhỏ (nguy cơ tiến về 0 trên máy tính — gọi là underflow), ta cộng 50 giá trị log. Số thắng lớn hơn là lớp được chọn.
Vòng đời của một bộ lọc Naive Bayes
Hai pha — huấn luyện (một lần, chậm nhưng chỉ đếm từ) và suy luận (mỗi email, cực nhanh). Đây là lý do Naive Bayes chạy được ở tốc độ hàng tỷ email mỗi ngày.
- Lấy tập email đã gán nhãn (spam / ham)
- Với mỗi từ, đếm số lần xuất hiện ở lớp spam và lớp ham
- Chia ra tỉ lệ → được bảng P(từ | lớp)
- Áp dụng Laplace smoothing cho chắc
Làm một lần, nhưng có thể cập nhật mỗi giờ từ phản hồi người dùng.
- Email mới đến — tách thành danh sách từ
- Với mỗi từ, tra bảng P(từ | spam) và P(từ | ham)
- Cộng log các xác suất, so sánh hai phe
- Nếu log P(spam) > log P(ham) → chặn
Thời gian xử lý mỗi email: ~1 mili-giây. Đó là lý do Gmail xử lý được hàng tỷ email/ngày.
Ba biến thể thường gặp
Gaussian NB
Dùng khi đặc trưng là số thực (chiều cao, cân nặng). Mỗi đặc trưng được giả định tuân theo phân phối chuẩn trong mỗi lớp.
Multinomial NB
Dùng khi đếm số lần xuất hiện (số lần từ “khuyến mãi” trong email). Phổ biến nhất cho phân loại văn bản.
Bernoulli NB
Dùng khi đặc trưng chỉ có/không có (0 hoặc 1). Phù hợp cho tình huống chỉ quan tâm sự có mặt của từ, không quan tâm tần suất.
Khi các đặc trưng thực sự phụ thuộc nhau mạnh (diện tích nhà và số phòng chẳng hạn), giả định “ngây thơ” có thể sai nhiều. Lúc này bạn nên thử hồi quy logistic hoặc SVM — những mô hình học trực tiếp ranh giới giữa các lớp mà không giả định độc lập.
- Ý tưởng gốc: nhiều bằng chứng độc lập cùng chiều → niềm tin tăng. Mỗi từ là một “lá phiếu” nhỏ.
- Công thức: P(lớp|email) ∝ prior × tích xác suất từng từ. Dùng log để tránh tràn số.
- “Ngây thơ” nằm ở giả định các từ độc lập khi biết lớp — sai nhiều nhưng quyết định cuối vẫn đúng nhờ so sánh hai phía.
- Cần Laplace smoothing để chống xác suất bằng 0 khi gặp từ mới chưa từng thấy trong dữ liệu huấn luyện.
Kiểm tra hiểu biết
Tại sao Naive Bayes được gọi là 'ngây thơ' (naive)?