前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >预训练句子表征——【EMNLP 2021】SimCSE

预训练句子表征——【EMNLP 2021】SimCSE

作者头像
小爷毛毛_卓寿杰
发布2021-12-07 13:36:25
7390
发布2021-12-07 13:36:25
举报
文章被收录于专栏:Soul Joy HubSoul Joy Hub

1. 介绍

SimCSE(Simple Contrastive Learning of Sentence Embeddings)是一种简单在没有监督训练数据的情况下训练句子向量的对比学习方法。

这个方法是对同一个句子进行两次编码。由于在 Transformer 模型中使用了 dropout,两个句子表征的位置将略有不同。这两个表征之间的距离将被最小化,而同一批中其他句子的其他表征的距离将被最大化(它们作为反例):

  • 目标函数:

其中,z和z’ 是两个不同的dropout随机掩码。 h_i^{z_i},h_i^{z'_i} 是相同句子 x_i 输入相同编码器,但使用两个不同的dropout随机掩码而得到的向量。

2. 实验效果

发现效果会比我之前介绍的CT要好

3. 实现

sentence_transformers已经把SimCSE已经封装成pip包,完整的训练流程例子可以参考《Sentence-BERT》。我们在此基础上只用修改loss就能轻松的训练SimCSE了:

代码语言:javascript
复制
from sentence_transformers import SentenceTransformer, InputExample
from sentence_transformers import models, losses
from torch.utils.data import DataLoader

# ……

train_loss = losses.MultipleNegativesRankingLoss(model)

# 训练模型
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=1,
    show_progress_bar=True
)

4. 有监督的训练

SimCSE也可以用于有监督的数据上训练。我们构造的有监督数据形式为(x_i,x_i^+,x_i^-) 。简单来说,就是在训练时不只是把x_i^- 视为负例,且把同batch其他句子的正负例都视为句子i的负例:

目标函数为:

实验效果:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 介绍
  • 2. 实验效果
  • 3. 实现
  • 4. 有监督的训练
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档