Transformer学习笔记(一)

Transformer学习笔记

基于 3B1B 可视化视频

自注意力机制

1.每个词的初始嵌入是一个高维向量,只编码该单词含义,与上下文没有关联

2.对初始向量进行位置编码,在高维向量中编码进位置信息(单词在语言序列中的位置信息),称此时的向量为E(GPT3中为12288维)

3.每个向量E,配有一个查询向量Q,用于向自身前面的向量序列查询信息(比如一个名词的查询向量中可能就蕴含着下面的问题:我的前面有没有对我的形容词?),每个向量的查询向量通过查询矩阵Wq生成: E·Wq -> Q. 因此,Wq的横向维度会与词向量的维度相match,纵向维度未要求(GPT-3中是128维)。所以E·Wq -> Q这个过程相当于把一个较高维的词向量映射到了一个低维空间。Wq矩阵在一个模型中是固定的,其中的参数是通过训练得到的。

4.每个向量E,同时配有一个键向量,用于回应查询向量的提问(比如后方有个词向量的查询向量问到:我的前方有没有形容我的形容词?键向量就用于回应这个查询向量),每个词向量的键向量通过键矩阵Wk生成:E·Wk -> K. 因此这个过程也是会把原本较高维度的词向量映射到一个低维空间(GPT-3中是128维)中。具体回应过程可以看成是在对比Q和K的匹配程度,匹配程度越高,说明该向量E与发出查询向量Q的E的关联性也就越大。这里用点积来衡量两个向量的匹配程度,点积结果越大,二者间的匹配程度越高,于是我们说,这个词E“注意到了”后面的词的嵌入。

在这里插入图片描述

5.如上图,在求出上述匹配度矩阵后,以匹配度作为权重,对每一列进行加权求和。因此我们想要把权重调整为在0-1之间的值并且其权重总和为1。因此,对每列权重数据做一次softmax()

在这里插入图片描述

将得到的矩阵称为Attention Pattern。

在一些模型中,我们往往会看到Cross-Attention,在Cross-Attention中,Wq和Wk会作用在不同的数据集上,如下图:

回到Self-Attention上,可以看见Transformer的原始论文中对Attention Pattern的表现形式:

在这里插入图片描述


从以上可以看出,每个词向量既接收来自身后的询问Q也接收来自词向量之前的询问Q。这样的做法会产生以下的效果:

训练时输入,“a fluffy blue creature roamed the verdant forest”,最终经过上述一系列计算根据forest的向量值输出下一个预测词,再根据输出与原本结果对模型参数进行调整,这样的过程固然可以,但效率太低。这一长串的文本只能对模型进行一次训练。由此我们提出一个方法:每输入一个词便进行一次预测训练。即达到以下效果:

a -预测下一个词                     
a fluffy -预测下一个词
a fluffy blue -预测下一个词
a fluffy blue creature -预测下一个词
a fluffy blue creature roamed -预测下一个词
a fluffy blue creature roamed the -预测下一个词
a fluffy blue creature roamed the verdant forest -预测下一个词

为了能使运算同步进行,每个词向量只对自己身后的词向量的查询进行匹配度回应,而不对自己之前的词向量发出的查询进行回应。或者说,每个向量只对自己之前的词向量发出查询请求,而不对自己身后的词向量发出查询请求(体现了自回归特性)。不然的话,比如此时训练序列为a fluffy blue creature roamed the此时forest收到了来自其前面词向量的查询并进行了回应,那就相当于透露了答案信息。

所以,在此,我们希望在Attention Pattern矩阵中主对角线的下半部分的值都为0。为了实现这一效果,在softmax之前将主对角线以下的值全部设为负无穷。这个步骤被称为Masking。(并不是所有的注意力机制都会运用此方法)

Masking这一步骤不仅在GPT的训练中用到,在使用GPT作为工具的时候也同样在运用。

从这也可以发现,随着文本输入越来越长,其Attention Pattern呈现平方指数级增长,因此这也成为了大语言模型的一个瓶颈,为解决这一瓶颈,有很多新的研究在进行中。


得到Attention Pattern过后,接下来介绍值向量V。每个词向量E配有一个值向量V,用于衡量自身的动量(例如:red hat,对于hat来说在高维空间指向的是初始embeding的位置,而加上red的值向量后,hat在高维空间中将指向红色帽子的位置)。每个词向量的值向量V通过值矩阵生成:Wv·E -> V。由于V最终要作为动量与词向量相加,所以V的维度要与词向量的维度一致,也因此Wv的纵向维度要与E一致(12288*12288)。Wv在模型中是固定的,其参数通过训练得到。在得到每个向量的值向量后,根据Attention Pattern中的响应程度,对每个词向量更新:
E j = E j + ∑ i = 1 j V i ∗ a t t e n t i o n S c o r e Ej=Ej+\sum_{i=1}^j Vi*attentionScore Ej=Ej+i=1jViattentionScore
以上为Single-Head Attention的工作流程。

对于Multi-Head Attention,即模型中有多个Wq、Wk、Wv矩阵,即每个词向量有多个查询向量V、键向量K,值向量V。可以将一幅Wq、Wk、Wv理解为一个Head(GPT3中有96个头),最终词向量的改变量为每个Head中的改变量相加。

在Transformer相关论文中Value矩阵通常会被转换为Wv↑和Wv↓两个矩阵相乘,此时Value矩阵特指Wv↓,这样做的目的是为了实现并行计算,但原理是相同的。


MLP多层感知器

我们对LLM输入Michael Jordan plays,大语言模型会输出basketball。对于一个不认识Michael Jordan的人来说,他能理解这句话的每个单词的含义,但是无法确定plays应该输出什么。所以,这个LLM一定存储了一个记忆,这个记忆就是Michael Jordan是打篮球的,这也是一个事实。LLM是如何记住这一事实的,即是我们要讨论的问题。

回想下手写数字识别的Neural Network,它的网络中也存储了一些记忆,能够识别输入图像的图形特征。带着这个思维,将能更好的理解Transformer中记忆的存储过程和结构。

在经过Self-Attention后,我们得到更新后的词向量序列。相较于初始的单词Embeding,此时的词向量序列embeded了更多的context信息。

MLP的结构如下图:

在这里插入图片描述

经过MLP时,各个词向量间不再相互影响,每个词向量并行的经过相同的运算。因此,关注一个词向量的运算过程就可以知道所有词的运算过程。

1.第一层映射

由于MLP的第一个矩阵会把词向量映射到更高的维度,所以称此矩阵为W↑。可以看成将矩阵W↑的行向量与词向量做点积,还记得Self-Attention中查询向量Q和键向量V吗?查询向量Q和键向量V做点积,从而计算出二者间的响应度(匹配度),这里也可以这样理解。可以把W↑的行向量看做一个个询问向量,向词向量询问各种问题,由此得出一个响应匹配度。在GPT3中W↑的纵向维度为4*12288。

之后加上一个Bias(用于增加参数调节的灵活度)。于是上述过程可用公式表示为:

接下来将蕴含响应度的向量通过一个激活函数,这里采用的是ReLU函数(很多模型会使用一个稍作修改的函数GELU)。

在经过激活函数后,我们得到类似于AttentionScore的向量,在Self-Attention中将值矩阵Wv乘以AttentionScore作为词向量的改变量。这里将该向量乘以W↓获得该词向量的补充信息(也要加上一个Bias向量),可以发现只有在第一轮映射中值大于0的地方(通过ReLU后被激活,这里没有考虑Bias对第一轮映射结果的改变),才会在第二轮映射中添加响应位置的向量。过程如下:

最后将获得的补充信息添加到词向量中得到一层MLP的完整运算过程:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为:geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下: {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

【数据库系列】 Spring Boot 集成 Neo4j 的详细介绍

Spring Boot 提供了对 Neo4j 的良好支持,使得开发者可以更方便地使用图数据库。通过使用 Spring Data Neo4j,开发者可以轻松地进行数据访问、操作以及管理。本文将详细介绍如何在 Spring Boot 应用中集成 Neo4j,包括基本配置、实体定义、数据…

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 📚mysql的安装📕MySQL的登录🌏MySQL配置免密码登录 📚mysql的…

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…

Docker:查看镜像里的文件

目录 背景步骤1、下载所需要的docker镜像2、创建并运行临时容器3、停止并删除临时容器 背景 在开发过程中,为了更好的理解和开发程序,有时需要确认镜像里的文件是否符合预期,这时就需要查看镜像内容 步骤 1、下载所需要的docker镜像 可以使…

C语言和C++的常量概念与区别分析

文章目录 💯前言💯常量的概念和作用💯C语言中 const 的应用与限制#define 和 enum 的使用方法 💯C 中 const 的计算方法和处理💯代码实例和应用区别💯C 和 C 的常量兼容性问题和负载💯分析 C 和…

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【大数据学习 | flume】flume Sink Processors与拦截器Interceptor

1. Failover Sink Processor 故障转移处理器可以同时指定多个sink输出,按照优先级高低进行数据的分发,并具有故障转移能力。 需要修改第一台服务器agent a1.sourcesr1 a1.sinksk1 k2 a1.channelsc1 a1.sources.r1.typenetcat a1.sources.r1.bindworker…

i春秋-登陆(sql盲注爆字段,.git缓存利用)

练习平台地址 竞赛中心 题目描述 先登陆再说 题目内容 就是一个登录框 测试登录 用户名:admin or 11# 密码:随便输 返回密码错误 用户名:随便输 密码:随便输 返回用户名不存在 这里就可以确定时一个bool盲注了 这里提供一个lik…

【爬虫实战】抓取某站评论

【爬虫实战】抓取某站评论 声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 方式一:JS逆向request发…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…

港湾周评|鼎益丰“庞氏骗局”陨落

《港湾商业观察》李镭 在坊间有着“老鼎”之称的鼎益丰迎来了全面陨落,这丝毫不出人意料,毕竟在一年前就已经暴雷了。 同样,仙风道骨般神采的鼎益丰老板隋广义也迎来人生的至暗时刻,应了无间道那句话,出来混总是要还…

创建vue插件,发布npm

开发步骤:1.创建一个vue项目,2.开发一个组件。 3.注册成插件。 4.vite和package.json配置。5.发布到npm 1.创建一个vue项目 npm create vuelatest 生成了vue项目之后,得到了以下结构。 在src下创建个plugins目录。用于存放开发的…

用paramiko与SSH交互

# 导入paramiko库用于SSH连接,以及sys库用于处理命令行参数 import paramiko import sys# 定义一个函数send_command,用于发送命令到SSH服务器并打印输出结果 def send_command(ssh_client, cmd):# 使用exec_command方法执行命令,并获取输入、…

Go语言中AES加密算法的实现与应用

一、前言 在当今的软件开发领域,数据安全至关重要。加密技术作为保护数据机密性的关键手段,被广泛应用于各个方面。AES(高级加密标准)作为一种对称加密算法,以其高效性和安全性在众多加密场景中占据重要地位。本文将详…

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

JavaScript 变量:理解基元和引用类型

两种基本类型的数据存储在 javascript 中的变量中:基元 和 引用类型。了解这两种类型之间的区别对于内存管理以及调节数据的共享、存储和更改至关重要。本文深入探讨了它们之间的区别,提供了现实世界的示例,并研究了有效处理这两种类型的方法…

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单,现在来模拟实现一下,理解其底层的原理。 ​ 在实现之前,应该知道,stack 和 queue 都是容器适配器,通过看官网文件也可以看出来;其默认的容器都是deque&#xff…