注意力机制之注意力分数

注意力分数

注意力分数和注意力权重的区别:
在这里插入图片描述

扩展到高维

这里,q的数量和key-value对的数量可以不一致。q,k,v的维度都可以不同,最后得到的结果和v的维度一样。关键在于注意力分数a的设置。
在这里插入图片描述

加性注意力

h是超参数。Wk是从k映射到h维,Wq是从q映射到h。q,k,v这三个向量的维度可以不一样
在这里插入图片描述

scaled 点积注意力

q,k都是相同的维度,这里除以d还是为了减少输入长度的影响(类似于归一化)
有多个query,这里,每一行表示第i个query的权重是什么样子的,softmax也是对每一行做softmax,然后再和v相乘。
在这里插入图片描述

总结

  • 注意力分数是query和key的相似度,注意力权重是分数softmax的结果。
  • 两种常见的分数计算:
    • 将query和key合并起来进入一个单输出单隐藏层的MLP
    • 直接将query和key做内积

代码

在这里插入代码片
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多头注意力机制(MHSA)是一种注意力机制,它可以在不同的表示子空间中并行地计算多个注意力分数。这种机制可以帮助模型更好地捕捉输入序列中的不同关系。在图像分割中,MHSA通常被用于编码器的最后一层,以便模型可以同时关注整个图像。而交叉注意力机制则是将注意力机制应用于跳跃连接之后的解码器中,以将高层次语义更丰富的特征图与来自跳跃连接的高分辨率图结合起来,从而提高分割的准确性。 下面是一个简单的例子,展示了如何在PyTorch中实现多头注意力机制和交叉注意力机制: ```python import torch import torch.nn as nn # 多头注意力机制 class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadAttention, self).__init__() self.num_heads = num_heads self.d_model = d_model assert d_model % num_heads == 0 self.depth = d_model // num_heads self.query = nn.Linear(d_model, d_model) self.key = nn.Linear(d_model, d_model) self.value = nn.Linear(d_model, d_model) self.fc = nn.Linear(d_model, d_model) def split_heads(self, x, batch_size): x = x.view(batch_size, -1, self.num_heads, self.depth) return x.permute(0, 2, 1, 3) def forward(self, query, key, value, mask=None): batch_size = query.size(0) # 线性变换 query = self.query(query) key = self.key(key) value = self.value(value) # 拆分头 query = self.split_heads(query, batch_size) key = self.split_heads(key, batch_size) value = self.split_heads(value, batch_size) # 计算注意力 scores = torch.matmul(query, key.transpose(-1, -2)) / torch.sqrt(torch.tensor(self.depth).float()) if mask is not None: scores += mask * -1e9 attention = nn.Softmax(dim=-1)(scores) context = torch.matmul(attention, value) # 合并头 context = context.permute(0, 2, 1, 3).contiguous() context = context.view(batch_size, -1, self.d_model) # 线性变换 output = self.fc(context) return output, attention # 交叉注意力机制 class CrossAttention(nn.Module): def __init__(self, d_model): super(CrossAttention, self).__init__() self.query = nn.Linear(d_model, d_model) self.key = nn.Linear(d_model, d_model) self.value = nn.Linear(d_model, d_model) self.fc = nn.Linear(d_model, d_model) def forward(self, query, key, value, mask=None): # 线性变换 query = self.query(query) key = self.key(key) value = self.value(value) # 计算注意力 scores = torch.matmul(query, key.transpose(-1, -2)) / torch.sqrt(torch.tensor(query.size(-1)).float()) if mask is not None: scores += mask * -1e9 attention = nn.Softmax(dim=-1)(scores) context = torch.matmul(attention, value) # 线性变换 output = self.fc(context) return output, attention ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值