AI summary
type
status
date
slug
summary
category
tags
icon
password
Attention
讲讲对 Attention 的理解?
Attention 机制是一种在处理时序相关问题的时候常用的技术,主要用于处理序列数据。
核心思想是在处理序列数据时,网络应该更关注输入中的重要部分,而忽略不重要的部分,它通过学习不同部分的权重,将输入的序列中的重要部分显式地加权,从而使得模型可以更好地关注与输出有关的信息。
在序列建模任务中,比如机器翻译、文本摘要、语言理解等,输入序列的不同部分可能具有不同的重要性。传统的 RNN 或卷积神经网络 CNN 在处理整个序列时,难以捕捉到序列中不同位置的重要程度,可能导致信息传递不够高效,特别是在处理长序列时表现更明显。
Attention机制的关键是引入一种机制来动态地计算输入序列中各个位置的权重,从而在每个时间步上,对输入序列的不同部分进行加权求和,得到当前时间步的输出。这样就实现了模型对输入中不同部分的关注度的自适应调整。
Attention 的计算步骤是什么?
具体的计算步骤如下:
- 计算查询(Query):查询是当前时间步的输入,用于和序列中其他位置的信息进行比较。
- 计算键(Key)和值(Value):键表示序列中其他位置的信息,值是对应位置的表示。键和值用来和查询进行比较。
- 计算注意力权重:通过将查询和键进行内积运算,然后应用 softmax 函数,得到注意力权重。这些权重表示了在当前时间步,模型应该关注序列中其他位置的重要程度。
- 加权求和:根据注意力权重将值进行加权求和,得到当前时间步的输出。
在 Transformer 中,Self-Attention 被称为"Scaled Dot-Product Attention",其计算公式为:
其中 是 Query 和 Key 向量的维度。通过缩放,可以让点积结果的方差保持稳定,避免梯度消失或梯度爆炸。
Attention 机制和传统的 Seq2Seq 模型有什么区别?
Seq2Seq(序列到序列)模型是一种用于处理序列转换任务(如机器翻译、文本摘要、语音识别等)的深度学习架构。它最早由 Google 研究团队提出,主要基于 RNN 结构。
Seq2Seq 模型是一种基于编码器-解码器结构的模型,传统的 Seq2Seq 模型只使用编码器来捕捉输入序列的信息,而解码器只从编码器的最后状态中获取信息,并将其用于生成输出序列。
而 Attention 机制则允许解码器在生成每个输出时,根据输入序列的不同部分给予不同的注意力,从而使得模型更好地关注到输入序列中的重要信息。
Self-attention 和 Target-attention 的区别?
self-attention 是指在序列数据中,将当前位置与其他位置之间的关系建模。它通过计算每个位置与其他所有位置之间的相关性得分,从而为每个位置分配一个权重。这使得模型能够根据输入序列的不同部分的重要性,自适应地选择要关注的信息。
target-attention 则是指将注意力机制应用于目标(或查询)和一组相关对象之间的关系。它用于将目标与其他相关对象进行比较,并将注意力分配给与目标最相关的对象。这种类型的注意力通常用于任务如机器翻译中的编码-解码模型,其中需要将源语言的信息对齐到目标语言。
因此,自注意力主要关注序列内部的关系,而目标注意力则关注目标与其他对象之间的关系。
在常规 attention 中,一般有 k=v,那 self-attention 可以吗?
self-attention 实际只是 attention 中的一种特殊情况,因此 k=v 是没有问题的,也即K,V 参数矩阵相同。
目前主流的 attention 方法有哪些?
在深度学习中,Attention 机制已经成为提升模型性能的重要方法,尤其在自然语言处理(NLP)和计算机视觉(CV)领域。以下是目前主流的 Attention 方法:
(1) Additive Attention(加性注意力)
- 计算方式:
其中, 是编码器的隐藏状态, 是解码器的隐藏状态, 是可训练参数。
- 主要用于机器翻译,适用于 短文本任务,但计算复杂度较高。
(2) Dot-Product Attention(点积注意力)
- 计算速度比 Additive Attention 更快,但在维度较高时可能导致数值不稳定。
(3) Scaled Dot-Product Attention(缩放点积注意力)
(4) Multi-Head Attention(多头注意力)
- 也是 Transformer 结构中的核心组件。
- 通过多个独立的注意力头(head)来捕捉不同的特征信息:
- 使模型能够关注不同的语义信息,提高表达能力。
(5) FlashAttention
- 利用底层硬件的内存层次知识,例如 GPU 的内存层次结构,来提高计算速度和减少内存访问开销。 FlashAttention 的核心原理是通过将输入分块并在每个块上执行注意力操作,从而减少对高带宽内存(HBM)的读写操作。适用于 大规模 Transformer 训练。
self-attention 在计算的过程中,如何对 padding 位做 mask?
在 Attention 机制中,同样需要忽略 padding 部分的影响,这里以 transformer encoder 中的 self-attention 为例:self-attention 中,Q 和 K 在点积之后,需要先经过 mask 再进行 softmax,因此,对于要屏蔽的部分,mask 之后的输出需要为负无穷,这样softmax 之后输出才为 0。
深度学习中的 attention 与全连接层的区别何在?
这是个非常有意思的问题,要回答这个问题,我们必须重新定义一下Attention。
Transformer Paper 里重新用 QKV 定义了 Attention。如果我们用这个机制来研究传统的RNN attention,就会发现这个过程其实是这样的:RNN最后一步的 output 是 Q,这个 Q query 了每一个中间步骤的 K。Q 和 K 共同产生了 Attention Score,最后 Attention Score 乘以 V 加权求和得到 context。那如果我们不用 Attention,单纯用全连接层呢?很简单,全链接层可没有什么 Query 和 Key 的概念,只有一个 Value,也就是说给每个 V 加一个权重再加到一起。
可见 Attention 和全连接最大的区别就是 Query 和 Key,而这两者也恰好产生了 Attention Score 这个 Attention 中最核心的机制。而在 Query 和 Key 中,我认为Query 又相对更重要,因为 Query 是一个锚点,Attention Score 便是从过计算与这个锚点的距离算出来的。任何 Attention based algorithm 里都会有 Query 这个概念,但全连接显然没有。
最后来一个比较形象的比喻吧。如果一个神经网络的任务是从一堆白色小球中找到一个略微发灰的,那么全连接就是在里面随便乱抓然后凭记忆和感觉找,而 attention 则是左手拿一个白色小球,右手从袋子里一个一个抓出来,两两对比颜色,你左手抓的那个白色小球就是 Query。
- RNN Attention 的核心思想:在解码时动态关注输入序列的不同部分,而不是仅依赖最后一个隐藏状态。
- Transformer Attention 的不同点:完全基于 Self-Attention,不使用 RNN 结构,计算可以并行化。
Transformer

transformer 中 multi-head attention 中每个 head 为什么要进行降维?
通过降低每个 head 的维度,Transformer 可以在保持较高的表达能力的同时,大大减少计算复杂度。
为了缓解计算复杂度的问题,Transformer 中在每个 head 上进行降维。在每个注意力头中,输入向量通过线性变换被映射到一个较低维度的空间。这个降维过程使用两个矩阵:一个是查询(Q)和键(K)的降维矩阵 ,另一个是值(V)的降维矩阵 。
降维后的复杂度为 ,其中 h 为注意力头的个数, 是降维后的维度。
transformer 在哪里做了权重共享,为什么可以做权重共享?
(1)Encoder 和 Decoder 间的 Embedding 层权重共享;
在机器翻译任务中,源语言和目标语言虽然不同,但它们可以共用一个大型的词表,尤其是考虑到一些词汇如数字、标点符号等在多种语言中是通用的。这使得源语言和目标语言的 Embedding 层可以共享权重。当使用 BPE(Byte Pair Encoding)这样的子词(subword)编码技术时,最小的单元不再是完整的单词,而是更小的子词片段。英语和德语等同属日耳曼语族的语言有许多相同的子词,可以共享相似的语义表示
(2)Decoder 中 Embedding 层和 FC 层权重共享。
共享词嵌入层(embedding layer)和输出层(output layer)之间的权重。这意味着在生成词汇的概率分布时,使用的嵌入矩阵和线性层是相同的。这样可以有效地利用已经学习到的词向量,并且减少了参数量。具体来说,如果嵌入矩阵 () 用于将输入的 one-hot 向量转换为嵌入表示,则同样的矩阵也可以用于输出层:
权重共享的好处是大大减少了模型的参数数量,使得 Transformer 可以更有效地训练,并且更容易进行推理。此外,共享参数还有助于加快训练速度和提高模型的泛化能力,因为模型可以在不同位置共享并学习通用的特征表示。
transformer 的点积模型做缩放的原因是什么?
使用缩放的原因是为了控制注意力权重的尺度,以避免在计算过程中出现梯度爆炸的问题。
Attention 的计算是在内积之后进行 softmax,主要涉及的运算是 。 变大, 方差就会变大,经过 softmax 之后,Attention 就会接近一个 one hot 分布,这带来严重的梯度消失问题,导致训练效果差。
相应地,解决方法就有两个:
- 像 NTK 参数化那样,在内积之后除以 ,使 的方差变为 1,这也是常规的Transformer 如 BERT 里边的 Self Attention 的做法
- 另外就是不除以 ,但是初始化 q,k 的全连接层的时候,其初始化方差要多除以一个 d,这同样能使得使 的初始方差变为 1,T5 采用了这样的做法。
经典神经网络中的 NTK 参数化在一个 全连接神经网络(MLP) 中,假设:为了让 每一层的输出方差保持稳定,NTK 参数化通常采用:其中 d 是输入的维度。这样可以保证:
- 输入的方差不会随着层数增加而指数级增长。
- 梯度的方差在反向传播时不会消失或爆炸。
BERT

BERT 用字粒度和词粒度的优缺点有哪些?
字粒度(Character-level):
- 优点:处理未登录词(Out-of-Vocabulary,OOV):字粒度可以处理任意字符串,包括未登录词,不需要像词粒度那样遇到未登录词就忽略或使用特殊标记。对于少见词和低频词,字粒度可以学习更丰富的字符级别表示,使得模型能够更好地捕捉词汇的细粒度信息。
- 缺点:计算复杂度高:使用字粒度会导致输入序列的长度大大增加,进而增加模型的计算复杂度和内存消耗。需要更多的训练数据:字粒度模型对于少见词和低频词需要更多的训练数据来学习有效的字符级别表示,否则可能会导致过拟合。
词粒度(Word-level):
- 优点:计算效率高:使用词粒度可以大大减少输入序列的长度,从而降低模型的计算复杂度和内存消耗。学习到更加稳定的词级别表示:词粒度模型可以学习到更加稳定的词级别表示,特别是对于高频词和常见词,有更好的表示能力。
- 缺点:处理未登录词(OOV):词粒度模型无法处理未登录词,遇到未登录词时需要采用特殊处理(如使用未登录词的特殊标记或直接忽略)。对于形态复杂的词汇,可能无法准确捕捉其细粒度的信息。
BERT 用的是 transformer 里面的 encoder 还是 decoder?
Transformer 模型由 Encoder 和 Decoder 两个部分组成。Encoder 用于将输入序列编码为一系列高级表示,而 Decoder 用于基于这些表示生成输出序列。
在 BERT 模型中,只使用了 Transformer 的 Encoder 部分,并且对其进行了一些修改和自定义的预训练任务。
为什么 BERT 选择 mask 掉 15% 这个比例的词,可以是其他的比例吗?
BERT选择mask掉15%的词是一种经验性的选择,是原论文中的一种选择,并没有一个固定的理论依据,实际中当然可以尝试不同的比例。
为什么 BERT 在第一句前会加一个 [CLS] 标志?
BERT在第一句前会加一个 [CLS] 标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。为什么选它?因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。
具体来说,self-attention 是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过 BERT 的 12 层,每次词的 embedding 融合了所有词的信息,可以去更好的表示自己的语义。而 [CLS] 位本身没有语义,经过 12 层,得到的是attention 后所有词的加权平均,相比其他正常词,可以更好的表征句子语义。
BERT 非线性的来源在哪里?
主要来自两个地方:前馈层的 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 应用中,如何解决长文本问题?
- 截断:保留文本的开头、结尾或关键部分,截断至 512 个token。实现简单高效,但是可能丢失重要信息,尤其当关键内容位于中间部分时。
- 滑动窗口:将长文本按照固定的步长切分成多个片段,然后分别输入BERT模型进行处理。每个片段的输出可以进行进一步的汇总或者融合,得到最终的表示。
- Hierarchical Model:使用分层模型来处理长文本,其中底层模型用于处理短文本片段,然后将不同片段的表示进行汇总或者融合得到整个长文本的表示。
- Longformer、BigBird等模型:使用专门针对长文本的模型,如Longformer和BigBird。这些模型采用了不同的注意力机制,以处理超长序列,并且通常在处理长文本时具有更高的效率。
KV cache 优化
MHA
多头注意力机制(Multi-Head Attention, MHA) 最早出现在 2017 年谷歌的Transformer 论文:《Attention Is All You Need》。

这种结构设计能让每个注意力机制去优化每个词汇的不同特征部分,从而均衡同一种注意力机制可能产生的偏差,让词义拥有来自更多元的表达,实验表明可以从而提升模型效果。
MQA
MQA(Multi Query Attention)最早是出现在 2019 年谷歌的一篇论文 《Fast Transformer Decoding: One Write-Head is All You Need》。
MQA的思想其实比较简单,MQA 与 MHA 不同的是,MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头正常的只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量。
《Multi-Head Attention:Collaborate Instead of Concatenate 》论文提出了 基于多个 MQA 的 checkpoint 进行 finetuning,来得到一个质量更高的 MQA 模型。这个过程也被称为 Uptraining:
- 对多个 MQA 的 checkpoint 文件进行融合,融合的方法是: 通过对 key 和 value 的 head 头进行 mean pooling 操作。
- 对融合后的模型使用少量数据进行 finetune 训练,重训后的模型大小跟之前一样,但是效果会更好。
GQA
Google 在 2023 年发表的一篇 《GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints》的论文。

GQA-N 是指具有 N 组的 Grouped Query Attention。GQA-1具有单个组,因此具有单个Key 和 Value,等效于MQA。而GQA-H具有与头数相等的组,等效于MHA。
在基于 Multi-head 多头结构变为 Grouped-query 分组结构的时候,也是采用跟上面一样的方法,对每一组的 key-value 对进行 mean pool 的操作进行参数融合。融合后的模型能力更综合,精度比 Multi-query 好,同时速度比 Multi-head 快。
MLA
DeepSeek V2提出了MLA,Multi-headLatentAttention,其本质思想是将原本的权重降秩成两个,大家伙先公用一个KV权重,就像MHA那样,而私有的KV权重,这能藏在哪里呢?如果能够转移到Q和输出O上,是不是就即节省了内存,又不降低性能呢?来看具体内容:
具体参考:deepseek技术解读(1)-彻底理解MLA - 知乎,文章比较长,我这里就不搬了。
Flash Attention
论文名称:《FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness》
Flash Attention 的主要目的是加速和节省内存,主要贡献包括:
- 计算 softmax 时候不需要全量 input 数据,可以分段计算;
- 反向传播的时候,不存储 attention matrix ( 的矩阵),而是只存储 softmax 归一化的系数。
动机
不同硬件模块之间的带宽和存储空间有明显差异,例如下图中左边的三角图,最顶端的是 GPU 中的
SRAM,它的容量非常小但是带宽非常大,以 A100 GPU 为例,它有 108 个流式多核处理器,每个处理器上的片上 SRAM 大小只有 192KB,因此 A100总共的SRAM大小是 192KB×108=20MB,但是其吞吐量能高达 19TB/s。而 A100 GPU HBM(High Bandwidth Memory 也就是我们常说的GPU显存大小)大小在 40GB~80GB 左右,但是带宽只有 1.5TB/s。

FlashAttention 的主要动机就是希望把 SRAM 利用起来,但是难点就在于 SRAM 太小了,一个普通的矩阵乘法都放不下去。FlashAttention 的解决思路就是将计算模块进行分解,拆成一个个小的计算任务。
Softmax Tiling
在介绍具体的计算算法前,我们首先需要了解一下 Softmax Tiling。
(1)数值稳定
Softmax 包含指数函数,所以为了避免数值溢出问题,可以将每个元素都减去最大值,如下图示,最后计算结果和原来的 Softmax 是一致的。
(2)分块计算softmax
因为 Softmax 都是按行计算的,所以我们考虑一行切分成两部分的情况,即原本的一行数据 。
f(x) 和 l(x) 都可以通过分块计算得出,所以 FlashAttention 在计算时将 Q,K,V 分块后,按块加载到内存中。
具体计算过程参考:Flash Attention 为什么那么快?_bilibili,还是视频看起来比较清晰。
Transformer 常见问题
Transformer 和 RNN 的异同?
Transformer 的详解参考:Transformer模型详解(图解最完整版) - 知乎

RNN 跟 transformer 异:如何传递序列的信息
RNN 是把上一个时刻的信息输出传入下一个时候做输入。Transformer 通过一个 attention 层,去全局的拿到整个序列里面信息,再用 MLP 做语义的转换。
RNN 跟 transformer 同:语义空间的转换 + 关注点
用一个线性层 or 一个 MLP 来做语义空间的转换。
关注点:怎么有效的去使用序列的信息。
Transformer 为什么使用多头注意力?
并行计算:每个注意力头可以独立计算,从而实现更高效的并行计算。这样能够加快模型的训练速度。
提升表征能力:通过引入多个注意力头,模型可以学习到不同类型的注意力权重,从而捕捉输入序列中不同层次、不同方面的语义信息。
降低过拟合风险:多头注意力机制使得模型可以综合不同角度的信息,从而提高泛化能力,降低过拟合的风险。
Transformer 为什么 Q 和 K 使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
- 使用Q/K/V不相同可以保证在不同空间进行投影,增强了表达能力,提高了泛化能力。
- 同时,由 softmax 函数的性质决定,实质做的是一个 soft 版本的 argmax 操作,得到的向量接近一个 one-hot 向量(接近程度根据这组数的数量级有所不同)。如果令 Q=K,那么得到的模型大概率会得到一个类似单位矩阵的 attention 矩阵,这样 self-attention 就退化成一个 point-wise 线性映射。这样至少是违反了设计的初衷。
Transformer 计算 attention 的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
- 点乘可通过矩阵乘法一次性计算所有查询-键对,完美适配 GPU 等硬件的并行计算能力,加速训练和推理。点乘无需引入额外参数,模型更简洁,减少过拟合风险。
- 加性注意力中的逐元素非线性操作(如
tanh)会降低并行效率。
在效果上来说,从实验分析,两者的效果和 dk 相关,dk 越大,加法的效果越显著。
为何在获取输入词向量之后需要对矩阵乘以 embedding size 的开方?
embedding matrix 的初始化方式是 xavier init,这种方式的方差是 1/embedding_size,那么 Elements of Embedding 的方差也是 1/embedding_size,所以这里的乘是为了把 Embedding 调整到 N(0,1)。
不过如果再追问一步,为什么不直接用标准正态分布来初始化,而是要用 xavier 等方法初始化成小方差再 scale,又该怎么回答呢?以 PyTorch 为例,nn.Embedding() 层默认的初始化方法就是标准正态分布,直接用这个不就完了吗?但是有些代码里却要先缩小方差初始化一下,再把词向量缩放回来,这不是多此一举?答:NLP 里有时候会用到 tied-embedding,就是让输入词向量层和 softmax 前的线性层(也叫输出词向量层)共享参数。后者作为一个线性层,肯定是要用 xavier 等方法初始化的,所以输入词向量层只好也这么初始化。Xavier 初始化参考:深度学习:零散知识——xavier初始化 - 知乎
简单介绍一下 Transformer 的位置编码?有什么意义和优缺点?
因为 self-attention 是位置无关的,无论句子的顺序是什么样的,通过 self-attention 计算的 token 的 hidden embedding 都是一样的,这显然不符合人类的思维。因此要有一个办法能够在模型中表达出一个 token 的位置信息,transformer 使用了固定的 positional encoding 来表示token在句子中的绝对位置信息。
关于位置编码的技术参考:几种常用的位置编码介绍及pytorch实现 - 知乎
简单讲一下 Transformer 中的残差结构以及意义。
残差连接是跳跃连接的一种。
就是 ResNet 的优点,解决梯度消失。残差连接在构建深层神经网络时,被视为一种有效的兜底策略。 当网络已经达到或接近其性能的最优解时,如果继续增加网络深度(即添加更多的层),这些新增的层(被视为冗余层)不应该对网络的性能产生负面影响。
为什么 transformer 块使用 LayerNorm 而不是 BatchNorm?LayerNorm 在 Transformer 的位置是哪里?

- LN:针对每个样本序列进行 Norm,没有样本间的依赖。对一个序列的不同特征维度进行 Norm
- CV 使用 BN 是认为 channel 维度的信息对 cv 方面有重要意义,如果对 channel 维度也归一化会造成不同通道信息一定的损失。而同理 nlp 领域认为句子长度不一致,并且各个batch 的信息没什么关系,因此只考虑句子内信息的归一化,也就是 LN。
简答讲一下 BatchNorm 技术,以及它的优缺点。
BN 的理解重点在于它是针对整个 Batch 中的样本在同一维度特征在做处理。
- 优点:
- 第一个就是可以解决内部协变量偏移,简单来说训练过程中,各层分布不同,增大了学习难度,BN 缓解了这个问题。当然后来也有论文证明BN有作用和这个没关系,而是可以使损失平面更加的平滑,从而加快的收敛速度。
- 第二个优点就是缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛。
- 缺点:
- 第一个,batch_size 较小的时候,效果差。这一点很容易理解。BN的过程,使用 整个batch 中样本的均值和方差来模拟全部数据的均值和方差,在 batch_size 较小的时候,效果肯定不好。
- 第二个缺点就是 BN 在 RNN 中效果比较差。举个最简单的例子,比如 batch_size 为10,也就是我有10个样本,其中9个样本长度为5,第10个样本长度为20。那么问题来了,前五个单词的均值和方差都可以在这个batch中求出来从而模型真实均值和方差。但是第6个单词到第20个单词怎么办?
简单描述一下 Transformer 中的前馈神经网络?使用了什么激活函数?相关优缺点?
ReLU
Encoder 端和 Decoder 端是如何进行交互的?(在这里可以问一下关于 seq2seq 的 attention 知识)
Cross Self-Attention,Decoder 提供 Q,Encoder 提供 K,V。
Decoder 阶段的多头自注意力和 encoder 的多头自注意力有什么区别?(为什么需要 decoder 自注意力需要进行 sequence mask)
让输入序列只看到过去的信息,不能让他看到未来的信息。
Transformer 的并行化提现在哪个地方?Decoder 端可以做并行化吗?
- Encoder 侧:模块之间是串行的,一个模块计算的结果做为下一个模块的输入,互相之前有依赖关系。从每个模块的角度来说,注意力层和前馈神经层这两个子模块单独来看都是可以并行的,不同单词之间是没有依赖关系的。
- Decode 引入 sequence mask 就是为了并行化训练,Decoder 推理过程没有并行,只能一个一个的解码,很类似于 RNN,这个时刻的输入依赖于上一个时刻的输出。
简单描述一下 wordpiece model 和 byte pair encoding,有实际应用过吗?
- 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题),传统词 tokenization 方法不利于模型学习词缀之间的关系
- BPE(字节对编码)或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节。后期使用时需要一个替换表来重建原始数据。
- 优点:可以有效地平衡词汇表大小和步数(编码句子所需的token次数)。
- 缺点:基于贪婪和确定的符号替换,不能提供带概率的多个分片结果。
Transformer 训练的时候学习率是如何设定的?Dropout 是如何设定的,位置在哪里?Dropout 在测试的需要有什么需要注意的吗?
Transformer训练的学习率设定:
在训练Transformer时,通常采用学习率预热(warm-up)和逆平方根衰减策略。初始学习率从极小值开始,在前
warmup_steps(如4000步)内线性增加至峰值,之后按步数的平方根反比例衰减。公式为:该策略平衡了训练初期的稳定性与后期的收敛速度。
Dropout的设定与位置:
- 设定:Dropout率通常设为0.1(原始论文)。在实际应用中,如果数据量较大,可以适当降低 Dropout 率(如 0.05)。如果数据量较小,可以适当提高 Dropout 率(如 0.2)。
- 位置:
- 嵌入层后(对词嵌入输出应用Dropout)。
- 每个子层输出后(自注意力层和前馈网络层的输出在残差连接前应用Dropout)。
- 注意力权重(可选,对Softmax后的注意力分数应用Dropout)。
测试时Dropout的注意事项:
- 关闭Dropout:测试时不随机丢弃神经元,所有参数保持激活。
- 权重缩放补偿:若训练时未对激活值做缩放(如除以1−p),则需在测试时将神经元权重乘以保留概率1−p。现代框架(如PyTorch)通常已自动处理,无需额外操作。
引申一个关于 bert 问题,bert 的 mask 为何不学习 transformer 在 attention 处进行屏蔽 score 的技巧?
BERT 和 transformer 的目标不一致,bert 是语言的预训练模型,需要充分考虑上下文的关系,而 transformer 主要考虑句子中第 i 个元素与前 i-1 个元素的关系。