Embedding 层——从 ID 到向量的第一步
第四篇Embedding 层——从 ID 到向量的第一步系列文章第一篇预训练模型——站在巨人的肩膀上第二篇分词——文字如何变成数字第三篇向量与矩阵——理解一切的基石 本文目录开篇ID 的问题数字的大小没有意义查表操作Embedding 的本质代码验证在 PyTorch 中看到 Embedding这些向量是怎么来的一个关键限制此时向量还是孤立的Embedding 层的物理意义与参数量解决孤立信息的两种机制一个小实验动手查看 Embedding 输出参考资源本篇小结开篇经过分词我们得到了一串数字 ID[101, 2769, 4263, 1962, ...]。但这些 ID 本身毫无意义——“2769这个数字比2768大并不代表任何语义上的更多或更强”。模型需要把这些孤立的 ID 变成富含语义的向量。这一步就是Embedding嵌入层。一句话总结Embedding 层就是一个巨大的查找表把每个离散的 token ID 映射成一个连续的、稠密的语义向量。这是 NLP 模型将符号转化为数值的第一步。ID 的问题数字的大小没有意义想象我们给三个词编号苹果 → ID1 香蕉 → ID2 汽车 → ID50在计算机看来“香蕉”2比苹果1大但比汽车50小。这种大小关系毫无语义意义——香蕉不是苹果的两倍汽车也不是香蕉的 25 倍。如果直接把 ID 作为输入模型学到的是数字大小而不是语义关系。这就是One-hot 编码——每个词用一个很长的向量表示向量的维度等于词表大小只有对应 ID 的那个位置是 1其余全是 0词表有 4 个词 的 → ID0 → One-hot: [1, 0, 0, 0] 我 → ID1 → One-hot: [0, 1, 0, 0] 喜欢 → ID2 → One-hot: [0, 0, 1, 0] 你 → ID3 → One-hot: [0, 0, 0, 1]向量的1永远只有一个而且位置固定所以叫 One-hot独热编码。它解决了 ID 大小没有意义的问题所有 One-hot 向量两两正交相似度都是 0但代价是向量极度稀疏——如果词表有 21,128 个词每个向量就有 21,128 维里面只有 1 个 1其余 21,127 个全是 0非常浪费。方案维度优点缺点One-hot 编码vocab_size21,128简单、无偏稀疏、维度灾难Embeddinghidden_size768稠密、可学习、含语义需要训练得到Embedding 层不仅把维度从 21,128 压缩到了 76827 倍压缩更重要的是它还通过学习让语义相似的词在向量空间中距离更近。这就是所谓的分布式表示Distributed Representation[1]——语义被分布到多个维度中共同编码。为什么 One-hot 不可行假设词表有 21,128 个词One-hot 向量的维度就是 21,128。每个向量只有一个位置是 1其余全是 0。这不仅浪费存储空间更致命的是任何两个不同的 One-hot 向量都是正交的意味着模型无法从 One-hot 编码中学到任何词与词之间的相似性。苹果和香蕉的相似度与苹果和汽车的相似度完全一样——都是 0。Embedding 用 768 维稠密向量从根本上解决了这一问题。查表操作Embedding 的本质Embedding 层本质上是一个巨大的查找表词表vocab.txt就像一个超厚的词典 ID 0: [0.001, -0.002, 0.001, ...] (共768个数) ID 1: [0.005, 0.001, -0.003, ...] ... ID 101: [0.012, -0.008, 0.015, ...] ← [CLS] ID 102: [0.003, 0.007, -0.011, ...] ← [SEP] ... ID 2769: [0.021, -0.015, 0.033, ...] ← 我 ID 4263: [0.113, 0.072, -0.224, ...] ← 喜 ...说白了就是一个二维数组形状是[21128, 768]——21128 行每行 768 个浮点数。每一行就是一个词的向量。所谓的Embedding 层没有任何魔法就是这么一张表。所谓查表就是根据 ID 去表里取对应的那一行。查表的数学本质简单说Embedding 就是一个二维数组查表就是按下标取行。Embedding 矩阵 W4行 x 3列 dim0 dim1 dim2 ID 0: [ 0.1, 0.2, -0.1 ] ← 的 ID 1: [ 0.5, 0.3, 0.2 ] ← 我 ID 2: [-0.2, 0.7, 0.4 ] ← 喜欢 ID 3: [ 0.3, -0.1, 0.8 ] ← 你 输入 ID1 → W[1] → [0.5, 0.3, 0.2] ✅没有任何魔法和你写arr[1]取数组第 1 个元素完全一样只不过这里取的是一整行一个 768 维的向量。实际 PyTorch 代码embeddingnn.Embedding(num_embeddings4,embedding_dim3)input_idstorch.tensor([1])# 要查 ID1resultembedding(input_ids)# 内部就是 embedding.weight[1]# 输出: [[0.5, 0.3, 0.2]]补充从数学角度看这个操作等价于 One-hot 向量乘以矩阵One-hot 里只有一个 1乘法结果刚好等于那一行。但实际实现不会真的去做乘法因为 One-hot 太长了21128 维全是 0直接用索引取行快得多。查表过程可视化 输入IDs: 101 2769 4263 1962 ... 102 ↓ ↓ ↓ ↓ ↓ 查词表 → 拿到对应的 768 维向量 ↓ ↓ ↓ ↓ ↓ [0.012] [0.021] [0.113] [-0.040] ... [0.003] [-0.008] [-0.015] [0.072] [0.018] ... [0.007] [0.015] [0.033] [-0.224][0.092] ... [-0.011] ... ... ... ... ... ... (768行) (768行) (768行) (768行) (768行) 结果是一个矩阵形状 [9, 768] 9 序列长度token个数 768 每个向量的维度对比查表 vs 矩阵乘法从数学上看Embedding 等价于一个nn.Linear(21128, 768)层对 One-hot 向量做矩阵乘法——但没人真这么做因为 One-hot 太长太稀疏直接查表快得多。代码验证在 PyTorch 中看到 Embeddingimporttorchimporttorch.nnasnn# 模拟一个迷你 Embedding 层词表100向量维度768embedding_layernn.Embedding(num_embeddings100,embedding_dim768)# 输入3个token IDinput_idstorch.tensor([[1,5,23]])# shape: [1, 3]# 查表outputembedding_layer(input_ids)print(output.shape)# torch.Size([1, 3, 768])# 查看第1个token的向量print(output[0,0,:5])# 前5个维度# tensor([-0.0231, 0.0158, -0.0412, 0.0325, -0.0107], grad_fnSliceBackward0)在真实 BERT 模型中# 在模型内部这一行代码完成了查表embedding_outputmodel.bert.embeddings.word_embeddings(input_ids)print(embedding_output.shape)# torch.Size([1, 9, 768])加上 batch 维度后数据的实际形状是[1, 9, 768]——前面的 1 是 batch_size一次输入一个句子。这些向量是怎么来的这是初学者最常问的问题这些向量里的数字是谁定的答案是训练出来的。初始化训练前都是随机数一开始训练前词表里所有向量都是随机数ID 2769 (我): [0.023, -0.015, 0.041, -0.032, ...] ← 随机 ID 4263 (喜): [-0.031, 0.018, -0.052, 0.045, ...] ← 随机MLM 训练完形填空驱动学习在预训练过程中模型通过完形填空Masked Language Model, MLM任务不断调整这些数字训练目标预测 [MASK] 喜欢人工智能 中 [MASK] 位置是 我 每步训练循环 ① 随机 mask 掉句子中的 15% 的 token ② 前向传播 → 模型预测被 mask 掉的词 ③ 算交叉熵损失预测越错损失越大 ④ 反向传播 → 计算 Embedding 层每个维度的梯度 ⑤ 梯度下降 → 微调向量数值 ⑥ 重复数百万步...训练后的语义空间MLM 任务最早由 BERT 论文 [2] 提出是预训练的核心机制。模型通过数亿次这样的完形填空练习学会了把语义相似的字映射到向量空间中相近的位置。训练结束后我和我们的向量会很接近语义相似“我和苹果的向量会相距较远。语义相似度被编码在了向量的几何距离中。这个性质被称为语义空间的线性结构”——经典的例子是v(king) - v(man) v(woman) ≈ v(queen)[1]。一个关键限制此时向量还是孤立的在 Embedding 之后每个字的向量是独立的行银行的向量 [0.012, -0.008, 0.015, ...] 行行走的向量 [0.012, -0.008, 0.015, ...] ↑ 完全一样同一个字在不同语境下含义不同但 Embedding 层的输出是一样的。模型此时还不知道上下文——它只看到了孤立的字没有看到字与字之间的关系。Embedding 层的定位它解决的是符号 → 数值的映射问题不是语境理解问题。后者将由后续的 Transformer 层自注意力机制来解决。Embedding 层的物理意义与参数量参数数值说明词表大小21,128覆盖几乎所有常用汉字 特殊标记向量维度768每个字的语义编码长度参数量21,128 × 768 16,226,304约 1623 万参数占模型总量约15%BERT base 共 1.1 亿参数Embedding 层是 BERT 中除了 FFN 之外参数量最大的单层。它的 1623 万参数通过预训练学来了每个汉字的基础语义表示——但这只是基础真正的理解发生在后续的 12 层 Transformer 中。解决孤立信息的两种机制后续的 Transformer 层提供了两种机制来解决孤立问题机制解决的问题方法对应文章位置编码字在句子中的顺序Token向量 位置向量下一篇自注意力字与字之间的语义关系QKV 交互 加权融合第 6-8 篇类比Embedding 就像给了每个演员一张角色照——但这张照片是定妆照和你演对手戏的演员是谁、剧情发展到第几幕都没有关系。真正的表演上下文理解要从注意力机制开始。一个小实验动手查看 Embedding 输出fromtransformersimportAutoModel,AutoTokenizerimporttorch tokenizerAutoTokenizer.from_pretrained(bert-base-chinese)modelAutoModel.from_pretrained(bert-base-chinese)text我喜欢人工智能inputstokenizer(text,return_tensorspt)# 手动获取 Embedding 层的输出withtorch.no_grad():embedding_outputmodel.bert.embeddings.word_embeddings(inputs[input_ids])print(embedding_output.shape)# torch.Size([1, 9, 768])# 查看不同字的向量是否不同print([CLS] 前3维:,embedding_output[0,0,:3])print( 我 前3维:,embedding_output[0,1,:3])print( 喜 前3维:,embedding_output[0,2,:3])# 计算我和喜的余弦相似度costorch.nn.CosineSimilarity(dim0)simcos(embedding_output[0,1],embedding_output[0,2])print(f我和喜的余弦相似度:{sim:.4f})# 此时它们还没有上下文信息——但即使这样预训练已经让# 常一起出现的字向量更接近了。注意Embedding 层的输出只是原始原料。真正的语义理解在后面的 Transformer Block 中完成。参考资源[1] Mikolov et al., “Efficient Estimation of Word Representations in Vector Space”, 2013. arXiv:1301.3781[2] Devlin et al., “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”, 2019. NAACL 2019[3] PyTorch Embedding 官方文档. nn.Embedding[4] Hugging Face Transformers 文档. BERT 模型本篇小结Embedding 层是一个查找表将每个 token ID 映射为 768 维向量这些向量是通过预训练MLM 任务学出来的不是人为设计语义相似的词在向量空间中距离更近此时每个字的向量还是孤立的——不知道上下文Embedding 层的参数量约 1623 万占 BERT 总参数的 15%Embedding 解决了符号 → 数值问题语境理解交给后续注意力机制下一篇Embedding 后每个字有了自己的向量但模型还不知道这些字在句子中的先后顺序。“我爱你和你爱我用的字完全一样顺序不同含义截然相反。下一篇我们将看到位置编码如何给模型注入顺序感”。

相关新闻

GPT-5.6 编程能力硬核评测:五个真实项目(附代码与对比维度)的工程实操

GPT-5.6 编程能力硬核评测:五个真实项目(附代码与对比维度)的工程实操

跑分不等于实战。GPT-5.6在基准测试上的分数很好看,但放到真实项目里表现怎么样?我拿了五个不同类型的项目做了系统测试,从代码生成到Bug修复到重构,同时跟Claude 4.8、Gemini 3.5、Grok 4.3横向对比。每个项目都跑了实际代码&…

2026/7/31 2:20:18阅读更多 →
如何快速设置Playnite:跨平台游戏库的终极管理指南

如何快速设置Playnite:跨平台游戏库的终极管理指南

如何快速设置Playnite:跨平台游戏库的终极管理指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: https:…

2026/7/31 2:20:18阅读更多 →
微信小程序云开发实战:博物馆导览系统完整开发指南

微信小程序云开发实战:博物馆导览系统完整开发指南

最近在准备毕业设计,很多同学选择了小程序开发方向,特别是博物馆导览类小程序。这类项目既能展示技术能力,又有实际应用价值。本文将完整演示一个博物馆小程序的开发流程,从环境搭建到功能实现,适合有一定前端基础但缺…

2026/7/31 2:18:17阅读更多 →
2026年显示器推荐 IPS OLED TN三种面板 覆盖全品类定位全解析

2026年显示器推荐 IPS OLED TN三种面板 覆盖全品类定位全解析

一、开篇概述电竞显示器场景细分愈发精细,不同面板材质、刷新率规格对应的使用体验与适配人群差异明显,多数用户易因参数同质化选错机型,造成性能浪费。针对大众综合电竞、专业色彩创作、硬核FPS竞技三大核心需求,HKC推出KG273QS、…

2026/7/31 11:03:48阅读更多 →
养老机构服务管理混乱?北京华恒智信管理案例

养老机构服务管理混乱?北京华恒智信管理案例

【客户行业】养老行业【问题类型】人才管理【客户背景】某养老机构成立于2010年,坐落于宁静优美的郊区,占地面积5000平方米,配备各类养老服务设施,为老年人提供全方位、高品质的养老服务。自成立以来,机构始终秉持&quo…

2026/7/31 11:03:48阅读更多 →
如何用轻量级工具解放你的华硕笔记本性能控制

如何用轻量级工具解放你的华硕笔记本性能控制

如何用轻量级工具解放你的华硕笔记本性能控制 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, ROG Ally,…

2026/7/31 11:03:48阅读更多 →
3分钟掌握EhTagTranslator:让e绅士标签中文化变得简单高效

3分钟掌握EhTagTranslator:让e绅士标签中文化变得简单高效

3分钟掌握EhTagTranslator:让e绅士标签中文化变得简单高效 【免费下载链接】EhTagTranslator 将e绅士页面TAG换成中文,最全数据库。 项目地址: https://gitcode.com/gh_mirrors/eh/EhTagTranslator 你是否曾在浏览e绅士网站时,面对密密…

2026/7/31 11:03:47阅读更多 →
AI Agent智能体开发全流程与核心技术解析

AI Agent智能体开发全流程与核心技术解析

1. AI Agent(智能体)产业链全景解析AI Agent(智能体)正在成为继大模型之后的下一个技术爆发点。作为一个完整的产业链,它包含了从底层基础设施到上层应用的全套技术栈。与传统的AI应用开发不同,AI Agent更强…

2026/7/31 11:03:47阅读更多 →
CPU集成HDMI/DP控制器测试全解析

CPU集成HDMI/DP控制器测试全解析

1. 项目概述在当今的计算机系统中,CPU集成的HDMI和DP控制器已成为视频输出的核心组件。作为一名长期从事显示接口测试的工程师,我经常需要对这些控制器进行全面的协议诊断分析和性能测试。这不仅关系到显示质量,更直接影响用户体验和系统稳定…

2026/7/31 11:01:46阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →