嵌入(Embedding)学习总结
一、核心定义
嵌入(Embedding) 是一种把"词"转成"向量"的 NLP 技术,让模型能通过向量之间的距离判断词与词的语义相似度。
文本嵌入 = 文本向量化,两者是同一回事。
二、为什么需要嵌入?
分词器只能把文本变成词元 ID(一堆冰冷的编号),ID 本身没有任何语义。
| 词语 | 词元 ID |
|---|---|
| 我 | 1001 |
| 喜欢 | 1002 |
| 小猫 | 2001 |
| 小狗 | 2002 |
要让模型"理解"词义,就需要给每个词元再附加一组多维向量——这就是嵌入要做的事。
三、嵌入矩阵长什么样
每一维代表一个隐含的语义方向(实际有几百到几千维,下面用 4 维举例):
| 维度 | 隐含语义 | "小猫"取值 |
|---|---|---|
| 第 1 维 | 是否动物 | 0.72 |
| 第 2 维 | 可爱度 | 0.35 |
| 第 3 维 | 体型 | 0.11 |
| 第 4 维 | 家养 vs 野外 | 0.80 |
嵌入后:
| 词语 | 嵌入向量 |
|---|---|
| 小猫 | [0.72, 0.35, 0.11, 0.80] |
| 小狗 | [0.70, 0.38, 0.14, 0.78] |
| 喜欢 | [0.10, 0.93, 0.21, 0.11] |
→ "小猫"和"小狗"的向量非常接近,模型自然就把它们当作相似概念。
四、嵌入带来的 4 个好处
- 语义相似性:相似词向量在空间中靠近
- 上下文学习:嵌入可在训练中更新
- 数学可运算:支持加减(如
国王 - 男 + 女 ≈ 王后) - 可微分:能输入神经网络参与梯度计算
五、Word2Vec
2013 年由 Google 的 Tomas Mikolov 团队提出,把词转成固定长度向量,让大规模训练成为可能。
它有两种训练方式,互为反向:
| 比较项 | CBOW | Skip-Gram |
|---|---|---|
| 训练目标 | 用上下文预测中心词 | 用中心词预测上下文 |
| 输入 | 多个上下文词 | 一个中心词 |
| 输出 | 一个中心词 | 多个上下文词 |
| 训练速度 | 快 | 慢 |
| 稀有词表现 | 一般 | 更好 |
| 语义表达能力 | 较弱 | 更强 |
| 适合场景 | 高频词、短窗口、追求效率 | 稀有词、多义词、大语料 |
举例句子:我 喜欢 吃 苹果
- CBOW:输入「我、吃」 → 预测「喜欢」
- Skip-Gram:输入「喜欢」 → 预测「我、吃」
代码中通过参数切换:
sg=0→ CBOWsg=1→ Skip-Gram
六、代码实践
训练:train_word2vec.py
from gensim.models import Word2Vec
sentences = [
["i", "love", "deep", "learning"],
["i", "love", "nlp"],
["deep", "learning", "is", "fun"],
["nlp", "is", "a", "part", "of", "ai"],
["word2vec", "is", "a", "powerful", "embedding"]
]
model = Word2Vec(
sentences,
vector_size=100, # 向量维度
window=2, # 上下文窗口大小
min_count=1, # 词频阈值
sg=1 # 1 = Skip-Gram,0 = CBOW
)
model.save("word2vec.model")
print("模型训练完成并已保存。")测试:test_word2vec.py
from gensim.models import Word2Vec
model = Word2Vec.load("word2vec.model")
print("词向量(nlp):")
print(model.wv["nlp"])
print("\n与 'nlp' 最相似的词:")
print(model.wv.most_similar("nlp", topn=3))
print("\n'deep' 和 'learning' 的相似度:")
print(model.wv.similarity("deep", "learning"))七、一句话总结
词元(Token)让模型能"读"文字,嵌入(Embedding)让模型能"懂"文字。 Word2Vec 是嵌入技术的开山之作,CBOW 和 Skip-Gram 是它的两种训练方向。
-EOF-