【论文阅读-句向量】Evaluation of BERT and ALBERT Sentence Embedding Performance on Downstream NLP Tasks

昨天说到sentence embedding,今天就补了一篇BERT里面[CLS]的论文。BERT 以及ALBERT(A Lite BERT)类的预训练模型可以通过[CLS]来生成句向量,但是其效果真的好吗?
这篇笔记首发于:https://zhuanlan.zhihu.com/p/477863892

Title: Evaluation of BERT and ALBERT Sentence Embedding Performance on Downstream NLP Tasks

From: ICPR 2020

Link: https://arxiv.org/abs/2101.10642

image-20220308194552087

背景

BERT 模型在训练时候,引入了一个额外的任务 next sentence prediction(NSP),所以除了token的embeddings,还可以获得句子的embedding,用[CLS]来表示。除了用这个表示,如果想获得句向量,一种可替代的方式是对句子中所有token的embedding取平均值。但这两种方式效果都不是很好。这篇论文里,作者提出两种模式,基于BERT的Sentence-BERT(SBERT)以及基于ALBERT的Sentence-ALBERT (SALBERT)。

Baseline模型 以及 Proposed model

  • [CLS] embedding

    [CLS] 作为句向量的输出是最直接的方式。而且,[CLS]在微调阶段也可以继续被优化。

  • 池化所有 token的embeddings

    对句子中的token进行平均或者最大池化,将token嵌入转化为固定长度的句子向量。(这篇论文用的是平均池化,但我觉得加一个max pooling好像比单纯的average pooling有用)

  • SBERT/SALBERT

    用孪生神经网络来对BERT输出的embedding进行池化,然后对生成两个句向量计算余弦相似度。

    image-20220308224305026

  • CNN-SBERT / CNN-SALBERT

    在这个方法中,用CNN替换了上面的average pooling。除了最后一层,前面的每层pooling都是max pooling.

image-20220308224817370

实验

在语义文本相似度 (STS) 和自然语言推理 (NLI) 两个任务上做的,来评估上述句子嵌入模型的性能。

  • Task and Dataset

    (1) Semantic Textual Similarity benchmark(STSb):给一对句子根据语意相似度进行评分,0-5分。

    (2) Multi-genre Natural Language Inference(MultiNLI):MultiNLI语料是做蕴含分类,判断两个句子的关系是矛盾的、蕴涵的还是中性的。

    (3) Stanford Natural Language Inference (SNLI):和上一个一样,也是做蕴含、矛盾和中性三种。

    BERT和ALBERT也在上述三个数据集上进行了微调。

  • 评测指标

    Pearson and Spearman’s rank coefficients(皮尔逊和斯皮尔曼相关系数)

  • Results

    结果如下表所示,可以看到,CLS的效果非常差,微调之后稍稍还好一些。但仍然是所有里面最差的,简单的平均池化都要比它高出20-40个点。

image-20220308230625714

总结

  • 微调是有效的
  • CLS做句向量的效果挺差的,还不如所有token的平均池化
  • 模型效果比较:CNN-BERT > SBERT > Avg pooling > CLS
  • CNN 对 ALBERT 的改进要远大于对 BERT 的改善提高。ALBERT 由于内部参数共享,可能存在不稳定性,CNN 网络结构或许可以减缓这种不稳定性。

参考

BERT中CLS效果真的好嘛?这篇文章告诉你答案

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Sentence-BERT是一种自然语言处理模型,可用于将子转换为向量表示。下面是一个使用Python代码的示例,展示如何使用Sentence-BERT转换子为向量。 首先,需要安装Sentence-BERT的Python包。可以使用以下命令安装: ``` pip install sentence-transformers ``` 然后,可以使用以下代码加载Sentence-BERT模型并将子转换为向量: ```python from sentence_transformers import SentenceTransformer # 加载Sentence-BERT模型 model = SentenceTransformer('bert-base-nli-mean-tokens') # 定义子列表 sentences = ['这是一个子', '这是另一个子'] # 将子转换为向量 sentence_embeddings = model.encode(sentences) # 打印结果 print(sentence_embeddings) ``` 上述代码将输出一个形如`[array([...], dtype=float32), array([...], dtype=float32)]`的列表,其中每个数组都是对应子的向量表示。 请注意,这是一个简化的示例,实际应用中还可能有更多的参数和配置。建议您参考Sentence-BERT的文档,了解更多信息。 ### 回答2: Sentence-BERT是一种预训练的BERT模型,专门用于生成文本子的嵌入向量。使用Sentence-BERT来转换子为向量的代码如下: 首先,需要安装相应的Python依赖库,包括transformers和torch等。 ```python from sentence_transformers import SentenceTransformer, util import torch # 加载Sentence-BERT模型 model = SentenceTransformer('bert-base-nli-mean-tokens') # 需要转换为向量sentences = ['这是一个例子子1', '这是一个例子子2'] # 将子进行转换为向量 sentence_embeddings = model.encode(sentences, convert_to_tensor=True) # 打印转换后的向量 for sentence, embedding in zip(sentences, sentence_embeddings): print("子:", sentence) print("向量:", embedding) print("") ``` 上述代码首先加载了Sentence-BERT模型,其中选择了预训练的bert-base-nli-mean-tokens模型,也可以使用其他预训练模型。然后,定义了要转换为向量子列表。接下来,调用`model.encode()`方法,将子列表作为参数传递进去,该方法会返回子的嵌入向量。最后,通过迭代子列表和嵌入向量列表,可以打印出每个子及其对应的向量表示。 需要注意的是,转换后的向量是一个torch.Tensor对象,可以通过`embedding.tolist()`将其转换为列表形式。另外,如果想计算两个子之间的相似度,可以使用`util.pytorch_cos_sim()`方法来计算余弦相似度。 ### 回答3: Sentence-BERT(SBERT)是一种用于生成文本向量的预训练模型,它可以将子转换为词向量表示。以下是一个使用Sentence-BERT转换向量的Python代码示例: 1. 安装必要的库: ```python !pip install -U sentence-transformers ``` 2. 导入必要的库: ```python from sentence_transformers import SentenceTransformer ``` 3. 加载预训练模型: ```python model = SentenceTransformer('paraphrase-MiniLM-L6-v2') ``` 这里我们加载了SBERT的一个预训练模型,例如:'paraphrase-MiniLM-L6-v2'。你也可以根据需要选择其他预训练模型。 4. 转换子为向量: ```python sentence = '这是一个例子子。' sentence_embedding = model.encode([sentence]) ``` 我们将待转换子作为列表传递给模型的encode()方法,该方法将返回一个包含向量的列表。在这个例子中,我们只有一个子,因此输出将是一个长度为1的列表。 5. 打印转换结果: ```python print('向量的维度:', len(sentence_embedding[0]), '维') print('向量:', sentence_embedding[0]) ``` 这里我们打印了输出向量的维度和向量本身。 通过以上代码,我们可以获得原始子的向量表示。你还可以使用这些向量进行子相似性计算、聚类、检索等自然语言处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值