核心问题:神经网络只能处理数字,但人类语言是文字。
如下,怎么把"我"、"喜欢"、"深度"、"学习"变成向量?
人类: "我喜欢深度学习"
↓ ???
计算机: [?, ?, ?, ?, ?, ?]
# 表示方法的演进
# 1️⃣ 最早期:One-Hot 编码(独热编码)
方法:每个词用一个超长向量表示,只有一个位置是 1,其他都是 0。
词典:["我", "喜欢", "讨厌", "深度", "学习", "电影", ...] 假设共 10000 词
"我" → [1, 0, 0, 0, 0, 0, ..., 0] (第 1 位是 1)
"喜欢" → [0, 1, 0, 0, 0, 0, ..., 0] (第 2 位是 1)
"讨厌" → [0, 0, 1, 0, 0, 0, ..., 0] (第 3 位是 1)
"学习" → [0, 0, 0, 0, 1, 0, ..., 0] (第 5 位是 1)
优点
缺点
简单直观
维度灾难:词典 10 万词 = 10 万维向量
容易实现
语义鸿沟:任意两个词向量正交(内积=0)
无法表示相似性:"喜欢"和"讨厌"距离一样远(如下例)
向量空间示意(One-Hot):
"喜欢" ● 所有词都在坐标轴上
│ 彼此距离相等
│
●──────┼──────● "讨厌"
"me" │ "学习"
│
●
"电影"
问题:无法表达"喜欢"和"爱"更接近 ❌
# 2️⃣ 突破:分布式表示(Distributed Representation)⭐
核心思想(Hinton, 1986):用低维稠密向量表示单词,语义相似的词向量也相似。
词典:10000 词 → 向量维度:300
"我" → [0.25, -0.31, 0.67, ..., 0.12] (300 维稠密向量)
"喜欢" → [0.82, -0.45, 0.33, ..., 0.56]
"爱" → [0.79, -0.42, 0.35, ..., 0.54] ← 和"喜欢"很接近!
"讨厌" → [-0.75, 0.51, -0.28, ..., -0.61] ← 和"喜欢"距离远
"学习" → [0.45, -0.12, 0.78, ..., 0.33]
向量空间示意(分布式表示):
"爱" ●
╱
╱ ← 语义相近,向量距离近 ✅
╱
"喜欢" ●───────● "热爱"
╲
╲
╲
● "讨厌" ← 语义相反,距离远
"学习" ● ● "电影" ← 无关词,距离中等
为什么叫"分布式"?
- One-Hot:信息集中在一个位置(向量中只有 1 个 1,其余都是 0)
- 分布式:信息分布在整个向量的所有维度
# 向量相似度
可以用两个词向量之间的 内积 或 余弦相似度 来表示向量之间的相关性

- 把所有词向量组成的大矩阵称为
嵌入矩阵:每一列都是一个词向量。 - 这个矩阵可以通过
word2vec等方式训练获得

- 词向量的维度很高,所以它所在空间的维度也很高,这个空间叫做
潜空间。对于高维潜空间,可以通过降维投影等操作直观感受,参考: https://projector.tensorflow.org/ 。
# 学习词向量的经典方式
# 1️⃣ Word2Vec(2013)⭐ 最经典
- 提出者:Google 的 Tomas Mikolov
- 核心思想:一个词的语义由它周围的词决定,文本中离得越近的词语相似度越高(分布假说)
- 两种训练方式:
模型
输入
输出
比喻
Skip-Gram 跳元模型(常用)
中心词
上下文词
"给定这个词,预测周围"
CBOW 连续词袋
上下文词
中心词
"猜中间是什么词"
CBOW: ["我", "深度", "学习"] → "喜欢"
(上下文) (中心词)
Skip-Gram: "喜欢" → ["我", "深度", "学习"]
(中心词) (上下文)
Word2Vec 的架构:
输入层 隐藏层 输出层
(词索引) (词向量) (概率分布)
● ● ● ● ● ●
│ │ │ │ │ │
│ │ │ │ │ │
输入词索引 → 查找向量表 → Softmax → 预测词
(one-hot) (V×N 矩阵) (V 维)
V = 词典大小 (如 10000)
N = 向量维度 (如 300)
💡 关键:训练完成后,隐藏层的权重矩阵就是
词向量表!
# 2️⃣ GloVe(2014)
- 提出者:Stanford 的 Jeffrey Pennington
- 核心思想:基于全局词共现统计,而不是局部窗口。
500 GloVe目标:让上面共现矩阵(co-occurence matrix)向量内积 ≈ log(共现次数)
# 3️⃣ FastText(2016)
- 提出者:Facebook AI
- 核心思想:考虑词内部的字符 n-gram。
优点
缺点
能处理未登录词(OOV)
向量维度更大
适合形态丰富的语言(如德语、俄语)
计算稍慢
中文效果提升有限
# 静态 vs 动态词向量
# 1️⃣ 静态词向量(2013-2017)
方法
特点
Word2Vec
一个词只有一个向量
GloVe
不管上下文
FastText
考虑子词,但仍静态
"苹果"在以下句子中意思不同,但向量相同 ❌
- "我吃了一个苹果" → 水果
- "我买了苹果股票" → 公司
- "苹果发布了新手机" → 公司
Word2Vec: "苹果" → [0.5, -0.3, 0.8, ...] (固定不变)
# 2️⃣ 动态词向量(2018-至今)主流⭐
方法
特点
ELMo (2018)
用双向 LSTM,上下文相关
BERT (2018)
用 Transformer,上下文相关 ⭐
GPT 系列
自回归,上下文相关
BERT:
"我吃了一个苹果" → "苹果" → [0.6, -0.2, 0.9, ...] (水果义)
"我买了苹果股票" → "苹果" → [0.8, -0.5, 0.4, ...] (公司义)
同一个词,不同上下文,向量不同 ✅