词向量--Embedding

词向量--Embedding

一、为什么还需要 Embedding

在学习了 One-Hot、Word2Vec 和 FastText 之后,会产生一个自然的疑问:

既然已经有训练好的词向量,为什么在深度学习模型中还要使用 Embedding?

在实际 NLP 任务中,词向量并不是独立存在的模块,而是需要与具体任务和模型一起训练
Embedding 正是为了解决这一问题而出现的。


二、Embedding 的本质是什么

Embedding 并不是一种新的词向量算法,而是一种在神经网络中使用词向量的方式

可以从两个角度来理解 Embedding:

  1. 从功能上看

    Embedding 的作用是:把离散的词索引映射为连续的向量表示

  2. 从实现上看

    Embedding 本质上是一个可训练的查表矩阵

假设词表大小为 V,词向量维度为 D
那么 Embedding 层内部维护的是一个大小为 V × D 的矩阵。


三、Embedding 与 Word2Vec / FastText 的关系

在学习过程中,我逐渐理清了它们之间的关系:

  • Word2Vec / FastText
    • 训练词向量的方法
    • 通常是独立于具体任务进行训练
  • Embedding
    • 模型中的一层
    • 词向量作为参数,随任务训练不断更新

两者并不冲突,反而经常结合使用:

  • Embedding 可以随机初始化
  • 也可以加载 Word2Vec / FastText 的预训练向量作为初始值

四、为什么 Embedding 更适合实际任务

在真实 NLP 任务中,同一个词在不同上下文下可能具有不同含义。
静态词向量(如 Word2Vec)无法区分这种差异。

Embedding 的优势在于:

  • 向量是为具体任务服务的
  • 可以通过反向传播不断调整
  • 能够逐步贴合任务需求

因此,Embedding 是深度学习 NLP 模型中不可或缺的组成部分。


五、使用 PyTorch 实现 Embedding

在实践中,我使用 PyTorch 的 nn.Embedding 来理解 Embedding 的具体行为。

1. 定义 Embedding 层

import torch
import torch.nn as nn

# 假设词表大小为 10,词向量维度为 5
embedding = nn.Embedding(num_embeddings=10, embedding_dim=5)

此时,Embedding 内部已经初始化了一个 10 × 5 的可训练矩阵。


2. 使用词索引获取向量

# 构造一个词索引张量
word_indices = torch.tensor([1, 3, 5])

# 获取对应的词向量
vectors = embedding(word_indices)

print("向量形状:", vectors.shape)
print(vectors)

输出结果说明:

  • 输入是词索引
  • 输出是对应的词向量
  • 每个索引都会映射到一个低维稠密向量

3. Embedding 是如何被训练的

Embedding 层的参数并不是固定的,而是通过任务损失函数反向传播更新。

# 简单示例:计算一个假的损失并反向传播
loss = vectors.sum()
loss.backward()

# 查看梯度
print(embedding.weight.grad)

可以看到,Embedding 中的参数已经参与到了梯度计算中。


六、加载预训练词向量到 Embedding(理解层面)

在更复杂的任务中,常见做法是:

  • 使用 Word2Vec / FastText 训练词向量
  • 将其作为 Embedding 层的初始权重
  • 在下游任务中继续微调

这种方式可以:

  • 加快模型收敛
  • 提升小数据集上的效果
  • 融合通用语义与任务特性

七、Embedding 的局限性

虽然 Embedding 在深度学习中非常重要,但它本身仍然存在局限:

  • 每个词仍然只有一个向量
  • 无法区分不同上下文下的多义性
  • 表达能力受限于模型结构

这些问题,最终推动了上下文相关词向量和预训练语言模型的发展。


八、小结

Embedding 并不是新的词向量算法,而是词向量在神经网络中的工程化落地形式

posted @ 2025-11-11 15:03  元始天尊123  阅读(7)  评论(0)    收藏  举报