7-2 自注意力机制 原理

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

7-2 自注意力机制 原理

上一章已经讲过什么是注意力,注意力有哪几种???
接下来,讲一下什么叫做自注意力机制??

李宏毅视频讲解:https://www.bilibili.com/video/BV1v3411r78R

PPT:https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/self_v7.pdf

自注意力机制实际上是注意力机制中的一种,

自注意力机制实际上也是一种网络的构型,它想要解决的问题是网络接收的输入是很多向量,并且向量的大小也是不确定的情况,比如机器翻译(序列到序列的问题,机器自己决定多少个标签),词性标注(Pos tagging一个向量对应一个标签),语义分析(多个向量对应一个标签)等文字处理问题。

1. 简介

Query,Key,Value的概念取自于信息检索系统,举个简单的搜索的例子来说。

当你在某电商平台搜索某件商品(年轻女士冬季穿的红色薄款羽绒服)时,

  • 你在搜索引擎上输入的内容便是Query
  • 然后搜索引擎根据Query为你匹配Key(例如商品的种类,颜色,描述等),
  • 然后根据Query和Key的相似度得到匹配的内容(Value)

self-attention中的Q,K,V也是起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法之一,因此式1中使用了QKT进行相似度的计算。接着便是根据相似度进行输出的匹配,这里使用了加权匹配的方式,而权值就是query与key的相似度。

2. NLP中自注意力

自注意力计算公式
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d ) V Attention(Q,K,V)=SoftMax(\frac{QK^T}{\sqrt{d}})V Attention(Q,K,V)=SoftMax(d QKT)V

现在我们有一组一维的向量,那么向量b是如何产生的呢?

7-2 自注意力机制 原理

步骤1: 对于每个向量 a a a,分别乘上三个系数 w q , w k , w v w^q,w^k,w^v wq,wk,wv,得到 q , k , v q,k,v q,k,v三个值

q i = w q ⋅ a i q^i=w^q\cdot a^i qi=wqai写成向量形式 Q = W q ⋅ I Q=W^q\cdot I Q=WqI

k i = w q ⋅ a i k^i=w^q\cdot a^i ki=wqai写成向量形式 K = W k ⋅ I K=W^k\cdot I K=WkI

v i = w q ⋅ a i v^i=w^q\cdot a^i vi=wqai写成向量形式 V = V q ⋅ I V=V^q\cdot I V=VqI

得到的Q,K,V分别表示query,key和value。这3个w的参数就是我们需要学习的参数

7-2 自注意力机制 原理


步骤2

利用得到的 Q Q Q K K K计算每两个输入向量之间的相关性,也就是计算attention的值 α \alpha α α \alpha α的计算方法有多种,通常采用点乘的方式。

α i , j = q i ⋅ k j \alpha_{i,j}=q^i\cdot k^j αi,j=qikj写成向量形式: A = K T ⋅ Q A=K^T\cdot Q A=KTQ

7-2 自注意力机制 原理

矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小 α \alpha α

Q K T QK^T QKT代表 n n n个查询向量(样本特征)与 n n n个键向量(信息特征)之间的相似度。

如果 A A A的第一行为 [ 2 , 5 , 3 ] [2,5,3] [2,5,3],则代表第一个样本与第一、二、三条信息之间的相似度2,5,3


步骤3

对A矩阵进行softmax操作或者relu操作得到A’。通常为 S o f t m a x ( ⋅ / d k ) Softmax(\cdot/\sqrt{d_k}) Softmax(/dk )

A ′ A^\prime A就是各个样本与各条信息间相关或相似程度的分布

对于上一段提到的例子,我们简单地令 w ( x ) = x i ∑ x i w(x)=\frac{x_i}{\sum x_i} w(x)=xixi,得到 [ 0.2 , 0.5 , 0.3 ] [0.2,0.5,0.3] [0.2,0.5,0.3]。这代表第一个样本与第一、二、三条信息的相关或相似度分别为20%、50%和30%。

步骤4:利用得到的 A ′ A^\prime A V V V计算每个输入向量a对应的self-attention层的输出向量b:

b i = ∑ j = 1 n v i ⋅ α i , j ′ b_i=\sum_{j=1}^nv_i\cdot \alpha_{i,j}^\prime bi=j=1nviαi,j,写成向量形式 O = V ⋅ A ′ O=V\cdot A^\prime O=VA

7-2 自注意力机制 原理

A t t ( Q , K , V ) Att(Q,K,V) Att(Q,K,V)值向量(信息)的加权和,权值为各个样本与各条信息间相关或相似程度的分布,这就是自注意力的最终结果。

拿第一个向量a1对应的self-attention输出向量b1举例,它的产生过程如下:

7-2 自注意力机制 原理

3. 图像中的自注意力+代码

7-2 自注意力机制 原理

7-2 自注意力机制 原理

代码来自SAGAN这篇论文:

论文代码: https://arxiv.org/abs/1805.08318

代码链接: https://github.com/heykeetae/Self-Attention-GAN

自注意力代码如下

import numpy as np
import torch
from einops import rearrange
from torch import nn


class Self_Attn(nn.Module):
    """ Self attention Layer"""

    def __init__(self, in_dim, activation=None):
        super(Self_Attn, self).__init__()
        # self.chanel_in = in_dim
        # self.activation = activation

        self.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)
        self.key_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)
        self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)
        self.gamma = nn.Parameter(torch.zeros(1))

        self.softmax = nn.Softmax(dim=-1)  #

    def forward(self, x):
        """
            inputs :
                x : input feature maps( B X C X W X H)
            returns :
                out : self attention value + input feature
                attention: B X N X N (N is Width*Height)
        """
        # batch,通道数,宽,高
        m_batchsize, C, width, height = x.size()  # [1, 16, 32, 32]

        # 步骤1, 通过conv 得出q,k
        q = self.query_conv(x).view(m_batchsize, -1, width * height).permute(0, 2,
                                                                             1)  # B X CX(N) torch.Size([1, 1024, 2])
        k = self.key_conv(x).view(m_batchsize, -1, width * height)  # B X C x (*W*H) torch.Size([1, 2, 1024])
        # 步骤1, 计算得出v
        v = self.value_conv(x).view(m_batchsize, -1, width * height)  # B X C X N  torch.Size([1, 16, 1024])

        # 步骤2,  矩阵的乘法 ,q,k进行相乘,得出特征图
        # [batch_size,1024,2]*[batch_size,2,1024]
        energy = torch.bmm(q, k)  # transpose check [1, 1024, 1024]
        # 特征图attention map,通过softmax
        attention = self.softmax(energy)  # BX (N) X (N)  torch.Size([1, 1024, 1024])

        # 步骤3,v * 特征图= 注意力
        # [1,16,1024]  *  [1,1024,1024]= torch.Size([1, 16, 1024])
        out = torch.bmm(v, attention.permute(0, 2, 1))  # torch.Size([1, 16, 1024])

        # 重新resize
        out = out.view(m_batchsize, C, width, height)  # torch.Size([1, 16, 32, 32])

        # 加上残差
        out = self.gamma * out + x
        return out, attention


if __name__ == '__main__':
    # 这个通道数需要 是8的倍数。因为 q,k,v 是使用conv算出的。 输出通道需要大于 8
    x = torch.randn(size=(1, 16, 32, 32))
    model = Self_Attn(16)
    out, attention = model(x)
    print(out.shape)
    print(attention.shape)

4. 问题

自注意力机制虽然考虑了所有的输入向量,但没有考虑到向量的位置信息。在实际的文字处理问题中,可能在不同位置词语具有不同的性质,比如动词往往较低频率出现在句首。

有学者提出可以通过位置编码(Positional Encoding)来解决这个问题:对每一个输入向量加上一个位置向量e,位置向量的生成方式有多种,通过e来表示位置信息带入self-attention层进行计算。

[2003.09229] Learning to Encode Position for Transformer with Continuous Dynamical Model (arxiv.org)

参考资料

注意力机制 & 自注意力模型 - 知乎 (zhihu.com)

https://zhuanlan.zhihu.com/p/48508221

(1条消息) 机器学习中的自注意力(Self Attention)机制详解_I am zzxn的博客-CSDN博客_自注意力机制公式文章来源地址https://www.toymoban.com/news/detail-432447.html

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

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

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

相关文章

  • 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

    注意力机制一直是一个比较热的话题,其实在很早之前就提出了,我们在学习图像分类时在SENet就见到过(直通车:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记(翻译+精读+代码复现))自从谷歌发表了《Attention Is All You Need》这篇论文后,注意力

    2024年02月06日
    浏览(63)
  • 自注意力机制与注意力机制

    基本内容理解的话推荐看一下这篇博客Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结,这个博主讲的很细致,比较容易理解。 这里借用一下上述博客的总结: 注意力可以分为两种方式分别是 自主提示 和 非自主提示 。其中非自主提示是键,自主

    2023年04月08日
    浏览(44)
  • 注意力机制详解系列(三):空间注意力机制

    👨‍💻 作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉 专栏推荐: 目前在写CV方向专栏,更新不限于目标检测、OCR、图像分类、图像分割等方向,目前活动仅19.9,虽然付费但会长期更新,感兴趣的小伙

    2024年02月02日
    浏览(42)
  • 注意力机制详解系列(一):注意力机制概述

    👨‍💻 作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 公众号: GoAI的学习小屋,免费分享书籍、简历、导图等资料,更有交流群分享AI和大数据,加群方式公众号回复“加群”或➡️点击链接。 🎉 专栏推

    2024年01月25日
    浏览(42)
  • 什么是注意力机制?注意力机制的计算规则

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

    2024年02月14日
    浏览(41)
  • 注意力机制(四):多头注意力

    专栏:神经网络复现目录 注意力机制(Attention Mechanism)是一种人工智能技术,它可以让神经网络在处理序列数据时,专注于关键信息的部分,同时忽略不重要的部分。在自然语言处理、计算机视觉、语音识别等领域,注意力机制已经得到了广泛的应用。 注意力机制的主要思

    2024年02月06日
    浏览(45)
  • 大白话分析注意力机制和空间和通道注意力机制

    深度学习小白,个人理解,有错误请友友们纠正QAQ 官方解释:注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。上述机制通常被称为注意力机制。 假设你正在准备

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

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

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

    SKNet(Selective Kernel Network) 是一种用于图像分类和目标检测任务的深度神经网络架构,其核心创新是 引入了选择性的多尺度卷积核(Selective Kernel)以及一种新颖的注意力机制 ,从而在不增加网络复杂性的情况下提升了特征提取的能力。SKNet的设计旨在 解决多尺度信息融合的

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

    SCSE注意力模块 (来自论文[1803.02579] Concurrent Spatial and Channel Squeeze Excitation in Fully Convolutional Networks (arxiv.org))。其对SE注意力模块进行了改进,提出了 cSE、sSE、scSE 三个模块变体,这些模块可以 增强有意义的特征,抑制无用特征 。今天我们就分别讲解一下这三个注意力模块。

    2024年02月13日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包