大模型面试题(二)

提前讲一句,面试题是从小红书等平台找到的,只是对部分答案进行了完善,并添加了一些拓展

1.LlaMa输入句子长度理论上可以无限长吗?

理论上,LlaMa (Large Language Model)和其他大型语言模型的输入句子长度不能无限长。这是因为模型的架构(例如,Transformer架构)通常包含一个固定的最大序列长度限制,这个限制由模型在训练时确定。这个限制是因为模型需要在内存中存储序列的表示,而内存是有限的资源。

2.什么是LLMs复读机问题?

LLMs (Large Language Models)的复读机问题是指模型在生成文本时倾向于重复相同的短语或句子的现象。这种问题通常在生成较长文本时更为明显,可能导致生成的内容缺乏多样性,影响阅读体验和信息的准确传递。

3.为什么会出现LLMs 复读机问题?

  • 训练数据的冗余性︰如果训练数据中存在大量的重复内容,模型可能学会这种重复的模式,并在生成文本时倾向于复制这种模式。
  • 模型架构和训练限制︰某些模型架构可能不足以完全理解或保持长期的文本依赖关系,导致在尝试生成连贯内容时重复较为简单的短语或句子。
  • 优化目标︰在训练大语言模型时,通常使用一种称为最大化概率(Maximum Likelihood Estimation,MLE)的目标函数。模型会试图找到最大化下一个词/字符的概率的参数组合。这可能导致模型在生成文本时过度关注训练数据中的冗余和重复信息。

4.如何缓解LLMs复读机问题?

  • 修改训练数据:减少训练数据中的重复内容,增加文本多样性。
  • 改进模型架构:采用能够更好处理长期依赖关系的模型架构,如Transformer-XL、 Sparse Transformer等。
  • 使用解码策略:在文本生成阶段采用特定的解码策略,如温度调节、Top-K采样或核采样(nucleus sampling),以增加生成文本的多样性。
  • 添加惩罚机制:在生成过程中对重复内容添加惩罚,减少生成相同短语或句子的概率。

拓展:

(1)什么是解码策略:生成的下一个单词存在概率分布,如何选择下一个单词

(2)各种方法

注:以下关于解码策略的图非自创,来自公众号看个通俗理解吧

1>Standard Greedy Search:挑选概率最高的词去输出。

缺点:当整个句子(多个词汇)输出完毕,不能保证这整个句子就是最好的。(符合贪心,局部最优未必全局最优)

2>Beam Search:每一步挑选多个单词,到最后选概率最大的那句

缺点:可能有句子重复;当想要的k很大时(k指我们想要同时观察k个分数最高的生成结果)运算资源的需求也会变大;模型生成的文本比较枯燥、无趣。

3>Sampling

使用采样的方法可以让生成的文本更加多样化。可以按照当前的概率分布来进行采样。模型认为合理的词(概率大的词)有更大的几率被采样到。

缺点:产生随机文本,或者生成的句子不流利。

4>Top-K Sampling

为了缓解Sample方法的问题,可以限制采样的范围。

5>核采样(nucleus sampling,also called Top-P sampling)

这种方法的提出在于Top-K采样对范围的严格限制存在缺点:

  • 第K位之后的词也有可能是概率值并不算小的词
  • 第K位之前的词也有可能是概率值并不算高的词,这些词很有可能会降低文本质量

在Top-p方法中,通过设置一个阈值(P)来让取词的范围可以动态地自动调整:把排序后的词表从概率值最高的开始算起,一直往后累加,一直到累加的概率总值超过阈值p为止。在阈值内的所有词便是采样取词范围。

6>Sampling with Temperature

Temperature 采样受统计热力学的启发。可以通过将 logits 除以温度来实现温度采样,然后将其输入 Softmax 并获得采样概率。

logits解释:

在概率模型中,logits指原始的、未归一化的模型预测值。

举例来说,在一个分类任务中,如果有三个类别,模型输出的logits可能是一个包含三个值的向量,比如[1.2, -0.5, 0.8]。这表示模型对每个类别的置信度,但这些值还没有被归一化为概率分布,因此不能直接解释为类别的概率。

Temperature 采样中的温度与波兹曼分布有关,其公式如下所示:

通常来说,温度与模型的“创造力”有关。但事实并非如此,温度只是调整单词的概率分布。其最终的宏观效果是,在较低的温度下,模型更具确定性,而在较高的温度下,则不那么确定

总结:温度越高,概率分布越趋向于均匀分布,输出越随机

openai官方参数举例:temperature&top_p

response = client.chat.completions.create(
        model=model,
        # 以下默认值都是官方默认值
        temperature=1.8,        # 生成结果的多样性 0~2之间,越大越随机,越小越固定
        seed=None,              # 随机数种子。指定具体值后,temperature 为 0 时,每次生成的结果都一样
        stream=False,           # 数据流模式,一个字一个字地接收
        top_p=1,                # 随机采样时,只考虑概率前百分之多少的 token。不建议和 temperature 一起使用
        n=1,                    # 一次返回 n 条结果
        max_tokens=100,         # 每条结果最多几个 token(超过截断)
        presence_penalty=0,     # 对出现过的 token 的概率进行降权
        frequency_penalty=0,    # 对出现过的 token 根据其出现过的频次,对其的概率进行降权
        logit_bias={},          # 对指定 token 的采样概率手工加/降权,不常用
    )

关于解码策略的代码,个人觉得要用的时候去hugging face之类的地方找再现学就好,先熟悉概念

5.什么情况用Bert模型,什么情况用LLaMA、ChatGLM类大模型,怎么选?

Bert模型:适合于需要理解文本含义的任务(NLU),如文本分类、命名实体识别、问答系统等。BERT的双向训练机制使其在理解上下文中的词义方面表现优秀。因此,当任务需要深入理解文本内容时,BERT是一个好选择。
LLaMA、ChatGPT类大模型:适用于需要生成文本、维持对话、翻译或其他需要大量常识和语言生成能力的任务(NLG)。这类模型通过在大规模数据集上的预训练获得了广泛的知识和强大的语言理解及生成能力。当任务需要模型生成连贯、相关且富有创造性的文本时,选择LLaMA、ChatGPT类大模型更为合适。
在选择模型时,应考虑任务的具体需求、模型的能力限制、计算资源和部署成本。Bert模型在理解特定任务的文本时可能更高效,而LLaMa、ChatGPT类模型则在需要广泛的常识知识和文本生成能力时展现优势。

6.fp32和fp16的区别,混合精度的原理

FP32和FP16是浮点数的两种格式,分别代表32位和.16位浮点数。FP32 (单精度浮点数)提供较高的数值精度,但占用更多的内存和计算资源。FP16 (半精度浮点数)虽然数值精度较低,但能减少内存占用和加速计算。
混合精度训练的原理:结合了FP32和FP16,利用FP16进行前向传播和反向传播中的大部分计算,以加速训练过程和减少内存使用,同时利用FP32来累积梯度、更新权重,保证训练稳定性和模型精度。这种方法可以显著加速训练过程,同时减少对计算资源的需求。

混合精度的问题:由于半精度浮点数精度较低,可能会引入一定的数值误差,从而影响模型的准确性。因此,在使用混合精度训练时,需要权衡计算效率和模型准确性之间的关系。

在实际应用中,混合精度训练通常与模型量化技术结合使用。模型量化是指将模型中的权重和激活值从高精度转换为低精度数据类型,从而进一步压缩模型并降低存储和计算成本。PyTorch提供了量化感知训练(quantization-aware training)功能,允许在训练过程中同时进行混合精度训练和模型量化,从而实现更高效的模型训练和部署。

在实际操作中,可以根据具体情况选择合适的混合精度配置。例如,可以使用float16进行前向传播和损失计算,而使用float32进行反向传播和参数更新。这种配置可以在保证足够精度的同时提高计算效率。另外,为了获得更好的性能,还可以尝试不同的优化器和超参数配置,以找到最适合自己任务的设置。

ps:

(1)很难理解的是,自己电脑的gpu配置比较低,RTX1650架构是Turing的,跑官方示例用上混合精度会慢特别多,但是混合精度是支持Turing的,在满足官方所说的尽可能不爆显存的条件下喂饱gpu,没加速反而起反作用了

(2)使用另一个自定义神经网络训练Cifar公开数据集,测试下也没有明显加速,这里自己的实验没有体会到amp的用途

(3)训练yolov8模型的时候,如果开启amp,各种loss又都是0,关闭之后就正常了。

总之目前来说,混合精度训练个人没有体会到用途,之后再探索吧


7.深度学习中数据不均衡怎么处理

数据不均衡是指在深度学习中,训练数据集中各个类别的样本数量不同,有些类别的样本数量非常多,而另一些类别的样本数量非常少。这种情况下,模型可能会对数量较多的类别产生偏好,从而在预测时对数量较少的类别表现不佳。处理数据不均衡的方法:

(1)重采样:过采样少数类(增加少数类别的样本数量)或欠采样(减少多数类别的样本数量)多数类。

过采样可以通过对少数类进行数据增强以增加其样本或合成新的样本(如使用SMOTE算法)实现;欠采样可以通过随机删除多数类别的样本实现。欠采样可能会导致信息丢失,而过采样可能会导致过拟合。

(2)改变损失函数:为了平衡各个类别的重要性,可以在损失函数中为少数类别分配较大的权重。这将使得模型在训练过程中更关注少数类别的样本。常用的方法有加权交叉熵损失函数Focal Loss

(3)集成学习:将多个基础模型组合在一起,提高预测性能。在处理数据不均衡问题时,可以使用Bagging或Boosting等集成方法,通过训练多个模型对样本进行预测,然后对预测结果进行投票或平均。

(4)迁移学习:在大型数据集上预训练模型,然后将模型应用于目标任务。这种方法可以利用预训练模型学到的特征表示,提高模型在目标任务中处理数据不均衡问题的能力。

(5)评估指标选择:在存在数据不均衡的情况下,使用准确率作为评估指标可能会产生误导。因此,可以使用其他指标,如精确率、召回率、F1分数或AUC-ROC曲线等,来更准确地衡量模型在各个类别上的表现。

8.lora的矩阵怎么初始化?为什么要初始化为全0?

LoRA(Low-Rank Adaptation)是一种参数高效的微调方法(PEFT,Parameter Efficient Fine-Tuning),它通过引入低秩分解来降低需要更新的参数数量。

在预训练模型的参数矩阵上添加低秩矩阵(A X B)来实现模型的适应性调整,只训练 A,B,而不是直接修改原有的权重。

理论上可以把上述方法应用于 Transformer 中的任意参数矩阵,包括 Embedding 矩阵,通常应用于 Query, Value 两个参数矩阵。

LoRA的矩阵通常初始化为全0的原因:可以在训练初期保持预训练模型的行为不变。这种零初始化方法确保了微调过程中模型的稳定性,允许微调仅在必要时引入变化,减少了对预训练模型性能的负面影响,同时使得模型能够更平滑地适应新的任务或数据。这种方法特别适用于只希望对模型进行微小调整的场景。


关于lora,github上有一个项目针对ChatGLM3的实验GitHub - agiclass/fine-tuning-lab at v3

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值