注意力机制汇总(3)----多头注意力机制

注意力机制汇总(3)---- 多头注意力机制(tranformer)

本章节接着上面注意力机制汇总(2),再进一步探索多头注意力机制的原理。点击此处跳转


在上一章我们了解到self-attention的公式,是有Q,K点乘然后除以d k 的1/2次方,再经过softmax后,乘上V得到经过注意力机制之后的输出。本章节将详细介绍由 N个self-attention组成的 多头注意力机制(Multi-Head-Attention),其公式如下所示:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V) = Concat(head1, ...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) where head_i = Attention(QW^Q_i, KW^K_i,VW^V_i) whereheadi=Attention(QWiQ,KWiK,VWiV)

在这里插入图片描述

由上面公式和图例可以看出,多头注意力机制是由N(N=8)个self-attention计算完成后,先经过concat拼凑到一起,然后经过WO的矩形完成线性变换,变化成与输入的token维度一致的输出。(WO和WQ,WK,WV矩阵一样,都是在模型训练阶段一同训练出来的权重矩阵

我们用X模拟网络的输入,Z模拟网络的输出,多头注意力机制的流程如下:

  1. 通过WQ和WK矩阵,将输入X线性变换为Qi(Query)Ki(Key);----->此处线性变换=矩阵乘法,i:(1,8)
  2. 然后Qi与KiT做矩阵乘法,再经过softmax(QKT/dk1/2),得到转化后的权重系数,称为Yi
  3. 然后将WIV和输入X经过线性变换得到Vi(Vaule),接着让Vi 和Yi 做矩阵乘法得到Zi 矩阵
  4. 重复上述1-3过程8次。即i=18**。将得到的8个Zi~,concat到 一起得到Zconcat **
  5. 最后将Zconcat WO相乘得到输出Z。----> 此处输出Z可以看作输入X的经过一次Multi-Head-Attention后的变形, 此外WO除了让输出的维度一致之外,主要是具备将随机concat的Zi 还原成特定组合的Z,。

上面的self-Attention, Multi-Head-Attention便是Transformer的灵魂、核心!

此处贴上transformer训练的过程图

  1. 首先通过<起始>预测出The然基于已预测出的2个继续预测出computer
  2. 然后在计算机当中并行计算。
  3. 使用标签当做训练时的输入,来减小训练时产生的误差(此处加入mask:盖住部分区域来模拟真实输入)。

在这里插入图片描述

图例

img

代码解读

1. 词嵌入

import torch

torch.nn.Embedding(num_embeddings, embedding_dim)# 可以实现词嵌入, 
# num_embeddings设置为输入X的词的个数+2, size of the dictionary of embedding
# embedding_dim则是想要将词映射到的维度,the size of each embedding vector

2. 位置编码

词嵌入之后紧接着就是位置编码,位置编码用以区分不同词以及同词不同特征之间的关系。代码中需要注意:X_只是初始化的矩阵,并不是输入进来的;完成位置编码之后会加一个dropout。另外,位置编码是最后加上去的,因此输入输出形状不变。

def positional_encoding(X, num_features, dropout_p=0.1, max_len=512) -> Tensor:
    r'''
        给输入加入位置编码
    参数:
        - num_features: 输入进来的维度
        - dropout_p: dropout的概率,当其为非零时执行dropout
        - max_len: 句子的最大长度,默认512
    
    形状:
        - 输入: [batch_size, seq_length, num_features]
        - 输出: [batch_size, seq_length, num_features]

    例子:
        >>> X = torch.randn((2,4,10))
        >>> X = positional_encoding(X, 10)
        >>> print(X.shape)
        >>> torch.Size([2, 4, 10])
    '''

    dropout = nn.Dropout(dropout_p)
    P = torch.zeros((1,max_len,num_features))
    X_ = (torch.arange(max_len,dtype=torch.float32).reshape(-1,1) / 
          torch.pow(10000, torch.arange(0,num_features,2,dtype=torch.float32) /num_features))
    P[:,:,0::2] = torch.sin(X_)
    P[:,:,1::2] = torch.cos(X_)
    X = X + P[:,:X.shape[1],:].to(X.device)  # 此处表面位置编码是直接数值相加的。所以输出的type没有变化
    return dropout(X)

3. self-attention

自注意力机制,在上一篇文章中讨论了很多,具体可以去查看

# 核心代码
	# 计算Q*K的转置,在除上根号dk
	attn_scores = torch.bmm(q, k.transpose(1, 2)) / self.scale
    # 送入softmax进行归一化
	attn_weights = F.softmax(attn_scores, dim=-1)
    # 与V相乘得到新的输出
	attn_output = torch.bmm(attn_weights, v)
	

4. Encode编码层(多头此处忽略直接到编码层)

首先经过位置编码,然后经过多头注意力机制,再次期间混杂着short-cut和dropout,接着经过LN归一化与2个Linear全连接层(中间包含一个relu激活函数),在经过short-cut、dropout、LN得到输出结果

def forward(self, src: Tensor, src_mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None):
        src = positional_encoding(src, src.shape[-1])  # 位置编码
        src2 = self.self_attn(src, src, src, attn_mask=src_mask, 
        key_padding_mask=src_key_padding_mask)[0]
        src = src + self.dropout1(src2)
        # LN
        src = self.norm1(src)
        # 全连接+relu+dropout+全连接
        src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))
        src = src + self.dropout2(src2)
        # LN
        src = self.norm2(src)
        return src
    

5. Decode解码层

解码层的代码与编码层的类似:多头注意力与全连接层的组合,中间夹杂着一些归一化的方法。

5. Decode解码层

解码层的代码与编码层的类似:多头注意力与全连接层的组合,中间夹杂着一些归一化的方法。
在这里插入图片描述

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
模型 注意力机制是一种机器学习中常用的技术,它可以用于提高神经网络模型的性能。基于注意力机制的CNN-LSTM模型是一种结合了卷积神经网络(CNN)和长短时记忆(LSTM)网络的模型,它可以在文本分类、语音识别和图像处理等领域中应用。 CNN-LSTM模型的基本结构包括一个卷积层和一个LSTM层,其中卷积层用于提取输入数据的特征,LSTM层则用于学习输入数据的时间序列特征。在这个模型中,注意力机制用于加强LSTM层对输入数据的关注程度,以便提高模型的性能。 具体来说,注意力机制的作用是根据输入数据的不同部分对其进行加权,以便更好地捕捉重要的信息。在CNN-LSTM模型中,注意力机制可以通过以下步骤实现: 1. 对输入数据进行卷积操作,提取特征。 2. 对卷积结果进行池化操作,减少数据维度。 3. 将池化结果输入到LSTM层中,学习时间序列特征。 4. 在LSTM层中加入注意力机制,计算输入数据各部分的权重。 5. 根据权重调整LSTM层的输出,提高模型的性能。 注意力机制可以通过不同的方法实现,例如点积注意力、加性注意力和多头注意力等。在CNN-LSTM模型中,常用的是点积注意力和加性注意力。 总之,基于注意力机制的CNN-LSTM模型是一种有效的机器学习模型,可以用于处理多种类型的数据。它可以通过加强模型对重要信息的关注,提高模型的预测性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值