Chuyển đến nội dung chính

Cosine Similarity – Toán học đứng sau cách LLM hiểu ý nghĩa

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 Context
using 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:
Hãy biến cột Text thành một vector số và đặt tên cột mới là Features
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"
Sau Transform
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.

Tham khảo

Cosine Similarity Explained: The Math Behind LLMs

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.