当前位置: 首页 > article >正文

【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:NRd是生成位置向量 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(wkt)cos(wkt)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(dk QKT)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)=ilog(P(uiuik,,ui1;θ)
其中, 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 N2N个错误对的余弦相似度。

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)具有一定的泛化能力;
  • 缺点: 是基于统计的分词算法,对语料依赖性很强,如果语料规模很小,则效果一般不佳。

http://www.kler.cn/news/315626.html

相关文章:

  • 学生管理系统1.0版本
  • Kotlin 基本介绍(一)
  • 如何确保消息只被消费一次:Java实现详解
  • Python 中的 HTTP 编程入门,如何使用 Requests 请求网络
  • 实现人体模型可点击
  • Kotlin 枚举和 when 表达式(六)
  • 关于Python sklearn CountVectorizer使用详解
  • 多模态论文串讲-学习笔记(上)
  • docker配置镜像加速器
  • 亚马逊IP关联揭秘:发生ip关联如何处理
  • 【BEV 视图变换】Ray-based(2): 代码复现+画图解释 基于深度估计、bev_pool
  • MoveIt控制机械臂的运动实现——机器人抓取系统基础系列(二)
  • 带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信
  • 校园美食发现:Spring Boot技术的美食社交平台
  • Flyway 版本迁移文件
  • 【Kubernetes】常见面试题汇总(三十二)
  • Docker 系列完结
  • SparkSQL和Spark常用语句
  • Go语言并发编程:从理论到实践
  • QT widgets 窗口缩放,自适应窗口大小进行布局
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】003 - vmlinux.lds 链接脚本文件源码分析
  • 第k个排列 - 华为OD统一考试(E卷)
  • 跟着问题学12——GRU详解
  • Lucene详解介绍以及底层原理说明
  • 如何在Linux Centos7系统中挂载群晖共享文件夹
  • 心理辅导平台的构建:Spring Boot技术解析
  • 深度学习-从零基础快速入门到项目实践,这本书上市了!!!
  • 828华为云征文|部署知识库问答系统 MaxKB
  • 【文献阅读】基于原型的自适应方法增强未见到的构音障碍者的语音识别
  • 分布式消息中间件kafka