词嵌入与位置编码
问题:神经网络无法直接处理文字
计算机只能处理数字。文字必须先转化为数字,再转化为向量。
---
第一步:分词(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 序列 → 输出浮点数矩阵
语义信息编码在向量里:
---
第三步:位置编码(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
在该示例配置下约减少40M参数;效果应由具体实验判断。
---
相关页面
来源
本轮核查来源与限制(2026-09-17)
只修本轮明确列出的陈述,不将旧页整篇升级为已验证。themis_only为本地保存和禁止外发的兼容标记,不代表本地模型推理。