Khi bạn trò chuyện với một mô hình ngôn ngữ lớn (LLM), cảm giác như nó thật sự “hiểu” ý nghĩa câu chữ. Nhưng bên dưới lớp vỏ ngôn ngữ tự nhiên đó là toán học, vector và hình học.
Một trong những khái niệm quan trọng nhất giúp LLM so sánh ý nghĩa chính là cosine similarity. Nếu bạn từng thắc mắc vì sao AI biết hai câu “gần nghĩa” nhau, thì cosine similarity chính là chìa khóa.
Cosine Similarity là gì?
Đối với máy tính, văn bản không phải là chữ mà là vector số. Cosine similarity đo mức độ giống nhau giữa hai vector bằng cách đo góc giữa chúng, thay vì đo độ dài.
Hãy tưởng tượng hai mũi tên xuất phát từ cùng một điểm:
- Cùng hướng → góc 0° → cosine similarity = 1
- Vuông góc → góc 90° → cosine similarity = 0
- Ngược hướng → góc 180° → cosine similarity = -1
Trong NLP, hai câu có ý nghĩa tương tự sẽ tạo ra các vector cùng hướng trong không gian.
Công thức toán học
Cosine similarity giữa hai vector A và B được định nghĩa như sau:
$$ \text{cosine\_similarity}(A, B) = \frac{A \cdot B}{\lVert A \rVert \, \lVert B \rVert} $$- A · B: tích vô hướng (dot product)
- ||A||, ||B||: độ dài (magnitude) của vector
Công thức này luôn cho kết quả trong khoảng [-1, 1]. Giá trị càng gần 1 thì hai vector càng giống nhau về hướng.
Ví dụ đơn giản với ML.NET
Trong .NET, ta có thể dùng ML.NET để biến văn bản thành vector TF-IDF, sau đó tự tính cosine similarity.
Khởi tạo ML Contextusing Microsoft.ML;
Console.WriteLine("Hello, World!");
var mlContext = new MLContext();
var data = new[]
{
new TextData { Text = "I love machine learning" },
new TextData { Text = "I love deep learning" }
};
IDataView dataView = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.Text
.FeaturizeText("Features", nameof(TextData.Text));
var model = pipeline.Fit(dataView);
var transformed = model.Transform(dataView);
Đoạn code trên thực hiện 3 step:
Text
→ (FeaturizeText) ← định nghĩa phép biến đổi
→ Model ← học thống kê từ dữ liệu
→ Vector ← áp dụng phép biến đổi
Syntax
public static Microsoft.ML.Transforms.Text.TextFeaturizingEstimator FeaturizeText(this Microsoft.ML.TransformsCatalog.TextTransforms catalog, string outputColumnName, string inputColumnName = default);
FeaturizeText thật sự làm gì?
mlContext.Transforms.Text
.FeaturizeText("Features", nameof(TextData.Text))
Dòng này KHÔNG xử lý dữ liệu ngay. Nó chỉ mô tả một phép biến đổi:
var model = pipeline.Fit(dataView);
Đây là bước học thống kê từ dữ liệu.
var transformed = model.Transform(dataView);
Lấy dữ liệu gốc + áp dụng pipeline đã học → dữ liệu mới
Trước Transform
| Text |
|---|
| "I love machine learning" |
| "I love deep learning" |
| Text | Features |
|---|---|
| "I love machine learning" | [0.0, 0.5, 0.7, ...] |
| "I love deep learning" | [0.7, 0.5, 0.0, ...] |
Sau khi lấy được hai vector đặc trưng, cosine similarity được tính bằng:
var vectors = mlContext.Data
.CreateEnumerable<TextVector>(transformedData, reuseRowObject: false)
.ToArray();
float[] v1 = vectors[0].Features;
float[] v2 = vectors[1].Features;
float similarity = CosineSimilarity(v1, v2);
Console.WriteLine($"Cosine similarity: {similarity}");
static float CosineSimilarity(float[] v1, float[] v2)
{
float dot = 0f;
float norm1 = 0f;
float norm2 = 0f;
for (int i = 0; i < v1.Length; i++)
{
dot += v1[i] * v2[i];
norm1 += v1[i] * v1[i];
norm2 += v2[i] * v2[i];
}
return dot / ((float)Math.Sqrt(norm1) * (float)Math.Sqrt(norm2));
}
Model
public class TextData
{
public string Text { get; set; }
}
public class TextVector
{
public float[] Features { get; set; }
}
Cosine Similarity và Embeddings
Trong hệ thống hiện đại, LLM không dùng TF-IDF mà dùng embeddings: các vector dày hàng trăm hoặc hàng nghìn chiều.
Trong không gian embedding:
- "dog" gần "puppy"
- "king" gần "queen"
- "king" rất xa "table"
Cosine similarity là công cụ đo khoảng cách ngữ nghĩa giữa các embedding này.
LLM dùng cosine similarity để làm gì?
- Semantic search: xếp hạng tài liệu theo mức độ liên quan
- Clustering: nhóm các câu có ý nghĩa gần nhau
- Recommendation: so khớp người dùng và nội dung
- RAG: truy xuất tri thức liên quan trước khi sinh câu trả lời
Giới hạn của cosine similarity
Cosine similarity chỉ đo hướng, không quan tâm độ dài vector. Vì vậy, nó phụ thuộc mạnh vào chất lượng embedding.
Dù vậy, vì đơn giản, nhanh và ổn định trong không gian nhiều chiều, cosine similarity vẫn là lựa chọn mặc định trong NLP.
Kết luận
Cosine similarity là cầu nối giữa ngôn ngữ và hình học. Nó biến ý nghĩa thành vector và biến so sánh ý nghĩa thành phép toán.
Mỗi khi AI trả lời bạn một câu "nghe rất đúng ý", phía sau đó thường chỉ là một ý tưởng hình học đơn giản: đo góc giữa hai mũi tên trong không gian.
Nhận xét
Đăng nhận xét