Đào tạo và tinh chỉnh các mô hình nhúng thưa thớt với Sentence Transformers v5

  • 17 min read
Đào tạo và tinh chỉnh các mô hình nhúng thưa thớt với Sentence Transformers v5

Đào tạo và Tinh chỉnh Mô hình Nhúng Thưa thớt với Sentence Transformers v5

Sentence Transformers là một thư viện Python để sử dụng và đào tạo các mô hình nhúng và xếp hạng lại cho một loạt các ứng dụng, chẳng hạn như tạo tăng cường truy xuất, tìm kiếm ngữ nghĩa, tương đồng văn bản ngữ nghĩa, khai thác diễn giải, v.v. Một vài phiên bản chính gần đây đã giới thiệu những cải tiến đáng kể cho việc đào tạo:

  • v3.0: (cải tiến) Đào tạo mô hình Sentence Transformer (Nhúng Dày đặc)
  • v4.0: (cải tiến) Đào tạo mô hình Cross Encoder (Xếp hạng lại)
  • v5.0: (mới) Đào tạo mô hình Nhúng Thưa thớt

Trong bài đăng trên blog này, tôi sẽ chỉ cho bạn cách sử dụng nó để tinh chỉnh một mô hình mã hóa/nhúng thưa thớt và giải thích lý do bạn có thể muốn làm như vậy. Điều này dẫn đến sparse-encoder/example-inference-free-splade-distilbert-base-uncased-nq, một mô hình rẻ tiền hoạt động đặc biệt tốt trong các tình huống tìm kiếm kết hợp hoặc truy xuất và xếp hạng lại.

Việc tinh chỉnh các mô hình nhúng thưa thớt bao gồm một số thành phần: mô hình, tập dữ liệu, hàm mất mát, đối số đào tạo, trình đánh giá và lớp huấn luyện. Tôi sẽ xem xét từng thành phần này, kèm theo các ví dụ thực tế về cách chúng có thể được sử dụng để tinh chỉnh các mô hình nhúng thưa thớt mạnh mẽ.

Ngoài việc đào tạo các mô hình của riêng bạn, bạn có thể chọn từ một loạt các bộ mã hóa thưa thớt được đào tạo trước có sẵn trên Hugging Face Hub. Để giúp điều hướng không gian ngày càng phát triển này, chúng tôi đã tuyển chọn một bộ sưu tập Mô hình SPLADE làm nổi bật một số mô hình phù hợp nhất. Chúng tôi liệt kê những mô hình nổi bật nhất cùng với kết quả điểm chuẩn của chúng trong Mô hình được đào tạo trước trong tài liệu.

Mục lục

Mô hình Nhúng Thưa thớt là gì?

Thuật ngữ rộng hơn “mô hình nhúng” dùng để chỉ các mô hình chuyển đổi một số đầu vào, thường là văn bản, thành biểu diễn vector (nhúng) nắm bắt ý nghĩa ngữ nghĩa của đầu vào. Không giống như với các đầu vào thô, bạn có thể thực hiện các phép toán trên các nhúng này, dẫn đến các điểm tương đồng có thể được sử dụng cho các tác vụ khác nhau, chẳng hạn như tìm kiếm, phân cụm hoặc phân loại.

Với các mô hình nhúng dày đặc, tức là loại phổ biến, các nhúng thường là các vector chiều thấp (ví dụ: 384, 768 hoặc 1024 chiều) trong đó hầu hết các giá trị đều khác không. Mặt khác, các mô hình nhúng thưa thớt tạo ra các vector chiều cao (ví dụ: hơn 30.000 chiều) trong đó hầu hết các giá trị đều bằng không. Thông thường, mỗi chiều hoạt động (tức là chiều có giá trị khác không) trong một nhúng thưa thớt tương ứng với một mã thông báo cụ thể trong từ vựng của mô hình, cho phép diễn giải.

Hãy xem naver/splade-v3, một mô hình nhúng thưa thớt hiện đại, làm ví dụ:

from sentence_transformers import SparseEncoder

# Tải xuống từ Hub 🤗
model = SparseEncoder("naver/splade-v3")

# Chạy suy luận
sentences = [
    "Thời tiết hôm nay thật đẹp.",
    "Bên ngoài trời nắng quá!",
    "Anh ấy lái xe đến sân vận động.",
]
embeddings = model.encode(sentences)
print(embeddings.shape)
# (3, 30522)

# Lấy điểm tương đồng cho các nhúng
similarities = model.similarity(embeddings, embeddings)
print(similarities)
# tensor([[   32.4323,     5.8528,     0.0258],
#         [    5.8528,    26.6649,     0.0302],
#         [    0.0258,     0.0302,    24.0839]])

# Hãy giải mã các nhúng của chúng ta để có thể diễn giải chúng
decoded = model.decode(embeddings, top_k=10)
for decoded, sentence in zip(decoded, sentences):
    print(f"Câu: {sentence}")
    print(f"Đã giải mã: {decoded}")
    print()
Câu: Thời tiết hôm nay thật đẹp.
Đã giải mã: [('weather', 2.754288673400879), ('today', 2.610959529876709), ('lovely', 2.431990623474121), ('currently', 1.5520408153533936), ('beautiful', 1.5046082735061646), ('cool', 1.4664798974990845), ('pretty', 0.8986214995384216), ('yesterday', 0.8603134155273438), ('nice', 0.8322536945343018), ('summer', 0.7702118158340454)]

Câu: Bên ngoài trời nắng quá!
Đã giải mã: [('outside', 2.6939032077789307), ('sunny', 2.535827398300171), ('so', 2.0600898265838623), ('out', 1.5397940874099731), ('weather', 1.1198079586029053), ('very', 0.9873268604278564), ('cool', 0.9406591057777405), ('it', 0.9026399254798889), ('summer', 0.684999406337738), ('sun', 0.6520509123802185)]

Câu: Anh ấy lái xe đến sân vận động.
Đã giải mã: [('stadium', 2.7872302532196045), ('drove', 1.8208855390548706), ('driving', 1.6665740013122559), ('drive', 1.5565159320831299), ('he', 1.4721972942352295), ('stadiums', 1.449463129043579), ('to', 1.0441515445709229), ('car', 0.7002660632133484), ('visit', 0.5118278861045837), ('football', 0.502326250076294)]

Trong ví dụ này, các nhúng là các vector 30.522 chiều, trong đó mỗi chiều tương ứng với một mã thông báo trong từ vựng của mô hình. Phương thức decode trả về 10 mã thông báo hàng đầu có giá trị cao nhất trong nhúng, cho phép chúng ta diễn giải mã thông báo nào đóng góp nhiều nhất vào nhúng.

Chúng ta thậm chí có thể xác định giao điểm hoặc chồng chéo giữa các nhúng, rất hữu ích để xác định lý do tại sao hai văn bản được coi là tương tự hoặc khác nhau:

# Hãy tính toán cả giao điểm/chồng chéo của hai nhúng đầu tiên
intersection_embedding = model.intersection(embeddings[0], embeddings[1])
decoded_intersection = model.decode(intersection_embedding)
print(decoded_intersection)
Đã giải mã: [('weather', 3.0842742919921875), ('cool', 1.379457712173462), ('summer', 0.5275946259498596), ('comfort', 0.3239051103591919), ('sally', 0.22571465373039246), ('julian', 0.14787325263023376), ('nature', 0.08582140505313873), ('beauty', 0.0588383711874485), ('mood', 0.018594780936837196), ('nathan', 0.000752730411477387)]

Mở rộng Truy vấn và Tài liệu

Một thành phần quan trọng của các mô hình nhúng thưa thớt thần kinh là mở rộng truy vấn/tài liệu. Không giống như các phương pháp từ vựng truyền thống như BM25, chỉ khớp các mã thông báo chính xác, các mô hình thưa thớt thần kinh thường tự động mở rộng văn bản gốc với các thuật ngữ liên quan về mặt ngữ nghĩa:

  • Truyền thống, Từ vựng (ví dụ: BM25): Chỉ khớp với các mã thông báo chính xác trong văn bản
  • Mô hình Thưa thớt Thần kinh: Tự động mở rộng với các thuật ngữ liên quan

Ví dụ: trong đầu ra mã ở trên, câu “Thời tiết hôm nay thật đẹp” được mở rộng để bao gồm các thuật ngữ như “beautiful”, “cool”, “pretty” và “nice” không có trong văn bản gốc. Tương tự, “Bên ngoài trời nắng quá!” được mở rộng để bao gồm “weather”, “summer” và “sun”.

Việc mở rộng này cho phép các mô hình thưa thớt thần kinh khớp với nội dung hoặc từ đồng nghĩa liên quan về mặt ngữ nghĩa ngay cả khi không có các kết quả khớp mã thông báo chính xác, xử lý các lỗi chính tả và khắc phục các sự cố không khớp từ vựng. Đây là lý do tại sao các mô hình thưa thớt thần kinh như SPLADE thường vượt trội hơn các phương pháp tìm kiếm từ vựng truyền thống trong khi vẫn duy trì các lợi ích về hiệu quả của các biểu diễn thưa thớt.

Tuy nhiên, việc mở rộng có những rủi ro của nó. Ví dụ: việc mở rộng truy vấn cho “Thời tiết vào thứ Ba như thế nào?” có thể cũng sẽ mở rộng thành “thứ Hai”, “thứ Tư”, v.v., điều này có thể không mong muốn.

Tại sao Sử dụng Mô hình Nhúng Thưa thớt?

Tóm lại, các mô hình nhúng thưa thớt thần kinh nằm trong một phân khúc có giá trị giữa các phương pháp từ vựng truyền thống như BM25 và các mô hình nhúng dày đặc như Sentence Transformers. Chúng có những ưu điểm sau:

  • Tiềm năng kết hợp: Kết hợp rất hiệu quả với các mô hình dày đặc, có thể gặp khó khăn với các tìm kiếm trong đó các kết quả khớp từ vựng là quan trọng
  • Khả năng diễn giải: Bạn có thể thấy chính xác các mã thông báo nào đóng góp vào kết quả khớp
  • Hiệu suất: Cạnh tranh hoặc tốt hơn so với các mô hình dày đặc trong nhiều tác vụ truy xuất

Trong suốt bài đăng trên blog này, tôi sẽ sử dụng “mô hình nhúng thưa thớt” và “mô hình bộ mã hóa thưa thớt” thay thế cho nhau.

Tại sao Tinh chỉnh?

Phần lớn các mô hình nhúng thưa thớt (thần kinh) sử dụng tính năng mở rộng truy vấn/tài liệu đã đề cập ở trên để bạn có thể khớp các văn bản có ý nghĩa gần như giống hệt nhau, ngay cả khi chúng không chia sẻ bất kỳ từ nào. Tóm lại, mô hình phải nhận ra các từ đồng nghĩa để các mã thông báo đó có thể được đặt trong nhúng cuối cùng.

Hầu hết các mô hình nhúng thưa thớt có sẵn đều dễ dàng nhận ra rằng “siêu thị”, “thực phẩm” và “chợ” là những mở rộng hữu ích của một văn bản có chứa “cửa hàng tạp hóa”, nhưng ví dụ:

  • “Bệnh nhân phàn nàn về chứng đau đầu dữ dội.”

mở rộng thành:

'##lal', 'severe', '##pha', 'ce', '##gia', 'patient', 'complaint', 'patients', 'complained', 'warning', 'suffered', 'had', 'disease', 'complain', 'diagnosis', 'syndrome', 'mild', 'pain', 'hospital', 'injury'

trong khi chúng ta muốn nó mở rộng thành “headache”, từ thông thường cho “cephalalgia”. Ví dụ này mở rộng sang nhiều lĩnh vực, ví dụ: không nhận ra rằng “Java” là một ngôn ngữ lập trình, “Audi” sản xuất ô tô hoặc “NVIDIA” là một công ty sản xuất card đồ họa.

Thông qua quá trình tinh chỉnh, mô hình có thể học cách tập trung độc quyền vào lĩnh vực và/hoặc ngôn ngữ quan trọng đối với bạn.

Thành phần Đào tạo

Việc đào tạo các mô hình Sentence Transformer bao gồm các thành phần sau:

  1. Mô hình: Mô hình để đào tạo hoặc tinh chỉnh, có thể là mô hình Sparse Encoder được đào tạo trước hoặc một mô hình cơ sở.
  2. Tập dữ liệu: Dữ liệu được sử dụng để đào tạo và đánh giá.
  3. Hàm Mất mát: Một hàm định lượng hiệu suất của mô hình và hướng dẫn quá trình tối ưu hóa.
  4. Đối số Đào tạo (tùy chọn): Các tham số ảnh hưởng đến hiệu suất đào tạo và theo dõi/gỡ lỗi.
  5. Trình đánh giá (tùy chọn): Một công cụ để đánh giá mô hình trước, trong hoặc sau khi đào tạo.
  6. Huấn luyện viên: Tập hợp mô hình, tập dữ liệu, hàm mất mát và các thành phần khác để đào tạo.

Bây giờ, chúng ta hãy đi sâu vào từng thành phần này một cách chi tiết hơn.

Mô hình

Các mô hình Sparse Encoder bao gồm một chuỗi Mô-đun, Mô-đun dành riêng cho Sparse Encoder hoặc Mô-đun Tùy chỉnh, cho phép rất nhiều tính linh hoạt. Nếu bạn muốn tinh chỉnh thêm một mô hình Sparse Encoder (ví dụ: nó có một tệp modules.json), thì bạn không phải lo lắng về các mô-đun nào được sử dụng:

from sentence_transformers import SparseEncoder

model = SparseEncoder("naver/splade-cocondenser-ensembledistil")

Nhưng nếu thay vào đó, bạn muốn đào tạo từ một điểm kiểm tra khác hoặc từ đầu, thì đây là các kiến trúc phổ biến nhất mà bạn có thể sử dụng:

Splade

Các mô hình Splade sử dụng MLMTransformer theo sau là các mô-đun SpladePooling. Cái trước tải một mô hình Masked Language Modeling transformer được đào tạo trước (ví dụ: BERT, RoBERTa, DistilBERT, ModernBERT, v.v.) và cái sau gộp đầu ra của MLMHead để tạo ra một nhúng thưa thớt duy nhất có kích thước của từ vựng.

from sentence_transformers import models, SparseEncoder
from sentence_transformers.sparse_encoder.models import MLMTransformer, SpladePooling

# Khởi tạo MLM Transformer (sử dụng mô hình fill-mask)
mlm_transformer = MLMTransformer("google-bert/bert-base-uncased")

# Khởi tạo mô-đun SpladePooling
splade_pooling = SpladePooling(pooling_strategy="max")

# Tạo mô hình Splade
model = SparseEncoder(modules=[mlm_transformer, splade_pooling])

Kiến trúc này là mặc định nếu bạn cung cấp kiến trúc mô hình fill-mask cho SparseEncoder, vì vậy dễ dàng hơn khi sử dụng phím tắt:

from sentence_transformers import SparseEncoder

model = SparseEncoder("google-bert/bert-base-uncased")
# SparseEncoder(
#   (0): MLMTransformer({'max_seq_length': 512, 'do_lower_case': False, 'architecture': 'BertForMaskedLM'})
#   (1): SpladePooling({'pooling_strategy': 'max', 'activation_function': 'relu', 'word_embedding_dimension': None})
# )

Splade Không Suy luận

Splade Không Suy luận sử dụng một mô-đun Bộ định tuyến với các mô-đun khác nhau cho các truy vấn và tài liệu. Thông thường đối với loại kiến trúc này, phần tài liệu là kiến trúc Splade truyền thống (một MLMTransformer theo sau là một mô-đun SpladePooling) và phần truy vấn là một mô-đun SparseStaticEmbedding, chỉ trả về một điểm số được tính toán trước cho mỗi mã thông báo trong truy vấn.

from sentence_transformers import SparseEncoder
from sentence_transformers.models import Router
from sentence_transformers.sparse_encoder.models import SparseStaticEmbedding, MLMTransformer, SpladePooling

# Khởi tạo MLM Transformer để mã hóa tài liệu
doc_encoder = MLMTransformer("google-bert/bert-base-uncased")

# Tạo một mô hình bộ định tuyến với các đường dẫn khác nhau cho các truy vấn và tài liệu
router = Router.for_query_document(
    query_modules=[SparseStaticEmbedding(tokenizer=doc_encoder.tokenizer, frozen=False)],
    # Đường dẫn tài liệu: transformer + gộp MLM đầy đủ
    document_modules=[doc_encoder, SpladePooling("max")],
)

# Tạo mô hình không suy luận
model = SparseEncoder(modules=[router], similarity_fn_name="dot")
# SparseEncoder(
#   (0): Router(
#     (query_0_SparseStaticEmbedding): SparseStaticEmbedding ({'frozen': False}, dim:30522, tokenizer: BertTokenizerFast)
#     (document_0_MLMTransformer): MLMTransformer({'max_seq_length': 512, 'do_lower_case': False, 'architecture': 'BertForMaskedLM'})
#     (document_1_SpladePooling): SpladePooling({'pooling_strategy': 'max', 'activation_function': 'relu', 'word_embedding_dimension': None})
#   )
# )

Kiến trúc này cho phép xử lý thời gian truy vấn nhanh chóng bằng cách sử dụng phương pháp SparseStaticEmbedding nhẹ, có thể được đào tạo và xem như các trọng số tuyến tính, trong khi các tài liệu được xử lý bằng transformer và SpladePooling MLM đầy đủ.

[!TIP] Splade Không Suy luận đặc biệt hữu ích cho các ứng dụng tìm kiếm trong đó độ trễ của truy vấn là rất quan trọng, vì nó chuyển sự phức tạp về tính toán sang giai đoạn lập chỉ mục tài liệu có thể được thực hiện ngoại tuyến.

[!NOTE] Khi đào tạo các mô hình với mô-đun Router, bạn phải sử dụng đối số router_mapping trong SparseEncoderTrainingArguments để ánh xạ các cột tập dữ liệu đào tạo đến tuyến đường chính xác (“query” hoặc “document”). Ví dụ: nếu tập dữ liệu của bạn có các cột ["question", "answer"], thì bạn có thể sử dụng ánh xạ sau:

args = SparseEncoderTrainingArguments(
    ...,
    router_mapping={
        "question": "query",
        "answer": "document",
    }
)

Ngoài ra, bạn nên sử dụng tốc độ học tập cao hơn nhiều cho mô-đun SparseStaticEmbedding so với phần còn lại của mô hình. Để làm điều này, bạn nên sử dụng đối số learning_rate_mapping trong SparseEncoderTrainingArguments để ánh xạ các mẫu tham số đến tốc độ học tập của chúng. Ví dụ: nếu bạn muốn sử dụng tốc độ học tập 1e-3 cho mô-đun SparseStaticEmbedding và 2e-5 cho phần còn lại của mô hình, bạn có thể làm như sau:

args = SparseEncoderTrainingArguments(
    ...,
    learning_rate=2e-5,
    learning_rate_mapping={
        r"SparseStaticEmbedding\.*": 1e-3,
    }
)

Biểu diễn Thưa thớt Tương phản (CSR)

Các mô hình Biểu diễn Thưa thớt Tương phản (CSR), được giới thiệu trong Beyond Matryoshka: Revisiting Sparse Coding for Adaptive Representation, áp dụng một mô-đun SparseAutoEncoder trên đầu một mô hình Sentence Transformer dày đặc, thường bao gồm một Transformer theo sau là một mô-đun Pooling. Bạn có thể khởi tạo một mô hình từ đầu như sau:

from sentence_transformers import models, SparseEncoder
from sentence_transformers.sparse_encoder.models import SparseAutoEncoder

# Khởi tạo transformer (có thể là bất kỳ mô hình mã hóa dày đặc nào)
transformer = models.Transformer("google-bert/bert-base-uncased")

# Khởi tạo gộp
pooling = models.Pooling(transformer.get_word_embedding_dimension(), pooling_mode="mean")

# Khởi tạo mô-đun SparseAutoEncoder
sparse_auto_encoder = SparseAutoEncoder(
    input_dim=transformer.get_word_embedding_dimension(),
    hidden_dim=4 * transformer.get_word_embedding_dimension(),
    k=256,  # Số lượng giá trị hàng đầu cần giữ lại
    k_aux=512,  # Số lượng giá trị hàng đầu cho tổn thất phụ trợ
)
# Tạo mô hình CSR
model = SparseEncoder(modules=[transformer, pooling, sparse_auto_encoder])

Hoặc nếu mô hình cơ sở của bạn là 1) một mô hình Sentence Transformer dày đặc hoặc 2) một mô hình Transformer không phải MLM (những mô hình này được tải làm mô hình Splade theo mặc định), thì phím tắt này sẽ tự động khởi tạo mô hình CSR cho bạn:

from sentence_transformers import SparseEncoder

model = SparseEncoder("mixedbread-ai/mxbai-embed-large-v1")
# SparseEncoder(
#   (0): Transformer({'max_seq_length': 512, 'do_lower_case': False, 'architecture': 'BertModel'})
#   (1): Pooling({'word_embedding_dimension': 1024, 'pooling_mode_cls_token': True, 'pooling_mode_mean_tokens': False, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
#   (2): SparseAutoEncoder({'input_dim': 1024, 'hidden_dim': 4096, 'k': 256, 'k_aux': 512, 'normalize': False, 'dead_threshold': 30})
# )

[!WARNING] Không giống như các mô hình Splade (Không Suy luận), các nhúng thưa thớt theo các mô hình CSR không có cùng kích thước với từ vựng của mô hình cơ sở. Điều này có nghĩa là bạn không thể trực tiếp diễn giải những từ nào được kích hoạt trong nhúng của mình như bạn có thể làm với các mô hình Splade, trong đó mỗi chiều tương ứng với một mã thông báo cụ thể trong từ vựng.

Ngoài ra, các mô hình CSR hiệu quả nhất trên các mô hình bộ mã hóa dày đặc sử dụng các biểu diễn chiều cao (ví dụ: 1024-4096 chiều).

Hướng dẫn Chọn Kiến trúc

Nếu bạn không chắc chắn nên sử dụng kiến trúc nào, thì đây là hướng dẫn nhanh:

  • Bạn có muốn làm thưa thớt một mô hình Nhúng Dày đặc hiện có không? Nếu có, hãy sử dụng CSR.
  • Bạn có muốn suy luận truy vấn của mình diễn ra ngay lập tức với chi phí hiệu suất nhỏ không? Nếu có, hãy sử dụng SPLADE Không Suy luận.
  • Nếu không, hãy sử dụng SPLADE.

Tập dữ liệu

SparseEncoderTrainer sử dụng các phiên bản datasets.Dataset hoặc datasets.DatasetDict để đào tạo và đánh giá. Bạn có thể tải dữ liệu từ Hugging Face Datasets Hub hoặc sử dụng dữ liệu cục bộ ở nhiều định dạng khác nhau như CSV, JSON, Parquet, Arrow hoặc SQL.

Lưu ý: Rất nhiều tập dữ liệu công khai hoạt động ngoài hộp với Sentence Transformers đã được gắn thẻ sentence-transformers trên Hugging Face Hub, vì vậy bạn có thể dễ dàng tìm thấy chúng trên https://huggingface.co/datasets?other=sentence-transformers. Hãy cân nhắc duyệt qua những tập dữ liệu này để tìm các tập dữ liệu sẵn sàng có thể hữu ích cho các tác vụ, lĩnh vực hoặc ngôn ngữ của bạn.

Dữ liệu trên Hugging Face Hub

Bạn có thể sử dụng hàm load_dataset để tải dữ liệu từ các tập dữ liệu trong Hugging Face Hub

from datasets import load_dataset

train_dataset = load_dataset("sentence-transformers/natural-questions", split="train")

print(train_dataset)
"""
Dataset({
    features: ['query', 'answer'],
    num_rows: 100231
})
"""

Một số tập dữ liệu, như nthakur/swim-ir-monolingual, có nhiều tập hợp con với các định dạng dữ liệu khác nhau. Bạn cần chỉ định tên tập hợp con cùng với tên tập dữ liệu, ví dụ: dataset = load_dataset("nthakur/swim-ir-monolingual", "de", split="train").

Dữ liệu cục bộ (CSV, JSON, Parquet, Arrow, SQL)

Bạn cũng có thể sử dụng load_dataset để tải dữ liệu cục bộ ở một số định dạng tệp nhất định:

from datasets import load_dataset

dataset = load_dataset("csv", data_files="my_file.csv")
# hoặc
dataset = load_dataset("json", data_files="my_file.json")

Dữ liệu cục bộ yêu cầu tiền xử lý

Bạn có thể sử dụng datasets.Dataset.from_dict nếu dữ liệu cục bộ của bạn yêu cầu tiền xử lý. Điều này cho phép bạn khởi tạo tập dữ liệu của mình bằng một từ điển các danh sách:

from datasets import Dataset

queries = []
documents = []
# Mở một tệp, thực hiện tiền xử lý, lọc, làm sạch, v.v.
# và nối vào các danh sách

dataset = Dataset.from_dict({
    "query": queries,
    "document": documents,
})

Mỗi khóa trong từ điển trở thành một cột trong tập dữ liệu kết quả.

Định dạng Tập dữ liệu

Điều quan trọng là phải đảm bảo rằng định dạng tập dữ liệu của bạn khớp với hàm mất mát bạn đã chọn. Điều này liên quan đến việc kiểm tra hai điều:

  1. Nếu hàm mất mát của bạn yêu cầu một Nhãn (như được chỉ ra trong bảng Tổng quan về Mất mát), tập dữ liệu của bạn phải có một cột có tên là “label” hoặc “score”.
  2. Tất cả các cột khác với “label” hoặc “score” được coi là Đầu vào (như được chỉ ra trong bảng Tổng quan về Mất mát). Số lượng các cột này phải khớp với số lượng đầu vào hợp lệ cho hàm mất mát bạn đã chọn. Tên của các cột không quan trọng, chỉ thứ tự của chúng mới quan trọng.

Ví dụ: nếu hàm mất mát của bạn chấp nhận các bộ ba (anchor, positive, negative), thì cột tập dữ liệu thứ nhất, thứ hai và thứ ba của bạn tương ứng với anchor, positivenegative, tương ứng. Điều này có nghĩa là cột thứ nhất và thứ hai của bạn phải chứa các văn bản sẽ nhúng chặt chẽ và cột thứ nhất và thứ ba của bạn phải chứa các văn bản sẽ nhúng cách xa nhau. Đó là lý do tại sao tùy thuộc vào hàm mất mát của bạn, thứ tự cột tập dữ liệu của bạn mới

Recommended for You

SmolLM3- smol, đa ngôn ngữ, lý luận theo ngữ cảnh dài

SmolLM3- smol, đa ngôn ngữ, lý luận theo ngữ cảnh dài

Tạo các kernel tùy chỉnh cho AMD MI300

Tạo các kernel tùy chỉnh cho AMD MI300