33 điểm bởi GN⁺ 2025-01-16 | 2 bình luận | Chia sẻ qua WhatsApp
  • Các nhà khoa học dữ liệu biến mọi thứ thành vector. Đó là ngôn ngữ của AI
  • Tuy nhiên, nếu áp dụng độ tương đồng cosine một cách mù quáng, nó có thể dẫn bạn đi sai hướng
  • Bài viết này giải thích cách sử dụng độ tương đồng có chủ đích hơn để đạt được kết quả tốt hơn.

Embedding

  • Embedding là biểu diễn dữ liệu dưới dạng vector, rất hữu ích để thể hiện mối quan hệ giữa các thực thể hoặc tìm các mục tương tự
  • Ví dụ, "brother" và "sister" không có quan hệ gì nếu chỉ là ID thô, nhưng khi được vector hóa thì có thể biểu diễn quan hệ ngữ nghĩa
  • Vector được dùng làm cấu trúc đầu vào cho mô hình machine learning hoặc tự thân được dùng để truy tìm độ tương đồng
  • Embedding câu dựa trên mô hình ngôn ngữ lớn (LLM) hiện là một trong những trường hợp sử dụng embedding phổ biến nhất
  • Sức mạnh đó cũng đòi hỏi trách nhiệm về bảo mật dữ liệu và việc sử dụng có chủ đích

Ví dụ: so sánh câu bằng độ tương đồng cosine

  • So sánh ba câu
    • A: "Python can make you rich."
    • B: "Python can make you itch."
    • C: "Mastering Python can fill your pockets."
  • So sánh dựa trên ký tự
    • Nếu so sánh chuỗi thô, A và B khác 2 ký tự, còn A và C khác 21 ký tự
    • Nhưng về mặt ngữ nghĩa, A và C lại giống nhau hơn (đều nói về tiền bạc)
  • So sánh dựa trên vector
    • Dùng OpenAI text-embedding-3-large để tạo các vector embedding như sau:
      • A: [-0.003738, -0.033263, -0.017596, 0.029024, -0.015251, ...]
      • B: [-0.066795, -0.052274, -0.015973, 0.077706, 0.044226, ...]
      • C: [-0.011167, 0.017812, -0.018655, 0.006625, 0.018506, ...]
    • Số chiều vector: 3072 (dài nhưng có thể giảm chiều mà không làm giảm chất lượng)
  • Tính độ tương đồng cosine
    • A và C: 0.750 (gần nhau về ngữ nghĩa)
    • A và B: 0.576 (gần nhau về mặt chữ)
    • Kết quả: ý nghĩa là yếu tố tương đồng quan trọng hơn cách đánh vần

Độ tương đồng cosine là gì?

  • Độ tương đồng cosine (cosine similarity) đo mức độ giống nhau bằng cách tính cosine của góc giữa hai vector
  • Vì vector tồn tại trong không gian nhiều chiều nên trực giác hình học thường không còn hiệu quả
  • Về mặt toán học, đó là tích vô hướng (dot product) của các vector đã được chuẩn hóa
  • Các đặc tính chính:
    • Hai vector giống hệt nhau cho giá trị 1
    • Các vector ngẫu nhiên thường gần 0 (do hiệu ứng trung bình hóa trong không gian nhiều chiều)
    • Giá trị kết quả nằm trong khoảng từ -1 đến 1
  • Sự đơn giản này có thể gây hiểu lầm
    • Việc giá trị nằm trong khoảng 0~1 không có nghĩa đó là xác suất hay một thước đo có ý nghĩa tuyệt đối
      • Ví dụ: giá trị 0.6 có thể không hề biểu thị độ tương đồng mạnh
    • Giá trị âm hiếm khi biểu thị sự đối lập về ngữ nghĩa
      • Phần lớn chỉ là kết quả vô nghĩa hoặc gần như nhiễu
  • Nếu dùng Glove(glove.6B.300d) để tìm các từ tương tự với "dog":
    • Các từ gần thường đúng như kỳ vọng
    • Các từ xa nhất lại thường cho ra kết quả vô nghĩa
  • Độ tương đồng cosine giống như "băng keo" vì nó đơn giản và nhanh, cho phép so sánh đủ loại vector
    • Có thể dùng để so sánh hình ảnh, văn bản, âm thanh, mã nguồn, v.v.
  • Nhưng nó chỉ là giải pháp tạm, có thể che giấu những vấn đề sâu hơn
    • Ví dụ: giống như sửa ống nước bằng băng keo, khó mà tin cậy và không bền vững
  • Có lúc độ tương đồng cosine trông có vẻ hiệu quả, nhưng khi thất bại thì rất khó xác định nguyên nhân
    • Ta thường phải vá víu bằng các giải pháp ứng biến, và điều đó có thể tạo ra vấn đề mới

Mối quan hệ giữa độ tương đồng cosine và hệ số tương quan

  • Hệ số tương quan Pearson được tính qua ba bước:
    • Trừ đi giá trị trung bình để đưa dữ liệu về trung tâm
    • Chuẩn hóa vector thành vector đơn vị
    • Tính tích vô hướng (dot product) của hai vector
  • Khi vector đã được đưa về trung tâm và chuẩn hóa:
    • Hệ số tương quan Pearson = độ tương đồng cosine = tích vô hướng
  • Cách dùng trong thực tế
    • Người ta không đưa vector về trung tâm hoặc chuẩn hóa ở mỗi lần so sánh từng cặp
      • Thay vào đó, xử lý trước rồi chỉ tính tích vô hướng
    • Nếu có thể dùng độ tương đồng cosine thì cũng có thể dùng hệ số tương quan Pearson theo cách tương tự
      • Hai thước đo này trên thực tế có thể được dùng trong cùng một ngữ cảnh

Vấn đề khi dùng độ tương đồng cosine làm thước đo tương đồng

  • Dùng độ tương đồng cosine làm mục tiêu huấn luyện cho mô hình machine learning là điều hợp lệ về mặt toán học
  • Vấn đề xuất hiện ở những chỗ vượt ra ngoài việc cosine similarity có phù hợp hay không:
    • Khi hàm mất mát dùng để huấn luyện mô hình không phải là cosine similarity
    • Khi mục tiêu huấn luyện khác với yêu cầu của ứng dụng thực tế
  • Nhìn chung, mô hình thường được huấn luyện bằng vector chưa chuẩn hóa:
    • Ví dụ: dự đoán xác suất dựa trên tích vô hướng (dot product) và dùng hàm mất mát logistic
    • Một số mô hình học bằng cách tối thiểu hóa khoảng cách Euclid để kéo các mục cùng lớp lại gần nhau
  • Chuẩn hóa mang lại vài tính chất toán học (giới hạn kết quả trong khoảng -1 đến 1), nhưng đó chỉ là một "giải pháp tạm"
  • Chỉ những mô hình được huấn luyện bằng độ tương đồng cosine hoặc hàm trực tiếp của nó mới có thể được dùng một cách an toàn
  • Ngay cả khi mô hình được huấn luyện rõ ràng bằng độ tương đồng cosine, định nghĩa về "tương đồng" vẫn không hề rõ ràng:
    • Nhà phê bình văn học: chia sẻ cùng chủ đề
    • Thủ thư: cùng thể loại
    • Độc giả: cùng phản ứng cảm xúc
    • Người dàn trang: số trang và định dạng giống nhau
  • Độ tương đồng cosine đơn giản hóa nhiều định nghĩa khác nhau thành một con số duy nhất, nên rất dễ gây hiểu lầm
  • Ví dụ: "espresso" và "cappuccino"
    • word2vec xem hai từ này gần như giống hệt nhau (theo bối cảnh Mỹ)
    • Nhưng ở Italy thì chúng không được xem là như nhau

Khi độ tương đồng cosine thất bại

  • Ví dụ đơn giản: câu hỏi tìm chìa khóa
    • Câu hỏi: "What did I do with my keys?"
    • Các câu được đem ra so sánh:
      • "I left them in my pocket"
      • "They are on the table"
      • "What did I put my wallet?"
      • "What I did to my life?"
  • Vấn đề
    • Kết quả khi dùng độ tương đồng cosine:
      • Câu gần nhất lại là một câu hỏi khác thay vì một câu trả lời phù hợp ("What I did to my life?")
      • Nó dựa vào sự giống nhau của cấu trúc câu chứ không phải liên quan ngữ nghĩa thực sự
    • Các câu liên quan đến Python có độ tương đồng gần bằng 0, nên phần nào phản ánh đúng là không liên quan
  • Giới hạn trong thế giới thực
    • Trong ứng dụng thực tế, bạn sẽ phải xử lý hàng nghìn tài liệu
      • Với các tập dữ liệu lớn vượt quá context window, hệ thống còn nhạy với nhiễu hơn
    • Khi kích thước tập dữ liệu tăng lên, điểm tương đồng sẽ vận hành như một trò roulette trong không gian nhiều chiều

Có thể dùng gì thay cho độ tương đồng cosine?

Cách tiếp cận mạnh nhất

  • Tận dụng truy vấn LLM:
    • Dùng một mô hình ngôn ngữ mạnh để so sánh hai mục
    • Ví dụ: "Is {sentence_a} a plausible answer to {sentence_b}?"
    • Khi dùng LLM, có thể thực hiện các so sánh có ý nghĩa:
      • Phân biệt đơn giản giữa câu hỏi và câu trả lời
      • Có thể trả kết quả dưới dạng có cấu trúc như JSON
    • Tuy nhiên, nếu tập dữ liệu lớn thì cách này kém hiệu quả và tốn chi phí

Tối ưu embedding

  • Tạo embedding theo từng tác vụ:
    • Fine-tuning để điều chỉnh trọng số của mô hình hiện có
    • Transfer Learning để tận dụng tri thức của mô hình và tạo embedding mới, tập trung hơn
  • Tương đồng đối xứng:
    • Biểu diễn câu hỏi "A và B có giống nhau không?" trong không gian vector
    • Giảm các chiều không cần thiết và chỉ giữ lại các đặc tính liên quan
  • Tương đồng bất đối xứng:
    • Ví dụ: biểu diễn xác suất của câu hỏi "Tài liệu B có phải là câu trả lời đúng cho câu hỏi A không?"
    • Chuyển đổi thành các không gian chuyên biệt riêng cho query và key

Prompt engineering

  • Thêm prompt để thiết lập ngữ cảnh:
    • Ví dụ: "Nationality of {person}" để nhấn mạnh ngữ cảnh liên quan đến quốc tịch
    • Thay vì prompt đơn giản, dùng câu cụ thể hơn:
      • "This is a country that has produced many influential historical figures, including {person}"
    • Chất lượng kết quả được cải thiện đáng kể, dù vẫn chưa hoàn hảo

Viết lại văn bản và trích xuất ngữ cảnh

  • Tiền xử lý văn bản trước khi embedding:
    • Dùng prompt đơn giản như "Hãy tóm tắt văn bản sau bằng tiếng Anh chuẩn trong tối đa 200 từ" để loại bỏ sự tương đồng bề mặt
    • Bỏ qua các yếu tố hình thức không cần thiết (lỗi chính tả, định dạng, v.v.) và tập trung vào nội dung
  • Tạo ngữ cảnh có cấu trúc:
    • Tóm tắt cuộc trò chuyện với khách hàng để rút ra các yêu cầu và vấn đề rõ ràng:
      • "Hãy tóm tắt cuộc trò chuyện thành tối đa 10 gạch đầu dòng Markdown"
    • Các trang tài liệu cũng có thể được chuyển sang cùng định dạng để ghép nối chính xác hơn

Kết luận

  • Nhiều phương pháp thay thế có thể bù đắp những điểm yếu của độ tương đồng cosine và mang lại kết quả đáng tin cậy hơn
  • Hãy chọn và áp dụng cách tiếp cận phù hợp tùy theo bối cảnh của dự án

Tóm tắt

  • Giới hạn của độ tương đồng cosine:
    • Độ tương đồng cosine cho giá trị từ -1 đến 1, nhưng không nên coi đó là xác suất
    • Phần lớn mô hình không được huấn luyện với mục tiêu là độ tương đồng cosine, nên kết quả chỉ là tương quan không có gì bảo đảm
    • Ngay cả khi mô hình đã học độ tương đồng cosine, ta vẫn phải hiểu liệu định nghĩa về tương đồng đó có khớp với nhu cầu của mình hay không
  • Cách dùng hiệu quả độ tương đồng vector:
    • Huấn luyện embedding chuyên biệt cho dữ liệu
    • Thiết kế prompt tập trung vào các khía cạnh liên quan
    • Làm sạch và chuẩn hóa văn bản trước khi embedding

2 bình luận

 
mhj5730 2025-01-20

Tài liệu này được tổng hợp quá tuyệt.

 
GN⁺ 2025-01-16
Ý kiến trên Hacker News
  • Với các ứng dụng RAG sử dụng độ tương đồng cosine, nên sắp xếp lại kết quả bằng "semantic re-ranker" hoặc "L2 re-ranking model"

    • Trong ví dụ của pgvector-python, việc sắp xếp lại được thực hiện bằng mô hình cross-encoder
    • Cũng có thể dùng mô hình ngôn ngữ để sắp xếp lại, nhưng hiệu năng có thể kém hơn các mô hình chuyên biệt cho tác vụ này
    • Trong cách tiếp cận Azure RAG, họ dùng AI Search semantic ranker mà Bing sử dụng để sắp xếp lại kết quả tìm kiếm
  • Vector từ giải quyết vấn đề hai từ có thể liên quan chặt chẽ dù không xuất hiện trong cùng một ngữ cảnh

    • "Python" và "Ruby" có thể không xuất hiện trong cùng một ngữ cảnh, nhưng "scripting" có thể được tìm thấy trong ngữ cảnh của cả hai
    • Tuy nhiên, do lời nguyền chiều dữ liệu, cách này thường không hoạt động tốt
    • Có ý tưởng về việc liệu có thể biểu diễn word embedding dưới dạng đỉnh thay vì vector hay không
  • Ở Mỹ, word2vec có thể đánh giá espresso và cappuccino gần như giống hệt nhau, nhưng ở Ý thì không như vậy

    • Cách tiếp cận tốt nhất là dùng trực tiếp truy vấn LLM để so sánh hai mục
    • LLM có thể đánh giá "Tôi để ví ở đâu rồi nhỉ?" và "Tôi để chìa khóa ở đâu rồi nhỉ?" là rất giống nhau
  • Độ tương đồng cosine được dùng trong hầu hết các hệ thống semantic search dựa trên deep learning

    • Các mô hình như SentenceTransformers được huấn luyện để sử dụng độ tương đồng cosine
    • Các mô hình như CLIP cũng dùng độ tương đồng cosine cho biểu diễn vector của hình ảnh
  • Dùng trực tiếp truy vấn LLM để so sánh hai mục là cách tiếp cận mạnh nhất

    • Cross encoder là một giải pháp vừa hiệu quả vừa nhanh
  • HyDE là phương pháp tạo ra một câu trả lời giả định cho câu hỏi rồi so sánh độ tương đồng

    • Cách tốt hơn là chuẩn hóa định dạng của các chunk và tạo câu trả lời giả định theo cùng một định dạng
  • Độ tương đồng cosine và top-k RAG tạo cảm giác đã lỗi thời

    • Độ tương đồng cosine chỉ là một thuộc tính ngẫu nhiên của dữ liệu
    • Các mô hình embedding mới được huấn luyện để dùng độ tương đồng cosine làm thước đo độ tương tự
  • Sau khi thử cách tiếp cận RAG, có cảm giác thất vọng và cho rằng cần cấu trúc để mô hình có thể thực hiện RAG ngay trong quá trình huấn luyện

    • Có thể cải thiện việc mô hình hóa dữ liệu huấn luyện bằng cách để mô hình định nghĩa embedding, định dạng và quy trình tìm kiếm
  • Trong đồ họa 3D và vật lý, tầm quan trọng và độ chính xác là rất rõ ràng, nhưng trong machine learning, không gian vector biểu diễn quá nhiều thứ nên việc dùng tích vô hướng tạo cảm giác khá mơ hồ