各种metric
集成学习
Bagging
Boosting
训练的各种问题
Q: 样本不均衡怎么办
Q: 如何判断是否发生了过拟合
Q: 防止过拟合的措施
-
正则化:
L1正则化(Lasso):添加参数绝对值之和的惩罚项
L2正则化(Ridge):添加参数平方和的惩罚项
Elastic Net:结合L1和L2正则化 -
数据增强:
对训练数据进行变换,如旋转、缩放、翻转等,增加数据多样性 -
早停(Early Stopping):
在验证集性能开始下降时停止训练 -
降低模型复杂度:
减少网络层数或神经元数量
使用更简单的模型架构 -
Dropout:
在训练过程中随机"丢弃"一部分神经元,防止过度依赖特定特征 -
集成学习:
使用多个模型进行预测,如随机森林、梯度提升等 -
增加训练数据:
如果可能,收集更多的训练数据
Q:梯度为0怎么办
选择合适的激活函数:使用如ReLU、Leaky ReLU、ELU等激活函数,这些函数在某些情况下能够更好地保持梯度的稳定性,避免梯度消失。
残差连接(Residual Connections):通过引入残差连接,将网络的输入直接连接到输出层,使网络可以直接学习残差部分,从而有效地传递梯度,减少梯度消失问题。
Q:梯度爆炸怎么办
梯度截断(Gradient Clipping):在更新梯度时,设置一个阈值,当梯度超过这个阈值时,将其截断或缩放至该阈值。这样可以防止梯度过大导致的网络不稳定。
权重正则化(Weight Regularization):通过对网络权重施加正则化项,如L1或L2正则化,来限制权重的增长,从而避免梯度爆炸。
参数初始化策略:合理的参数初始化,如使用较小的标准差初始化权重,可以使网络的输出具有较大的方差,从而减少梯度的衰减。
批标准化(Batch Normalization):通过对每个小批量的数据进行标准化,使网络层之间的激活值保持适当的范围,有助于梯度的传播和更新。
使用合适的学习率: 较小的学习率, 学习率衰减策略
Q: loss不稳定
Q: loss不收敛
- 模型复杂度与数据不匹配:模型过于复杂或过于简单,都可能导致loss不收敛。模型过于复杂时,容易发生过拟合;模型过于简单时,则无法捕捉到数据的复杂特征。
- 学习率设置不当:与loss震荡类似,学习率设置不当也是loss不收敛的常见原因。
- 网络结构设计不合理:网络层数过多、激活函数选择不当、正则化过度等,都可能导致loss不收敛。
- 数据集问题:数据集本身存在问题(如标签错误、数据分布不均等),也可能导致loss不收敛。
Q: LLM的超参有哪些, 如何调优
LLM的主要超参数:
a) 模型架构相关:
层数(number of layers)
注意力头数(number of attention heads)
隐藏层维度(hidden dimension size)
前馈网络维度(feed-forward dimension)
b) 训练相关:
学习率(learning rate)
批量大小(batch size)
预热步数(warmup steps)
权重衰减(weight decay)
梯度裁剪阈值(gradient clipping threshold)
c) 序列处理相关:
最大序列长度(maximum sequence length)
词表大小(vocabulary size)
d) 正则化相关(LLama没用其实):
Dropout率
注意力dropout率
调优方法:
a) 网格搜索(Grid Search):系统地尝试预定义的参数组合。
b) 随机搜索(Random Search):随机采样参数组合,通常比网格搜索更高效。
c) 贝叶斯优化(Bayesian Optimization):使用概率模型来指导搜索过程。
d) 进化算法(Evolutionary Algorithms):模拟自然选择过程来优化参数。
e) 基于人类经验的启发式方法:利用领域知识来指导参数调整。
调优最佳实践:
a) 从小规模模型开始,逐步扩大规模。
b) 使用学习率调度器,如线性衰减或余弦衰减。
c) 采用渐进式学习,先在小数据集上训练,再在大数据集上微调。
d) 使用验证集监控性能,避免过拟合。
e) 考虑计算资源限制,在性能和效率之间权衡
AUC定义及好处(附代码)
方法1
A
U
C
=
∑
I
(
P
positive
,
P
negative
)
M
∗
N
AUC = \frac{\sum I(P_\text{positive}, P_\text{negative})}{M * N}
AUC=M∗N∑I(Ppositive,Pnegative)
I
(
P
positive
,
P
negative
)
=
{
1
,
if
P
positive
>
P
negative
0.5
,
if
P
positive
=
P
negative
0
,
if
P
positive
<
P
negative
I(P_\text{positive}, P_\text{negative}) = \begin{cases} 1, & \text{if } P_\text{positive} > P_\text{negative} \ 0.5, & \text{if } P_\text{positive} = P_\text{negative} \ 0, & \text{if } P_\text{positive} < P_\text{negative} \end{cases}
I(Ppositive,Pnegative)={1,if Ppositive>Pnegative 0.5,if Ppositive=Pnegative 0,if Ppositive<Pnegative
代码实现:
import numpy as np
y_true = [0, 0, 1, 1, 0, 1, 0, 1, 1, 1]
y_score = [0.1, 0.4, 0.6, 0.6, 0.7, 0.7, 0.8, 0.8, 0.9, 0.9]
def get_roc_auc(y_true, y_score):
gt_pred = list(zip(y_true, y_score))
probs = []
pos_samples = [x for x in gt_pred if x[0]==1]
neg_samples = [x for x in gt_pred if x[0]==0]
# 计算正样本大于负样本的概率
for pos in pos_samples:
for neg in neg_samples:
if pos[1]>neg[1]:
probs.append(1)
elif pos[1]==neg[1]:
probs.append(0.5)
else:
probs.append(0)
return np.mean(probs)
方法2
A
U
C
=
∑
i
∈
正样本
r
a
n
k
i
−
M
(
M
+
1
)
/
2
M
×
N
AUC = \frac{\sum_{i\in\text{正样本}} rank_i - M(M+1)/2}{M \times N}
AUC=M×N∑i∈正样本ranki−M(M+1)/2
Parameters
M
M
M: 正样本数
N
N
N, 负样本数
∑
i
∈
正样本
,
r
a
n
k
i
\sum_{i\in\text{正样本}}, rank_i
∑i∈正样本,ranki: 正样本的序号之和
def get_roc_auc(y_true, y_score):
ranks = enumerate(sorted(zip(y_true, y_score), key=lambda x:x[-1]), start=1)
pos_ranks = [x[0] for x in ranks if x[1][0]==1]
M = sum(y_true)
N = len(y_true)-M
auc = (sum(pos_ranks)-M*(M+1)/2)/(M*N)
return auc
数据集
Q:数据清洗流程
- PII和safety过滤
- 去重
2.1 URL去重, 保留最新的URL
2.2 ducument level去重, 使用minHash
2.3 line level, 出现超过6次的line都删除, 比如cookie提示, 导航栏 - 用n-gram和看是否出现outlier token
4.用model给数据打分(DistilRoberta)
Q: 采用什么样的策略、什么样的数据才会便于模型学习
Q: 数据配比能说下思路吗
LLaMA3.1的配比是50% of tokens corresponding to general knowledge, 25% of mathematical and reasoning tokens, 17% code tokens, and 8% multilingual tokens.
"数据配比是大模型训练中的一个关键环节,它直接影响模型的性能和泛化能力。我的思路主要围绕以下几个方面:
首先,我会关注数据的多样性和平衡性。这包括任务类型的多样性,比如确保数据集中包含足够的问答、摘要、翻译等不同类型的任务。同时,我也会注意领域的平衡,确保模型能够习得各个领域的知识。
其次,对于多语言模型,语言的分布也是一个重要考虑因素。我会根据目标市场和应用场景来决定各种语言数据的比例。
另一个重要方面是数据质量。我倾向于给高质量数据更高的权重,因为这有助于提高模型的学习效果。同时,我也会注意数据的时间分布,确保模型既能学习到历史知识,也能掌握最新信息。
在实际操作中,我会考虑使用分层采样或加权随机采样等技术来实现所需的数据分布。此外,我认为数据配比不是一次性的工作,而是一个需要持续优化的过程。我会根据模型在不同任务上的表现,动态调整数据配比,以强化模型的薄弱环节。
最后,我想强调的是,在进行数据配比时,我们还需要考虑伦理和偏见问题。我会特别注意减少数据中可能存在的偏见,增加多元化的观点和表述,以培养出更加公正和全面的模型。
Tokenizer
Byte-pair encoding (used by GPT, LLAMA2)
WordPiece (BERT)
score的计算有所不同, 非开头的token前有两个##
假设词汇已经学习完, 拿到新句子时, 从开头找最长子串s.t.子串在词汇表里
二者的对比:
1.评分机制:
BPE:选择频率最高的符号对进行合并。
WordPiece:使用语言模型似然度来评分。它会选择能够最大化训练数据似然度的合并。
2. 特殊符号:
BPE:通常不使用特殊的子词符号。
WordPiece:使用 “##” 前缀来标记非词首的子词。例如,“playing” 可能被分割为 “play” 和 “##ing”。
Sentence Piece
与语言无关, 被T5使用
Q: 目前tokenizer的不足
- 不同语言分词效果不一样
- 上下文无关
- 对于low resource语言不友好
- 特殊符号处理不太妥当
Norm
Q: 先norm和后norm的优劣
-
Pre Norm:
- 公式: x + LN(F(x))
- Pre Norm 在训练稳定和收敛性方面有明显的优势,所以大模型时代基本都无脑使用 Pre Norm 了。但是其可能有潜在的(表示塌陷) representation collapse 问题,也就是上限可能不如 Post Norm。
-
Post Norm
- 公式: y = LN(x + F(x))
- Post Norm 对训练不稳定,梯度容易爆炸,学习率敏感,初始化权重敏感,收敛困难, 需要一开始对学习率进行warm up。好处是有潜在效果上的优势
Batch Norm
好处
- 使得模型训练收敛的速度更快
- 每层的数据分布都不一样的话(解决Internal Covariance Shift),将会导致网络非常难收敛和训练,而如果把每层的数据都在转换在均值为零,方差为1的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
- 防止梯度消失
- 使得数据不落入饱和性激活函数(如sigmoid,tanh等)饱和区间,避免梯度消失的问题
- 防止过拟合
- 在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。
但其实MIT在2019年说好处不是解决了ICS, 而是能让loss曲线更平滑
BN为什么训练时用batch的mean, 而推理时用全局的mean
?
因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。
也正是因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。
Layer Norm
为什么LLM用LN而不是BN
- 句子长短不同
- 没有道理, 在身高这个维度做normalization是有道理的, 这改变了分布之后并没有改变相对大小的意义, 比如高个子仍然是高个子. 但是如果在NLP中做这种归一化是没有道理的, 第一句话的"We", 第二句话的"I"之间是不存在这样的关系的
- 假设我们有一个向量是[身高, 体重], 做了BN之后, 身高和体重之间没有直接的关系了, 他们都有各自自己的分布, 但是如果在句子上用BN, 不同维度之间的信息丧失之后, 何谈用注意力机制呢
RMSNorm
a
ˉ
i
=
a
i
RMS
(
a
)
g
i
,
where
RMS
(
a
)
=
1
n
∑
i
=
1
n
a
i
2
.
\bar{a}_i = \frac{a_i}{\text{RMS}(\mathbf{a})} g_i, \quad \text{where} \quad \text{RMS}(\mathbf{a}) = \sqrt{\frac{1}{n} \sum_{i=1}^n a_i^2}.
aˉi=RMS(a)aigi,whereRMS(a)=n1i=1∑nai2.
其中
g
i
g_i
gi是可以学习的缩放参数
Instance Norm
对一个channel内进行归一化, 多见于CV中的迁移学习
Group Norm
将多个channel组合到一起, 所以也是在NLP没多大用
大模型历程和各个模型优缺点
传统NLP -> RNN -> LSTM -> Transformer -> BERT -> GPT
- 循环神经网络 (RNN)
- 难以捕捉长距离依赖
存在梯度消失/爆炸问题
计算效率低,难以并行化
- 难以捕捉长距离依赖
- 长短期记忆网络 (LSTM)
- 改善了RNN的长期依赖问题
缓解了梯度消失问题
可以选择性地记忆或遗忘信息 - 计算复杂度高
仍然存在一定的长距离依赖问题
- 改善了RNN的长期依赖问题
- GRU
- 比LSTM结构更简单,训练更快
在某些任务上性能与LSTM相当
- 比LSTM结构更简单,训练更快
- Transformer
- 完全基于注意力机制,摒弃了循环结构
可以高度并行化,训练速度快
捕捉全局依赖关系
- 完全基于注意力机制,摒弃了循环结构
BERT家族及区别
-
BERT (Bidirectional Encoder Representations from Transformers)
发布时间:2018年
主要特点:
双向上下文编码
预训练任务:Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)
应用:各种NLP任务的基础模型 -
RoBERTa (Robustly Optimized BERT Approach)
发布时间:2019年
主要改进:
移除NSP任务
动态掩码
更大的批量大小
更长时间的训练
性能:在多个基准测试上超越BERT -
ALBERT (A Lite BERT)
发布时间:2019年
主要改进:
参数共享减少模型大小
句子顺序预测(SOP)替代NSP
因式分解嵌入参数化
特点:更小的模型尺寸,更快的训练速度 -
DistilBERT
发布时间:2019年
主要特点:
知识蒸馏技术
模型尺寸减小40%,速度提高60%,保持95%的性能
应用:资源受限环境
Activation Function
sigmoid
σ
(
x
)
=
1
1
+
e
−
x
σ(x) = \frac{1}{1 + e^{-x}}
σ(x)=1+e−x1
缺点: 1. 均值不为0
2.导数小, 梯度消失
3. 计算复杂
tanh
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
tanh(x)=ex+e−xex−e−x, 导数为
d
d
x
tanh
(
x
)
=
1
−
tanh
2
(
x
)
\frac{d}{dx}\tanh(x) = 1 - \tanh^2(x)
dxdtanh(x)=1−tanh2(x)
解决了均值不为0, 但是仍然梯度小, 计算复杂
sigmoid和tanh这种bounded反而很适合概率门, 比如LSTM中各种门
ReLU
f ( x ) = { x if x > 0 0 if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ 0 &\text{if } x \leq 0 \end{cases} f(x)={x0if x>0if x≤0
- 好处
- 计算简单
- 不会梯度消失
- 实验证明收敛更快
- 缓解过拟合: ReLu会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。网络的稀疏性可以理解为让不同的神经元各司其职
- 缺点:
- “死亡ReLU"问题:如果学习率设置不当,可能导致某些神经元永远不会被激活,使得相应的参数无法得到更新。这种现象被称为"死亡ReLU”。
- 均值不为0
Leaky ReLU
解决坏死
PReLU
f ( x ) = { x if x > 0 α x if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ αx &\text{if } x \leq 0 \end{cases} f(x)={xαxif x>0if x≤0
ELU
f ( x ) = { x if x > 0 α ( e x − 1 ) if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ α(e^x - 1) &\text{if } x \leq 0 \end{cases} f(x)={xα(ex−1)if x>0if x≤0
α \alpha α是学习的参数,
- 缓解"死亡ReLU"问题:
ELU在负值区间有非零输出,这意味着即使对于负输入,梯度也能够流过。这有助于减少"死亡神经元"的问题,使得网络中的更多单元能够持续学习和更新。 - 输出均值更接近零:
由于ELU在负值区间的非线性特性,它能够将激活的平均值推向零。这有助于缓解Internal Covariate Shift问题,可能会加速学习过程。 - 平滑的梯度:
ELU在整个定义域内都是平滑的,包括在零点附近。这种平滑性可以带来更稳定的梯度流,有利于优化过程。 - 负值饱和:
与Leaky ReLU不同,ELU在负值区间会逐渐饱和到-α。这种特性可以增强对噪声和异常值的鲁棒性。
GeLU (Gaussian Error Linear Unit)
f
(
x
)
=
x
∗
Φ
(
x
)
f(x) = x * Φ(x)
f(x)=x∗Φ(x)
BERT, GPT2, Roberta都在用
motivation是对于较大x, 进行恒等映射, 对于很小的x, 直接map为0, 对于之间的得有梯度进行更新
Swish
f
(
x
)
=
x
∗
s
i
g
m
o
i
d
(
β
x
)
f(x) = x * sigmoid(βx)
f(x)=x∗sigmoid(βx)
LLM参数量计算
- seq_length:
L
— 序列中的token数量 - d_model:
D
— Transformer模型的隐藏层维度 - d_head:
d
— 每个注意力头处理的维度 - n_tokens:
V
— 词表数量
- embedding matrix
V * D
- 多头注意力的参数主要来源于四个矩阵:
W^Q
,W^K
,W^V
, 和W^O
。- 每个矩阵的维度为
[D, d]
。 - 因为有
H
个头,所以每个头有一组独立的参数。 - 总参数量为:
3 * D * d * H = 3 * D * D
。
- 每个矩阵的维度为
W^O
:- 输出矩阵的维度为
[D, D]
。 - 总参数量为:
D * D
。
- 输出矩阵的维度为
每个block总计4 * D* D
, 总计4 * D * D * n_layers
-
FFN参数量
FNN先投射到4 * D
, 再投射回来, 所以有两个矩阵:[D, 4 * D]
和[4 * D, D]
-
其他
LN: 一个 γ \gamma γ一个 β \beta β, 共计2 * D * n_layers
Bias:D * n_layers
positional_encoding: 固定, 可忽略
Attention Mechanism
Q: 为什么QKV要使用三个矩阵
K和Q使用了不同的W_k, W_Q来计算,可以理解为是在不同空间上的投影。正因为有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高
Q:注意力优化方法有哪些,计算优化,io优化,显存优化
Attention变种
其中多个头合在一起时使用的是平均池化
Encoder, Decoder, Both
-
Encoder only
- 双向上下文理解
适合理解和表示任务
不适合生成任务
- 双向上下文理解
-
Decoder only
- 单向(左到右)上下文理解
适合生成任务
可以进行few-shot学习
- 单向(左到右)上下文理解
-
Both
- 机器翻译、文本摘要、问答系统等
Q:为什么现在的LLM都是decoder only
- decoder-only 模型在没有任何 tuning 数据的情况下、zero-shot 表现最好,而 encoder-decoder 则需要在一定量的标注数据上做 multitask finetuning 才能激发最佳性能
- decoder only可以做到KV cache
- 双向attention的注意力矩阵容易退化为低秩状态,而 causal attention 的注意力矩阵是下三角矩阵,必然是满秩的,建模能力更强
KV Cache
Q: 工作原理
每次k多做一列, 同时v多做一行
Q: KV消耗的显存计算
layer * d_model * seq_len * batch size
Q: 为什么不缓存Q
Q 在每次推理时都是新生成的,代表当前的查询状态。
PEFT
Adapter
推理时间可能略有增加,因为需要额外的计算。
在某些任务上,性能可能略低于全参数微调。
实现相对复杂,需要对模型结构进行修改。
Soft Prompt
Hard Prompt指人工设计的prompt, soft prompt有可以学习的参数
soft prompt分为prefix tuning, prompt tuning, P-tuning
Prefix Tuning
训练过程:
在输入层:在文本输入前添加可学习的prefix向量。
在每一层:在self-attention的key (k)和value (v)计算中添加prefix。
Prefix生成:使用一个小型MLP来生成每层的prefix,而不是直接学习prefix。
MLP的作用:
MLP用于"重参数化"(reparameterization)prefix。
这种方法可以提高训练稳定性和泛化能力。
推理过程:
Prefix Tuning 推理过程
具体步骤:
在训练结束后,使用训练好的MLP计算每一层的prefix。
这些prefix被保存下来,作为模型适应特定任务的"记忆"。
Prompt Tuning
Prompt-tuning给每个任务定义了自己的Prompt,拼接到数据上作为输入,同时freeze预训练模型进行训练,在没有加额外层的情况下,可以看到随着模型体积增大效果越来越好,最终追上了精调的效果:
如果我们添加 20 个 token 的软提示,额外参数量为 20 x 768 = 15,360。
P-tuning
P-tuning算是prompt tuning的拓展, 重新添加了LSTM-MLP编码输入端的soft-prompt
方法 | 优点 | 缺点 |
---|---|---|
Prefix Tuning | - 只更新少量参数,训练效率高 - 可以为不同任务保存不同的prefix - 对下游任务有较好的适应性 | - 需要为每个任务单独训练prefix - 相比全量微调,性能可能略有下降 |
P-Tuning | - 引入了连续的virtual token,增强了表达能力 - 比prompt tuning更灵活,可学习性更强 | - 实现相对复杂 - 可能需要较多的训练数据才能达到好效果 |
Prompt Tuning | - 实现简单,易于理解和应用 - 可以直接利用预训练模型的知识 | - 表达能力可能受限 - 对prompt的设计很敏感,需要精心设计 |
LoRA
优点 | 缺点 |
---|---|
1. 参数效率高:显著减少可训练参数数量 | 1. 表达能力限制:低秩结构可能限制模型捕捉复杂模式的能力 |
2. 内存效率:减少训练和存储所需的内存 | 2. 超参数敏感:性能受秩 r 和学习率等超参数影响大 |
3. 计算效率:训练速度快,推理时可合并权重无额外开销 | 3. 不适用于所有层:某些层(如嵌入层)可能不适合低秩适应 |
4. 模块化:可为不同任务训练不同的LoRA模块 | 4. 可能略逊全量微调:在某些任务上性能可能稍低于全量微调 |
5. 与其他方法兼容:可与量化、蒸馏等技术结合 | 5. 实现复杂度:比简单的微调方法实现稍复杂 |
6. 适应性强:在各种下游任务中表现良好 | 6. 调优挑战:找到最佳的低秩结构可能需要大量实验 |
7. 原始模型保护:不直接修改原始模型权重 | 7. 不适合所有模型:效果可能因模型架构而异 |
LoRA+
可以理解为矩阵B从零开始, 需要的学习率更大. 将矩阵B的学习率设置为远高于矩阵A的学习率,可以使得训练更加高效。
LoRA-FA (LoRA但是把A frozen)
AdaLoRA
动态分配参数, 一般来说偏深层的秩会更高一些
QLoRA
DoRA将预训练权重分解为幅度(m)和方向(V)组件。方向组件通过LoRA进一步更新,实现高效微调。这种分解简化了LoRA的学习任务,专注于方向更新,同时通过权重归一化原则保持稳定性。
Alignment
微调
Q:SFT
Q: RLHF
分为on-policy的PPO和off-policy的DPO, 凡是需要 LLM 在训练过程中做 generation 的方法就是 On Policy,反之为 Off Policy。
RLHF的loss为
L
R
L
H
F
=
E
[
r
(
x
)
−
λ
∗
K
L
(
π
θ
(
⋅
∣
x
)
∣
∣
π
r
e
f
(
⋅
∣
x
)
)
]
L_RLHF = E[r(x) - λ * KL(π_θ(·|x) || π_{ref}(·|x))]
LRLHF=E[r(x)−λ∗KL(πθ(⋅∣x)∣∣πref(⋅∣x))]
增大得分同时减少自身和ref model之间的差
PPO
4个模型需要被加载, actor, critic, reward model, reference model
DPO
从RLHF的目标函数得到显示解, 只需要模型本身
L D P O ( θ ) = − E ( x , y w , y l ) D [ l o g σ ( β ( l o g ( p θ ( y w ∣ x ) / p r e f ( y w ∣ x ) ) − l o g ( p θ ( y l ∣ x ) / p r e f ( y l ∣ x ) ) ) ) ] L_{DPO}(θ) = -E_{(x,y_w,y_l)~D} [log σ(β(log(p_θ(y_w|x)/p_{ref}(y_w|x)) - log(p_θ(y_l|x)/p_{ref}(y_l|x))))] LDPO(θ)=−E(x,yw,yl) D[logσ(β(log(pθ(yw∣x)/pref(yw∣x))−log(pθ(yl∣x)/pref(yl∣x))))]
Loss(及代码)
正则化
为什么L1假设前验是拉普拉斯, L2是高斯 (to be done)
MOE
Q: 代表模型
- Google Switch Transformer
- 基于T5
- Mistral
- 高质量MoE模型,性能优于Llama 2 70B
Q: MOE的优劣
优势
-
预训练速度更快,计算效率更高
原因:- MoE模型在处理每个输入时只激活部分专家,而不是整个网络。
- 这种稀疏激活允许模型在相同的计算预算下处理更多数据或使用更大的模型。
-
推理速度更快
原因:- 虽然MoE模型的总参数量可能很大,但在推理时只使用其中的一小部分。
- 例如,Mixtral 8x7B有46.7B参数,但推理时只使用约12B参数。
-
可扩展性强
原因:- MoE架构允许增加专家数量而不显著增加计算成本。
- 这使得可以训练具有数万亿参数的超大模型。
-
在知识密集型任务上表现出色
原因:- 不同的专家可以专门化于不同类型的知识或任务。
- 这种专门化使模型能更有效地存储和利用大量diverse信息。
劣势
-
需要大量VRAM
原因:- 尽管推理时只使用部分参数,但所有专家的参数都需要加载到内存中。
- 这可能导致在资源受限的环境中难以部署。
-
微调挑战和过拟合风险
原因:- MoE模型在微调时更容易过拟合,尤其是在小数据集上。
- 这可能是因为模型的高容量和稀疏激活模式导致的。
-
小规模任务表现较差
原因:- MoE模型设计用于处理大规模、diverse的数据和任务。
- 在小规模或单一领域任务上,可能无法充分利用其优势。
-
负载平衡和通信成本问题
原因:- 需要精心设计以确保所有专家被均匀使用。
- 在分布式系统中,专家之间的通信可能成为瓶颈。
-
部署复杂性
原因:- MoE模型的动态路由机制使得优化和部署比传统密集模型更复杂。
- 可能需要特殊的硬件或软件优化来充分发挥其性能。
显存
大模型流程
DPO, SFT, RLHF
生成阶段
Q:为什么会有重复输出的现象, 如何解决?
LLM评估
Q:评估metric有哪些, 如何计算
- 分类
- F1, recall
Q: 如何评估LLM
- HumanEval
指标:通过率(Pass@k)
评估代码生成能力 - GLUE(General Language Understanding Evaluation)
指标:准确率、F1分数、相关系数等
包含多个自然语言理解任务,如情感分析、文本蕴含等 - SQuAD(Stanford Question Answering Dataset)
指标:准确率(Exact Match)和F1分数
评估阅读理解和问答能力 - TruthfulQA
指标:人类评估分数
评估模型提供真实信息的能力和抵抗幻觉的能力
Decoding
Q:top-k和top-p
- top-k
- 可控制性强
- 选k是个问题
- 丢失多样性和创造性
- top-p
- 多样性
- 可能会引入很多概率很小的token
可以结合起来top-k->top-p->Temperature
Q: 长度惩罚如何实现的
Q: repetition惩罚如何实现的
Q: 在实际应用中,如何权衡解码速度和生成质量?
Q: 如何处理生成过程中的重复问题?有哪些常用的策略?
Q: 对于长文本生成任务,如何解决内存限制问题?有哪些可行的方法?
思维链
CoT
实验证明在大模型上的效果更好
拓展1. CoT-sc, 生成多个答案后通过投票来获得答案
拓展2. Complex-based CoT删除掉推理步骤少的逻辑(简单的), 保留复杂的, 在复杂的中进行投票
拓展3. Auto-CoT: 自动构建CoT中的demo, 方法为把不同的demo进行聚类, 从离问题最近的簇里选择
拓展4: 加上verifier, 在每一步进行verify是否是合理的推断
好处有:
- 显著提高了模型在数学和逻辑推理任务上的表现
- 让模型具备了一定的可解释性,能展示推理过程
- 在一些常识推理任务上超越了人类水平
- 可以与其他技术如指令微调结合使用,进一步提升性能
- 顺序不太重要, 但是质量还挺重要的
坏处有:
- 需要模型规模足够大(一般超过100B参数)才能涌现效果
- 应用领域还比较有限,主要在数学和常识推理等任务上有明显效果
- 即使有CoT,模型在一些简单计算上仍会犯错,说明并未真正理解数学逻辑
- 大规模模型的计算成本高,难以广泛部署应用
ToT
CoT只有一种reasoning path, Tree的结构目标是形成多个path
每一步都会用LLM来评判一下可能性
GoT
每一个点是思想
操作可以agrregate, 从k个想法合成一个, 或者generate, 从1个到k个
AoT
Prompt
Hallucination
Q:为什么会有幻觉现象
- 数据相关原因:
a. 数据源问题:
- 错误信息和偏见:训练数据中可能包含错误信息或社会偏见。例如,网络文本中的常见误解可能被模型学习并复制。
- 知识边界:模型的知识受限于训练数据的时间范围和领域。例如,模型可能不了解最新事件或特定专业领域的知识。
b. 数据利用不足:
- 知识捷径:模型可能过度依赖训练数据中的表面相关性,而不是真正理解概念。例如,它可能将"加拿大"和"多伦多"频繁关联,误认为多伦多是加拿大首都。
- 知识回忆失败:模型可能难以准确回忆罕见信息或进行复杂推理。对于长尾知识(如不常见的事实)或需要多步推理的问题,模型表现较差。
训练相关原因:
a. 预训练问题:
- 架构缺陷:如单向表示不足(只考虑前文不考虑后文)可能导致上下文理解不全面。注意力机制的缺陷可能导致模型难以捕捉长距离依赖。
- 暴露偏差:训练时使用教师强制(teacher forcing)而推理时使用自己生成的输出,导致训练和推理不一致,可能累积错误。
b. 对齐问题:
- 能力错配:模型在对齐阶段可能被期望执行超出其实际能力的任务,导致生成虚假信息。
- 信念错配:模型可能为迎合人类偏好而产生阿谀奉承行为,即使违背其内部"信念"也会生成不实信息。
推理相关原因:
a. 解码策略中的采样随机性:
- 为了增加输出多样性而引入的随机性可能导致生成不准确或不相关的内容。温度参数越高,产生幻觉的风险越大。
b. 解码表示不完善:
- 上下文注意力不足:在生成长文本时,模型可能过度关注最近生成的内容而忽视原始上下文,导致偏离主题。
- Softmax瓶颈:Softmax层可能限制模型表达复杂的多模态分布,导致难以准确预测下一个词,特别是在需要表达多种可能性的情况下。
Q: 判断是否是幻觉, 检测方法
- 基于不确定性
- 看token概率
- 从LLM sample几个回答看一致性
- 让另外一个LLM审问
- 利用外部事实进行检查
- 利用NLI判断
Q:解决方法
缓解数据相关幻觉:
a. 改善数据质量:
- 事实性数据增强:通过增加事实性数据来提高模型的准确性。
- 去偏见技术:应用去偏见技术来减少训练数据中的社会偏见。
b. 解决知识边界问题:
- 知识编辑:对模型中存储的知识进行编辑和更新。
- 检索增强:在生成时引入外部知识检索来扩展模型的知识范围。
c. 改善知识利用:
- 增强知识回忆:提高模型对长尾知识或复杂问题的回忆和推理能力。
缓解训练相关幻觉:
a. 改进预训练:
- 开发更好的模型架构:设计更适合处理长距离依赖的模型架构。
- 优化训练目标:通过优化训练目标提升生成内容的事实性。
b. 增强对齐:
- 改进人类偏好判断:提升模型理解和回应人类偏好的能力。
- 微调以减少阿谀奉承:通过微调减少模型产生阿谀奉承的倾向。
- 激活转向:调整模型激活状态以减少不真实信息的生成。
缓解推理相关幻觉:
a. 增强事实性解码:
- 改进独立解码策略:使用独立解码策略来提高生成内容的事实性。
- 后编辑解码:在生成后通过验证步骤减少虚假信息。
b. 增强忠实性解码:
- 提高上下文一致性:确保模型在长文本生成过程中保持上下文一致性。
- 增强逻辑一致性:通过逻辑推理的自我一致性来减少生成中的错误。
位置编码
BERT位置编码
token + segment + positional
segment和positional都是可学习的
缺乏外推性, 假设之前假设了512的长度, 那么这512的位置信息可以学好, 但当长度超过了512时, 比如1024, 则剩下的512维是没有有用的信息的
Transformer位置编码
我们希望PE具有的性质:
- 确定性算法
- 在长度为10的句子中, 1,3之间的位置信息应该和长度为20中的相等
- 有界
- 使用时能泛化到比训练时更长的长度
- 距离近的内积更大, 有距离衰减
公式:
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
1000
0
2
i
/
d
m
o
d
e
l
)
PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)
PE(pos,2i)=sin(100002i/dmodelpos)
P
E
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
1000
0
2
i
/
d
m
o
d
e
l
)
PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)
PE(pos,2i+1)=cos(100002i/dmodelpos)
特点
- 越往后面, 频率越低, 同时有衰减的性质
- 位置 pos的编码与位置pos + k的编码是线性关系, 但是无法体现出谁在前谁在后
- 对于非常长的序列,相邻位置的编码可能变得难以区分。
RoPE的思路和优点
attention可以表示为
q
k
T
d
\frac{qk^T}{\sqrt d}
dqkT, 我们希望可以找到一个函数
f
f
f s.t.
f
(
q
,
m
)
∗
f
(
k
,
n
)
=
g
(
q
,
k
,
m
−
n
)
f(q, m) * f(k, n) = g(q, k, m -n)
f(q,m)∗f(k,n)=g(q,k,m−n)
我们发现
f
(
q
,
m
)
f(q, m)
f(q,m)的解是一个旋转矩阵, 将q逆时针旋转
m
θ
m \theta
mθ, 推广到多维就是两两一组进行旋转, 但单纯的这样会导致距离衰减这个性质都是, 我们同样可以
(
cos
m
θ
0
−
sin
m
θ
0
0
0
⋯
0
0
sin
m
θ
0
cos
m
θ
0
0
0
⋯
0
0
0
0
cos
m
θ
1
−
sin
m
θ
1
⋯
0
0
0
0
sin
m
θ
1
cos
m
θ
1
⋯
0
0
⋮
⋮
⋮
⋮
⋱
⋮
⋮
0
0
0
0
⋯
cos
m
θ
d
/
2
−
1
−
sin
m
θ
d
/
2
−
1
0
0
0
0
⋯
sin
m
θ
d
/
2
−
1
cos
m
θ
d
/
2
−
1
)
\begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_0 & \cos m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_1 & -\sin m\theta_1 & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_1 & \cos m\theta_1 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}
cosmθ0sinmθ000⋮00−sinmθ0cosmθ000⋮0000cosmθ1sinmθ1⋮0000−sinmθ1cosmθ1⋮00⋯⋯⋯⋯⋱⋯⋯0000⋮cosmθd/2−1sinmθd/2−10000⋮−sinmθd/2−1cosmθd/2−1
其中
θ
i
=
1000
0
−
2
i
d
\theta_i = 10000^{-\frac{2i}{d}}
θi=10000−d2i
好处是可以无限外推, 因为表示的是相对位置信息, 同时旋转操作可以无限进行
Alibi
m对于每一个head都不同, 比如说对于8个头, m从
1
2
1
.
.
.
1
2
8
\frac{1}{2^1}...\frac{1}{2^8}
211...281, 对于16个头从
1
2
0.5
.
.
.
1
2
8
\frac{1}{2^{0.5}} ... \frac{1}{2^8}
20.51...281
NLP数据增强方法
papaphrasing
- bert用[mask]替换为新的
- 基于规则的 is not -> isn’t
- 利用setence embedding
- 翻译成另一种语言再翻译回来
Noising
增删减改换
基于特定任务的
对于NER可以对特定实体进行替换
基于对抗的
- Fast Gradient Method: FGM的思想是针对词嵌入加入梯度方向的干扰,至于干扰的大小是我们可以调节的, 公式为 r = ε ∗ g / ∣ ∣ g ∣ ∣ 2 r = ε * g / ||g||₂ r=ε∗g/∣∣g∣∣2
- Projected Gradient Descent(PGD): FGM的迭代版本,多次添加和投影扰动
每次迭代: e = e + α ∗ g / ∣ ∣ g ∣ ∣ 2 e = e + α * g / ||g||₂ e=e+α∗g/∣∣g∣∣2,然后将e裁剪到ε范围内
RAG
Q: rag的embedding用的什么,怎么优化,召回性能,精排性能
Q:RAG具体落地有哪些难点
Q:RAG中是否仍然有幻觉
信息论
熵
H ( P ) = − ∑ i P ( i ) log P ( i ) H(P) = -\sum_{i} P(i) \log P(i) H(P)=−i∑P(i)logP(i)
交叉熵
H ( P , Q ) = − ∑ i P ( i ) log Q ( i ) H(P,Q) = -\sum_{i} P(i) \log Q(i) H(P,Q)=−i∑P(i)logQ(i)
KL
D
K
L
(
P
∣
∣
Q
)
=
∑
i
P
(
i
)
log
P
(
i
)
Q
(
i
)
D_{KL}(P||Q) = \sum_{i} P(i) \log \frac{P(i)}{Q(i)}
DKL(P∣∣Q)=i∑P(i)logQ(i)P(i)
D
K
L
(
P
∣
∣
Q
)
=
H
(
P
,
Q
)
−
H
(
P
)
D_{KL}(P||Q) = H(P,Q) - H(P)
DKL(P∣∣Q)=H(P,Q)−H(P)
PPL
P P = 2 H ( P ( x ) ) = 2 − ∑ x p ( x ) log 2 p ( x ) PP = 2^{H({P(x)})} = 2^{-\sum_{x} p(x) \log_2 p(x)} PP=2H(P(x))=2−∑xp(x)log2p(x)
对于一个包含 N 个词的序列 W = (w_1, w_2, …, w_N),其 Perplexity 可以表示为:
P P ( W ) = P ( w 1 , w 2 , . . . , w N ) − 1 N PP(W) = P(w_1, w_2, ..., w_N)^{-\frac{1}{N}} PP(W)=P(w1,w2,...,wN)−N1
交叉熵和最大似然的关系
极大似然
Misc
Q: LLAMA架构
Q: 大模型是如何实现长文本输入的
Q: 权重初始化方式
-
Sparse Initialization
W i j = { N ( 0 , 1 n i n ) 以概率 k n 0 其他情况 W_{ij} = \begin{cases} N(0, \frac{1}{\sqrt{n_{in}}}) & \text{以概率 } \frac{k}{n} \\ 0 & \text{其他情况} \end{cases} Wij={N(0,nin1)0以概率 nk其他情况 -
Xaiver
w ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) w \sim U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) w∼U(−nin+nout6,nin+nout6)
适用于tanh -
He
w ∼ N ( 0 , 2 n i n ) w \sim N\left(0, \sqrt{\frac{2}{n_{in}}}\right) w∼N(0,nin2)
适用于ReLU -
正交初始化
从 N ( 0 , 1 ) N\left(0, 1\right) N(0,1)生成一个随机矩阵 M M M
对 M M M 进行奇异值分解: M = U Σ V T M = U \Sigma V^T M=UΣVT
取 U U U 或 V T V^T VT 作为初始化的权重矩阵 W W W
正交矩阵不会改变向量的长度,只会改变其方向, 可以保持梯度范数:正交矩阵在反向传播中不会导致梯度消失或爆炸。
改善信号传播:有助于在深层网络中保持信息流动。
Q: BERT和GPT的区别
- 架构差异
特性 | BERT | GPT |
---|---|---|
模型类型 | 编码器 (Encoder) | 解码器 (Decoder) |
注意力机制 | 双向注意力 | 单向注意力(自回归) |
预训练任务 | 掩码语言模型 (MLM) 和下一句预测 (NSP) | 自回归语言建模 |
-
上下文处理
-
BERT:
- 可以同时考虑左右两侧的上下文
- 适合理解整个句子或段落的含义
-
GPT:
- 只能看到左侧(之前的)上下文
- 更适合生成连贯的文本序列
-
主要应用场景
-
BERT
- 文本分类
- 命名实体识别
- 问答系统
- 情感分析
-
GPT
- 文本生成
- 对话系统
- 语言翻译
- 文本补全
-
训练方法
-
BERT:
- 使用掩码语言模型(MLM)
- 随机掩盖输入中的一些词,然后预测这些被掩盖的词
-
GPT:
- 使用自回归语言模型
- 基于之前的词预测下一个词
-
-
输入处理
-
BERT:
- 可以同时输入一对句子
- 使用特殊标记 [CLS] 和 [SEP] 来分隔和标记输入
-
GPT:
- 通常处理单个文本序列
- 不使用特殊的分隔标记
-
-
微调方法
-
BERT:
- 通常只需要在预训练模型顶部添加一个任务特定的输出层
- 适合各种下游任务的微调
-
GPT:
- often uses “prompts” for task-specific fine-tuning
- 在最新版本(如 GPT-3)中,甚至可以通过少样本学习完成任务,无需显式微调
-
Q: 多个不同长度的句子怎么转为相同长度的embedding,说出用模型和不用模型的方法
Q: drop out是在BN之前还是之后, 为什么
一般是不会同时使用的,
原因: 训练和推理时的一致性:
在推理时,Dropout通常会被关闭,而BN会使用训练时累积的统计量。如果Dropout在BN之前,那么训练和推理时BN看到的分布会有很大差异。
解决: 1. 直接把drop out放在BN后面 2. 把drop out改为高斯drop out
Q: 对于分类问题, 为什么不使用MSE
- 没有道理, 分类的label是没有大小上的意义的
- 会导致梯度消失,
Q: LLM合成数据的注意事项
- 保证质量
- 多样性
- 确定准确性
- 消除LLM的bias
Q: 从LLM生成数据时, 如何保证质量和多样性
对于"从LLM生成数据时,如何保证质量和多样性"这个问题,我们需要考虑两个关键方面:数据质量和数据多样性。这两者往往需要权衡,因为追求极高的质量可能会降低多样性,而过度追求多样性可能会影响质量。让我从这两个方面来回答这个问题。
首先,保证数据质量:
- 精心设计提示(Prompts):
使用清晰、具体的指令来引导LLM生成高质量数据。
包含质量标准和期望输出的示例。
- 后处理和过滤:
实施自动化检查机制,筛选出不符合质量标准的数据。
可以使用规则基础的过滤器或训练额外的模型来评估生成数据的质量。
- 人工审核:
对生成的数据进行抽样人工审核,确保整体质量。
根据审核结果不断优化生成过程。
- 迭代优化:
基于生成结果持续调整和优化提示和生成参数。
其次,确保数据多样性:
-
采样策略调整:
使用温度采样、top-k或nucleus采样等技术来增加输出的随机性。
平衡采样参数,在保证质量的同时增加多样性。 -
多样化提示:
设计多种不同类型的提示,覆盖不同场景和角度。
使用动态生成的提示来增加变化性。 -
条件生成:
引入多样化的条件或属性(如主题、风格、难度等)来控制生成过程。
确保这些条件本身是多样化的。 -
组合多个模型或版本:
使用多个LLM或同一LLM的不同版本来生成数据。
结合不同模型的输出以获得更多样化的结果。 -
数据增强:
对生成的数据应用各种增强技术,如同义词替换、句子重组等。 -
多样性评估和反馈循环:
实施多样性评估指标,如语义相似度、主题覆盖度等。
根据多样性评估结果调整生成策略。
Q: LLAMA 1, 2, 3的区别
模型规模和参数:
Llama-1: 提供7B、13B、30B和65B四种参数规模
Llama-2: 提供7B、13B、34B和70B四种参数规模
Llama-3: 目前提供8B和70B两种参数规模,还在开发400B规模的版本
训练数据规模:
Llama-1: 超过1T token
Llama-2: 2T token
Llama-3: 15T token,是Llama-2的8倍
上下文长度:
Llama-1: 2048 token
Llama-2: 4096 token
Llama-3: 8192 token
词汇表大小:
Llama-1和2: 32,000词条
Llama-3: 128,000词条
分词器:
Llama-1和2: 使用sentencepiece
Llama-3: 切换到tiktoken
多语言能力:
Llama-1和2: 主要专注英语
Llama-3: 显著提升了多语言能力,包含超过5%的非英语token
训练方法:
Llama-1: 仅预训练
Llama-2: 引入SFT和RLHF
Llama-3: 在Llama-2基础上进一步优化训练方法
性能表现:
每代模型在性能上都有明显提升,Llama-3在多项基准测试中超越了之前的版本和其他同类模型。
Q: 为什么LLM的知识是储存在FFN中的
Q: 什么是long tail问题, 如何缓解
- 罕见词汇的生成和理解:
由于模型在训练过程中接触到的主要是高频词汇,长尾部分的低频词汇在生成和理解时可能会出现问题。模型可能难以正确生成或理解这些不常见的词汇,导致生成的内容不准确或语义不清。 - 长尾知识的回忆:
LLMs 可能难以准确回忆和应用在训练中只接触过几次的罕见知识。这种情况下,模型可能会生成错误的信息或者完全忽略相关知识点
缓解方法
Q: PTQ, QAT
Q:Prefix LM和Causal LM的区别
Q: FFN中为什么先升维再降维
-
superposition
- 约翰逊-林登斯特劳斯定理指出: 如果在n维空间, 我们想找到n个正交的向量我们只有n种选择, 但如果允许一点误差, 比如89 - 91°, 可能的组合是 e x p ( ϵ ∗ N ) exp(\epsilon * N) exp(ϵ∗N)的, 所以
- 升维利用了高维空间中近似正交向量指数增长的特性
允许在同一组神经元中高效编码多个特征或概念 - 增强了网络的表示能力,无需显式增加参数数量
降维过程从丰富的高维表示中提取最相关信息
-
Key-Value Memory 视角:
-
FFN作为具有记忆能力的Key-Value对
-
升维扩展了"键空间",增加可能的模式匹配数量和复杂性
非线性激活创建复杂决策边界,实现键到值的非线性映射
降维过程类似于根据输入(Key)检索相应输出(Value)
-
Q:为什么只量化weight,不量化activation
Q:目前前沿的LLM
Q: 对国内LLM有哪些了解
Q: softmax的真正底层原理,问的很细致
Q: Infernce 和Training 的时候 在GPU中都要保存哪些值和变量?有什么区别?
量化
剪枝
Q:深度神经网络剪枝的主要类型和方法:
理想答案:深度神经网络剪枝主要可以从三个维度分类:
(1) 加速类型:分为非结构化剪枝、结构化剪枝和半结构化剪枝。
(2) 剪枝时机:包括训练前剪枝(PBT)、训练中剪枝(PDT)、训练后剪枝(PAT)和运行时剪枝。
(3) 剪枝标准:可以基于权重幅度、范数、敏感性/显著性、损失变化等,也可以通过学习来确定。
主要方法包括基于幅度的剪枝、基于重要性评分的剪枝、基于稀疏正则化的剪枝、动态稀疏训练等。每种方法都有其特点和适用场景。
Q: 非结构化剪枝和结构化剪枝的比较:
理想答案:非结构化剪枝和结构化剪枝各有优缺点:
非结构化剪枝:
优点:可以实现更高的剪枝率,对精度影响较小。
缺点:需要特殊硬件或软件支持才能实现实际加速。
结构化剪枝:
优点:可以直接实现模型加速和压缩,不需要特殊硬件/软件支持。
缺点:在相同剪枝率下,精度损失通常高于非结构化剪枝。
选择时需要考虑硬件/软件条件、对精度的要求、目标剪枝率等因素。如果没有特殊硬件/软件支持,但需要实际加速,结构化剪枝更合适;如果对精度要求很高,可以考虑非结构化剪枝。
Q: 不同时期剪枝的比较:
理想答案:
训练前剪枝(PBT):在随机初始化后直接剪枝。优点是避免了预训练成本,但可能难以找到最优子网络。
训练中剪枝(PDT):在训练过程中动态调整网络结构。优点是可以适应训练过程中的变化,但增加了训练复杂度。
训练后剪枝(PAT):对训练好的模型进行剪枝。最常用的方法,可以利用训练后的权重信息,但可能需要额外的微调过程。
选择depends on资源限制、目标性能和应用场景。如果计算资源有限,可考虑PBT;如果追求高性能,PAT通常更好;如果需要动态适应,PDT可能更合适。
Q: 动态剪枝vs静态剪枝:
理想答案:动态剪枝和静态剪枝的主要区别:
静态剪枝:对网络进行一次性剪枝,得到固定的子网络结构。
动态剪枝:根据输入动态决定每次推理时使用的网络结构。
动态剪枝的优势:
可以根据输入复杂度动态分配计算资源
潜在地提高模型在不同输入上的适应性
局限性:
增加了推理时的复杂度
可能需要特殊的硬件/软件支持
训练和部署更复杂
Q: 剪枝与其他压缩技术的结合:
理想答案:剪枝可以与多种压缩技术结合,主要包括:
剪枝+量化:减少参数数量的同时降低位宽,如CLIP-Q、MPT等工作。
剪枝+张量分解:如CC结合通道剪枝和张量分解。
剪枝+NAS:自动搜索最优剪枝结构,如NPAS、TAS等。
剪枝+知识蒸馏:用知识蒸馏训练剪枝后的网络,如LadaBERT等。
结合的优势:
互补效应,可以进一步提高压缩比
在不同维度上压缩模型,平衡性能和效率
可以克服单一技术的局限性
但也增加了方法的复杂度,需要更仔细的设计和调优。
Q: 剪枝方法的评估:
理想答案:评估剪枝方法的主要指标包括:
精度损失:与原始模型相比的性能下降
压缩比:参数数量或模型大小的减少程度
推理速度提升:实际的计算加速比
能耗减少:尤其对于边缘设备部署很重要
剪枝的稳定性和鲁棒性
目前业界在评估标准上存在的主要问题:
缺乏统一的基准测试集和评估流程
不同方法使用不同的实验设置,难以直接比较
有时只关注理论压缩比,忽视实际加速效果
对于大模型,全面评估的计算成本很高
蒸馏
分类
分类一: 老师模型会不会随着一起更新: offline, online, self
关于自蒸馏: 一个深层的网络, 我们从中间选出一些浅层的加上分类器, 最终的loss为: 每一个分类头的loss, 学生和老师之间的KL, 学生feature和老师feature之间的L2
分类二: 基于什么学生向老师学习
- 基于response (logits)的: 损失函数是一个KL散度加上hard label
- 基于feature的: 利用中间feature进行学习的, loss就是L1, L2或者交叉熵
- 基于注意力的
- 基于老师生成的: