算法岗常见面试题(八):Transformer

Transformer常见问题与回答总结

01 Transformer Encoder 有什么子层?(超参数一面)

Encoder由六个相同层构成,每层都有个子层:多头自注意力层和全连接的前馈神经网络层(Linear+relu+dropout+Linear)。使用残差连接和层归一化连接两个子层。

02 写一下self-attention的公式(超参数一面)

Attention(Q,K,V) = Softmax(\frac{QK^T}{\sqrt{d_k}})V

03 Transformer的优缺点

优点

  • 可并行
  • 独立于卷积和循环,完全依赖于attention处理全局依赖,解决长距离依赖问题
  • 性能强

缺点

  • 长度固定
  • 局部信息的获取不如RNN和CNN强:Transformer关注的全局关系,而RNN在计算过程中更关注局部,对距离更加敏感。

04 Encoder端和Decoder端是如何进行交互的?

Cross Self-attention,Decoder提供Q,Encoder提供K,V

05 Transformer中为什么需要线性变换?

K、Q、V分别是输入向量经过不同的线性变换矩阵W_k、Q_k、V_k计算得到。可以从正反两面分析线性变换的必要性:

线性变换的好处:在QK^T部分,线性变换矩阵将KQ投影到了不同的空间增加了表达能力(这一原理可以同理SVM中的核函数-将向量映射到高维空间以解决非线性问题),这样计算得到的注意力矩阵的泛化能力更高

不用线性变换的坏处:在QK^T部分,如果不做线性变换,即X=Q=K,则会导致注意力矩阵是对称的,即d(x_1,x_2)=d(x_2,x_1),这样的效果明显是差的,比如“我是一个女孩”这句话,女孩对修饰我的重要性应该要高于我修饰女孩的重要性。

06 Transformer attention的注意力矩阵的计算为什么用乘法而不是加法?

为了计算更快。

加法形式是先加、后tanh、再和V矩阵相乘,相当于一个完整的隐层。

在计算复杂度上,乘法和加法理论上的复杂度相似,但是在实践中,乘法可以利用高度优化的矩阵乘法代码(有成熟的加速实现)使得点乘速度更快,空间利用率更高。(论文P4有解释)

d_k较小的时候,加法和乘法形式效果相近。但是随着d_k增大,加法开始显著优于乘法。作者认为,d_k增大导致乘法性能不佳的原因,是极大的点乘值将整个softmax推向梯度平缓区,使得收敛困难。于是选择scale,除\sqrt{d_k}

07 Transformer attention计算为什么要在softmax这一步之前除以\sqrt{d_k}

(7 封私信 / 80 条消息) transformer中的attention为什么scaled? - 知乎 (zhihu.com)

  1. 取决于Softmax的性质,如果softmax内计算的数过大或者过小,可能导致Softmax后的结果为0,导致梯度消失
  2. 为什么是d_k。假设Q、K中元素的值分布在[0,1],softmax的计算中,分母涉及了一次对所有位置的求和,整体的分布就会扩大到[0,d_k]。

08 Transformer attention计算注意力矩阵的时候如何对padding做mask操作的?

padding位置置为-1000,再对注意力矩阵进行相加。

09 Transformer的残差结构及意义

同resnet,解决梯度消失,防止过拟合

10 Transformer为什么使用LN而不是BN?

LN是针对每个样本序列进行归一化,没有样本间依赖,对一个序列的不同特征维度进行归一化。

CV使用BN是因为认为通道维度的信息对cv方面有重要意义,如果对通道维度也归一化会造成不同通道信息一定的损失。NLP认为句子长短不一,且各batch之间的信息没有什么关系,因此只考虑句子内信息的归一化

11 Decoder阶段的多头自注意力和encoder的多头自注意力有什么区别?/ 为什么decoder自注意力需要进行sequence mask?

让输入序列只看到过去的信息,而看不到未来的信息。

12 Transformer的并行化体现在哪里,Decoder可以做并行化嘛?

Encoder的模块是串行的,但模块内的子模块多头注意力和前馈网络内部都是并行的,因为单词之间没有依赖关系。

Decode引入sequence mask就是为了并行化训练,推理过程不并行

13 Transformer计算量最大的部分是哪里(超参数二面、海信一面)

多头注意力部分计算量最大。

假设完成一次推理,b(batch-size)=1, s(seq-length,序列最大长度)=256, h(hidden-size)=768, attention-head=12 经过一个Transformer的多头注意力block,所需要的矩阵乘法的数量

总计:12 * (256 * 64 * 256 + 256 * 256 * 64)= 1亿次乘法

除了矩阵乘法的运算外,还有除\sqrt{d_k}Softmax函数的运算:

  1. \sqrt{d_k}:计算量为s^2=256*256
  2. Softmax函数:计算量为s*(s+s-1)≈s^2
  • 两个矩阵相乘的计算量:

假设矩阵A尺寸为(m,n),矩阵B尺寸为(n,k),则矩阵M和矩阵N相乘的计算量为m*n*k。

  • 权重矩阵K,Q,V的尺寸:

不考虑多头注意力的情况下均为(s,h);多头注意力时,默认12个头,故单头的尺寸为(s,1/12h)。

14 Transformer、LSTM和单纯的前馈神经网络比,有哪些提升?

LSTM相比于单纯的前馈神经网络,首先具有理解文本的语序关系的能力(RNN)。除此之外,又解决了RNN在处理长序列时发生的梯度消失和梯度爆炸的问题。

Transformer进一步解决了RNN、LSTM等模型的长距离依赖问题,能够理解更长的上下文语义。可以并行化,所要的训练时间更短。

15 Transformer处理篇章级的长文本的变体

Transformer变体层出不穷,它们都长什么样? (qq.com)

16 有哪些处理超长文本的方法(超参数二面)

HIERARCHICAL

基于BERT的超长文本分类模型_valleria的博客-CSDN博客_长文本分类

  • 基本思想:对数据进行有重叠的分割,这样分割之后的每句句子直接仍保留了一定的关联信息。

模型由两部分构成,第一部分是fine-tune后的BERT,第二部分是由LSTM+FC层组成的混合模型。即,BERT只用来提取出句子的表示,而真正在做分类的是LSTM+FC部分。

具体流程:首先将长句子分割为多个小句子,如长200,重叠长度为50.将分割后的数据集传入BERT,分别取每个句子的[CLS]表示句子的embedding,将来自相同长句子的embedding拼接,作为长句子的向量表示。最后,将长句子的向量表示传入LSTM+FC部分进行分类。

除此之外,第二部分还可以用Transformer。

由于都是从notion笔记里面复制过来的,所以可能存在公式缺失之类的问题,欢迎指出~

由于是个人笔记,可能有错误之处,欢迎指正~

#算法面经#
全部评论
这个是海信的面试题么?
1
送花
回复
分享
发布于 01-02 14:22 北京
老哥有整理 bert 的么
点赞
送花
回复
分享
发布于 2023-04-15 10:40 吉林
秋招专场
校招火热招聘中
官网直投

相关推荐

21 130 评论
分享
牛客网
牛客企业服务