Word2Vec
Word2Vec - Từ thành vector
Câu "Tôi thích ăn ___ Hà Nội vào buổi sáng". Dựa vào các từ xung quanh, từ nào điền vào chỗ trống?
Word2Vec dùng cửa sổ trượt (sliding window) để xác định "hàng xóm" của mỗi từ. Nhấn vào từ bất kỳ và kéo thanh trượt để thay đổi kích thước cửa sổ!
Hình minh họa
Skip-gram
Cho phở → dự đoán: thích, ăn, Hà, Nội
Từ trung tâm → dự đoán ngữ cảnh
CBOW
Cho thích, ăn, Hà, Nội → dự đoán: phở
Ngữ cảnh → dự đoán từ trung tâm
Cửa sổ = 2: nhìn 2 từ mỗi bên. Cửa sổ nhỏ → nắm bắt cú pháp.
Word2Vec học nghĩa từ bằng cách dự đoán "hàng xóm" — giống câu nói "Hãy cho tôi biết bạn chơi với ai, tôi sẽ nói bạn là ai"!
Skip-gram: cho 1 từ, đoán ngữ cảnh. CBOW: cho ngữ cảnh, đoán 1 từ. Cả hai đều tạo ra word embeddings chất lượng — chỉ khác hướng dự đoán.
Từ 'phở' và 'bún chả' có vector gần nhau vì Word2Vec thấy chúng xuất hiện với ngữ cảnh giống nhau. Nhưng 'phở' và 'pizza' thì sao?
Hai kiến trúc của Word2Vec — cùng mục tiêu (tạo embeddings), khác cách huấn luyện.
Neural Network
Tốt với từ hiếm. Tập dữ liệu nhỏ → chọn Skip-gram.
Giải thích
Word2Vec (Mikolov et al., Google 2013) là mô hình neural network nông (shallow) học word embeddings từ dữ liệu văn bản lớn, là đối thủ trực tiếp với GloVe ở cùng thế hệ.
Skip-gram tối đa hóa xác suất ngữ cảnh cho trước từ trung tâm:
Với T = tổng số từ, c = kích thước cửa sổ. Xác suất tính bằng softmax:
Tính softmax trên cả từ vựng V (hàng triệu từ) quá chậm. Negative Sampling chỉ cần phân biệt từ đúng với k từ "nhiễu" ngẫu nhiên:
Thường k = 5-20 cho tập nhỏ, k = 2-5 cho tập lớn. Nhanh hơn softmax đầy đủ hàng trăm lần!
from gensim.models import Word2Vec
# Dữ liệu tiếng Việt
sentences = [
["tôi", "thích", "ăn", "phở", "Hà", "Nội"],
["phở", "bò", "rất", "ngon"],
["bún", "chả", "là", "món", "ăn", "Hà", "Nội"],
["tôi", "thích", "ăn", "bún", "chả"],
["Grab", "là", "ứng", "dụng", "gọi", "xe", "máy"],
]
# Huấn luyện Word2Vec Skip-gram
model = Word2Vec(
sentences,
vector_size=100, # Số chiều embedding
window=3, # Cửa sổ ngữ cảnh
min_count=1, # Tần suất tối thiểu
sg=1, # 1 = Skip-gram, 0 = CBOW
epochs=100,
)
# Tìm từ tương tự
print(model.wv.most_similar("phở", topn=3))
# [('bún', 0.92), ('ngon', 0.85), ('ăn', 0.83)]
# Vector của từ
print(f"Vector 'phở': {model.wv['phở'][:5]}...")
# Vector 'phở': [0.12, -0.34, 0.56, 0.01, -0.78]...Tiếng Việt cần tách từ trước khi huấn luyện Word2Vec (vì "Việt Nam" = 1 từ, không phải 2). Dùng VnCoreNLP hoặc underthesea để tách từ. Pre-trained vectors tiếng Việt có sẵn tại github.com/vietnlp.
- Word2Vec học embeddings bằng cách dự đoán từ dựa trên ngữ cảnh (cửa sổ trượt).
- Skip-gram: từ trung tâm → đoán ngữ cảnh. CBOW: ngữ cảnh → đoán từ trung tâm.
- Cửa sổ nhỏ (2-3) → cú pháp. Cửa sổ lớn (5-10) → ngữ nghĩa.
- Negative Sampling thay thế softmax đầy đủ → huấn luyện nhanh hơn hàng trăm lần.
- Tạo ra embeddings chất lượng: vua - đàn ông + phụ nữ ≈ hoàng hậu.
Kiểm tra hiểu biết
Skip-gram và CBOW khác nhau ở điểm nào?