# Self-attention
An attention mechanism relating different positions of a single sequence in order to compute a representation of the sequence.
Usually used in reading comprehension, abstractIve summarization, textual entailment and learning task-independent sentence representations.
# Model Architecture
- Most competitive neural sequence transduction models have an encoder-decoder structure.
- The encoder maps an input sequence of symbol representations to a sequence of continuous representations .
- Given z, the decoder then generates an output sequence$ (y_1, ..., y_m)$ of symbols one element at a time.
- At each step the model is auto-regressive (自回归的), consuming the previously generated symbols as additional input when generating the next.
- The Transformer follows this overall architecture using stacked self-attention and point-wise, fully
connected layers for both the encoder and decoder, shown in the left and right halves of Figure above,respectively.
# Encoder and Decoder Stacks
# Encoder
- Composed of a stack of identical layers.
- Each layer has two sub-layers:
- The first is a multi-head self-attention mechanism.
- The second is a simple, position-wise fully connected feed-forward network.
- Employing a residual (残差) connection around each of the two sub-layers,followed by layer normalization.
- The output of each sub-layer is , where is the function implemented by the sub-layer itself.
- To facilitate these residual connections, all sub-layers in the model, as well as the embedding
layers, produce outputs of dimension .
# Decoder
- Composed of a stack of identical layers.
- Inserting a third sub-layer, which performs multi-head attention over the output of the encoder stack.
- We employ residual connections,around each of the sub-layers, followed by layer normalization.
- Modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent (随后的) positions.
# Attention
Mother-fucker, English note-taking is really torture.
- 自注意力函数 —— 将查询一组键值对映射到输出。
Q
: 查询、K
: 键、V
: 值和输出都是向量- 计算输出为加权和
# 缩放点积注意力(Scaled Dot-Product Attention)[左图]
点积计算(MatMul):首先计算查询向量和键向量的点积,即
Q
和K
相乘。缩放(Scale):将点积结果除以键向量的维度的平方根,以防止点积结果过大。
掩码(Mask, 可选):在一些情况下(如解码器的自注意力层),需要对未来的时间步进行掩码处理,以防止模型在预测当前词时看到未来的信息。
SoftMax:对缩放后的点积结果进行 SoftMax 操作,得到注意力权重。
加权求和(MatMul):使用这些注意力权重对值向量进行加权求和,得到最终的输出。
将查询和键的维度设为, 值的维度设为,先计算查询与所有键的点积,将每个点积除以,然后应用
softmax
函数来获得值的权重。在实践中,我们同时计算一组查询的注意力函数,并将其打包成矩阵 Q。键和值也被打包成矩阵 K 和 V,计算公式如下:
# 多头注意力(Multi-Head Attention)[右图]
# 自注意力机制的运用(三种)
# 编码器 - 解码器注意力层(Encoder-Decoder Attention Layers)
描述:在这种注意力层中,查询(queries)来自解码器的前一层,而记忆键和值(memory keys and values)来自编码器的输出。这允许解码器中的每个位置都能关注输入序列中的所有位置。
作用:这种机制模仿了典型的序列到序列(sequence-to-sequence)模型中的编码器 - 解码器注意力机制,使解码器能够利用编码器提供的上下文信息来生成输出序列。
在编码器 - 解码器注意(encoder-decoder attention)层中,查询来自上一个解码器层,记忆键和值来自编码器的输出。允许解码器中的每个位置关注输入序列中的所有位置。
# 编码器中的自注意力层(Self-Attention Layers in the Encoder)
- 描述:在这种自注意力层中,所有的键、值和查询都来自同一个地方,即编码器前一层的输出。编码器中的每个位置都可以关注编码器前一层中的所有位置。
- 作用:这种自注意力机制使编码器能够在输入序列的不同位置之间建立依赖关系,从而更好地捕捉输入序列的全局信息。
- 编码器包含自注意力层。在自注意力层中,所有键、值和查询都来自同一位置,在本例中,即编码器中上一层的输出。编码器中的每个位置都可以关注编码器上一层的所有位置。
# 解码器中的自注意力层(Self-Attention Layers in the Decoder)
描述:类似于编码器中的自注意力层,解码器中的每个位置也可以关注解码器中当前位置及其之前的所有位置。为了保持自回归性质,防止信息从右向左传播,需要对未来的位置进行掩码处理。
作用:这种机制保证了在生成输出序列时,解码器只能利用当前词及其之前的词的信息,而不会泄露未来的词,从而保持生成过程的正确性。
解码器中的自注意力层允许解码器中的每个位置关注解码器中直到该位置的所有位置。我们需要防止解码器中的左向信息流以保留自回归属性。我们在缩放点积注意力中实现这一点,方法是屏蔽 softmax 输入中与非法连接相对应的所有值
# 位置前馈网络 (Position-wise Feed-Forward Networks)
除了注意力子层之外,我们的编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别且相同地应用于每个位置。它由两个线性变换组成,中间有一个 ReLU 激活。
- 线性变换:输入向量 $x $ 先通过一个线性变换(参数为 和),然后应用 激活函数,最后通过第二个线性变换(参数为 和 )。
- ReLU 激活函数: 激活函数 将负值置为零,保留正值。
虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述方式是将其描述为两个卷积,内核大小为 1,输入和输出的维度为,内层的维数为
- 线性变换参数不同:虽然线性变换在不同位置上是相同的,但它们在不同层之间使用不同的参数。这意味着每一层的前馈网络都有自己独特的参数集。
- 等效卷积描述:可以将这种操作看作是两次卷积操作,卷积核大小为 1。
- 维度:输入和输出的维度 $ d_{model}$ 为 512,内部层的维度 为 2048。
# 嵌入和 Softmax (Embeddings and Softmax)
- 使用学习到的嵌入将输入标记和输出标记转换为维度为 的向量。使用线性变换和 函数将解码器输出转换为预测的下一个标记概率。
- 在两个嵌入层和预 线性变换之间共享相同的权重矩阵。
- 在嵌入层中奖权重乘以
# 位置编码
由于模型不包含循环和卷积,为了让模型利用序列的顺序,必须注入关于序列中标记的相对或绝对位置的信息
在编码器和解码器堆栈底部的输入嵌入中添加位置编码,位置编码具有与嵌入相同的维度,因此可以将两者相加。
我们使用不同频率的正弦和余弦函数:
pos
是位置,i
是维度,位置编码的每个维度都对应一个正弦曲线,波长从 到 的几何函数。对于任何固定偏移, 都可以表示为 的线性函数
选择正弦版本,因为它可能允许模型推断出比训练期间遇到的序列长度更长的序列。
# 训练
使用 Adam 优化器,\beta_1=0.9,\beta_2=0.98,\epsilon=10^
我们在训练过程中改变学习率的公式如下:
这对应于在第一个 warmup_steps 训练步骤中线性增加学习率,然后按步数的倒数平方根成比例地降低学习率。我们使用了 warmup_steps = 4000。
# 残差 Dropout(Residual Dropout)
- Dropout 是一种正则化技术,用于防止模型过拟合。在训练过程中,随机将一部分神经元的输出置为 0,迫使模型的其他神经元承担更多的计算任务,从而提高模型的泛化能力。
- 在这段文字中,残差 Dropout 是指在每个子层的输出上应用 Dropout,然后在将其加入到子层输入并进行归一化之前进行处理。
- 除此之外,文中还提到对编码器(encoder)和解码器(decoder)堆栈中词嵌入(embeddings)和位置编码(positional encodings)的总和也应用了 Dropout。
- 在这个基础模型中,使用的 Dropout 概率为, 这意味着在训练的时候每个节点有 的概率被丢弃或者置零
# 标签平滑(Label Smoothing)
- 标签平滑 是一种在训练分类模型时使用的正则化技术。它通过将硬标签(one-hot labels)中的某些概率值稍微调整为更平滑的值,来减少模型的过度自信。
- 硬标签(Hard Labels)是指在分类任务中使用的标准标签形式,它们通常以 one-hot 编码 的方式表示。在这种表示方法中,对于每一个样本,只会有一个类别被标记为 1,其余类别则标记为 0。
- 硬标签与软标签(Soft Labels)相对应,软标签会为每个类别分配一个概率值,表示样本属于每个类别的可能性。与硬标签的明确分类不同,软标签中每个类别的概率值之和通常为 1。例如,软标签可能是类似 的形式,表示样本属于第一类、第二类、第三类的概率分别为 0.1、0.7 和 0.2。
- 在这段文字中,标签平滑的值
- 标签平滑会增加困惑度(perplexity),因为模型在训练中被迫对标签有更多的不确定性。但这样做的好处是,它可以提高模型的准确性(accuracy)和 BLEU 分数(用于评估机器翻译和文本生成任务的指标)。