1、算法流程
1.1 将序列按给定窗口大小和滑动步长进行划分;
1.2 对每个窗口计算自注意力,
首先是计算窗口内每个元素的查询Q、键K和值V,这一步是使用一个线性层实现的,底层是矩阵乘法,就是将特征向量分别与三个权重矩阵相乘,权重矩阵的值通过反向传播获得,输入是特征向量的维度,输出是注意力模块输出的元素的维度。
其次是Q乘以K的转置计算窗口内的注意力分数,还可以加入一个相对位置编码的偏置因子,用于捕获顺序信息,如果序列存在填充,还可以加入一个掩码矩阵,掩码矩阵的形状和注意力分数矩阵的形状一样,在窗口滑动到具有填充元素的位置时,将掩码矩阵中对应填充元素的位置置为一个很大的负值,并将这个掩码矩阵加到注意力分数矩阵上,经过softmax归一化计算后,对应填充元素的得分将变为0,即该填充元素就不会对其它元素产生影响。
然后,将注意力分数矩阵与V相乘,得到每个窗口的输出,
最后,如果为了保持输出序列的长度和输入序列的长度一致,可以将每个窗口的输出进行拼接,可以对相邻窗口重叠的元素采用池化或加权平均的方式。当然,通过使用不同的滑动步长,也可以输出不同的序列长度,类似于卷积。
以上就是真个滑动窗口注意力机制的计算过程。
2、例子
如果大小为3的窗口内最后一个元素是填充的,那么在计算自注意力时,我们希望模型忽略这个填充元素。在这种情况下,掩码矩阵应该被设计为屏蔽最后一个元素,即在掩码矩阵中将最后一个元素对应的位置设置为一个非常大的负数(例如,-1e9),而其他位置设置为0。
对于一个大小为3的窗口,如果最后一个元素是填充的,掩码矩阵应该是:
[[0

4044

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



