前言
当今的大语言模型非常智能,但是你有没有想过这些事情:
-
机器是怎么理解“国王”和“王后”之间的关系?
-
“猫”和“狗”是怎么在 AI 中“相似以及区分”的?
-
文本又是怎么变成模型能读懂的数字?
这一切,都要和一个强大的工具有关系,词嵌入:Word2Vec!
先看一张图片,如下是一个tensflow实现的word2vec的密密麻麻的词图,是不是感觉很壮观,那么AI是如何做到的呢 ?
本篇就要说下, Word2Vec是如何让 AI “读懂”文字的,先看定义,如下
定义
Word2Vec 是 Google 在 2013 年提出的一个自然语言处理模型,它能把文字转换成向量(数字),而且这些向量还包含了语义信息!
用一句话总结它的核心价值:Word2Vec 把人类理解的词变成“计算机能理解的向量”,并且保留词与词之间的关系!
怎么这么神奇,这就需要去了解下输出增强
输出增强
在word2vec出来之前,传统做法是使用「独热编码 One-Hot Encoding」来表示单词,比如:
单词 | One-hot 向量(长度为5) |
---|---|
猫 | [1, 0, 0, 0, 0] |
狗 | [0, 1, 0, 0, 0] |
老鼠 | [0, 0, 1, 0, 0] |
从表中看到,存在两个主要的问题:
-
向量非常稀疏,占用内存
-
单词之间没有任何语义关系
比如,“猫”和“狗”在独热向量中完全没有联系,而 Word2Vec 能让「相似意思」的词靠得更近!那么Word2Vec 输出的是什么样的向量?和独热向量比有啥优势?我们看下Word2Vec的输出向量
输出的向量
Word2Vec 会给每个词一个低维度的密集向量,比如:
单词 | 向量(假设为3维) |
---|---|
猫 | [0.21, 0.54, -0.31] |
狗 | [0.19, 0.50, -0.29] |
老鼠 | [-0.42, 0.18, 0.33] |
更神奇的是,它还能保留词之间的关系:具备了一种“类人思维”的意思。通过各个维度的数据相似度,来区分和相似猫狗老鼠,那么各个维度的数据又是怎么训练出来的呢?
训练方式
Word2Vec 有两种主要的训练方式:
- CBOW训练
CBOW(Continuous Bag of Words),是根据“上下文词”,预测“中心词”。
举例:
给定上下文:我 喜欢 __ 晚饭
模型要学会填空:“吃”
结构图:
上下文词 → 中间隐藏层 → 预测中心词
适合小数据集。
- Skip-Gram训练
根据“中心词”,预测“上下文词”。
举例:
中心词:“吃”,模型要学会预测“我”“喜欢”“晚饭”
结构图:
中心词 → 中间隐藏层 → 预测多个上下文词
适合大数据集。
实战示例
我们用 Gensim 来实现 一个Word2Vec的示例如下
from gensim.models import Word2Vecsentences = [["我", "喜欢", "吃", "晚饭"],["猫", "喜欢", "鱼"],["狗", "也", "喜欢", "鱼"]]model = Word2Vec(sentences, vector_size=100, window=2, min_count=1, sg=1) # sg=1表示用Skip-Gramprint(model.wv["猫"]) # 查看“猫”的词向量
print(model.wv.most_similar("猫")) # 查找最相近的词
应用场景
场景 | 示例 |
---|---|
语义相似性 | 推荐系统中:喜欢“披萨”的人可能也喜欢“汉堡” |
文本聚类 | 新闻分类、问答系统 |
情感分析 | 正负面情绪词向量聚类 |
机器翻译 | 词义对齐、多语言向量空间 |
局限性分析
虽然 Word2Vec 非常强大,但也有一些局限:
-
静态词向量:一个词在不同语境下表示一样,比如“银行”在“金融银行”和“河岸”中的意思不同,但 Word2Vec 分不清
-
对上下文敏感度弱:只靠邻近的词来训练
-
冷启动问题:对新词不友好
但好在,这些问题在后来的 BERT、ELMo 等上下文嵌入模型中得到了改善。
总结
特点 | Word2Vec |
---|---|
优点 | 简洁、高效、能捕捉词的语义关系 |
训练方式 | CBOW / Skip-Gram |
输出结果 | 低维度、密集的词向量 |
主要应用 | NLP 中的基础词嵌入层 |
局限 | 不考虑上下文、不支持多义词 |