单头注意力机制、自注意力机制和多头自注意力机制的区别,并给出它们三个各自的pytorch代码
时间: 2023-11-20 09:06:23 浏览: 184
单头注意力机制是一种基础的注意力机制,它将查询向量和键向量进行点积计算,然后再乘以值向量,最终得到加权和。这个加权和就是注意力机制的输出。其本质上可以看做是一种加权求和的过程。
自注意力机制是一种可以同时考虑序列中任意两个位置之间关系的注意力机制。它通过将输入序列中每个位置的向量作为查询、键和值,计算出每个位置和其他位置的注意力分数,然后将其他位置的值向量加权求和得到该位置的输出向量。自注意力机制可以很好地捕捉序列中的长程依赖关系。
多头自注意力机制是自注意力机制的一种拓展,它可以将输入序列的向量分成多个头,每个头都进行自注意力计算,然后将多个头得到的结果拼接起来,再通过一个线性变换得到最终的输出向量。多头自注意力机制可以更好地处理序列中不同位置之间的关系。
以下是三种注意力机制的 PyTorch 代码示例:
单头注意力机制:
```python
import torch
import torch.nn.functional as F
# 输入序列
x = torch.randn(4, 10, 32)
# 查询向量
query = torch.randn(4, 1, 32)
# 键向量
key = torch.randn(4, 10, 32)
# 值向量
value = torch.randn(4, 10, 32)
# 点积计算注意力分数
attn_scores = torch.matmul(query, key.transpose(-1, -2))
# 归一化
attn_scores = F.softmax(attn_scores, dim=-1)
# 加权求和
attn_output = torch.matmul(attn_scores, value)
```
自注意力机制:
```python
import torch
import torch.nn.functional as F
# 输入序列
x = torch.randn(4, 10, 32)
# 计算自注意力分数
attn_scores = torch.matmul(x, x.transpose(-1, -2))
# 归一化
attn_scores = F.softmax(attn_scores, dim=-1)
# 加权求和
attn_output = torch.matmul(attn_scores, x)
```
多头自注意力机制:
```python
import torch
import torch.nn.functional as F
# 输入序列
x = torch.randn(4, 10, 32)
# 头数
num_heads = 4
# 每个头的维度
head_dim = 8
# 将输入向量分成多个头
x = x.view(4, 10, num_heads, head_dim)
# 调整维度顺序
x = x.permute(0, 2, 1, 3)
# 计算自注意力分数
attn_scores = torch.matmul(x, x.transpose(-1, -2))
# 归一化
attn_scores = F.softmax(attn_scores, dim=-1)
# 加权求和
attn_output = torch.matmul(attn_scores, x)
# 调整维度顺序
attn_output = attn_output.permute(0, 2, 1, 3).contiguous()
# 合并多个头
attn_output = attn_output.view(4, 10, num_heads * head_dim)
# 线性变换
attn_output = torch.relu(torch.matmul(attn_output, W) + b)
```
阅读全文