bingfeng009 LV
发表于 2025-4-9 13:48:28
(2023.5.5更新:解决图片混乱问题,添加目录)
(2023.5.6更新:BN&LN 详解见 BN&LN)
(2023.5.7更新:解决公式缺失问题)
Bert详解记录
GPT详解记录
源论文:Attention is all you need.
Transformer
一、Attention 详解
背景: LSTM 依然存在 序列过长梯度消失 和 无法并行运算 等缺点。 而 Attention 机制可以更加好的 解决序列长距离依赖 问题,并且具有 并行计算能力。
1.1 Attention
Query:观察者(信息) Values:被观察物(信息)
(通常将 Values 拆分成键值对的形式:key-value pairs)
通过 Query 从 Values 中筛选出对 Query 重要的信息。 简单来说,就是计算 Query 和 Values 中每个信息的相关程度。 并将计算的相关程度加权融合到 Values 中,形成 Values 新的包含 Query 信息的特征表征。
输出 Attention Value 是 所有 values 的加权,其中权重是由 Query 和每个 key 计算出来 的。
计算方法分为三步:
- 计算 Q 和 K 的相似度 F(Q,K),在 transformer 中采用 点乘 计算,快速高效。
- 将得到的相似度进行 softmax 操作,进行归一化。 为什么除以 \sqrt{d_k} :在数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签,由于某一维度的数量级较大,进而会导致 softmax 未来求梯度时会消失。 即 softmax 可能会过分放大数据差异,不利于分析特征,且导致梯度消失。
- 用计算出来的权重,对所有 values 进行加权求和 计算,得到 Attention Value 向量。
1.2 Self - Attention
在 Self Attention 中,Q、K、V 均来自句子 X 的 词向量 x 的线性变化,即对于词向量 x,给定三个可学习的矩阵参数 W_Q, W_K, W_V,x 分别右乘上述矩阵得到 Q、K、V。
词向量 X 通过 可学习矩阵变换 得到 Q,K,V 后:Q K 点乘 + scare + softmax + 点乘 V
Self Attention 可以捕获同一个句子中单词之间的一些句法特征(如一定距离的短语结构)或者语义特征(如指代关系)。
总结: 给定(词向量矩阵) X,经过 Self Attention 得到(词向量矩阵) Z, Z 相较于 X 学习到了更加完善的句法特征和语义特征。
Attention 优点: 序列在一定长度内,可以充分捕获任何依赖关系。 而且对于一个句子而言,每个单词的计算是可以并行处理的。
Attention 缺点 缺少表征位置的信息。(解决方案详见 Transformer PE)
1.3 Masked Self Attention
在 Self Attention 基础上加入 MASK 层。(代码实现时考虑对相应位置特征赋极值)
相当于在 训练时先遮住正确答案 (正确的未来信息),使得模型通过训练 获得更好的解题能力(预测未来信息)。
例如:
- "i" 作为第一个单词,只能有和 "i" 自己的 attention;
- "have" 作为第二个单词,有和 "i、have" 前面两个单词的 attention;
- "a" 作为第三个单词,有和 "i、have、a" 前面三个单词的 attention;
- "dream" 作为最后一个单词,才有对整个句子 4 个单词的 attention。
并且在做完 softmax 之后,横轴结果合为 1。如下图所示:
1.4 Multi-Head Self Attention
将输入序列 X 切分成 h个 (head 头数)X_1, X_2 \cdots X_h ,用不同的 W_Q, W_K, W_V 做 Self Attention 后拼接,
然后通过全连接层线性变化(改变维度)获得新的 注意力值。
在 NLP 领域中,h(头数)一般取 8。
意义:
将模型分为多个头,形成多个子空间,把原始 信息放入了多个子空间 中,多头保证了 attention 可以注意到不同子空间的信息,捕捉到更加丰富的特征信息。
类似于 CNN 中用 不同大小的卷积核 去捕捉更丰富的特征信息。
在实际应用中效果较佳。
完整流程如图:
二、Positional Encoding
2.1 背景
并行计算 Attention 导致特征中不包含词序(位置)关系。
故采用 Positional Encoding 给特征信息中加上位置信息(绝对位置 和 相对位置)。
2.2 目标
对于输入 X 进行 Attention 计算之前,在 X 的词向量中加上位置信息,也就是说 X 的最终词向量为
X_{final\_embedding}=Embedding+PositionalEmbedding
2.3 如何得到 Positional Encoding
pos 指当前字符在句子中的位置(如:“你好啊”,这句话里面“你”的 pos = 0 )。
d_{model} 指的是 Word Embedding 的长度。
2i/2i + 1的取值范围是 0, 1, ... , d_{model}-1,取奇数和偶数时分别对应不同变换。
2.4 PE原理:(为什么要做复杂的三角函数变换)
位置最合理的表示是0,1,2,3,....,但是每个词用的是嵌入向量表示,不是一个值,没法加入位置信息,所以得做一
个变换映射成嵌入维度,变换后还得包含位置属性。
使用三角函数优点:
- 可以使 PE 分布在 [0,1] 区间。
- 不同语句相同位置的字符 PE 值一样。
使用三角函数缺点:三角函数有周期性,可能存在 pos 不同 PE 相同的情况。
解决方案:将 PE 扩展维度到和 Word Embedding 一样长,如图:
交替使用 sin / cos, 增加鲁棒性和模型性能,得到 transformer 中 Positional Encoding 解决方案。
2.5 直观理解
不同比特位(权重)对最终值变化率的影响不一样。
不同频率的sines和cosines组合其实也是同样的道理,通过调整三角函数的频率,我们可以实现这种低位到高位的变化。
三、Transformer
3.1 整体框架
Seq2Seq (一句话,一段视频)
Encoders 2 Decoders
- 通过 Encoders 学习优秀的特征表示(词向量)。
- 把 Encoders 输出的特征表示(词向量)输入到 Decoders, 用 Decoders 来训练模型的预测能力。
大体:
流程:
- 将序列 (x_1, x_2, ..., x_n) 作为 Encoders 的输入,得到输出序列 (z_1, z_2, ..., z_n)
- 把 Encoders 的输出序列 (z_1, z_2, ..., z_n) 作为 Decoders 的输入,生成一个输出序列 (y_1, y_2, ..., y_n)。 注:Decoders 每个时刻输出一个结果(类似 LSTM)。
Encoders 的最终输出,会和每一层的 Decoder 进行结合。
3.2 Encoders
Encoders 由 6 个(通常)相同的 Encoder (Layer)组成。每个 Encoder 会进一步学习 特征。
( 注:为方便理解,将整个 Encoder 模块称作 Encoders,将里面的每一相同层称作 Encoder(Layer)。)
目的:更好的学习输入的特征,得到更优的特征表示(如词向量),为下游任务打下基础。
结构
每层 Encoder layer包含两个 sub-layers:
- multi-head self-attention,用来计算输入的 self-attention;
- 简单的前馈神经网络层 Feed Forward;
另:每个 sub-layer 后都会有一个 残差网络 + 归一化,即 Add & Norm 。
即每个 sub-layer 的输出为:LayerNorm(x + Sub\_layer(x)) 。
Feed Forward
即两个线性变换和一个ReLU激活函数,FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 。
Multi-Head Attention的内部结构中,进行的主要是矩阵乘法 (scaled Dot-Product Attention),是线性变换。通过激活函数 ReLU(非线性变换)的方式,来强化特征的表达能力,对数值较大的部分进行加强,数值较小的部分则进行抑制,从而使得相关的部分表达效果更好。
(这也是神经网络中激活函数的作用,即 进行非线性映射,加强大的部分,抑制小的部分)。
Add
残差 连接(Add) 将 网络的输入和输出相加,即网络的输出为 F(x)+x,在网络结构比较深的时候,网络梯度反向传播更新参数时,容易造成梯度消失的问题,但是如果每层的输出都加上一个 x 的时候,就变成了 F(x)+x ,对 x 求导结果为1,所以就相当于每一层求导时都加上了一个常数项 1,有效解决了梯度消失 问题。
Norm
即 Layer Normalization, 通过对特征表征进行标准化处理,将数据移动到激活函数的作用区域,可以使得ReLU激活函数更好的发挥作用。
LN 与 BN 不同,
BN 在 NLP 中相当于对 一个 batch 内的 所有句子同一位置的词 做归一化,
LN 在 NLP 中相当于对 一个 batch 内的 每个句子内所有位置的词 做归一化。
(详见 NLP_概念辨析)
Encoders 完整流程详解
- 输入序列做 Word Embedding (one-hot, glove, random) 得到 X_i 序列。
- X_i 序列叠加 Positional Embedding 得到包含 位置信息 的新 X_i 。 Sub-Layer 1
- X_i 做 Multi-head Self Attention 得到包含 语义信息、句法信息 的 Z_i 。
- 以 X_i 做直连对 Z_i 做残差和归一化得到新 Z_i,即 Add & Norm,避免梯度消失, 稳定数据,加快训练速度和质量。 Sub-Layer 2
- Z_i 经过前馈网络 Feed Forward ,即两个线性变换和一个ReLU激活函数, FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 , 更好的学习深层特征。
- 做一个 Add & Norm 得到输出 R_i,成为下一个 Encoder 的输入。
注意: 上述 X_i, Z_i, R_i (特征表征)维度相同,原论文中为 512 维。 固定维数使得模型更加简单,容易调参。
3.3 Decoders
Decoders 由 6 个(通常)相同的 Decoder(layer) 组成。
( 注:为方便理解,将整个 Decoder 模块称作 Decoders,将里面的每一相同层称作 Decoder(Layer)。)
目的:通过 Attention 机制在 Encoders 生成的词向量(Values)中用已经生成的词(Query)查询下一步最可能出现的词向量。
结构
每层 Decoder layer 包含三个 sub-layers:
- Masked Multi-Head Self-attention,用来计算输入的 self-attention。
- Encoder-Decoder Self-Attention,用已经生成的词查询 Encoder 词表中的相似度。
- 简单的前馈神经网络层 ,即Feed Forward。
另:每个 sub-layer 后都会有一个 残差网络 + 归一化,即 Add & Norm 。
Decoders 的输入到底是啥
在 Train 模式下和 Test 模式下 Decoders 的 输入是不同 的.
- 在 Train 模式下: 每一层 Decoder Layer 输入是 Ground Truth (相当于做有答案的作业)和 Encoders 的输出。 也就是不管上一层 Decoder Layer 输出是什么,会将正确答案当做输入。
- 在 Test 模式下: 没有 Ground Truth(相当于做没有答案的考试)。 于是将 已经出现的词的输出(注意这里的输出是走完整个 Decoders 计算得到预测结果而不是走完一层 Decoder Layer 的输出)和 Encoders 的输出 当做下一层 Encoder Layer 的输入,
这也许是论文中 shifted right 的意思,逐步往右移(类似 LSTM 中的时序)。
(为什么 Train 时要用 Ground Truth 做输入)
如果直接采用上一层 Decoder 的输出做输入,可能 造成预测越来越偏离正确答案,偏差累积变大。
所以 Train 时要用 Ground Truth 做输入。
(有点像日常学习时老师会纠正学生的错误,否则学生意识不到,越错越多,考试堪忧。)
(Decoders 是否是并行运算)
Transformer 中的 并行计算仅限于 Encoders ,在 Encoder 中是将所有的词一起输入一起计算。
但是在 Decoder 中不是并行运算,Decoder 中是 类似于 LSTM 一样一个一个词输入。
(Encoders 与 Decoders 的交互)
Encoders 与 Decoders 之间的交互 不是每一层一一对应 的。 而是 每一层 Encoder 全部计算完 得到 K 和 V 之后 再传给 每一层 Decoder 与其计算得到的 Q 进行计算。
(这不是固定的,可以自定义 Encoders 和 Decoders 之间的连接方式。)
Masked Multi-Head Attention
(为什么要做 Masked)
总结: Decoder 做 Masked,是为了在 Train 时模拟 Test 的情形,提高模型性能,避免过拟合。
- 在 Train 阶段 由于使用的输入是 Groud Truth,如果不做 Mask, 那么在做 MH Attention 时全部信息都会做贡献(相当于写作业抄答案)。
- 而在 Test阶段,只能凭借已生成单词去预测(相当于闭卷考试), 与 不做 Masked 的 Train 情况差别大,模型效果差(抄答案考不好试)。
- 故在 Train 阶段使用 Mask 模拟 Test 情况(不看答案写作业), 即做 Attention时仅考虑已生成的词,提高模型的效果。
( 注意:为了防止 使用了 Mask 的 Train 累加误差,用 Ground Truth 及时纠正。)
Multi-Head Attention
(为什么做 Encoder 和 Decoder 的交叉 Attention)
回顾 Attention:利用 Query 查询到 Values 中对其重要的信息。
故在 Decoder 中,
- 利用 已经生成的词特征(经 Masked Attention) 作为 Query;
- 利用 Encoders 生成的词表特征(高效词向量库)做 Values;
- 做 Encoder-Decoder 交叉 Attention 后得到下一个可能出现的词的特征;
Linear + Softmax
- Linear 线性变换 转换成 词表的维度;
- Softmax 得到最大词的概率;
Decoders 完整流程详解
(动态图片以翻译为例)
- 输入序列(Train:Grand Truth)做 Word Embedding (one-hot, glove, random) 。
- 叠加 Positional Embedding 得到的 位置信息 。 Sub-Layer 1
- 做 Masked Multi-head Attention (模拟 Test 模式)得到 语义信息、句法信息 。
- Add & Norm,避免梯度消失,稳定数据分布,加快训练速度和质量。
Sub-Layer 2
- 做 Multi-Head Attention (Encoder-Decoder), 通过 已经生成的词在 Encoder 中查询相似特征,预测 下一个可能生成。
- Add & Norm,避免梯度消失,稳定数据分布,加快训练速度和质量。 Sub-Layer 3
- Feed Forward ,即两个线性变换和一个ReLU激活函数, FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 , 更好的学习深层特征。
- Add & Norm,避免梯度消失,稳定数据分布,加快训练速度和质量。
- Linear : 线性变换 转换成 词表的维度 ;
- Soft Max : 得到 最大词的概率 ;
shifted right ,逐步往右移(类似 LSTM 中的时序)。
注意: 上述 X_i, Z_i, R_i (特征表征)维度相同,原论文中为 512 维。
将已经出现的词计算得到的 Q 与Encoder计算得到的 K, V 进行 Multi-Head Attention 计算。 经过了全部 Decoder Layer 层再经过 FC + Softmax 得到结果之后再把结果当做 Decoder 的输入再走一遍整个流程直到得到END标签。
四、损失函数
将 Encoders 的输出和 正确分类 一起送入损失函数,求得 loss 进行梯度下降、反向传播。
4.1 向量空间距离 (MSE)
简单的用两组概率向量的的空间距离作为 loss
(向量相减,然后求平方和,再开方)
4.2 交叉熵 (cross-entropy)
交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性。
信息量
信息是用来 消除不确定性 的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。
信息量的大小与信息发生的概率成反比。
信息熵
也被称为熵,表示所有信息量的期望。
可表示为:(这里的 X 是一个离散型随机变量)
相对熵 ( KL 散度 )
用来 衡量两个 概率分布的相似性 的一个 (非对称性)度量指标。
常用 P(x) 来表示样本的真实分布,Q(x) 来表示模型所预测的分布。
KL散度越小,表示 P(x) 与 Q(x) 的分布更加接近,即模型效果越好。
KL 具有
交叉熵
D_{KL} (P || Q) 表示以 P 为基准的相对熵,展开后,后一项为 P 系统的熵(不变)。
总结
- 交叉熵 能 衡量同一个随机变量中的两个不同概率分布的差异程度。交叉熵的值越小,模型预测效果就越好。
- 交叉熵 常与 softmax 标配,softmax 使其多个分类的预测值和为1,再通过交叉熵来计算损失。
- 具有“ 误差大的时候,权重更新快;误差小的时候,权重更新慢 ”的良好性质。
负对数似然和交叉熵有高度的(形式)相似性,但其本质(似然,熵)不同。其实,在分类问题中,所使用的的交叉熵损失,本质就是负对数似然。
交叉熵函数的最小化 的本质就是 对数似然函数的最大化。
五、总结
5.1 回顾
在陆陆续续学习了 Attention 机制的基础上,花了近三天时间完整学习了 Transformer。把 Transformer 一步步分解成小模块然后学习理解,基本已经了解 Transformer 的构造原理,希望有时间能够在 Pytorch 框架下搭建 Transformer,以加强理解记忆。
虽然基于 Transformer 的各种模型已经横扫各领域 SOTA,但是如果没有在 NLP beginner 中对经典模型 CNN、RNN、LSTM 和各种 NLP 相关概念的学习,想要直接啃 Transformer 那肯定会是不明所以,难以理解。
经典模型依然对学习先进理论不可或缺,对于初学者来说,经典模型就像梯子和脚手架,先一步步搞懂 这些模型要做什么、为什么、怎么做,在学习新模型乃至做出创新时才能有着力点,不至于一头雾水、难以下手。
目标上 Transformer 的目标和传统 LSTM 相似:生成优秀的特征表示,并利用此做诸多下游任务,不过 Transformer 优秀的并行性和优秀的学习特征能力让其脱颖而出。就像老话所言,没有正确的模型,只有能用的模型。Transformer 之后也不断出现了各种效果不错的模型,希望可以继续学习,扩宽眼界。
5.2 向前
Transformer 开启了 NLP 新时代的序章,随之而来 BERT、GPT 让人们看到 NLP 的强大和通向 AGI 的曙光。
继续学习强大的 Bert、GPT 等模型,都基于 Transformer 而来。
下一步 BERT! |
|