论文地址:https://arxiv.org/pdf/2104.08821.pdf
代码链接:https://github.com/seanzhang-zhichen/simcse-pytorch
simcse模型一共包含两种训练方式,包括无监督部分和有监督部分。论文中模型的整体结构如下:
论文首先使用了一种无监督的方法,仅仅使用dropout来对数据进行数据增广,即 将同一句子输入预训练的编码器两次,通过dropout可以得到两个不同的编码向量,这两条编码向量即作为“正对”。接着从小批量中其他的句子都作为负样本,模型预测否定句中的正句。有监督的方法使用自然语言推理( Natural Language Inference,NLI )数据集进行句子嵌入的成功基础上,在对比学习中融合已经标注完成的句子对(上图(b))。
使用dropout作为数据增强:
论文将其视为一种最小形式的数据增强方式:正对取完全相同的句子,并且他们的嵌入只在dropout掩码中不同。
无监督训练
在无监督部分,上面已经说明了,使用dropout进行数据增强来构建正样本,而负样本则实在同一个batch中的其他句子。
在无监督部分,结合了两个数据集中的样本进行训练,
snli_train = './data/data/cnsd-snli/train.txt'
sts_train = './data/data/STS-B/cnsd-sts-train.txt'
if model_type == "unsup":
train_data_snli = load_data('snli', snli_train, model_type)
train_data_sts = load_data('sts', sts_train, model_type)
train_data = train_data_snli + [_[0] for _ in train_data_sts] # 两个数据集组合
两个数据集中的样本展示如下:
cnsd-sts-train.txt:这个数据集中每条样本包括两个句子,并且给出了它们之间的相似度,中间用“||”隔开。在无监督训练是我们只需要每条样本的第一条句子,将其输入到bert的编码器中,得到两次生成的编码向量,即为相似样本对。
train.txt:这个数据集中每条样本包括一个原始句子origin,对应的正样本entailment,对应的负样本contradiction。在无监督训练是我们只需要每条样本的origin,将其输入到bert的编码器中,得到两次生成的编码向量,即为相似样本对。
对数据集的具体处理流程如下面代码: