【李宏毅 | 深度学习】自注意力机制(Self-attention)

news2024/12/26 23:19:21

这里写目录标题

    • 引言
    • Sequence Labeling
    • Self-attention
    • 矩阵乘法
    • Muti-head Self-attention(多头注意力机制)

引言

以往我们遇到的深度学习问题中,对于神经网络的输入一般都是一个向量,输出可能是一个类别。如果增加输入的复杂度,例如输入的是多个向量,或者每次输入的向量的个数是会改变的。例如,在文字处理中,如果把一句话中的每一个单词作为一个向量,那么一个输入就会有多个向量,又因为不同样本的句子长度不同,所以每次输入的向量的个数也是会改变的。

那么输出会是什么情况呢?
第一种可能性是输入的每个向量都对应了一个输出,输入和输出的长度是一样的。例如输入一句话,让机器判断这句话中的每一个单词的词性,那么此时输入输出的长度就是一样的。
第二种情况是只需要输出一个label。例如文本情感分析,输入一句话让机器判断这句话是正面的还是消极的等等。
第三种情况是,不知道需要多少输出,由机器自己判断输出的数量。例如机器翻译,输入和输出是不同的语言。

本文主要介绍第一种情况的解决方案,这种情况又叫做 Sequence Labeling

Sequence Labeling

想要实现输入多个向量,输出同样数目的标签label,有一种解决方案就是FC(Fully-connected,一个神经网络),对于每一个向量执行一次FC,然后输出对应的标签。
在这里插入图片描述
但是这样做有很大的弊端。例如在判断词性的例子中,我们将一句话作为一个输入,而一句话由多个单词组成,每个单词都有其对应的向量(向量的生成方式有两种,one-hot encoding 和 word embedding)。我们让每个单词都经过一次FC,得到其对应的词性。但是在上图的例子中,一句话中的两个saw是不同词性的,但是通过相同的网络得到输出没有理由是不一样的,因为输入的向量完全一样。

那么可以考虑这句话的上下文信息,把一个单词的相邻单词也考虑进去。一次输入一个window里面的向量。
在这里插入图片描述
但是这样的方法还是有弊端,如果我们有一个任务不是要考虑一个window就可以解决的,而是要考虑整句话才能解决。那么把window设置成一句话的长度可以吗?显然不行,因为我们一开始就说过,每一个输入样本的长度是不定的。那么把window设置成所有样本输入中最长的那个样本的长度可以吗?看似可以,但是这样做会需要学习太多的参数,可能会造成过拟合。那么有什么解决方法呢?这就需要用到本文要介绍的 self-attention 机制。

Self-attention

Self-attention 是怎么应用的呢? 首先要把一整个句子中的所有向量都经过 Self-attention,输入几个向量,就输出几个向量。得到的输出向量都考虑了整个句子的所有上下文信息。然后再将考虑了整句话信息的向量作为输入,进行FC得到对应的输出标签。
在这里插入图片描述
Self-attention 是怎么运作的呢?
首先 Self-attention 的输入是多个向量,这些向量可能是一整个神经网络的输入,也可能是某个隐藏层的输出,所以在这里用 a a a 来表示输入。输出的向量用 b b b 来表示,每一个 b b b 都是考虑了所有的 a a a 而生成的。下面我们介绍 b b b 是如何产生的,以 b 1 b^1 b1 为例。
在这里插入图片描述
首先我们要根据 a 1 a^1 a1 找到整句话中和 a 1 a^1 a1 相关的其它向量。每一个相关的向量和 a 1 a^1 a1 的关联程度用一个数值 α \alpha α 来表示。

那么我们怎么找到其它向量和 a 1 a^1 a1 之间的关联性呢?我们使用 Dot-product 的计算方式得到 α \alpha α 。将两个向量作为输入,分别乘一个矩阵后得到两个新的矩阵 q 和 k q 和 k qk,然后 q 和 k q 和 k qk做内积,得到一个数值就是 α \alpha α
在这里插入图片描述
那么我们现在将这种得到 α \alpha α 方式运用到我们的 self-attention 中。对于 a 1 a^1 a1 ,我们要对它分别和 a 2 a^2 a2 a 3 a^3 a3 a 4 a^4 a4 计算关联性。首先 a 1 a^1 a1 乘上 W q W^q Wq 得到 q 1 q^1 q1 向量, q 1 q^1 q1 有个名字叫做 query。接下来 a 2 a^2 a2 a 3 a^3 a3 a 4 a^4 a4 都要乘上 W k W^k Wk 得到 k k k 向量, k k k 有个名字叫做 key。 q 和 k q 和 k qk 做内积就得到了 a l p h a alpha alpha a l p h a alpha alpha 又叫做 attention score α 1 , 2 {\alpha}_{1,2} α1,2 就表示 a 1 a^1 a1 a 2 a^2 a2之间的 attention score。
在这里插入图片描述
在实际操作中, a 1 a^1 a1 也要和自己计算关联性,也要将 a 1 a^1 a1 乘上 W k W^k Wk 得到 k 1 k^1 k1 ,然后去计算自己的关联性。
在这里插入图片描述
计算出 a 1 a^1 a1 和所有向量之间的关联性之后,接下来要做一个 soft-max,得到 α ′ \alpha' α

然后我们根据 α ′ \alpha' α 抽取出这句话中的重要信息。我们将输入的每个向量先乘一个矩阵 W v W^v Wv 得到新的向量 v v v,然后再对每个 v v v 乘上对应的 α ′ \alpha' α 再加起来就得到了向量 b 1 b_1 b1
在这里插入图片描述
根据上面的介绍,我们会想象到,如果 a 1 a^1 a1 a 2 a^2 a2 的关联性比较强, α 1 , 2 ′ {\alpha}_{1,2}^{'} α1,2 得到的值比较大,那么最终得到的 b 1 b^1 b1 的值就可能会比较接近 a 2 a^2 a2

矩阵乘法

现在我们通过矩阵乘法的角度来看一看 self-attention 是怎样运作的。

第一步,以 q q q 为例,因为每个 a i a^i ai 都是乘一个矩阵得到对应的 q i q^i qi q i = W q a i q^{i}=W^{q}a^i qi=Wqai。我们把 a i a^i ai 拼接起来看作是一个矩阵 I I I,矩阵 I I I 的每一列就是 self-attention 的每一个输入,然后对 I I I左乘矩阵 W q W^q Wq,得到矩阵 Q Q Q Q Q Q 的每一列就是 q i q^i qi 。同理,我们可以得到 K , V K,V K,V
在这里插入图片描述
第二步,计算 attention score。我们把 k i k^i ki 拼接起来看作一个矩阵 K T K^T KT,每个 k i k^i ki 当作这个矩阵的一行,然后乘上矩阵 q 1 q^1 q1,就得到了一个矩阵,这个矩阵的每一行就是 a 1 a^1 a1 的每一个与之关联的 attention score。
在这里插入图片描述
同理, a 2 , a 3 , a 4 a^2,a^3,a^4 a2,a3,a4 也要计算 attention score,我们把 q i q^i qi 当作一个矩阵的列拼接成一个矩阵 Q Q Q Q Q Q 左乘 K T K^T KT 就得到了所有输入向量的 attention score,表示成矩阵 A A A,然后对 A A A 的每一列做 soft-max。
在这里插入图片描述
第三步,我们计算输出。我们把 v i v^i vi 拼接起来成矩阵 V V V,然后乘上矩阵 A ′ A' A,得到输出矩阵 O O O
在这里插入图片描述
综上,self-attention 的运作机制其实就是一连串的矩阵乘法。在这一系列矩阵中,只有矩阵 W q , W k , W v W^{q}, W^{k}, W^{v} Wq,Wk,Wv是未知的,是需要通过训练学习的参数。
在这里插入图片描述

Muti-head Self-attention(多头注意力机制)

以 2 heads 为例,先把输入向量 a a a 乘以一个矩阵得到 q q q,再把 q q q 乘以两个不同的矩阵得到两个不同的 q q q,这两个 q q q 用来表示两种不同的相关性。 q q q 有两个,对应的 k 和 v k和v kv 也都有两个。 然后分别计算得到 b i , 1 , b i , 2 b^{i,1},b^{i,2} bi,1bi,2
在这里插入图片描述
b i , 1 , b i , 2 b^{i,1},b^{i,2} bi,1bi,2 拼接起来,左乘一个矩阵,得到 b i b^i bi
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于open CV实现YOLOv3复现_预测阶段和后处理阶段

基于open CV实现YOLOv3复现_预测阶段和后处理阶段 1.导入所需的库:2.对输入的图像进行resize3.将图像输入yolov3的网络中进行预测,对三个特征层进行解码。4.非极大值抑制来去除多余的预测框完整代码 当训练好了模型后,用训练好的权重文件进行…

tftpd文件传输工具的学习记录

1.目的:在SOC板上的linux系统和本地电脑的windows系统进行文件的传输。 2.在windows中安装tftp服务器,其下载的文件如下: 链接: https://pan.baidu.com/s/1YN5WxcjqCJLHTtjhUtKbjg 提取码: 3cg9 3.打开软件,在当前目录下选择windows传输的…

TCP协议中常见的问题

文章目录 TCP协议中常见的问题谈一谈对OSI七层模型和TCP/IP四层模型的理解?谈谈TCP协议的3次握手过程?TCP协议为什么要3次握手?2次,4次不行吗?谈谈TCP协议的四次挥手过程?什么是流量控制?什么是…

报错处理:Error: Redis server is running but Redis CLI cannot connect

嗨,读者朋友们!今天我来跟大家分享一个我在运维过程中遇到的一个关于Linux上运行Redis服务时的报错及解决方法。 报错信息如下: Error: Redis server is running but Redis CLI cannot connect 这个报错信息表明Redis服务器已经运行&#xff…

stm32之GPIO库函数点灯分析

stm32官方为了方便开发者,利用CubeMX 生成HAL库有关的C代码。HAL库就是硬件抽象层(hardware abstraction layer),生成一系列的函数帮助我们快速生成工程,脱离复杂的寄存器配置。stm32相对于51来功能强大,但是寄存器的数量也不是一…

动手吧,vue数字动画

数字动画&#xff0c;有数字的地方都能用上&#xff0c;拿去吧&#xff01; 效果&#xff1a; 1、template部分 <template><div class"v-count-up">{{ dispVlaue }}</div> </template> 2、js部分 export default {data() {return {timer…

版本动态 | SolidUI 0.3.0 版本发布

文章目录 背景发版清单功能部署 示例html生成模型选择数据源 详细指引贡献者如何成为贡献者 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一…

摄像头工程师说 Camera - 数据格式 RAW、RGB(1)

Camera - 数据格式 RAW、RGB Camera 数据格式-RAW、RGB从摄像头工作的基本原理说起回归本质-图像色彩的几种表示方法RGB 三原色RAW RGB 格式诞生RAW8 VS RAW10真彩色-RGB888、BGR888 格式的引入数据量小点的 RGB 格式-RGB565、RGB555用位数表示的 RGB 格式RGB24&#xff1a;RGB…

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!

iPhone 15 系列机型已于今日正式发售&#xff0c;为解决iPhone15这些机型出现的数据迁移问题&#xff0c;苹果紧急发布了 iOS 17.0.2 更新&#xff0c;内部版本号为 21A350。 需要注意的是&#xff0c; iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 &#xff08;1&#xff09;rect() &#xff08;2&#xff09;strokeRect() &#xff08;3&#xff09;fillRect()和clearRect()函数 3.绘制圆弧 4.…

华为云云耀云服务器L实例评测 | 基于minikube搭建单节点kubernetes集群

目录 1 安装Docker2 conntrack-tools3 安装minikube4 下载二进制&#xff1a;kubeadm、kubectl、kubelet5 准备镜像6 启动minikube7 简单测试 ​ Minikube 是一个使用golang开发的单节点kubernetes集群环境&#xff0c;在资源紧张的情况下&#xff0c;可以用于快速搭建kubernet…

项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习

今天的主要工作集中在博士师兄的项目上&#xff0c;效率偏低&#xff0c;主要是一中午的时间都卡在晶振上。在焊接完芯片和晶振之后&#xff0c;测试晶振输出引脚无输出&#xff0c;所以就开始找各种博客&#xff0c;寻找晶振不起振的原因&#xff0c;在下面两篇文章中找到了答…

基于骨架的动作识别:SkeleTR: Towrads Skeleton-based Action Recognition in the Wild

论文作者&#xff1a;Haodong Duan,Mingze Xu,Bing Shuai,Davide Modolo,Zhuowen Tu,Joseph Tighe,Alessandro Bergamo 作者单位&#xff1a;The Chinese University of Hong Kong; AWS AI Labs. 论文链接&#xff1a;http://arxiv.org/abs/2309.11445v1 内容简介&#xff1…

JavaScript+canvas实现粒子动画效果

1.HTML部分 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果</title><style&g…

OpenAI官方吴达恩《ChatGPT Prompt Engineering 提示词工程师》(7)聊天机器人 / ChatBot

聊天机器人 / ChatBot 使用大型语言模型来构建你的自定义聊天机器人 在本视频中&#xff0c;你将学习使用OpenAI ChatCompletions格式的组件构建一个机器人。 环境准备 首先&#xff0c;我们将像往常一样设置OpenAI Python包。 import os import openai from dotenv import…

图像练习-答题卡opencv(02)

原图 结果 代码 // Load source imagecv::Mat src cv::imread("answer_card.jpg", cv::IMREAD_COLOR);if (src.empty()){return;}cv::Mat gray;cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);cv::Mat binary;double value cv::threshold(gray, binary, 0, 255, …

用PHP实现极验验证功能

极验验证是一种防机器人的验证机制&#xff0c;可以通过图像识别等方式来判断用户是否为真实用户。在实现极验验证功能时&#xff0c;您需要进行以下步骤&#xff1a; 1 注册极验账号&#xff1a; 首先&#xff0c;您需要在极验官网注册账号并创建一个应用&#xff0c;获取相应…

x_ctf_b0verfl0w

x_ctf_b0verfl0w Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;保护全关&#xff0c;写shellcode int vul() {char s[32]; // [esp18h] [eb…

mac安装 scala 详细教程(包含在 idea 上使用,以及scala插件安装)

目录 一 下载解压 二 配置环境变量 三 测试 scala 四 idea 编写 scala 文件 1. 安装插件 scala 插件 2. 使用 idea 创建 scala 工程 3. 使用idea 创建 maven 工程开发 scala 一 下载解压 去官网选择合适的版本下载 官网地址https://www.scala-lang.org/download/all.…

RocketMQ高性能核心原理与源码架构剖析

文章目录 1、源码环境搭建1.1、主要功能模块1.2、源码启动服务1.2.1、 启动nameServer1.2.2、 启动Broker1.2.3、 发送消息1.2.4、 消费消息 2、源码剖析2.1、NameServer的启动过程2.2、Broker服务启动过程2.3、Netty服务注册框架2.3.1、关注重点2.3.2、源码重点 1、源码环境搭…