核心问题:神经网络只能处理数字,但人类语言是文字
如下,怎么把"我"、"喜欢"、"深度"、"学习"变成向量?

人类: "我喜欢深度学习"
↓ ???
计算机: [?, ?, ?, ?, ?, ?]


# 表示方法的演进

# 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

考虑子词,但仍静态

"苹果"在以下句子中意思不同,但向量相同 ❌

  1. "我吃了一个苹果" → 水果
  2. "我买了苹果股票" → 公司
  3. "苹果发布了新手机" → 公司

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, ...] (公司义)

同一个词,不同上下文,向量不同 ✅