LLM:ALiBi - 给注意力加上线性偏置

news2024/11/14 17:49:53

论文:https://arxiv.org/pdf/2108.12409.pdf

代码:https://github.com/ofirpress/attention_with_linear_biases

发表:2021

长度外推

参考:https://spaces.ac.cn/archives/9431#ALIBI

长度外推性是一个训练和预测的长度不一致的问题。具体来说,不一致的地方有两点:

1、预测的时候用到了没训练过的位置编码(不管绝对还是相对);

2、预测的时候注意力机制所处理的token数量远超训练时的数量。

第1点:可能大家都容易理解,没训练过的就没法保证能处理好,这是DL中很现实的现象,哪怕是Sinusoidal或RoPE这种函数式位置编码也是如此。

第2点:可能读者会有些迷惑,Attention理论上不就是可以处理任意长度的序列吗?训练和预测长度不一致影响什么呢?答案是熵,我们在《从熵不变性看Attention的Scale操作》也已经分析过这个问题,越多的token去平均注意力,意味着最后的分布相对来说越“均匀”(熵更大),即注意力越分散;而训练长度短,则意味着注意力的熵更低,注意力越集中,这也是一种训练和预测的差异性,也会影响效果。

摘要

如何让模型在推理时实现对训练期间未见过的序列的外推?我们引入了一种更简单、更有效的位置表示方法,即带有线性偏置的注意力(ALiBi)

ALiBi核心思想:没有将位置嵌入添加到单词嵌入中,而是用一个和query, key之间的距离成比例的一个“惩罚项”来偏置query-key的注意力得分。训练速度提高了 11%,内存使用量减少了 11%。

1 简介 

我们发现:使用Sinusoidal PE嵌入的Transformer语言模型(LMs)的外推能力非常弱

我们证明:这种外推失败是由位置嵌入方法引起的。如下图所示,对于Sinusoidal PE(黄色)方法的最新替代方案 RoPE(橙色) 已经改进了外推。但最好的是T5 bias(紫色),其比正弦方法慢得多,但会引入额外的内存和参数。

图1:左边的是模型在512数据集训练的模型,右边是在1024数据集上训练的模型。横坐标是推理是输入的句子长度,纵坐标的困惑度。我们的目标是,困惑度越小越好。通过观察上图我们可以看到,Sinusoidal编码,Rotary编码,T5 Bias这三种位置编码,当输入特别长的时候,困惑度就会飙升,但是ALiBi编码会保持一个平稳的水平(即使超过训练的token长度),说明ALiBi编码有很好的长度外推能力。 

2 目前的方法无法有效地进行外推

从技术上讲应该能够外推的正弦位置方法,在实际应用中其实际的外推能力非常有限。尽管旋转位置方法RoPE比正弦方法有所改进,但它仍然没有取得令人满意的结果。T5 bias方法比这两种方法中的任何一种都能带来更好的外推效果,因此我们得出结论,外推能力很大程度上取决于位置嵌入。遗憾的是,T5 bias 在计算上成本很高。 

图2:批处理训练、推理速度和内存使用的比较。ALiBi基本上还是不错的。 

1:Sinusoidal PE 是不用学习的常数向量,

2:Sinusoidal PE直接加到transformer第一层的输入token embeddings上

1:不同于在Transformer底部添加正弦嵌入,RoPE将每个注意力层的键和查询都乘以正弦嵌入

2:与正弦嵌入或学习的位置嵌入方法不同,RoPE每个层都注入位置信息,而不仅仅是初始层

3:RoPE没有向自注意力层(self-attention)的值添加位置信息。自注意力层的输出是一个对输入值向量进行线性变换、加权和的结果;因此,通过不将位置信息插入到值中,每个Transformer层的输出都不包含任何显式位置信息。我们怀疑这种位置信息的隔离可能对外推有益。

1:尽管大多数模型使用训练过的或正弦的位置嵌入,T5模型使用一种相对位置方法,这种方法不向词嵌入添加位置信息(与之前的方法不同)。相反,它修改了注意力值的计算方式。我们将此称为“T5 bias”方法。

2:与旋转方法一样,T5 bias将位置信息注入到每个层的模型中,并没有将任何显式位置信息整合到自注意值向量中
3:T5 bias 确实允许语言模型进行外推。但这种令人印象深刻的性能需要付出代价:训练速度至少是使用正弦模型的两倍

3 ALIBI

1:ALIBI 不会在网络中添加positon embeddings。唯一的修改就是在query-key内积后,添加一个静态的、非学习的bias。 换个说法:ALiBi 直接作用在attention score中,给 attention score 加上一个预设好的偏置矩阵。

2:公式第一项是注意力的分数。第二项是一个相对距离的矩阵。

        例如q_{1}k_{1},他们直接的距离为1-1=0,所以对应的位置是0.

        例如q_{2}k_{1},他们直接的距离为1-2=-1,所以对应的位置是-1.

为什么是一个下三角矩阵,因为我们研究的是,autoregressive language modeling,所以这就是上三角被MASK的原因,我们不关注未来,只关注过去,这个编码只应用在Query和Key中,不会应用到Value中。

 

3:给定的预设矩阵中还会乘上m的调节因子,m的设置与attention的头数有关。论文中也做了尝试把m作为学习参数,但是并没有获得更好的效果。初始数值和间隔相同,计算公式为:\frac{1}{2^{(\frac{8}{n})}}

如果head = 8,m的数值分别为:

m_{1}=\frac{1}{2^{(\frac{8}{8})}}=\frac{1}{2}

m_{2}=\frac{1}{2^{(\frac{8}{8})}}*m_{1}=\frac{1}{2^{2}},

m_{3}=\frac{1}{2^{(\frac{8}{8})}}*m_{2}=\frac{1}{2^{3}},

m_{4}=\frac{1}{2^{(\frac{8}{8})}}*m_{3}=\frac{1}{2^{4}},

...

m_{8}=\frac{1}{2^{(\frac{8}{8})}}*m_{7}=\frac{1}{2^{8}}

如果head = 16,m的数值分别为:

m_{1}=\frac{1}{2^{(\frac{8}{16})}}=\frac{1}{2^{0.5}}

m_{2}=\frac{1}{2^{(\frac{8}{16})}}*m_{1}=\frac{1}{2^{1}},

m_{3}=\frac{1}{2^{(\frac{8}{16})}}*m_{2}=\frac{1}{2^{1.5}},

m_{4}=\frac{1}{2^{(\frac{8}{16})}}*m_{3}=\frac{1}{2^{2}},

...

m_{16}=\frac{1}{2^{(\frac{8}{16})}}*m_{15}=\frac{1}{2^{8}}

我们观察到:这组斜率在各种文本领域和模型大小上都有效。在新数据集上训练新模型时不需要调整这些斜率值。这使得我们的方法与正弦方法相似,正弦方法中的超参数一次性设置的,然后在不同大小的不同数据集上的不同模型中重复使用。ALiBi具有对新颖性的归纳偏差;它会惩罚查询-键对之间的注意力分数,随着键与查询之间的距离增长,惩罚会增加。不同的头会以不同的速率增加他们的惩罚,这取决于斜率的幅度。

我们最初尝试让斜率可训练,但并没有得到很好的外推结果。大约十个斜率集的简短手动探索让我们发现了最终选择的斜率集。

ALiBi是一种相对位置方法,我们在每个层的键和查询中添加位置信息,但不在值中添加,这与T5偏差和旋转方法中的做法不同。

代码实现(研究明白了再补)

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

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

相关文章

tomcat原理模拟和tomcat优化

1、tomcat实现原理 servlet 没有主方法main,依赖tomcat才能运行,因为tomcat 有主方法main,由java编写 servlet中doGet和doPost方法属于非静态方法,只能依托new对象存在,tomcat无法new出来对象,因此tomcat…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代,代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP,用户可以隐藏自己的真实IP地址,并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

MySQL面试题 | 18.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

Vue3前端开发,借助Ref来获取组件内dom对象&#xff0c;借助defineExpose编译宏可以获取到子组件的属性和方法。 <script setup> import {onMounted, ref} from vue import Base from ./components/Base.vue import SetupDemo from ./components/SetupDemo.vue import Rea…

探索C++中std::string的弱点:你可能未曾注意到的缺点

C中std::string的弱点&#xff1a;你可能未曾注意到的缺点 一、背景二、性能方面的局限三、可变性带来的问题四、内存管理和指针操作五、Unicode和多字节字符集的支持六、其他替代方案七、总结 一、背景 C中std::string是一个非常重要的类&#xff0c;用于表示和处理字符串数据…

无偿分享一个很有用的看源码小技巧

怎么在 idea 里面查看 git 提交记录呢&#xff1f;这个界面是藏在哪里的呢&#xff0c;我的 idea 里面怎么没有呢&#xff1f; 好的&#xff0c;是我疏忽了&#xff0c;我先入为主的认为这个大家应该都知道是怎么来的。 但是确实是有一些同学是不太清楚的&#xff0c;那我这篇…

Java设计模式-单例模式(2)

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式的创建型模式中的单例、原型、工厂方法、抽象工厂、建造者的单例模式进行讲解和说明。 单例模式&#xff08;Singleton&#xff09; 定义 某个类只能生成一个实例&#xff0c;该类提供了一个全局访问…

Docker技巧汇总

Docker技巧汇总 前言使用流程安装配置镜像管理创建并运行容器使用容器/常用命令导出和导入查看元数据挂载数据卷端口映射/转发VS Code连接Docker 前言 Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xf…

2024年第十五届机械与智能制造技术国际会议(ICMIMT 2024)

2024年第十五届机械与智能制造技术国际会议(ICMIMT 2024)2024年5月17-19日 南非 开普敦会议官网&#xff1a; 15TH IEEE-ICMIMT 2024http://www.mimt.us/ 近年来&#xff0c;机械和智能制造技术取得了重大进展。先进计算和传感技术的集成带来了更精确、更高效和自动化的制造过…

Pymol-电子密度图展示方法-PDB数据库已发表结构和自己晶体解析得到的结构密度图

简单来说&#xff0c;想要用PyMol展示电子密度图可以归为以下两种&#xff1a; 一是展示PDB数据库中已发表数据的结构和Map的方式 以6sps.pdb为例&#xff0c;在pymol中导入该数据密度图时&#xff0c;可以无需下载对应的密度文件&#xff0c;直接用fetch即可&#xff1a; Py…

Spring 事务管理 @Transactional

事务 Spring 的声明式事务是采用声明的方式来处理事务。这里所说的声明&#xff0c;就是指在配置文件中声明&#xff0c;用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。 事务管理不侵入开发的组件。具体来说&#xff0c;业务逻辑对象就不会意识到正在事务管…

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…

2024年南京等保测评机构名单看这里!

时光流逝&#xff0c;已经到了2024年。不少小伙伴在问&#xff0c;2024年南京等保测评机构有哪些&#xff1f;跟2023年一样吗&#xff1f;这里我们小编就给大家汇总了一下&#xff0c;具体地址以及名称看这里就可以啦&#xff01; 2024年南京等保测评机构名单看这里&#xff0…

将TI的电量计Linux驱动从4.4内核移植到5.10

背景 最近公司某产品用到了TI的电量计芯片BQ40Z50&#xff0c;我负责为其开发Linux驱动&#xff0c;搜了下&#xff0c;github上有TI为其写好的开源驱动&#xff0c;太好了。 看了下代码&#xff0c;比较简单&#xff0c;连Makefile都没写&#xff0c;不过这也挺好&#xff0…

超高质量的 8个免费设计素材网站,设计师必备。

设计师一般都去哪里找素材&#xff1f;找高质量且免费的设计素材&#xff0c;就上这8个网站&#xff0c;平面、UI、电商等设计素材都能找到&#xff0c;赶紧收藏一波~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内…

第十三章 MySQL

第十三章 MySQL 下面是创建数据库操作 删除数据库 右上角选择要操作的数据库 如果关闭了这个控制台&#xff0c;下次如何找到它呢 也可以对其改名

C++类包含编译模型实战

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序&#xff0c;查看结果 &#xff08;二&#xff09;C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

Leetcode 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…