一、Transformer(code)
1.1 句子的 representation
embedding with position = word embedding + Positional Embedding
处理 nn.Embedding 权重矩阵有两种选择:
- 使用 pre-trained 的 embeddings 并固化,这种情况下实际就是一个 lookup table。
- 对其进行随机初始化(当然也可以选择 pre-trained 的结果),但设为 trainable。这样在 training 过程中不断地对 embeddings 进行改进。(Transformer 选择的是后者。)
1.2 Encoder
Encoder 总共包含6个 EncoderLayers 。每一个 EncoderLayer 包含2个 SubLayer:
- SubLayer-1 做 Multi-Headed Attention
- SubLayer-2 做 feedforward neural network
- class “Encoder” 将 <layer> 堆叠N=6次。是 class “EncoderLayer” 的实例。
- “EncoderLayer” 初始化需要指定<size>,<self_attn>,<feed_forward>,<dropout>:
- <size> 对应 d_model,论文中为512
- <self_attn> 是 class MultiHeadedAttention 的实例,对应sub-layer 1
- <feed_forward> 是 class PositionwiseFeedForward 的实例,对应sub-layer 2
- <dropout> 对应 dropout rate
1.2.1 Encoder Sub-layer 1: Multi-Head Attention Mechanism
Step 1)
- 对 “query”,“key”和“value”进行 linear transform ,他们的 shape 依然是[nbatches, L, 512]。
- 对其通过 view() 进行 reshape,shape 变成 [nbatches, L, 8, 64]。这里的h=8对应 heads 的数目,d_k=64 是 key 的维度。
- transpose 交换 dimension1和2,shape 变成 [nbatches,8, L, 64]。
Step 2)计算 self-attention 的公式
点积后的结果大小是跟维度成正比的,所以经过softmax以后,梯度就会变很小(softmax如果某个输入太大的话就会使得权重太接近于1,梯度很小)
Step 3)8个heads结果的 concatenate 。 最后使用 last linear layer 进行转换。
shape仍为 [ nbatches, L, 512 ]。与input时的shape是完全一致的。
1.2.2 Encoder Sub-layer 2: Position-Wise fully connected feed-forward network
线性转换+Relu+线性转换
W1将维度扩大到2048,W2又将其变回512
1.3 Decoder
Decoder 也是N=6层堆叠的结构。
被分为3个 SubLayer,可以看出 Encoder 与 Decoder 三大主要的不同:
- Diff_1:Decoder SubLayer-1 使用的是 “masked” Multi-Headed Attention 机制,防止为了模型看到要预测的数据,防止泄露。
- Diff_2:SubLayer-2 是一个 encoder-decoder multi-head attention。query = x,key = m, value = m, mask = src_mask,这里x来自上一个 DecoderLayer,m来自 Encoder的输出。
- Diff_3:LinearLayer 和 SoftmaxLayer 作用于 SubLayer-3 的输出后面,来预测对应的 word 的 probabilities 。
10分钟带你深入理解Transformer原理及实现 - 知乎
二、常考
0、Layer normalization
-
动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸;
-
原因:数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理;
-
目的:在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失或者梯度爆炸 问题
作用:
- 经过归一化再输入激活函数,得到的值大部分会落入非线性函数的线性区,导数远离导数饱和区,避免了梯度消失,这样来加速训练收敛过程。
- BatchNorm这类归一化技术,目的就是让每一层的分布稳定下来,让后面的层可以在前面层的基础上安心学习知识。
LayerNorm和BatchNorm的区别:
共同点:为了把输入转化成均值为0方差为1的数据。一般是在把数据送入激活函数之前进行的,目的是希望输入数据不要落在激活函数的饱和区。
主要是做规范化的维度不同
(图:蓝色BN、黄色LN、二维和三维图,来自李沐)
batchNormalization与layerNormalization的区别 - 知乎
- Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。
- Batch Normalization 是对这批样本的同一维度特征(一个中间层的单个神经元)做归一化, Layer Normalization 是对这单个样本的所有维度特征(一个中间层的所有神经元)做归一化。
- BN(每一行进行归一化)、LN(每一列进行归一化)可以看作横向和纵向的区别。
- BatchNorm就是通过对batch size这个维度归一化来让分布稳定下来。LayerNorm则是通过对Hidden size这个维度归一。
- BN一般而言选择,LN当小批量样本数量比较小时选择。
- BatchNorm针对一个batch里面的数据进行规范化,针对单个神经元进行,比如batch里面有64个样本,那么规范化输入的这64个样本各自经过这个神经元后的值(64维)
- LayerNorm则是针对单个样本,不依赖于其他数据,常被用于小mini-batch场景、动态网络场景和 RNN,特别是NLP领域,
- 就bert来说就是对每层输出的隐层向量(768维)做规范化,图像领域用BN比较多的原因是因为每一个卷积核的参数在不同位置的神经元当中是共享的,因此也应该被一起规范化。
公式:机器学习基础知识点⑤数据增强、类别不平衡_IOT_victor的博客-CSDN博客
1、CNN、RNN不足
RNN 主要 通过 循环 的方式学习(记忆) 之前的信息;
- 问题:但是随着时间的推移,出现「梯度消失或梯度爆炸」问题,这种问题使你只能建立短距离依赖信息。
CNN 主要采用 卷积核 的 方式捕获 句子内的局部信息,可以理解为 「基于 n-gram 的局部编码方式」捕获局部信息
- 问题:因为是 n-gram 的局部编码方式,那么当 距离 大于 n 时,那么 将难以学习局部外的信息;
2、self-attention
- 动机: CNN 所存在的长距离依赖问题; RNN 所存在的无法并行化问题【虽然能够在一定长度上缓解 长距离依赖问题】
-
核心思想:拿到序列的全局信息。self-attention的结构在计算每个token时,总是会考虑整个序列其他token的表达;
-
举例:“我爱中国”序列,在计算"我"这个词的时候,不仅考虑词本身的embedding,也同时考虑其他词对这个词的影响
-
-
目的:学习句子内部的词依赖关系,捕获句子的内部结构。
self-attention 是如何解决长距离依赖问题的呢?
- 解决方式:利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列
- 具体介绍:对于 当前query,你需要 与 句子中 所有 key 进行点乘后再 Softmax ,以获得 句子中 所有 key 对于 当前query 的 score(可以理解为 贡献度),然后与 所有词 的 value 向量进行加权融合之后,就能使学习到句子中 其他词的信息;
Transformer 如何进行并行化?
- 核心:self-attention
- 思路:在 self-attention 能够 并行的 计算 句子中不同 的 query,因为每个 query 之间并不存在 先后依赖关系,也使得 transformer 能够并行化;
3、multi-head attention
-
相当于 head=8 个 不同的 self-attention 的集成
-
就是把self-attention做 n 次,取决于 head 的个数;论文里面是做了8次。
4、position embedding
-
目的:在输入时加入词序信息(时序信息),使 Attention 能够分辨出不同位置的词(Attention只计算q和k,当两句话词一致,词序不一致,输出的值都是一样的,所以需要位置信息)
-
思路:在 encoder 层和 decoder 层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,让模型学习到这个值
-
位置向量的作用:决定当前词的位置;计算在一个句子中不同的词之间的距离
5、残差模块
动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸
6、Mask
- sequence mask 是为了使得 decoder 不能看见未来的信息。产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上。
- padding mask:输入句子的长度不一问题。短句子:后面 采用 0 填充;长句子:只截取 左边 部分内容,其他的丢弃
- 在 decoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask + sequence mask
- 在 encoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask
【Pre-Training】关于 Transformer 那些的你不知道的事:十六连弹
三、Attention机制的本质思想
①第一个过程根据Query和Key计算权重系数
- 根据Query和Key计算两者的相似性或者相关性(阶段1)
- 对第一阶段的原始分值进行归一化处理(阶段2)
②第二个过程根据权重系数对Value进行加权求和(阶段3)
上图清晰地展示了三阶段计算Attention的过程
理论:
《深度学习中的注意力模型》张俊林老师:深度学习中的注意力模型(2017版) - 知乎
实验参考: