Transformer中16个注意力头一定要比1个注意力头效果好吗?

2024-06-21 08:58

本文主要是介绍Transformer中16个注意力头一定要比1个注意力头效果好吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Paul Michel

编译:ronghuaiyang

导读

多头注意力中的冗余分析,看看是否可以在不影响性能的情况下做剪枝。

“Hercules Slaying the Hydra”, Sebald Beham, 1545 (source: Art Institute of Chicago)

自Vaswani等人提出transformer模型以来,transformer模型已经成为NLP研究的主要内容。它们被用于机器翻译,语言模型,并且是最新最先进的预训练模型。典型的transformer架构由堆叠的块组成,图1中显示了其中的一块。这种块由一个多头部注意层和一个每个位置的2层前馈网络组成,并与残差连接和层归一化连接在一起。多头注意机制的普遍应用可以说是transformer的核心创新。在这篇博客文章中,我们将仔细研究这种多头注意力机制,试图理解多头实际上有多重要。这篇文章是基于我们最近的NeurIPS论文:https://papers.nips.cc/paper/9551-are-sixteen-heads-really-better-than-one.pdf。

多头注意力

在深入研究多头注意力之前,我们先来讨论一下常规注意力。在自然语言处理(NLP)的上下文中,注意力通常是指计算基于内容的向量序列的凸组合。这意味着权重本身是输入的函数,通常的实现是:

参数为,输入序列为x,查询向量q。使用注意力而不是递归神经网络等句子池化的操作符有很多优势,其中最重要的是在高度并行环境(如GPU)中具有很高的计算效率。然而,它们是以表达性为代价的(例如,注意力只能在其输入的凸包中取值)。在Vaswani等人中提出的解决方案是使用“多头注意力”:本质上是并行地运行 个注意力层(“头”),将它们的输出连接起来,并通过仿射变换提供给它。

通过将最终输出层分割成大小相等的 个层,可以将多头注意机制改写为:

参数为以及 ,当 的时候,这个就和原始的注意力形式是完全一样了。然而,为了使得参数的数量不变, 设置成 ,这样的话,多头的注意力可以认为是低维度的原始的注意力层的集成。

去掉一些注意力头

但是为什么多头比单头好呢?当我们开始尝试回答这个问题时,我们的第一个实验是这样的:让我们取一个好的、最先进的transformer模型,然后去掉注意力头,看看会发生什么。具体来说,我们通过修改多层头的表达式来掩盖推理时的注意头:

其中, 的范围是{0,1},和头相关的掩码。

我们使用BERT模型(Devlin et al. 2018)进行了初始实验,对MultiNLI数据集进行了微调。我们独立地去掉了每个注意力头,并报告了BLEU评分(一种标准的MT评估指标)的差异。令我们惊讶的是,很少有注意头有任何实际效果(见下图)。

在MultiNLI数据集上计算每个单独头移除时的准确度差异。

这向我们表明,大多数注意力头实际上是多余的。此外,我们还测试了特定的注意力头如何在不同的数据集中泛化,这些数据集对应于相同的任务。为此,我们查看了两个对应数据集的两个任务:机器翻译(数据集:newstest2013(新闻文章)和MTNT (Reddit评论))以及MultiNLI(数据集:匹配和不匹配)。有趣的是,这一现象在某一任务的不同领域中普遍存在,如下图所示:在不同数据集上删除每个头的影响之间存在正线性相关关系。

移除注意力头对不同区域影响的相关性。每个点对应了在两个数据集上,一个特定的注意力头被盖住的分数(BLEU分数或准确性)。

为了进一步具有说服性,并对这个问题进行抨击,我们以一种扭曲的方式重复了这个实验。对于每一个注意力头,我们都计算出在所有其他注意力头被移除后的测试分数的差异(保持模型的其余部分不变——特别是我们没有触及其他的注意力层)。

当除一个注意力头以外的所有注意力头都从单个层中移除时,准确性的差异。

特别引人注目的是,在几层(2层、3层和10层)中,只需要一些注意力头就足够了。仅用一个注意力头就可以保持相同(或更好)的性能水平。所以,是的,在某些情况下,16个注意力头(这里是12个)并不一定比1个好。然而,这些观察并没有解决两个关键问题:

  • 在模型中去掉注意力头产生的复合影响:我们单独考虑每一层(我们将所有的注意力头保留在其他层中),但是在整个transformer架构中去除注意力头可能会对性能产生复合影响。

  • 预测注意力头的性能:我们正在观察头部烧蚀后对测试集的影响。

语义注意力头剪枝

早期的注意力头剪枝算法

为了解决这些问题,我们求助于剪枝文献中探索的各种方法,以计算在验证集或训练数据子集上估计的重要性得分 ,并将其用作确定剪枝顺序的代理。较低的重要性得分 意味着注意力头h将首先被修剪。特别是我们把 设置为( )和( )之后,loss的绝对差。注意力头h这样剪枝:

我们用一阶近似这个差异,这使得计算每个注意力头的 成为可能,在数据集X中的每个样本上进行一次向前和向后的传递。否则,我们将需要尽可能多的前向通过有注意力头的模型(加上一个为未修剪的模型)。对于BERT(12×12=14412×12=144个注意力头)或大型transformers(16×3×6=28816×3×6=288个注意力头)这样的模型,这是非常不现实的。另一方面,使用这个粗略的近似值,我们可以同时计算所有的 ,而且整个过程在计算上并不比常规训练更昂贵。

在下面的图中,你可以看到系统注意力头剪枝对各种任务的性能的影响。在这里,我们按重要程度来对注意力头剪枝。“10%剪枝”是指我们用10%最低的 等来剪枝。

系统注意力头的剪枝的性能测试。

所以这里的情况有点微妙。一方面,根据任务和模型,可以在不损失任何性能的情况下,将heads的数量减少60%。另一方面,我们也不能降低到每层一个注意力头。所以一般来说,多注意力头比单个好。

在训练中发生了什么?

我们想知道的一件事是,在训练期间,这种现象是在什么时候出现的。我们通过使用上述方法在优化过程的不同阶段对模型进行剪枝来研究这个问题。在这个实验中,我们在IWSLT数据集上使用一个更小的transformer模型(6层和8个注意头)进行德语到英语的翻译。我们查看了“剪枝配置文件”——性能随剪枝百分比的函数下降的速度——在优化过程中是如何变化的。

左侧:IWSLT模型训练过程中剪枝率与相对分值下降的关系。原始的、未经修剪的模型的BLEU评分用括号表示。右侧:关注训练开始(epochs 1和2)和结束(epochs 35和40)的行为差异。

在最初的几个epochs上,剪枝对性能的影响是线性的,这表明所有的注意力头都是同等重要的(剪枝10%的注意力头的成本~10%的模型性能)。然而,请注意图中最早在epoch 3开始出现的最上面(接近原始分数的100%)和最下面(接近原始分数的0%)部分的集中。这表明,在早期的训练中,冗余的注意力头(40%的冗余注意力头可以用大约10%的性能成本进行剪枝)和“有用的”注意力头之间有明显的区别。

你想知道的更多吗?

在我们试图理解自注意力在transformer模型中的作用的同时,也发表了一些研究成果。两个特别有趣的出发点是:

  • Analyzing Multi-Head Self-Attention: Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned (Voita et al. 2019):本文主要研究机器翻译模型中的自注意力层。他们识别了一些注意力头的“角色”(不管这个头是关注罕见的单词,还是与依赖弧重合,等等),并开发了一个智能的注意力头剪枝算法。

  • What Does BERT Look At? An Analysis of BERT’s Attention (Clark et al. 2019)。本文的分析以BERT (Devlin et al., 2018为中心,这是一种事实上的预先训练过的语言模型。作者非常深入地研究了注意力头的作用,特别是关注哪些语法特征可以从自我注意权重中获得。

接下来的工作?

因此,虽然在训练时16个注意力头比单个头好,但是在测试时很多注意力头是多余的。这使得有很多机会缩减这些巨型模型的推理(事实上很多最近的工作已经开始剪枝或蒸馏大型transformer 模型)。

我特别感兴趣的一个方面是利用这种“过剩的能力”来处理多任务问题:与其丢弃这些冗余的注意力头,我们能否更有效地使用它们来“塞入更多的知识”到模型中?

—END—

英文原文:https://blog.ml.cmu.edu/2020/03/20/are-sixteen-heads-really-better-than-one/

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧

这篇关于Transformer中16个注意力头一定要比1个注意力头效果好吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080771

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

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

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

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

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

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><