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
# 使用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",
}