扩展 - masked_fill() 函数介绍
1 课程概览
本课介绍 masked_fill() 函数。该函数用于掩码操作,将张量中满足条件的位置替换为指定值。在自注意力机制中,用于遮盖未来词。掩码张量中非零值改为 1,然后与原张量相乘,1 的位置保留原值,0 的位置变为 0(看不见)。
2 核心概念与定义
- masked_fill():PyTorch 函数,将张量中满足条件的位置替换为指定值。
- 掩码操作:用掩码张量遮盖原张量的某些位置。
- 掩码张量:由 0 和 1 组成,1 表示保留,0 表示遮盖。
3 模型与算法详解
masked_fill() 的作用
将张量中满足条件的位置替换为指定值。
掩码操作流程
1. 生成随机整数张量(原张量)
2. 生成掩码张量(随机值)
3. 处理掩码张量:非零值改为 1
4. 原张量 × 掩码张量 = 掩码结果
掩码原理
| 掩码值 | 效果 |
|---|---|
| 1 | 保留原值(可见) |
| 0 | 变为 0(看不见) |
示例:
原张量: [3, 7, 2, 5, 8]
掩码张量: [1, 0, 1, 0, 1]
结果: [3, 0, 2, 0, 8]
为什么要把非零值改为 1?
如果不改为 1,直接用原值相乘会扩大数值。
- 掩码张量中有 1 和非 1 的值
- 如果用 3 乘以原值,数值会扩大 3 倍
- 所以要把非零值都改为 1
4 数学原理与推导
掩码操作
$$\text{result}_i = \begin{cases} x_i, & \text{if } \text{mask}_i = 1 \ 0, & \text{if } \text{mask}_i = 0 \end{cases}$$
masked_fill 函数
$$\text{result} = \text{masked_fill}(x, \text{mask}, \text{value})$$
将 $x$ 中满足 $\text{mask}$ 条件的位置替换为 $\text{value}$。
5 代码示例
import torch
def dm0N_test_masked_fill():
"""演示 masked_fill() 函数的用法"""
# 1. 生成随机整数张量(1~10,形状 3×5)
input_tensor = torch.randint(1, 11, (3, 5))
print(f"原张量:\n{input_tensor}")
# 2. 生成掩码张量(随机值)
mask = torch.randint(0, 5, (3, 5))
print(f"\n掩码张量(原始):\n{mask}")
# 3. 处理掩码张量:非零值改为 1
mask = mask.masked_fill(mask != 0, 1)
print(f"\n掩码张量(处理后):\n{mask}")
# 4. 掩码操作:原张量 × 掩码张量
result = input_tensor * mask
print(f"\n掩码结果:\n{result}")
# 5. 使用 masked_fill 直接替换
# 将 mask 为 0 的位置替换为 -inf(常用于注意力机制)
scores = torch.randn(3, 5)
print(f"\n原始分数:\n{scores}")
# 将 mask=0 的位置替换为 -1e9
masked_scores = scores.masked_fill(mask == 0, -1e9)
print(f"\n掩码后分数:\n{masked_scores}")
return result
if __name__ == "__main__":
dm0N_test_masked_fill()
代码说明
| 代码 | 说明 |
|---|---|
torch.randint(1, 11, (3, 5)) | 生成 1~10 的随机整数,形状 3×5 |
mask.masked_fill(mask != 0, 1) | 将非零值改为 1 |
input_tensor * mask | 掩码操作 |
scores.masked_fill(mask == 0, -1e9) | 将 mask=0 的位置替换为 -1e9 |
6 重难点与易错提醒
- ❗重点:
masked_fill()将满足条件的位置替换为指定值。 - ❗重点:掩码张量中 1 表示保留,0 表示遮盖。
- ⚠️易错:非零值要改为 1,否则会扩大数值。
- 💡深入理解:在注意力机制中,将 mask=0 的位置替换为 -1e9,经过 softmax 后变为 0。
7 课堂问答精选
Q1:masked_fill() 函数的作用是什么?
A:将张量中满足条件的位置替换为指定值。例如 mask.masked_fill(mask != 0, 1) 将非零值改为 1。
Q2:为什么要把掩码张量中的非零值改为 1?
A:因为如果不改为 1,直接用原值相乘会扩大数值。例如用 3 乘以原值,数值会扩大 3 倍。所以要把非零值都改为 1,1 乘以原值等于原值。
Q3:掩码张量中 0 和 1 分别表示什么?
A:1 表示保留原值(可见),0 表示变为 0(看不见/被遮盖)。
Q4:在注意力机制中如何使用 masked_fill?
A:将 mask=0 的位置替换为 -1e9(负无穷),经过 softmax 后这些位置的权重变为 0,实现遮盖效果。
8 本课小结
masked_fill()将满足条件的位置替换为指定值。- 掩码张量:1 表示保留,0 表示遮盖。
- 非零值要改为 1,避免扩大数值。
- 在注意力机制中,将 mask=0 的位置替换为 -1e9。
9 延伸思考
- 如何在自注意力机制中使用 masked_fill?
- 掩码操作如何影响注意力分数?