注意力机制(代码实现案例)

这篇具有很好参考价值的文章主要介绍了注意力机制(代码实现案例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习目标

  • 了解什么是注意力计算规则以及常见的计算规则.
  • 了解什么是注意力机制及其作用.
  • 掌握注意力机制的实现步骤.

1 注意力机制介绍

1.1 注意力概念

  • 我们观察事物时,之所以能够快速判断一种事物(当然允许判断是错误的), 是因为我们大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果. 正是基于这样的理论,就产生了注意力机制.

1.2 注意力计算规则

  • 它需要三个指定的输入Q(query), K(key), V(value), 然后通过计算公式得到注意力的结果, 这个结果代表query在key和value作用下的注意力表示. 当输入的Q=K=V时, 称作自注意力计算规则.

1.3 常见的注意力计算规则

注意力机制(代码实现案例),NLP,深度学习,人工智能

  • bmm运算演示:

# 如果参数1形状是(b × n × m), 参数2形状是(b × m × p), 则输出为(b × n × p)
>>> input = torch.randn(10, 3, 4)
>>> mat2 = torch.randn(10, 4, 5)
>>> res = torch.bmm(input, mat2)
>>> res.size()
torch.Size([10, 3, 5])

2 什么是注意力机制

  • 注意力机制是注意力计算规则能够应用的深度学习网络的载体, 同时包括一些必要的全连接层以及相关张量处理, 使其与应用网络融为一体. 使用自注意力计算规则的注意力机制称为自注意力机制.
  • 说明: NLP领域中, 当前的注意力机制大多数应用于seq2seq架构, 即编码器和解码器模型.

3 注意力机制的作用

  • 在解码器端的注意力机制: 能够根据模型目标有效的聚焦编码器的输出结果, 当其作为解码器的输入时提升效果. 改善以往编码器输出是单一定长张量, 无法存储过多信息的情况.
  • 在编码器端的注意力机制: 主要解决表征问题, 相当于特征提取过程, 得到输入的注意力表示. 一般使用自注意力(self-attention).

注意力机制在网络中实现的图形表示:

注意力机制(代码实现案例),NLP,深度学习,人工智能文章来源地址https://www.toymoban.com/news/detail-837392.html

4 注意力机制实现步骤

4.1 步骤

  • 第一步: 根据注意力计算规则, 对Q,K,V进行相应的计算.
  • 第二步: 根据第一步采用的计算方法, 如果是拼接方法,则需要将Q与第二步的计算结果再进行拼接, 如果是转置点积, 一般是自注意力, Q与V相同, 则不需要进行与Q的拼接.
  • 第三步: 最后为了使整个attention机制按照指定尺寸输出, 使用线性层作用在第二步的结果上做一个线性变换, 得到最终对Q的注意力表示.

4.2 代码实现

  • 常见注意力机制的代码分析:
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    
    class Attn(nn.Module):
        def __init__(self, query_size, key_size, value_size1, value_size2, output_size):
            """初始化函数中的参数有5个, query_size代表query的最后一维大小
               key_size代表key的最后一维大小, value_size1代表value的导数第二维大小, 
               value = (1, value_size1, value_size2)
               value_size2代表value的倒数第一维大小, output_size输出的最后一维大小"""
            super(Attn, self).__init__()
            # 将以下参数传入类中
            self.query_size = query_size
            self.key_size = key_size
            self.value_size1 = value_size1
            self.value_size2 = value_size2
            self.output_size = output_size
    
            # 初始化注意力机制实现第一步中需要的线性层.
            self.attn = nn.Linear(self.query_size + self.key_size, value_size1)
    
            # 初始化注意力机制实现第三步中需要的线性层.
            self.attn_combine = nn.Linear(self.query_size + value_size2, output_size)
    
    
        def forward(self, Q, K, V):
            """forward函数的输入参数有三个, 分别是Q, K, V, 根据模型训练常识, 输入给Attion机制的
               张量一般情况都是三维张量, 因此这里也假设Q, K, V都是三维张量"""
    
            # 第一步, 按照计算规则进行计算, 
            # 我们采用常见的第一种计算规则
            # 将Q,K进行纵轴拼接, 做一次线性变化, 最后使用softmax处理获得结果
            attn_weights = F.softmax(
                self.attn(torch.cat((Q[0], K[0]), 1)), dim=1)
    
            # 然后进行第一步的后半部分, 将得到的权重矩阵与V做矩阵乘法计算, 
            # 当二者都是三维张量且第一维代表为batch条数时, 则做bmm运算
            attn_applied = torch.bmm(attn_weights.unsqueeze(0), V)
    
            # 之后进行第二步, 通过取[0]是用来降维, 根据第一步采用的计算方法, 
            # 需要将Q与第一步的计算结果再进行拼接
            output = torch.cat((Q[0], attn_applied[0]), 1)
    
            # 最后是第三步, 使用线性层作用在第三步的结果上做一个线性变换并扩展维度,得到输出
            # 因为要保证输出也是三维张量, 因此使用unsqueeze(0)扩展维度
            output = self.attn_combine(output).unsqueeze(0)
            return output, attn_weights
    
  • 调用:
  • query_size = 32
    key_size = 32
    value_size1 = 32
    value_size2 = 64
    output_size = 64
    attn = Attn(query_size, key_size, value_size1, value_size2, output_size)
    Q = torch.randn(1,1,32)
    K = torch.randn(1,1,32)
    V = torch.randn(1,32,64)
    out = attn(Q, K ,V)
    print(out[0])
    print(out[1])
  • 输出效果:
    tensor([[[ 0.4477, -0.0500, -0.2277, -0.3168, -0.4096, -0.5982,  0.1548,
              -0.0771, -0.0951,  0.1833,  0.3128,  0.1260,  0.4420,  0.0495,
              -0.7774, -0.0995,  0.2629,  0.4957,  1.0922,  0.1428,  0.3024,
              -0.2646, -0.0265,  0.0632,  0.3951,  0.1583,  0.1130,  0.5500,
              -0.1887, -0.2816, -0.3800, -0.5741,  0.1342,  0.0244, -0.2217,
               0.1544,  0.1865, -0.2019,  0.4090, -0.4762,  0.3677, -0.2553,
              -0.5199,  0.2290, -0.4407,  0.0663, -0.0182, -0.2168,  0.0913,
              -0.2340,  0.1924, -0.3687,  0.1508,  0.3618, -0.0113,  0.2864,
              -0.1929, -0.6821,  0.0951,  0.1335,  0.3560, -0.3215,  0.6461,
               0.1532]]], grad_fn=<UnsqueezeBackward0>)
    
    
    tensor([[0.0395, 0.0342, 0.0200, 0.0471, 0.0177, 0.0209, 0.0244, 0.0465, 0.0346,
             0.0378, 0.0282, 0.0214, 0.0135, 0.0419, 0.0926, 0.0123, 0.0177, 0.0187,
             0.0166, 0.0225, 0.0234, 0.0284, 0.0151, 0.0239, 0.0132, 0.0439, 0.0507,
             0.0419, 0.0352, 0.0392, 0.0546, 0.0224]], grad_fn=<SoftmaxBackward>)
    

到了这里,关于注意力机制(代码实现案例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)

    CBAM(Convolutional Block Attention Module) 是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目标是 通过在CNN中引入通道注意力和空间注意力 来提高模型的感知能力,从

    2024年02月13日
    浏览(28)
  • 【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

    ECANet(Efficient Channel Attention Network) 是一种 用于图像处理任务的神经网络架构,它在保持高效性的同时,有效地捕捉图像中的通道间关系,从而提升了特征表示的能力 。ECANet通过引入通道注意力机制,以及在卷积层中嵌入该机制,取得了优越的性能。本文将对ECANet的核心思

    2024年02月13日
    浏览(34)
  • NLP(1)--NLP基础与自注意力机制

    目录 一、词向量 1、概述 2、向量表示 二、词向量离散表示 1、one-hot 2、Bag of words 3、TF-IDF表示 4、Bi-gram和N-gram 三、词向量分布式表示 1、Skip-Gram表示 2、CBOW表示  四、RNN 五、Seq2Seq  六、自注意力机制 1、注意力机制和自注意力机制 2、单个输出 3、矩阵计算 4、multi-head self-

    2024年02月10日
    浏览(30)
  • Pytorch 注意力机制解析与代码实现

    注意力机制是深度学习常用的一个小技巧,它有多种多样的实现形式,尽管实现方式多样,但是每一种注意力机制的实现的核心都是类似的,就是注意力。 注意力机制的核心重点就是让网络关注到它更需要关注的地方。 当我们使用卷积神经网络去处理图片的时候,我们会更

    2024年02月06日
    浏览(35)
  • Transformer(一)简述(注意力机制,NLP,CV通用模型)

    目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed(q,k,v不区分大小写) 1.5.位置信息表达  2.Decoder(待补充)  3.BERT 参考文献 比方说,下图中的热度图中我们希望专注于小鸟,而不关注背景信息。那么如何关注文本和图像中的重点呢

    2024年02月13日
    浏览(27)
  • NLP 学习笔记十-simple RNN+attention(注意力机制)

    感兴趣的伙伴,看这个笔记,最好从头开始看哈,而且我的笔记,其实不面向零基础,最好有过一些实践经历的来看最好。 紧接上一回,我们谈到seq2seq模型解决用于机器翻译的问题。其中seq其实是采用lstm作为自己的基础记忆网络实现的,当然也可以用RNN实现实现seq2seq模型。

    2024年02月09日
    浏览(48)
  • SE、CBAM、ECA注意力机制(网络结构详解+详细注释代码+核心思想讲解+注意力机制优化神经网络方法)——pytorch实现

           这期博客我们来学习一下神秘已久的注意力机制,刚开始接触注意力机制的时候,感觉很有意思,事实上学会之后会发现比想象中的要简单,复杂的注意力机制后续会讲解,这期博客先讲解最常见的三种SE、CBAM、ECA注意力机制。        注意力机制更详细的可以被称

    2024年02月07日
    浏览(37)
  • 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码

    紧接上回:【动手深度学习-笔记】注意力机制(三)多头注意力 在注意力机制下,我们将词元序列输入注意力汇聚中,以便同一组词元同时充当查询、键和值。 具体来说,每个查询都会关注所有的键-值对并生成一个注意力输出。 像这样的,查询、键和值来自同一组输入的

    2024年01月16日
    浏览(34)
  • 【深度学习】注意力机制

    注意力机制(Attention Mechanism)是一种在计算机科学和机器学习中常用的技术,可以使模型在处理序列数据时更加准确和有效。在传统的神经网络中,每个神经元的输出只依赖于前一层的所有神经元的输出,而在注意力机制中,每个神经元的输出不仅仅取决于前一层的所有神经

    2024年02月02日
    浏览(31)
  • 解码Transformer:自注意力机制与编解码器机制详述与代码实现

    本文全面探讨了Transformer及其衍生模型,深入分析了自注意力机制、编码器和解码器结构,并列举了其编码实现加深理解,最后列出基于Transformer的各类模型如BERT、GPT等。文章旨在深入解释Transformer的工作原理,并展示其在人工智能领域的广泛影响。 作者 TechLead,拥有10+年互

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包