1 encoder的结构
-
encoder由6层相同的层组成
-
每一层分别由两部分组成:
- 第一部分是一个multi-head self-attention mechanism
- 第二部分是一个position-wise feed-forward network,是一个全连接层
-
这两个部分之后,都有一个残差连接(residual connection),然后接着一个层归一化(Layer Normalization)
2residual connection
2.1 理论理解
- 残差连接示意图如下:
- 假设网络中某个层对输入x作用后的输出是F(x),那么增加residual connection之后,就变成了:F(x)+x。
- 这个+x操作就是一个shortcut。transformer架构图中的Add & Norm中的Add也就是指的这个shortcut。
2.2 代码
- 代码片段
def residual(sublayer_fn,x):
return sublayer_fn(x)+x
- 子层操作 (sublayer_fn(x),例如多头注意力或前馈网络)
- 残差连接 (sublayer_fn(x)+x,将子层的输入 x 加到子层的输出上)
3 Layer normalization
3.1 理论理解
3.1.1 normalization
- Normalization有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为0方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。
- 注意区分
-
归一化(Normalization):这是一种将特征值线性缩放到一个固定范围(通常是 [0, 1])的方法。
-
标准化(Standardization):这是一种将特征值转换为服从零均值、单位方差的标准正态分布的方法。
-
批量归一化(Batch Normalization)的底层数学操作确实是标准化(Standardization),但它之所以被称为“归一化”,主要是因为“Normalization”这个词在深度学习领域被作为一个更宽泛的术语来使用,泛指任何能将数据分布调整到更稳定的方法。
-
3.1.2 batch normalization
- 求均值和方差
- 假设有一个批次包含10张图片,每张图片有4个通道。
- BatchNorm把一个batch中同一通道的所有特征(红色区域)视为一个分布,并将其标准化。
- 例如,计算所有10张图片的红色通道特征的均值和方差(μB and σB²),用这些值对每张图片的红色通道特征进行归一化。
- 有几个通道就有几个分布
- 缩放与偏移(scale and shift)
- 缩放参数 γ 和偏移参数 β 是可学习参数(learnable parameters),它们的数量取决于归一化的“目标维度”大小(即:对哪些特征做缩放和平移)。
- 因为对每个通道 C 做归一化,所以每个通道有一组 γ 和 β
- γ 和 β 的维度=(C,)→ 共 2 × C 个参数
- 整体公式
3.1.3 Layer normalization
- 求均值和方差
- 考虑一个句子被表示为一个词向量序列。
- LayerNorm会对每个词向量的所有维度进行归一化。
- 对每个红色的向量 Vi,计算它自己的均值和标准差,然后对它内部的每个特征做归一化处理。
- 总共会有 N × L 个归一化分布
- 缩放与偏移(scale and shift)
- LayerNorm 的目标是稳定每个 token 向量的数值尺度
- γ 和 β 只依赖 d(每个词向量维度)
- 所以它们是长度为 D 的向量(形状 (D,),其中D表示每个 token 的向量维度(hidden size))-> 参数量为 2×D。
- 整体公式
- 计算流程
- 假设需要layer nomalization的输入是[2,3,512](输入张量形状是 [B, L, D],B:batch 中有多少个句子、L:每个样本里有多少个 token(词)、D:每个 token 的向量维度)
- 计算每个词向量的均值和方差
- 共有维度D个γ 和 β
- 更新每个值,例如0.2
- 假设需要layer nomalization的输入是[2,3,512](输入张量形状是 [B, L, D],B:batch 中有多少个句子、L:每个样本里有多少个 token(词)、D:每个 token 的向量维度)