Attention Mechanism 注意力机制

Attention Mechanism 注意力机制


注: 本文是作者的自我总结,没有严格地系统地讲述.本文主要作为个人总结记录, 欢迎大家批评,交流. https://zhouxiaowei1120.github.io/#blogs

Introduction 简介

Attention 可以认为是区分重要程度的一种方法,该机制通过计算不同位置的权重因子,给出不同位置的重要程度. 很多论文中,基本上会有这种公式,用来表示attention:
α i , j = exp ⁡ ( e i , j ) ∑ exp ⁡ ( e i , j ) \alpha_{i,j} = \frac{\exp(e_{i,j})}{\sum\exp(e_{i,j})} αi,j=exp(ei,j)exp(ei,j)

几种attention应用方式

  1. Self Attention GAN:
    Self-Attention Generative Adversarial NetworksSelf Attention GAN
  2. Soft Attention
    Video Description Generation Incorporating Spatio-Temporal Features and a Soft-Attention Mechanismsoft attention
  3. Semantic Attention
    Image Captioning with Semantic Attention
    在这里插入图片描述
  4. Attention-GAN
    Attention-GAN for Ob ject Transfiguration in Wild Images
    在这里插入图片描述
### 自注意力机制算法详解 自注意力机制(self-attention mechanism),也称为内部注意力机制,在深度学习领域中扮演着重要角色。该机制允许模型在处理序列数据时关注不同位置的信息,从而增强对上下文的理解。 #### 定义与原理 自注意力机制的核心在于计算输入序列中的每一个元素与其他所有元素之间的关联程度。这种关联通常通过点积操作来衡量,并经过softmax函数转换成概率分布形式[^4]: \[ \text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \] 其中 \( Q \),\( K \),以及 \( V \) 分别代表查询向量、键向量和值向量;而 \( d_k \) 则表示键向量的维度大小。 #### 实现方式 下面是一个简单的Python实现例子,展示了如何构建一个多头自注意力层: ```python import torch.nn as nn import math class MultiHeadedSelfAttention(nn.Module): def __init__(self, num_heads, input_dim, output_dim): super(MultiHeadedSelfAttention, self).__init__() assert input_dim % num_heads == 0 self.num_heads = num_heads self.head_dim = input_dim // num_heads self.query_linear = nn.Linear(input_dim, input_dim) self.key_linear = nn.Linear(input_dim, input_dim) self.value_linear = nn.Linear(input_dim, input_dim) self.out_projection = nn.Linear(input_dim, output_dim) def forward(self, x): batch_size, seq_len, _ = x.size() queries = self.query_linear(x).view(batch_size, seq_len, self.num_heads, self.head_dim) keys = self.key_linear(x).view(batch_size, seq_len, self.num_heads, self.head_dim) values = self.value_linear(x).view(batch_size, seq_len, self.num_heads, self.head_dim) attention_scores = (queries.unsqueeze(3) * keys.unsqueeze(2)).sum(-1) / math.sqrt(self.head_dim) attention_probs = nn.functional.softmax(attention_scores, dim=-1) context_vectors = (attention_probs.unsqueeze(-1) * values.unsqueeze(2)).sum(dim=3) outputs = context_vectors.view(batch_size, seq_len, -1) return self.out_projection(outputs) ``` 此代码片段定义了一个多头版本的自注意力模块,它能够并行地执行多个独立的关注过程,最终将它们的结果组合起来作为输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值