一言
吾念所归,无惧无退!——冰与火之歌
Transformer小结

前言

终于!!前面学了那么多,终于轮到主角登场了:大名鼎鼎的Transformer。理所当然的,就要去读一下原论文:《attention is all your need》
论文地址:https://arxiv.org/pdf/1706.03762

论文摘要介绍

20250913191258
20250913191258

先读一下:
    当前最流行的序列转换模型(应该指的是Seq2Seq模型)都是基于复杂的带有encoder-decoder架构的循环或者卷积神经网络(除了RNN,CNN也可以用与encoder-decoder架构)表现最好的模型是通过注意力机制将encoder和decoder连接起来。我们提出了一个简单的网络结构——Transformer,仅仅依赖于注意力机制。完全不再使用RNN或者CNN。在两个机器翻译的实验中,这些模型表现的非常优秀,并且有更好的parallelizable(可并行性)并且训练的时间更短。
接下来是模型的表现:

Our model achieves 28.4 BLEU on the WMT 2014 English to-German translation task, improving over the existing best results, including ensembles, by over 2 BLEU. On the WMT 2014 English-to-French translation task,our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature.

第一句是介绍了在英语翻译到德语的任务中的表现,第一句很容易理解。但接着这句话:improving over the existing best results, including ensembles, by over 2 BLEU.这句话表示transformer比现有的模型,不管是单模型还是集成模型都超出了至少2个Bleu分数。ensembles表示集成模型的意思。接着是英语翻译到法语的任务中,我们的模型在单模型中是表现最好的,BLEU score of 41.8,并且在8个GPU上只训练了3.5天,下一句指的是:Transformer的训练成本,相当于现有文献中最优模型的一小部分。总之就是说训练成本非常低。
最后一句

We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data

generalizes意思是概括,这里指泛化能力。这句话意思是说Transformer在其他任务上的泛化能力也很强,在English constituency parsing任务中,不管是大数据集还是小数据集,都表现的很好。constituency parsing指的是语法分析,这个是自然语言处理的基础任务之一。
    读了摘要我们只知道Transformer是只基于注意力机制的一个模型,并且它的表现超过了所有模型,且训练成本很低。

Transformer解决了什么问题?

    一个模型的提出,或者说一个paper的发表,那一定是解决了一些问题的,例如encoder-decoder架构的出现解决了如何处理输入和输出长度不等的Seq2Seq问题。上一章学的注意力机制解决了传统encoder-decoder架构中,解码器只依赖于编码器产生的一个固定向量,从而导致在长输入序列中表现不佳的问题。那Transformer呢?看了论文的Introduction部分这个问题应该能解决了。
20250913201450

    第一段首先是介绍了一下RNN,LSTM,GRU的历史地位,

have been firmly established as state of the art approaches in sequence modeling and transduction problems

    可以看到是狠夸了一顿:firmly established as state of the art approaches firmely、state of the art。
    并且最后说了,并且现在大量基于他们的研究还在优化他们,继续拉高他们的上限。
第二段一上来先介绍了一下RNN的结构,接着就开始说这种结构的不足:

This inherently sequential nature precludes parallelization within training examples, which becomes critical at longer sequence lengths, as memory constraints limit batching across examples.

    这种固有的顺序特性就排除了在一个training example中进行并行化,在更长的序列中,这就变得尤为重要,因为内存限制会限制不同样本之间的批量处理能力。(这句话指的是当序列变长的时候,每一个样本就占内存很大,那一个batch中,就放不了太多样本,就会影响效率)
    下一句是说现在很多研究就是优化这个的问题的

Recent work has achieved significant improvements in computational efficiency through factorization tricks [21] and conditional computation [32], while also improving model performance in case of the latter.

  • factorization tricks:通过对模型的计算结构进行分解,减少冗余计算。
  • conditional computation:不是对所有输入都进行全部计算,而是 根据输入情况选择性激活部分网络,从而减少开销。
    这些都是RNN结构的网络的优化技巧,来优化训练速度。

The fundamental constraint of sequential computation, however, remains

    然而,不管怎么优化,序列化计算的基本限制,也是仍然存在的。因为RNN的网络结构就是固定的,不管如何优化,多多少少会有这种问题。
    接下来就是叙述本篇paper的主角: Attention

Attention mechanisms have become an integral part of compelling sequence modeling and transduction models in various tasks, allowing modeling of dependencies without regard to their distance in the input or output sequences [2, 19]. In all but a few cases [27], however, such attention mechanisms are used in conjunction with a recurrent network.

    注意力机制已经成为序列模型和转换模型中不可分割的一部分。注意力机制允许模型在输入和输出之间建立依赖关系而不用考虑距离。然而,在绝大部分情况下,注意力机制都是和循环模型(RNN、LSTM、GRU)一块用的。
    之后最后一段就是自然而然的引出了Transformer的结构:不依赖于循环模型

In this work we propose the Transformer, a model architecture eschewing recurrence and instead relying entirely on an attention mechanism to draw global dependencies between input and output.The Transformer allows for significantly more parallelization and can reach a new state of the art in translation quality after being trained for as little as twelve hours on eight P100 GPUs
    Transformer是避开了循环模型,并且只依赖于注意力机制,来构建了一个global dependencies between input and output.即输入和输出的全局依赖。Transformer还允许并行化,训练速度极快:twelve hours on eight P100 GPUs。成为了:new state of the art。

前面先狠夸一顿前辈:称其为state of the art,但现在,我Transformer成为了new state of the art 新王登基!!

自注意力(Self-Attention)

背景介绍

    在第二章Background的第一段中,作者又将Transformer和同样是减少顺序化计算的 ByteNet和ConvS2S进行了对比。具体怎么对比的这里我就不看了,总之是Transformer更优秀。并且还提到了 Multi-Head Attention,这个在后边会详细介绍。
    第二段就是介绍了一下Self-Attention了。所以说Self-Attention并不是这篇paper中首次提出来的,所以作者没有详细介绍。但是他被大众熟知应该就是因为这篇paper,所以这里结合网上的资料介绍一下self-Attention。
    上一章我们已经学过注意力机制了:在decoder当前时间步中,我们计算当前时间步的hidden_state和输入序列中的每一个hidden_state的注意力分数,之后将这些注意力分数softmax一下,得到
的权重分布,之后将hindden_states加权求和,即可得到上下文向量,之后将和decoder的hidden_state:以及当前时刻的输出序列送入循环模型即可。
    普通注意力机制的作用对象是在每次生成新token时,先将和所有输入计算一下注意力分数,之后加权求和得到上下文向量。这里注意的是和所有输入序列的token的关系。作用对象是根本是率两个序列,即输出序列中的每个对输入序列的注意,是一个序列相对于其他序列的注意力
    而自注意力机制,就是一个序列内部的注意力。

20250520163951

    如图,在一个序列中,每个token都会计算自己与该序列中其他token的注意力分数,之后经过一些操作更新自己的向量。最终计算出一组新的向量,这组向量之间都相互有联系,每个向量都有足够多的信息。
    然而,在Transformer中,自注意力并不像传统注意力分数那样,使用自己token本身的向量与其他向量进行相似度计算。paper中提出了Q、K、V向量的概念:即Query,Key,Value。他们本身都是向量,但是作用不同。每一个token通过一定的方式都会生成自己的QKV向量,用来和其他向量进行注意力计算并更新。

自注意力机制的计算过程

    在我们为每个token生成向量之后,我们给该token套三个不同的线性层,来分别生成QKV向量,分别代表query, keys, values。

其中是词嵌入向量是权重矩阵,这三个权重矩阵再后续都是可以学习的,继而我们的qkv向量也就可以学习。
    从他们的名字我们也可以猜到各个向量的作用,q向量是query,用来询问的,k是key,是供别人查询用的,v是value,是代表了每个token真正的含义,在更新的时候我们是更新的value的值。
    那么,自注意力机制的计算过程就是:每个token生成qkv向量之后,会用自己的q向量,去和当前序列中的其他每一个token的k向量计算注意力分数(相似度):

这里为什么要除以一个?该注意力计算方法叫做缩放点积注意力,这个就是给他缩放用的,至于为啥缩放,我们后边再说。
    计算完成之后,会得到当前token和其他所有向量的注意力分数,只不过我们是用自己的q向量和其他token的v向量进行计算得到的,之后将这些注意力分数softmax一下,得到注意力权重分布。

之后的操作就和我们传统的注意力机制很像了,得到权重分布之后再加权求和:

这步的含义就是:每个token之间的相似度信息,被嵌入了代表该token实际含义的value向量之中

举个例子:

75ca6f1822c8fca0c09a72eeb4988a1e

同理,都是一样的计算方法,这样就可以得到,这些向量都蕴含着丰富的信息,记录着与序列中其他token相似度的信息。
而将向量写成矩阵形式之后:

其中是词嵌入矩阵,包含着所有词嵌入向量的一个矩阵。
然后就是论文中Attention公式了

即:

20250916173923

其中为(...)
为(...)

为什么不用加性注意力&&为什么要缩放

论文中也提到了为什么不用加性注意力:

The two most commonly used attention functions are additive attention [2], and dot-product (multiplicative) attention. Dot-product attention is identical to our algorithm, except for the scaling factor of. Additive attention computes the compatibility function using a feed-forward network with a single hidden layer. While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code.

因为点积注意力在时间上更快,空间上也更优,因为它可以使用高度优化的矩阵乘法代码实现。
    然后下一段论文中也提到了为什么要缩放一下,即为什么要除以。首先是为什么要缩放:

While for small values of dk the two mechanisms perform similarly, additive attention outperforms dot product attention without scaling for larger values of . We suspect that for large values of , the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients. To counteract this effect, we scale the dot products by

    首先是,是啥?论文中也提到了:

The input consists of queries and keys of dimension

就是query向量和key向量的维度。论文中说:当不大时,加性注意力和点积注意力(注意这里是点积注意力,还没缩放)表现差不多,但是当很大时,点积注意力表现就不太行了。作者怀疑当很大时,点积的数值会变得很大,会压缩softmax,使softmax不能更好的分配权重。
缩放的作用就是:用于缩放避免数值过大导致概率分布被拉扯成极值(平滑概率分布)
    当维度足够大的时候,一部分的QK就会非常大,比其他大得多,此时进行归一化,他就会占很大的概率,当QK足够大的时候,概率分布里可能会造成该token是0.99,其他为0.01,这种情况就是方差过大的后果。
这显然不是我们想要的结果。所以除以防止数值过大。
但是,为什么要除以而不是其他的?
网上有非常多严谨的证明,本人看着云里雾里的。但大概都是和方差有关系。当方差过大时,就会导致上边的后果。我是这样子理解的:
学过归一化的都知道,我们最好将向量映射到均值为 0,方差为 1的概率分布内,现假设我们的q,k向量各个分量独立同分布,均值为0,方差为1,

那么q向量与k向量点积,即每一项相乘再相加

那么每一项的方差为1,
所以加起来之后的方差就为
我们想让他方差保持1,那么就需要除以
以上关于为什么除以基于GPT辅助而理解,实在不严谨。此处暂时埋一小坑。

多头注意力(Multi-Head Attention)

    什么是多头注意力?

Instead of performing a single attention function with dmodel-dimensional keys, values and queries,we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively. On each of these projected versions of queries, keys and values we then perform the attention function in parallel, yielding dv-dimensional

    与其仅对 d_model 维的键(keys)、值(values)和查询(queries)执行单一的注意力函数,我们发现将查询、键和值分别通过 h 个不同的、可学习的线性投影映射到 d_k、d_k 和 d_v 维空间会表现更好。在这些投影后的查询、键和值上,我们并行地执行注意力函数,得到 d_v 维的输出值。然后将这些输出值进行拼接,并再次通过线性投影,得到最终的输出值

为什么使用多头注意力?

Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

    多头注意力允许模型同时关注来自不同位置,不同表示空间的信息。如果只是用单头注意力的话,则会抑制这一点。
综上:多头注意力机制就是:多个独立的注意力机制并行工作,最后把它们的结果拼接在一起。
这样模型就能从多个子空间去理解不同类型的语义关系。因为当我们在阅读一句话时,可能同时关注不同的东西:一部分注意力在主语
一部分注意力在动词,一部分注意力在某个代词的指代对象,如果只有一个注意力头,模型只能专注于一类关系(例如主谓)
而 多头注意力 就像是多个“语义探测器”,每个头擅长关注不同的信息类型或结构模式。

多头注意力的多头有点类似卷积神经网络中的通道数。

多头注意力的公式为:

其中

可以看到这里这个Attention函数和我们前面的不太一样。
我们前面的单头注意力函数为:

    可以发现我们给原本的QKV来了一波线性变换,因为多头注意力希望在每一个头中看到不同位置不同空间中的信息,如果直接将QKV放到每一个头中,那么最终每个头的结果都会是差不多的,所以我们给他加了一个线性变换,该权重矩阵也是会随着训练自动学习的,进而保证了不同头可以反映不同的信息。
    除此之外,还有最重要的原因:改变QKV的维度。上边我们知道了四个权重矩阵的维度。
我们知道,其中n为序列长度(有几个token),为Q,K,V向量的维度。

则投影后:

之后每个头经过分别计算自注意力之后,得到的向量维度为:(因为最终是将向量V加权求和了,那维度就是向量V的维度)
因为头数为,我们会将每一个头的输出拼接起来,则维度为

而之后我们需要将维度重新转换成,所以:

论文中,各个维度的配置为:

In this work we employ h = 8 parallel attention layers, or heads. For each of these we use = = = 64. Due to the reduced dimension of each head, the total computational cost is similar to that of single-head attention with full dimensionality

示意图为:

20250916203813

其中Scaled Dot-Product Attention为前面讲的自注意力。

Transformer的结构

有了这些基础,再看模型结构,会清晰一些(只是一些)。

20250916203942
20250916203942

乍一看很复杂,实际上确实有点复杂。我们先观察输入,encoder层的输入和decoder的输入,都先经过了一个叫做Positional Encoding的层:位置编码。

位置编码(positional encodings)

位置编码的介绍位于原论文的3.5节:

Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the bottoms of the encoder and decoder stacks. The positional encodings have the same dimension as the embeddings, so that the two can be summed. There are many choices of positional encodings,learned and fixed

    因为Transformer没有循环和卷积,所以无法直接的利用到序列的先后顺序信息,而在NLP中,数据的顺序位置信息是非常重要的,为了利用序列的顺序信息,作者必须在原序列中的token中加入一些绝对或者相对的位置信息。 positional encodings的维度和输入序列、输出序列的维度相同,都是,所以可以直接和其相加。实际上是有很多位置编码的方式的。论文中采取的是:

其中,pos为序列中某个token的位置索引:
例如:The cat sat on the mat
则The的pos为0,sat的pos为1。

    在论文中,向量维度为,长度为512,即每一个词会生成一个维度为512的向量,而我们也要将每一个词生成一个位置向量,来和embedding向量相加。则每一个token中的每一个维度的值的公式即为:

分别对应奇数维度和偶数维度。
这里跑一个小demo看一下就可以了:

import numpy as np
import pandas as pd

def positional_encoding(pos, d_model):  
    pe = np.zeros(d_model)
    for i in range(0, d_model, 2):
        denominator = np.power(10000, (i / d_model))
        pe[i] = np.sin(pos / denominator)       # 偶数维
        pe[i+1] = np.cos(pos / denominator)     # 奇数维
    return pe

# 生成 pos=0,1,2 三个位置的编码
pos_encodings = [positional_encoding(p, d_model=10for p in range(3)]


df = pd.DataFrame(pos_encodings, index=["pos=0""pos=1""pos=2"])
print(df)
pos0123456789
pos=00.0000001.0000000.0000001.0000000.0000001.0000000.0000001.0000000.0000001.000000
pos=10.8414710.5403020.1578270.9874670.0251160.9996850.0039810.9999920.0006311.000000
pos=20.909297-0.4161470.3116970.9501820.0502170.9987380.0079620.9999680.0012620.999999

    假设有3个token,每个tokenembedding之后的向量维度为10,那这样子就生成了每个向量的位置编码。

为什么这么编?

The wavelengths form a geometric progression from 2π to 10000 · 2π. We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset , can be represented as a linear function of .

    这些正弦/余弦函数的波长构成了一个从
2π到10000⋅2π 的几何级数。我们选择这种函数形式,是因为我们推测它能让模型更容易地学会基于相对位置进行注意力计算。

    这是因为,对于任意一个固定的偏移量,位置编码都可以表示为位置编码的线性函数。这就让模型更可以捕捉位置信息。
为啥能够线性表示?首先当都为奇数或者偶数时,使用同一个公式时,这个不用说,一定可以。但是当一个奇,一个偶,这时候怎么办?
因为sin和cos函数是可以相互转换的,所以也可以线性表示。

Wealso experimented with using learned positional embeddings [9] instead, and found that the two versions produced nearly identical results (see Table 3 row (E)). We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training.

    同时作者也尝试了可学习的位置编码,发现这两种版本的效果差不多。作者选择了论文中的这种,因为这个可以允许模型外推到比训练时遇到的更长的序列长度
模型在训练时,可能只见过长度最多是 N 的句子。但是由于位置编码是用 确定的正弦/余弦函数计算出来的,而不是训练出来的参数,所以当遇到长度 > N 的序列时,仍然可以直接计算出对应的编码。这样模型就具备了泛化到更长序列的能力。

Add&Norm(残差连接+层归一化)

    在encoder中,经过位置编码,我们来到Multi-Head Attention部分,这个部分前面已经讲的很明白了。但是在decoder中,我们经过的是:Masked Multi-Head Attention,加了一个masked,我们一会在详细了解。现在就是。经过多头注意力模块后,又经过了一个Add&Norm模块,这个Add&Norm是什么?

We employ a residual connection [11] around each of the two sub-layers, followed by layer normalization [1]. That is, the output of each sub-layer is LayerNorm(x + Sublayer(x)), where Sublayer(x) is the function implemented by the sub-layer itself.

该模块指的是:残差连接+layer normalization,关于layer normalization,我打算再写一篇文章单独将layer normalization和batch normalization。
这里就明白:layer normalization就是常见的归一化,是针对一个样本的所有特征进行归一化。而batch normalization是针对某一特征,将所有样本的该特征进行归一化。BN注重不同样本之间的特征大小关系;LN则是注重一个样本内不同特征之间的大小关系。在NLP任务中,那一定是得LN了。
至于这两种归一化的意义与具体区别,之后有机会再单独写一篇文章进行总结。
该模块的输出为:

其中Sublayer(x)是经过该模块之前的那个模块的映射方法,
如果在 Encoder 的第一子层 → 它等于 Multi-Head Attention(x)
如果在 Encoder 的第二子层 → 它等于 FeedForward(x)。

因为transformer也是一个深层次网络,encoder和decoder都分别有6层。而残差连接的意义就是防止网络过深而丢失信息,稳定深层网络训练。
    通俗一点理解就是可能经过这层之后,可能是更好的结果也可能是更坏的结果,如果是更坏的结果,本来的信息就会被扭曲的面目全非,那再经过深的网络,那效果一定就没那么好了,把原本的x加上,就算这层训练的很烂,也能够保证一个下限。

Feed-Forward

    这个模块就是两个全连接神经网络组合而成,两个子网络之间由RELU函数连接:如下:

While the linear transformations are the same across different positions, they use different parameters from layer to layer. Another way of describing this is as two convolutions with kernel size 1.The dimensionality of input and output is = 512, and the inner-layer has dimensionality = 2048.

    虽然这些线性变换(linear transformations)在不同位置上是相同的(这里意思是同一个子层对每个 token 都做相同的变换),但是在层与层之间是使用的不同的参数,换句话说:就像两个1×1大小的卷积核一样,输入输出都是512,但是中间的隐藏层维度为2048.
即实现了一个升维再降维的过程,有助于增加模型的非线性表达能力。
还有一个理解方式就是,我们将QKV向量拆开分别训练之后直接拼起来可能是拼不回原来的样子的。所以我们需要这一步升维再降维让他们得到他们真正的样子。

Masked Multi-Head Attention

    该模块对比Multi-Head Attention就是多了一个masked.
先看原论文怎么说的:

We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

    我们还对decoder中的自注意力层做了修改来防止某个位置去attending to(关注)后边的位置,这种masking机制,并且输出序列的embedding在输入时会整体向后移一位,这些确保了在预测时,位置的预测只能依赖于之前已经生成的位置(小于i的位置)。
    什么意思呢?在传统基于RNN的encoder-decoder架构中,都是基于时间步的,都是基于前i-1个token来生成第i个token,但是在transformer中,我们的encoder架构一次性将输入序列转换成
,之后解码器输入,来输出对的预测。transformer实现的是一种并行运算。但是我们在预测第个token时,应该只基于前t时刻的信息,不应该知道时刻以及之后的信息,否则就提前知道"答案"了,所以我们就需要利用masking机制,来遮住t时刻之后的信息。原文中是这么写的:

Similarly, self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position. We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to ) all values in the input of the softmax which correspond to illegal connections. See Figure 2.
20250917075640

    作者的做法在经过缩放点积注意力之后,得到注意力分数,在注意力分数进入softmax之前,要进行一些处理,将那些非法连接的词(即当前时刻之后的词)全部掩盖(设置为)。因为
而这些非法链接的词实际上是注意力矩阵中的上三角部分:
20250917081324

。可能你会想,为什么要在softmax之前将注意力分数设置为负无穷,而不是经过softmax之后将这些位置直接设置为0?
如果这样的话,那他们的和就不为1了,是不符合归一化的。所以采取负无穷输入softmax的方式。

decoder中的Multi-Head Attention

    在decoder中,经过第一层的Masked Multi-Head Attention以及对应的add&norm之后,这层我们做的是构建了输出序列的自注意力,得到了一组富含输出向量之间联系信息的向量。而encoder-decoder架构是需要考虑输入序列和输出序列的。在传统基于RNN以及注意力机制的encoder-decoder架构中,是通过计算输出中当前时刻和输入序列的所有隐藏层的注意力分数,之后softmax得到权重,之后加权求和。得到上下文向量,来进入下一层。而transformer中采用了相似的做法。在从经过第一层的Masked Multi-Head Attention以及对应的add&norm之后,我们已经有了当前已有的输出序列的编码,然后我们用自己的Q向量去询问从输入序列而来的各个K向量,之后对V向量加权求和得到最终的编码,这样做的操作就是将encoder和decoder联系起来了。可以说这里已经不是自注意力了,是decoder的输出序列对encoder中输入序列的注意。
之后在经过一个FNN,以及残差+归一化,最终Linear+softmax输出下一词的概率。

Embeddings and Softmax

Similarly to other sequence transduction models, we use learned embeddings to convert the input tokens and output tokens to vectors of dimension . We also use the usual learned linear transformation and softmax function to convert the decoder output to predicted next-token probabilities. In our model, we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation, similar to [30]. In the embedding layers, we multiply those weights by .

    和其他的序列转换模型一样,我们使用可学习的嵌入将输入和输出序列转换成维度为的向量,同时我们使用常见的线性转换+softmax的来预测下一个token的概率。
同时我们将输入输出的两个嵌入层和softmax之前的线性层共享了权重,就像论文[30]的做法一样。同时,在线性层中,我们将这些权重乘以.

    首先第一个问题:为什么共享? 论文中说采用了与这篇文章相似的操作:Using the Output Embedding to Improve Language Models(https://arxiv.org/pdf/1608.05859)

    在一个语言模型中:会先原始词表进行onehot编码后,每个词用one-hot向量表示,其中为词表大小。接着我们会将其转换成词向量:用一个嵌入矩阵将 one-hot 投影到低维稠密空间:这个过程就是"词嵌入"。而为词的输入嵌入矩阵。

    而我们在经过隐藏层之后(LSTM,RNN等),会输出一个隐藏层向量,之后进行一个线性转换,转成词表大小。该线性转换的权重矩阵为,之后相乘:,得到的为长度为的向量,之后我们再将softmax,得到每个词的输出概率。
    在之前,我们只会把U叫做词输入嵌入矩阵,因为它将词嵌入成了向量。而U和V的通常是独立分开训练的,二者没联系。而本篇paper提出:V就可可以看作是词表中的"输出嵌入矩阵"。可以把共享,他俩绑定在一起进行训练。
作者进行了实验,发现共享之后可以降低模型的perplexity,并且可以节约参数。
作者在机器翻译模型中也做了实验,证明共享可以极大地减少参数量(模型尺寸),而性能几乎不受影响。
作者也分析了为什么共享有效:
输出嵌入因为 softmax 涉及整个词表,对每个词都有(至少很小的)梯度,即使该词不是预测目标;而输入嵌入只有在词作为上下文输入时才更新。这样就使得共享版本中的嵌入向量被更频繁地调整,对低频词的学习更加公平,输出嵌入在预测阶段扮演重要角色:它直接决定模型给各词打分的能力。共享使得输入嵌入也必须兼顾这个输出角色,从而使输入 embedding 也更关注那些能够在预测阶段区分词语的特征,而不仅仅是输入时 “接收”的特征。
第二个问题:为什么要将这些权重乘以.
    因为在对词向量学习的时候,都会尽量让词向量保持均匀分布(对词向量进行归一化)。而当词向量的维度变大时,每个维度的值就会变的较小。以Xavier 初始化为例:

每个维度的取值大约在 范围。
这样做的好处是:让不同层的输入/输出的方差保持平衡,不会梯度爆炸/消失
但是每个维度的量级都比较小,每个维度的方差的量级大约为,则他的L2范数(表示词嵌入向量的长度):

即向量的长度大约为1。

而在位置编码中,每一个位置的取值都是正弦或余弦函数:

每一维的取值都在,又因为,

,所以他的L2范数即大约为:

所以embedding和位置编码的长度不同,不是一个量级的,如果直接相加,会导致位置编码占据主导,原本的词向量就会被吸收。所以我们对embedding乘以,让他和位置编码达到同一量级。

为什么选用自注意力机制?

    作者认为设计序列建模层要关注三个方面:
计算复杂度(computational complexity):每一层需要多少运算量。
并行化能力(parallelization):需要多少顺序操作(sequential operations),越少越能并行。
长距离依赖的路径长度(path length):输入和输出任意两个位置之间的信息传播路径多长。路径越短,模型越容易学到长程依赖。
然后进行了RNN,CNN,Self-Attention在这三个方面的比较
20250918164357

模型结构计算复杂度 (per layer)顺序操作数 (并行性)最大路径长度 (长程依赖)特点
RNN(必须逐步计算,几乎无法并行)长程依赖难学,速度慢
CNN (kernel size = k)常数(高度并行)普通卷积 ,扩张卷积 并行好,但捕捉长程依赖需要堆叠多层
Self-Attention (full)常数(完全并行)(任意位置直接相连)捕捉全局依赖最强,可解释性好
Self-Attention (restricted, 窗口 r)常数(完全并行)高效,适合长序列,但长程依赖能力下降
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇