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

相关文章

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,