DCFormer: 动态组合多头自注意力

2024-08-26 22:36

本文主要是介绍DCFormer: 动态组合多头自注意力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        多头注意力(MHA)是Transformer的关键组成部分。在MHA中,注意力头是独立工作的,导致注意得分矩阵的低秩瓶颈和注意头冗余等问题。动态组合多头注意(dynamic Composable Multi-Head Attention, DCMHA)是一种参数化和计算效率高的注意力结构,它解决了MHA的不足,并通过动态组合注意头来提高模型的表达能力。DCMHA的核心是一个Compose函数,它以输入依赖的方式转换注意力得分和权重矩阵。DCMHA可以在任何Transformer体系结构中作为MHA的直接替代品,以获得相应的DCFormer。


        DCFormer 是一种高级的序列模型,它采用了动态权重投影滑动窗口机制来高效处理长序列数据,并在注意力计算上实现更灵活的表达。

        DCFormer通过灵活、动态的注意力机制来高效处理长序列数据,基于多头自注意力的结构增强其性能:①动态权重投影:根据输入动态生成查询、键和值的权重矩阵,避免固定权重导致的表达能力限制。②滑动窗口机制:在处理长序列时引入局部注意力机制,限制注意力计算的范围,从而减少计算开销和内存使用。③Chunked Attention:序列被划分为多个快,模型逐块进行计算,使得模型可以在处理长序列时分段执行,从而保持计算效率。

动态权重投影

       动态权重投影的核心思想是让模型根据输入动态地生成注意力权重,而不是像标准 Transformer 那样使用固定的查询、键和值矩阵。其实现方式主要有两步:

        动态生成权重矩阵:模型通过输入 x 生成动态权重,来构建查询、键和值的投影矩阵。即,对于每个输入序列片段(token),生成不同的投影矩阵。这避免了固定投影矩阵可能对模型能力的限制,并能够捕捉输入序列中的变化。

        注意力前后投影:在计算查询和键的点积之前,模型会先根据动态权重对其进行预投影(pre-projection),得到一个初步的查询-键关联矩阵(logits);在点积注意力之后,再进行后投影(post-projection),进一步调整最终的注意力分布。

前投影指的是对查询和键向量进行线性变换;

W_q = [[1, 0], [0, 1]]  # 查询前投影矩阵
W_k = [[1, 0], [0, 1]]  # 键前投影矩阵Q_proj = np.dot(Q, W_q)  # 对查询进行前投影
K_proj = [np.dot(K1, W_k), np.dot(K2, W_k), np.dot(K3, W_k)]  # 对每个键进行前投影

然后,计算查询与每个键的点积(即注意力分数);

attention_scores = [np.dot(Q_proj, K1_proj), np.dot(Q_proj, K2_proj), np.dot(Q_proj, K3_proj)]

后投影指的是用这些注意力分数计算最终的注意力分布。注意力分布可以通过softmax函数获得;

attention_probs = np.exp(attention_scores) / np.sum(np.exp(attention_scores))

后投影可能涉及一个线性变换矩阵W_o,这个矩阵对注意力分布进行进一步加工,从而得到最终的注意力概率分布。

attention_probs_final = np.dot(attention_probs, W_o)

        动态权重投影可以生成更细粒度的权重,从而提升推理质量。

对角加权

        对角加权通过动态权重投影(Dynamic Weight Projection)来实现。一个基于输入内容动态调整权重的过程。

        对角加权指的是权重矩阵是对角矩阵。只有矩阵的对角线元素是非零的,而其余元素都是零。在模型需要对不同维度的特征进行独立缩放或加权时经常会被使用。对角加权类似于给每个特征分配一个单独的“调节器”,用来调整每个特征的重要性。


[2, 0, 0]
[0, 3, 0]
[0, 0, 1]

        对角加权:意味着将这个对角矩阵与数据相乘,调整每个特征的“权重”。在上面的例子中,假设有一个特征向量 [x1, x2, x3],那么应用这个对角矩阵后,你得到的结果是 [2*x1, 3*x2, 1*x3],即对每个特征进行了单独的加权。

        假设在处理一个图像分类问题,每张图像有三个通道:红色通道、绿色通道、蓝色通道。你可能想让模型更加关注红色通道的内容,而减少蓝色通道的影响。你可以使用一个对角矩阵 [2, 1, 0.5] 来对三个通道进行加权,这样红色通道的影响被放大了两倍,而蓝色通道的影响被减半。


        1、计算动态权重:模型根据输入的查询向量(query vector)和预定义的参数(如 dd 参数)来计算动态权重。dd 参数会生成一个包含对角加权信息的向量或矩阵。

      

      动态权重的计算通过一系列的线性变换和非线性激活函数(GELU)完成。               

      2、应用动态权重:在计算查询和键之间的相似性时,会对每个头的结果进行动态调整,尤其是对角线上的元素。

        3、组合权重与对角加权:这些经过对角加权处理的相似性分数(logits)会与值(value)向量进行加权求和,得到最终的输出。

滑动窗口机制

        滑动窗口机制旨在减少长序列的注意力计算开销。通常情况下,Transformer 的自注意力机制是全局的,即每个 token 都会与序列中的所有其他 token 进行交互,导致随着序列长度的增加,计算量和内存需求呈指数增长。

        滑动窗口机制通过引入局部注意力,将每个 token 的注意力计算限制在一个固定大小的窗口范围内。也就是说,对于序列中的每一个位置,模型只计算其相邻的某些 token 的注意力,而不是与整个序列交互。

        窗口大小:窗口的大小是预先设定的,控制了每个 token 只关注相邻多少个 token。例如,窗口大小为 128,则每个 token 只与其前后 128 个 token 进行交互。

        窗口滑动:在推理过程中,窗口随着序列的进展向前滑动,逐步覆盖整个序列。每次推理时,只处理窗口内的局部信息。

动态权重投影和滑动窗口机制

        动态权重投影和滑动窗口机制的结合,可以很好地平衡灵活性和效率:

        局部注意力下的动态权重投影:滑动窗口机制限制了注意力计算的范围,但为了保证局部注意力的质量,DCFormer 通过动态权重投影生成与当前窗口相关的权重矩阵。这意味着,虽然每个 token 只与其邻近的 token 进行交互,但这些交互的权重是动态调整的,可以根据局部上下文生成更细粒度的注意力分布。

        避免信息丢失:滑动窗口机制在推理时,局部注意力可能会带来信息丢失或忽视全局依赖的风险。动态权重投影通过动态调整注意力分布,使得局部注意力仍然能够捕捉关键的全局依赖,弥补了滑动窗口可能带来的限制。

        高效计算:由于滑动窗口机制限制了每次的注意力计算范围,而动态权重投影又确保了注意力的细致性和有效性,因此两者的结合可以在保持模型效果的同时,极大降低计算复杂度和内存开销。


引言

        动态可组合多头注意力(DCMHA) :通过动态组合注意力头来提高模型的表达能力。DCMHA的核心是Compose函数,以输入依赖的方式转换注意力得分和权重矩阵。DCMHA可以在任何Transformer体系结构中作为MHA的直接替代品,以获得相应的DCFormer。

        通常在传统的注意力机制中,注意力得分和权重矩阵的计算方式是固定的,只依赖于模型的参数。而在DCMHA中,输入依赖指的是注意力得分和权重矩阵的计算过程依赖于模型的输入数据。这种动态调整允许模型更好地适应不同的输入,从而提高处理复杂数据的能力。</

这篇关于DCFormer: 动态组合多头自注意力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后