NLP课程笔记-基于transformers的自然语言处理入门

项目地址

https://github.com/datawhalechina/learn-nlp-with-transformers/

  • 2017年,Attention Is All You Need论文(Google Brain)首次提出了Transformer模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。
  • 2018年,BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (Google AI Language lab)使用Transformer模型结构进行大规模语言模型(language model)预训练(Pre-train),再在多个NLP下游(downstream)任务中进行微调(Finetune),一举刷新了各大NLP任务的榜单最高分,轰动一时。
  • 2019年-2021年,研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合,提出了一系列Transformer模型结构、训练方式的改进(比如transformer-xl,XLnet,Roberta等等)。如下图所示,各类Transformer的改进不断涌现。

现在较为流行的基于transformer模型,基本你都可以在hugging/transformer库中找到并直接使用。

2.1 图解attention

问题:Attention出现的原因是什么? 潜在的答案:基于循环神经网络(RNN)一类的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果

于是学习的问题就拆解为:1. 什么是seq2seq模型?2. 基于RNN的seq2seq模型如何处理文本/长文本序列?3. seq2seq模型处理长文本序列时遇到了什么问题?4.基于RNN的seq2seq模型如何结合attention来改善模型效果?

2.1.1 Seq2seq框架

seq2seq是一种常见的NLP模型结构,全称是:sequence to sequence,翻译为“序列到序列”。顾名思义:从一个文本序列得到一个新的文本序列。
典型的任务有:机器翻译任务,文本摘要任务。谷歌翻译在2016年末开始使用seq2seq模型,并发表了2篇开创性的论文。

首先看seq2seq干了什么事情?seq2seq模型的输入可以是一个(单词、字母或者图像特征)序列,输出是另外一个(单词、字母或者图像特征)序列。一个训练好的seq2seq模型如下图所示。
在这里插入图片描述
在这里插入图片描述

2.1.2 Seq2seq细节

由于seq2seq模型可以用来解决机器翻译任务,因此机器翻译被任务seq2seq模型解决过程如下图所示,当作seq2seq模型的一个具体例子来学习。
在这里插入图片描述在这里插入图片描述

seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN(Transformer模型还没出现的过去时代)。编码器将输入的法语单词序列编码成context向量(在绿色encoder和紫色decoder中间出现),然后解码器根据context向量解码出英语单词序列
深入学习机器翻译任务中的seq2seq模型,如下图所示。**seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN(Transformer模型还没出现的过去时代)。**编码器将输入的法语单词序列编码成context向量(在绿色encoder和紫色decoder中间出现),然后解码器根据context向量解码出英语单词序列。
在这里插入图片描述
图:context向量对应上图中间浮点数向量。在下文中,我们会可视化这些数字向量,使用更明亮的色彩来表示更高的值,如上图右边所示

如上图所示,我们来看一下黄色的context向量是什么?本质上是一组浮点数。而这个context的数组长度是基于编码器RNN的隐藏层神经元数量的。上图展示了长度为4的context向量,但在实际应用中,context向量的长度是自定义的,比如可能是256,512或者1024。
那么RNN是如何具体地处理输入序列的呢?
假设序列输入是一个句子,这个句子可以由 n n n个词表示: s e n t e n c e = { w 1 , w 2 , . . . , w n } sentence = \{ w_1, w_2,...,w_n\} sentence={ w1,w2,...,wn}

RNN首先将句子中的每一个词映射成为一个向量得到一个向量序列: X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2,...,x_n\} X={ x1,x2,...,xn},每个单词映射得到的向量通常又叫做:word embedding。

然后在处理第 t ∈ [ 1 , n ] t \in [1,n] t[1,n]个时间步的序列输入 x t x_t xt时,RNN网络的输入和输出可以表示为: h t = R N N ( x t , h t − 1 ) h_{t} = RNN(x_t, h_{t-1}) ht=RNN(xt,ht1)

输入:RNN在时间步 t t t的输入之一为单词 w t w_t wt经过映射得到的向量 x t x_t xt
输入:RNN另一个输入为上一个时间步 t − 1 t-1 t1得到的hidden state向量 h t − 1 h_{t-1} ht1,同样是一个向量。
输出:RNN在时间步 t t t的输出为 h t h_t ht hidden state向量。

让我们详细观察一下编码器如何在每个时间步得到hidden sate,并将最终的hidden state传输给解码器,解码器根据编码器所给予的最后一个hidden state信息解码处输出序列。注意,最后一个 hidden state实际上是我们上文提到的context向量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编码器逐步得到hidden state传输最后一个hidden state给解码器

在这里插入图片描述
编码器首先按照时间步依次编码每个法语单词,最终将最后一个hidden state也就是context向量传递给解码器,解码器根据context向量逐步解码得到英文输出。

目前为止,希望你已经明白了本文开头提出的前两个问题:1. 什么是seq2seq模型?2. seq2seq模型如何处理文本/长文本序列?
1、是一种从序列输入得到序列输出的模型架构。
2、通过编码器和解码器构成长文本处理的整个过程。编码器和解码器本身一般采用的是循环神经网络来实现(Transformers模型还没出现时)。

那么请思考第3、4个问题:
3. seq2seq模型处理文本序列(特别是长文本序列)时会遇到什么问题
4.基于RNN的seq2seq模型如何结合attention来解决问题3并提升模型效果?

2.1.3 Attention

1) 基于RNN的seq2seq模型的问题

基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈。一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战(比如RNN处理到第500个单词的时候,很难再包含1-499个单词中的所有信息了)。

2)基于Attention seq2seq方案

面对以上问题,Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的Effective Approaches to Attention-based Neural Machine Translation 两篇论文中,提出了一种叫做注意力attetion的技术。通过attention技术,seq2seq模型极大地提高了机器翻译的质量。归其原因是:attention注意力机制,使得seq2seq模型可以有区分度、有重点地关注输入序列。

下图依旧是机器翻译的例子:
在这里插入图片描述
在第7个时间步,注意力机制使得解码器在产生英语翻译之前,可以将注意力集中在 “student” 这个词(在法语里,是 “student” 的意思)。这种从输入序列放大相关信号的能力,使得注意力模型,比没有注意力的模型,产生更好的结果。

让我们继续来理解带有注意力的seq2seq模型:一个注意力模型与经典的seq2seq模型主要有2点不同:
A. 首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态),如下面的动态图所示:
在这里插入图片描述
B. 注意力模型的解码器在产生输出之前,做了一个额外的attention处理。如下图所示,具体为:

由于编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词,那么解码器要查看所有接收到的编码器的 hidden state(隐藏层状态)。
给每个 hidden state(隐藏层状态)计算出一个分数(我们先忽略这个分数的计算过程)。
所有hidden state(隐藏层状态)的分数经过softmax进行归一化。
将每个 hidden state(隐藏层状态)乘以所对应的分数,从而能够让高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。
将所有hidden state根据对应分数进行加权求和,得到对应时间步的context向量。
在这里插入图片描述
在第4个时间步,编码器结合attention得到context向量的5个步骤。
所以,attention可以简单理解为:一种有效的加权求和技术,其艺术在于如何获得权重。

现在,让我们把所有内容都融合到下面的图中,来看看结合注意力的seq2seq模型解码器全流程,动态图展示的是第4个时间步:

注意力模型的解码器 RNN 的输入包括:一个word embedding 向量,和一个初始化好的解码器 hidden state,图中是 h i n i t h_{init} hinit
RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state,图中为h4。
注意力的步骤:我们使用编码器的所有 hidden state向量和 h4 向量来计算这个时间步的context向量(C4)。
我们把 h4 和 C4 拼接起来,得到一个橙色向量。
我们把这个橙色向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有N个,那么这个前馈神经网络的输出向量通常是N维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率。
在下一个时间步重复1-6步骤。
在这里插入图片描述
注意:在注意力模型的解码器中,初始状态下输入的绿色word embedding向量代表的是序列结束符(End of Sequence token,通常记作或)。在神经机器翻译和其他序列生成任务中,序列结束符标记输入序列的终止。在解码开始阶段,将<END>作为输入意味着我们在解码器的初始时刻还没有任何生成的单词,因此使<END>来

到目前为止,希望你已经知道本文开头提出的3、4问题的答案啦:
3、seq2seq处理长文本序列的挑战是什么?
答:基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈。一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战(比如RNN处理到第500个单词的时候,很难再包含1-499个单词中的所有信息了)。

4、seq2seq是如何结合attention来解决问题3中的挑战的?
答:通过关注编码器输出的所有隐藏层特征,从而解决了单个向量context代表整个数据的信息不足问题。
防止过长的文本在递归编码过程中信息衰减,通过注意力可以有区分度有重点地关注输入文本,从而改善这个问题。
最后,我们可视化一下注意力机制,看看在解码器在每个时间步关注了输入序列的哪些部分:
在这里插入图片描述
动态图:解码步骤时候attention关注的词

需要注意的是:注意力模型不是无意识地把输出的第一个单词对应到输入的第一个单词,它是在训练阶段学习到如何对两种语言的单词进行对应(在我们的例子中,是法语和英语)。
下图还展示了注意力机制的准确程度(图片来自于上面提到的论文):
在这里插入图片描述
“European Economic Area” 时,注意力分布情况。在法语中,这些单词的顺序,相对于英语,是颠倒的(“européenne économique zone”)。而其他词的顺序是类似的。

2.2 图解transformer

有没有一种神经网络结构直接基于attention构造,并且不再依赖RNN、LSTM或者CNN网络结构了呢?答案便是:Transformer。因此,我们将在本小节对Transformer所涉及的细节进行深入探讨。
Transformer模型在2017年被google提出,直接基于Self-Attention结构,取代了之前NLP任务中常用的RNN神经网络结构,并在WMT2014 Englishto-German和WMT2014 English-to-French两个机器翻译任务上都取得了当时的SOTA

与RNN这类神经网络结构相比,Transformer一个巨大的优点是:模型在处理序列输入时,可以对整个序列输入进行并行计算,不需要按照时间步循环递归处理输入序列。
2.1章节详细介绍了RNN神经网络如何循环递归处理输入序列,欢迎读者复习查阅。

下图先便是Transformer整体结构图,与篇章2.1中介绍的seq2seq模型类似,Transformer模型结构中的左半部分为编码器(encoder),右半部分为解码器(decoder),下面我们来一步步拆解 Transformer。

图:transformer模型结构
图:transformer模型结构
注释和引用说明:本文将通过总-分的方式对Transformer进行拆解和讲解,希望有助于帮助初学者理解Transformer模型结构。

2.2.1 transformer宏观结构

以机器翻译任务为例,先将Transformer这种特殊的seqseq模型看作一个黑盒,黑盒的输入是法语文本序列,输出是英语文本序列(对比2.1章节的seq2seq框架知识我们可以发现,Transformer宏观结构属于seq2seq范畴,只是将之前seq2seq中的编码器和解码器,从RNN模型替换成了Transformer模型)。
在这里插入图片描述
图:Transformer黑盒输入和输出

将上图中的中间部分“THE TRANSFORMER”拆开成seq2seq标准结构,得到下图:左边是编码部分encoders,右边是解码器部分decoders。
在这里插入图片描述
图:encoder-decoder
下面,再将上图中的编码器和解码器细节绘出,得到下图。我们可以看到,编码部分(encoders)由多层编码器(Encoder)组成(Transformer论文中使用的是6层编码器,这里的层数6并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分(decoders)也是由多层的解码器(Decoder)组成(论文里也使用了6层解码器)。每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器网络结构不共享参数。
在这里插入图片描述
图:6层编码和6层解码器

单层编码器

接下来,我们看一下单层encoder,单层encoder主要由以下两部分组成,如下图所示

  • Self-Attention Layer
  • Feed Forward Neural Network(前馈神经网络,缩写为 FFNN)

编码器的输入文本序列 w 1 , w 2 , . . . , w n w_1, w_2,...,w_n w1,w2,...,wn最开始需要经过embedding转换,得到每个单词的向量表示 x 1 , x 2 , . . . , x n x_1, x_2,...,x_n x1,x2,...,xn,其中 x i ∈ R d x_i \in \mathbb{R}^{d} xiRd是维度为 d d d的向量,然后所有向量经过一个Self-Attention神经网络层进行变换和信息交互得到 h 1 , h 2 , . . . h n h_1, h_2,...h_n h1,h2,...hn,其中 h i ∈ R d h_i \in \mathbb{R}^{d} hiRd是维度为 d d d的向量。
self-attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息(你可以类比为:当我们翻译一个词的时候,不仅会只关注当前的词,也会关注这个词的上下文的其他词的信息)。

Self-Attention层的输出会经过前馈神经网络得到新的 x 1 , x 2 , . . , x n x_1, x_2,..,x_n x1,x2,..,xn,依旧是 n n n个维度为 d d d的向量。这些向量将被送入下一层encoder,继续相同的操作。
在这里插入图片描述
图:单层encoder

单层解码器

与编码器对应,如下图,解码器在编码器的self-attention和FFNN中间插入了一个Encoder-Decoder Attention层,这个层帮助解码器聚焦于输入序列最相关的部分(类似于seq2seq模型中的 Attention)。
在这里插入图片描述
图:单层decoder

总结一下,我们基本了解了Transformer由编码部分和解码部分组成,而编码部分和解码部分又由多个网络结构相同的编码层和解码层组成。
每个编码层由self-attention和FFNN组成,每个解码层由self-attention、FFNN和encoder-decoder attention组成。

以上便是Transformer的宏观结构啦,下面我们开始看宏观结构中的模型细节。

2.2.2 transformer结构细节

了解了Transformer的宏观结构之后。下面,让我们来看看Transformer如何将输入文本序列转换为向量表示,又如何逐层处理这些向量表示得到最终的输出。
因此本节主要内容依次包含:

  • 输入处理 input processing
    • 词向量(word embedding)
    • 位置向量(position embedding)
  • 编码器(encoder)
  • 解码器(decoder)

1.输入处理

词向量

和常见的NLP 任务一样,我们首先会使用词嵌入算法(embedding algorithm),将输入文本序列的每个词转换为一个词向量。实际应用中的向量一般是 256 或者 512 维。但为了简化起见,我们这里使用4维的词向量来进行讲解。

如下图所示,假设我们的输入文本是序列包含了3个词,那么每个词可以通过词嵌入算法得到一个4维向量,于是整个输入被转化成为一个向量序列。在实际应用中,我们通常会同时给模型输入多个句子,如果每个句子的长度不一样,我们会选择一个合适的长度,作为输入文本序列的最大长度:如果一个句子达不到这个长度,那么就填充先填充一个特殊的“padding”词;如果句子超出这个长度,则做截断。最大序列长度是一个超参数,通常希望越大越好,但是更长的序列往往会占用更大的训练显存/内存,因此需要在模型训练时候视情况进行决定。

在这里插入图片描述
图:3个词和对应的词向量

输入序列每个单词被转换成词向量表示还将加上位置向量来得到该词的最终向量表示。

位置向量

如下图所示,Transformer模型对每个输入的词向量都加上了一个位置向量。这些向量有助于确定每个单词的位置特征,或者句子中不同单词之间的距离特征。词向量加上位置向量背后的直觉是:将这些表示位置的向量添加到词向量中,得到的新向量,可以为模型提供更多有意义的信息,比如词的位置,词之间的距离等。
在这里插入图片描述
图:位置编码向量
依旧假设词向量和位置向量的维度是4,我们在下图中展示一种可能的位置向量+词向量:
在这里插入图片描述
那么带有位置编码信息的向量到底遵循什么模式?原始论文中给出的设计表达式为:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d model ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d model ) PE_{(pos,2i)} = sin(pos / 10000^{2i/d_{\text{model}}}) \\ PE_{(pos,2i+1)} = cos(pos / 10000^{2i/d_{\text{model}}}) PE(pos,2i)=sin(pos/100002i/dmodel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五阿哥爱跳舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值