注意力机制,自注意力机制,多头注意力机制,自适应注意力机制
时间: 2025-01-06 17:39:58 浏览: 57
### 不同类型注意力机制的工作原理及应用场景
#### 自注意力机制 (Self-Attention)
自注意力机制允许模型的不同位置相互关联,从而捕获输入序列内部的关系。具体来说,对于给定的查询向量 \( q \),键向量 \( k \) 和值向量 \( v \),计算过程如下:
1. 计算查询和键之间的相似度得分矩阵。
2. 使用softmax函数将这些得分转换为概率分布。
3. 将得到的概率加权求和到对应的值上。
这种机制使得每个位置可以关注整个序列中的其他位置,而不仅仅是固定的上下文窗口[^3]。
```python
import torch.nn as nn
import math
class SelfAttention(nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
# 定义线性变换层
self.values = nn.Linear(self.embed_size, self.embed_size, bias=False)
self.keys = nn.Linear(self.embed_size, self.embed_size, bias=False)
self.queries = nn.Linear(self.embed_size, self.embed_size, bias=False)
def forward(self, values, keys, query, mask=None):
N = query.shape[0]
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
values = self.values(values)
keys = self.keys(keys)
queries = self.queries(query)
energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
if mask is not None:
energy = energy.masked_fill(mask == 0, float("-1e20"))
attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3)
out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(
N, query_len, self.head_dim * self.heads
)
return out
```
#### 多头注意力机制 (Multi-head Attention)
多头注意力扩展了单个自注意力模块的功能,通过并行执行多个独立的自注意力建模路径,并最终组合它们的结果来增强表达能力。这有助于捕捉更加复杂的数据结构特性,比如长距离依赖性和局部模式识别等问题。
```python
class MultiHeadAttention(nn.Module):
def __init__(self, embed_size, num_heads):
super(MultiHeadAttention, self).__init__()
self.num_heads = num_heads
self.embed_size = embed_size
assert embed_size % num_heads == 0, "Embedding size must be divisible by number of heads"
self.depth = embed_size // num_heads
self.wq = nn.Linear(embed_size, embed_size)
self.wk = nn.Linear(embed_size, embed_size)
self.wv = nn.Linear(embed_size, embed_size)
self.dense = nn.Linear(embed_size, embed_size)
def split_heads(self, x, batch_size):
"""Split the last dimension into (num_heads, depth)."""
x = x.view(batch_size, -1, self.num_heads, self.depth)
return x.permute(0, 2, 1, 3)
def forward(self, v, k, q, mask):
batch_size = q.size(0)
q = self.split_heads(self.wq(q), batch_size)
k = self.split_heads(self.wk(k), batch_size)
v = self.split_heads(self.wv(v), batch_size)
scaled_attention, _ = self.self_attention(q, k, v, mask)
concat_attention = scaled_attention.transpose(1, 2).contiguous().view(batch_size, -1, self.embed_size)
output = self.dense(concat_attention)
return output
```
#### 自适应注意力机制 (Adaptive Attention)
自适应注意力旨在根据不同任务需求自动调整注意力权重分配策略。相比于固定参数设置的传统方法,这种方法提供了更大的灵活性,能够在训练过程中不断优化最佳配置方案。例如,在某些情况下可能需要更多地聚焦于短期记忆;而在另一些场合下,则应强调长期历史信息的重要性。
阅读全文
相关推荐
