transformer--编码器1(掩码张量、注意力机制、多头注意力机制)

编码器部分:

  • 由N个编码器层堆叠而成
  • 每个编码器层由两个子层连接结构组成
  • 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接。第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接 

掩码张量

什么是掩码张量

掩代表遮掩,码就是我们张量中的数值,它的尺寸不定,里面一般只有1和0的元素,代表位置被遮掩或者不被遮掩,至于是0位置被遮掩还是1位置被遮掩可以自定义,因此它的作用就是让另外一个张量中的一些数值被遮掩,也可以说被替换,它的表现形式是一个张量.

掩码张量的作用:

在transformer中,掩码张量的主要作用在应用attention时,有一些生成的attention张量中的值计算有可能已知了未来信息而得到的,未来信息被看到是因为训练时会把整个输出结果都一次性进行Embedding,但是理论上解码器的的输出却不是一次就能产生最终结果的,而是一次次通过上一次结果综合得出的,因此,未来的信息可能被提前利用.所以,我们会进行遮掩.

code

from inputs import Embeddings,PositionalEncoding
import numpy as np
import torch
import matplotlib.pyplot as plt
def subsequent_mask(size):
    """
    生成向后遮掩的掩码张量,参数size是掩码张量最后两个维度的大小,
    他们最好会形成一个方阵
    """
    attn_shape = (1,size,size)
    # 使用np.ones方法向这个形状中添加1元素,形成上三角阵
    subsequent_mask = np.triu(np.ones(attn_shape),k=1).astype('uint8')

    # 最后将numpy类型转化为torch中的tensor,内部做一个1-的操作,
    # 在这个其实是做了一个三角阵的反转,subsequent_mask中的每个元素都会被1减
    # 如果是0,subsequent_mask中的该位置由0变成1
    # 如果是1,subsequent_mask中的该位置由1变成0
    return torch.from_numpy(1-subsequent_mask)

 输出效果分析:
通过观察可视化方阵,黄色是1的部分,这里代表被遮掩,紫色代表没有被遮掩的信息,横坐标代表目标词汇的位置,纵坐标代表可查看的位置;
我们看到,在0的位置我们一看望过去都是黄色的,都被遮住了,1的位置一眼望过去还是黄色,说明第一次词还没有产生,从第二个位置看过去,就能看到位置1的词,其他位置看不到,以此类推.

注意力机制

原理理解

原来参考文章1这篇文章已经把注意力机制讲解的很清晰了,我就不罗嗦了,大家仔细研读,后续更多的是代码实现,还可以多参考几篇,文章2文章3

下面我使用上面文章1的图进行简要理解什么是注意力机制:

注意力说白了就是把一句话相关性的词找到,并使其更相关,弱化不相关的内容,和我们提炼一句话主要内容类似,但是如何能找到呢?现在知道的是每个词假如都是512维度的词嵌入向量构成(假如向量已经是训练好的,这个向量就是代表这个词),那么如何计算 一句话比较相关的词呢?因为每个token(词)都是一个向量表示,而向量计算相关性,直观的方法就是内积呀,所以使用内积就可以计算词与词的相关性了,虽然词宇词的相关性可以计算了,但是一句话我也不知道哪个词才是最重要的,如果不知道哪个词是重要的后续也是无法提取主要内容的,此时最直观的想法就是给词加个权重,越重要越相关,权重越大,理论上来说这个思路是可行的,但是应该怎么做呢?我现在唯一知道的就是每个词都由512维的向量构成,也知道可以计算每个词彼此之间的相似性,但是怎么加权重呢?我们可以想象数学领域的加权求和(概率论是期望),我们也可效仿,假如现在我计算第一个词和整个句子的其他词哪个最相关,最简单的做法就是把当前词的词向量和整个句子的词向量进行求内积即计算,如果和当前词的相关性很大,那计算出来的内积就会很大,同时希望权重也大,因此我们发现内积和希望的权重是正相关的,所以可以考虑直接把内积值作为权重即可,但整个权重是相对宇整个句子,权重值没有进行统一度量,因此做一个softmax就可以定性的确定比重问题。权重有了,那如何计算这个所谓的注意力呢?现在我们明确一下有哪些已知量,词嵌入向量、每个词和整个句子的其他词的权重,数学中的期望其实就相当于加权求和以此代表该物理量的平均结果,同理我们也可以求期望,这样就可以衡量当前词在所有词中的平均相关性程度,同时这个期望就是注意力值。上面的过程可以用下图表示:

<think>好的,我现在需要回答用户关于Transformer架构及其多头注意力机制的问题。首先,我得回忆一下Transformer的基本结构,它主要由编码器和解码器组成,每个部分都有多个层。每个编码器层包含多头注意力机制和前馈神经网络,而解码器层除了这两个还有编码器-解码器注意力层。 接下来是重点,用户特别提到了多头注意力机制的工作原理。我记得自注意力机制是基础,通过计算查询、键、值向量的相关性来分配权重。多头则是将这个过程分成多个“头”,每个头在不同的子空间进行注意力计算,最后将结果合并。这样能捕捉不同方面的信息,比如远近依赖或不同语法结构。 不过,具体细节可能需要更仔细的梳理。例如,每个头的维度是原始维度除以头数,这样可以保持计算量不变。然后,每个头独立进行缩放点积注意力,生成各自的输出,再将这些输出拼接起来,通过线性变换得到最终结果。 需要确保提到的数学公式正确,比如缩放点积注意力的公式:$\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$。每个头的处理步骤也要清晰,包括线性变换、拆分、注意力计算、拼接和再次线性变换。 可能用户还会想知道多头注意力的优势,比如并行处理和多样化特征捕获。这部分需要结合应用场景,比如机器翻译中处理不同语言结构的能力。此外,代码示例能帮助理解,比如展示如何拆分张量,计算多个头,再合并结果。 在引用方面,用户提供的参考是之前关于多头注意力的博文,我需要自然地将其融入回答中,比如在解释多头机制时提到该引用。同时,生成的相关问题要围绕Transformer的组成部分、自注意力和多头注意力的区别,以及实际应用中的优化策略。 最后,要检查是否符合格式要求:行内公式用$...$,独立公式用$$...$$,结构清晰,使用中文,没有Markdown,引用标识正确放置。确保所有技术细节准确无误,逻辑连贯,帮助用户逐步理解Transformer多头注意力机制的工作原理。</think>### Transformer架构与多头注意力机制的工作原理 #### 1. Transformer架构概述 Transformer是一种基于自注意力机制深度学习模型,广泛用于自然语言处理任务(如机器翻译、文本生成)。其核心结构包含**编码器**和**解码器**,每部分由多层堆叠组成: - **编码器层**:多头自注意力机制 + 前馈神经网络 - **解码器层**:掩码多头自注意力机制 + 编码器-解码器注意力层 + 前馈神经网络 所有层均通过残差连接和层归一化优化训练稳定性[^1]。 #### 2. 多头注意力机制的核心原理 **(1)自注意力机制基础** - 输入序列的每个词生成**查询向量$Q$、键向量$K$、值向量$V$** - 计算注意力权重: $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$ 其中$d_k$是向量维度,$\sqrt{d_k}$用于缩放梯度[^1]。 **(2)多头拆分与并行计算** 1. **线性投影**:将$Q/K/V$通过多组权重矩阵映射到不同子空间 $$Q_i = Q W_i^Q, \quad K_i = K W_i^K, \quad V_i = V W_i^V$$ 2. **独立注意力计算**:每个“头”单独执行缩放点积注意力 3. **拼接与融合**:将多个头的输出拼接后通过线性层整合 $$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h) W^O$$ **(3)优势** - **并行性**:多个头可并行计算,提升效率 - **多样化特征捕获**:不同头关注不同距离或类型的依赖关系(如语法结构、语义关联) #### 3. 代码示例(简化版) ```python import torch import torch.nn as nn class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super().__init__() self.d_model = d_model self.num_heads = num_heads self.head_dim = d_model // num_heads # 定义权重矩阵 self.W_Q = nn.Linear(d_model, d_model) self.W_K = nn.Linear(d_model, d_model) self.W_V = nn.Linear(d_model, d_model) self.W_O = nn.Linear(d_model, d_model) def forward(self, Q, K, V): batch_size = Q.size(0) # 线性投影并拆分为多头 Q = self.W_Q(Q).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) K = self.W_K(K).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) V = self.W_V(V).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) # 计算缩放点积注意力 scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim)) attn_weights = torch.softmax(scores, dim=-1) output = torch.matmul(attn_weights, V) # 拼接多头结果并输出 output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model) return self.W_O(output) ``` #### 4. 应用场景 - **机器翻译**:捕捉长距离跨语言依赖 - **文本摘要**:识别关键句间关联 - **图像生成**:像素级全局关系建模(如Vision Transformer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值