LLM在Transformer上的改动

LLM在Transformer上的改动

  • 1.multi-head共享
    • 1.1BERT的逻辑
    • 1.2multi-head共享
  • 2.attention的前后网络
    • 2.1传统Transformer:
    • 2.2GPTJ结构:
  • 3.归一化层的位置(LayerNorm)
  • 4.归一化层函数的选择
    • 4.1LayerNorm
    • 4.2RMSNorm
  • 3.激活函数
  • 4.LLama2结构
  • 5.MoE架构
  • 6.位置编码
    • 6.1位置编码的用处
    • 6.2长度外推性
    • 6.3主流位置编码
    • 6.4正余弦位置编码
      • 6.4.1编码的逻辑
      • 6.4.2正余弦编码值计算
    • 6.5可学习位置编码
    • 6.6ROPE相对位置编码
    • 6.7Alibi位置编码

1.multi-head共享

简介: 即在计算时,共享一些注意力权重,即用同一份。现在普遍使用的是Grouped-query模式。

1.1BERT的逻辑

在Self-Attention时如下:

  1. 输入分布经过三个线性层,变为Q、K、V,其形状为:h_d* h_d,即768 * 768
  2. BERT的注意力头(n_h)是12,隐含层(h_d)为768
    3.此时的进入注意力头后,Q、K都转换成:n_h个:L * h_d;这里的h_d就是64,因为总数是768,拆分了12个头得到的。
  3. 通过K转置后与Q相乘,注意力计算成为: L * L

1.2multi-head共享

示意图:(下面只是示意图,实际数量以具体为准)
在这里插入图片描述
原理: 用Bert举例,在进行注意力计算时,是有12个注意力头;现在呢:Q保持不变;K、V,比如:只采用6个头;那么计算的时候,每两个Q和同一个K计算、与同一个V计算。这样就共享了K、V权重参数。

Grouped-query计算逻辑如下:

  1. 进行线性层计算,得到Q、K、V时,输入是L * h_d; Q的线性矩阵为h_d * h_d; K、V由于注意力头只有原来的一半;而在与Q的矩阵计算注意力时,h_d=64,没有变。所以这里的K、V线性矩阵会变为:h_d * h_d/2;即768 * 384
  2. 进入注意力计算后,每两个Q和相同的一个K相乘,结果还是12份,注意力矩阵还是:L * L,接着每两个再与相同的V相乘,输出的结果矩阵形成不变:
    好处: 减少线性层W的大小,并且结果表示,减少一些参数,效果没有太明显的损失。

Multi-query计算逻辑如下:

**释义:**在Grouped-query时,是多份Q,与同一份K、V计算;Multi-query就是极端情况,每一层,所有的Q在计算注意力时,都与同一份K、V计算。

计算逻辑简介

1.以Bert为例:则线性层的K、V矩阵就变成h_d* h_d/12;即真实结果就是768 * 64.
好处: 降低了较大的权重参数量,模型计算速度也加快了。

2.attention的前后网络

简介: 这种网络结构的调整,称为GPTJ结构,即平行放置attention layer和feed forward layer层。

使用的模型: moss, palm(谷歌)用的这种结构,目前不算太主流。

2.1传统Transformer:

示意图:
在这里插入图片描述
计算的公式: 在这里插入图片描述

2.2GPTJ结构:

示意图:
在这里插入图片描述
公式如下:
在这里插入图片描述
对比释义:

  1. GPTJ将原来的Transformer的attention layer和feed forward layer层并行放置,少了一个残差计算、一个LayerNorm(归一化层
  2. 这种结构的调整,会导致前馈网络的计算结果和原来的有区别,原来的输入是过了self-attention的参数;但是现在是直接hidden输入的。
  3. 公式中的MLP指的是FeedForward
    结果: 在某些模型上表现还可以,但是主流还是传统的transformer结构。

3.归一化层的位置(LayerNorm)

在这里插入图片描述

  1. Post-LN:layer norm位于残差链接之后
    a. 使用post-LN的深层transformer容易出现训练不稳定的问题
  2. Pre-LN(前归一化):layer norm位于残差链接之中
    a. 相比于Post-LN,使用Pre-LN的深层transformer训练更稳定,可以缓解训练不稳定问题
    b.相比于Post-LN,Pre-LN的模型效果略差
  3. Sandwich LN(三明治归一化):在pre-LN的基础上额外插入了一个layer norm
    a. Cogview用来避免梯度爆炸的问题
    b. 缺点:训练不稳定,可能导致训练崩溃

目前是Pre-LN方式,模型用的多一些。

4.归一化层函数的选择

4.1LayerNorm

公式如下:
一
释义: 先计算张量的均值,再计算方差
在这里插入图片描述
释义: 通过原始张量减去均值,除以方差,再乘可以训练的参数gi;一般还会加上bi。这两个g、b都是可以训练的参数。

4.2RMSNorm

公式如下:
在这里插入图片描述
释义: 先对张量的值求平方,求和,求平均开根号得到的值,作为分母,每一个值做分子相除,最后除以一个可以训练的参数gi。目前主流是使用RMSNorm。

3.激活函数

示意图:
在这里插入图片描述
释义:

  1. 在初始的Transformer中,FeedFoward层使用的激活函数是relu
  2. 在BERT中,做了一定的改进,FeedFoward层使用的是gelu
  3. 现在的大语言模型中,在FeedFoward主要使用的是swish
  4. 在swish公式中,可以简略的看成是一个x与Sigmoid的相乘,其中beta是一个常数,常取1。这是一种gate机制,门控。
  5. 在这里使用swish会增大计算量,在前面的线性层现在的模型会降低参数,比如在Bert会映射到4倍的线性层上,现在大概会映射到1-2倍之间。

4.LLama2结构

示意图
在这里插入图片描述
释义:

  1. Transformer Block的改动,在前面的内容中有提到;在LLama2中一个叠加32层。
  2. 调整1:归一化层使用RMSNorm
  3. 调整2: self-attention采用了Grouped-query的形式
  4. 调整3: 位置编码有调整,RoPE
  5. 调整4:残差的方式连接有调整,为Pre-LN
  6. 调整5:FeedFoward的有调整,两个线性层和激活函数SiLU整体看做swish机制其中的激活函数采用SiLU,可以理解为Sigmoid,只是多了-beta

5.MoE架构

简介: MoE架构,又称为混合专家模型,即在一层transformer中,多个FeedFoward并行,通过一个线性网络层,去判断使用那个、或者那几个的FeedFoward层。

原理: 在FeedFoward中,考虑一个有可能并不能适用不同的任务或者是数据,所以用多个FeedFoward以图去适配不同的数据或者任务,即专家的概念。

示意图:
在这里插入图片描述
释义:

  1. 通过图中可以看到,FeedFoward由多个组成,通过一个线性层router去判断使用那些FeedFoward;可以是1个,也可以是多个。
  2. Mixtral是该架构,据传GPT4也是
  3. FeedFoward可以是传统的结构,也可以是LLama2的结构。
  4. router是一个分类的线性层,是在模型训练时,学习到的;
  5. 训练时,走某一个FeedFoward,反向传播时,也会训练走的FeedFoward。

6.位置编码

6.1位置编码的用处

简介: 由于transformer中除了激活层和归一化层外,使用的都是线性层,编码过程中没有明显的位置信息;字词位置的交换,仅相当于矩阵中行位置的交换;这带来并行计算的优势,但是也弱化了语序信息;因此需要引入位置编码来弥补。

示意图:
在这里插入图片描述
释义:

  1. 上面的两个张量相乘,交换张量中的向量位置后,计算得到的结果数值并没有变化,只是顺序改变了,这样的变化不够明显,或者说经过pooling后,位置信息可能就遗失了。
  2. Bert当中就设计了位置编码的向量,使得位置的信息能够保存在向量中,不同的顺序结果差距较大。Bert的位置编码是固定的512位,这也导致输入的内容有限。

6.2长度外推性

简介: 预测时序列长度比训练时候长,模型依然有好的表现,称为有较好的长度外推性。

举例:

  1. 训练样本最大长度512
  2. 预测过程输入样本长度1024

长度外推性是一种理想的性质,并非是必要的。没有,模型也能用,只是有场景限制。

6.3主流位置编码

在这里插入图片描述

6.4正余弦位置编码

6.4.1编码的逻辑

编码逻辑: 位置编码向量 + token向量 -->得到编码后的embedding ;即:Positional Encoding

示意图如下:
在这里插入图片描述
**释义:**其中红色圈住部分就是正余弦编码值。

6.4.2正余弦编码值计算

公式如下:
在这里插入图片描述
计算示意图:
在这里插入图片描述
详细释义:

  1. pos表示输入的文本的字符位置
  2. i代表一个字符的token维度的序号,由于是正弦余弦交替编码的,所以序号是两个为一组的。一组先后进行sin计算和cos计算。,这样2i;或者2i+1才能准确定位到具体的token维度位置。
  3. 正弦余弦在同一个文本字符位置、和token维度位置时,其位置编码是值是固定的。
    优点: 不管输入多长的内容,都能得到位置编码。
    缺点: 由于位置的编码值是固定的,效果相对会没有能够根据语料学习的好。

6.5可学习位置编码

简介: 一般称为position embedding,以Bert为代表;如同token embedding一样,随机初始化之后,靠梯度反传学习调整;缺点在于无法外推,需要预设最大长度.

举例: 比如在Bert中,位置编码长度为512,超过这个长度就无法输入数据了。
示意图:
在这里插入图片描述

6.6ROPE相对位置编码

简介: 希望语料中词的相对位置作为位置编码,记录语序的信息;比如:“我今天要去爬山!” 中“今”与“天”的相对位置就是1;这样的,预计就会有较好的外退性。根据这个逻辑,那位置编码是个矩形,因为每一个字都与其他所有字有个相对位置,加在注意力矩阵,岂不完美。相对位置编码这里介绍的两种都是不用训练的。

示意图
在这里插入图片描述
思想释义: 上述矩阵是一个传统的self-attention计算的结果,在位置信息上,只需要在每一个格子中,加入到相对位置信息即可,比如”错“和“不”即在值为0.11的格子中,加入位置相对为1的信息即可。

计算公式如下:
在这里插入图片描述
释义:

  1. 传统的Transformer中,Q、K是与对应矩阵W相乘;上面公式中,加入了e的指数;其中指数值中,包含位置m、n
  2. 通过三角函数变化得到最后的公式,即Q、K相乘的结果与Xm、Xn、还与它们相对位置m-n有关。即加入了相对位置信息。
  3. 会造成远距离的相关性下降,即m-n之间的差距太远。

6.7Alibi位置编码

简单来说,也是相对位置编码,示意图如下
在这里插入图片描述

释义:

  1. 这种方法简单粗暴,即在原来的Q*K的矩阵上,加上相对位置信息矩阵。
  2. 相对位置信息矩阵,每个格子的值,直接就是位置序号的差,再乘于一个系数。

系数: 系数与注意力的多头数量有关,是相体现位置信息有些句子、有些情况下不重要的意思。情况如下:

在这里插入图片描述

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

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

相关文章

git命令及原理

git: 目录则被称之为“树” 文件被称作 Blob 对象. git help <command>: 获取 git 命令的帮助信息 git init: 创建一个新的 git 仓库&#xff0c;其数据会存放在一个名为 .git 的目录下 git status: 显示当前的仓库状态 git add <filename>: 添加文件到暂存区 git …

scala 迭代更新

在Scala中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如数组、列表、集合等&#xff09;的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素&#xff0c;而无需关心集合的具体实现。 在Scala中&#xff0c…

快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)

1.类的定义 与 实例化对象 在python中使用class关键字创建一个类。 举例子 class Stu(object):id 1001name 张三def __init__(self):passdef fun1(self):pass# 实例化对象 s1 Stu() s2 Stu() print(s1.name) print(s2.name) 第一个方法 __init__是一种特殊的方法&#x…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

BFS 算法专题(三):BFS 解决边权为 1 的最短路问题

目录 1. 迷宫中离入口最近的出口 1.1 算法原理 1.2 算法代码 2. 最小基因变化 ★★★ 2.1 算法原理 2.2 算法代码 3. 单词接龙 3.1 算法原理 3.2 算法代码 4. 为高尔夫比赛砍树 (hard) 4.1 算法原理 4.2 算法代码 1. 迷宫中离入口最近的出口 . - 力扣&#xff08;…

Flink_DataStreamAPI_执行环境

DataStreamAPI_执行环境 1创建执行环境1.1getExecutionEnvironment1.2createLocalEnvironment1.3createRemoteEnvironment 2执行模式&#xff08;Execution Mode&#xff09;3触发程序执行 Flink程序可以在各种上下文环境中运行&#xff1a;我们可以在本地JVM中执行程序&#x…

46.第二阶段x86游戏实战2-拆解自动打怪流程

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

解决C盘空间不足的三种方案

方案一&#xff1a;网上盛传的C盘磁盘碎片整理&#x1f9e9;&#xff08;原理&#xff1a;将分散的文件片段整理到相邻的磁盘区域&#xff0c;减少文件的碎片化程度&#xff09;(效果不明显) 方案二&#xff1a;把其他盘的空间给C盘 &#x1f4bd;&#xff08;效果显著&#xf…

同一套SDK 兼容第二块板卡

尽可能分开写,避免兼容性变差

计算机网络高频八股文面试题及参考答案

请简述 TCP 和 UDP 的区别&#xff1f; TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;是两种不同的传输层协议&#xff0c;它们有以下区别。 从连接方式上看&#xff0c;TCP 是面向连接的协议。在通信之前&#xff0c;需要通过三次握手…

前缀和算法习题篇(上)

1.一维前缀和 题目描述&#xff1a; 解法一&#xff1a;暴力解法&#xff1a;模拟 时间复杂度是O(n*q),会超时。 解法二&#xff1a;前缀和解法&#xff1a;快速求出数组中某一个连续区间的和 快速是指O(1),前缀和思想可把时间复杂度可降到O(q)。 算法思路&#xff1a; 先预处…

uniapp路由与页面跳转详解:API调用与Navigator组件实战

UniApp路由与页面跳转详解&#xff1a;API调用与Navigator组件实战 路由 uniapp页面路由为框架统一管理&#xff0c;开发者需要在page.json里面配置每个路由页面的路径及页面样式。 路由跳转 uniapp有两种页面路由跳转方式&#xff0c;调用API跳转和navigator组件跳转。 调…

linux-DNS解析

dns解析 dns&#xff1a;域名系统&#xff0c;将域名和ip地址互相映射的一个分布式的数据库&#xff0c;方便用户访问互联网。 ip地址&#xff1a;是所有设备和网站在互联网上的唯一地址&#xff0c;通信一定是ip和ip之间的通信。 dns解析&#xff1a;根据域名在互联网当中找…

Playwright 快速入门:Playwright 是一个用于浏览器自动化测试的 Node.js 库

Playwright 是一个用于浏览器自动化测试的 Node.js 库&#xff0c;它支持 Chromium, Firefox 和 WebKit 浏览器引擎。Playwright 提供了一套强大的 API 来进行网页自动化测试&#xff0c;包括页面导航、元素选择、表单提交等操作&#xff0c;并且能够处理现代网页中的异步加载内…

【maven踩坑】一个坑 junit报错 但真正导致这个的不是junit的原因

目录 事件起因环境和工具操作过程解决办法结束语 事件起因 报错一&#xff1a; Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID junit-vintage failed to discover tests报错二&#xff1a; Internal Error occurred. org.junit.pl…

ONNX: export failure: DLL load failed while importing _message: 找不到指定的程序。

ONNX: export failure 问题其他解决快速解决 问题 使用pytorch导出onnx&#xff08;Open Neural Network Exchange&#xff09;模型&#xff0c;结果使用conda安装完onnx之后&#xff0c;问题就出现了 ONNX: export failure: DLL load failed while importing _message: 找不到…

Redis做分布式锁

&#xff08;一&#xff09;为什么要有分布式锁以及本质 在一个分布式的系统中&#xff0c;会涉及到多个客户端访问同一个公共资源的问题&#xff0c;这时候我们就需要通过锁来做互斥控制&#xff0c;来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…

用Tokio掌握Rust异步编程

在Rust中构建可伸缩且高效的应用程序时&#xff0c;异步编程必不可少。异步编程能显著提高性能&#xff0c;让代码在不阻塞的情况下并发处理多个任务。在本教程中&#xff0c;我们将探索Tokio&#xff0c;介绍异步编程原理及应用场景&#xff0c;并逐步带你编写异步代码。 Toki…

推荐一款3D建模软件:Agisoft Metashape Pro

Agisoft Metashape Pro是一款强大的多视点三维建模设计辅助软件&#xff0c;Agisoft Metashape是一款独立的软件产品&#xff0c;可对数字图像进行摄影测量处理&#xff0c;并生成3D空间数据&#xff0c;用于GIS应用&#xff0c;文化遗产文档和视觉效果制作&#xff0c;以及间接…

记录日志中logback和log4j2不能共存的问题

本文章记录设置两个日志时候&#xff0c;控制台直接报错 标黄处就是错误原因&#xff1a;1. SLF4J(W)&#xff1a;类路径包含多个SLF4J提供程序。 SLF4J(W)&#xff1a;找到提供程序[org.apache.logging.slf4j. net]。 SLF4J(W)&#xff1a;找到提供程序[ch.qos.log .classi…