文本匹配之SimCSE学习(pytorch)

论文地址: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的编码器中,得到两次生成的编码向量,即为相似样本对。

  对数据集的具体处理流程如下面代码:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值