Linxii's Blog
Paper Reading 1 :transformerBlur image
评分准则
平平无奇的论文
正常的论文
广受认可或者让我眼前一亮的论文
奠基性的论文或者我非常喜欢的论文
毋庸置疑的最棒的论文

Transformer#

Arxiv ID 1706.03762
幻觉翻译 1706.03762

Transformer架构基于自注意力机制,能够高效地处理序列数据。它由编码器和解码器组成,广泛应用于自然语言处理和计算机视觉等领域。

推荐指数:

前言#

  在开始写这篇paper reading之前,作为一个初学者,我自己读了一下Transformer的原论文(幻觉翻译),感觉还是比较难懂的,所以我参考了一些博客和视频来帮助理解。
非常推荐的两个视频:

  1. Transformer论文逐段精读【论文精读】

  2. All in Transformer | 一次讲透注意力机制:看完彻底听懂!(学不会跟我爆了)(极其详细简单的教程)

  本篇blog的部分图片参考自上述第二个视频,已经询问过视频原作者了。

1.Transformer架构以及原理#

1.1.Transformer架构#

  Transformer架构最初用于自然语言处理任务。Transformer的核心组件是自注意力机制(Self-Attention Mechanism),它允许模型在处理输入序列时动态地关注不同位置的信息。Transformer架构主要由编码器(Encoder)和解码器(Decoder)两部分组成,每部分包含多个相同的层(Layer)。每个编码器层包括多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network),而解码器层则在此基础上增加了对编码器输出的注意力机制。 transformer架构

1.2.缩放点积自注意力机制(Scaled Dot-Product Self-Attention)#

  自注意力机制允许模型在处理序列数据时动态地关注不同位置的信息。它通过计算输入序列中每个位置与其他位置的相关性来生成新的表示。自注意力机制的计算过程包括以下几个步骤:

  1. 线性变换:将输入序列的每个token通过三个不同的线性变换映射到查询(Query)、键(Key)和值(Value)向量。
  2. 计算注意力分数:通过计算查询向量与键向量的点积来获得注意力分数,表示每个位置对其他位置的关注程度,通常会除以一个缩放因子以稳定梯度。
  3. 归一化:使用Softmax函数对注意力分数进行归一化,得到注意力权重。
  4. 加权求和:将值向量与注意力权重相乘并求和,得到新的表示。   缩放点积自注意力机制的数学表达式如下:

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V

其中,QQKKVV分别表示查询、键和值矩阵,dkd_k是键向量的维度。

  在实际计算中,QQKK的维度是(seq_len,dk)(seq\_len, d_{k})VV的维度是(seq_len,dv)(seq\_len, d_{v}),最终输出的维度是(seq_len,dv)(seq\_len, d_{v})Scaled Dot-Product Self-Attention And multi-head self-attention机制

1.3.多头自注意力机制(Multi-Head Self-Attention)#

  多头自注意力机制通过并行地计算多个自注意力头来增强模型的表达能力。每个头独立地学习不同的表示,然后将它们拼接在一起并通过线性变换得到最终的输出。

  多头自注意力机制的数学表达式如下:

MultiHead(Q,K,V)=Concat(head1,head2,...,headh)WOMultiHead(Q, K, V) = Concat(head_1, head_2, ..., head_h)W^O

headi=Attention(QWiQ,KWiK,VWiV)head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)

其中,hh表示头的数量,WiQW_i^QWiKW_i^KWiVW_i^V是每个头的线性变换矩阵,WOW^O是输出的线性变换矩阵。

  在使用多头自注意力机制时,最后的输出维度是通过拼接所有头的输出并进行线性变换得到的,因此需要确保每个头的输出维度之和等于模型的隐藏维度。于是这里维度相关的公式就是: dk=dv=dmodel/hd_{k}=d_{v}=d_{model}/h

  此次dk=dvd_{k}=d_{v},是为了简化计算,实际中可以不相等。

1.4.位置编码(Position Encoding)#

  由于Transformer架构不包含循环或卷积结构,因此无法直接捕捉序列中的位置信息。为了解决这个问题,Transformer引入了位置编码(Position Encoding),它为输入序列中的每个token添加了位置信息。位置编码可以是固定的(如正弦和余弦函数)或可学习的,论文中提到固定的与可学习的效果差不多,因此就采用了固定的位置编码。

PE(pos,2i)=sin(pos100002i/dmodel)PE_{(pos, 2i)} = sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i+1)=cos(pos100002i/dmodel)PE_{(pos, 2i+1)} = cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)

  pospos表示位置,ii表示维度索引,dmodeld_{model}是每个token的特征维度。

  这里使用2id\frac{2i}{d}其中的2是为了区分偶数维和奇数维,偶数维使用正弦函数,奇数维使用余弦函数。这样设计的位置编码具有周期性,可以帮助模型捕捉不同位置之间的关系。

1.5层归一化(Layer Normalization)#

  首先什么是batch normalization?Batch Normalization是特征归一化的一种方法,它通过对每个mini-batch的数据进行归一化处理,使得每个特征的均值为0,方差为1,从而减少了内部协变量偏移。Batch Normalization通常应用于卷积层或全连接层之后。

  而Layer Normalization是另一种归一化方法,它对每个样本的所有特征进行归一化,使得每个样本的特征均值为0,方差为1,与Batch Normalization不同。Layer Normalization通常应用于Transformer中的自注意力机制和前馈神经网络之后。

手绘norm化对比图

  图中蓝色部分为Batch Normalization,橙色部分为Layer Normalization。下面是二维的例子,上面是三维的例子。

  Layer Normalization更好的解释是,图中右侧部分的内容。Batch Normalization是对每个特征进行归一化,这个时候每个样本有长有短,而且在进行预测的时候需要存储全局的均值和方差,如果在进行预测的时候碰到一个非常长的样本,可能就处理不好。而Layer Normalization是对每个样本进行归一化,与全局的均值和方差无关。

2.Transformer例子(来自Second视频)#

  假设我们有3个简单的句子,分别是:“史蒂夫 建造 房子”、“苦力怕 在 玩家 身边 爆炸”、“挖 钻石 很 有趣”。

Paper Reading 1 :transformer
https://linxii.top/blog/paper-reading-1
Author 林夕夕
Published at January 15, 2026
Comment seems to stuck. Try to refresh?✨