其实,这个也谈不上论文解读,因为不是针对原Transformer论文,而是基于别人的理解上加入自己的解释。感觉想学这方面的论文,必须要知道一些基本的模型架构,所以补了一篇Transformer。
参考博客:
【超详细】【原理篇&实战篇】一文读懂Transformer-CSDN博客
Transformer模型详解(图解最完整版)-CSDN博客
1. Transformer
这里是Transformer的一些重要组成部分和特点:
- 自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
- 多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。
- 堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。
- 位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。
- 残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。
- 编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。
1.1 残差连接
- 在这里小小插入一段残差连接的知识
可以看这些内容:
【深度学习 | ResNet核心思想】残差连接 & 跳跃连接:让信息自由流动的神奇之道-CSDN博客
残差连接也叫跳跃连接:
跳跃连接指的是将输入数据直接添加到网络某一层输出之上。这种设计使得信息可以更自由地流动,并且保留了原始输入数据中的细节和语义信息。 使信息更容易传播到后面的层次,避免了信息丢失。跳跃连接通常会通过求和操作或拼接操作来实现。
这样的话,后面的部分可以保留一部分原图像的信息
2. Transformer结构
2.1 整体结构
Nx = 6,Encoder block由6个encoder堆叠而成。图中的一个框代表的是一个encoder的内部结构,一个Encoder是由Multi-Head Attention和全连接神经网络Feed Forward Network构成。如下图所示:
简略结构(每一个编码器都对应上图的一个encoder结构):Encoder 和 Decoder 都包含 6 个 block。
每一个编码器虽然结构是一样的,但是不共享权重,编码和解码的建简易版,可以看下面这张图,然后和结构图进行对比。注意看右侧的解码器的第二层,加入了编码的内容,所以是编码-解码注意力层。
2.2 自注意力机制
- 这个就是Transformer的核心之一
1) 计算新向量
在Embedding的过程中会生成三个新的向量:Q,K,V(通过与权重矩阵相乘计算得出)
- X代表输入的数据
- Q: Query 查询向量
- K:Keys 键向量
- V:Values 值向量
查询向量表示单词的查询,即模型在序列中寻找的内容。键向量表示单词的键,即序列中其他单词应该注意的内容。值向量表示单词的值,即单词对输出所贡献的信息。
2) 打分计算
- 查询向量与所有键向量进行点乘操作,来进行分数计算。
3-4)归一化
将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值,这样做是为了防止内积过大。),然后通过softmax传递结果。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
- softmax是基于除后的结果进行计算的
- 现在相当于每一个单词对于“Thinking”的贡献,很明显“Thinking”自己本身对于自己的贡献会更大
5)弱化不相关的单词
将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
6) 求和
对加权值向量求和,然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。
所以整体的计算公式如下:
- 这样的话就可以得到自注意力了
2.3 注意力机制的完善——多头注意力机制
self-attention只是使用了一组WQ、WK、WV来进行变换得到查询、键、值矩阵,而Multi-Head Attention使用多组WQ,WK,WV得到多组查询、键、值矩阵,然后每组分别计算得到一个Z矩阵。
- 要是放在卷积里的话就是多个卷积核,这样因为不同的参数,每一个提取的特征不一样
示意图:
- 原文里Transformer用了八个注意力头
最后还需要乘以一个大的权重矩阵,将多个注意力矩阵整合成为了一个(好家伙,怪不得Transformer的参数量十分恐怖)
总结流程
3. 位置编码
- 如果不用位置编码的话,同样的单词无论在什么位置上,他的注意力分数都是一样的,这个并不是我们想看到的。
- 这里位置编码是通过三角函数得到的,因为一个句子的长度不一样,很难用类似one-hot encoding的方式去表达位置 (因为这个位置编码想传达的信息不是这个单词在第几个位置,而是它与周围单词的位置联系,也就是说不是一个绝对位置,而是一个相对位置)
- 这样来看三角函数的变换可以转为位置的之间的联系,详细内容可以看这一篇:
如何理解Transformer论文中的positional encoding,和三角函数有什么关系? - 知乎 (zhihu.com)
4. Add&Normalize
经过多头注意力机制后得到了矩阵z之后,并没有直接传入全连接神经网络,而是进行了Add&Normalize的操作
公式如下:
1)ADD:残渣连接
- 残差这块在文章的上面有讲
2)Normalize
归一化目的:
1、加快训练速度
2、提高训练的稳定性
使用到的归一化方法是Layer Normalization。
- 主要有两种归一化方法:LN和BN,但是BN是对单独提取一个维度,在分析语义中没有多大用,一个单词肯定还是要连起来看才行,所以适用Layer Normalization
5. 全连接层
-
Feed Forward
-
然后传入decoder 中进行操作
6. 优缺点
transformer的优缺点:
优点:
1、效果好
2、可以并行训练,速度快
3、很好的解决了长距离依赖的问题
缺点:
完全基于self-attention,对于词语位置之间的信息有一定的丢失,虽然加入了positional encoding来解决这个问题,但也还存在着可以优化的地方。