当前位置: 首页 > news >正文

Embedding 模型详解:架构、训练与 LLM 的区别

1. 什么是 Embedding 模型?

Embedding 模型的核心使命是将离散的、高维的文本数据(例如单个词语、短语、句子、段落乃至整篇文档)转化为稠密的 (dense)、低维的 (low-dimensional)、连续的 (continuous) 向量表示。这些向量被称作“嵌入 (Embeddings)”。这里,“稠密”意味着向量中的大多数元素都是非零的,与稀疏表示(如 one-hot编码,其中大部分元素为零)形成对比;“低维”指的是嵌入向量的维度远小于原始文本空间(例如词汇表大小)的维度,从而实现信息的有效压缩;“连续”则表明这些向量存在于一个连续的向量空间中,使得细微的语义差异可以通过向量之间的微小位置差异来体现。

一个优秀的 Embedding 模型所产生的嵌入向量能够精准地捕捉文本的深层语义信息。这意味着,在由这些向量构成的多维空间中,语义上相似或相关的文本(比如,“北京的天气怎么样?”和“查询北京今日气温”)在几何位置上会彼此靠近,而语义上不相关或差异较大的文本(比如,“苹果公司股价”和“如何制作苹果派”)则会相距遥远。这种特性使得嵌入向量成为众多自然语言处理 (NLP) 下游任务的基石,例如:

  • 信息检索 (Information Retrieval): 通过比较查询语句的嵌入向量与文档库中各文档嵌入向量的相似度,快速找到最相关的文档。

  • 语义相似度计算 (Semantic Similarity): 直接计算两个文本片段嵌入向量之间的余弦相似度或欧氏距离,来量化它们的语义接近程度。

  • 文本聚类 (Text Clustering): 将相似的文本嵌入向量聚集在一起,自动发现文本数据中的主题或类别。

  • 推荐系统 (Recommendation Systems): 基于用户历史行为或偏好内容的嵌入向量,推荐语义上相关的新内容。

  • 文本分类 (Text Classification): 将文本嵌入向量作为特征输入到分类器中,判断文本所属的类别(如情感分析、主题分类)。

在众多 Embedding 模型中,BAAI (北京智源人工智能研究院) 的 bge (BAAI General Embedding) 系列模型因其出色的性能和对多种语言(尤其是中文)的良好支持,已成为当前非常流行且高效的文本嵌入解决方案之一。

2. BGE 系列模型的网络架构

BGE 系列模型,以及其他许多先进的文本嵌入模型(如 Sentence-BERT, SimCSE, E5 等),其核心架构通常借鉴并构建于 Transformer 模型的 Encoder (编码器) 部分。Transformer 架构因其强大的上下文理解能力和并行处理能力,在 NLP 领域取得了革命性的成功。

其核心组成部分详细解析如下:

  • 输入层 (Input Layer): 负责将原始文本序列转换为模型能够处理的数值表示。

    • 词嵌入 (Token Embeddings): 首先,输入的文本会被分词器 (Tokenizer) 分解成一系列的词元 (tokens)。这些词元可以是单词、子词 (subwords) 甚至字符,具体取决于分词策略(如 WordPiece, BPE)。然后,每个词元通过一个嵌入矩阵 (Embedding Matrix) 映射到一个初始的、固定维度的向量表示。这个嵌入矩阵通常是模型在训练过程中学习得到的。

    • 位置嵌入 (Positional Embeddings): Transformer 的核心机制——自注意力 (Self-Attention)——本身是置换不变的 (permutation-invariant),即它平等地看待输入序列中的所有词元,无法直接感知它们的顺序。然而,文本的意义高度依赖于词序。因此,必须引入位置嵌入来向模型提供关于词元在序列中绝对或相对位置的信息。常见的位置嵌入有学习到的绝对位置嵌入、固定的正弦/余弦位置嵌入等。

    • 段嵌入 (Segment Embeddings) / 类型嵌入 (Token Type Embeddings): 在处理需要区分不同文本片段的任务时(例如,自然语言推断任务中判断前提句和假设句之间的关系,或者问答任务中区分问题和上下文),会使用段嵌入。例如,可以将第一个句子的所有词元赋予段嵌入 A,第二个句子的所有词元赋予段嵌入 B。对于仅需嵌入单个句子的任务,所有词元可能共享同一个段嵌入,或者不使用段嵌入。

    • 这三种嵌入向量(词嵌入、位置嵌入、以及可选的段嵌入)通常会逐元素相加 (element-wise sum),形成每个词元最终的、融合了内容、位置和段落信息的输入表示,然后传递给后续的 Transformer 编码器层。

  • Transformer 编码器层 (Transformer Encoder Layers): 这是模型的核心,负责对输入表示进行深层次的上下文信息提取和语义理解。

    • 模型通常由多个(例如6层、12层甚至更多)完全相同的 Transformer 编码器层堆叠 (stack) 而成。上一层的输出作为下一层的输入。

    • 每个编码器层主要包含两个关键的子层:

      • 多头自注意力机制 (Multi-Head Self-Attention): 这是 Transformer 的精髓所在。它允许模型在计算序列中某个词元的表示时,动态地、有选择地关注输入序列中的所有其他词元(包括其自身),并根据它们与当前词元的相关性(“注意力权重”)来聚合信息。所谓“多头 (Multi-Head)”,是指将注意力计算过程并行地执行多次(例如8个或12个“头”),每个头学习关注输入序列的不同方面或不同的语义子空间。然后将这些头的输出拼接并再次进行线性变换,从而获得更丰富的表示。这使得模型能够有效地捕捉长距离依赖关系和复杂的上下文互动。

      • 前馈神经网络 (Feed-Forward Neural Network, FFN): 自注意力机制的输出会经过一个位置无关的前馈网络。这个网络通常由两个线性变换层和一个非线性激活函数(如 ReLU, GELU)组成。它对每个位置的表示进行独立的非线性转换,增加了模型的表达能力,并帮助提取更抽象的特征。

    • 在每个子层(即多头自注意力和前馈网络)的输出端,都会应用一个 残差连接 (Residual Connection),然后进行 层归一化 (Layer Normalization)

      • 残差连接: 将子层的输入直接加到其输出上。这极大地缓解了深度神经网络训练中的梯度消失/爆炸问题,使得模型可以构建得更深,更容易训练。

      • 层归一化: 对每个样本在层内所有神经元的输出进行归一化,使其具有零均值和单位方差。这有助于稳定训练动态,加速模型收敛,并减少模型对初始化参数的敏感性。

  • 输出层 (Output Layer / Pooling Layer):

    • 经过多层 Transformer 编码器的处理后,模型会为输入序列中的每一个词元都生成一个上下文感知的高维向量表示(通常是最后一层编码器的输出)。然而,对于句子嵌入或文档嵌入任务,我们通常需要一个单一的、固定维度的向量来代表整个输入文本的语义。这就需要一个池化 (Pooling) 操作来聚合这些词元级别的表示。

    • 常用的池化策略包括:

      • CLS 池化 (CLS Pooling): 在输入文本序列的开头添加一个特殊的分类词元 [CLS] (classification token)。这个 [CLS] 词元在经过所有 Transformer 编码器层后,其对应的最终隐藏状态向量被视作整个输入序列的聚合语义表示。BGE 等模型通常推荐并优化了 [CLS] 池化策略,因为 [CLS] 词元在训练过程中被设计用来学习和积累整个序列的全局信息。

      • 平均池化 (Mean Pooling): 将所有(或非填充部分的)输出词元向量在每个维度上进行平均。这是一种简单直观的方法,假设每个词元对整体语义的贡献是均等的。有时会结合注意力权重进行加权平均池化。

      • 最大池化 (Max Pooling): 在所有输出词元向量的每个维度上分别取最大值。这种方法倾向于捕捉序列中最显著的特征信号。

BGE 模型通常采用的是 Transformer 编码器结构,并通过 [CLS] 词元的输出向量(或者对所有词元输出向量进行平均池化,具体取决于模型的具体配置和推荐用法)来获得最终的句子或文本嵌入。

3. BGE 系列模型的训练过程

训练出高质量的文本嵌入模型,使其能够生成具有优良语义区分度和泛化能力的向量表示,是一个复杂的过程,通常涉及以下几个关键环节:

  • 训练目标/损失函数 (Training Objective / Loss Function): 这是指导模型学习方向的核心。

    • 对比学习 (Contrastive Learning): 这是当前训练最先进文本嵌入模型(包括 BGE)的主流且极为有效的方法。其核心思想非常直观:在学习到的向量空间中,拉近 (pull together) 语义相似的文本对(称为“正样本对”)的嵌入向量,同时推远 (push apart) 语义不相似的文本对(称为“负样本对”)的嵌入向量。

      • InfoNCE Loss (Noise Contrastive Estimation inspired loss): BGE 等模型广泛采用此类损失函数或其变体。对于一个给定的“锚点 (anchor)”文本样本,一个语义上与之匹配的“正样本 (positive)”文本,以及一系列语义上不匹配的“负样本 (negatives)”,InfoNCE 损失的目标是最大化锚点与正样本之间的相似度(通常用点积或余弦相似度衡量),同时最小化锚点与所有负样本之间的相似度。这可以被看作是一个多类别的分类问题,模型需要从包含一个正样本和多个负样本的集合中准确地识别出那个正样本。

      • 难负样本挖掘 (Hard Negative Mining): 为了让模型学习到更细致的语义差别,仅仅使用随机抽取的负样本可能效果不佳,因为它们往往与锚点样本差异过大,模型很容易区分。难负样本是指那些与锚点样本在表面上(如词汇重叠)或某些方面相似,但实际上语义不同,或者与正样本非常相似但并非真正的正样本的文本。使用这些难负样本进行训练,可以迫使模型学习更具判别力的特征。例如,对于查询“如何烤制美味的披萨”,一个简单的负样本可能是“中国的历史”,而一个难负样本可能是“如何烤制美味的饼干”或者一篇仅仅提到“披萨”但内容无关的文章。BGE 的训练过程也特别强调了有效挖掘和利用难负样本的重要性。

    • 其他可能的目标:

      • 掩码语言模型 (Masked Language Modeling - MLM): 类似于 BERT 的预训练方式,随机遮盖输入文本中的一部分词元,然后让模型预测这些被遮盖的词元。这个过程能帮助模型学习词元级别的上下文表示和语言结构,可以作为对比学习之前的一个预训练阶段,或者作为辅助任务。

      • 指令微调 (Instruction Tuning): 一些较新的 BGE 版本(例如 bge-*-instruct 系列)引入了指令微调的概念。这意味着模型在训练时会接触到带有特定任务指令的输入。例如,对于一个信息检索任务,输入可能不仅仅是查询文本,还可能带有一个前缀指令,如“为这篇文档生成用于检索的嵌入:[文档内容]”或“为这个查询生成用于检索相关段落的嵌入:[查询内容]”。这使得模型能更好地理解任务意图,并根据指令生成更具针对性的嵌入。

  • 训练数据 (Training Data): 数据的数量和质量对嵌入模型的最终性能起着决定性作用。

    • 大规模文本语料库 (Large-scale Text Corpora): 模型需要从海量的、多样化的文本数据中学习。这些数据可以来自网页、书籍、新闻、百科、代码等,覆盖广泛的主题和语言风格,从而使模型能够理解丰富的语言现象和世界知识。

    • 高质量的样本对 (High-quality Sample Pairs): 对于对比学习而言,构建高质量的正负样本对是成功的关键。样本对的质量和多样性直接影响模型学习到的语义空间的结构。

      • 正样本对: 来源可以非常多样:

        • 释义对 (Paraphrases): 语义相同但表述不同的句子对 (e.g., "What is the weather like today?" and "How's the weather today?")。

        • 问答对 (Question-Answer pairs): 问题与其对应的答案。

        • 相邻句子 (Adjacent sentences from a document): 从同一文档中抽取的上下文相关的连续句子。

        • 数据增强技术 (Data Augmentation): 如通过回译(将文本翻译到另一种语言再翻译回来)、同义词替换、句子结构变换等方法生成的与原句语义一致的新句子。

        • 查询-文档对 (Query-Relevant Document pairs): 在信息检索场景下,用户的查询和被标记为相关的文档。

        • 论文引用对 (Paper-Citation pairs): 一篇论文与其引用的论文,或引用它的论文。

      • 负样本对:

        • 批内负样本 (In-batch negatives): 在同一个训练批次 (mini-batch) 中,除了当前锚点样本的正样本之外的所有其他样本,都可以被视为负样本。这是一种简单高效的构造负样本的方式。

        • 其他策略构造的负样本: 包括从语料库中随机抽取的样本,或者通过特定策略挖掘的难负样本。关键在于负样本要确保与锚点样本语义上确实不相关或差异显著。

    • BGE 模型特别强调了使用大规模、高质量的中文、英文以及其他多种语言的语料进行多阶段预训练,并利用包含大量查询-段落对的数据集针对信息检索等特定任务进行了细致的微调。

  • 优化器和超参数 (Optimizer and Hyperparameters):

    • 常用的优化器包括 AdamW (Adam with decoupled weight decay),它在 Transformer 模型的训练中表现良好。

    • 诸如学习率 (learning rate)、批大小 (batch size)、训练轮次 (epochs)、温度系数 (temperature parameter in InfoNCE loss) 等超参数,都需要通过实验进行精心的调整和选择,以达到最佳的训练效果。

4. 与 LLM 架构的区别

尽管 Embedding 模型(尤其是基于 Transformer 编码器的模型,如 BGE)和大型语言模型 (LLM,如 GPT 系列、LLaMA 系列) 在底层技术(例如都广泛使用 Transformer 架构的组件)上存在一定的共通之处,但它们在核心目标、架构侧重、输出形式、训练范式以及典型应用场景上存在着显著且根本的区别:

特征Embedding 模型 (如 BGE)大型语言模型 (LLM, 如 GPT 系列)

主要目标

其核心目标是生成文本的稠密向量表示 (Embeddings)。这些向量旨在捕捉文本的语义信息,主要用于语义理解、相似度计算和高效检索。模型本身不直接生成可读文本。

其核心目标是生成连贯、符合上下文的自然语言文本,或者执行更广泛的自然语言理解 (NLU) 与自然语言生成 (NLG) 任务,如对话、写作、翻译等。

输出

输出是固定维度的稠密向量 (例如,BGE-base 输出 768 维向量,BGE-large 输出 1024 维向量)。这个向量是文本语义的数学表征。

输出是文本序列 (即一系列词元/token),是人类可读的自然语言。其长度通常是可变的。

核心架构

通常主要采用 Transformer Encoder (编码器) 结构。编码器擅长理解和整合输入序列的全部上下文信息,以形成对整个输入的全面表示。

主要是 Transformer Decoder (解码器) 结构 (如 GPT 系列,采用自回归方式生成文本),或 Encoder-Decoder (编码器-解码器) 结构 (如 T5, BART,常用于序列到序列的转换任务,如翻译、摘要)。解码器结构更适合于逐步生成输出序列。

最终层

通常是一个池化层 (Pooling Layer) (如 CLS 池化或平均池化),其作用是将 Transformer 编码器输出的序列化词元表示聚合成一个单一的、代表整个输入文本的向量。

通常是一个语言模型头 (Language Modeling Head),它是一个线性层加上 Softmax 函数,用于在词汇表上预测下一个最有可能出现的词元。

训练范式

侧重于对比学习 (Contrastive Learning) (如使用 InfoNCE loss),目标是学习一个能区分语义相似与否的表示空间。也可能针对特定的嵌入任务(如检索)进行有监督微调。

主要是自回归预测 (Autoregressive Prediction) / 下一个词元预测 (Next Token Prediction)。模型学习根据之前已生成的词元序列来预测下一个词元。也可能包含掩码语言模型 (MLM) 作为预训练的一部分(如 BERT 风格的 Encoder-Decoder 模型)。

典型用途

语义搜索、文本匹配、文本聚类、推荐系统中的内容相似性度量、作为下游任务的特征提取器 (feature extractor)。

文本生成(故事、诗歌、代码)、对话系统 (Chatbots)、机器翻译、文本摘要、问答系统、代码生成与解释等。

模型规模

可以设计得相对较小且计算高效,因为其主要目标是生成高质量的嵌入向量,通常不需要像 LLM 那样庞大的参数量来支持复杂的文本生成。参数量可以从几千万到几十亿。

通常参数量巨大(从数十亿到数万亿),以追求更强的语言理解、知识记忆和文本生成能力。更大的规模往往带来更好的性能("scaling laws")。

对上下文的利用

主要用于理解和编码输入文本的整体语义,将其压缩到一个固定大小的向量中。关注的是对已有信息的表征。

需要理解给定的上下文并基于此进行扩展和生成。关注的是在已有信息的基础上创造新的、连贯的信息。

总结来说,两者在 NLP 生态系统中的角色有着本质的不同:

  • Embedding 模型是“理解者”和“表征者” (Understander & Representer): 它们的核心任务是将输入文本的内在含义和语义关系有效地“压缩”并映射到一个结构化的向量空间中,生成一个高质量的语义“指纹”。这个向量本身不是为了让人类直接阅读,而是为了让计算机能够高效地进行语义比较、检索、聚类等操作。其产出质量直接影响下游任务的性能。

  • LLM 更像是“生成者”、“推理者”和“对话者” (Generator, Reasoner & Conversationalist): 它们的核心任务是基于海量的知识和学习到的语言模式,根据给定的提示 (prompt) 或上下文,生成新的、人类可读的文本,或者以自然语言的方式回答问题、执行指令、进行推理和参与对话。它们更侧重于语言的创造性和交互性。

尽管像 BGE 这样的现代 Embedding 模型也使用了 Transformer 编码器,这与 BERT 等双向语言模型的预训练架构在组件上是相似的,但它们的最终目标和针对性的微调方法是为了产出高质量的句子级或段落级的嵌入向量,专注于优化这些向量在语义检索等任务上的区分能力。这与 BERT 主要通过预测掩码词元或判断句子关系来进行预训练,并常用于分类或序列标注等任务的目标有所不同(尽管 BERT 的输出层也可以被用作嵌入,但专门为嵌入任务设计和训练的模型,如 BGE,通常在这些特定任务上表现更优)。

http://www.xdnf.cn/news/517429.html

相关文章:

  • Opik: 评估、测试和监控 LLM 应用
  • 进程相关概念总结
  • Windows系统各版本环境变量
  • # 08_Elastic Stack 从入门到实践(八)---2
  • 关于文件分片的介绍和应用
  • Linux基础第三天
  • 例举3种强制类型转换和2种隐式
  • |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面
  • 系统思考:IT企业项目困境分析
  • 基于Java+MySQL+Servlet的留言系统开发全解析
  • 电子电路:怎么理解电子在导体中的热运动?
  • C++数组详解:一维和多维数组的定义、初始化、访问与遍历
  • 算法优化——以“LCR 080. 组合”为例
  • React Native打包报错: Task :react-native-picker:verifyReleaseResources FAILE
  • IIS入门指南:原理、部署与实战
  • 电动车仪表上的数字怎么来的,想知道吗?
  • leetcode3546. 等和矩阵分割 I- medium
  • uniapp中的easycom工作机制
  • Flask快速入门和问答项目源码
  • ​在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件​
  • 【Bluedroid】蓝牙HID DEVICE 报告发送与电源管理源码解析
  • Python 中 if 和 else 基础知识的详解和使用
  • 中级统计师-统计学基础知识-第四章 假设检验
  • 【老马】离线版金融敏感信息加解密组件开源项目 encryption-local
  • python打卡day29
  • spark数据处理练习题详解【下】
  • 【simulink】IEEE33节点系统潮流分析模型
  • 2025年全国青少年信息素养大赛C++小学全年级初赛试题
  • MyBatis框架(入门)
  • 【java多线程】线程间通信-利用wait和notify轮流按序打印奇数和偶数