attention 注意力机制 学习笔记-GPT2

注意力机制

这可能是比较核心的地方了。

gpt2 是一个decoder-only模型,也就是仅仅使用decoder层而没有encoder层。

decoder层中使用了masked-attention 来进行注意力计算。在看代码之前,先了解attention-forward的相关背景知识。

在普通的self-attention 中,对于一个长为T的句子,对其中第t个单词。需要计算t和句子中所有T个单词的注意力。也就是使用词t的Q向量 q t q_t qt 和 T中的所有单词的key向量 k j , 0 < = j < = T k_j, 0<=j<=T kj,0<=j<=T相乘。得到词t和句子中其他单词的注意力得分。

在这里插入图片描述

于是对于词t和当前句子S, 得到了注意力得分向量,而后对该向量使用softmax. 标准化的同时得到softmax后的注意力得分。

然后使用 每个词对应的值向量与注意力得分相乘之后再求和
( v 1 , v 2 , . . . , v T ) ( s c o r e t 1 s c o r e t 2 . . . s c o r e t T ) = o u t t (v_1, v_2, ..., v_T) \begin{pmatrix}score_{t1}\\score_{t2}\\... \\score_{tT}\end{pmatrix} = out_t (v1,v2,...,vT) scoret1scoret2...scoretT =outt
这里要注意, s o c r e t i socre_{ti} socreti 是一个标量值,但是 v t v_t vt 是 一个向量,长度和词嵌入向量长度相同,相加时,对每个向量位置元素对应相加。

在这里插入图片描述

对于masked-attention呢,实际上就是计算注意力得分时候,对第t个单词,仅仅计算0到t单词的注意力得分,t~T 部分的注意力得分不计算,计算softmaxs时t之后的部分以初值0代替。

在这里插入图片描述

在这里插入图片描述

multi-head attention

前面了解了attention基本知识,就很好理解多头注意力了。多头注意力实际上就是将单个Q,K,V向量,分裂为多个头,然后和self-attention一样流程计算每个头的注意力,最后得到一个输出向量,然后将多个头的输出向量拼接到一起,得到最后的输出结果。

在这里插入图片描述

比如,原本的一个向量长度为 l e n g t h Q = = l e n g t h K = = l e n g t h V = = 168 length_Q == length_K == length_V == 168 lengthQ==lengthK==lengthV==168 分裂为12个注意力头之后,每个注意力头的QKV向量长度为 l e n g t h Q i = = l e n g t h K i = = l e n g t h V i = 64 , i ∈ [ 0 , 12 ] length_{Q_i} == length_{K_i} == length_{V_i} = 64, i \in [0,12] lengthQi==lengthKi==lengthVi=64,i[0,12]

然后和分裂的self-attention一样,对每个词t的第i个头的Q向量 Q t i Q_{t_i} Qti,与其他词的第i个头的K向量 K j i , 0 < = j < = t , i ∈ [ 0 , 12 ] K_{j_i}, 0<=j<=t, i\in[0,12] Kji,0<=j<=t,i[0,12] 内积,得到注意力得分。

而后和self-attention一样的,每一个注意力头的Value向量和该头的注意力得分相乘,得到该注意力头的结果。

对于12个头长度为64的attention,最后得到12个64长的注意力结果

再将其拼接,得到长为768的注意attention forward结果,和单个注意力头但是长为768的attention结果相同。

在这里插入图片描述

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

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

相关文章

Java 内存区域详解

对于 Java 程序员来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像 C/C程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作&#xff0c;不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机&#xff0c;一…

FluentUI使用

首先向Qt Qml FluentUI组件库的作者zhuzichu520致敬&#xff01; 一、源码下载地址&#xff1a; 1&#xff09;GitHub - zhuzichu520/FluentUI: FluentUI for QML 2&#xff09;GitCode - 全球开发者的开源社区,开源代码托管平台 二、Qt6下载地址&#xff1a; qt-online-i…

【UE5】在材质Custom写函数的方法

UE材质的Custom本身会构建为函数&#xff0c;所以并不能在Custom定义函数&#xff0c;但当然还是有办法的 总结一些在custom写函数的方法 常规办法 常规办法就是使用结构体作为函数使用 以一个Lerp功能函数演示 让我们看看写法&#xff1a; struct VolBlendFunc //定义结…

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员&#xff0c;终于找到一个真正免费的&#xff0c;遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

解决部署RKE2或K3S-“docker.io/rancher/mirrored-pause:3.6\“: -无法拉取镜像办法

一、根因 1、默认的仓库在docker你懂的。 二、修改拉取的仓库前缀 1、创建文件 /etc/rancher/k3s/registries.yaml k10-01:~ # cat /etc/rancher/k3s/registries.yaml mirrors:docker.io:endpoint:- "https://m.daocloud.io" *填充上即可。

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计好节点的数目 代码与解题思路 先读题&#xff1a;题目要求我们找出好节点的数量&#xff0c;什么是好节点&#xff1f;“好节点的所有子节点的数量都是相同的”&#xff0c;拿示例一…

Electron 项目启动外部可执行文件的几种方式

Electron 项目启动外部可执行文件的几种方式 序言 在开发 Electron 应用程序时&#xff0c;有时需要启动外部的可执行文件&#xff08;如 .exe 文件&#xff09;。这可能是为了调用系统工具、运行第三方软件或者集成现有的应用程序。 Electron 提供了多种方式来启动外部可执行…

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)

在前端开发中&#xff0c;模块化是一个重要的概念&#xff0c;不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module&#xff0c;因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…

SystemVerilog学习笔记(十):进程/细粒度进程控制

进程 进程或线程是作为独立实体执行的任何代码片段。fork-join块创建并行运行的不同线程。在下面的图-1中&#xff0c;可以看到进程的类型和进程控制。 序号进程描述1.fork-join只有所有子线程执行完毕时&#xff0c;父线程才会执行。2.fork-join_any只有任何一个子线程执行完…

javascript用来干嘛的?赋予网站灵魂的语言

javascript用来干嘛的&#xff1f;赋予网站灵魂的语言 在互联网世界中&#xff0c;你所浏览的每一个网页&#xff0c;背后都有一群默默工作的代码在支撑着。而其中&#xff0c;JavaScript就像是一位技艺精湛的魔术师&#xff0c;它赋予了网页生命力&#xff0c;让原本静态的页…

Golang | Leetcode Golang题解之第553题最优除法

题目&#xff1a; 题解&#xff1a; func optimalDivision(nums []int) string {n : len(nums)if n 1 {return strconv.Itoa(nums[0])}if n 2 {return fmt.Sprintf("%d/%d", nums[0], nums[1])}ans : &strings.Builder{}ans.WriteString(fmt.Sprintf("%d…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

[pyspark] pyspark中如何修改列名字

使用 .withColumnRenamed 来重命名&#xff0c;直接看demo&#xff1a; from pyspark.sql import SparkSessionspark SparkSession.builder.appName("example").getOrCreate()data [("Alice", 1, 200),("Bob", 2, 300),("Charlie",…

Leetcode 26 Remove duplicate elements

题意&#xff1a;在有序数组中删除重复元素 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 解法&#xff1a;双指针,i记录答案&#xff0c;j遇到重复的值就往后跳过 class Solution { public:int removeDuplicates(vector<int>&am…

InternVL 多模态模型部署微调实践

目录 0 什么是MLLM 1 开发机创建与使用 2 LMDeploy部署 2.1 环境配置 2.2 LMDeploy基本用法介绍 2.3 网页应用部署体验 3 XTuner微调实践 3.1 环境配置 3.2.配置文件参数解读 3.3 开始微调 4.体验模型美食鉴赏能力 0 什么是MLLM 多模态大语言模型 ( Multimodal Larg…

nVisual自定义工单内容

接口描述&#xff1a;创建工单。 URL地址&#xff1a;http://ip:port /wapi/v1/workOrderTasks 访问方法&#xff1a;POST 请求参数&#xff1a; form-data参数 参数名类型示例值必填说明taskTypeInteger7是任务类型idstartDateString2024/07/10是任务开始时间endDateStri…

MySQL【四】

插入数据 向数据表中插入一行数据 INSERT|REPLACE INTO 表名[(字段列表)] VALUES(值列表); ########## 在s表中插入一条记录&#xff1a;学号为s011,姓名为李思&#xff0c;性别为默认值&#xff0c;计算机专业 ########## insert into s(sno,sname,dept)values(s011,李思,计…

pgSQL-timescaledb复制表出现的问题

今日在工作中&#xff0c;需要复制一张timescaledb表&#xff0c;pgAdmin上复制一直未成功&#xff0c;或者我找错位置了。 1.我使用Navicate连接pgSQL&#xff0c;连上后选中相应表&#xff0c;右键复制结构即可 2.复制结构后&#xff0c;到pgAdmin中&#xff0c;将对应表下的…

Docker:技术架构的演进之路

前言 技术架构是指在软件开发和系统构建中&#xff0c;为了满足业务需求和技术要求&#xff0c;对系统的整体结构、组件、接口、数据流以及技术选型等方面进行的详细设计和规划。它是软件开发过程中的重要组成部分&#xff0c;为开发团队提供了明确的指导和规范&#xff0c;确…

PyQt入门指南五十二 版本控制与协作开发

在开发PyQt应用程序时&#xff0c;版本控制和协作开发是提高开发效率和项目可维护性的重要手段。本指南将介绍如何使用Git进行版本控制&#xff0c;以及如何使用GitHub进行协作开发。 版本控制基础 Git简介&#xff1a;Git是一种分布式版本控制系统&#xff0c;用于跟踪代码变…