作者 | Codering 整理 | NewBeeNLP https://zhuanlan.zhihu.com/p/686761933
大家好,这里是 NewBeeNLP。今天分享大模型面试相关知识点,持续更新。
1. RAG技术体系的总体思路
数据预处理->分块(这一步骤很关键,有时候也决定了模型的效果)->文本向量化->query向量化->向量检索->重排->query+检索内容输入LLM->输出
2. 使用外挂知识库主要为了解决什么问题
3. 如何评价RAG项目效果的好坏
针对检索环节的评估:
针对生成环节的评估:
4. 大模型的幻觉问题、复读机问题是什么
幻觉问题:即生成的内容是无意义的或不忠实于提供的源内容
复读机问题:重复生成某些话
5. 针对问题4,有没有什么解决办法
针对幻觉问题:引入外挂知识库,加入一些纠偏规则,限制输出长度等
针对复读机问题:
6. 出现问题4的原因有哪些
针对幻觉问题:幻觉问题主要分为两大类,一类是生成结果与数据源不一致,自相矛盾。另一类是用户问题超出了大模型的认知。针对前者可能是训练数据和源数据不一致、数据没对齐或者编码器理解能力的缺陷和解码器策略错误可能导致幻觉。后者则是用户的问题不在语言模型认知范围内。
针对复读机问题:数据质量不高,存在大量单一、重复文本,文本过长(补充:当你的前面的条件文本过长时,大模型的输出的几个短文本会被原始的很长的条件文本淹没,继续预测下一个token的话,在模型看起来可能条件仍然是差不多的,此时如果使用greedy search,只选择概率最大的一个token,模型极大可能会将前面已经生成的短文本重新预测成概率最大的文本,以此类推,会一直重复下去。)
7. 当前主流的开源大模型是哪个,其架构具体是怎样的?
当前开源影响范围最广,生态建设最好的开源大模型是Meta的LLaMA。其依旧采用Transformers架构,并做了如下改动:
8. 有哪几种SFT方法
(SFT时,学习率设置为预训练阶段的10%,一般会取得不错的效果)
9. 什么是lora微调
在原始 PLM (Pre-trained Language Model) 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的 intrinsic rank。训练的时候固定 PLM 的参数,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将BA与PLM的参数叠加。用随机高斯分布初始化A ,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是 0 矩阵。
10. RAG的检索阶段,常见的向量检索模型有哪些?
ANN算法
KD树
11. 针对通用的RAG,你觉得还有哪些改进点?
12. 什么是LangChain
LangChain为大型语言模型提供了一种全新的搭建和集成方式,通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。有点类似于神经网络开发与tensorflow/pytorch之间的关系
13. LangChain的常用模块有哪些?
14. SFT和RLHF优劣对比
方法 | 优点 | 缺点 |
---|---|---|
SFT | 1. 启动简单,仅需要问答对数据就可以进行训练; | |
2. 训练简单,直接对LLM进行调参,大部分情况下,训练几个epoch就可达到预期; | ||
3. 显存资源相比于RLHF来说耗费低 | 1. 模型的效果非常依赖于SFT数据的质量,天花板取决于SFT数据标注的质量; | |
2. 对标注要求高,对一条指令来说,要标注很高质的回答其实是一件非常困难的事情,既耗时又耗力。 | ||
RLHF | 1. 直接利用人类偏好来进行指导大模型的训练,使大模型的输出更能满足人们的要求; | |
2. 在安全性和事实性上,都能有很大的提升。 | 1. 训练消耗大量的显存;2. 训练的过程中很不稳定,想要成功的完成PPO的训练不是那么容易的事情;3. 除了SFT阶段的数据,还得标注Reward model的数据。在对齐人类偏好的过程中,标谁更好比较容易,但是想标谁比谁好多少,又差多少,这不是件容易的事情。be |
本答案引用自文章(https://zhuanlan.zhihu.com/p/677341520)
15. 详细介绍一下RLHF
留个坑,改天详细歇一歇
16. 大模型训练经常出现一些OOM问题,在现有硬件基础下,有什么性能提升trick
梯度累积
17. LLaMA模型输入句子理论上可以无限长吗?
不可以
18. 如何让大模型处理更长的文本?
19. 大模型推理时,显存中有那几部分数据?
20. 介绍下ChatGLM
首先要说起它的基座 GLM, GLM 既可以做 Encoder 也可以做 Decoder。
主要通过 两种mask方式来实现:
在chatglm里面做生成任务时,是用 [gmask]。chaglm2中完全采用 gmask来进行预训练。
在ChatGLM 的内部结构中的变换,从下到上依次是:
在ChatGLM 2.0 中还添加了一些其他变化:
21. 介绍下GLU激活函数和SwiGLU激活函数
GLU 的核心思想是通过门控机制来过滤信息,进而提高网络的表达能力和泛化能力。(门控机制有助于长距离建模)
SwishGLU 的核心思想是将 Swish 和 GLU 结合起来,SwishGLU 实际上只是多乘了一个 g(x)。
22. LLaMA1/2的异同
首先从数据角度,lamma2.0为2.0T, lamma1是1.4T。其次是上下文长度, lamma1是2k,lamma2是4k。
最后从模型架构角度:
从整体上看,二者都遵循自回归 Transformer 的架构,只不过内部的细节有些不同。
23. 模型在训练和推理的时候各占用显存的多少?
一般来说,训练占用模型参数量的16倍大小(优化器、梯度、模型本身);推理占用模型参数量的2倍大小(fp16是一个单位参数大小对应两个字节,int8是一个单位参数大小对应一个字节)。
24. 详细说说Deepspeed的机制
以下内容引用自该篇文章
是一种数据并行的方法,采用的ring all reduce方式。
传统的parameter server是server和client的方式,client通过计算分配给自己的数据,产生梯度,传给server,server做聚合,然后把聚合后的参数再传给client,这个方式的弊端是server容易成为瓶颈,server通信量太大。另外可能一个client失败,会导致其他client等待。
Ring all reduce是一种分布式的方式,各个节点分配通信量。总的通信量和ps没啥变化,但是通信的压力平摊到各个GPU上了,GPU之间的通信可以并行进行。
假如,GPU数量是N,把模型参数分成N份,每个GPU要存放整个参数。每个GPU也要分配训练数据。当一次迭代,N个GPU之间要经过一个scatter和gather操作,reduce-scatter是将不同gpu上对应的参数的gradient相加,一共需要通讯(N-1)次。All-gather 是将合并完整的参数,传到其他gpu上,需要通讯(N-1)次。一次all reduce,单卡通信量为2*sita。
Zero包括3种方案,逐步递进:
zero1:将adam的参数分割成N份,这样一个GPU上只能保存一份adam参数:这对于forward没啥影响,gradient需要进行一次all-reduce,但是只能更新一部分参数,所以W需要进行一次all-gather,通信量为3N*sita,存储为 12*sita/N + 4*sita
zero2: 将adamw,gradient都分割成N份,梯度就不需要all-gather了,只需要scatter了,w需要all-gather,通讯量为2N*sita
zero3: 将参数,adam 和gradient都分割,forward的时候,需要将w all-gather,backfoward时,还需要把w all-gather回来,计算梯度,丢掉不属于自己的w,然后对梯度做reduce scatter,更新w,通讯量为3N*sita。
最后采用采用stage3:用1.5倍的通讯开销,换回近120倍的显存
另外,还有ZeRO-Offload是基于Zero2,将adam和gradient放到内存中,在cpu内起了N个线程计算。其中的一条主线是gradient总是需要scatter的,感觉这个数据并行标志。这里需要注意一点 不管是forward 还是backward,都是需要有完整的w的。另外有了gradient,以及adamW的参数,才能更新W。
25. 什么是混合精度训练
FP64用8个字节共64位,FP32用4个字节共32位,FP16用2个字节共16位。在神经网络模型的训练过程中,通常默认使用单精度(FP32)浮点数据类型来表示网络模型的权重和其他参数。
为什么需要混合精度训练呢?
使用FP16训练神经网络,相比使用FP32有以下优点。
但是使用FP16也会带来一些问题,主要有两个方面:
为了利用FP16的优势,提高深度学习训练的效率和性能,同时避免精度溢出和舍入误差的影响,可以采用FP16和FP32的混合精度训练,主要涉及到一下三个重要技术点:
26. 什么是prefix LLM和casual LLM
prefix LM:token可以相互看到,输入双向注意力,输出单向注意力(ChatGLM、ChatGLM2、U-PaLM)
casualLM:严格自回归,从左到右的单向注意力 (LLaMA-7B、LLaMa 衍生物、Qwen)
27. 说一说针对MHA后续的一些计算优化工作
FlashAttention涉及到很多计算trick,有空单独开一篇文章来说
28. 说说attention几种常见的计算方式