首页 > 其他分享 >自注意力机制(1)

自注意力机制(1)

时间:2024-09-21 11:46:42浏览次数:9  
标签:... din self 矩阵 机制 注意力 向量 out

自注意机制

1. 自注意机制的特点

考虑这样一个问题,输入长度为m的序列\(\{x_1, x_2,...,x_m\}\),序列中的元素都是向量,要求输出长度同样为m的序列\(\{c_1, c_2,...,c_m\}\),另外还有两个要求:

  1. 序列的长度m是不确定的,可以动态变化,但是神经网络的参数数量不能变。
  2. 输出的向量\(c_i\)不仅仅和\(x_i\)有关,而是依赖于所有新的输入向量\(\{x_1, x_2,...,x_m\}\)。

传统的RNN不能解决上述问题,因此传统RNN的输出\(c_i\)只依赖于\(\{x_1, x_2,...,x_i\}\),而不依赖于\(\{x_{i+1},...,x_m\}\)。自注意机制就能很好的解决上述问题。

2. 数学形式

输入:\(X=\{x_1, x_2,...,x_m\}\),\(x_i\)是\(d_{in}\times1\)的向量。

三个参数矩阵:\(W_q:d_q*d_{in}\); \(W_k:d_q*d_{in}\); \(W_v:d_{out}*d_{in}\)。

无论输入序列有多长,参数矩阵不需要发生改变,这三个参数矩阵需要从训练数据中进行学习

输出:\(C=\{c_1, c_2,...,c_m\}\),\(c_i\)是\(d_{out}\times1\)的向量。

计算步骤:

  1. 第一步将输入\(x_i\)映射为三元组\(\{q_i,k_i,v_i\}\):

    1. \(q_i=W_q*x_i\),\(q_i\)的大小是\(d_q\times1\)。
    2. \(k_i=W_k*x_i\),\(k_i\)的大小为\(d_q*1\)。
    3. \(v_i=W_v*x_i\),\(v_i\)的大小为\(d_{out}*1\)。

    第一步将输出映射为三元组,上述是每个元素的计算过程。在实际计算中,会得到三个矩阵,\(Q=\{q_1, q_2,...,q_m\}\)大小为\(d_q\times m\),\(K=\{k_1,k_2,...,k_m\}\)大小为\(d_q\times m\),\(V=\{v_i, v_2,...,v_m\}\),大小为\(d_{out}\times m\)。

  2. 第二步利用\(q_i\)和\(K\)计算权重向量\(a_i\):

    1. \(a_i=\text{softmax}(<q_i,k_1>,<q_i, k_2>,...,<q_i, k_m>), i=1,..,m\)

    上述的<,>表示内积,\(\text{softmax}\)函数导致\(a_i\)中所有元素的和为1,每个元素对应着与\(\{x_1, x_2,...,x_m\}\)的重要程度,权重矩阵\(A=\{a_1,a_2,...,a_m\}\),大小为\(m \times m\) 。

  3. 第三步利用权重矩阵\(A\)和\(V\)矩阵得到最终的输出矩阵\(C=\{c_1, c_2,...,c_m\}\),第\(i\)个输出向量\(c_i\)依赖于\(a_i\)和\(\{v_1, v_2,..., v_m\}\):

    1. \(c_i=[v_1, v_2,..,v_m]*a_i=\sum_{j=1}^m a_i^j*v_j, i=1,..,m\)

    \(c_i\)是向量\(\{v_1, v_2,..., v_m\}\)的加权平均,权重是\(a_i=[a_i^1, a_i^2,...,a_i^m]\)。\(c_i\)的大小是\(d_{out}\times 1\)。整个输出矩阵\(C\)大小为\(d_{out}\times m\)。

为什么要叫“注意力”呢,我们看最后的输出\(c_i=a_i^1v_1+a_i^2v_2+\cdot \cdot+a_i^mv_m\),权重\(a_i=[a_i^1, a_i^2,...,a_i^m]\)反映出\(c_i\)最关注那些输入的\(v_i=W_v*x_i\),如果权重\(a_i^j\)大,说明\(x_j\)对\(c_i\)的影响较大,应当重点关注。

3. Pytorch代码实现(单头自注意层)

import torch 
import torch.nn as nn
from math import sqrt

class Self_attention(nn.Module):
    def __init__(self, d_in, d_q, d_out):
        super(Self_attention, self).__init__()
        self.din = d_in
        self.dq = d_q
        self.dout = d_out
        
        self.Wq = nn.Linear(self.din, self.dq, bias=False)
        self.Wk = nn.Linear(self.din, self.dq, bias=False)
        self.Wv = nn.Linear(self.din, self.dout, bias=False)
        
        self._norm_fact = 1/sqrt(self.dq)   # 归一化层
        
    def forward(self, x):
        m, din = x.shape
        assert din == self.din   # 判断输入数据维度是否正确
        
        # 第一步
        Q = self.Wq(x)  # m*dq
        K = self.Wk(x)  # m*dq
        V = self.Wv(x)  # m*dout
        
        # 第二步
        A = torch.softmax(torch.matmul(Q, K.T)*self._norm_fact, dim=-1)  # m*m
  		
        # 第三步
        C = torch.matmul(A, V)  # m*dout
                
        return C
                     

标签:...,din,self,矩阵,机制,注意力,向量,out
From: https://www.cnblogs.com/kzin/p/18423767

相关文章

  • 深入理解CAS机制
    CAS(Compare-and-Swap)是一种无锁算法,常见于无锁数据结构的实现中,以实现多线程环境下的原子操作。广泛应用于并发控制中,特别是在实现线程安全的数据结构和算法时。一、CAS原理CAS机制全称是Compare-and-Swap,即比较并替换。它的基本思想是通过比较内存中的值与预期值,如果相等则更新......
  • YOLOv8改进 - 注意力篇 - 引入ECA注意力机制
    一、本文介绍作为入门性第一篇,这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析,ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。二、ECA原理分析ECA官方论文地址:ECA文章ECA的pytorch版代码:ECA的pytorch代码ECA注意力机制:深度卷积神经网络的高效通......
  • kubernetes安全机制
    目录1.安全机制说明2.认证——Authentication2.1认证的方式2.2认证组件2.2.1需要被认证的访问类型2.2.2安全性说明2.2.3证书颁发2.3kubeconfig2.4ServiceAccount2.5Secret与SA的关系2.6总结3.鉴权——Authorization4.准入控制——AdmissionControl5.总结5.1认证(Authentication):......
  • Linux VDSO 机制及其在系统调用优化中的作用
    linux-vdso.so是Linux操作系统中虚拟动态共享对象(VDSO)的一部分。它是Linux内核用来加速某些系统调用的一种机制。传统上,系统调用是通过从用户空间切换到内核空间来完成的,这会带来一定的性能开销。而linux-vdso.so则允许某些系统调用在用户空间中执行,从而减少了上下文切换的......
  • mybatis一级缓存机制
    在mybatis中一级缓存是默认打开的,二级缓存没有默认打开,需要主动配置。今天我们主要来说一级缓存的执行机制。 首先,我们应该了解为什么有缓存如果没有缓存,那么java程序每次去数据库取数据的时候,都会直接去数据库取,如果取的是相同的数据,会大大影响效率,因为与数据库的链接本质......
  • 深入理解 Docker Exec 与 Dockerfile CMD 的执行机制|容器启动|优化|命令执行
    在容器化应用的开发与部署过程中,Docker扮演着极为重要的角色。对于使用Docker的开发者而言,如何正确地执行容器中的命令是至关重要的。Docker提供了多种方式来运行容器中的命令,其中最常见的是Dockerfile中的CMD指令和运行时使用dockerexec命令。本文将深入探讨这两者的区......
  • git使用“保姆级”教程2——初始化及工作机制解释
    1、设置用户签名解释:签名的作用就是用来:标识用户,以区分不同的开发人员简单来说:用来标识"你是谁",在提交代码时,会显示提交代码的是谁,把设置的信息一起提交上去设置://建议最好global全局设置,这样可以在任何文件下使用git时,都不用重新设置用户签名了gitconfig--glo......
  • Flink的反压机制:底层原理、产生原因、排查思路与解决方案
            反压(Backpressure)是流处理框架(如ApacheFlink)中非常重要的概念。反压的产生和有效处理,直接影响整个流处理作业的稳定性和性能。本文将从Flink的底层原理、反压产生的原因、如何排查反压问题,以及如何解决反压问题等方面进行详细讨论。1.Flink反压的底层原......
  • Flink 中 Checkpoint 的底层原理和机制
            Flink的Checkpoint机制是ApacheFlink在流式处理中的一个核心特性,保证了分布式数据流处理系统的 容错性。通过定期保存 状态快照(checkpoint),即使在发生故障时,Flink也可以恢复到之前的状态,确保处理的正确性。为了全面解释Flink的Checkpoint底层实现......
  • Redis哨兵机制sentinel集群配置
    一、安装redis1主2从集群略二、复制sentinel.conf文件到指定目录修改sentinel.conf配置port26379dir"/tmp"logfile"/usr/local/redis/logs/sentinel-26379.log"daemonizeyessentinelmonitormymaster10.211.55.763792sentinelauth-passmymasterlinlinsen......