自注意力机制(1)

news/2024/9/21 11:47:09/文章来源:https://www.cnblogs.com/kzin/p/18423767

自注意机制

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 sqrtclass Self_attention(nn.Module):def __init__(self, d_in, d_q, d_out):super(Self_attention, self).__init__()self.din = d_inself.dq = d_qself.dout = d_outself.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.shapeassert din == self.din   # 判断输入数据维度是否正确# 第一步Q = self.Wq(x)  # m*dqK = self.Wk(x)  # m*dqV = 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*doutreturn C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800918.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给 DSL 开个脑洞:无状态的状态机

阿里妹导读:什么是 DSL ?DSL 是一种工具,其核心价值在于提供了一种手段,可以更加清晰地就系统某部分的意图进行沟通。本文将通过实现一个状态机引擎来看清 DSL 的本质,介绍状态机的核心模型和 Fluent 接口,并解决状态机的性能问题。最近在一个项目中,因为涉及很多状态的…

帝国cms编辑 帝国cms编辑器不能粘贴复制文字

当帝国CMS的编辑器不能粘贴复制文字时,可能是因为编辑器的某些设置或浏览器的限制导致的。以下是一些可能的解决方案: 1. 检查编辑器设置 确保编辑器的设置允许粘贴和复制。 解决方法:查看编辑器选项:在帝国CMS的后台,检查编辑器的设置,确保允许粘贴和复制操作。 使用粘贴…

FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher

​EasyPusher是一款国产的RTSP直播录制推流客户端工具,它支持Windows、Linux、Android、iOS等操作系统。EasyPusher采用RTSP推流协议,其中安卓版EasyPusher的Github托管地址为https://github.com/EasyDarwin/EasyPusher-Android。不过EasyPusher有好几年没更新了,尤其安卓版…

帝国cms 您的用户名、密码或安全答案有误,也可能您的帐号已被禁用,请重输

当你忘记了帝国CMS 的后台密码时,可以通过直接修改数据库中的用户信息来重置密码。以下是重置密码的步骤: 步骤1:进入phpMyAdmin 首先,你需要登录到你的服务器,并通过phpMyAdmin或者其他的数据库管理工具访问你的数据库。 步骤2:找到phome_enewsuser数据表 在数据库管理工…

安装帝国cms时输入安装地址,出现404错误

当你在安装帝国CMS时输入安装地址却遇到404错误,这意味着服务器无法找到你所请求的安装脚本页面。这个问题可能是由多种因素引起的,以下是一些常见的解决方法: 1. 检查安装包是否完整 确保你下载的帝国CMS安装包是完整的,并且所有文件都已正确上传到服务器。 解决方法:重新…

帝国cms刷新首页空白怎么办

当帝国CMS刷新首页后出现空白的情况时,这可能是由多种原因造成的。以下是一些常见的解决方法: 1. 检查数据库连接 确保数据库连接正常。 解决方法:检查数据库配置:打开e/config/config.php文件,确认数据库连接信息(如主机名、用户名、密码、数据库名)正确。 测试数据库连…

manim边学边做--空心多边形

空心的多边形Cutout是一种比较特殊的多边形,主要用于解决与形状、大小、位置等相关的数学问题。 Cutout多边形可以定义物体表面的空洞或凹陷部分,从而更准确地模拟现实世界中的复杂形状。 比如,在PCB(印制电路板)设计中,通过放置Cutout空心的多边形,设计师可以精确地控制…

Apache-Shiro =1.2.4 反序列化漏洞 (代码审计)

一、Apache Shiro 简介: Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都…

帝国cms安装时配置数据库出现错误

在安装帝国CMS时配置数据库出现错误,可能是由于多种原因造成的。以下是一些常见的解决方法,帮助你解决安装过程中遇到的数据库配置错误: 1. 检查数据库连接信息 确保数据库连接信息正确无误。 解决方法:数据库服务器地址:确保输入的数据库服务器地址正确。 数据库用户名和…

帝国cms安装时的出现的错误怎么解决

在安装帝国CMS时遇到错误,可以根据错误的具体情况采取不同的解决措施。以下是一些常见的错误及其解决方法: 1. HTTP 500 内部服务器错误 如果在安装过程中遇到HTTP 500错误,这通常意味着服务器端发生了错误。 解决方法:查看错误日志:登录到服务器,找到帝国CMS安装目录下的…

帝国cms时间显示为1970-01-01

当帝国CMS中的时间显示为1970-01-01时,通常是因为系统中的时间字段没有被正确设置或更新。以下是解决此问题的一些方法: 1. 检查字段设置 确保在建立系统模型时,时间字段(如newstime)已经被设置为可录入、可修改和可增加。 解决方法:在帝国CMS后台,进入“系统” -> “…

谷歌收录查询工具,Google收录查询工具操作教程

谷歌收录查询工具是帮助网站所有者或SEO专业人士了解网站在谷歌搜索引擎中收录情况的重要工具。以下是一些常用的Google收录查询工具及其操作教程: 一、Google Search Console(谷歌搜索控制台) 功能概述: Google Search Console是一个免费的服务,它帮助网站所有者监控和管…