
大模型中的 Embedding词嵌入到底是什么如果说 Transformer 是大模型的大脑那么 Embedding 就是大模型的“词典”。所有文本进入模型的第一步我爱机器学习 │ ▼ Tokenizer │ ▼ [123, 456, 789] │ ▼ Embedding │ ▼ [768维向量] [768维向量] [768维向量]Transformer 根本不认识文字。它只认识数字。Embedding 的作用就是把离散的 Token ID 转换成连续的向量Vector。一、为什么需要 Embedding先想一个问题Tokenizer 输出的是什么cat→1234dog→5678模型看到的是1234 5678但这里有个巨大问题1234 和 5678只是编号。就像张三 → 员工001 李四 → 员工002不能因为002 001就说明李四比张三厉害。Token ID 没有任何语义。所以需要转换成cat → 向量 dog → 向量例如cat ↓ [0.3, 1.2, -0.7, ...]这样模型才能进行数学运算。二、从 One-Hot 到 Dense Embedding 的演进这是 NLP 历史上的一次重大进步。第一代One-Hot假设词表[cat,dog,apple,car]共有V 4那么cat ↓ [1,0,0,0] dog ↓ [0,1,0,0]问题1太稀疏如果词表V 100000那么cat [0,0,0,0,0,0,1,0,0,...]99999 个 0。浪费内存。问题2没有语义cat [1,0,0,0] dog [0,1,0,0]距离√2而cat car距离也是√2模型认为cat ≈ dog ≈ car完全不合理。三、Dense Embedding 的出现2003 年 Bengio 在《A Neural Probabilistic Language Model》中首次系统使用了神经网络词向量思想随后 Word2Vec 将其发扬光大。(Reddit)思想不要用 100000 维 One-Hot 改成300维连续向量例如cat ↓ [0.21, 1.34, -0.53, ... ]此时cat dog可能变成cat [0.2,1.3,-0.5] dog [0.3,1.1,-0.4]距离很近。而car [-2.5,0.8,4.1]距离很远。于是语义相似 ↓ 向量接近这就是 Embedding 的核心思想。Word2Vec 通过上下文预测学习出这种语义空间使得相似上下文中的词拥有相近向量。(en.wikipedia.org)四、Embedding 本质是什么很多人学到这里会觉得很神秘。实际上本质就是一个矩阵假设词表大小 V 50000 隐藏维度 d 768那么Embedding shape[50000,768]即768列 ┌─────────────────┐ │ token0 │ │ token1 │ │ token2 │ │ ... │ │ token49999 │ └─────────────────┘每一行一个 Token 的向量五、nn.Embedding 的本质很多人以为nn.Embedding很复杂。其实源码逻辑约等于weight[token_id]例如embedding.weight.shape[50000,768]输入ids[100,200,300]输出embedding.weight[100]embedding.weight[200]embedding.weight[300]拼起来[3,768]本质查表仅此而已。六、为什么 Embedding 比 One-Hot 高效One-Hot50000维Embedding768维压缩比例50000 ───── 768 ≈ 65倍同时还保留语义信息。因此One-Hot ↓ Dense Embedding成为 NLP 的标准方案。(pmc.ncbi.nlm.nih.gov)七、d_model 768 到底是什么意思例如 BERT Based_model 768意思是每个 Token 用768个数字表示即token ↓[768维向量]Transformer 整个网络都围绕这个维度运行Embedding │ ▼ [B,L,768] Attention │ ▼ [B,L,768] FFN │ ▼ [B,L,768]768 维可以理解为768个特征槽位例如仅示意维度17 → 动物属性 维度32 → 国家属性 维度105 → 动词属性真实模型中的维度不会这么明确而是分布式表示。八、Embedding 参数量怎么算公式Params V × d m o d e l \text{Params} V \times d_{model}ParamsV×dmodel例如词表 V 50000 d_model 768则50000 × 768 38 , 400 , 000 50000 \times 768 38,400,00050000×76838,400,000即3840万参数如果 FP163840万 × 2字节 ≈ 76.8MB可以发现Embedding层 其实非常占参数九、什么是 Weight Tying权重共享这是很多人第一次看 GPT 代码时最困惑的地方。输入时Token ID │ ▼ Embedding │ ▼ 768维向量使用矩阵E ∈ R V × d E \in R^{V\times d}E∈RV×d输出时Transformer 最终得到hidden state [B,L,768]需要预测下一个 Token于是768 ↓ 50000即l o g i t s h W T logits hW^TlogitshWT其中W ∈ R V × d W \in R^{V\times d}W∈RV×d发现了吗形状完全一样Embedding [V,d] Output Layer [V,d]于是 Press Wolf2016提出直接共用同一个矩阵即W E W EWE这样可以减少参数量并提升语言模型效果。(Hugging Face)十、Weight Tying 为什么有效原来Input Embedding 50000×768 Output Projection 50000×768参数7680万共享后只保留一个矩阵参数3840万直接减半。另外输入和输出本质上都在描述Token 的语义空间共享后语义更一致。(Hugging Face)十一、Word2Vec 和 Transformer Embedding 的区别很多初学者容易混淆。Word2Vec训练目标根据上下文预测单词或者根据单词预测上下文CBOW / Skip-Gram(en.wikipedia.org)得到一个静态向量例如bank 永远同一个向量TransformerEmbedding 初始也是一个静态向量例如bank先查表得到e_bank随后经过Layer1 Attention Layer2 Attention ... LayerN Attention不断更新。最终bank(金融)和bank(河岸)会变成不同向量。即Word2Vec静态Embeddingbank 固定向量Transformer上下文Embeddingbank(金融) ≠ bank(河岸)这是 Transformer 最大的进步之一。(quantml.org)一张图看懂 Embedding一句话总结Embedding 本质上就是一个大小为[词表大小 × 隐藏维度]的可训练查找表。Word2Vec 让 NLP 从 One-Hot 进入 Dense Vector 时代而 Transformer 则在此基础上通过 Attention 将静态词向量进一步演化为上下文相关的动态语义表示。(en.wikipedia.org)