引言
如今爆火的大模型,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 单元内部结构图,其中三个门分别是: