引言
如今爆火的大模型,GPT-3,BERT 等,通过大量的参数和数据,为我们提供了前所未有的自然语言处理能力,使得机器能够更好地理解和生成人类的语言。而注意力机制无疑是重要的基石之一,作为一种新的神经网络结构,使得模型能够更好地捕捉序列中的长距离依赖关系,从而大大提高了模型的性能。
本文将从通俗和学术两个角度,详细介绍大模型和注意力机制的基础知识。无论你是对人工智能感兴趣的初学者,还是寻求深入理解的开发者,都能在本文中找到你需要的内容。我们将从 RNN 开始,介绍其原理和局限性,然后介绍 LSTM 如何解决这些问题,接着我们将深入探讨注意力机制的历史、原理和类型,最后我们将介绍 Transformer 模型,以及它相较于 LSTM 的优势。希望通过本文,能让你对注意力机制有更深入的理解。
NLP 和 LLM 是怎样的关系?
现如今,人人嘴边挂着的大模型,其实更准确的名称是:大语言模型(Large Language Model,缩写LLM),刚接触 LLM,会时常伴随着另一个名词 NLP 自然语言处理(Natural Language Processing),那这两者到底是怎样的关系呢?
简单理解 NLP是人工智能的一个分支,同时也是一个广泛的领域,它研究如何让计算机理解、生成和处理自然语言,支持用户使用自然语言文本或语音来询问数据。
我们使用的手机语音助手,如 Siri,小爱等,我们日常使用的一些功能包括 Web 搜索、垃圾邮件过滤、自动文本或语音翻译等都采用了 NLP 技术。
而 LLM 是这个领域中的一个重要工具。通过训练和使用语言模型,我们可以解决 NLP 中的各种任务,从而让计算机更好地理解和处理自然语言。
模型初代目:RNN
说到语言,第一个让人想到的一定是的不同语言之间的翻译问题,而语言模型首要解决的问题,一般也会是翻译,毕竟相较于让机器能具有情感的与人交流,翻译问题更像是考试,成果的好坏也能更直观的展现。以下的实例我们都以翻译问题来看
RNN(Recurrent Neural Network)循环神经网络,NLP里最常用、最传统的深度学习模型,在自然语言处理、语音识别等有很广泛的用途。
经典的 RNN 结构
x 是输入,y 是输出,h 是隐藏层,若是对应到一句话的翻译就是:
可以看出整个结构中最重要的就是隐藏层 h,作为普通小白,我们可以把整个结构看作是一次接力看剧的游戏,游戏规则是:一群人看一部电视剧,每个人只能看其中的一集,并总结出这集讲了什么,最后所有人的总结拼凑起来就是这部剧的大概脉络。
其中 h 层是一个个的人,很明显这部剧有四集,x1 代表这个剧的第一集,名叫 h1 的人看了第一集后,总结出了第一集的内容 y1,以此类推,四个人看完自己的剧集都总结出了各自内容,分别是 y1,y2,y3 和 y4。
但在很多剧中都会有个前情提要的环节,因为很多时候第一集会把出场人物介绍完,后续的剧集就不会进行介绍了,或是前一集发生事情的结果是后一集的起因,这样只看了后一集的人肯定会云里雾里,不知道这集讲了什么。所以 h1 不仅要总结出自己负责的第一集内容,还要把第一集的内容全部复述给 h2,方便他理解第二集的内容,h2 需要把第一集和第二集的内容全部复述给 h3,以此类推。
这其实就是 隐状态h 的作用,保存数据用于输出,和传递模型在处理序列数据时的历史信息。意味着每个 y 前的输出不仅依赖于当前 x 的输入,还依赖于之前 x 的输入。
Encoder-Decoder 模型
RNN 作为NLP中最常用、最传统的深度学习模型,不仅仅适用于翻译问题,还可以应用于解决更多复杂的场景。通过对RNN 结构的简单变化,我们可以灵活地适应不同的任务需求。
N 对 1
主要用于判断输入的类型或是总结性工作
1 对 N
1 对 N 这种结构一般有两种:
第一种主要用于输入一段文字进行演进或扩写,或是输入图像或音乐进行优化等场景
第二种主要用于输入一段文字进行拆解,或是输入图像或音乐进行信息提取等场景
Encoder-Decoder 模型(N 对 M)
然而在实际解决问题的过程中,大部分问题输入和输出都不是等长的,无论是最开始的 N 对 N,还是变种的 1 对 N 和 N 对 1 都只是解决特殊问题的结构。
而后演变出的最灵活,也是使用频率最高的一种 RNN 变种,解决了这个难题,这种结构一般也被称为 Encoder-Decoder 模型或是 Seq2Seq(sequence to sequence) 模型。
从图中可看出,其实就是将 N 对 1 与 1 对 N 两种结构的 RNN 相结合,分别控制各自 N 的数量来达到 N 对 M 的效果,同理,N 对 M 同样也有两种:
前部分 RNN 只负责接收输入信息,可以理解为在为信息编码,被称为 Encoder,将 encode 后的结果赋值给 c,再将 c 作为后部分的输入,后部分 RNN 就只进行对输入信息进行解码,称为 Decoder。这种模型不限制输入输出的长度,因此应用最为广泛。
这里有一点需要注意:虽然我们是用 RNN 来引出的 Encoder-Decoder 模型,但 Encoder-Decoder 模型并不等同或属于 RNN 模型的一类,因为只要符合编码-解码的结构都可以被称为 Encoder-Decoder 模型,即使 Encoder 和 Decoder 不是通过 RNN 模型来实现的,所以说 RNN 模型和 Encoder-Decoder 模型没有从属关系。
RNN 的缺点
如果把 RNN 还是看作一次接力看剧的游戏,但这次这个剧集很长,可能是上万,十万,甚至是百万集,那么随着中间人的口口相传,慢慢的,最开始的一些剧集的内容在传递的过程慢慢被遗忘。这就是 RNN 的一个主要问题,它在处理长序列时,往往会忘记序列开始部分的信息。这就像是这个人的记忆有限,不能记住所有的情节。这种问题在 RNN 中被称为"长期依赖问题"。
用专业的语言来说,就是 RNN 在处理长序列时,往往难以捕捉到序列中的长期依赖关系。这是因为在 RNN 的训练过程中,会出现梯度消失或梯度爆炸的问题。当序列很长时,这个问题会变得更加严重。梯度消失会导致 RNN 难以学习到序列中早期的信息,而梯度爆炸则会导致训练过程不稳定。这两个问题都会限制 RNN 处理长序列的能力。
有关梯度爆炸和梯度消失的问题,网上有大量的从公式推导的文章,有兴趣的同学可以搜索看看,这里就不做详细解释了,只要记住 RNN 也是比较"健忘"的,不擅长处理长篇幅的事情。
进阶版:LSTM
正如我们所看到的,RNN 在处理长序列时存在一些困难,尤其是在捕捉长期依赖关系方面。这是因为在训练过程中,RNN容易遇到梯度消失或梯度爆炸的问题。那么,有没有一种方法可以解决这些问题,使得我们的模型能够更好地处理长序列呢?
答案是肯定的。这就是我们接下来要介绍的模型:长短期记忆网络(Long Short-Term Memory,简称LSTM)。LSTM 是 RNN 的一种变体,它通过引入一种特殊的结构 - "门",来控制信息的流动,从而有效地解决了 RNN 的长期依赖问题。
老规矩,依然看作是一次接力看剧的游戏,但换了一批接力的人玩,这批人更聪明,他们在传递剧集信息时不再复述每一集的全部内容了,他们有了总结信息的能力,会选择传递剧情的关键有用的信息,忽略无用的信息,这样在传递过程中每个人要记忆的信息大大减少了,但关键信息都保留了下来,对最后剧情的复现影响不大。
LSTM 中的特殊结构 - "门"就相当于总结信息的能力。每个 LSTM 单元都有自己的输入门、遗忘门和输出门,这些门的状态是由输入数据和单元的当前状态决定的。这意味着,对于同一输入,不同的 LSTM 单元可能会有不同的门状态,因此它们可能会选择记住或忘记不同的信息。这种设计使得LSTM能够在处理复杂和长序列的数据时,更好地捕捉到数据中的长期依赖关系。
具体的 LSTM 图如下:
这是单个 LSTM 单元内部结构图,其中三个门分别是:
- 输入门 𝑖:想象你正在看一部电影,你的大脑会自动筛选哪些信息是重要的,哪些可以忽略。输入门就像是这个筛选过程,它决定了哪些新信息需要被存储到记忆中。
- 遗忘门 𝑓:随着时间的推移,你可能会忘记一些不重要的信息,而保留重要的信息。遗忘门就像是这个遗忘过程,它决定了哪些旧信息需要从记忆中删除。
- 输出门 𝑜:当你需要回忆某个场景时,你的大脑会从记忆中提取相关信息。输出门就像是这个提取过程,它决定了哪些信息需要从记忆中读取出来,以便用于当前的任务。
显然,LSTM在处理长期依赖问题上优于RNN,但随着输入序列的增加,仍然会面临困难。此外,人们发现按顺序逐个处理输入的串行方式在计算效率上并不高。为了实现计算效率的质的飞跃,必须进行串行到并行的转变。
想要深入了解 LSTM 推荐参考论文《LONG SHORT-TERM MEMORY》和 《Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting》
LLM 基石 - 注意力(Attention)机制
在介绍当前最佳解决方案模型之前,我们按下不表,先来看看一个重要的基础知识 - 注意力机制。注意力机制为解决处理长序列时的困难提供了一种有效的解决方案,可以说它是目前整个 LLM 实现的基石之一。
注意力(Attention)机制发展的重要节点
类似于注意力(Attention)机制的架构最早于90年代提出,最早用于视觉领域。因为它最初灵感来源于人类的视觉,即当人用眼睛观察东西的时候,会 首先快速扫描全局图像,然后再捕捉需要重点关注的目标区域,将视 觉重点聚焦在这个目标区域,对重点区域投入更多注意力资源,同时忽略其他信息。
真正火起来应该算是 2014 年 Google Mind 团队的这篇论文《Recurrent Models of Visual Attention》,他们在 RNN 模型上使用了注意力(Attention)机制来进行图像分类。
2015 年 ICLR 在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中首次提出注意力(Attention)机制,结合 Encoder-Decoder 模型和 LSTM 模型用于机器翻译任务,他们的工作算是第一个将注意力(Attention)机制应用到 NLP 领域中。
2017 年,Google 机器翻译团队发表的《Attention Is All You Need》中,摒弃了 RNN(LSTM 模型算是 RNN 的一种变体),大量使用了自注意力(Self-Attention)机制来学习文本表示。
此后,注意力(Attention)机制就在 NLP 领域发光发热,一路狂飙,一定程度上造就了当下讨论热点 LLM。
注意力(Attention)机制是什么
其实通过字面意思也很好理解,注意力(Attention)机制就像是我们在阅读一篇文章时,会关注文章中的重点部分。当我们需要理解某个特定的概念时,我们会把注意力集中在与这个概念相关的部分,而忽略其他不相关的部分。同样,在处理序列数据时,注意力机制可以帮助模型关注与当前任务最相关的部分,从而提高模型的性能。
说白了,解决长序列问题的方案,大家都是在如何筛选有效信息上下功夫,LSTM 门控策略是如此,注意力(Attention)机制亦是如此,那注意力机制是如何做到比 LSTM 门控更好的呢?
小白版
比如你在看一本书时,你的大脑会自动过滤掉不重要的信息,只关注重要的部分。而 LSTM 就像是一个按顺序阅读的人,虽然它也可以记住一些重要的信息,但是如果这些信息距离当前位置很远,那么它可能就会忘记。而注意力(Attention)机制就像是可以随时跳回去查看重要信息的人,所以它可以更好地从全局的视角来关注重点。
大神版
在LSTM中,信息是通过隐藏状态在序列的各个位置之间传递的,这可能导致距离当前位置较远的重要信息在传递过程中被遗忘。而注意力机制通过计算每个位置的权重,可以直接关注到序列中任何位置的信息,无论这个位置距离当前位置有多远。这使得注意力机制能够更好地捕捉到序列中的长期依赖关系,从而更好地关注重点。
注意力机制的原理主要基于对输入序列中每个元素的重要性进行权重分配。在深度学习模型中,这种权重分配通常是通过学习得到的。
在注意力机制中,Query、Key 和 Value 是三个核心概念,它们通常都是向量形式的表示。
-
Query :通常来自于需要进行预测的当前位置,比如在机器翻译中,如果我们想要预测目标语言的下一个词,那么这个词的上下文信息就可以作为 Query。
-
Key 和 Value :它们通常来自于输入数据,比如在机器翻译中,源语言的每个词及其上下文信息就可以作为 Key 和 Value。Key 用于和 Query 进行匹配,计算出每个位置的注意力权重;Value 则是根据这些权重进行加权求和的对象,得到的结果就是注意力机制的输出。
具体来说,注意力机制分三个主要阶段:
- 首先会计算一个 Query 和每个 Key 的匹配程度,这通常通过计算它们的点积或者其他相似度度量来实现,得到权值 s
- 将权值 s 进行归一化为概率分布,这通常通过 softmax 函数来实现,得到权重 a
- 模型会根据这个概率分布对 Value 进行加权求和,得到最终的输出 Attention Value
注意力机制的这种设计使得模型能够在处理输入序列时,关注到与当前任务最相关的部分,从而提高模型的性能。
如果想更深入的了解 Attention,可以参考以下三篇论文:
- 《Neural Machine Translation by Jointly Learning to Align and Translate》
- 《Attention Is All You Need》
- 《Effective Approaches to Attention-based Neural Machine Translation》
注意力(Attention)机制类型
软注意力(Soft Attention)
软注意力就像是你在看一幅画,你的眼睛可以在整幅画上自由移动,但是你的注意力会更多地集中在你感兴趣的部分,比如画中的人物或者某个特定的细节。
这是比较常见的 Attention 方式,是一种全局的注意力机制。每个 key 都有一个对应的权重,这些权重是连续的并且可以通过梯度下降进行优化。这种机制允许模型在处理输入数据时,参考了所有 key 的内容,再进行加权,比较全面和理性。但是计算量可能会比较大一些。
硬注意力(Hard Attention)
硬注意力就像是你在看一幅画,但是你只能看到画中的一小部分,你需要移动你的视线来看其他部分。
它是一种局部的注意力机制,这种方式是在每个时间步直接精准定位到某个 key,其余 key 就都不管了。这种机制使得模型在处理输入数据时,只能考虑到一个位置的信息,并且这个位置不能通过梯度下降进行优化。
自注意力(Self-Attention)
简单来说,自注意力就是让模型自己去发现输入序列中各个部分之间的相互关系。
想象一下,你正在阅读一段文字,每个单词都是输入序列中的一个位置。自注意力机制会让模型去计算每个单词与其他所有单词之间的关联程度。这样,模型就可以根据这些关联程度来为每个单词生成一个的关系图,这个关系图包含了与其他单词的关系信息。这种方法让模型能够捕捉到序列中的长距离依赖关系,从而更好地理解整个序列的含义。
自注意力是一种特殊的注意力机制。它的主要目的是帮助模型更好地理解序列数据中的各个部分之间的关系。在自注意力中,查询(Query)、键(Key)和值(Value)都来自同一处的输入。对于输入序列中的每一个位置,都会计算它与序列中所有其他位置的相似度,然后用这些相似度作为权重,对输入序列进行加权求和,得到该位置的新表示。这种机制允许模型在处理序列数据时,考虑到每个位置与其他所有位置之间的关系,从而捕捉到长距离的依赖关系。
自注意力机制是 Transformer 模型中的重要组成部分,它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)结构,完全依赖自注意力来处理序列数据。
Transformer
Transformer 是一种基于自注意力机制的深度学习模型,专门用于处理序列数据。在 NLP 领域,Transformer 取得了巨大的成功,并成为当前热门的 LLM 如 GPT 和 BERT 的核心组件。
并且 Transformer 解决了前面提到的串型结构效率低下,长期依赖的问题,同时因为完全采用了自注意力机制,使得我们可以直观地看到模型在处理序列数据时,对每个位置的关注程度。这可以帮助我们理解模型的决策过程,比如在机器翻译任务中,我们可以看到模型在翻译一个单词时,主要参考了源语言句子中的哪些部分。
总之当下看来 Transformer 在 NLP 领域是一次里程碑式的进步。
Transformer 原理
小白版
想象你正在看一部电影,你不仅会关注当前的画面,还会记住之前的剧情,比如人物、地点和事件等。当你看到一个新的画面时,你会自动地将这个画面与之前的剧情进行比较,看看它们之间有什么关联。这其实就是自注意力机制的原理,同时也是 Transformer 的基本思想,它可以帮助你理解每个画面在整个电影中的位置和重要性。Transformer就像是一个超级电影观众,它可以同时关注电影中的所有画面,并理解它们之间的关系。
大神版
这张图出自 Google 的《Attention Is All You Need》,是 Transformer 的基本结构,通过图可看出整个结构分为左右两块,左边的部分是编码器Encoder ,右边的部分是解码器Decoder,可看出 Transformer 同时使用了 Encoder-Decoder 结构。根据不同的任务需要,使用对应的部分,一般编码器部分常用于文本编码分类,解码器部分用于语言模型生成,完整的编码器-解码器结构用于机器翻译。
从 Encoder-Decoder 结构宏观来看,翻译的流程是:
而在 Encoders 和 Decoders 中都有 N 个 Encoder 和 Decoder(对应着原图中旁边的 N×),因为论文中的 N 为 6,所以我们这里图示 6 层 Encoder 和 6 层 Decoder。
Encoder
每个 Encoder 分为两个部分,Multi-Head Attention(多头注意力)和 Feed-Forward(前馈)。
Multi-Head Attention(多头注意力)
先说说 Multi-Head Attention(多头注意力),Multi-Head Attention 是在自注意力机制的基础上进行的扩展。我们不只进行一次自注意力计算,而是进行多次,每次都使用不同的权重矩阵。这样,每个"头"都能从不同的角度去捕捉序列中的信息,从而使得模型能够学习到更丰富的表示。
针对图上的例子,要翻译 The animal didn't cross the street because it was too tired 这句话,模型需要理解句子中的 it 指代什么,但采用自注意力机制理解时会发现 it 有一部分注意力集中在了 The animal 上。这里也可以理解为此时是单头注意力(只有一种颜色的连线)
当采用多头注意力时,会发现此时 it 在模型中的表示,融合了 animal 和 tire 的部分表达。
注意:图中左上角的 Layer 是指此时的 Transformer 在第 5 层 Encoder 的输出,不同颜色的线代表不同 Head 的注意力分布。
Feed-Forward(前馈)
如果把 Multi-Head Attention(多头注意力)想象成你正在看一场足球比赛,你的注意力可能会被分散到不同的地方,比如球员的位置、球的运动轨迹、比分等。你的大脑会同时处理这些信息。那么 Feed-Forward(前馈)就像是你的大脑对比赛的理解过程。你会根据你关注的信息,比如球员的位置和球的运动轨迹,来预测下一步会发生什么。
前馈网络是一个包含两个线性变换和一个非线性激活函数的神经网络。它会对从多头注意力机制中获取的信息进行进一步的非线性变换,从而生成更复杂的表示。这个过程是独立进行的,也就是说,每个位置的计算都不依赖于其他位置,这使得前馈网络可以高效地并行计算。
总之前馈网络的作用就是,它会对从多头注意力机制中获取的信息进行进一步的处理,从而生成更复杂的表示。
Decoder
由图可以看出 Decoder 其实与 Encoder 的结构类似,由 Masked Multi-Head Attention(遮罩多头注意力),Multi-Head Attention(多头注意力)和 Feed-Forward(前馈)三部分组成。
Masked Multi-Head Attention(遮罩多头注意力)
想象你正在玩一个填字游戏,你需要根据已知的字母来猜测整个单词。在这个过程中,你不能看到单词的未来字母,只能根据已知的字母来进行推理。这就像是遮罩多头注意力机制,它让模型在处理序列时,只能关注到当前位置及其之前的部分,从而避免"偷看"未来的信息。
这是一种特殊的自注意力机制,它在计算注意力权重时,会使用一个遮罩矩阵来阻止模型关注到当前位置之后的部分。这样,模型在处理序列时,只能关注到当前位置及其之前的部分,从而避免在生成输出序列时提前获取未来的信息,从而影响输入结果。
Multi-Head Attention(多头注意力)和 Feed-Forward(前馈)两个部分的作用与 Encoder 的基本一致。
聊完 Encoder 和 Decoder 大家基本上对 Transformer 的整个工作流有个大致的了解了,当然如果想要更深入的了解 Transformer,需要结合一些基础的词向量和位置向量的知识,也推荐大家直接去看 Google 的 《Attention Is All You Need》,里面对此都有很详细的介绍。
尾言
Transformer 模型不仅在机器翻译等自然语言处理任务中取得了显著的效果,而且成为了许多当前主流的大型语言模型,如GPT和BERT等的基础。这些模型在各种任务中都表现出了强大的性能,包括文本分类、情感分析、命名实体识别、问答系统等。
了解 transformer 模型的原理,对于预测未来大型语言模型的发展方向,以及深入理解这些模型的工作原理都是非常有帮助的。这不仅可以让我们在与他人交谈时有更深的洞察力,而且可以帮助我们在开发应用时更好地利用模型的优点,迭代出更好的模型。