BERT 的输入处理过程(Token嵌入,句子嵌入等)

SBERT 的输入处理过程

SBERT(Sentence-BERT)是基于 BERT 的模型,用于生成句子嵌入。它的输入处理过程主要包括以下几个步骤:分词、编码、池化和输出句子嵌入。SBERT 的设计简化了句子对任务中的计算,并专注于生成句子的固定长度嵌入。

1. 输入格式

SBERT 的输入可以是:

  • 单个句子,用于生成单个句子的嵌入。
  • 句子对,用于比较句子之间的语义相似性。

输入示例:

单个句子:Sentence: "A man is playing a guitar."

句子对:

Sentence 1: "A man is playing a guitar."

Sentence 2: "Someone is performing music."

2. 输入处理步骤

Step 1: 分词(Tokenization)

SBERT 使用与 BERT 相同的分词器(如 WordPiece 或 SentencePiece),将输入句子分解为子词(Tokens)。

  • 特殊标记:
    • [CLS]:表示句子的起始,用于句子级别的分类任务。
    • [SEP]:表示句子的结束,用于分隔句子对。

单个句子分词:

输入句子:

"A man is playing a guitar."

分词结果:

['[CLS]', 'A', 'man', 'is', 'playing', 'a', 'guitar', '.', '[SEP]']

句子对分词:

输入句子对:

Sentence 1: "A man is playing a guitar."

Sentence 2: "Someone is performing music."

分词结果:

['[CLS]', 'A', 'man', 'is', 'playing', 'a', 'guitar', '.', '[SEP]', 'Someone', 'is', 'performing', 'music', '.', '[SEP]']

Step 2: 将分词结果转换为输入 ID

每个 Token 会映射到词汇表中的唯一 ID(一个整数值),这些 ID 将被模型作为输入。

示例:

['[CLS]', 'A', 'man', 'is', 'playing', 'a', 'guitar', '.', '[SEP]']

→ [101, 1037, 2158, 2003, 2652, 1037, 9676, 1012, 102]

Step 3: 创建输入张量

SBERT 的输入包含以下张量:

Input IDs:分词结果的 Token ID,表示每个 Token 的索引值。

Attention Mask:用于指示哪些位置是有效的 Token(值为 1),哪些位置是填充(值为 0)。

Token Type IDs(仅用于句子对):

    • 区分句子 1 和句子 2 的标记:
      • 句子 1 的 Token Type ID 为 0。
      • 句子 2 的 Token Type ID 为 1。

示例:

Input IDs:        [101, 1037, 2158, 2003, 2652, 1037, 9676, 1012, 102, 3642, 2003, 5640, 2189, 1012, 102]

Attention Mask:   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Token Type IDs:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]

Step 4: 编码(Embedding Generation)

经过分词和张量化的输入会被送入 SBERT 的编码器(基于 BERT 的 Transformer 模型)。编码器对每个 Token 生成上下文相关的嵌入(转到token embedding部分)

  • 输出:
    • Token Embeddings:每个 Token 的上下文向量(通常是 768 维)。
    • Sequence Embeddings:表示整个序列的特征(如 [CLS] 的嵌入)。

Step 5: 池化(Pooling Layer)

SBERT 在 BERT 的基础上添加了一个池化层,用于将 Token 级别的嵌入转化为句子级别的嵌入。

常用的池化方法:

  1. Mean-Pooling:对所有 Token 的嵌入向量取平均值,生成句子嵌入。
  2. [CLS] Token:使用 [CLS] Token 的嵌入作为句子嵌入。
  3. Max-Pooling:对每个 Token 的每个维度取最大值。

示例:

假设输入的句子含有 5 个 Token,BERT 输出每个 Token 的嵌入为 768 维的向量:

Token Embeddings:

[

  [0.1, 0.2, 0.3, ..., 0.7],  # Token 1

  [0.2, 0.1, 0.4, ..., 0.6],  # Token 2

  [0.5, 0.3, 0.2, ..., 0.8],  # Token 3

  [0.6, 0.2, 0.1, ..., 0.5],  # Token 4

  [0.4, 0.4, 0.3, ..., 0.6],  # Token 5

]

Mean-Pooling 的结果:

less

复制代码

Sentence Embedding: [平均值(0.1, 0.2, ..., 0.4), ..., 平均值(0.7, 0.6, ..., 0.6)]

Step 6: 输出句子嵌入

经过池化后,SBERT 生成一个固定长度的向量(通常是 768 维),表示句子的全局语义嵌入。

对于句子对任务:

  • 分别计算两个句子的嵌入向量。
  • 使用余弦相似度或其他度量方法计算句子之间的相似性。

完整流程示意图

  1. 输入文本:输入单个句子或句子对。
  2. 分词:使用 BERT 分词器将文本分解为子词。
  3. 张量化:将分词结果转换为 Input IDs、Attention Mask 和 Token Type IDs。
  4. 编码:将张量输入 BERT 编码器,生成每个 Token 的嵌入。
  5. 池化:应用池化层生成固定维度的句子嵌入。
  6. 输出:返回句子嵌入或句子对的相似度。

总结

SBERT 的输入处理过程是从文本到嵌入的一整套流水线,包括:

  1. 分词(Tokenization)。
  2. 张量化(Tensorization)。
  3. 编码(Embedding Generation)。
  4. 池化(Pooling)。
  5. 输出句子嵌入。

相比于 BERT,SBERT 的优化使得句子嵌入生成更高效,尤其在语义相似度计算和检索任务中表现突出。

### 如何使用 Sentence-BERT 进行句子嵌入 Sentence-BERT (SBERT) 是一种改进的 BERT 模型,专门用于生成高质量的句子嵌入向量。这些嵌入可以用来衡量两个句子之间的语义相似度。为了更好地理解如何利用 SBERT 创建句子嵌入,下面提供了一个详细的 Python 实现指南。 #### 安装依赖库 首先需要安装 `sentence-transformers` 库,这是官方推荐的方式之一来获取并应用 SBERT 模型: ```bash pip install sentence-transformers ``` #### 加载预训练模型 接下来定义一个函数来加载预先训练好的 SBERT 模型实例。这里可以选择不同的版本,比如 `'paraphrase-MiniLM-L6-v2'` 或者其他更强大的变种。 ```python from sentence_transformers import SentenceTransformer def load_sbert_model(model_name='paraphrase-MiniLM-L6-v2'): model = SentenceTransformer(model_name) return model ``` #### 获取句子嵌入 一旦有了 SBERT 模型对象之后,就可以很方便地传入待处理的一组或多组句子列表,并获得相应的嵌入表示。这一步骤会返回形状为 `[num_sentences, embedding_dim]` 的 NumPy 数组,其中每一行对应着一条输入句子对应的固定长度特征向量。 ```python model = load_sbert_model() sentences = ["这是一个测试句子", "Another example sentence."] embeddings = model.encode(sentences) print(f"Embedding shape: {embeddings.shape}") for i, sent in enumerate(sentences): print(f"Sentence '{sent}' has the following embedding:\n{embeddings[i]}") ``` 上述代码片段展示了怎样简单快捷地得到一组中文和英文混合句子各自的 SBERT 嵌入[^1]。 #### 计算句子间相似度 除了直接取得句子嵌入外,另一个常见的应用场景就是评估不同句子间的语义距离。为此可以直接计算两者的余弦相似度得分;分值越接近 1 表明两者含义越相近。 ```python import numpy as np from scipy.spatial.distance import cosine def calculate_similarity(embedding_1, embedding_2): similarity_score = 1 - cosine(embedding_1, embedding_2) return similarity_score similarity = calculate_similarity(embeddings[0], embeddings[1]) print(f"Cosine Similarity between sentences is : {similarity:.4f}") ``` 这段脚本说明了当拥有多个句子时,可以通过比较各自 SBERT 向量之间夹角大小的方法定量描述它们彼此关系的程度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值