总架构图
下图为Transformer模型架构图
原文描述
简单理解为它是一个盒子:
【举例】: 输入中文,输出英语
每个Encoder 和 Decoder 都包含 6 个 block,上例可分解为:
这6个block结构相同,但参数各自随机初始化, 分别是:
- 第一层:多头自注意机制,有两子层
- 第二层:一个简单的、位置方向的全连接前馈(神经)网络,有两子层
- Add & Norm 层: 每个编码器的每个子层(Self-Attention 层和 FFN 层)都有一个残差连接和特征归一层,再执行一个层标准化操作
事实上,只是Transformer采用了6层结构,事实上可配置多层
Transformer的词向量维度是512。
BERT为768维
编码器:Encoder

Encoder由三个部分组成: 输入 、多头注意力 、前馈神经网络
输入:Inputs
Transformer 中单词的输入表示 x 由 Word Embedding 和 Position Embedding相加得到。
词嵌入:Word Embedding
词嵌入层 负责将自然语言转化为与其对应的独一无二的词向量表达。
位置编码器:Position Embedding
Transformer 中除了Word Embedding,还需要使用Position Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,因此是无法捕捉到序列顺序信息的,
注意力机制

我们再来看一下这个图,图中红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder 包含一个 Multi-Head Attention,而 Decoder 包含两个 Multi-Head Attention (其中有一个用到 Masked)。
Multi-Head Attention 上方还包括一个 Add & Norm 层:
- Add: 表示残差连接 (Residual Connection) 用于防止网络退化
- Norm: 表示 Layer Normalization,用于对每一层的激活值进行归一
自注意力机制:Self-Attention
自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。自注意力机制的关键点在于,Q、K、V是同一个东西,或者三者来源于同一个X,三者同源。
多头注意力机制:Multi-Head Attention
与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的h 组(一般h=8)不同的线性投影来变换Q、K和V。
然后,这h组变换后的Q、K和V将并行地送到注意力汇聚中。 最后,将这h个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力(multihead attention) 。

残差连接
每个编码器的每个子层(Self-Attention 层和 FFN 层)都有一个残差连接,再执行一个层标准化操作。
LN和BN
- LN: Layer Normalization,LN是"横"着来的,对同一个样本,不同的特征做归一化。
- BN: Batch Normalization,BN是"竖"着来的,对不同样本,同一特征做归一化。
tips: 二者提出的目的都是为了加快模型收敛,减少训练时间 在NLP任务中,一般选用的都是LN,不用BN。因为句子长短不一,每个样本的特征数很可能不同,造成很多句子无法对齐,所以不适合用BN。
维度 为了便于这些剩余连接,模型中的所有子层以及嵌入层都产生维度dmodel=512的输出(来自原文,如上图)。
前馈神经网络:FeedForward
在进行了Attention操作之后,Encoder和Decoder中的每一层都包含了一个全连接前向网络 ,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s u b l a r y e r o u t p u t = L a y e r N o r m a l ( x + S u b L a y e r ( x ) ) \\ sub_laryer_output = LayerNormal(x+SubLayer(x)) \\ </math>sublaryeroutput=LayerNormal(x+SubLayer(x))
解码器:Decoder

Decoder结构与Encoder相似,但是存在一些区别。
- Decoder 包含两个 Multi-Head Attention 层。
- 第一个 Multi-Head Attention 层采用了 Masked 操作。
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder的输出计算。
- 最后有一个 Softmax 层计算下一个翻译单词的概率。
第一个 Multi-Head Attention
掩码: Mask
Mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 Padding Mask 和 Sequence Mask。其中,Padding Mask 在所有的 scaled dot-product attention 里面都需要用到,而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。
第二个 Multi-Head Attention
其实这块与上文 Encoder 中 的 Multi-Head Attention 具体实现细节上完全相同,区别在于Encoder的多头注意力里的Q、K、V是初始化多个不同的,矩阵得到的。而Decoder的K、V是来自于Encoder的输出,Q是上层Masked Self-Attention的输出。
Encoder 中 的 Multi-Head Attention只有一个输入,把此输入经过三个linear映射成Q 、K 、V , 而这里的输入有两个:
- 一个是Decoder的输入经过第一个大模块传过来的值。
- 一个是Encoder最终结果。是把第一个值通过一个linear映射成了Q,然后通过两个linear把第二个值映射成K、V ,其它的与上文的完全一致。这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息。
Linear和softmax
Decoder最后会输出一个实数向量。那我们如何把浮点数变成一个单词?这便是线性变换层Linear层要做的工作,它之后就是Softmax层。
Linear层是一个简单的全连接神经网络,它可以把Decoder产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。
