GitHub - km1994/LLMs_interview_notes: 该仓库主要记录 大模型(LLMs) 算法工程师相关的面试题
1 量化
1.1 最优脑损伤(OBD)
以模型训练损失为目标函数,将参数某个值置零,再泰勒展开,可以估计权重影响。
找到一个W的变化,使得损失最小。、
假设海森矩阵是对角矩阵:同时剪枝多个权重参数对模型精度造成的影响,等于单独剪枝每个权重对模型造成影响之和。
1.2 最优脑手术(OBS)
不同意 OBD 的假设,认为权重剪枝之间是有关联的
1.3 最优脑压缩(OBC)
OBS计算量太大。
row-wise剪枝(按照每一层剪枝)
剪枝,是权重置零。压缩是权重降低精度。每量化一个权重值,需要调整剩余权重来最小化量化损失,应该在浮点数空间上调整
OBQ将 Hessian 矩阵求逆的复杂度降低到了 O(dcol2),并且一个权重矩阵总的参数量为 drow×dcol,因此总体来说 OBQ 的时间复杂度为 O(drow×dcol3)。
GPTQ:按照索引顺序量化,将每一行的量化权重选择方式从贪心策略改成按索引顺序选择,其次是将权重更新方式修改为批量更新,时间复杂度就降低到了 O(dcol3)
2 算子融合方法
然后,分解softmax计算
总的访存量就为 Θ(N2d2M−1)。
3 困惑度指标与计算
困惑度是在离散概率分布中采样不确定性的度量,困惑度越大,采样的不确定性就越高。这种定义看起来和熵的概念有一定的关系,事实上,对于一个离散随机变量 X 的概率分布 p 来说,它的困惑度正是由熵 H(p) 来决定的,其公式如下:
概率模型困惑度:当概率模型能够完美地拟合真实概率分布时,概率模型的困惑度就等于真实概率分布的困惑度。概率模型与概率分布之间的交叉熵来定义概率模型的困惑度,即
4 高效微调(PEFT)
1. 什么是微调?
全参微调:full tune
部分参数微调:p-tuning、lora、prompt-tuning、adaLoRA
2. 什么是PEFT?
只微调底下几层,效果不好;全调又太慢且灾难性遗忘。
为了减少微调参数数量和计算复杂度,提高预训练模型在新任务的性能,缓解训练成本。
3. 效果上的区别:全量微调可以改变知识,高效微调改变风格。
4. 普遍存在的问题:推理速度变慢、模型精度变差。
5. LoRA原理:(Low-Rank Adaptation):LoRA是重参数化微调的一个具体实例,它通过添加两个额外的上投影和下投影矩阵来构建原始模型参数的低秩表示用于训练。在训练后,这些额外的参数可以被无缝地合并到预训练权重中,避免引入额外的推理开销。
5 适配器微调
也是为了针对全参微调太贵;
1. 思路:设计了Adapter结构,高维到低维、非线性层、低维到高维。加上skip-connection,防止最坏情况;
2. 训练时,原模型参数不变,只对adapter微调;
3. 特点:额外加了推理时长;
4. adapterFusion、AdapterDrop、MAM Adapter
6 LoRA
通过低秩分解模拟参数改变量,以减少计算量。
原模型旁边加一个旁路,通过低秩分解模拟参数更新量。训练时只训练降维矩阵A和升维矩阵B。之后推理可以直接把BA加到原来的矩阵上面。
初始化:A高斯分布初始化,B初始化全为0。全0梯度消失,高斯初始化有太多噪声。
可拔插:把旁路换了就是下一个任务。
消除推理延迟:直接把BA加到W上,可以消除推理延迟。
6.1 QLoRA
思路:使用高精度技术,将预训练模型量化为4bit。然后添加以小组可学习的低秩适配器权重,将权重通过量化权重反向传播进行微调。
特点:降低了现存要求,但是会慢于LoRA
6.2 AdaLoRA
LoRA的改进,根据重要性评分动态分配参数预算给权重矩阵。关键的矩阵给高秩,不关键的低秩。
6.3 LongLoRA
长上下文计算成本很高。LoRA长语境模型不有效也不高效。
思路:shift short attention、LongLoRA扩展了上下文同时保留了原始架构与大多数技术兼容
注意力只在每个组中计算,标准的注意力啧在所有标记中进行计算。组和组的流通,通过移位实现。
‘兄弟,这个思想就是简单有效啊。
6.4 优点
1. 一个模型多个下游任务,节省参数存储;
2. 推理阶段不引入额外计算量;
3. 与其它参数高效微调方法正交,可以组合;
4. 稳定效果好;
5. 不增加推理延迟。
6.5 LoRA的好处与坏处
好处:只更新部分参数、减少通信时间、采用了各种低精度加速技术。
坏处:不是全量微调,效果还是会差一点的。同时,只引入少量参数,就能在GPU上面训练,但是lora不能节省训练时间。
6.6 LoRA怎么用?
作用域Wq和Wk上面效果会好些。
rank取4-8好,根据指令分布广度,选8以上好。rank越大越容易过拟合。
7 prompt提示学习
7.1 前缀微调(NLG,服务于GPT架构)
人工设计prompt会导致结果对prompt过于脆弱,成本高,结果不一定最优。
全量缺点讲一遍
思路:构建prefix,任务相关的;训练的时候只更新prefix部分参数,其它参数固定;prefix层前面加MLP结构,训练完成后,只保留prefix参数。
优点:可以学习隐式prompt;一个批次处理来自多个用户的样本;只更新部分参数。
缺点:占用token;每层都加prompt参数,改动大。
7.2 prompt-tuning(所有类型语言模型)
仅在输入层增加prompt连续向量,反响传播更新prompt;只训练prompts参数。
优点:只在输入层加token吗,不用mlp进行调整解决难训练的问题;基座模型大,则方法逼近全参微调结果。在一个批次里面可以训练同一个任务不同的prompt,成本低。
缺点:用时长;token之间相互独立,影响效果。NLU上效果不行。
7.3 P-tuning
大模型prompt构造方式影响下游任务效果;
思路:调整prompt参数,有效引导模型生成期望的输出,无需对模型权重进行大规模微调。
1. 可学习的Embedding层,将prompt转换为可学习Embedding层;
2. prompt encoder设计,对prompt embedding进行处理,建模伪token相互依赖,就可以更好地初始化;
优点:就在于prompt encoder的引入,同上;
缺点:复杂性增加,伪token连续,但是结合时可能不连续;
7.4 P-tuning v2(到时候补充)
Deep prompt encoding:用prefix-tuning做法,每层加入prompt tokens作为输入;移除了重参数化编码器;针对不同任务用不同的提示长度;多任务学习
8 归一化
Norm,NMS Norm,Deep Norm
NMS Norm是移除了均值计算后的;
Deep Norm:残差连接增强、参数初始化调整、预期模型更新控制
9 激活函数
GeLU,有个近似公式;大模型主要用它和SwiGLU
GLU,门控单元;
SwiGLU把sigmoid换成了swish
10 Attention优化
计算量太大,很限制上下文长度;
变体:稀疏注意力、线性化、减少qk对的数量、低阶自注意力、用Attention先验、改进多头机制
Multi-Query Attention:注意力头上共享k和v,那就加速了
flash attention:分块softmax替代传统softmax,节约共享内存;
grouped-query attention:介于多头和多query之间;
transformer block并行:?
11 损失函数
KL散度,不对称:𝐾𝐿[𝑃(𝑋)||𝑄(𝑋)]=∑𝑥∈𝑋[𝑃(𝑥)𝑙𝑜𝑔𝑃(𝑥)𝑄(𝑥)]=𝐸𝑥∼𝑃(𝑥)[𝑙𝑜𝑔𝑃(𝑥)𝑄(𝑥)]
交叉熵:𝐻(𝑝,𝑞)=−∑𝑥(𝑝(𝑥)𝑙𝑜𝑔𝑞(𝑥)+(1−𝑝(𝑥))𝑙𝑜𝑔(1−𝑞(𝑥)))
12 优化器
Adam优化器
1. 优点
- 自适应学习率: Adam 通过计算一阶和二阶矩估计来为每个参数自适应地调整学习率。
- 偏差校正: 初始阶段梯度估计可能偏低,通过偏差校正可以加速初期的学习速率。
- 适应性强: Adam 在很多不同的模型和数据集上都表现出了良好的性能。
2. 缺点:超参数和过多的内存需要;
随机梯度下降
AdamW
显式权重衰减