NLP八股文

1.机器学习篇

输入变量与输出变量均为连续变量的预测问题为回归问题

输出变量为有限个离散变量的预测问题称为分类问题

输入变量与输出变量均为变量序列的预测问题称为标注问题。

逻辑回归

线性回归

决策树

随机森林

最大熵模型

朴素贝叶斯

K近邻

感知机

支持向量机

精确率 & 召回率

在二分类中,分类结果有以下四种情况:

  • TP(true positive): 将正类预测为正类
  • TN(true negative): 将负类预测为负类
  • FP(false positive): 将负类预测为正类
  • FN(false negative): 将正类预测为负类

精确率表示为 预测为正类中真正正类的比例

$P=\frac{TP}{TP+FP}$

召回率表示为 真正正类中预测为正类的比例

$R = \frac{TP}{TP+FN}$

F1值定义为精确率和召回率的调和均值

$\frac{2}{F_1} = \frac{1}{P} + \frac{1}{R}$ 即 $F_1 = \frac{2PR}{P+R} = \frac{2TP}{2TP+FP+FN}$

macro F1 vs micro F1

很多时候我们有多个混淆矩阵(多次训练和测试、多个数据集、多分类中每两两类别的组合),如何在n个二分类混淆矩阵中考察模型的综合性能。

  • macro-F1:直接计算单个混淆矩阵的精确率P和召回率R,然后得到平均的P和R,使用平均的P和R计算macro-F1
  • micro-F1:先对TP、TN、FP、TN进行平均,然后计算精确率P和召回率R,最后得到micro-F1

ROC曲线和AUC面积

样本不均衡是采用AUC评估指标较好。

TF-IDF

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。

$TF-IDF = TF * IDF = P(w) * log\frac{总文档数}{包含词条w的文档数}$

TF-IDF的应用: (1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要

2.RNN & LSTM & GRU

RNN与GNN的区别:

  1. 数据类型:

    - RNN 设计用于处理序列数据,即数据点按时间顺序排列,如时间序列分析、语音识别和自然语言处理。
    - GNN 专门用于处理图结构数据,图由节点和边组成,代表实体及其关系,如社交网络、交通网络和分子结构。

  2. 结构和工作原理:

    - RNN 的核心是循环单元,它能够在序列的每个时间步上保持信息的状态,但是长序列会导致梯度消失或梯度爆炸问题,影响学习长期依赖。
    - GNN 通过节点和边的特征以及图结构本身的信息,利用特殊的邻居节点更新机制来学习图中的特征表示,更好地捕捉节点间的依赖关系。

  3. 长期依赖问题:

    - RNN 在处理长序列时存在长期依赖问题,虽然有LSTM(长短期记忆网络)等变体来缓解这一问题,但本质上是序列模型。
    - GNN 通过图结构天然地能够捕捉节点间的依赖关系,因此在处理具有明确关系的数据时更为有效。

各自适用的场景:
- RNN 适用于处理时间序列数据、文本序列等,如股票价格预测、语音识别、机器翻译(序列到序列的任务)。
- GNN 适用于处理结构化数据,如社交网络分析、推荐系统、生物信息学(如蛋白质结构预测)、地理信息系统等,其中实体和关系是数据的核心组成部分。
总的来说,RNN适合处理时间或顺序上的数据,而GNN适合处理具有明确结构关系的数据。两者各有优势,选择哪种模型取决于具体问题和数据的特点。

3.Tokenizer

tokenizer的作用是将文本切分成token,token可以是一个单词、单个字符或多个字符组成的subword。每个token对应一个整数,所以文本就可以转换成向量输入神经网络。Transformer中最常用的tokenizer是BPE(bype-pair encoding),wordpiece和unigram。

wordpiece和bpe一开始都是从小的vocabulary开始(每个都是单个字符),然后通过与其他字符合并来查看频率和似然概率来进行合并。

其中bpe直接对比a、b两项合并的频率,而wordpiece还需要除于a、b两项单独出现的频率乘积来做归一化。

bpe是根据merge规则,从单个字符一步步进行合并,而wordpiece每次是直接找最长能够匹配的subword。

unigram是从大的vocabulary(所有subword的组合)开始,每一轮去排除一些subword组合,方法是利用unigram语言模型,对比排除哪个subword可以使loss增加的最少。

使用BPE的模型:GPT、GPT2、RoBERTa、BART、DeBERTa等

使用WordPiece的模型:BERT、DistilBERT

Unigram:ALBERT、T5,mBART、BigBird、XLNET

Word Piece

  • 获得足够大的语料库。
  • 定义所需的子词词汇量。
  • 将单词拆分为字符序列。
  • 用文本中的所有字符初始化词汇表。
  • 根据词汇建立语言模型。
  • 通过将当前词汇表中的两个单元组合以将词汇表增加一个来生成新的子词单元。 从所有可能的组合中选择加入词表后能最大程度地增加语言模型在训练数据上的似然概率的组合。(a、b的频率/(a的频率 * b的频率))
    • $logP(z)-(logP(x) + logP(y)) = log(\frac{P(z)}{P(x)P(y)})$
  • 重复第5步,直到达到子词词汇量(在第2步中定义),或者似然性增加降至某个阈值以下。

BPE

  • 获得足够大的语料库。
  • 定义所需的子词词汇量。
  • 将单词拆分为字符序列,并附加一个特殊的标记,分别显示单词的开头或单词的结尾。
  • 用文本中的所有字符初始化词汇表。
  • 计算文本中的序列对及其频率。 例如,(‘t’,’h’)具有频率X,(‘h’,’e’)具有频率Y。
  • 根据最频繁出现的序列对生成一个新的子词。 例如,如果(‘t’,’h’)在该对对中具有最高的频率,则新的子字单元将变为’th’。
  • 从第3步开始重复,直到达到子词词汇量(在第2步中定义)或下一个最高频率对为1。在示例中,语料库中的“t”,“h”将替换为“th”,再次计算,最频繁的对再次获得,并再次合并。

BPE是一种贪婪的确定性算法,不能提供多个细分。 也就是说,对于给定的文本标记化文本始终是相同的。

Uni-gram Language Model(ULM)

和WordPiece一样,也是利用语言模型进行subword vocab的选择。

不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。

-
初始时,建立一个足够大的词表。一般,可用语料中的所有字符加上常见的子字符串初始化词表,也可以通过BPE算法初始化。

  • 针对当前词表,用EM算法求解每个子词在语料上的概率。
  • 对于每个子词,计算当该子词被从词表中移除时,总的loss降低了多少,记为该子词的loss。
  • 将子词按照loss大小进行排序,丢弃一定比例loss最小的子词(比如20%),保留下来的子词生成新的词表。这里需要注意的是,单字符不能被丢弃,这是为了避免OOV情况。
  • 重复步骤2到4,直到词表大小减少到设定范围。

什么时候扩展tokenizer,什么时候重新训练tokenizer?

扩展tokenizer:新领域或特点术语,扩展到另外一个语言

重新训练tokenizer:刚开始训练一个大模型,数据显著不同。

4.Transformer & GPT & BERT

Transformer为什么使用多头注意力

在超高维空间中做点积来获得向量之间的接近性,意义非常小,因为向量非常分散。分成多个head以后,每个head的embedding维数降低。比如,GPT-3是96头, 这样每个头只有128维。这样利用向量点积计算向量之间的接近性就有效多了。

将隐状态向量分成多个头,形成多个子语义空间,可以让模型去关注不同维度语义空间的信息。(论文原话)

每个注意力头,只关注最终输出序列中一个子空间,互相独立。其核心思想在于,抽取到更加丰富的特征信息。

Attention为什么Q和K使用不同的矩阵生成,而不是使用K和K的点积?

在attention中,主要分为两部分,一部分是相似度矩阵的计算,也就是softmax(kq^T^),另一部分是利用相似度矩阵将原v值映射到一个新的空间。

那接下来我们需要考虑一点:在已知输入x的情况下,如何建立相似度矩阵?最简单的方式就是自身点乘也就是xx^T^,其可以表征在本空间内的相似度。但通常原空间的相似度是不够的,为了使得模型有更强的表征能力,我们需要其在其他空间映射的相似度,这一点可以参考核函数的设计思想。这时一个最标准的做法就是xWx^T^(参考马氏距离)。如果对其进行拆解就是xW1(xW2)^T^,可以看到此时kq已经有所不同了。W1,W2如果保持相同,那么这个距离是对称自反的,也就是d(x1,x2)=d(x2,x1)。但是在attention中,这种对称自反其实是不必要的,想象一下“我是一个男孩”这句话,男孩对修饰我的重要性应该要高于我修饰男孩的重要性。

为什么Transformer有了Attention层还需要FFN层?

  • 因为self-attention只是做了一些线性变换,只有softmax引入了非线性,非线性能力不足;引入FFN可以为输入向量进行非线性变换,以帮助模型更好的捕获特征的非线性交互,增强模型的表达能力。
  • self-attention关注的是不同位置处元素间的信息依赖,而FFN对序列中的每个位置都应用相同的处理过程。因为每个位置的输入是不同的,所以FFN能够学习到每个位置的特征表示,可以让模型学习到序列中每个元素的局部特征,而self-attention关注于全局特征。
  • self-attention只是算出元素之间的相对关系,FFN负责将输入投影到更好的空间来拟合

Transformer为何采用多头注意力机制?

在超高维空间中做点积来获得向量之间的接近性,意义非常小,因为向量非常分散。分成多个head以后,每个head的embedding维数降低。比如,GPT-3是96头, 这样每个头只有128维。这样利用向量点积计算向量之间的接近性就有效多了。

多头注意力确保Transformer能并行捕获不同子空间的特征信息,可以让模型去关注不同维度语义空间的信息

Transformer为何让Q(查询)和K(键)使用独立的权重矩阵进行计算,而非共用同一矩阵?

分配不同权重给Q和K是为了实现信息在不同表示空间的映射,增强模型的表达力和泛化性能。不同的初始化权重帮助模型适应输入与输出长度变化,并且避免了Q与K相同导致的对称attention矩阵问题,这样的矩阵降低了模型的泛化能力。

Transformer在计算注意力时,为何选用点乘而非加法?两者在计算复杂度和效果上有何差异?

点乘运算的选择旨在平衡效率和效果。虽然矩阵加法更简单,但它作为隐藏层使用时,计算密集度与点乘相近。实验表明,随着特征维度(d_k)增加,加法的优势更明显,但通常点乘能更好地保持信息的相关性。

为何要在softmax前对attention分数进行缩放(即除以(d_k)的平方根)?

缩放是为了缓解softmax函数可能导致的梯度消失问题。当Q和K的分布满足一定条件时,缩放可以确保softmax输出更加平滑,保持梯度的有效流动,有助于训练稳定。

在处理padding时,如何对attention分数实施mask?

通过将padding位置的attention得分设为负无穷(常用-1000),有效排除这些位置对最终结果的影响。

Transformer的位置编码作用及局限性?

位置编码为模型引入了绝对位置信息,弥补了self-attention机制中缺失的位置感知。固定的位置编码使得模型理解序列中元素的相对次序。然而,其固定性质限制了模型对更复杂位置关系的表达,相对位置编码(RPE)是对此的一个改进方案。

Transformer为何偏好LayerNorm而非BatchNorm?

LayerNorm针对单个样本的所有特征进行标准化,保留了样本内部特征的相对比例,有利于attention机制捕捉全局依赖。相比之下,BatchNorm在序列任务中可能会破坏样本内的时间结构信息。

Transformer相比RNN的优势何在?

Transformer在并行处理能力上远超RNN,能够更高效地利用计算资源。同时,它在长期依赖捕捉和特征提取方面也显示出优越性能。

Encoder与Decoder如何协同工作?

Encoder的输出经过线性变换并与Decoder的状态进行交互,通过两次矩阵乘法操作,将Decoder的输入与Encoder的上下文信息融合,生成目标序列的预测。

Decoder与Encoder中的多头注意力有何差异?

Decoder包含两层多头注意力机制,额外的一层用于关注Encoder的输出,调整解码阶段的注意力以适应输出序列的构造。Decoder的Query、Key、Value尺寸在某些情况下可不同,而Encoder中的Q、K、V尺寸保持一致。

Transformer中最常出现的层是什么?

Dropout层,用于随机丢弃部分神经元以减少过拟合。

Transformer在何处实现了权重共享?

  • Encoder和Decoder的嵌入层权重共享。
  • Decoder中的嵌入层与全连接层权重共享。

Transformer中的mask机制如何运作?

包含Padding Mask,用于忽略填充的token;以及Sequence Mask,在Decoder中应用,确保预测时不泄露未来信息。

如何理解Self-Attention?

Self-Attention是一种自我参照的注意力机制,其中Query、Key和Value来自同一序列,旨在发现序列内部元素之间的相互依赖关系。

Transformer架构中哪个部分最耗时?

前馈神经网络(Feedforward Networks)部分,因其参数量大,计算成本较高。

残差连接(Residual Connections)的作用?

残差连接通过允许信息直接跳过某些复杂的转换层,有效缓解了深度网络中的梯度消失问题,促进了更深网络的有效训练。

说一下 Encoder-only、Encoder-Decoder、Decoder-only 的区别?

在深度学习和自然语言处理(NLP)领域中,Encoder-Only、Decoder-Only以及Encoder-Decoder架构是三种不同类型的神经网络结构,它们各自设计用于不同的任务:

  1. Encoder-Only架构:
    • 定义与特点:这类模型仅包含编码器部分,主要用于从输入数据提取特征或表示。例如,在BERT (Bidirectional Encoder Representations from Transformers) 中,它是一个双向Transformer编码器,被训练来理解文本上下文信息,并输出一个固定长度的向量表示,该表示包含了原始输入序列的丰富语义信息。
    • 用途:主要用于预训练模型,如BERT、RoBERTa等,常用于各种下游任务的特征提取,比如分类、问答、命名实体识别等,但不直接用于生成新的序列。
  2. Decoder-Only架构:
    • 定义与特点:解码器仅架构专注于从某种内部状态或先前生成的内容生成新的序列,通常用于自回归式预测任务,其中每个时刻的输出都依赖于前面生成的所有内容。
    • 优点:强大的序列生成能力,能够按顺序逐个生成连续的元素(如单词、字符),适用于诸如文本生成、自动摘要、对话系统等生成性任务。典型的Decoder-Only模型包括GPT系列(如GPT-3)。
  3. Encoder-Decoder架构:
    • 定义与特点:这种架构由两个主要部分组成:编码器和解码器。编码器负责将输入序列转换为压缩的中间表示,解码器则基于这个中间表示生成目标输出序列。这种结构非常适合翻译、摘要生成、图像描述等任务,需要理解和重构输入信息后生成新序列的任务。
    • 工作原理:编码器对源序列进行处理并生成上下文向量,解码器根据此上下文向量逐步生成目标序列。例如,经典的Seq2Seq(Sequence-to-Sequence)模型和Transformer中的机器翻译模型就采用了这样的结构。

总结起来:

  • Encoder-Only用于理解输入并生成其抽象表示,不涉及序列生成。
  • Decoder-Only专门用于根据之前的信息自动生成新序列,不接收外部输入。
  • Encoder-Decoder结合了两者的功能,首先对输入进行编码,然后基于编码结果解码生成新序列。

为什么现在的LLM都是decoder-only架构

  1. 双向注意力可能存在的低秩问题。双向注意力带来的低秩问题会导致效果下降。
  2. 在同等参数量、同等推理成本下,Decoder-only架构很比另外两种框架具有更优的效果。
  3. Decoder-only的zero-shot能力更强;

BERT训练时使用的学习率 warm-up 策略是怎样的?为什么要这么做?

warmup 需要在训练最初使用较小的学习率来启动,并很快切换到大学习率而后进行常见的 decay。

这是因为,刚开始模型对数据的“分布”理解为零,或者是说“均匀分布”(当然这取决于你的初始化);在第一轮训练的时候,每个数据点对模型来说都是新的,模型会很快地进行数据分布修正,如果这时候学习率就很大,极有可能导致开始的时候就对该数据“过拟合”,后面要通过多轮训练才能拉回来,浪费时间。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据点看过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就可以看做是warmup。那么为什么之后还要decay呢?当模型训到一定阶段后(比如十个epoch),模型的分布就已经比较固定了,或者说能学到的新东西就比较少了。如果还沿用较大的学习率,就会破坏这种稳定性,用我们通常的话说,就是已经接近loss的local optimal了,为了靠近这个point,我们就要慢慢来。

为什么BERT比ELMo效果好?ELMo和BERT的区别是什么?

因为LSTM抽取特征的能力远弱于Transformer,即使是拼接双向特征,其融合能力也偏弱;BERT的训练数据以及模型参数均多于ELMo。

ELMO给下游提供的是每个单词的embedding,所以这一类预训练的方法被称为“Feature-based Pre-Training”。而BERT模型是“基于Fine-tuning的模式”,这种做法的下游任务需要将模型改造成BERT模型,才可利用BERT模型预训练好的参数。

Pre Norm和Post Norm的区别

PreNorm:

$x_{t+1} = x_t+F(norm(x_t)) = x_{t-1} + F(norm(x_t)) + F(norm(x_{t - 1}))$

$= x_0 +F(norm(x_t)) + F(norm(x_{t-1})) + … +F(norm(x_0))$

PostNorm:

$x_{t+1} = norm(x_t + F(x_t))$

post-norm在残差之后做归一化,对参数正则化的效果更强,进而模型的鲁棒性也会更好

pre-norm相对于post-norm,因为有一部分参数直接加在了后面,不需要对这部分参数进行正则化,正好可以防止模型的梯度爆炸或者梯度消失,训练更稳定

Post-norm: 训练不稳定,但若成功收敛,性能比pre-norm好

Pre-norm:训练更稳定,但理论层数不如Post-norm

层数少选post-norm,层数多选pre-norm

self-attention为什么要除根号下d_k

$attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d}}V)$

  • 防止QK^T^的值过大,若QK的值过大,那么经过softmax后容易导致梯度消失。
  • 使得QK^T^的结果满足期望为0,方差为1的分布,类似于归一化
1 2

self-attn的计算复杂度

计算复杂度为O(n^2 * d) n是序列长度,d是每个token的维度

Q * K^T^ = [n, d] * [d, n] = [n, n] (复杂度为O(n^2^ * d))

(Q * K^T^) * V = [n, n] * [n, d] = [n, d] (复杂度为 O(n^2^ * d))

5.激活函数

为什么使用激活函数

因为神经网络中每一层都是线性求和的过程,如果没有激活函数,那么神经网络只能拟合线性映射,无法解决更复杂的问题。加入了激活函数,就给神经网络引入了非线性元素,从而使得神经网络能够拟合任何非线性映射,从而解决更复杂的问题。

Sigmoid激活函数

f(x) = sigmoid(x) = 1/(1 + e^-x^)

3
  • 输出值在(0, 1)之间,相当于对每个输出进行了归一化
  • 可以用于预测概率作为输出的模型
  • 函数是可微的

缺点:

  • 梯度消失:当Sigmod的输入(神经元的输出)较大或较小,梯度接近于0,导致该神经元无法得到更新
  • 计算成本高
  • 输出不以0为中心,输出恒大于0。非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。

Tanh 激活函数

x

f(x) = tanh(x) = (e^x^ - e^-x^) / (e^x^ + e^-x^) = 2 / (1 + e^-2x^) - 1 = 2 * sigmoid(2x) - 1

  • 输出值在(-1,1)之间,输出以0为中心

缺点:

  • 梯度消失,当输入较大或较小时,梯度解决于0,导致神经元无法得到更新
  • 计算成本高

Softmax激活函数

Softmax 是用于多类分类问题的激活函数。

Softmax(x) = xi / (x0 + … + xn)

缺点:

  • 在零点不可导
  • 负输入的梯度为0,因此会产生永不激活的死亡神经元。

Relu 激活函数

5

f(x) = relu(x) = max(0, x)

  • Rleu是较为流行的激活函数
  • 当输入为正时,梯度为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度
  • 计算成本低
  • 符合生物学,具有单侧抑制、宽兴奋边界(兴奋程度非常高)

缺点:

  • 当输入为负时,梯度为0。若参数有一次不恰当的更新,那么第一个隐藏层中的某个ReLU 神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活。

Leaky Relu 激活函数

leaky_relu(x) = $$ f(x)=\left{ \begin{aligned} &x, & if(x > 0) \ &kx, &if(x <= 0) \end{aligned} \right. $$ = max(x, kx)

其中k是一个很小的数,例如0.1或0.01等

  • 扩大了Relu值的范围,负无穷到正无穷

  • 解决了Relu导致参数无法更新的问题,当输入为负数时,梯度为k

尽管Leaky ReLU具备 ReLU 激活函数的所有特征(如计算高效、快速收敛、在正区域内不会饱和),但并不能完全证明在实际操作中Leaky ReLU 总是比 ReLU 更好。

PRelu激活函数

6

PRelu和Leaky Relu类似,但是当x < 0 时的导数k是可学习的(初始值为0.25)

ELU激活函数

$$ f(x)=\left{ \begin{aligned} &x, & if(x > 0) \ & \alpha(e^x - 1), &if(x <= 0) \end{aligned} \right. $$

$\alpha$是超参数,默认为1

缺点:计算量大,原点不可导

GLU激活函数

![7](NLP八股文.assets/截屏2024-05-24 00.53.47.png)

GLU其实是一个神经网络,其中 𝜎 为sigmoid函数,⊗ 为逐元素乘

Gelu激活函数

v2-0d644ecd419bbdfdae9be5a8c076b9f7_1440w

ReLU的平滑版本。

Gelu(x) = x * norm.cdf(x)

Swish激活函数

Relu的平滑版本

Swish(x) = x * (1 / (1 + exp(-$\beta $ x)))

SwiGLU激活函数

![8](NLP八股文.assets/截屏2024-05-24 00.54.05.png)

SwiGLU就是使用Swish作为激活函数的GLU变体

6.损失函数

损失函数就是用来度量模型的预测值f(x)与真实值Y的差异程度的运算函数,它是一个非负实值函数。

损失函数使用主要是在模型的训练阶段,每个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值和真实值之间的差异值,也就是损失值。得到损失值之后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值方向靠拢,从而达到学习的目的。

MSE损失函数

MSE(y|f(x)) = $\frac{1}{n}$ $\sum_{i=1}^n$ (yi - f(xi))^2^

在回归问题中,均方误差损失函数用于度量样本点到回归曲线的距离,通过最小化平方损失使样本点可以更好地拟合回归曲线。

L2损失函数

L2(y|f(x)) = $\sqrt{\frac{1}{n} \sum_{i=1}^n (y_i - f(x_i))^2}$

L1损失函数

L1(y|f(x)) = $\sum_{i=1}^{n} |y_i - f(x_i)|$

交叉熵损失函数

L(y|f(x)) = $-\sum_{i=1}^{n} y_ilog(f(x_i))|$

用于评估当前训练得到的概率分布与真实分布的差异情况

交叉熵损失函数刻画了实际输出概率与期望输出概率之间的相似度,也就是交叉熵的值越小,两个概率分布就越接近

KL散度

KL(y|f(x)) = $\sum_{i=1}^{n} y_ilog(\frac{y_i}{f(x_i)})|$

KL(P||Q) = $\sum{p(x)\frac{p(x)}{q(x)}}$

KL散度也被称为相对熵,是一种非对称度量方法,常用于度量两个概率分布之间的距离。

KL散度也可以衡量两个随机分布之间的距离,两个随机分布的相似度越高的,它们的KL散度越小,当两个随机分布的差别增大时,它们的KL散度也会增大

KL散度是恒大于等于0的。当且仅当两分布相同时,相对熵等于0。

JS散度

用于衡量两个概率分布之间的相似度,它是基于KL散度的一种变形,消除了KL散度非对称的问题,与KL散度相比,它使得相似度判别更加准确。

M = (P + Q) / 2

JS(P||Q) = 1/2 KL(P||M) + 1/2 KL(Q||M)

当两个分布完全不重合时,JS散度是一个常数(log2),梯度为0

7.优化器

SGD

Adam

AdamW

8.正则化

BatchNorm和LayerNorm的区别

Norm的目的是为了将数据拉回标准正态分布,让训练更稳定。

BatchNorm是拿一个Batch的每一维特征进行归一化,LayerNorm是拿每个样本的所有特征进行归一化。

BN抹杀了不同特征之间的大小关系(将Batch内每一维特征进行归一化),保留了不同样本间的大小关系

LN抹杀了不同样本之间的大小关系(将每个样本的所有特征进行归一化),保留了不同特征间的大小关系。

因为每个序列的长度通常不一样(虽然有padding,但无意义),所以无法做batchnorm。

BatchNorm和LayerNorm的计算公式

BatchNorm和LayerNorm的计算公式相同,只不过是计算均值和方差的方式不同。

  • LayerNorm计算一个样本中不同特征之间的均值和方差
  • BatchNorm计算所有样本的一个特征之间的均值和方差

$LayerNorm(x) = \gamma \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} + \beta$

  • x 是输入的特征向量或张量。
  • 𝜇 是沿着指定维度(通常是特征维度)计算的输入数据的均值。
  • 𝜎^2^ 是相同维度上的标准差的平方。
  • 𝛾 和 β 是可学习的参数,分别代表缩放因子和偏移量,用于调整归一化后的数据分布。
  • ϵ 是一个很小的常数(例如 10−5),用于防止分母为零的情况,确保数值稳定性。

RMSNorm公式

$RMSNorm(x) = \frac{x}{RMS} = \frac{x}{\sqrt{mean(x^2)}}$

RMSNorm比LayerNorm好在哪里?

简单来说就是,虽然二者的时间复杂度一致,但是RMSNorm比起LayerNorm确实减少了减去均值以及加上bias的计算,这在目前大模型预训练的计算量下就能够体现出训练速度上的优势了,并且RMSNorm在模型效果上的表现并不弱于LayerNorm(LN取得成功的原因可能是缩放不变性,而不是平移不变性),所以选择RMSNorm就很自然了, 要注意RMSNorm也是LayerNorm的一种,以上提到的LayerNorm指的是最常见的形式

L2范数

L2 = $\sqrt{\frac{1}{n} \sum_{i=1}^n f(x_i)^2}$

L1范数

L1 = $\sum_{i=1}^{n} |f(x)_i|$

9.位置编码

绝对位置编码

绝对位置编码主要方式有两种:

  • 从训练数据中学习
    • 位置向量是在训练中学习的,为每个位置学习一个位置向量,因为训练中的数据通常是512或者固定大小的,所以导致更大的位置向量没有得到学习,从而使得模型的最大长度受到限制。
  • 正弦/余弦函数
    • 使用正弦/余弦函数为每个位置构建唯一的嵌入。

绝对位置编码的局限性:

  • 有限的序列长度
  • 位置嵌入的独立性
    • 每个位置嵌入都是独立于其他位置嵌入的。这意味着在模型看来,位置 1 和 2 之间的差异与位置 2 和 500 之间的差异相同。

相对位置编码

相对位置编码不是关注token在句子中的绝对位置,而是关注tokens之间的距离。该方法不会直接向词向量添加位置向量。而是改变了注意力机制以纳入相对位置信息。

  • 位置偏移的偏差: T5 使用偏差(浮点数)来表示每个可能的位置偏移。例如,偏差 B1 可能表示任意两个相距一个位置的标记之间的相对距离,无论它们在句子中的绝对位置如何。
  • **自注意力层中的集成:**该相对位置偏差矩阵被添加到自注意力层中的query矩阵和key矩阵的乘积中。这确保了相同相对距离的标记始终由相同的偏差表示,无论它们在序列中的位置如何。
  • **可扩展性:**该方法的一个显着优点是其可扩展性。它可以扩展到任意长的序列,这比绝对位置嵌入有明显的优势。

相对位置编码的局限性:

  • 计算效率低下:必须创建成对的位置编码矩阵,然后执行大量张量操作以获得每个时间步的相对位置编码。特别是对于较长的序列。这主要是由于自注意力层中的额外计算步骤,其中位置矩阵被添加到查询键矩阵中。
  • kv cache使用的复杂性:使用 KV 缓存的一项要求是已经生成的单词的位置编码, 在生成新单词时不改变(绝对位置编码提供)因此相对位置编码不适合推理,因为每个标记的嵌入会随着每个新时间步的变化而变化。

ROPE

RoPE代表了一种编码位置信息的新方法。传统方法中无论是绝对方法还是相对方法,都有其局限性。绝对位置编码为每个位置分配一个唯一的向量,虽然简单但不能很好地扩展并且无法有效捕获相对位置;相对位置编码关注标记之间的距离,增强模型对标记关系的理解,但使模型架构复杂化。

RoPE巧妙地结合了两者的优点。允许模型理解token的绝对位置及其相对距离的方式对位置信息进行编码。这是通过旋转机制实现的,其中序列中的每个位置都由嵌入空间中的旋转表示。RoPE 的优雅之处在于其简单性和高效性,这使得模型能够更好地掌握语言语法和语义的细微差别。

RoPE只用于self-attention中的query和key向量。

RoPE 引入了一个新颖的概念。它不是添加位置向量,而是对词向量应用旋转。旋转角度 (θ) 与单词在句子中的位置成正比。第一个位置的向量旋转 θ,第二个位置的向量旋转 2θ,依此类推。这种方法有几个好处:

  • **向量的稳定性:**在句子末尾添加标记不会影响开头单词的向量,有利于高效缓存。(和普通的kv cache一样)

  • **相对位置的保留:**如果两个单词在不同的上下文中保持相同的相对距离,则它们的向量将旋转相同的量。这确保了角度以及这些向量之间的点积保持恒定

使用 RoPE 对 RoBERTa 和 Performer 等模型进行的实验表明,与正弦嵌入相比,它的训练时间更快。并且该方法在各种架构和训练设置中都很稳健。

最主要的是RoPE是可以外推的,也就是说可以直接处理任意长的问题。在最早的llamacpp项目中就有人通过线性插值RoPE扩张,在推理的时候直接通过线性插值将LLAMA的context由2k拓展到4k,并且性能没有下降,所以这也可以证明RoPE的有效性。

Alibi(Attention with Linear Biases)

ALiBi位置编码是一种在自注意力模型中使用的位置编码方法。它的目标是在自注意力机制中引入位置信息,使模型能够理解单词之间的相对位置。具体来说,ALiBi通过向自注意力机制的每个输入添加一个线性偏置项来实现这一目标。这个线性偏置项是基于输入的位置计算的,因此可以反映出输入之间的相对位置信息。

与RoPE直接作用于query和key向量不同,Alibi主要是通过在attention分数的计算中添加一个与位置相关的偏差项来实现的。这意味着它影响的是attention scores的计算过程,而不是直接修改query或key向量本身。Alibi的这种偏差项设计允许模型理解不同位置之间的相对关系,且由于其特定的线性形式,它能够支持理论上无限的序列长度,同时保持固定的计算复杂度。

Alibi的实现方式:

  • 为每个输入位置i和每个输出位置j,计算一个线性偏置b_ij = i - j。这个偏置反映了输入和输出之间的相对位置。
  • 将这个偏置添加到自注意力机制的输入上。具体来说,如果自注意力机制的输入是一个矩阵X,那么新的输入就是X + b*m。
  • 使用这个新的输入执行自注意力计算。这样,模型就能够理解输入之间的相对位置。

若LLM有n个head,那么第i个head的取值就是$2^{\frac{-8}{n}i}$.

image-20240526221857561

使用Alibi的LLM:BLOOM、MPT

10.PEFT:参数高效微调

Adapter tuning

  • 基于特征的微调是得到模型的输出后进入特定任务的网络层。
  • 全量微调是为每个任务调整所有参数。
  • adapter微调是在网络的一些层中加入adapter,然后为每个任务仅微调adapter的参数。

adapter微调是将adapter注入到原始网络,原始网络的权重不变,而adapter的参数随机初始化。面对一个新任务时,固定原始网络的参数,只需要为每个任务微调adapter的参数。

如果初始化时,adapter导致输入和输出相差太多时,可能导致模型无法训练。所以应该把adapter初始化解决恒等函数。(因为adapter使用的残差连接,所以初始化将adapter的参数设置为接近0)

只需要微调adapter的参数(3.6%),就能达到和全量微调相似的效果。

截屏2024-05-25 11.49.42

adapter应用于Transformer Block的attention和FFN层后面(后来有人改进只在FFN层和LayerNorm后面加Adapter模块)

adapter的结构是:现将输入(维度d)映射到低维(m),然后进行非线性变化,再映射到原始维度(d),所以一个adapter的参数是 (md + d) + (md + m) = 2md + m + d。adapter输入和输出也使用残差连接。

Prefix-tuning

在prompt前面添加一些virtual tokens,在微调期间,只训练前缀的参数(embedding)而固定LLM的参数,从而能够在只微调0.1%的参数就能获得比较好的性能。

在Transfromer的每一层中,prefix的hidden矩阵就是virtual tokens的词向量矩阵(微调的参数为每一层的prefix tokens的hidden矩阵)

训练时,若只微调prefix tokens的hidden矩阵的可能导致训练不稳定并且性能下降,所以在prefix hidden矩阵后面再加个MLP,一旦训练完成,可以将MLP去掉,只保留训练好的prefix tokens embedding作为prefix的hidden矩阵。

prefix使用真实单词的词向量来初始化优于使用随机向量。使用任务相关的词向量由于任务无关的词向量。

若prefix token超过一定数量后,性能会显著下降,可能是拥有更多特殊token会导致输入分布进一步远离预训练数据分布。

优点:

  • 在低数据设置下,表现较好

  • 可以为利用每个用户的数据为每个用户训练prefix,从而避免数据污染。

  • Prefix-tuning可以在一个batch中处理不同的任务(只需要在不同的任务数据前加特定于该任务的前缀即可)

缺点:

  • 占用可用的序列长度。

P-tuning v2

LORA

LORA:冻结预训练模型的权重,将可训练的秩分解矩阵注入到Transformer的每一层。

因为在微调期间预训练好了秩分解矩阵,所以在推理时就可以将它的权重与预训练模型的权重相加,从而降低推理的延迟。

截屏2024-05-25 15.44.45

$h = W_0x + \Delta{W}x = W_0x + BAx$ ,其中A是随机高斯初始化,B初始化为0

将Lora只应用在注意力层来减少训练参数,甚至可以只用在query和value权重矩阵上来减少训练参数。

给定训练参数预算,将Lora应用到那些层最有利于模型的性能?

训练参数有限时,只用在注意力层(Q,K,V,O),参数更有限,只用在query和value

在训练参数有限时,在更多的权重矩阵上使用Lora比提高Lora的秩r更有效。

将Lora的秩r设置为多少是最优的?

Lora的秩非常小的情况下就很有竞争力了。r设置为{1,2,4,8}就足够了。

$W$和$\Delta{W}$的联系有多大?

$W$和$\Delta{W}$具有强相关性。低秩适应矩阵可能会放大特定下游任务的重要特征,这些特征是在一般预训练模型中学习但未强调的。

Lora和Adapter tuning的区别:

  • Lora可以将微调后学习的权重加到原始模型权重上,从而不会带来推理延迟。

  • Lora模块中有两个FFN(没有bias)而Adapter tuning模块中的两个FFN有bias

11.对比学习

目的:通过对比学习来训练一个编码器,此编码器对同类数据进行相似的编码,并使不同类的数据的编码结果尽可能的不同

在一个Batch内有N个样本,其中对每一个样本x进行数据增强,得到x1和x2, 进行两两配对会得到一个矩阵,其中只有对角线为正样本(同一个样本进行数据增强得到),其他都是负样本(不同样本进行数据增强得到)。此时训练一个编码器,让正样本的编码结果近可能相近,负样本的编码结果尽可能相远。

$l_{i,j} = -log \frac{exp(sim(z_i, z_j) / t)}{\sum_{k=1}^{2N} exp(sum(z_i,z_k)/ t)}$ 其中分母中k!=i

12.机器翻译

解码策略

**standard greedy search:**挑选概率最高的词去输出

**beam search:**每次挑选概率最高的k个词,最后选择最终概率最大的一条链

**sampling:**按照概率分布进行采样,让生成的文本更多样化

**sampling with temperature:**这种方法可以对当前的概率分布进行缩放,例如让概率大的更大、让小的变的更小,或者让大概率和小概率之间差别没那么明显等。

  • 当𝑇变大时,模型在生成文本时更倾向于比较少见的词汇。𝑇越大,重新缩放后的分布就越接近均匀采样。
  • 当𝑇变小时,模型在生成文本时更倾向于常见的词。𝑇越大,重新缩放后的分布就越接近我们最开始提到的贪婪生成方法(即总是去选择概率最高的那个词)。

**top-k sampling:**只从前概率前top k的词中进行采样

**top-p sampling:**只从概率大于p的词中进行采样

**Speculative Decoding(投机采样):**使用和目标模型结构相似的小模型进行自回归解码,解码n个然后和 输入拼接后输入大模型获取logits以及概率,若大模型在该位置生成该token的概率大于小模型,那么就可以采用小模型解码的结果。

美杜莎: 在decoder后面添加额外的分类头lm_head,将lm_head变为k个,从而预测接下来k个token。

  • 若使用贪婪解码的话,next next token的准确率徘徊在60%。但如果每个head选取top-5 token做笛卡尔积,从中找到和原始模型解码相同的候选概率飙升到80%以上。

手撕BeamSearch算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import torch
import torch.nn.functional as F

def beam_search(LM_prob,beam_size = 3):
batch,seqlen,vocab_size = LM_prob.shape
#对LM_prob取对数
log_LM_prob = LM_prob.log()
#先选择第0个位置的最大beam_size个token,log_emb_prob与indices的shape为(batch,beam)
log_beam_prob, indices = log_LM_prob[:,0,:].topk(beam_size,sorted = True)
indices = indices.unsqueeze(-1)
#对每个长度进行beam search
for i in range(1,seqlen):
#log_beam_prob (batch,beam,vocab_size),每个beam的可能产生的概率
log_beam_prob = log_beam_prob.unsqueeze(-1) + log_LM_prob[:,i,:].unsqueeze(1).repeat(1,beam_size,1)
#选择当前步概率最高的token
log_beam_prob, index = log_beam_prob.view(batch,-1).topk(beam_size,sorted = True)
#下面的计算:beam_id选出新beam来源于之前的哪个beam;index代表真实的token id
#beam_id,index (batch,beam)
beam_id = index//vocab_size
index = index%vocab_size
mid = torch.Tensor([])
#对batch内每个样本循环,选出beam的同时拼接上新生成的token id
for j,bid,idx in zip(range(batch),beam_id,index):
x = torch.cat([indices[j][bid],idx.unsqueeze(-1)],-1)
mid = torch.cat([mid,x.unsqueeze(0)],0)
indices = mid
return indices,log_beam_prob

if __name__=='__main__':
# 建立一个语言模型 LM_prob (batch,seqlen,vocab_size)
LM_prob = F.softmax(torch.randn([32,20,1000]),dim = -1)
#最终返回每个候选,以及每个候选的log_prob,shape为(batch,beam_size,seqlen)
indices,log_prob = beam_search(LM_prob,beam_size = 3)
print(indices)

13.LLM

BLOOM

  • 使用Alibi位置编码
  • 使用GLU激活函数
  • 在embedding,以避免训练不稳定。
  • 使用了25万个标记的词汇表。 使用字节级BPE。 这样tokenizer永远不会产生unk token

LLaMA1

  • 训练预料:大于1T
  • 支持的长度:2048
  • 采用前置的RMSNorm作为层归一化方法
  • 使用RoPE位置编码
  • 使用SwiGLU激活函数
  • 开源了7B、13B、33B、65B

LLaMA2

  • 训练的预料:2T

  • 支持的长度:4096

  • 70B的版本采用了分组查询注意力 (GQA)机制,以提高Inference速度

  • 采用前置的RMSNorm作为层归一化方法。

  • 使用RoPE位置编码

  • 使用SwiGLU激活函数

  • 开源了7B、13B和70B

LLaMA3

  • 训练的预料:超过15T

  • 支持的长度:8192

  • 采用了分组查询注意力 (GQA)机制,以提高Inference速度

  • 采用了一个编码效率更高的tokenizer,词表大小为128K

  • 采用前置的RMSNorm作为层归一化方法。

  • 使用RoPE位置编码

  • 使用SwiGLU激活函数

  • 开源了8B和70B

ChatGLM

ChatGLM特点

1.自编码思想:在输入文本中,随机删除连续的tokens。

2.自回归思想:顺序重建连续tokens。在使用自回归方式预测缺失tokens时,模型既可以访问corrupted文本,又可以访问之前已经被预测的spans。

3.span shuffling + 二维位置编码技术。

模型架构

  • span shuffling + 二维位置编码技术。
  • 重组了LN和残差连接的顺序
  • 激活函数从ReLU换成了GeLUS

ChatGLM2

  • span shuffling + 二维位置编码技术。
  • 重组了LN和残差连接的顺序
  • 激活函数从ReLU换成了GeLUS
模型升级之路 训练Token数 序列长度 算子改进 核心点
ChatGLM->ChatGLM2 1T->1.4T 2K->8K/32K FlashAttention & Multi Query Attention Prefix-LM->Decoder-Only
LLAMA->LLAMA2 1.4T->2T 2K->4K - 更高质量的SFT&RLHF
baichuan->baichuan 13b 1.2T->1.4T 4K(RoPE)->4K(ALiBi) FlashAttention 参数量升级
baichuan->baichuan2 1.2T->2.6T 4K - Tokenizer/NormHead/Max-z Loss

ChatGLM3

与ChatGLM2模型架构相同。

Baichuan

Qwen

FlashAttention

通常的Attention关注与降低每秒执行的浮点数(Flops),并且倾向于忽略来自内存访问(IO)的开销。

FlashAttention的主要目的是加速和节约显存,主要贡献点:

  • 计算softmax时不需要全量input数据,可以分段计算
  • 反向传播时,不存储Attention矩阵,而只存储softmax归一化的系数。

介绍一下 fp32和fp16的区别,混合精度的原理?

FP32(单精度浮点数)与FP16(半精度浮点数)的区别:

  • 存储大小:
    • FP32(Single-Precision Floating-Point Format)每个数值占用32位(4个字节),包括1位符号位、8位指数位和23位尾数(小数部分)。
    • FP16(Half-Precision Floating-Point Format)则每个数值仅占用16位(2个字节),结构包含1位符号位、5位指数位和10位尾数。
  • 数值范围与精度:
    • FP32能表示大约从( 10^{-38} )到( 10^{+38} )范围内的数值,具有相对较高的精度,适合于对精度要求高的计算任务。
    • 相比之下,FP16的数值范围较小,大约在( 6.10^{-5} )至( 65504 )之间,并且由于尾数位较少,其精度较低,容易出现下溢或上溢问题。**混合精度训练原理:**混合精度训练是一种结合了FP32和FP16的优点以加速深度学习模型训练过程的技术。在深度学习中,尤其是使用GPU进行大规模并行计算时,内存带宽和显存容量往往是性能瓶颈。
  • 优势利用:
    • 利用FP16进行矩阵乘法等操作可以显著减少内存消耗和数据传输量,从而提高计算速度和设备利用率。
    • 而FP32则用于累积中间结果,避免因为FP16精度不足导致的梯度消失或者爆炸问题。
  • 混合策略:
    • 在混合精度训练中,通常会在网络层的前向传播和反向传播过程中将权重和激活函数保持在FP16格式,但在累加梯度时会先将它们扩大一定的倍数(损失放缩技术),然后在更新权重之前再缩小回去,这样既能利用FP16的优势,又能维持足够的精度进行有效的参数更新。
  • 工具支持:许多深度学习框架如PyTorch、TensorFlow和NVIDIA的apex库都提供了混合精度训练的支持,使得开发者能够在不牺牲模型收敛性的情况下大幅加快训练速度和降低硬件资源需求。

介绍一下 flash attention?

  • 核心思想:传统减少HBM的访问,将QKV切分为小块后放入SRAM中
  • 核心方法:
    • tiling(平铺): 分块计算。在计算时通过分块将Q,K,V分块后,按块加载到内存中。
    • recomputation(重新计算):传统Attention在计算中需要用到Q,K,V去计算S,P两个矩阵,FlashAttention引入softmax中的统计量( , ℓ),结合output O和在SRAM中的Q,K,V块进行计算。

介绍一下 flash attention-2 ?

FlashAttention-2版本进一步优化了FlashAttention算法,使用了更好的并行化和工作分区方法,使得计算速度提高了2倍。FlashAttention-2还支持更高的头维数和多查询注意力等新特性,进一步提升了性能和灵活性。

LLM 训练 & 推理常见面试题

Continue Pretraining和SFT

Continue Pretraining是在领域数据上进行预训练,使用的是没有标签的数据,数据格式和预训练的一样。Continue Pretraining的目的是让LLM更好地处理和理解领域数据

SFT是使用特定任务的数据集,有标签。SFT的目的是优化LLM在特定任务上的表现。

如何解决继续预训练和微调阶段的灾难性遗忘问题

目前不少开源模型在通用领域具有不错的效果,但由于缺乏领域数据,往往在一些垂直领域中表现不理想,这时就需要增量预训练和微调等方法来提高模型的领域能力。

但在领域数据增量预训练或微调时,很容易出现灾难性遗忘现象,也就是学会了垂直领域知识,但忘记了通用领域知识。

解决方法:

  • 调整继续预训练时的数据配比,增加通用数据的比例,增加数据量
  • 使用adapter微调,对于每个任务微调一个adapter
  • 使用正则化的办法可以降低对预训练特征的破坏

LLM训练、推理如何省显存

  • 使用fp16,bf16等低精度来进行训练

  • 混合精度训练

  • 梯度检查点:删除中间变量,需要的时候再重新计算

  • ZERO系列优化,参数/梯度/优化器状态等分片存储,存到内存中,即用即取

  • 减小batch size,使用梯度累积

  • 量化、剪枝、蒸馏、参数共享等

如何缓解大模型幻觉问题

  • 高级提示词,带有详细说明的复杂提示词能够缓解幻觉问题
  • RAG,检索外部知识库
  • 验证链:
    • 生成基线响应:给定一个查询,使用 LLM 生成响应。
    • 设计验证:给定查询和基线响应,生成验证问题列表,有助于自我分析原始响应中是否存在任何错误。
    • 执行验证:依次回答每个验证问题,然后将答案与原始响应进行检查,以检查是否存在不一致或错误。
    • 生成最终验证响应:鉴于发现的不一致(如果有),生成包含验证结果的修订响应。

长度外推

具有长度外推能力的位置编码,如RoPE

插值法

介绍一下 RAG?

检索增强 LLM ( Retrieval Augmented LLM ),简单来说,就是给 LLM 提供外部数据库,对于用户问题 ( Query ),通过一些信息检索 ( Information Retrieval, IR ) 的技术,先从外部数据库中检索出和用户问题相关的信息,然后让 LLM 结合这些相关信息来生成结果。

RAG 解决了哪些问题?

  1. 长尾知识: 对于一些相对通用和大众的知识,LLM 通常能生成比较准确的结果,而对于一些长尾知识,LLM 生成的回复通常并不可靠。
  2. 私有数据: ChatGPT 这类通用的 LLM 预训练阶段利用的大部分都是公开的数据,不包含私有数据,因此对于一些私有领域知识是欠缺的。
  3. 数据新鲜度: LLM 通过从预训练数据中学到的这部分信息就很容易过时。
  4. 来源验证和可解释性: 通常情况下,LLM 生成的输出不会给出其来源,比较难解释为什么会这么生成。而通过给 LLM 提供外部数据源,让其基于检索出的相关信息进行生成,就在生成的结果和信息来源之间建立了关联,因此生成的结果就可以追溯参考来源,可解释性和可控性就大大增强。

RAG 中包含哪些关键模块?

  • 数据和索引模块
  • 查询和检索模块
  • 响应生成模块

RAG vs SFT

RAG SFT
数据 动态数据,RAG不断查询外部源,确保信息保持最新,而无需频繁的微调模型 (相对)静态数据,并且在动态数据场景中可能很快就会过时。SFT也不能保证能够机制这些知识。
外部知识库 RAG擅长利用外部资源,通过在生成响应之前从知识源检索相关信息来增强LLM能力。它非常适合文档或其他结构化/非结构化数据库。 SFT可以对LLM进行微调以对齐预训练学到的外部知识,但对于频繁更改的数据源来说可能不太实用。
模型定制 RAG主要关注信息检索,擅长整合外部知识,但可能无法完全定制模型的行为或写作风格。 SFT允许根据特定的语气或术语调整LLM的行为、写作风格或特定领域的知识。
缓解幻觉 RAG本质上不太容易产生幻觉,因为每个回答都建立在检索到的知识上。 SFT可以通过将模型基于特定领域的训练数据来帮助减少幻觉。但当面对不太熟悉的输入,仍然会产生幻觉。
透明度 RAG系统通过将响应生成分解为不同的阶段来特供透明度,提供对数据检索的匹配度以提高对输出的信任。 SFT就像一个黑匣子,使得响应背后的推理更加不透明
相关技术 RAG需要高效的检索策略和大型数据库相关技术,另外还需要保存外部数据源集成以及数据更新 SFT需要准备和整理高质量的训练数据集、定义微调目标以及响应的计算资源。

BART、llama、gpt、t5、palm等主流模型异同点?

BART (bi Encoder+casual Decoder,类bert的方法预训练)

T5 (Encoder+Decoder,text2text预训练)

GPT(Decoder主打zero-shot)

GLM (mask的输入部分是双向注意力,在生成预测的是单向注意力)

大模型高校参数微调方式 p-tuning v2?

P-Tuning V2在P-Tuning V1的基础上进行了下述改进:

  • 在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这与Prefix Tuning的做法相同。这样得到了更多可学习的参数,且更深层结构中的Prompt能给模型预测带来更直接的影响。
  • 去掉了重参数化的编码器。在 P-tuning v2 中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
  • 针对不同任务采用不同的提示长度。提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,我们发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与Prefix-Tuning中的发现一致,不同的文本生成任务可能有不同的最佳提示长度。
  • 可选的多任务学习。先在多任务的Prompt上进行预训练,然后再适配下游任务。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。

chatgpt的reward model怎么来的,三阶段?

ChatGPT模型的训练过程中,确实涉及到了一个基于人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)的三阶段过程。以下是这个过程的一个概述:

  1. 预训练(Pre-training)阶段:
    • 在这个阶段,GPT模型通过无监督学习的方式在大规模文本数据集上进行训练。该模型的目标是预测下一个词语给定前面的词语序列,从而学习语言模型的基本结构和模式。
  2. 奖励模型训练(Reward Model Training)阶段:
    • 预训练后的模型会被用于生成大量针对各种提示的回答。
    • 这些生成的回答会由人工标注员进行评估,并给出好坏或满意度得分,形成一个带有质量评分的数据集。
    • 基于这些人工标注的数据,训练一个奖励模型(Reward Model),该模型可以预测对于任何给定的输入和输出对,人类用户可能给予多大的满意程度分数。
    • 通过这种方式,奖励模型能够理解并量化哪些类型的回答更符合人类期望的标准。
  3. 强化学习微调(Fine-tuning with Reinforcement Learning)阶段:
    • 使用训练好的奖励模型作为指导信号,将预训练模型与强化学习算法结合,对模型进行微调(fine-tuning)。
    • 模型现在以强化学习的方式进一步训练,目标是在生成响应时最大化来自奖励模型的预期奖励,也就是得到更高的满意度分数。
    • 通过迭代优化,ChatGPT模型逐渐学会根据上下文生成更加准确、有用且合乎伦理道德的回答。

最终,经过这三阶段训练流程,ChatGPT不仅具备了强大的语言生成能力,还能够更好地理解和适应人类对话的需求,提供更为高质量的人工智能交互体验。

注意力机制都有哪些?能不能简单介绍一下?

  • 自注意力机制(Self-Attention): 给定一个输入序列,自注意力机制通过对序列中每个元素计算权重,然后将这些权重加权求和得到输出。这个权重表示了模型对输入中不同位置的关注程度。具体来说,对于每个位置,通过计算与其他位置的相似度得到一个权重,最后将这些权重应用于输入序列上。这使得模型能够同时关注序列中的多个位置。

  • 多头注意力机制(Multi-Head Attention):

    • 思路:为了提高模型的表达能力,Transformer引入了多头注意力机制,允许模型学习多组不同的注意力权重。每个注意力头都产生一个输出,最后通过线性变换和拼接得到最终的多头注意力输出。

    缺点:MQA(multi query attention)会导致quality degradation,我们不希望仅仅是推理快,而且还希望quality可以对标MHA;

  • Group Query Attention(GQA)

    • 动机:改进多查询注意力(MQA)的性能,以加速解码器的推理速度。现有的MQA方法可能导致质量下降,并且为了更快的推理速度需要训练单独的模型,并不理想。
    • 方法:通过预训练模型进行上训练(uptraining),将现有的多头注意力(MHA)模型转换为使用MQA的模型,并引入分组查询注意力(GQA),多查询注意力和多头注意力的一种泛化方法。GQA使用中间数量的键值头(大于一个,小于查询头的数量),实现了性能和速度的平衡。
    • 优势:论文的主要优势是通过上训练(uptraining)现有模型,以较小的计算成本将多头注意力模型转换为多查询模型,从而实现快速的多查询和高质量的推理。同时,引入的分组查询注意力方法在接近多头注意力的质量的同时,速度几乎与多查询注意力相当。

Group Query Attention (GQA) 机制

GQA的定义

Grouped-Query Attention (GQA) 是对 Multi-Head Attention (MHA) 和 Multi-Query Attention (MQA) 的扩展。通过提供计算效率和模型表达能力之间的灵活权衡,实现了查询头的分组。GQA将查询头分成了G个组,每个组共享一个公共的键(K)和值(V)投影。

GQA的变体
  • GQA有三种变体:
    • GQA-1:一个单独的组,等同于 Multi-Query Attention (MQA)。
    • GQA-H:组数等于头数,基本上与 Multi-Head Attention (MHA) 相同。
    • GQA-G:一个中间配置,具有G个组,平衡了效率和表达能力。
GQA的优势

使用G个组可以减少存储每个头的键和值所需的内存开销,特别是在具有大的上下文窗口或批次大小的情况下。GQA提供了对模型质量和效率的细致控制。

GQA的实现
GQA的最简形式可以通过实现 GroupedQueryAttention 类来实现。GroupedQueryAttention 类继承自 Attention 类,重写了 forward 方法,其中使用了 MultiQueryAttention 类的实例来处理每个组的查询。通过将每个组的结果拼接起来,然后与投影矩阵进行矩阵乘法运算,最终得到 GQA 的输出。

介绍一下 rouge,bleu,他们两个之间有什么区别?

在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标:

  • BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评估机器翻译结果质量的指标。它主要侧重于衡量机器翻译输出与参考翻译之间的相似程度,着重于句子的准确性和精确匹配。BLEU通过计算N-gram(连续N个词)的匹配程度,来评估机器翻译的精确率(Precision)。
  • ROUGE(Recall-Oriented Understudy for Gisting Evaluation): ROUGE是一种用于评估文本摘要(或其他自然语言处理任务)质量的指标。与BLEU不同,ROUGE主要关注机器生成的摘要中是否捕捉到了参考摘要的信息,着重于涵盖参考摘要的内容和信息的完整性。ROUGE通过计算N-gram的共现情况,来评估机器生成的摘要的召回率(Recall)。
  • 区别:
    • BLEU侧重于衡量翻译的准确性和精确匹配程度,更偏向于Precision;
    • ROUGE侧重于衡量摘要的信息完整性和涵盖程度,更偏向于Recall。

这两个指标在不同的任务和应用场景中都有其重要性,因此在评估自然语言处理模型时,经常会同时使用它们来综合考虑模型的表现。

说一下 prefix LM 和 casualLM 的区别?

prefix LM 和 casualLM 所用的 attention mask 不一样:

  • prefix LM:token可以相互看到;
  • casualLM:严格自回归

instruction tuning 和prompt learning 的区别?

instruction tuning和prompt learning的目的都是去挖掘语言模型本身具备的知识。不同的是Prompt是激发语言模型的补全能力,例如根据上半句生成下半句,或是完形填空等(few-shot)。Instruct是激发语言模型的理解能力,它通过给出更明显的指令,让模型去做出正确的行动 (zero-shot)。

llama2中使用的注意力机制是什么?手写实现下分组注意力。

自回归解码的标准做法是缓存序列中先前标记的键(K)和值(V) 对,从而加快注意力计算速度。然而,随着上下文窗口或批量大小的增加,多头注意力 (MHA)模型中与 KV 缓存大小相关的内存成本显着增长

对于较大的模型,KV 缓存大小成为瓶颈,键和值投影可以在多个头之间共享,而不会大幅降低性能,可以使用

  • 具有单个 KV 投影的原始多查询格式(MQA),ChatGLM2-6B即用的这个。不过,多查询注意(Multi-query attention,简称MQA)只使用一个键值头,虽大大加快了解码器推断的速度,但MQA可能导致质量下降,而且仅仅为了更快的推理而训练一个单独的模型可能是不可取的
  • 具有多个 KV 投影的分组查询注意力(grouped-query attention,简称GQA),LLaMA2和Mistral均用的这个。这是一种多查询注意的泛化,它通过折中(多于一个且少于查询头的数量,比如4个)键值头的数量,使得经过强化训练的GQA以与MQA相当的速度达到接近多头注意力的质量,即速度快 质量高

分组查询注意力 (Grouped Query Attention) 是一种在大型语言模型中的多查询注意力 (MQA) 和多头注意力 (MHA) 之间进行插值的方法,它的目标是在保持 MQA 速度的同时实现 MHA 的质量。

![截屏2024-05-28 20.38.58](NLP八股文.assets/截屏2024-05-28 20.38.58.png)

了解langchain吗?讲讲其结构。

它通过三个核心组件实现增强:

  • 首先是 Compents“组件”,为LLMs提供接口封装、模板提示和信息检索索引;
  • 其次是 Chains“链”,它将不同的组件组合起来解决特定的任务,比如在大量文本中查找信息;
  • 最后是 Agents“代理”,它们使得LLMs能够与外部环境进行交互,例如通过API请求执行操作。

Langchain 的这种结构设计使LLMs不仅能够处理文本,还能够在更广泛的应用环境中进行操作和响应,大大扩展了它们的应用范围和有效性。

RLHF的具体工程是什么?包含了哪几个模型?


NLP八股文
http://example.com/2024/05/23/NLP八股文/
作者
Menglong
发布于
2024年5月23日
许可协议