SimCSE论文阅读

  • 正负样本对构建原理正样本pair:one sentence two different embeddings as “positive pairs”. (通过dropout 作为噪声)
  • 负样本pair:Then we take other sentences in the same mini-batch as “negatives”
  • 任务: the model predicts the positive one among the negatives

在这里插入图片描述

无监督pair构造:

  • 只有自己和自己的随机dropout后的是正样本pair
  • 自己和其他的样本都是负样本

其实一个batch,比如有N个句子对,那么就有2N个句子,其中正例是1个,负样本应该是总样本数目2N减去样本本身,也就是2N-1;

在这里插入图片描述

有监督的pair构造:

按照上图理解,一个句子,有两个已经打好不同的标签的句子,进行配对。pair远离一样。

构造难度增加(一般采用这种策略):二元组变三元组

在这里插入图片描述

infoNCE Loss的理解:

在这里插入图片描述

Q:温度常数t的作用是什么?
温度系数的作用是调节对困难样本的关注程度:越小的温度系数越关注于将本样本和最相似的困难样本分开,去得到更均匀的表示。然而困难样本往往是与本样本相似程度较高的,很多困难负样本其实是潜在的正样本,过分强迫与困难样本分开会破坏学到的潜在语义结构,

  • 因此,温度系数不能过小

考虑两个极端情况:
(1)温度系数趋向于0时,对比损失退化为只关注最困难的负样本的损失函数;
(2)当温度系数趋向于无穷大时,对比损失对所有负样本都一视同仁,失去了困难样本关注的特性。
物理的角度理解:

可以把不同的负样本想像成同极点电荷在不同距离处的受力情况,距离越近的点电荷受到的库伦斥力更大,而距离越远的点电荷受到的斥力越小。

  • 对比损失中,越近的负例受到的斥力越大,具体的表现就是对应的负梯度值越大[4]。这种性质更有利于形成在超球面均匀分布的特征。

  • 梯度越大,权重更新的越厉害,越能区分开来

构造案例:

在这里插入图片描述
在这里插入图片描述

  • 100 是指自己和自己完全一样,表示自身和自身不做相似度比较。
  • 1是指自己和自己不同的embedding
  • 不同的embedding构造:SimCSE源码中实际上是在一个batch中实现的,即[a,a,b,b…]作为一个batch去输入(复制一下)

对比学习度量学习和对比学习的思想是一样的,都是去拉近相似的样本,推开不相似的样本
但是对比学习是无监督或者自监督学习方法,而度量学习一般为有监督学习方法

对比学习的loss:

对比学习在loss设计时,为单正例多负例的形式,因为是无监督,数据是充足的,也就可以找到无穷的负例,但如何构造有效正例才是重点

in-batch sampled softmax loss

in-batch sampled softmax loss的意义:

  1. 解决在大规模数据和高维度特征情况下,计算softmax损失的效率问题(避免全局采样)。
    • 在这种情况下,逐个计算每个样本的softmax损失可能会导致计算复杂度过高,而且在训练过程中可能会出现内存不足的问题。因此,通过在每个训练批次中采样负样本,可以减少计算开销并提高训练效率。
  2. 在训练过程中对负样本进行采样,使得模型在学习过程中更加关注困难的负样本,从而能够更有效地改善模型的表现。
  3. in-batch sampled softmax loss还能够帮助优化器更好地收敛,提高模型的泛化能力
    在这里插入图片描述

度量学习的loss:

而度量学习多为二元组或三元组的形式,如常见的Triplet形式(anchor,positive,negative),Hard Negative的挖掘对最终效果有较大的影响

  • Q:对比学习中一般选择一个batch中的所有其他样本作为负例,那如果负例中有很相似的样本怎么办?

在无监督无标注的情况下,这样的伪负例,其实是不可避免的,首先可以想到的方式是去扩大语料库,去加大batch size,以降低batch训练中采样到伪负例的概率,减少它的影响。

SimCSE的缺点

从 SimCSE 的正例构建中我们可以看出来,所有的正例都是由「同一个句子」过了两次模型得到的。

  • 这就会造成一个问题:模型会更倾向于认为,长度相同的句子就代表一样的意思。
  • 原因:由于数据样本是随机选取的,那么很有可能在一个 batch 内采样到的句子长度是不相同的。
    在这里插入图片描述

解决方案:

要想消除模型对句子长度的敏感,我们就需要在构建正例的时候让输入句子的长度发生改变
改变句子长度通常有 3 种方法:随机删除、随机添加、同义词替换,但它们均存在句意变化的风险

  • 所以,通过随机重复单词,既能够改变句子长度,又不会轻易改变语义。

单/双塔

单/双塔参考链接:https://zhuanlan.zhihu.com/p/585533302

关于PromptBert:

  • 作者认为,原生BERT表现不好主要是因为词语频率、大小写、subword等token导致的bias,而BERT本身各层Transformer都没有纠正这个问题。
  • 通过利用prompt,可以更有效地使用BERT各层中的知识,并且用[MASK]来表示embedding的话,可以避免像以前一样做各种token的平均,从而避免了token引入的偏差。

探索

无监督Break-It-Fix-It

  • http://ai.stanford.edu/blog/bifi/

负样本采样策略

  • 关于采样的一切:https://blog.csdn.net/abcdefg90876/article/details/122248083
  • https://github.com/RUCAIBox/Negative-Sampling-Paper

静态负采样:在不考虑合成新负例的前提下,负采样本质上是学习负例分布的问题。当每个样例被采样为负例的概率不随训练发生变化时,我们就称这种采样策略为静态负采样 (Static Negative Sampling)。

强负例采样:静态负采样方法不随训练发生变化,无法动态地适应并调整候选负例的分布,也就难以挖掘更有利的负样本。尽管我们没有显式的负例标签,但在训练过程中,模型对每个候选负例的分数是可以被利用的。

  • 无论哪个领域,挖掘强负例的最常见方法都是选择离 anchor/user/query 最近的样本(即在 embedding 空间中最相似的样本)。

既然锚点样本对负例选择有帮助,那么自然而然可以想到正例也能为配对的负例提供相似度的信息。

一些经典做法:

  • [19] 在问答系统中选择与正例最相似的样本作为负例

  • [25, 27, 36] 中为知识图谱三元组选取负例时也是选择离正例最接近的实体。

  • KGPolicy [73] 既考虑了与 anchor 的相似度,又考虑了与 positive example 的相似度,将两者相加作为选择强负例的标准。

  • MoCHi [32] 在对比学习的任务中直接合成强负例,通过 Hard Negative Mixing 的方式融合了现有强负例与 query 的表示,从 embedding 空间得到了更能为训练带来增益的负例。

  • IRGAN: A Minimax Game for Unifying Generative and Discriminative Information Retrieval Models [39]
    然而,对抗式负采样方法的缺点也很突出,复杂的框架、不稳定的训练结果和较长的训练时间都极大地限制了该方法的应用场景,生成器与对抗器之间的博弈也不一定能收敛到理想的纳什均衡状态,对抗式负采样方法仍有探索和改进的空间。

SimCSE(Sentence-level Contrastive Learning for Sentence Embeddings)是一种用于句子嵌入学习的对比学习方法。它通过将相似的句子嵌入向量在嵌入空间中拉近,将不相似的句子嵌入向量在嵌入空间中推远,从而实现句子语义的表示和相似度计算。 SimCSE的实现可以使用conda进行环境管理。conda是一个开源的包管理系统和环境管理系统,可以用于创建、部署和管理不同的软件环境。使用conda可以方便地创建一个独立的Python环境,并安装SimCSE所需的依赖库。 要使用conda创建SimCSE的环境,可以按照以下步骤操作: 1. 安装conda:首先需要安装conda,可以从Anaconda官网下载对应操作系统的安装包,并按照官方文档进行安装。 2. 创建环境:打开终端或命令提示符,运行以下命令创建一个新的环境: ``` conda create -n simcse_env python=3.7 ``` 这将创建一个名为simcse_env的环境,并指定Python版本为3.7。 3. 激活环境:创建环境后,需要激活该环境才能使用。运行以下命令激活环境: - Windows: ``` conda activate simcse_env ``` - Linux/Mac: ``` source activate simcse_env ``` 4. 安装依赖库:激活环境后,可以使用conda或pip安装SimCSE所需的依赖库。例如,可以运行以下命令使用conda安装torch和transformers库: ``` conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch conda install -c huggingface transformers ``` 或者使用pip安装: ``` pip install torch torchvision torchaudio pip install transformers ``` 5. 安装SimCSE:在激活的环境中,可以使用git克隆SimCSE的代码库,并进行安装: ``` git clone https://github.com/princeton-nlp/SimCSE.git cd SimCSE pip install -r requirements.txt ``` 完成以上步骤后,就可以在SimCSE的环境中运行代码了。记得在使用SimCSE之前,需要下载预训练的模型权重和数据集,并按照SimCSE的文档进行配置和使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值