信息熵|atttion矩阵的注意力熵
显著图可以看作是模型的注意力图,它标识了模型对输入图像某些区域的关注程度。我们使用 blob 区域(连通的显著区域)来检测模型关注的部分,然后计算这些区域的概率分布,再通过熵来衡量这些区域的“信息量”或“分散度”。
举个简单的例子:
Step 1: 假设有一个 4x4 的注意力图 x
:
x = [
[0.1, 0.2, 0.4, 0.1],
[0.1, 0.5, 0.3, 0.2],
[0.7, 0.6, 0.2, 0.1],
[0.1, 0.3, 0.4, 0.2]
]
Step 2: 计算均值 m
对于每个像素,我们可以计算注意力图 x
的均值。假设均值为:
m = mean(x) = 0.3
Step 3: 通过均值识别显著区域
我们认为那些大于均值 m
的区域更“显著”,所以创建一个二值掩码 B_mask
:
B_mask = [
[0, 0, 1, 0],
[0, 1, 1, 0],
[1, 1, 0, 0],
[0, 1, 1, 0]
]
这张 4x4 的掩码图表示了显著区域的连通分量(blob),比如第 (0,2) 位置的 1 表示这个像素比均值大,因此是一个显著区域的一部分。
Step 4: 计算 blob 中的激活值和总值
现在我们需要计算这些 blob 的激活值。假设我们将 x
的显著区域重新计算(即通过 relu 操作),得到:
x_reactivated = [
[0, 0, 0.1, 0],
[0, 0.2, 0, 0],
[0.4, 0.3, 0, 0],
[0, 0.1, 0.2, 0]
]
然后我们计算每个 blob 的总激活值 p_u
和整个显著区域的总值 B
:
p_u
是每个连通区域内的激活值和掩码值相乘再求和。B
是整个显著区域的总激活值。
假设:
p_u = [0.1, 0.2, 0.3, 0.4]
代表四个 blob 的激活值。B = 1.0
是所有显著区域的总激活值。
Step 5: 计算每个 blob 的概率 p_n
每个 blob 的激活值 p_u
除以总值 B
,得到它们的概率 p_n
:
p_n = p_u / B = [0.1 / 1.0, 0.2 / 1.0, 0.3 / 1.0, 0.4 / 1.0]
= [0.1, 0.2, 0.3, 0.4]
Step 6: 计算熵 H
根据熵的公式:
H = - Σ (p_n * log(p_n))
我们将这些概率代入公式计算熵:
H = - (0.1 * log(0.1) + 0.2 * log(0.2) + 0.3 * log(0.3) + 0.4 * log(0.4))
逐步计算:
H ≈ - (0.1 * -2.3 + 0.2 * -1.61 + 0.3 * -1.2 + 0.4 * -0.92)
H ≈ - (-0.23 - 0.322 - 0.36 - 0.368)
H ≈ 1.28
Step 7: 计算损失
最后,将熵值除以样本数和注意力头的数量来计算最终损失。这个熵值代表模型在显著区域的分散度,值越高说明模型的关注越分散,值越低则说明模型更集中地关注特定区域。
总结:
这个示例展示了如何通过注意力图计算显著区域的熵值,并以此作为损失函数的一部分来优化模型。高熵表示模型对多个区域的注意力分散,低熵则表示模型对少数区域的关注更集中。在实际应用中,目标是通过最小化熵来鼓励模型专注于特定的显著区域。