TSDAE

本节展示了一个示例,说明我们如何使用纯句子作为训练数据来训练无监督的 TSDAE (基于 Transformer 的去噪自动编码器) 模型。

背景

在训练期间,TSDAE 将损坏的句子编码为固定大小的向量,并要求解码器从这些句子嵌入中重建原始句子。为了获得良好的重建质量,语义必须在编码器的句子嵌入中得到很好的捕获。之后,在推理时,我们仅使用编码器来创建句子嵌入。下图说明了该架构

使用 TSDAE 进行无监督训练

使用 TSDAE 进行训练很简单。您只需要一组句子

from sentence_transformers import SentenceTransformer, LoggingHandler
from sentence_transformers import models, util, datasets, evaluation, losses
from torch.utils.data import DataLoader

# Define your sentence transformer model using CLS pooling
model_name = "bert-base-uncased"
word_embedding_model = models.Transformer(model_name)
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension(), "cls")
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])

# Define a list with sentences (1k - 100k sentences)
train_sentences = [
    "Your set of sentences",
    "Model will automatically add the noise",
    "And re-construct it",
    "You should provide at least 1k sentences",
]

# Create the special denoising dataset that adds noise on-the-fly
train_dataset = datasets.DenoisingAutoEncoderDataset(train_sentences)

# DataLoader to batch your data
train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True)

# Use the denoising auto-encoder loss
train_loss = losses.DenoisingAutoEncoderLoss(
    model, decoder_name_or_path=model_name, tie_encoder_decoder=True
)

# Call the fit method
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=1,
    weight_decay=0,
    scheduler="constantlr",
    optimizer_params={"lr": 3e-5},
    show_progress_bar=True,
)

model.save("output/tsdae-model")

从句子文件获取 TSDAE

train_tsdae_from_file.py 从提供的文本文件中加载句子。预期文本文件中的每一行都包含一个句子。

TSDAE 将使用这些句子进行训练。检查点会每 500 步存储到输出文件夹。

AskUbuntu 数据集上的 TSDAE

AskUbuntu 数据集 是一个手动标注的 AskUbuntu 论坛数据集。对于 400 个问题,专家为每个问题标注了 20 个其他问题,以确定它们是否相关。问题被分为训练集和开发集。

train_askubuntu_tsdae.py - 展示了如何仅使用句子(不带任何标签)在 AskUbuntu 上训练模型的示例。作为句子,我们使用未在开发/测试集中使用的标题。

模型 测试集上的 MAP 分数
TSDAE (bert-base-uncased) 59.4
预训练 SentenceTransformer 模型
nli-bert-base 50.7
paraphrase-distilroberta-base-v1 54.8
stsb-roberta-large 54.6

TSDAE 作为预训练任务

正如我们在 TSDAE 论文 中展示的那样,TSDAE 也是一种强大的预训练方法,其性能优于经典的 Mask Language Model (MLM) 预训练任务。

您首先使用 TSDAE 损失函数训练您的模型。在训练一定步数后/模型收敛后,您可以像任何其他 SentenceTransformer 模型一样进一步微调您的预训练模型。

引用

如果您使用增强的 sbert 代码,请随意引用我们的出版物 TSDAE: Using Transformer-based Sequential Denoising Auto-Encoderfor Unsupervised Sentence Embedding Learning

@article{wang-2021-TSDAE,
    title = "TSDAE: Using Transformer-based Sequential Denoising Auto-Encoderfor Unsupervised Sentence Embedding Learning",
    author = "Wang, Kexin and Reimers, Nils and  Gurevych, Iryna", 
    journal= "arXiv preprint arXiv:2104.06979",
    month = "4",
    year = "2021",
    url = "https://arxiv.org/abs/2104.06979",
}