扩展 - 下三角矩阵演示
1 课程概览
本课实现下三角矩阵。通过 np.triu 生成上三角矩阵,然后用 1 - 上三角 得到下三角矩阵。上三角对角线上方有值,下三角对角线下方有值。最终用 torch.from_numpy 转换为张量。
2 核心概念与定义
- 下三角矩阵:对角线下方有值,上方为零。
- 上三角矩阵:对角线上方有值,下方为零。
- 转换方法:
1 - 上三角 = 下三角。 - torch.from_numpy:将 numpy 数组转换为张量。
3 模型与算法详解
上三角 vs 下三角
| 类型 | 有值位置 | 零的位置 |
|---|---|---|
| 上三角 | 对角线上方 | 对角线下方 |
| 下三角 | 对角线下方 | 对角线上方 |
转换方法
下三角 = 1 - 上三角
上三角: 下三角:
[0 1 1 1] [1 0 0 0]
[0 0 1 1] 1 - [1 1 0 0]
[0 0 0 1] [1 1 1 0]
[0 0 0 0] [1 1 1 1]
步骤
- 生成上三角矩阵:
np.triu(np.ones((size, size)), k=1) - 转换为下三角:
1 - 上三角 - 转换为张量:
torch.from_numpy()
4 数学原理与推导
下三角矩阵
$$M_{ij} = \begin{cases} 1, & \text{if } j \leq i \ 0, & \text{if } j > i \end{cases}$$
转换公式
$$M_{\text{下三角}} = 1 - M_{\text{上三角}}$$
示例(4×4)
$$M_{\text{下三角}} = \begin{bmatrix} 1 & 0 & 0 & 0 \ 1 & 1 & 0 & 0 \ 1 & 1 & 1 & 0 \ 1 & 1 & 1 & 1 \end{bmatrix}$$
5 代码示例
import numpy as np
import torch
def dm02_test_tril(size):
"""
生成下三角矩阵
:param size: 矩阵大小
:return: 下三角张量
"""
# 1. 生成上三角矩阵
# np.triu: 上三角矩阵,k=1 表示对角线上移一次
upper = np.triu(np.ones((size, size)), k=1)
print(f"上三角矩阵 ({size}x{size}):")
print(upper)
# 2. 转换为下三角矩阵: 1 - 上三角
lower = 1 - upper
print(f"\n下三角矩阵 ({size}x{size}):")
print(lower)
# 3. 转换为张量
tensor = torch.from_numpy(lower)
print(f"\n张量形状: {tensor.shape}")
print(f"张量类型: {tensor.dtype}")
return tensor
# 测试
if __name__ == "__main__":
# 生成 5x5 的下三角矩阵
result = dm02_test_tril(5)
print(f"\n最终结果:")
print(result)
输出示例
上三角矩阵 (5x5):
[[0. 1. 1. 1. 1.]
[0. 0. 1. 1. 1.]
[0. 0. 0. 1. 1.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]]
下三角矩阵 (5x5):
[[1. 0. 0. 0. 0.]
[1. 1. 0. 0. 0.]
[1. 1. 1. 0. 0.]
[1. 1. 1. 1. 0.]
[1. 1. 1. 1. 1.]]
张量形状: torch.Size([5, 5])
代码说明
| 代码 | 说明 |
|---|---|
np.triu(np.ones((size, size)), k=1) | 生成上三角矩阵 |
1 - upper | 转换为下三角 |
torch.from_numpy(lower) | 转换为张量 |
k=1 | 对角线上移一次 |
6 重难点与易错提醒
- ❗重点:下三角 = 1 - 上三角。
- ❗重点:下三角对角线下方有值。
- ⚠️易错:
np.ones((size, size))的参数是一个元组。 - ⚠️易错:
k=1表示对角线上移一次。 - 💡深入理解:忽略对角线,只看对角线的上和下。
7 课堂问答精选
Q1:如何生成下三角矩阵?
A:先生成上三角矩阵 np.triu(np.ones((size, size)), k=1),然后用 1 - 上三角 得到下三角矩阵。
Q2:下三角和上三角的区别是什么?
A:下三角对角线下方有值,上方为零;上三角对角线上方有值,下方为零。
Q3:如何将 numpy 数组转换为张量?
A:用 torch.from_numpy() 将 numpy 数组转换为张量。
Q4:np.triu 的 k=1 表示什么?
A:k=1 表示对角线上移一次,即不包含对角线本身。
8 本课小结
- 下三角 = 1 - 上三角。
- 下三角对角线下方有值。
- 步骤:生成上三角 → 1 - 上三角 → 转换为张量。
- 代码:
torch.from_numpy(1 - np.triu(np.ones((size, size)), k=1))。
9 延伸思考
- 掩码张量如何可视化?
- 下三角矩阵在 Transformer 中有什么作用?