【AI算法岗面试八股面经【超全整理】——NLP】
AI算法岗面试八股面经【超全整理】
- 概率论【AI算法岗面试八股面经【超全整理】——概率论】
- 信息论【AI算法岗面试八股面经【超全整理】——信息论】
- 机器学习【AI算法岗面试八股面经【超全整理】——机器学习】
- 深度学习【AI算法岗面试八股面经【超全整理】——深度学习】
- NLP【AI算法岗面试八股面经【超全整理】——NLP】
- CV
目录
- 1、RNN
- 2、LSTM
- 3、Transformer
- 4、Word2Vec
- 5、BERT
- 6、GPT
- 7、CLIP
- 8、BPE(Byte Pair Encoder)字节对编码
1、RNN
优点:
- 参数共享。 RNN在每个时间步都使用相同的参数,因此在训练和预测时具有较小的计算负担;
- 灵活性。 RNN可以处理各种长度的序列输入,并且可以用于不同的任务,如语言模型、时间序列预测等
缺点:
- 梯度消失或爆炸。 RNN在处理长期依赖关系时容易出现梯度消失或爆炸的问题,导致难以捕捉远距离的依赖关系;
- 短期记忆限制。 RNN的短期记忆相对较弱,难以有效地记住较长的历史信息
2、LSTM
优点:
- 长期依赖关系。 LSTM通过门控机制 (遗忘门、输入门、输出门) 有效地解决了长期依赖问题,能够更好地捕捉长距离的序列依赖关系;
- 记忆单元。 LSTM引入了记忆单元,可以保留和更新信息,有助于记住长序列中的重要信息;
- 防止梯度消失。 LSTM通过门控机制可以更有效地控制梯度的流动,减少了梯度消失或爆炸的问题
3、Transformer
一种基于自注意力机制的序列到序列(Sequence-to-Sequence)模型,用于处理NLP任务,解决长依赖问题和并行计算效率的平衡。相比于RNN模型Transformer使用全局的自注意力机制,使模型可以同时关注输入序列的所有位置,更好地捕捉长距离依赖关系。Transformer引入多头注意力机制提高了模型的表达能力。Transformer两个关键组件组成:Encoder和Decoder。编码器将输入序列编码为一系列上下文相关的表示,解码器用这些表示生成目标序列。
- 编码器,输入序列经过多头自注意力层和前馈神经网络层处理。自注意力层输入序列的每个位置都与其他位置进行注意力计算,以获取位置之间的相关性。使得模型能够在不同位置之间建立上下文关联,能够处理长距离的依赖关系。
- 解码器,除自注意力层和前馈神经网络层,还包含一个编码器-解码器注意力层。交叉注意力层将编码器中的信息与解码器的当前位置关联,在生成目标序列时获得更好的上下文信息。
- Transformer端到端训练,最大化目标序列的条件概率来进行模型优化。训练中使用掩码注意力(Masked Attention)确保解码器只能看到当前位置之前输入,避免信息泄露。
Transformer优点:
- 能处理长距离依赖问题,适用于处理包含长序列的任务。
- 并行计算效率好,使得模型在GPU上能够进行高效训练和推理。
- 具有较好的表示能力和泛化能力,在多个NLP任务上取得了优异的性能。
1、位置编码
单词在句子中的位置以及排列顺序是十分重要的,引入词序信息有助于理解语义。循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。
给定一个长度为n的输入序列,让t表示词在序列中的位置,
P
t
⃗
∈
R
d
\vec{P_t} \in R^d
Pt∈Rd表示t位置对应的向量,d是向量的维度,
f
:
N
→
R
d
f:N\to R^d
f:N→Rd是生成位置向量
P
t
⃗
\vec{P_t}
Pt的函数,定义如下:
P
t
⃗
(
i
)
=
f
(
t
)
(
i
)
:
=
{
s
i
n
(
w
k
⋅
t
)
if i=2k
c
o
s
(
w
k
⋅
t
)
if i=2k+1
\vec{P_t}^{(i)}=f(t)^{(i)}:=\begin{cases} sin(w_k\cdot t)& \text{if i=2k}\\cos(w_k\cdot t)& \text{if i=2k+1} \end{cases}
Pt(i)=f(t)(i):={sin(wk⋅t)cos(wk⋅t)if i=2kif i=2k+1
其中,频率
w
k
w_k
wk定义如下:
w
k
=
1
1000
0
2
k
d
w_k=\frac{1}{10000^{\frac{2k}{d}}}
wk=10000d2k1
在Transformer中,位置编码是通过加法的方式结合到词向量中的。
2、多头自注意力
Transformer的多头注意力看上去是借鉴了CNN中同一卷积层内使用多个卷积核的思想,原文中使用 8 个“scaled dot-product attention”,在同一“multi-head attention”层中,输入均为“KQV”,同时进行注意力的计算,彼此之前参数不共享,最终将结果拼接起来,这样可以允许模型在不同的表示子空间里学习到相关的信息。即希望每个注意力头只关注最终输出序列中一个子空间,互相独立。核心思想在于抽取到更加丰富的特征信息。
3、Q、K、V
- Q代表query查询,后续会和每一个k进行匹配,找到最相似的k
- K代表key关键字,后续会被每一个q匹配
- V代表value值,代表从输入中提到的信息
注意力机制的核心为:
Q
=
X
W
Q
Q=XW^Q
Q=XWQ
K
=
X
W
K
K=XW^K
K=XWK
V
=
X
W
V
V=XW^V
V=XWV
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
每一个key,都对应一个value;计算query和key的匹配程度就是计算两者相关性,相关性越大,代表key对应value的权重也就越大。
d
k
d_k
dk是K的维度,除以一个根号d因为Q和K相乘之后的数值可能会相差很大,除以根号d可以平衡数据。利于模型收敛。
4、预测与推理阶段都使用mask原因
- 训练阶段:训练时计算loss,是用当前decoder输入所有单词对应位置的输出 y 1 , y 2 , y 3 , ⋯ , y t y_1,y_2,y_3,\cdots,y_t y1,y2,y3,⋯,yt与真实的翻译结果ground truth去分别算cross entropy loss,然后把t个loss加起来,如果使用self-attention,那么 y 1 y_1 y1这个输出里包含了 x 1 x_1 x1右侧单词信息(包含要预测下一个单词 x 2 x_2 x2的信息),用到了未来信息,属于信息泄露。
- 预测阶段:预测阶段要保持重复单词预测结果是一样的,这样不仅合理,而且可以增量更新(预测时会选择性忽略重复的预测词,只摘取最新预测的单词拼接到输入序列中),如果关掉dropout,那么当预测序列是 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3时的输出结果,应该是和预测序列是 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3的前3个位置结果是一样的(增量更新);同时与训练时的模型架构保持一致,前向传播的方式是一致的。
5、嵌入向量和位置向量用为什么add而不用concat
- 在d维token嵌入向量上concat一个d维的位置向量,变成了2d维的向量,最终要得到d维的输出,需要*(2d,d)的矩阵。等价于:先对token嵌入向量做变换,然后再加上位置嵌入,并且concat会增加网络的计算量。
- 相同的token在句子中不同位置语义应该是不一样的,token向量应该有差异,add可以在向量的各个维度上表现出差异,而concat会导致向量前面部分一样,只有后面部分不同。
6、为什么在进行Softmax之前需要对Attention进行scaled(为什么除以 d k \sqrt{d_k} dk)
- 这取决于softmax函数的特性,如果softmax内计算的数数量级太大,会输出近似one-hot编码的形式,导致梯度消失的问题,所以需要scale。
- 那么至于为什么需要用维度开根号,假设向量q,k满足各分量独立同分布,均值为0,方差为1,那么qk点积均值为0,方差为dk,从统计学计算,若果让qk点积的方差控制在1,需要将其除以dk的平方根,是的softmax更加平滑
4、Word2Vec
Word2Vec有两种主要的模型:CBOW和Skip-gram。这两种模型都是基于神经网络的模型,它们通过学习文本数据中的上下文信息来得到单词的向量表示。
- CBOW。 全称是Continuous bag of words(连续词袋模型),通过context word(背景词)来预测Target word(目标词)。在每个窗口内它不考虑词序信息,它是直接把上下文的词向量相加,自然就损失了词序信息。
- Skip-gram。 与CBOW相反,Skip-gram模型的输入是一个词汇,输出则是该词汇的上下文。(Skip-gram 出来的准确率比cbow 高)
5、BERT
BERT模型由多层Transformer编码器堆叠而成,通过预训练任务来学习语言的深层表示。这些预训练任务包括:
(1)遮蔽语言模型(Masked Language Model,MLM)(类似于完形填空)。在MLM任务中,模型被训练来预测输入句子中被遮蔽的词;
(2)下一句预测(Next Sentence Prediction,NSP)。在NSP任务中,模型需要判断两个句子是否是连续的文本序列。
6、GPT
1、GPT-1:
Pretrain+finetune
在预训练阶段,给定tokens的语料:
U
=
u
1
,
⋯
,
u
t
U=u_1,\cdots,u_t
U=u1,⋯,ut,目标函数为最大化似然函数:
L
1
(
U
)
=
∑
i
l
o
g
(
P
(
u
i
∣
u
i
−
k
,
⋯
,
u
i
−
1
;
θ
)
L_1(U)=\sum_i{log(P(u_i|u_{i-k},\cdots,u_{i-1};\theta)}
L1(U)=i∑log(P(ui∣ui−k,⋯,ui−1;θ)
其中,
k
k
k是文本上下文窗口的大小
- 12层的transformer,每个transformer块有12个头
- 词编码的长度为768
- Batchsize为64
2、GPT-2:
Zero-shot
GPT-2去掉了fine-tuning层:不再针对不同任务分别进行微调建模,而是不定义这个模型应该做什么任务,模型会自动识别出来需要做什么任务。GPT2依然沿用GPT1单向transformer的模式,只不过使用了更大的网络参数,和更大的数据集。
GPT-2试图通过“上下文学习In Context Learning”的方式来实现这一点,使用预训练语言模型的文本输入作为任务规范的一种形式:模型以自然语言指令和/或几个任务演示为条件,然后预期仅通过预测接下来会发生什么来完成更多的任务实例。
GPT-2的核心思想概括为:任何有监督任务都是语言模型的一个子集,当模型的容量非常大且数据量足够丰富时,仅仅靠训练语言模型的学习便可以完成其他有监督学习的任务。
- 滑动窗口大小增加为1024
- 将Transformer堆叠层数增加到48层,隐层的维度增至1600,参数量达15亿
- Batchsize的大小增加为512
3、GPT-3:
稀疏自注意力,(locally banded sparse attention,局部带状稀疏注意力)
- Dense Attention(传统 Self Attention):每个token之间两两计算Attention
- Sparse Attention:每个token只与其他token的一个子集计算Attention
网络容量的提升: - GPT-3采用了96层的多头transformer,头的个数为96
- 词向量的长度是12888
- 上下文滑动窗口的窗口大小提升至2048个token
具体来说,sparse Attention除了相对距离不超过k,以及相对距离为k,2k,3k,…的token,其他所有token的注意力都设为0。
4、GPT和BERT区别:
- GPT用的是transformer中去掉中间Encoder-Decoder Attention的Decoder,(其实也可以等价地说,用到的是Encoder层,只是将Multi-Head Attention换成了Masked Multi-Head Attention),即:Masked Self Attention,是单向语言模型,即给定前几个词预测下一个词,更适合自然语言生成的任务;
- 而BERT使用的是transformer的Encoder,即:Self Attention,是双向的语言模型,即给定周围上下文的词预测中间被mask的词,更适合自然语言理解的任务。
7、CLIP
使用对比学习,让模型学习文本-图像对的匹配关系,在同时输入文本和图像对的情况下,只有对角线上的位置才是真值。
为了实现这一目标,CLIP使用了一个多模态编码器,它由两个自编码器组成:图像编码器可以是基于卷积神经网络(CNN)或者VIT的模型;文本编码器则是一个基于Transformer的模型。作者通过一个线性投影将每个编码器的表示映射到多模态嵌入空间。通过联合训练图像编码器和文本编码器来最大化批次中的N个真实对的图像和文本嵌入的余弦相似度,同时最小化
N
2
−
N
N^2-N
N2−N个错误对的余弦相似度。
8、BPE(Byte Pair Encoder)字节对编码
1、构建词表:
- 确定词表大小,即subword的最大个数V;
- 在每个单词最后添加一个,并且统计每个单词出现的频率;
- 将所有单词拆分为单个字符,构建出初始的词表,此时词表的subword就是字符;
- 挑出频次最高的字符对,比如说t和h组成的th,将新字符加入词表,然后将预料中所有该字符对融合(merge),即所有t和h都变为th。新字符依然可以参与后续的merge,优点类似哈夫曼树,BPE实际上就是一种贪心算法;
- 重复3、4的操作,直到词表中单词数量达到预设的阈值V或者下一个字符对的频数为1;
2、BPE编码:
- 将词表中的单词按长度大小,从长到短排序;
- 对于语料中的每个单词,遍历排序好的词表,判断词表中的单词/子词(subword)是否是该字符串的子串,如果匹配上了,则输出当前子词,并继续遍历单词剩下的字符串;
- 如果遍历完词表,单词中仍然后子字符串没有被匹配,那我们将其替换为一个特殊的子词,比如< unk >
3、BPE解码:
将所有的输出子词拼在一起,直到碰到结尾为。
例如:[“moun”, “tain”, “high”, “the”] 解码后:[“mountain”, “highthe”]
4、优缺点:
- 优点: BPE算法是介于字符和单词粒度之间的一种以subword为粒度的分词算法。1)能够解决OOV问题(无法很好的处理未知或罕见的词汇);2)减少词汇表大小;3)具有一定的泛化能力;
- 缺点: 是基于统计的分词算法,对语料依赖性很强,如果语料规模很小,则效果一般不佳。