前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ICML2024高分!魔改注意力,让小模型能打两倍大的模型

ICML2024高分!魔改注意力,让小模型能打两倍大的模型

作者头像
量子位
发布于 2024-06-04 09:59:07
发布于 2024-06-04 09:59:07
4030
举报
文章被收录于专栏:量子位量子位

改进Transformer核心机制注意力,让小模型能打两倍大的模型

ICML 2024高分论文,彩云科技团队构建DCFormer框架,替换Transformer核心组件多头注意力模块(MHA),提出可动态组合的多头注意力(DCMHA)。

DCMHA解除了MHA注意力头的查找选择回路和变换回路的固定绑定,让它们可以根据输入动态组合,从根本上提升了模型的表达能力。

可以近似理解为,原来每层有固定的H个注意力头,现在用几乎同样的参数量和算力,可按需动态组合出多至HxH个注意力头。

DCMHA即插即用,可在任何Transformer架构中替换MHA,得到通用、高效和可扩展的新架构DCFormer。

这项工作由来自北京邮电大学、AI创业公司彩云科技的研究人员共同完成。

研究人员用在DCFormer基础上打造的模型DCPythia-6.9B,在预训练困惑度和下游任务评估上都优于开源Pythia-12B。

DCFormer模型在性能上与那些计算量是其1.7-2倍的Transformer模型相当。

多头注意力模块有何局限?

大模型的scaling law告诉我们,随着算力的提升,模型更大、数据更多,模型效果会越来越好。虽然还没有人能明确说明这条路的天花板有多高,能否达到AGI,但这确实是目前大家最普遍的做法。

但除此以外,另一个问题同样值得思考:目前绝大多数大模型都基于Transformer,它们都是用一个一个Transformer块像搭积木一样搭起来的,那作为积木块的Transformer本身,还有多大的改进提升空间?

这是模型结构研究要回答的基本问题,也正是彩云科技和北京邮电大学联合完成的DCFormer这项工作的出发点。

在Transformer的多头注意力模块(MHA)中,各个注意力头彼此完全独立的工作。

这个设计因其简单易实现的优点已在实践中大获成功,但同时也带来注意力分数矩阵的低秩化削弱了表达能力、注意力头功能的重复冗余浪费了参数和计算资源等一些弊端。基于此,近年来有一些研究工作试图引入某种形式的注意力头间的交互。

根据Transformer回路理论,在MHA中 ,每个注意力头的行为由WQ、WK、WV、WO四个权重矩阵刻画(其中WO由MHA的输出投影矩阵切分得到)。

其中,WQWK叫做QK回路(或叫查找选择回路),决定从当前token关注上下文中的哪个(些)token,例如:

WOWV叫做OV回路(或叫投影变换回路),决定从关注到的token取回什么信息(或投影什么属性)写入当前位置的残差流,进而预测下一个token。例如:

研究人员注意到,查找(从哪拿)和变换(拿什么)本来是独立的两件事,理应可以分别指定并按需自由组合(就像在SQL查询中,WHERE后的选择条件和SELECT后的属性投影是分开写的一样),MHA硬把它们放到一个注意力头的QKOV里“捆绑销售”,限制了灵活性和表达能力。

例如,假设有个模型存在注意力头A、B、C其QK和OV回路能够完成上面的例子=,那换成:

需要交叉组合现有注意力头的QK和OV回路,模型就可能“转不过弯儿”了(经研究人员系统构造的合成测试集验证,<=6B的中小尺寸模型在这类看似简单的任务上确实表现不佳)。

动态组合多头注意力长啥样?

以此为出发点,本文研究团队在MHA中引入compose操作

如下图所示,得到DCMHA:

图1. DCMHA总体结构

将QWQ和KWK算出的注意力分数矩阵AS和注意力权重矩阵AW,与VWV相乘之前,对其在num_heads维上做线性映射得到新的矩阵A’,通过不同的线性映射矩阵(composition map),以实现各种注意力头组合的效果。

例如图2(c)中将head 3和7的QK回路与head 1的OV回路组合在一起,形成一个“新的”注意力头。

图2. 8个注意力头的简化的典型composition map的功能,浅色表示大值

为了最大限度的增强表达能力,研究人员希望映射矩阵由输入动态生成,即动态决定注意力头怎样组合。

但他们要生成的映射矩阵不是一个,而是对序列中每对源位置的query Qi和目的位置的key Kj,都要生成这样一个矩阵,计算开销和显存占用都将难以接受。

为此,他们进一步将映射矩阵分解为一个输入无关的静态矩阵Wb、一个低秩矩阵w1w2和一个对角矩阵Diag(wg)之和,分别负责基础组合、注意力头间的有限方式(即秩R<=2)的动态组合和头自身的动态门控(见图2(d)和图3(b))。其中后两个矩阵由Q矩阵和K矩阵动态生成。

在不牺牲效果的前提下,将计算和参数复杂度降低到几乎可以忽略的程度(详见论文中复杂度分析)。再结合JAX和PyTorch实现层面的优化,让DCFormer可以高效训练和推理。

图3. Compose的计算

效果如何?

规模扩展

评估一个架构的好坏,研究人员关注的最核心指标是算力转化为智能的效率(或叫性能算力比),即投入单位算力能带来的模型性能提升——花更少的算力,得到更好的模型。

从图4和图5的scaling law曲线(在对数坐标下,每个模型架构的损失随算力的变化可画出一条近似直线,损失越低,模型越好)可以看出,DCFormer可以达到1.7~2倍算力的Transformer模型的效果,即算力智能转化率提升了1.7~2倍。

图4. Transformer和DCFormer的规模扩展效果
图5. Pythia和DCPythia的规模扩展效果

怎么理解这个提升幅度呢?

自2017年Transformer诞生至今,从改进性能算力比的角度,GLU MLP和旋转位置编码RoPE是经大量实践验证普适有效且被广泛采用的为数不多的两项架构改进。

在原始Transformer中加入这两项改进的架构也叫Transformer++,Llama、Mistral等最强开源模型均采用该架构。无论Transformer还是Transformer++架构,都可通过DCMHA获得显著改进。

在1.4B模型规模下,DCMHA的改进幅度大于Transformer++的两项改进之和,且扩展性更好(图4下蓝绿线和黑线的对比,DCMHA的改进幅度随算力增加衰减的更慢,以及图4和图5的对比)。

可以说,DCFormer让Transformer的能力又跃上一个新台阶。

下游任务评测

研究团队训练了DCPythia-2.8B和DCPythia-6.9B两个模型在主流NLP下游任务上进行测评并和同规模的开源模型Pythia进行比较(训练采用和Pythia完全相同超参数设置)。

表1. DCFormer 和 Pythia 在下游任务中的表现

从表1中可以看出,DCPythia-2.8B和6.9B不仅在Pile验证集上的ppl 更低,而且在大部分下游任务上都显著超过了Pythia,DCPythia6.9B在 ppl 和下游任务上的平均准确率甚至超过了Pythia-12B

DCFormer++2.8B相对于DCPythia-2.8B有进一步的提升,验证了DCMHA和Lllama架构结合的有效性。

训练和推理速度

虽然引入DCMHA会带来额外的训练和推理开销,但是从表2中可以看出DCFormer++的训练速度是Transformer++的74.5%-89.2%,推理速度则是81.1%-89.7%,而且随着模型参数的增长,额外的计算开销会逐渐降低。

表2. Transformer++和DCFormer++的训练和推理速度对比

训练速度是在TPU v3 pod,序列长度为2048,batch_size为1k的情况下对比得到的;推理速度是在A100 80G GPU上进行评测的,输入长度1024,生成长度128。

消融实验

结果如下:

表3. DCMHA的消融实验

从表3中可以看出以下几点:

  • 虽然加入静态的组合权重就可以降低ppl,但引入动态的组合权重可以进一步降低ppl,说明了动态组合的必要性。
  • 低秩动态组合比动态门控的效果更好。
  • 只用query-wise或者key-wise的动态组合得到的ppl相当,与DCFormer++的差距很小。
  • 在softmax后做注意力头组合比在softmax前做更有效,可能是因为softmax后的概率能更直接影响输出。
  • 动态组合权重的秩无需设置过大,也说明了组合权重的低秩性。

此外,研究人员还通过增加局部注意力层的比例和只用query-wise动态组合的方式去进一步减少训练和推理开销,详见论文Table 10。

总的来说,研究团队有两点总结。

关于动态权重:近期Mamba,GLA,RWKV6,HGRN等SSM和线性注意力/RNN的工作,通过引入动态(input-dependent)权重的方式,追赶上了Transformer++,但DCFormer用动态组合注意力头的方式说明了在使用 softmax 注意力的情况下,通过引入动态权重也可以大幅提升Transformer++的效果。

关于模型架构创新:这项工作表明,如果存在一个具有极限算力智能转化效率的“理想模型架构”,当前的Transformer架构虽已非常强大,但距离这个理想架构很可能还存在很大的差距,仍有广阔的提升空间。因此,除了堆算力堆数据的大力出奇迹路线,模型架构创新同样大有可为。

研究团队还表示,彩云科技会率先在旗下产品彩云天气、彩云小译、彩云小梦上应用DCformer。

有关更多研究细节,可参阅原始论文。

ICML2024论文链接:https://icml.cc/virtual/2024/poster/34047 Arxiv 论文链接:https://arxiv.org/abs/2405.08553 代码链接:https://github.com/Caiyun-AI/DCFormer

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子位 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
8 条评论
热度
最新
不错不错 跟着操作就行 简单易懂
不错不错 跟着操作就行 简单易懂
回复回复点赞举报
打印中文会乱码,不知道是怎么回事
打印中文会乱码,不知道是怎么回事
回复回复点赞举报
一直想用protobuf这个东西。但是一直没用上。。
一直想用protobuf这个东西。但是一直没用上。。
回复回复点赞举报
感觉这个库缝合了clang和Go的类型
感觉这个库缝合了clang和Go的类型
回复回复点赞举报
学到了,谢谢分享,感谢大佬
学到了,谢谢分享,感谢大佬
回复回复点赞举报
感谢作者又学习到了一个新的知识
感谢作者又学习到了一个新的知识
回复回复点赞举报
牛啊牛啊
牛啊牛啊
11点赞举报
/抱拳
/抱拳
回复回复点赞举报
推荐阅读
微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
本文原创首发CSDN,链接 https://mp.csdn.net/console/editor/html/106041472 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。 ----
Designer 小郑
2023/08/01
1.7K0
微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
短信 | 教你使用 JAVA实现 【短信发送】 功能
需求:使用java来实现‘短信发送’功能 发送方:【码神联盟】 接收方:境内手机号 环境:myeclipse、jdk1.8、腾讯云jar包、maven 开发步骤 1:新建maven工程,如下: 2:开
码神联盟
2018/07/30
15.8K0
短信 | 教你使用 JAVA实现 【短信发送】 功能
SpringBoot整合腾讯短信服务发送验证码
我这里的参数为code 和 3 code对应我随机生成的二维码 3是二维码的有效期 参数顺序与个数与你自己创建的模板内容有关 例如我的模板为这样所以这么传递参数
暴躁的程序猿
2022/03/23
2.8K0
SpringBoot整合腾讯短信服务发送验证码
腾讯云短信发送功能API-PHP接入
最近测试了一下短信发送功能,接入了腾讯云的API. 登录腾讯云https://cloud.tencent.com/ 国内短信新购三重礼 直达地址:https://cloud.tencent.com/
用户5907943
2019/07/26
9K0
java实现发短信功能---腾讯云短信
前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了许多提供短信服务的三方,几乎所有都需要企业认证才可以使用,这对于个人学习非常不方便。多方比较之后,选择了腾讯云(此处并非做广告),原因有两点: 支持微信公众号认证(门槛低) 每月赠送100条免费短信(适合个人学习)(这一点请矿家子弟自行忽略)。超过100条的时候, 可以开通收费短信服务-腾讯云短信服务套餐 [or5qsa3nyy.png] 开发环境 请参照: 基于SpringBoot构建分模块项目 腾讯云 ---短信
聚优云惠
2019/12/26
27.9K0
腾讯云短信 nodejs 接入, 通过验证码修改手机示例
腾讯云短信 nodejs 接入, 通过验证码修改手机示例 参考: 腾讯云短信文档 国内短信快速入门 qcloudsms Node.js SDK 文档中心>短信>错误码 nodejs sdk 使用示例 const QcloudSms = require('qcloudsms_js'); const cfg = { appid: 1400123123, // SDK AppID 以1400开头 appkey: '...', // 短信应用 SDK AppKey templateId: 40279
用户1659066
2019/08/23
12.8K2
腾讯云短信服务的申请和验证使用详细流程
项目中用到短信验证功能,看到腾讯云有短信服务,就直接使用了,当然其它公司也会停工短信服务,百度可以找到很多,使用的情况应该大同小异,这里就以腾讯云的短信服务为例,说明一下短信服务的申请和使用。
React架构设计
2019/12/26
5.1K0
发送手机验证码实现
但是刚才试了,第一次用官方提供的demo发送成功,然后整合到自己项目中,调试时由于参数配置错误导致发送了几次失败后,5次就用完了。按理说成功才能算一次,果断放弃。
我的小碗汤
2018/08/22
13.8K0
发送手机验证码实现
Django使用腾讯云发送短信并存入redis
models.py class UserInfo(models.Model): username = models.CharField(verbose_name='用户名', max_length=32) email = models.CharField(verbose_name='邮箱', max_length=32) mobile_phone = models.CharField(verbose_name='手机号', max_length=32) password =
lyudev
2022/08/04
2.1K0
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
    短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务分别来体验一下国际短信和国内短信接口。
用户9127725
2022/08/08
5.5K0
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
03 . Django之腾讯云短信
简介 由于项目在注册、登录、找回密码 时需要发送短信验证的功能,我们使用腾讯云短信做。 为什么要用腾讯云短信呢? 因为注册就送 100条免费短信 的额度。 实现 注册腾讯云 注册一个腾讯云账
iginkgo18
2020/09/27
13.6K0
03 .  Django之腾讯云短信
用小程序·云开发轻松构建二手书商城小程序(下)丨实战
今天是“世界读书日”,传承知识,手有余香~本文教你用小程序·云开发轻松制作二手书交易商城小程序,让智慧延续,让温暖传递。
腾讯云开发TCB
2020/06/03
1.2K0
短信验证功能实现
创建签名时候看他需要你提供给他什么资料你就提交什么资料,一般弄个公众号截图管理员页面即可通过审核
小小咸鱼YwY
2020/06/19
3.6K0
【玩转腾讯云】Python 操作腾讯云短信(sms)详细教程
腾讯云短信 1. 注册腾讯云 <font color="red">已有腾讯云账号可直接跳到第二步</font> 官网 注册, 微信扫码关注腾讯云助手即可快速注册 [biu6v2it00.png] 选择 注册新账号,注册完成后,实名认证一下。选择 个人认证,填写一下信息就ok了。 [x1ldepiqx3.png][xqyn1acnua.png][kp5t4xp99f.png] <span id="sms"></span> 2. 开通腾讯云短信 通过上一步我们已经注册好了腾讯云账号,接下来去开通 腾讯云短信 功
ruochen
2021/04/11
14.4K0
【玩转腾讯云】Python 操作腾讯云短信(sms)详细教程
验证码服务使用指南
使用idea打开上一步下载的sailing目录,下图是sailing在idea的工程结构。
张哥编程
2024/12/07
2180
验证码服务使用指南
Django实现调用腾讯云短信接口
腾讯云短信接口 注册 登录 具体怎么注册腾讯云接口看下面的文章吧 腾讯云接口注册 1.0 安装SDK pip3 install qcloudsms_py conda install qcloudsms_py 1.1 编写发送短信接口 我的环境是基于django TENCENT_SMS_APP_ID, TENCENT_SMS_APP_KEY, TENCENT_SMS_SIG: 分别都写在了settings.develop配置文件下 # tencent/smsket.py i
Yuou
2022/09/26
13.7K0
支付项目验证码服务使用指南
使用idea打开上一步下载的sailing目录,下图是sailing在idea的工程结构。
张哥编程
2024/12/13
1620
支付项目验证码服务使用指南
qcloudsms_py短信发送和easyquotation股票实时数据获取
有时候我们做股票投资,需要实时盯盘。而盯盘的任务我们完全可以交给计算机,因此当信号出现的时候知会自个是很有必要的,但是前提是获取实时数据并判断是否发送短信提醒,这块作者在网上找了一写资料,算是留个记录,方便日后用到。
写一点笔记
2022/08/11
1.3K0
qcloudsms_py短信发送和easyquotation股票实时数据获取
腾讯云短信服务发送验证码
  由于阿里云需要备案过的域名或者已上线的APP才能申请短信签名,我的域名正在备案,申请还没通过,这里用腾讯云实现短信验证码的发送功能。腾讯云只需要你有个公众号就能申请短信签名,而且免费赠送200条。
别团等shy哥发育
2023/02/25
8.9K0
腾讯云短信服务发送验证码
用小程序·云开发轻松构建二手书商城小程序丨实战
使用组件开发效率会高很多,避免重复工作,同时可以参考部分组件的写法,还是有很多值得学习的地方的。
腾讯云开发TCB
2019/09/29
1.9K0
推荐阅读
相关推荐
微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档