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 也是一种强大的预训练方法,性能优于经典的掩码语言模型(MLM)预训练任务。

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

引用

如果您使用增强 SBERT 的代码,请随时引用我们的出版物 TSDAE: Using Transformer-based Sequential Denoising Auto-Encoder for 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",
}