自注意力机制中的掩码Mask的生成

本文详细解释了自注意力机制中如何运用掩码技术,包括paddingmask处理输入序列对齐和填充部分,以及sequencemask防止解码器看到未来信息。通过window_partition和softmax操作,确保模型专注于有效信息并避免不必要的干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在自注意力机制中,掩码是一种用来控制模型在处理序列数据时忽略无效部分的技术。具体来说,掩码是一个与输入序列的长度相同的、由0和1组成的矩阵。其中,0表示对应位置是无效的,1表示对应位置是有效的。
在自注意力机制中,掩码被用来屏蔽(即将其值置为一个很小的负无穷)无效的位置。这样,在进行自注意力计算时,无效位置的权重就会变得非常小(接近于0),从而将其对最终结果的影响降到最小。
掩码的作用是确保模型不会关注到输入序列中的填充部分(即长度不足的部分),这在处理变长序列时非常重要。通过使用掩码,模型能够更好地捕捉到序列中的有效信息。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。

Padding Mask

padding mask:因为每个批次输入序列长度是不一样,需要对输入序列进行对齐。给较短的序列后面填充 0,对于输入太长的序列,截取左边的内容,把多余的直接舍弃。这些填充的位置,没什么意义,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。

具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!

而我们的 padding mask 实际上是一个张量,每个值都是一个Boolean,值为 false 的地方就是我们要进行处理的地方。

Sequence mask

sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。

具体做法:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上。

 对于 decoder 的 self-attention,同时需要padding mask 和 sequence mask 作为 attn_mask,具体实现就是两个mask相加作为attn_mask。
其他情况,attn_mask 一律等于 padding mask。
编码器处理输入序列,最终输出为一组注意向量k和v。每个解码器将在其“encoder-decoder attention”层中使用k,v注意向量,这有助于解码器将注意力集中在输入序列中的适当位置。
掩码的生成具体实现如下:、

  •     def calculate_mask(self, x_size):
            # calculate attention mask for SW-MSA
            H, W = x_size
            img_mask = torch.zeros((1, H, W, 1))  # 1 H W 1,初始化推向掩码
            h_slices = (slice(0, -self.window_size),  # slice 函数来生成用于切片操作的索引,从位置0开始到位置-self.window_size结束的切片操作
                        slice(-self.window_size, -self.shift_size),
                        slice(-self.shift_size, None))  # 高度的大小
            w_slices = (slice(0, -self.window_size),
                        slice(-self.window_size, -self.shift_size),
                        slice(-self.shift_size, None))  # 从位置-self.shift_size开始到最后位置结束的切片操作
            cnt = 0
            for h in h_slices:
                for w in w_slices:
                    img_mask[:, h, w, :] = cnt
                    cnt += 1  # 掩码的设置,需要的地方设置为1,不需要的地方设置为0
    
            mask_windows = window_partition(img_mask, self.window_size)  # nW, window_size, window_size, 1,掩码的窗口划分
            mask_windows = mask_windows.view(-1, self.window_size * self.window_size)  # 维度调整
            attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)  # 创建注意力机制中的掩码张量,以便在自注意力或其他形式的掩码注意力中屏蔽掉不需要的位置
            attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0))
            # masked_fill 函数的作用是将输入张量中满足掩码条件的元素替换为指定的值
    
            return attn_mask

 

### 回答1: 在注意力机制中,mask可以用来屏蔽掉一些无关的信息,使得模型能够更好地集中注意力于重要的信息上。mask的添加通常有以下几个步骤: 1. 首先需要定义一个mask矩阵,矩阵的形状要和输入数据的形状相同。 2. 对于需要被屏蔽的部分,将对应位置的值设置为0,否则设置为1。 3. 将mask矩阵与输入数据相乘,即可得到被屏蔽后的输出结果。 4. 在注意力机制中,mask通常会被应用到softmax函数中,以防止无关的信息对注意力权重的计算产生影响。在这种情况下,可以将需要屏蔽的部分对应的位置置为负无穷,这样softmax函数计算出来的值就会趋近于0。 需要注意的是,mask的添加方式可能会因具体应用场景而有所不同,上述方法只是一种常见的实现方式。 ### 回答2: 注意力机制中的mask是用来控制模型在计算注意力权重时排除某些信息的一种技术。在添加mask的过程中,可以使用不同的策略来掩盖或保留特定的信息。 一种常见的mask添加方式是通过设置一个掩码矩阵,该矩阵的形状与注意力权重矩阵相同。通常情况下,掩码矩阵的元素值为0或者一个极小的负无穷大的值,用于屏蔽或封堵某些位置的信息。 例如,在自注意力机制中,我们经常使用mask来避免Transformer模型在生成每个位置的输出时查看到未来信息。这种mask通常被称为前瞻性mask或自回归mask。在此情况下,我们可以简单地将未来的位置所对应的掩码矩阵的元素值设为负无穷大。 此外,别的应用场景也可以自定义添加mask。例如,在文本分类任务中,可以根据需要设置mask以将注意力集中在感兴趣的词汇上,或者忽略一些无关的特征。这些任务特定的mask可以根据实际问题的需要自行定义,并将其应用于计算注意力权重的过程中。 总的来说,添加mask的过程主要是通过定义和构造合适的掩码矩阵,使用这些掩码矩阵对注意力权重矩阵进行控制,以达到排除或保留特定信息的目的。具体如何添加mask要视具体问题而定,需要根据应用场景和模型结构来确定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值