TSDAE

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

背景

在训练过程中,TSDAE将损坏的句子编码为固定大小的向量,并要求解码器从这些句子嵌入中重建原始句子。为了获得良好的重建质量,编码器中的句子嵌入必须很好地捕捉语义。随后,在推理时,我们仅使用编码器来生成句子嵌入。其架构如下图所示:

https://raw.githubusercontent.com/UKPLab/sentence-transformers/master/docs/img/TSDAE.png

使用TSDAE进行无监督训练

使用TSDAE进行训练非常简单。你只需要一组句子:

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

# 使用CLS池化定义你的句子转换器模型
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])

# 定义一个包含句子的列表(1k - 100k句)
train_sentences = [
    "你的句子集合",
    "模型将自动添加噪声",
    "并重新构建它",
    "你应该提供至少1k个句子",
]

# 创建特殊的去噪数据集,动态添加噪声
train_dataset = datasets.DenoisingAutoEncoderDataset(train_sentences)

# 数据加载器以批处理数据
train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True)

# 使用去噪自编码器损失
train_loss = losses.DenoisingAutoEncoderLoss(
    model, decoder_name_or_path=model_name, tie_encoder_decoder=True
)

# 调用fit方法
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: 使用基于Transformer的顺序去噪自编码器进行无监督句子嵌入学习

@article{wang-2021-TSDAE,
    title = "TSDAE: 使用基于Transformer的顺序去噪自编码器进行无监督句子嵌入学习",
    author = "Wang, Kexin and Reimers, Nils and  Gurevych, Iryna", 
    journal= "arXiv预印本arXiv:2104.06979",
    month = "4",
    year = "2021",
    url = "https://arxiv.org/abs/2104.06979",
}