本章节tensor处理操作也不少,逐个讲解下:
目录
1.mask_softmax
dim=-1表示对最后一个维度进行softmax
.dim()返回的是维度数
对于需要mask的数,要用绝对值非常大的负数替换,不能用0,因为0进行softmax时exp=1,返回值不会约等于0.
#@save
def masked_softmax(X, valid_lens):
"""通过在最后⼀个轴上掩蔽元素来执⾏softmax操作"""
# X:3D张量,valid_lens:1D或2D张量
if valid_lens is None:
return nn.functional.softmax(X, dim=-1)
else:
shape = X.shape
if valid_lens.dim() == 1:
valid_lens = torch.repeat_interleave(valid_lens, shape[1])
else:
valid_lens = valid_lens.reshape(-1)
# 最后⼀轴上被掩蔽的元素使⽤⼀个⾮常⼤的负值替换,从⽽其softmax输出为0
X = d2l.sequence_mask(X.reshape(-1, shape[-1]), valid_lens,
value=-1e6)
return nn.functional.softmax(X.reshape(shape), dim=-1)
验证:2个2×4矩阵样本,指定两个样本的有效长度分别为2和3
masked_softmax(torch.rand(2, 2, 4), torch.tensor([2, 3]))
'''
tensor([[[0.4265, 0.5735, 0.0000, 0.0000],
[0.6215, 0.3785, 0.0000, 0.0000]],
[[0.2043, 0.3346, 0.4611, 0.0000],
[0.3598, 0.2352, 0.4050, 0.0000]]])
'''
指定二维张量,len中的形状为(2,2),第一个表示每个指哪个样本,第二个维度里面的表示指定每个样本的每一行的有效长度
masked_softmax(torch.rand(2, 2, 4), torch.tensor([[1, 3], [2, 4]]))
'''
tensor([[[1.0000, 0.0000, 0.0000, 0.0000],
[0.4087, 0.3961, 0.1952, 0.0000]],
[[0.6028, 0.3972, 0.0000, 0.00
深度学习中的注意力机制:softmax与加性、缩放注意力

文章介绍了在深度学习中处理序列数据时常用的注意力机制,包括mask_softmax函数的实现,它允许对序列的某些部分进行屏蔽。接着详细解释了加性注意力和缩放注意力的工作原理,以及它们在不同场景下的应用。加性注意力通过权重相乘和内积处理不同长度的序列,而缩放注意力适用于长度相同的序列,通过点积计算注意力分数。
最低0.47元/天 解锁文章
2782

被折叠的 条评论
为什么被折叠?



