简介:Attention机制是一种用于加强神经网络在处理序列数据中关注重要部分的机制。在处理长序列时,RNN可能难以捕捉到序列中不同部分的重要程度,导致信息传递不够高效。而Attention机制允许网络根据当前输入和其他位置的信息,动态地调整各个位置的权重,使得模型可以有选择地关注不同部分的输入。Transformer是一种基于Attention机制的神经网络架构,由著名且经典的"Attention is All You Need"一文提出,广泛应用于自然语言处理和其他序列建模任务。与传统的RNN和CNN结构不同,Transformer完全基于Attention机制来处理序列数据,消除了传统序列模型中的顺序依赖,使得并行计算成为可能,从而加速训练过程。下面总结了一些面试常问的相关面试题,其他系列面经请关注文章底部专栏:小白机器学习面试指南。持续更新中。
答:Attention机制是一种在处理时序相关问题的时候常用的技术,主要用于处理序列数据。它核心思想是在处理序列数据时,网络应该更关注输入中的重要部分,而忽略不重要的部分,它通过学习不同部分的权重,将输入的序列中的重要部分显式地加权,从而使得模型可以更好地关注与输出有关的信息。
在序列建模任务中,比如机器翻译、文本摘要、语言理解等,输入序列的不同部分可能具有不同的重要性。传统的循环神经网络(RNN)或卷积神经网络(CNN)在处理整个序列时,难以捕捉到序列中不同位置的重要程度,可能导致信息传递不够高效,特别是在处理长序列时表现更明显。
Attention机制的关键是引入一种机制来动态地计算输入序列中各个位置的权重,从而在每个时间步上,对输入序列的不同部分进行加权求和,得到当前时间步的输出。这样就实现了模型对输入中不同部分的关注度的自适应调整。
答:具体的计算步骤如下:
答:Seq2Seq模型是一种基于编码器-解码器结构的模型,主要用于处理序列到序列的任务,例如机器翻译、语音识别等。传统的Seq2Seq模型只使用编码器来捕捉输入序列的信息,而解码器只从编码器的最后状态中获取信息,并将其用于生成输出序列。而Attention机制则允许解码器在生成每个输出时,根据输入序列的不同部分给予不同的注意力,从而使得模型更好地关注到输入序列中的重要信息。
答:self-attention是指在序列数据中,将当前位置与其他位置之间的关系建模。它通过计算每个位置与其他所有位置之间的相关性得分,从而为每个位置分配一个权重。这使得模型能够根据输入序列的不同部分的重要性,自适应地选择要关注的信息。
target-attention则是指将注意力机制应用于目标(或查询)和一组相关对象之间的关系。它用于将目标与其他相关对象进行比较,并将注意力分配给与目标最相关的对象。这种类型的注意力通常用于任务如机器翻译中的编码-解码模型,其中需要将源语言的信息对齐到目标语言。
因此,自注意力主要关注序列内部的关系,而目标注意力则关注目标与其他对象之间的关系。这两种注意力机制在不同的上下文中起着重要的作用,帮助模型有效地处理序列数据和相关任务。
答:Self-Attention 的核心是建立在一种注意力机制上,它允许模型在处理序列数据时能够自动地"关注"到序列中的不同位置,并根据每个位置的重要性来加权考虑输入中其他位置的信息。
在传统的序列模型中(例如循环神经网络RNN和长短期记忆网络LSTM),信息的处理是顺序进行的,模型需要依次处理序列中的每个元素。这种方式在处理长距离依赖关系时可能会面临梯度消失或爆炸等问题。
而Self-Attention则可以一次性考虑序列中的所有位置,并计算每个位置与其他位置的相关性得分,这些得分将被用来对不同位置的表示进行加权平均。这使得模型能够轻松地捕捉长距离的依赖关系,而无需像传统序列模型那样通过多层堆叠来增加上下文的窗口。
在Transformer中,Self-Attention 被称为"Scaled Dot-Product Attention",其计算过程如下:
答:self-attention实际只是attention中的一种特殊情况,因此k=v是没有问题的,也即K,V参数矩阵相同。实际上,在Transformer模型中,Self-Attention的典型实现就是k等于v的情况。Transformer中的Self-Attention被称为"Scaled Dot-Product Attention",其中通过将词向量进行线性变换来得到Q、K、V,并且这三者是相等的。
答:讲自己熟悉的就可:
Scaled Dot-Product Attention: 这是Transformer模型中最常用的Attention机制,用于计算查询向量(Q)与键向量(K)之间的相似度得分,然后使用注意力权重对值向量(V)进行加权求和。
Multi-Head Attention: 这是Transformer中的一个改进,通过同时使用多组独立的注意力头(多个QKV三元组),并在输出时将它们拼接在一起。这样的做法允许模型在不同的表示空间上学习不同类型的注意力模式。
Relative Positional Encoding: 传统的Self-Attention机制在处理序列时并未直接考虑位置信息,而相对位置编码引入了位置信息,使得模型能够更好地处理序列中不同位置之间的关系。
Transformer-XL: 一种改进的Transformer模型,通过使用循环机制来扩展Self-Attention的上下文窗口,从而处理更长的序列依赖性。
答:在 Attention 机制中,同样需要忽略 padding 部分的影响,这里以transformer encoder中的self-attention为例:self-attention中,Q和K在点积之后,需要先经过mask再进行softmax,因此,对于要屏蔽的部分,mask之后的输出需要为负无穷,这样softmax之后输出才为0。
答:(转至网上某位大佬回答)这是个非常有意思的问题,要回答这个问题,我们必须重新定义一下Attention。Transformer Paper里重新用QKV定义了Attention。所谓的QKV就是Query,Key,Value。如果我们用这个机制来研究传统的RNN attention,就会发现这个过程其实是这样的:RNN最后一步的output是Q,这个Q query了每一个中间步骤的K。Q和K共同产生了Attention Score,最后Attention Score乘以V加权求和得到context。那如果我们不用Attention,单纯用全连接层呢?很简单,全链接层可没有什么Query和Key的概念,只有一个Value,也就是说给每个V加一个权重再加到一起(如果是Self Attention,加权这个过程都免了,因为V就直接是从raw input加权得到的。)
可见Attention和全连接最大的区别就是Query和Key,而这两者也恰好产生了Attention Score这个Attention中最核心的机制。而在Query和Key中,我认为Query又相对更重要,因为Query是一个锚点,Attention Score便是从过计算与这个锚点的距离算出来的。任何Attention based algorithm里都会有Query这个概念,但全连接显然没有。
最后来一个比较形象的比喻吧。如果一个神经网络的任务是从一堆白色小球中找到一个略微发灰的,那么全连接就是在里面随便乱抓然后凭记忆和感觉找,而attention则是左手拿一个白色小球,右手从袋子里一个一个抓出来,两两对比颜色,你左手抓的那个白色小球就是Query。
答:在Transformer的Multi-Head Attention中,对每个head进行降维是为了增加模型的表达能力和效率。
每个head是独立的注意力机制,它们可以学习不同类型的特征和关系。通过使用多个注意力头,Transformer可以并行地学习多种不同的特征表示,从而增强了模型的表示能力。
然而,在使用多个注意力头的同时,注意力机制的计算复杂度也会增加。原始的Scaled Dot-Product Attention的计算复杂度为O(d^2),其中d是输入向量的维度。如果使用h个注意力头,计算复杂度将增加到O(hd^2)。这可能会导致Transformer在处理大规模输入时变得非常耗时。
为了缓解计算复杂度的问题,Transformer中在每个head上进行降维。在每个注意力头中,输入向量通过线性变换被映射到一个较低维度的空间。这个降维过程使用两个矩阵:一个是查询(Q)和键(K)的降维矩阵W_q和W_k,另一个是值(V)的降维矩阵W_v。
通过降低每个head的维度,Transformer可以在保持较高的表达能力的同时,大大减少计算复杂度。降维后的计算复杂度为O(hd' ^ 2),其中d'是降维后的维度。通常情况下,d'会远小于原始维度d,这样就可以显著提高模型的计算效率。
答:Transformer在Encoder和Decoder中都进行了权重共享。
在Transformer中,Encoder和Decoder是由多层的Self-Attention Layer和前馈神经网络层交叉堆叠而成。权重共享是指在这些堆叠的层中,相同位置的层共用相同的参数。
在Encoder中,所有的自注意力层和前馈神经网络层都共享相同的参数。这意味着每一层的自注意力机制和前馈神经网络都使用相同的权重矩阵来进行计算。这种共享保证了每一层都执行相同的计算过程,使得模型能够更好地捕捉输入序列的不同位置之间的关联性。
在Decoder中,除了和Encoder相同的权重共享方式外,还存在另一种特殊的权重共享:Decoder的自注意力层和Encoder的自注意力层之间也进行了共享。这种共享方式被称为"masked self-attention",因为在解码过程中,当前位置的注意力不能关注到未来的位置(后续位置),以避免信息泄漏。通过这种共享方式,Decoder可以利用Encoder的表示来理解输入序列并生成输出序列。
权重共享的好处是大大减少了模型的参数数量,使得Transformer可以更有效地训练,并且更容易进行推理。此外,共享参数还有助于加快训练速度和提高模型的泛化能力,因为模型可以在不同位置共享并学习通用的特征表示。
答:使用缩放的原因是为了控制注意力权重的尺度,以避免在计算过程中出现梯度爆炸的问题。在点积Attention中,计算注意力得分的公式为:
Attention(Q, K) = softmax(Q * K^T / sqrt(d_k))
使用缩放因子sqrt(d_k)的目的是将点积的结果缩放到一个合理的范围。在没有缩放因子的情况下,点积的结果可能会非常大,这可能导致softmax函数的输入值非常大,进而产生指数级的数值。这会使得softmax的计算变得不稳定,并且可能导致梯度爆炸问题,使得训练过程变得困难。
答:BERT可以使用字粒度(character-level)和词粒度(word-level)两种方式来进行文本表示,它们各自有优缺点:
字粒度(Character-level):
词粒度(Word-level):
在实际应用中,通常根据任务需求和数据情况来选择使用字粒度还是词粒度。字粒度在处理未登录词和低频词等情况下具有优势,但计算复杂度较高;而词粒度在计算效率和稳定的表示上具有优势,但处理未登录词和形态复杂的词汇可能较为困难。因此,在具体任务中需要综合考虑这些因素,选择适合的文本表示粒度。同时,也有一些方法将字粒度和词粒度相结合,如使用Subword Tokenization(如WordPiece、Byte Pair Encoding等),以兼顾字粒度和词粒度的优点。
答:ncoder主要使用自注意力掩码和填充掩码,而Decoder除了自注意力掩码外,还需要使用编码器-解码器注意力掩码来避免未来位置信息的泄露。这些掩码操作保证了Transformer在处理自然语言序列时能够准确、有效地进行计算,从而获得更好的表现。
答:BERT使用的是Transformer中的Encoder部分,而不是Decoder部分。Transformer模型由Encoder和Decoder两个部分组成。Encoder用于将输入序列编码为一系列高级表示,而Decoder用于基于这些表示生成输出序列。在BERT模型中,只使用了Transformer的Encoder部分,并且对其进行了一些修改和自定义的预训练任务,而没有使用Transformer的Decoder部分。
答:BERT选择mask掉15%的词是一种经验性的选择,是原论文中的一种选择,并没有一个固定的理论依据,实际中当然可以尝试不同的比例,15%的比例是由BERT的作者在原始论文中提出,并在实验中发现对于BERT的训练效果是有效的。
答:BERT在第一句前会加一个 [CLS] 标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。
为什么选它?因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。
具体来说,self-attention是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过BERT的12层,每次词的embedding融合了所有词的信息,可以去更好的表示自己的语义。
而 [CLS] 位本身没有语义,经过12层,得到的是attention后所有词的加权平均,相比其他正常词,可以更好的表征句子语义。
答:主要来自两个地方:前馈层的gelu激活函数和self-attention
前馈神经网络层:在BERT的Encoder中,每个自注意力层之后都跟着一个前馈神经网络层。前馈神经网络层是全连接的神经网络,通常包括一个线性变换和一个非线性的激活函数,如gelu。这样的非线性激活函数引入了非线性变换,使得模型能够学习更加复杂的特征表示。
self-attention layer:在自注意力层中,查询(Query)、键(Key)、值(Value)之间的点积得分会经过softmax操作,形成注意力权重,然后将这些权重与值向量相乘得到每个位置的自注意输出。这个过程中涉及了softmax操作,使得模型的计算是非线性的。
答:在BERT的训练中,使用了学习率warm-up策略,这是为了在训练的早期阶段增加学习率,以提高训练的稳定性和加快模型收敛。
学习率warm-up策略的具体做法是,在训练开始的若干个步骤(通常是一小部分训练数据的迭代次数)内,将学习率逐渐从一个较小的初始值增加到预定的最大学习率。在这个过程中,学习率的变化是线性的,即学习率在warm-up阶段的每个步骤按固定的步幅逐渐增加。
学习率warm-up的目的是为了解决BERT在训练初期的两个问题:
不稳定性:在训练初期,由于模型参数的随机初始化以及模型的复杂性,模型可能处于一个较不稳定的状态。此时使用较大的学习率可能导致模型的参数变动太大,使得模型很难收敛,学习率warm-up可以在这个阶段将学习率保持较小,提高模型训练的稳定性。
避免过拟合:BERT模型往往需要较长的训练时间来获得高质量的表示。如果在训练的早期阶段就使用较大的学习率,可能会导致模型在训练初期就过度拟合训练数据,降低模型的泛化能力。通过学习率warm-up,在训练初期使用较小的学习率,可以避免过度拟合,等模型逐渐稳定后再使用较大的学习率进行更快的收敛。
答:在BERT应用中,处理长文本问题有以下几种常见的解决方案:
截断与填充:将长文本截断为固定长度或者进行填充。BERT模型的输入是一个固定长度的序列,因此当输入的文本长度超过模型的最大输入长度时,需要进行截断或者填充。通常,可以根据任务的要求,选择适当的最大长度,并对文本进行截断或者填充,使其满足模型输入的要求。
Sliding Window:将长文本分成多个短文本,然后分别输入BERT模型。这种方法被称为Sliding Window技术。具体来说,将长文本按照固定的步长切分成多个片段,然后分别输入BERT模型进行处理。每个片段的输出可以进行进一步的汇总或者融合,得到最终的表示。
Hierarchical Model:使用分层模型来处理长文本,其中底层模型用于处理短文本片段,然后将不同片段的表示进行汇总或者融合得到整个长文本的表示。这样的分层模型可以充分利用BERT模型的表示能力,同时处理长文本。
Longformer、BigBird等模型:使用专门针对长文本的模型,如Longformer和BigBird。这些模型采用了不同的注意力机制,以处理超长序列,并且通常在处理长文本时具有更高的效率。
Document-Level Model:将文本看作是一个整体,而不是将其拆分成句子或段落,然后输入BERT模型进行处理。这样的文档级模型可以更好地捕捉整个文档的上下文信息,但需要更多的计算资源。