为变压器微调组织数据

Organize data for transformer fine-tuning

我有一个同义词和非同义词的语料库。这些存储在 python 个词典列表中,例如 {"sentence1": <string>, "sentence2": <string>, "label": <1.0 or 0.0> }。请注意,这个词(或句子)不必是标记器中的单个标记。

我想微调一个基于 BERT 的模型来接受两个句子,例如:[[CLS], <sentence1_token1>], ...,<sentence1_tokenN>, [SEP], <sentence2_token1>], ..., <sentence2_tokenM>, [SEP]] 并预测“标签”(0.0 到 1.0 之间的测量值)。

组织此数据以促进拥抱面变换器微调的最佳方法是什么?

编码时可以使用 Tokenizer __call__ 方法连接两个句子。

如果您使用的是 PyTorch 实现,这里有一个示例:

import torch
from transformers import AutoTokenizer

sentences1 = ... # List containing all sentences 1
sentences2 = ... # List containing all sentences 2
labels = ... # List containing all labels (0 or 1)

TOKENIZER_NAME = "bert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_NAME)

encodings = tokenizer(
    sentences1,
    sentences2,
    return_tensors="pt"
)

labels = torch.tensor(labels)

然后您可以创建自定义数据集以在训练中使用它:

class CustomRealDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: value[idx] for key, value in self.encodings.items()}
        item["labels"] = self.labels[idx]
        return item

    def __len__(self):
        return len(self.labels)