深度学习--Transformer
参考
零基础入门深度学习(8) - Transformer (1/3)
Transformer模型详解(图解)
Transformer
resnet中的残差连接,你确定真的看懂了
信息瓶颈Information Bottleneck及信息论相关概念梳理
一文读懂Transformer
Transformer 模型详解
Transformer
Transformer的一些重要组成部分和特点:
- 自注意力机制(Self-Attention):Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
RNN不能并行的问题在于后一个输入状态依赖于前一个状态的输出,只能一个节点一个节点的慢慢算,transformer能并行计算是因为他前后没有依赖,比如Attention第一个单词在计算的时候其他单词也可以同时在计算,最终算出来的注意力矩阵一起输出到后面层 - 多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。
- 堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。
- 位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。
- 残差连接和层归一化(Residual Connections and Layer Normalization):减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。
- 编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。
从编码器输入的句子首先会经过一个自注意力层,这一层帮助编码器在对每个单词编码的时候时刻关注句子的其它单词。
嵌入层Embedding
每个 token 先被 embedding 成固定维度向量(d_model)。
Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息。
注意力本身不包含位置信息,需要把位置编码(positional encoding)加到 embedding 上,常见的是正弦/余弦形式或可学习的位置向量。
单射且同构的,稀疏矩阵做矩阵计算过度占用资源
嵌入层可以降维升维把一些其他特征给放大了,或者把笼统的特征给分开了
自注意力机制(Self-Attention)
核心是一个序列中的任意两个Token之间都要计算注意力权重,也就是每个Token都要注意自身以及序列中的其它Token。
注意力机制的核心,就是提升关键信息的权重,降低非关键信息的权重。
q, k, v分别是Query、Key、Value的缩写,它们是对注意力机制计算过程的抽象表达。三个权重矩阵都是模型训练过程中通过梯度下降自学习得到的参数
随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
Scaled Dot-Product Attention(核心运算)
缩放的目的不是为了归一化概率,而是为了防止数值过大导致 softmax 的梯度消失问题。指数函数会让差异被极度放大,导致softmax 输出接近 one-hot(极端化),反向传播时梯度对大部分非最大值位置非常接近 0,训练不稳定、收敛慢。
用查询(Q)、键(K)、值(V)三组向量来计算注意力权重:注意力打分先算 Q 与 K 的点积、按 sqrt(d_k) 缩放,再做 softmax 得到权重,最后加权 V。每个 query 向量在所有 key 上打分,得到的权重决定从所有 value 中“聚合”出哪些信息。
对所有位置的信息进行加权求和,权重来自注意力分布
Multi-Head Attention(多头注意力)
为了让模型在不同的子空间并行学习不同的关联,Transformer 把 Q/K/V 线性投影成多个头(head),每个头单独做 attention,最后把各头的输出串接并再线性变换回原维度。多头能让模型同时关注不同类型的关系。
Encoder 结构
Add & Norm层
由 Add 和 Norm 两部分组成
其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。
Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分。
Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
前馈网络(Feed-Forward Network, FFN)
扩大维度 + 非线性激活
是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数
FFN 对序列中每个位置独立地做“通道间”的非线性变换:把一个位置的向量投影到更高维度做非线性激活、再投回原位置。所以它增强每个位置内部的特征组合能力,补充了 attention 跨位置的信息聚合。
把维度升高有两层好处:1在高维空间里,线性分割面/非线性组合有更多自由度,能组合出更丰富的特征(类似把数据映射到高维后更容易线性可分)。2实际上把原始通道做出许多“基方向”或“特征检测器”,激活后重新混合这些检测到的特征,产生更表达力强的输出。
Encoder
通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,Encoder block 接收输入矩阵,并输出一个矩阵。通过多个 Encoder block 叠加就可以组成 Encoder。
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。
Decoder 结构
第一个 Multi-Head Attention
Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,避免获取后面信息。 Mask 操作是在 Self-Attention 的 Softmax 之前使用的。
第二个 Multi-Head Attention
主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。
这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。
编码器 / 解码器的结构差异
Encoder(N 层堆叠):每层包含 Multi-Head Self-Attention → Add&Norm → FFN → Add&Norm。
Decoder(N 层堆叠):每层包含 Masked Multi-Head Self-Attention(防止看到未来信息)→ Add&Norm → Encoder-Decoder Attention(把 encoder 输出作为 K,V)→ Add&Norm → FFN → Add&Norm。
训练
训练/前向(Encoder-Decoder,逐步)
Tokenize + Embedding:输入文本分词 → 每个 token 映射为向量(embedding)。
加位置编码:embedding + positional encoding。
送入 Encoder 堆叠:经过 L 个 encoder 层(self-attention + FFN + 残差 + LayerNorm),得到 encoder 输出序列(每个位置的上下文化向量)。
NeurIPS Papers
准备 Decoder 输入:训练时 decoder 可见目标序列(右移),推理时采用已生成的 token(自回归)。
Decoder 的 Masked Self-Attention:保证每个位置只看到当前及之前的输出(因果掩码)。
Stanford University
Encoder-Decoder Attention:decoder 的 queries 与 encoder 的 K,V 做 attention,从输入序列中检索相关信息。
NeurIPS Papers
最终线性 + softmax:decoder 最上层输出经过线性变换到词表维度并 softmax 得到下一个 token 的概率分布。
计算损失 & 反向传播(训练):用目标序列计算交叉熵,反向传播更新参数。
训练时:第i个decoder的输入 = encoder输出 + ground truth embeding
预测时:第i个decoder的输入 = encoder输出 + 第(i-1)个decoder输出
训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。
预测时,首先输入start,输出预测的第一个单词 然后start和新单词组成新的query,再输入decoder来预测下一个单词,循环往复 直至end
Mask 在 Decoder Self-Attention 里完成,对应的是 序列内部的未来信息遮挡。
Encoder-Decoder Attention 不需要 Mask,因为 Encoder 输出是完整上下文,Decoder 可以自由查询。