本文是对台大李宏毅教授讲授的Transformer课程的笔记总结,附上课程和ppt的链接~方便广大友友们自取
13.【李宏毅机器学习2021】Transformer (下)哔哩哔哩bilibili
目录
2.区分 multi-label classification和multi-class classification
Decoder 2:Non-autoregressive(NAT)
一.Transformer简介
在学习Transformer模型之前,我们需要花一点篇幅来介绍Seq2seq模型。
因为,Seq2seq模型是Transformer模型的基础。
在Transformer模型中,虽然采用了自注意力机制来替代了Seq2seq模型中的RNN或LSTM网络,但整个模型仍然保持了Seq2seq模型的架构,即编码器-解码器架构。此外,对于初学者来说,先了解Seq2seq模型可以更好地理解Transformer模型的工作原理和结构。
Transformer是一个sequence-to-sequence(seq2seq)的模型。即,input是sequence,output也是sequence,但是output的长度不确定(非1.n-n 2.n-1),长度完全由模型自己决定的。
例如,输入音频,通过声音处理,输出辨识出的文字,“我想吃香蕉”。其中,这个文字的长度就是难以确定的,需要模型决定。
以台语为例,其文字没有很普及,如果只是语音辨识,输出的“母汤”我们根本就看不懂,于是我们想到了speech translation,就直接翻译为“不行”。
台语音频-------》繁体中文
SEQ2的广泛应用场景
1.文法剖析
任务:产生parsing tree
而树状结构可以对应为一个sequence
2.区分 multi-label classification和multi-class classification
multi-label:一篇文章可以对应多个label,可用seq2seq硬做!机器自己决定一篇文章属于多少class
通过以上的种种应用,我们不难看出,seq2seq的应用范围十分宽广,很多问题都可以用seq2seq暴力解决。
该部分的收尾部分,我们通过一个比较表格,对seq2seq的特点进行总结,并与Transformer进行对比。这可能有利于读者们对于接下来的Transformer重点结构有一个大致的印象。
特征 | Seq2seq模型 | Transformer模型 |
---|---|---|
架构 | 编码器-解码器架构 | 编码器-解码器架构 |
输入序列处理 | 按顺序输入RNN/LSTM网络 | 并行处理每个元素(自注意力机制) |
语义编码向量C | 由编码器生成,用于解码器生成输出序列 | 由编码器生成,用于解码器生成输出序列 |
训练速度 | 相对较慢(RNN/LSTM网络按顺序处理) | 相对较快(并行处理) |
主要技术 | RNN/LSTM网络 | 自注意力机制、残差连接、归一化等 |
优化和改进方面 | - | 结构上的优化(自注意力机制替代RNN/LSTM)和性能上的改进(残差连接、归一化等) |
这个表格总结了Seq2seq和Transformer模型之间的主要异同点,包括架构、输入序列处理、语义编码向量C、训练速度以及采用的主要技术。
接下来,我们就来具体学习Transformer的结构。
二、Transformer结构
Part 1——Transformer总结构概览
Transformer模型的结构可以总结为以下几个部分:
- 输入部分:包括源文本嵌入层和目标文本嵌入层,以及它们的位置编码器。嵌入层将文本、语音等符号转变为向量表示,位置编码器则用于考虑词与词之间的相关性。
- 编码器(Encoder)部分:由多个编码器层堆叠而成,每个编码器层包括两个子层连接结构。第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接,第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接。
- 解码器(Decoder)部分:同样由多个解码器层堆叠而成,每个解码器层包括三个子层连接结构。第一个子层连接结构包括一个带掩码的多头自注意力子层和规范化层以及一个残差连接,第二个子层连接结构包括一个多头注意力子层(编码器到解码器)和规范化层以及一个残差连接,第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接。
对整个模型结构有一个大致的了解后,我们应该能够看出,类似于Seq2seq模型,Transformer模型中最重要的就是Encoder-Decoder结构。

接下来,我们就分别来学习Encoder和Decoder结构。
Part 2——Encoder
在Transformer模型中,Encoder部分主要负责将输入序列(如一段文本)转换为一种中间表示,这种中间表示将用于Decoder部分生成输出序列。
数学意义上理解,Encoder的目的就是,输入一排向量,输出一排同等数量的向量。(见下图左边)

Encoder部分的结构(上图右边)可以进一步细分为以下几个部分:
- 输入层:负责接收输入序列,并将每个符号(如单词)转换为一个向量表示。这个向量表示通常被称为词嵌入(embedding),它是通过学习大量语料库而得到的。
- 位置编码层(positonal encoding):由于Transformer模型采用自注意力机制,它不像RNN那样天然地考虑输入序列中词的位置信息。因此,位置编码层负责将每个词的位置信息编码为一个向量,并将其加到词嵌入上。这样,模型就能考虑到词在序列中的位置。
- 编码器层堆叠(block):Transformer模型的Encoder部分通常由多个编码器层堆叠而成。每个编码器层都具有相同的结构block,并且它们之间通过残差连接和规范化层进行连接。
- 多头自注意力子层(multi head attention):在每个编码器层中,首先是一个多头自注意力子层。这个子层负责计算输入序列中每个词与其他词之间的相关性,并生成一个注意力权重分布。这个注意力权重分布用于计算一个加权和的向量表示,这个向量表示考虑了序列中其他词对当前词的影响。该部分具体计算过程见上一篇https://blog.csdn.net/m0_61803871/article/details/134819852?spm=1001.2014.3001.5502
- 前馈全连接子层(feed forward):在每个编码器层中,紧接着多头自注意力子层的是一个前馈全连接子层。这个子层负责将多头自注意力子层的输出通过一个全连接神经网络进行处理,以捕获更复杂的特征表示。
- 残差连接和规范化层:在每个子层之后,都有一个残差连接和一个规范化层。残差连接负责将子层的输入与输出相加,以避免梯度消失和表示瓶颈问题。规范化层则负责对子层的输出进行规范化处理,以加速模型的收敛速度。
在multi head attention层的具体计算可见上一篇博客注意力机制-CSDN博客,在此不赘述。
在encoder中,由多个编码器层堆叠而成,具有相同的结构block。注意,一个block相当于多个layer,所以我们不称之为layer,而是使用block的名称。
一个block中,包含了:
- self-attention
- feed forward(在李宏毅的课件里称为FC)
- residual
- norm
我们重点关注block的结构。
在transformer中一个block的步骤如下,主要改进为residual connection架构:
-
self-attention子层中的residual connection(残差连接)被用来添加输入数据和输出数据之间的直接连接。(输入和输出相加一次)有以下2点作用:避免梯度消失或梯度爆炸问题;残差连接可以使输入数据和输出数据的形状保持不变,避免信息丢失,并且可以使模型的训练速度和精度得到提高。
-
得到residual后对其进行normalization(layer normalization),不用考虑batch。
-
norm完后,在FC层也进行residual
-
residual后,再norm
-
最后得到一个block的输出

(其中,add&norm=residual + layer norm;feed forward=FC)
PS:这个复杂的block在BERT中也有用啦~~~
Part 3——Decoder
Transformer的Decoder结构有两种主要类型:Autoregressive Decoder (AT)和非自回归性Decoder (NAT)。
- Autoregressive Decoder (AT):这是Transformer中默认的Decoder类型,也是最早提出的类型。它采用了一个Masked Multi-Head Attention Layer,以实现输入序列中每个位置的词与其它位置的词之间的自注意力计算。在训练阶段,这个Decoder会根据上一个词的输出作为下一个词的输入,以此类推,直到生成完整的输出序列。
- Non-Autoregressive Decoder (NAT):NAT是一种特殊的Decoder类型,其特点是它不会像AT那样依赖上一个词的输出作为下一个词的输入。在NAT中,所有的词都会在所有的时刻进行预测,这使得NAT在训练和推理阶段的速度更快,但也会导致一些问题,比如预测的词可能与输入序列中的词冲突,或者生成的序列可能不是有效的句子。
Decoder 1:Autoregressive(AT)
在声音识别中,decoder读入encoder的输出(一排vector),产生语音辨识的结果——一段文字。
我们对Encoder和Decoder的架构进行一个比较,可以看出:
-
二者大体结构是相似的
-
Decoder有一个特殊的Masked Self-attention,而不是普通的Self-attention
于是,我们自然而然地需要对这个决定Encoder和Decoder之间不同的结构——Masked Self-Attention进行探究。
Masked Self attention

Decoder 2:Non-autoregressive(NAT)
Part 3——Encoder和Decoder
了解完两种Decoder后,我们需要进一步探索Encoder和Decoder之间的关系,如何相互连接。
在Transformer模型中,Encoder和Decoder是两个主要组成部分,它们之间的关系如下:
- 输入输出关系:Encoder的输入是源语言序列(例如英文句子),输出是一组隐藏状态或上下文向量,这些向量包含了源语言序列的语义信息。Decoder的输入是目标语言序列(例如中文句子)的起始符号(例如“<BEGIN>”)以及上一时刻Decoder的输出,输出是目标语言序列中下一个词的概率分布。
- 配合方式:在训练阶段,Encoder将源语言序列转化为上下文向量,并将这些向量传递给Decoder。Decoder根据上下文向量和上一时刻的输出预测下一个词,并将这个词添加到输出序列中。这个过程会循环进行,直到Decoder输出目标语言序列的结束符号(例如“<END>”)。在推理阶段,也就是模型生成翻译结果时,Decoder会根据上下文向量和已经生成的输出序列逐步预测下一个词,直到输出结束符号。
简单来说,Encoder负责将源语言序列编码为一组上下文向量,而Decoder则利用这些上下文向量和上一时刻的输出预测目标语言序列中的下一个词。这两个部分通过上下文向量进行信息的传递和交互,从而实现了从源语言到目标语言的翻译过程。
其中重要的在于cross attention
CROSS ATTENTION
在Transformer模型中,Encoder和Decoder之间的Cross Attention实际上是指它们之间的交叉注意力层。具体来说,Cross Attention是指Decoder在生成目标语言序列时,利用输出的上下文向量进行注意力计算(masked sat)的过程。
在Cross Attention中,Decoder会计算当前时刻的输出与Encoder输出的上下文向量之间的注意力权重,然后将这些权重应用于上下文向量,以获取一个加权的上下文表示。这个加权的上下文表示将作为Decoder下一个时刻的输入,帮助Decoder更好地生成目标语言序列。
需要注意的是,Cross Attention只在Decoder中存在,而Encoder中只有Self Attention。这是因为Encoder只需要对输入序列进行编码,而不需要考虑输出序列的生成。而Decoder则需要利用Encoder的输出和已经生成的输出序列来预测下一个词,因此需要利用Cross Attention来获取上下文信息。
总之,Cross Attention是Transformer模型中Encoder和Decoder相互配合过程中的重要环节,它有助于Decoder更好地利用Encoder输出的上下文信息来生成目标语言序列。
三、训练模型时的注意事项
-
Copy mechanism
-
guided attention
-
beam search
-
optimizing evalution
感觉看李宏毅老师的视频比较方便的一点是,易于理解整个流程,比较好听懂。但是回顾整理笔记的时候就会发现,理解和记忆不是那么深刻。所以结合其他博客全面一点整理了~