# 3.2 词嵌入：从离散符号到连续向量

Transformer 处理的是连续的数值向量，而自然语言是由离散的符号（字、词、子词）组成的。词嵌入（Word Embedding）是连接这两个世界的桥梁。

## 3.2.1 为什么需要词嵌入

计算机原生处理的是数字，而非符号。将词转化为数字最简单的方式是**独热编码**（One-Hot Encoding）：为词汇表中的每个词分配一个唯一的索引，用一个在该索引位置为 1、其余位置为 0 的向量表示。

独热编码有两个致命缺陷：

**维度灾难**：向量维度等于词汇表大小（通常数万到数十万），绝大部分是零，计算效率极低。

**语义缺失**：所有词两两正交，“猫”和“狗”的距离与“猫”和“飞机”的距离完全相同。独热编码不包含任何语义信息。

词嵌入的核心思想是：**将每个词映射为一个低维、稠密的实数向量，使得语义相近的词在向量空间中距离也相近。** 例如，“国王”和“女王”的嵌入向量应该比“国王”和“苹果”更接近。

## 3.2.2 词嵌入的思想溯源

“用向量表示词义”的思想并非 Transformer 的发明，它有深厚的历史渊源。

2013 年，Mikolov 提出的 **Word2Vec** 首次大规模验证了词嵌入的威力。它通过预测上下文（Skip-gram）或由上下文预测中心词（CBOW）的方式，在大规模语料上学习词向量。Word2Vec 揭示了词向量空间中令人惊叹的线性关系——例如 $$\vec{\text{king}} - \vec{\text{man}} + \vec{\text{woman}} \approx \vec{\text{queen}}$$。

随后，**GloVe**（2014 年）通过全局词共现矩阵的分解学习词向量，**FastText**（2016 年）则将子词信息引入词嵌入，使其能够处理未登录词。

Transformer 中的词嵌入与这些早期方法有一个关键区别：**早期词嵌入是静态的**——一个词无论出现在什么上下文中，其向量始终相同（“bank”在“河岸”和“银行”的语境下有相同的向量）。而 Transformer 的嵌入层只是**初始表示**，经过多层注意力和前馈网络后，每个词的表示会根据上下文动态调整，这就是所谓的**上下文化嵌入**（Contextualized Embedding）。

## 3.2.3 嵌入层的工作机制

如 [3.1 节](/llm_internals/di-yi-bu-fen-ji-chu-pian/03_components/3.1_tokenization.md) 所述，分词器将文本转化为离散的词元索引构成的序列。在 Transformer 中，嵌入层的任务正是接收这些索引序列并转化为连续向量。嵌入层本质上是一个**查找表**（Lookup Table）。假设词汇表大小为 $$V$$，嵌入维度为 $$d\_{\text{model}}$$，则嵌入矩阵 $$E \in \mathbb{R}^{V \times d\_{\text{model}}}$$ 包含了每个词的嵌入向量。

给定词的索引 $$i$$，嵌入操作就是取出矩阵的第 $$i$$ 行：$$\text{embed}(i) = E\[i, :]$$。这在数学上等价于用独热向量左乘嵌入矩阵，但实现上直接索引更高效。

下图展示了嵌入层的查找过程——每个词元索引直接对应嵌入矩阵中的一行向量：

```mermaid
flowchart LR
    subgraph input["词元索引"]
        T0["'我' → 42"]
        T1["'爱' → 187"]
        T2["'你' → 56"]
    end

    subgraph matrix["嵌入矩阵 E (V × d_model)"]
        R0["第 42 行: [0.12, -0.34, ...]"]
        R1["第 187 行: [0.56, 0.78, ...]"]
        R2["第 56 行: [-0.23, 0.91, ...]"]
    end

    subgraph output["嵌入向量"]
        V0["[0.12, -0.34, ...]"]
        V1["[0.56, 0.78, ...]"]
        V2["[-0.23, 0.91, ...]"]
    end

    T0 --> R0 --> V0
    T1 --> R1 --> V1
    T2 --> R2 --> V2
```

图 3-2：嵌入层通过查找表将词元索引映射为稠密向量

嵌入矩阵是**可学习的参数**——在训练过程中，反向传播会调整每个词的嵌入向量，使其在上下文中更准确地表达该词的含义。

## 3.2.4 嵌入维度的选择

嵌入维度 $$d\_{\text{model}}$$ 是模型的核心超参数，直接影响模型的表达能力和计算成本：

| 模型               | $$d\_{\text{model}}$$ | 参数量   |
| ---------------- | --------------------- | ----- |
| Transformer base | 512                   | 65M   |
| BERT-base        | 768                   | 110M  |
| GPT-2 small      | 768                   | 117M  |
| GPT-2 XL         | 1600                  | 1542M |
| Llama 2 7B       | 4096                  | 7B    |
| Llama 2 70B      | 8192                  | 70B   |

嵌入维度的选择体现了**信息容量与计算效率的平衡**：更高的维度意味着每个词元可以编码更丰富的语义信息，但注意力和前馈网络的计算量会随 $$d\_{\text{model}}$$ 的增大而快速增长。经验上，$$d\_{\text{model}}$$ 通常随模型总参数量的增大而增大，因为更大的模型需要更丰富的初始表示来充分利用其容量。

## 3.2.5 嵌入的缩放

Transformer 原始论文中有一个容易被忽略的细节：**嵌入向量会乘以** $$\sqrt{d\_{\text{model}}}$$。

$$\text{ScaledEmbed}(x) = E\[x] \times \sqrt{d\_{\text{model}}}$$

为什么？嵌入矩阵通常用均值为 0、方差较小的值初始化，导致嵌入向量的范数（模长）较小。而后续要加上的位置编码使用正弦/余弦函数，值域在 $$\[-1, 1]$$。如果嵌入值太小，位置编码就会“淹没”词汇的语义信息。

乘以 $$\sqrt{d\_{\text{model}}}$$ 将嵌入向量的尺度放大，使其与位置编码在数量级上匹配，确保两者对最终表示的贡献大致相当。这是一个看似微小但对训练稳定性有重要影响的设计细节。

需要注意的是，这种显式缩放的必要性在实践中因模型而异。原始 Transformer 采用了嵌入缩放；后来的 GPT、Llama 等解码器模型会结合 RoPE、初始化、归一化和实现细节重新处理尺度问题，不应默认都保留同一个 $$\sqrt{d\_{\text{model}}}$$ 乘法。关键点是确保嵌入向量、位置机制和后续残差流处在合适的数量级上，具体方法因架构而异。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/llm_internals/di-yi-bu-fen-ji-chu-pian/03_components/3.2_embedding.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
