WordEmbedding 查看词向量的相似性
1 课程概览
本课延续上一课内容,通过 TensorBoard 可视化词向量,查看每个单词的词向量表示,并通过近邻点分析词与词之间的相似性。使用 PCA 主成分分析将高维词向量降维展示,便于直观理解词向量空间。
2 核心概念与定义
- 词向量相似性(Word Vector Similarity):通过计算词向量之间的距离或余弦相似度,衡量词与词之间的语义关联。
- 近邻点(Nearest Points):在词向量空间中距离目标词最近的词,表示语义最相似。
- PCA(主成分分析):降维方法,将高维词向量投影到 2D/3D 空间进行可视化。
3 模型与算法详解
词向量可视化流程
- 创建 TensorBoard 写入器:
SummaryWriter(log_dir="./runs") - 添加词向量:
add_embedding(embedding_matrix, metadata=word_list) - 关闭写入器:
my_summary.close() - 启动 TensorBoard:
tensorboard --logdir=./runs - 查看可视化:浏览器访问
http://localhost:6006
查看每个单词的词向量
- 遍历词汇表:
for index in range(len(my_token_list)) - 获取词向量:
embed(torch.tensor(index)) - 获取对应单词:
my_token_list[index] - 打印结果:显示每个词的词向量
TensorBoard 可视化功能
| 功能 | 说明 |
|---|---|
| PCA 图 | 主成分分析降维展示 |
| 近邻点 | 点击某词显示最近的词 |
| 距离显示 | 显示近邻点与目标词的距离 |
| 词列表 | 右侧显示所有词 |
词向量属性
- 类型:torch.Tensor
- 形状:(8,)(每个词 8 个数字)
- 数量:20 个词
4 数学原理与推导
词向量距离计算
欧氏距离:
$$d(w_1, w_2) = \sqrt{\sum_{i=1}^{d} (v_i(w_1) - v_i(w_2))^2}$$
余弦相似度:
$$\text{sim}(w_1, w_2) = \cos(\theta) = \frac{\vec{v}(w_1) \cdot \vec{v}(w_2)}{|\vec{v}(w_1)| \cdot |\vec{v}(w_2)|}$$
PCA 降维
将 8 维词向量降维到 2D:
$$\text{PCA}: \mathbb{R}^{8} \rightarrow \mathbb{R}^{2}$$
保留最大方差的两个主成分。
5 代码示例
import torch
import torch.nn as nn
from torch.utils.tensorboard import SummaryWriter
# 假设已构建 embed 和 my_token_list(见上一课)
# 6. 词向量可视化
# 6.1 创建 TensorBoard 写入器
my_summary = SummaryWriter(log_dir="./runs")
# 6.2 添加词向量到 TensorBoard
my_summary.add_embedding(
embed.weight.data, # 词向量矩阵(形状:20×8)
metadata=my_token_list # 词列表(用于标注每个点)
)
# 6.3 关闭写入器
my_summary.close()
# 7. 查看每个单词的词向量
print("---------- 分隔线 ----------")
for index in range(len(my_token_list)):
# 7.1 获取当前单词的词向量
word_vector = embed(torch.tensor(index))
print(f"词向量: {word_vector}")
print(f"类型: {type(word_vector)}")
# 7.2 获取当前索引对应的单词
word = my_token_list[index]
print(f"单词: {word}")
print("-" * 30)
启动 TensorBoard
# 在命令行运行
tensorboard --logdir=./runs
# 浏览器访问
# http://localhost:6006
输出示例
---------- 分隔线 ----------
词向量: tensor([...], grad_fn=<EmbeddingBackward>)
类型: <class 'torch.Tensor'>
单词: 传智教育
------------------------------
词向量: tensor([...], grad_fn=<EmbeddingBackward>)
类型: <class 'class 'torch.Tensor'>
单词: 是
------------------------------
...
6 重难点与易错提醒
- ❗重点:词向量可视化部分为了解内容,但获取词向量的代码需掌握。
- ⚠️易错:
SummaryWriter的log_dir目录不存在时会自动创建。 - ⚠️易错:
add_embedding的第一个参数是词向量矩阵,第二个参数是词列表(metadata)。 - 💡深入理解:TensorBoard 使用 PCA 降维展示高维词向量。
- 💡深入理解:每个词向量是 8 维(本例),共 20 个词。
7 课堂问答精选
Q1:如何在 TensorBoard 中可视化词向量?
A:①创建 SummaryWriter(log_dir="./runs");②调用 add_embedding(embedding_matrix, metadata=word_list);③关闭写入器;④运行 tensorboard --logdir=./runs;⑤浏览器访问 http://localhost:6006。
Q2:如何查看每个单词的词向量?
A:遍历词汇表,使用 embed(torch.tensor(index)) 获取每个词的词向量,使用 my_token_list[index] 获取对应单词。
Q3:TensorBoard 可视化有什么功能?
A:①PCA 主成分分析降维展示;②点击某词显示近邻点;③显示近邻点与目标词的距离;④右侧显示所有词列表。
8 本课小结
- TensorBoard 可视化:
SummaryWriter+add_embedding+close。 - 查看词向量:遍历词汇表,
embed(torch.tensor(index))获取。 - PCA 降维:将 8 维词向量投影到 2D 展示。
- 近邻点:点击某词显示最近的词及距离。
- 词向量可视化为了解内容,获取词向量代码需掌握。
9 延伸思考
- 如何通过词向量相似性分析词与词的语义关系?
- PCA 降维会丢失多少信息?如何评估?