自注意机制中添加局部信息

文章参考: Modeling Localness for Self-Attention Networks

分散注意力机制的思路是先验的让一些特征仅仅依赖于邻近的信息. 本文的思路是考虑全局信息的同时也添加局部信息.
具体地,
A ^ e G \hat{A} e^{G} A^eG
A ^ \hat{A} A^ 是权重矩阵, 即 softmax ( Q K T / d ) \text{softmax}(QK^T/\sqrt{d}) softmax(QKT/d ). G n × n G_{n \times n} Gn×n, n 是文字长度(含词汇的数目), 称作 Gauss 偏向.
G i , j = − ( j − P i ) 2 2 σ i 2 . G_{i,j}=-\frac{(j-P_i)^2}{2\sigma_i^2}. Gi,j=2σi2

局部自注意机制是一种在序列模型中应用的注意机制,用于将模型关注点集中在输入序列中的局部区域。 在Python中,可以使用PyTorch实现局部自注意机制。以下是一个简单的实现示例: ```python import torch import torch.nn as nn class LocalSelfAttention(nn.Module): def __init__(self, input_size, window_size): super(LocalSelfAttention, self).__init__() self.input_size = input_size self.window_size = window_size self.query = nn.Linear(input_size, input_size) self.key = nn.Linear(input_size, input_size) self.value = nn.Linear(input_size, input_size) def forward(self, x): batch_size, seq_len, _ = x.size() padded_x = nn.functional.pad(x, (self.window_size//2, self.window_size//2), mode='replicate') attention = [] for i in range(seq_len): window = padded_x[:, i:i+self.window_size, :] q = self.query(x[:, i, :]).unsqueeze(1) k = self.key(window) v = self.value(window) score = torch.matmul(q, k.transpose(-1,-2)) / (self.input_size**0.5) score = nn.functional.softmax(score, dim=-1) weighted_v = torch.matmul(score, v) attention.append(weighted_v) attention = torch.cat(attention, dim=1) return attention ``` 在这个实现中,我们首先通过线性变换将输入序列分别映射为查询、键和值。然后,我们对每个序列位置应用自注意机制注意力分布是基于查询和键之间的点积计算的,并且通过softmax函数进行归一化。最后,我们将值与注意力分布相乘,以计算加权平均值作为每个位置的输出。我们通过将这些输出串联在一起来形成最终的局部自注意机制输出。 使用这个模块,我们可以将其添加到任何序列模型中,以增强其性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值