嵌入层是一个将高维、稀疏的离散数据(如文字、ID),映射为低维、稠密、连续的向量表示的可学习层。

下面我们从几个关键角度来分解理解:
为什么需要嵌入层?(动机)
想象一下我们要用神经网络处理文本:
-
原始问题:单词“cat”和“dog”对计算机来说,只是两个独立的符号“0001”和“1000”,它们之间没有关联,如果我们用独热编码,一个10万词的词典,每个词就是一个10万维的向量,其中只有一位是1,其余全是0,这会导致:
- 维度灾难:向量维度极高,计算效率极低。
- 数据稀疏:几乎全是0,有效信息很少。
- 语义鸿沟:无法表达“猫”和“狗”都是动物,比“苹果”更相近的关系。
-
嵌入层的解决方案:嵌入层学会为每个离散符号(如单词)分配一个固定长度的稠密向量(例如128维),这个向量不再是0/1,而是包含小数点的实数。
- 降维:从数万维降到数百维。
- 稠密:向量中每个位置都有有意义的数值。
- 蕴含语义:通过训练,语义相似的词(如“猫”和“狗”)其向量在空间中的距离会很接近。
嵌入层是如何工作的?(原理)
你可以将嵌入层理解为一个可查询的查找表或参数矩阵。
- 构建矩阵:假设我们的词汇表有1万个词,我们想得到每个词的256维向量,嵌入层内部就是一个形状为
[10000, 256]的矩阵。 - 输入索引:输入神经网络的是词的索引(整数)。“cat”对应索引5,“dog”对应索引8。
- 查表映射:当输入索引
5时,嵌入层就返回这个矩阵的第5行(一个256维的向量),这个过程就叫 “嵌入查找”。 - 可学习性:这个
[10000, 256]的矩阵,其数值一开始是随机初始化的,在模型训练(如文本分类、翻译)的过程中,通过反向传播和梯度下降,这个矩阵的值会不断被更新优化,最终使得学到的向量能很好地服务于下游任务,并捕捉到语义信息。
类比:
- 字典:词汇表就像一本字典(索引 -> 单词)。
- 词向量手册:嵌入矩阵就像一本《词向量详解手册》(索引 -> 一组描述该词特性的数字)。
- 查找:给定一个词,先查字典找到页码(索引),再翻到《词向量手册》的对应页码,得到它的向量描述。
嵌入向量的关键属性
- 语义相似性:语义或用法相近的词,其向量在向量空间中的距离(如余弦相似度)较近。
vec(“国王”) - vec(“男人”) + vec(“女人”) ≈ vec(“女王”)vec(“巴黎”) - vec(“法国”) + vec(“德国”) ≈ vec(“柏林”)
- 可学习性:向量不是预先固定死的(尽管可以用预训练好的如Word2Vec初始化),而是会随着主任务(如情感分析、机器翻译)一起被微调,以更好地适应特定任务。
- 低维稠密性:相比于独热编码,它是一个信息高度浓缩的表示。
一个简单的例子
假设我们有一个微型词汇表和2维嵌入(仅为演示,实际维度更高):
- 词汇表:
{“猫”: 0, “狗”: 1, “苹果”: 2} - 嵌入矩阵(2维),初始随机:
[[0.2, 0.6], # 索引0 -> “猫”的向量 [0.3, 0.5], # 索引1 -> “狗”的向量 [0.9, 0.1]] # 索引2 -> “苹果”的向量
输入句子 [“猫”, “狗”] 对应的索引是 [0, 1]。
通过嵌入层后,我们就得到了:
“猫” -> [0.2, 0.6]“狗” -> [0.3, 0.5]
可以看到,“猫”和“狗”的向量在数值上很接近,而“苹果”的向量则相差较远。
不只是文本:嵌入层的广泛应用
嵌入层的本质是处理离散分类数据,因此其应用远超文本:
- 推荐系统:为用户ID、商品ID、电影ID学习嵌入向量,相似的用户/商品会有相近的向量。
- 关系图:为图中的每个节点(用户、论文、蛋白质)学习嵌入向量。
- 类别特征:在表格数据中,对“城市”、“职业”、“品牌”等类别特征进行嵌入,比独热编码更有效。
- 语音、视频:对音素、图像块等离散单元进行嵌入。
嵌入层的超参数:维度选择
嵌入维度的选择是一个重要的超参数:
- 维度太低:可能无法充分捕捉信息的多样性,导致“挤压”太厉害,表达能力不足。
- 维度太高:容易导致过拟合,增加计算负担,并且对于小数据集可能学不好。
- 经验法则:维度通常是词汇表大小的 4次方根 左右,常见范围在50维到1024维之间,词汇表1万,维度可取
10000^(0.25) ≈ 10,但实际中通常使用128、256、512等。
| 特性 | 嵌入层前 | 嵌入层后 |
|---|---|---|
| 形式 | 离散符号/ID | 连续向量 |
| 维度 | 高维(词汇表大小) | 低维(如256) |
| 密度 | 稀疏(独热编码) | 稠密(每个位置有意义) |
| 关系 | 符号间无显式关系 | 蕴含语义/关联关系 |
嵌入层是连接“离散符号世界”与“连续向量世界”的桥梁,是让神经网络能够“理解”符号化数据的关键组件。 它通过将符号映射为可计算的数学对象,为深度学习处理语言、推荐、图结构等复杂任务奠定了基础。