<aside> <img src="/icons/thinking_gray.svg" alt="/icons/thinking_gray.svg" width="40px" />

在深度学习爆火的这几年,相信大家都一定对Transformer这个词不陌生,可以说正是由于Transformer模型的出现和不断改进,使得以自然语言处理为代表的深度学习领域发生了天翻地覆的改变,任何一个从事相关领域的人都有必要了解一下Transformer这个架构的底层原理以及它为什么能够为深度学习带来里程碑式的发展。我相信很多人和我一样,初学时看到 Attention is All You Need这篇论文时整个人都感觉头大,但这并不能成为阻碍我们学习的借口,为了驱动自己“啃下”这块硬骨头,便有了写这篇blog的念头和动力,希望它在作为自己消化理解Transformer架构的同时也能稍许帮助到其他和我一样wanna figure it out的人吧!

</aside>

1.What is Transformer

Transformer架构在2017年由Google相关成员发布的一篇名为“Attention is All You Need”的论文中首次出现,其凭借独特的自注意力机制和优秀的表现能力迅速成为许多大语言模型的核心部分,例如我们最常用的ChatGPT系列模型。

image.png

Transformer最初是为了解决序列传导$^{1}$问题而开发的一种通过顺序数据分析来学习和理解上下文的神经网络架构,这意味着它旨在解决将输入序列转换为输出序列的相关任务,这也就是为什么它叫做“Transformer”的原因(类似于一个黑盒转换器)。

简单来说,我们可以将Transformer定义为“A transformer is a type of artificial intelligence model that learns to understand and generate human-like text by analyzing patterns in large amounts of text data$^{2}$”。

image.png

我们知道,在传统的Encoder-Decoder架构中,RNN常被用来处理输入序列(Encoder部分)并生成输出序列(Decoder部分),其***循环性$^{3}$体现在序列中的每个元素在不同的时间步被逐个输入到网络中,在每个时间步中当前的输入都会与先前的状态进行结合,然后生成当前的输出和更新状态。RNN的递归结构使得信息可以从一个时间步传递到下一个时间步,这意味着当前时刻的隐藏状态$^{4}$***不仅仅依赖于当前的输入,还依赖于前一时刻的隐藏状态,但是当输入序列超出一定长度时RNN会面临梯度消失或者梯度爆炸的问题,这使得它将难以学习长期依赖信息。

作为当前最先进的NLP模型,Transformer被认为是对传统Encoder-Decoder架构的改进,但不同的是,Transformer并不像RNN的循环性那样逐步处理输入序列,而是通过自注意力机制在同一个时间步中处理整个序列,这使得模型能够在处理输入时同时关注到序列中的所有位置。在Transformer中,每一层的输出直接依赖于整个输入序列而不依赖于先前的隐藏状态,因此信息的传递不再是线性的而是全局性的,这允许模型在处理序列时优于RNN在捕捉长范围信息依赖上的局限性。

介绍到这里,我们不难发现RNN存在如下两个主要问题,而Transformer架构正是对这两个问题进行了改良:

  1. RNN按照顺序one by one地处理输入数据,这种线性循环过程无法利用专门为并行计算而设计的GPU资源,因此使得此类模型的训练速度相当缓慢;
  2. 当输入序列较长数据元素之间彼此远离时,信息沿着处理链丢失的可能性就进一步加大,这使得模型无法正确获取到完整的可用信息来进行输出处理。

1:sequence transduction,核心任务为在输入序列与输出序列之间建立映射关系,通过捕捉输入序列中的信息来调用算法生成相应的输出序列。例如在常见的翻译任务中,输入序列可以是一段英文文本,而希望的输出序列是翻译后的中文段落;除此之外,生活中常见的语音文字识别、文本和字幕生成等应用都属于序列传导。为了实现与序列传导相关的任务,人们研发了包括Transformer在内的多种模型架构,常见的还有循环神经网络(RNN)、长短期记忆网络(LSTM)等。

2:https://www.datacamp.com/tutorial/how-transformers-work

3:此处的循环性指的是模型处理序列数据时的结构特性。

4:hidden state,是指RNN在每个时间步计算得到的内部表示状态,它用于保存模型在序列处理过程中的信息。具体来说隐藏状态是一个向量,它能够捕捉到当前时刻及先前时刻的信息,使得网络可以跟踪输入序列的上下文信息。


2.How it Works

从官方论文提供的Transformer架构图中可以看出,Transformer主要由Encoder、Decoder两部分组成,其中Encoder接收初始输入序列并经过一系列处理后输出相应的矩阵表示,Decoder通过接收Encoder的矩阵输出以及自身输入迭代处理后生成最终输出。

image.png

实际上,Encoder和Decoder都是由多层组合起来的堆叠$^{5}$(Encoder和Decoder的层数量保持相同),所有的Encoder都具有相同的结构,初始输入从进入到第一个Encoder后依次处理并传递至下一个Encoder,直到最后一个Encoder输出;所有的Decoder也都具有相同的结构,每个Decoder都从最后一个Encoder和自己位置的前一个Decoder获取输入。论文中的Transformer架构是由6个Encoder和6个Decoder组成,但理论上我们可以设计成任意数量层。