从零构建大语言模型词嵌入 — 为什么深度学习需要把文字变成数字(三)

1. 理解词嵌入(Understanding Word Embeddings)

为什么需要嵌入?------一个具体的例子

包括 LLM 在内的深度神经网络模型无法直接处理原始文本 。由于文本是类别型数据(categorical) ,它与用于实现和训练神经网络的数学运算不兼容。因此,我们需要一种方法来将词表示为连续值向量

让我们用一个具体的例子看看问题所在。假设我们有三个词:catdogcar。一个朴素的想法是给每个词分配一个整数:

复制代码
cat → 1
dog → 2
car → 3

问题立刻出现:神经网络的运算会把这些数字当作数值来处理。

举例说明:假设神经网络的某一层需要计算"dog 和 cat 的平均":

dog+cat2=2+12=1.5 \frac{\text{dog} + \text{cat}}{2} = \frac{2 + 1}{2} = 1.5 2dog+cat=22+1=1.5

但 1.5 代表什么呢?半个 cat 加半个 dog?这毫无意义。

更糟的是,这种表示暗示了错误的关系

∣cat−dog∣=∣1−2∣=1∣dog−car∣=∣2−3∣=1 |\text{cat} - \text{dog}| = |1 - 2| = 1 \\ |\text{dog} - \text{car}| = |2 - 3| = 1 ∣cat−dog∣=∣1−2∣=1∣dog−car∣=∣2−3∣=1

数学上看,cat 到 dog 的"距离"等于 dog 到 car 的"距离"。但语义上,cat 和 dog 都是动物,应该更接近;car 是汽车,应该离得更远。朴素的数字编码丢失了语义关系

嵌入正是为了解决这个问题:把每个词映射到多维空间中的一个点,让语义关系通过向量之间的几何关系来表达。

图1:同样是三个词,朴素整数编码让距离失去语义;向量嵌入则让语义关系通过几何距离自然表达。

嵌入(Embedding)是什么?

将数据转换为向量格式的概念通常被称为嵌入。使用特定的神经网络层或另一个预训练的神经网络模型,我们可以嵌入不同的数据类型,例如视频、音频和文本。

深度学习模型无法以原始形式处理视频、音频和文本等数据格式。因此,我们使用嵌入模型将这些原始数据转换为密集向量表示,使深度学习架构能够轻松理解和处理。具体来说,图中展示了将原始数据转换为三维数值向量的过程。

需要注意的是:不同的数据格式需要不同的嵌入模型。为文本设计的嵌入模型不适合用于嵌入音频或视频数据。

从核心来说,嵌入是一种从离散对象 (词、图像,甚至整个文档)到连续向量空间中的点 的映射。嵌入的主要目的是将非数值数据转换为神经网络可以处理的格式

不同粒度的文本嵌入

虽然词嵌入是最常见的文本嵌入形式,但也存在面向句子、段落或整个文档的嵌入。句子或段落嵌入是**检索增强生成(Retrieval-Augmented Generation, RAG)**的流行选择。RAG 将生成与检索(如搜索外部知识库)相结合,在生成文本时拉取相关信息------这一技术超出了本书的范围。

由于我们的目标是训练类 GPT 的 LLM(它们学习逐词生成文本),因此本章专注于词嵌入

2. 向量空间如何表达语义:具体数值推演

这部分原书并未展开,但为了真正理解嵌入的威力,我们用一个具体例子把它推导一遍。

示例:用三维向量表达四个词

假设我们有四个词:king(国王)、queen(王后)、man(男人)、woman(女人)。我们给每个词分配一个三维向量(维度的含义假设为:[皇室程度, 男性程度, 年龄程度]):

复制代码
king   = [0.9, 0.9, 0.5]
queen  = [0.9, 0.1, 0.5]
man    = [0.1, 0.9, 0.5]
woman  = [0.1, 0.1, 0.5]

推演 1:计算两个词的"相似度"

使用欧氏距离(向量间的直线距离):

d(A,B)=∑i=1n(Ai−Bi)2 d(A, B) = \sqrt{\sum_{i=1}^{n}(A_i - B_i)^2} d(A,B)=i=1∑n(Ai−Bi)2

计算 kingqueen 的距离:

d(king,queen)=(0.9−0.9)2+(0.9−0.1)2+(0.5−0.5)2=0+0.64+0=0.8 d(\text{king}, \text{queen}) = \sqrt{(0.9-0.9)^2 + (0.9-0.1)^2 + (0.5-0.5)^2} = \sqrt{0 + 0.64 + 0} = 0.8 d(king,queen)=(0.9−0.9)2+(0.9−0.1)2+(0.5−0.5)2 =0+0.64+0 =0.8

计算 kingman 的距离:

d(king,man)=(0.9−0.1)2+(0.9−0.9)2+(0.5−0.5)2=0.64+0+0=0.8 d(\text{king}, \text{man}) = \sqrt{(0.9-0.1)^2 + (0.9-0.9)^2 + (0.5-0.5)^2} = \sqrt{0.64 + 0 + 0} = 0.8 d(king,man)=(0.9−0.1)2+(0.9−0.9)2+(0.5−0.5)2 =0.64+0+0 =0.8

计算 kingwoman 的距离:

d(king,woman)=(0.9−0.1)2+(0.9−0.1)2+(0.5−0.5)2=0.64+0.64+0≈1.13 d(\text{king}, \text{woman}) = \sqrt{(0.9-0.1)^2 + (0.9-0.1)^2 + (0.5-0.5)^2} = \sqrt{0.64 + 0.64 + 0} \approx 1.13 d(king,woman)=(0.9−0.1)2+(0.9−0.1)2+(0.5−0.5)2 =0.64+0.64+0 ≈1.13

结论kingqueenman 都很近(都是 0.8),但离 woman 较远(1.13)------这符合语义直觉。

推演 2:著名的"国王 - 男人 + 女人 ≈ 王后"

这是 Word2Vec 最著名的发现之一:词嵌入可以做向量算术

king−man+woman=? \text{king} - \text{man} + \text{woman} = ? king−man+woman=?

逐分量计算:

0.9,0.9,0.5\]−\[0.1,0.9,0.5\]+\[0.1,0.1,0.5\]=\[0.9−0.1+0.1, 0.9−0.9+0.1, 0.5−0.5+0.5\]=\[0.9,0.1,0.5\] \\begin{aligned} \&\[0.9, 0.9, 0.5\] - \[0.1, 0.9, 0.5\] + \[0.1, 0.1, 0.5\] \\\\ \&= \[0.9-0.1+0.1,\\ 0.9-0.9+0.1,\\ 0.5-0.5+0.5\] \\\\ \&= \[0.9, 0.1, 0.5\] \\end{aligned} \[0.9,0.9,0.5\]−\[0.1,0.9,0.5\]+\[0.1,0.1,0.5\]=\[0.9−0.1+0.1, 0.9−0.9+0.1, 0.5−0.5+0.5\]=\[0.9,0.1,0.5

结果正好等于 queen 的向量

图2:king − man + woman 的逐步推演过程。每一步都是简单的逐分量加减,最终结果恰好等于 queen 的向量。

这说明:嵌入空间中"性别"这个概念可以被表示为一个方向向量man - womanking - queen)。减去"男性方向"再加上"女性方向",就能从 king 移动到 queen

这就是向量空间的威力------几何关系自动编码了语义关系

注意:这里的数值是人为构造的,真实的 Word2Vec 向量在高维空间中学到这种关系,不会这么整齐,但核心思想完全一致。

3.Word2Vec:早期的词嵌入方法

有多种算法和框架被开发来生成词嵌入。其中一个最早且最流行的例子是 Word2Vec 。Word2Vec 训练了一种神经网络架构,通过预测给定目标词的上下文(或反过来)来生成词嵌入。

Word2Vec 背后的核心思想是:出现在相似上下文中的词往往具有相似的含义。因此,当投影到二维词嵌入进行可视化时,可以看到相似的词项会聚集在一起。

Figure 2.3 说明 :如果词嵌入是二维的,我们可以将它们绘制在二维散点图中进行可视化。当使用像 Word2Vec 这样的词嵌入技术时,对应于相似概念的词在嵌入空间中往往彼此靠近。例如,不同类型的鸟在嵌入空间中彼此更接近,而与国家和城市相比距离更远。

嵌入维度:性能与效率的权衡

词嵌入的维度可以从 1 到数千不等。我们可以选择二维词嵌入以便于可视化。更高的维度可能捕获更细微的关系,但代价是计算效率降低

这是一个典型的权衡:

  • 维度太低 → 无法捕获足够的语义信息
  • 维度太高 → 计算和内存成本过高
  • 需要找到一个适合任务的平衡点

4.LLM 中的嵌入:为什么不用预训练的 Word2Vec?

虽然我们可以使用像 Word2Vec 这样的预训练模型来为机器学习模型生成嵌入,但 LLM 通常产生自己的嵌入------这些嵌入是输入层的一部分,并在训练过程中被更新。

将嵌入优化作为 LLM 训练的一部分而不是使用 Word2Vec 的优势 在于:嵌入被优化为适合手头的特定任务和数据 。我们将在本章后面实现这样的嵌入层。此外,LLM 还可以创建上下文化的输出嵌入,这将在第3章中讨论。

静态嵌入 vs 上下文化嵌入

这是理解 LLM 的一个重要概念:

静态嵌入(如 Word2Vec):每个词有一个固定的向量,无论上下文如何。

复制代码
"I went to the bank to deposit money"  ← "bank" 对应向量 v
"I sat on the river bank"              ← "bank" 对应同一个向量 v  ❌

两个句子中 bank 的含义完全不同(银行 vs 河岸),但 Word2Vec 给出相同的向量。

上下文化嵌入(LLM 产生的):同一个词在不同上下文中产生不同的向量。

复制代码
"I went to the bank to deposit money"  ← "bank" 对应向量 v₁(偏向"银行"语义)
"I sat on the river bank"              ← "bank" 对应向量 v₂(偏向"河岸"语义)  ✅

这种能力是通过注意力机制 实现的(第3章详述)。本章我们先实现静态的输入嵌入层(即查找表),上下文化的部分由后续的 Transformer 层在运行时动态生成。

5. 实际 LLM 中的嵌入维度

遗憾的是,高维嵌入给可视化带来了挑战,因为我们的感知和常见的图形表示天然受限于三维或更少的维度 。然而,在使用 LLM 时,我们通常使用高得多的维度

对于 GPT-2 和 GPT-3,嵌入大小(通常称为模型隐藏状态的维度)因特定的模型变体和大小而异:

模型 参数量 嵌入维度
GPT-2(最小版本) 117M / 125M 768
GPT-3(最大版本) 175B 12,288

推演:嵌入层的参数量有多大?

嵌入层本质上是一个查找表 ------一个形状为 [词汇表大小, 嵌入维度] 的矩阵。让我们具体算一下 GPT-3 的嵌入层有多大:

  • 词汇表大小:50,257(GPT-2/3 的 BPE 词汇表大小)
  • 嵌入维度:12,288

嵌入层参数量:

50,257×12,288=617,557,056≈6.18 亿 50{,}257 \times 12{,}288 = 617{,}557{,}056 \approx 6.18 \text{ 亿} 50,257×12,288=617,557,056≈6.18 亿

对比一下:GPT-3 总共 1750 亿参数,嵌入层就占了大约 6.18 亿------仅仅是一个查找表,就有 6 亿参数。这也解释了为什么高维嵌入那么"昂贵"。

如果换成 GPT-2(嵌入维度 768):

50,257×768=38,597,376≈3,860 万 50{,}257 \times 768 = 38{,}597{,}376 \approx 3{,}860 \text{ 万} 50,257×768=38,597,376≈3,860 万

相差 16 倍。

图3:GPT-2 和 GPT-3 嵌入层参数量对比。虽然嵌入层只是一个查找表,但随着维度从 768 扩大到 12,288,参数量也从 3,860 万跃升到 6.18 亿。

本章后续步骤预告

本章接下来的各节将逐步讲解为 LLM 准备嵌入所需的步骤:

  1. 将文本拆分为词(分词 --- 2.2 节)
  2. 将词转换为 Token ID(2.3 节)
  3. 添加特殊 Token(2.4 节)
  4. BPE 字节对编码(2.5 节)
  5. 滑动窗口数据采样(2.6 节)
  6. Token 嵌入层(2.7 节)
  7. 位置编码(2.8 节)

6. 本篇小结

概念 要点
为什么需要嵌入 神经网络无法直接处理类别型文本,朴素的整数编码会引入错误的语义关系
嵌入的本质 离散对象 → 连续向量空间中的点
向量空间的威力 语义关系可以通过几何关系表达(距离、方向)
Word2Vec 早期词嵌入方法,"相似上下文中的词有相似含义"
向量算术 king - man + woman ≈ queen
静态 vs 上下文化嵌入 Word2Vec 给固定向量;LLM 根据上下文动态调整
GPT-2 嵌入维度 768 维,约 3,860 万参数
GPT-3 嵌入维度 12,288 维,约 6.18 亿参数

7. 预习思考

  1. 如果把 catdogcar 放到二维嵌入空间中,你会如何摆放它们的坐标才能合理反映语义关系?
  2. 为什么 GPT-3 要把嵌入维度提到 12,288 这么高?维度再高会发生什么?
  3. 静态嵌入无法区分多义词的不同含义。你能想到一种简单的"打补丁"方法吗?(提示:位置信息)
相关推荐
henrylin99992 小时前
Hermes Agent 06. 技能、记忆与上下文文件
人工智能·python·机器学习·hermes·hermesagent
Dfreedom.2 小时前
PyTorch 与 scikit-learn 全景对比分析
人工智能·pytorch·深度学习·机器学习·scikit-learn
ok_hahaha2 小时前
AI从头开始-黑马LongChain-RAG开发1
人工智能
kishu_iOS&AI2 小时前
机器学习 —— 逻辑回归(浅析与实例)
人工智能·机器学习·逻辑回归
小坏讲微服务2 小时前
Claude Code 终极实战指南:从终端 Agent 到 AI+Java 开发
java·开发语言·人工智能
guslegend2 小时前
第9节:FAISS,HNSW还是BM25?如何选择最适合业务的向量检索引擎?如何选择最适合业务的向量检索引擎
人工智能·大模型·faiss·rag
时序之心2 小时前
做不规则多变量时序预测,试试ReIMTS递归多尺度框架,我实验涨点明显!
人工智能·深度学习·机器学习·时间序列
无忧智库2 小时前
新型智慧城市场景化解决方案:构建“善政、惠民、兴业”的城市智能体(PPT)
人工智能·智慧城市
很小心的小新2 小时前
大模型应用开发笔记
人工智能·笔记·langchain·大模型