扩展 - 掩码张量的可视化
1 课程概览
本课实现掩码张量的可视化。用 matplotlib 绘制热力图,黄色表示被遮盖(看不见),紫色表示不遮盖(可见)。纵向选当前位置,横向看能看哪些位置。生成第 1 个词时什么都看不见,越往后生成前面看到的词越多。将 size 从 5 改为 20 可以让图更细致。
2 核心概念与定义
- 掩码张量:用于遮盖未来词的张量。
- 黄色:被遮盖(看不见)。
- 紫色:不遮盖(可见)。
- 纵向:当前位置(竖着选当前位置)。
- 横向:能看哪些位置(横着看能看哪些位置)。
- plt.imshow:绘制热力图。
3 模型与算法详解
可视化原理
纵向选当前位置,横向看能看哪些位置。
- 纵向(竖着):当前位置(第几个词)
- 横向(横着):能看哪些位置
颜色含义
| 颜色 | 含义 |
|---|---|
| 黄色 | 被遮盖(看不见) |
| 紫色 | 不遮盖(可见) |
生成过程
生成第 1 个词:[1, 1, 1, 1, 1] # 全部看不见
生成第 2 个词:[0, 1, 1, 1, 1] # 只看见第 1 个
生成第 3 个词:[0, 0, 1, 1, 1] # 看见第 1、2 个
生成第 4 个词:[0, 0, 0, 1, 1] # 看见第 1、2、3 个
生成第 5 个词:[0, 0, 0, 0, 1] # 看见前 4 个
size 的影响
| size | 效果 |
|---|---|
| 5 | 5×5 矩阵,粗略 |
| 20 | 20×20 矩阵,更细致 |
4 数学原理与推导
掩码张量
$$M_{ij} = \begin{cases} 1, & \text{if } j \geq i \text{ (被遮盖)} \ 0, & \text{if } j < i \text{ (可见)} \end{cases}$$
可视化
$$\text{heatmap} = \text{imshow}(M)$$
5 代码示例
import matplotlib.pyplot as plt
import numpy as np
import torch
def dm03_test_mask(size=20):
"""
掩码张量可视化
:param size: 矩阵大小
:return: 掩码张量
"""
# 1. 生成下三角矩阵(0 表示可见,1 表示被遮盖)
upper = np.triu(np.ones((size, size)), k=1)
mask = 1 - upper # 下三角
# 2. 创建画布
plt.figure(figsize=(5, 5))
# 3. 绘制热力图
# cmap='bone': 黄色表示被遮盖,紫色表示可见
plt.imshow(mask, cmap='bone')
# 4. 显示
plt.title('Mask Tensor Visualization')
plt.xlabel('Position (horizontal)')
plt.ylabel('Current Position (vertical)')
plt.show()
return mask
# 测试
if __name__ == "__main__":
# 5x5 的掩码张量
print("5x5 掩码张量:")
mask_5 = dm03_test_mask(5)
print(mask_5)
# 20x20 的掩码张量(更细致)
print("\n20x20 掩码张量:")
mask_20 = dm03_test_mask(20)
代码说明
| 代码 | 说明 |
|---|---|
plt.figure(figsize=(5, 5)) | 创建画布 |
plt.imshow(mask, cmap='bone') | 绘制热力图 |
cmap='bone' | 颜色映射,黄色表示被遮盖 |
plt.show() | 显示图像 |
size=20 | 20×20 矩阵,更细致 |
输出说明
- 黄色:被遮盖(看不见)
- 紫色:不遮盖(可见)
- 纵向:当前位置
- 横向:能看哪些位置
6 重难点与易错提醒
- ❗重点:黄色表示被遮盖,紫色表示可见。
- ❗重点:纵向选当前位置,横向看能看哪些位置。
- ⚠️易错:传入的是二维数据。
- 💡深入理解:生成第 1 个词时什么都看不见,越往后越多。
- 💡深入理解:size 越大,图越细致。
7 课堂问答精选
Q1:掩码张量可视化中黄色和紫色分别表示什么?
A:黄色表示被遮盖(看不见),紫色表示不遮盖(可见)。
Q2:纵向和横向分别表示什么?
A:纵向(竖着)选当前位置,即第几个词;横向(横着)看能看哪些位置。
Q3:生成第 1 个词时能看到哪些词?
A:生成第 1 个词时,全部看不见(全是黄色)。越往后生成,前面看到的词越多。
Q4:为什么要将 size 从 5 改为 20?
A:size 越大,矩阵越大,图越细致,更容易看清细节。
8 本课小结
- 黄色表示被遮盖,紫色表示可见。
- 纵向选当前位置,横向看能看哪些位置。
- 生成第 1 个词时全部看不见,越往后越多。
- 用
plt.imshow(mask, cmap='bone')绘制热力图。 - size 越大,图越细致。
9 延伸思考
- 掩码张量在 Transformer 中如何使用?
- 如何将掩码张量应用到注意力机制?