词嵌入与位置编码

问题:神经网络无法直接处理文字

计算机只能处理数字。文字必须先转化为数字,再转化为向量。

---

第一步:分词(Tokenization)

将文本切分为 Token(子词单元),每个 Token 对应一个整数 ID。


# 示例(GPT-2 的 BPE 分词)
"合同违约" → [id_1, id_2, ...]  # 示意,非实际分词结果

# 英文也须由实际分词器确定:
"contract" → [id_a, ...]  # 示意,非实际分词结果

Token数量依文本和分词器确定,不能固定换算为汉字数或统一断定成本差异。

---

第二步:词嵌入(Token Embedding)

每个 Token ID 映射到一个高维向量(下例配置为768维)。


self.wte = nn.Embedding(vocab_size, n_embd)
# vocab_size = 50,304 个词
# n_embd = 768 维向量

# 查找过程:
tok_emb = self.wte(idx)  # idx 是 Token ID 序列 → 输出浮点数矩阵

语义信息编码在向量里:

  • 相似含义的词,向量方向相近
  • 经典例子:`king - man + woman ≈ queen`
  • ---

    第三步:位置编码(Positional Encoding)

    Transformer 本身没有顺序感(注意力可以任意关注任意位置)。位置编码告诉模型"你是第几个词"。

    
    self.wpe = nn.Embedding(block_size, n_embd)
    # block_size = 1024(最大序列长度)
    
    # 使用方式:
    pos = torch.arange(0, t, dtype=torch.long, device=device)
    pos_emb = self.wpe(pos)   # 每个位置对应一个向量
    

    nanoGPT 使用可学习的位置编码;原始 Transformer 论文比较可学习与正弦位置编码时结果接近,不能据此断言一种总是更好。

    ---

    融合:加法合并

    
    x = self.drop(tok_emb + pos_emb)
    # 形状:(Batch, SequenceLength, 768)
    

    词的语义 + 位置信息 → 综合表示,进入 Transformer 处理。

    ---

    直觉类比

    > 想象一本法律词典(词嵌入)+ 页码(位置编码)。

    >

    > 词典告诉你"违约"是什么意思,页码告诉你这个词出现在合同的第几条。

    > 两者相加,模型才能理解"第三条的违约条款"。

    ---

    权重共享的巧妙之处

    
    # nanoGPT 将输入嵌入和输出投影层共用同一个矩阵
    self.lm_head.weight = self.transformer.wte.weight
    
  • 输入:Token ID → 向量(嵌入矩阵作为查找表)
  • 输出:向量 → 词表未归一化分数(同一矩阵的转置用于投影);再经softmax得到概率
  • 在该示例配置下约减少40M参数;效果应由具体实验判断。

    ---

    相关页面

  • 01-概念/Transformer架构 — 完整架构
  • 01-概念/注意力机制 — 如何处理嵌入向量
  • 01-概念/推理与采样策略 — 输出阶段
  • 来源

  • [nanoGPT model.py](https://github.com/karpathy/nanoGPT/blob/master/model.py)
  • 本轮核查来源与限制(2026-09-17)

  • https://raw.githubusercontent.com/karpathy/nanoGPT/master/model.py
  • https://arxiv.org/html/1706.03762v7
  • 只修本轮明确列出的陈述,不将旧页整篇升级为已验证。themis_only为本地保存和禁止外发的兼容标记,不代表本地模型推理。