1.1什么是大模型?
大模型LLM是large language model是指基于深度学习技术的大规模人工智能模型,有非常庞大的数据规模和训练数据量,可以在多种任务中表现出高度的通用性和卓越性能。
例如OpenAI的GPT-4模型拥有数千亿级别的参数。
训练数据来源于互联网海量数据,涵盖多种语言,多种领域和不同的任务。
1.2如何展现大模型通用性?
大模型并不是针对特定任务设计的,而是在训练后通过微调(Fine-tuning)或者提示学习(prompt Learning)适应不同的任务,例如文本生成、翻译、代码编写、图像生成等。
1.3如何定制大模型?用到的技术主要是什么?
①定制大模型是指针对特定应用场景或需求,
对已有的大规模预训练模型进行优化、微调或改造,
以实现更高效、更贴合需求的性能。
②微调 (Fine-Tuning)
例如:LoRA (Low-Rank Adaptation):添加低秩矩阵更新,降低微调复杂度。
知识蒸馏 (Knowledge Distillation)
将大模型的知识传递给小模型,保留性能的同时降低计算成本。
多模态扩展
将文本模型扩展到处理图像、音频、视频等多模态数据。如结合视觉模型(如CLIP)、音频模型(如Whisper)。
增强学习(Reinforcement Learning)
RLHF (Reinforcement Learning with Human Feedback):通过人类反馈优化模型行为。例如,用于改进对话质量、消除有害内容。
1.4有什么参调方法呢?
①全参数调整(Full Tuning)
对大模型所有参数进行更新,可以根据需求对模型进行彻底调整,但是计算和存储成本太高。仅适用于需要精细化调整的高价值任务,例如医学诊断或者金融分析。
②参数高效微调Parameter Efficient Fine-tuning (PEFT)
简称:微调(Fine-Tuning)
适配器方法(Adapter Tuning)
在模型中间层插入小型神经网络模块,仅仅微调这些模块的参数,这样调整量小,节省资源。但需要不同任务不同设计。
例子:一个由2个全连接层和非线性激活组成的适配器,添加到transformer中。
1.5什么是LoRA(Low-Rank Adaptation)?
原本要训练W这么多的参数,
现在只用训练A和B的参数了,A和B的秩很小,所以其组成的适配器需要训练的参数很少,就降低了计算和存储成本。
例如,使用Adam对GPT-3: 175B进行微调,与使用LoRA进行微调,可训练参数减少10,000倍和GPU内存需求减少3倍。
1.6如何通过LoRA进行微调?
首先,选择一个预训练的基础模型。
其次,选择一个要进行微调的层,例如Transformer的attention层。
然后,引入低秩矩阵对原来的权重矩阵W,进行低秩分解,让W’=AXB近似于W,X代表矩阵乘法。
然后,对矩阵进行微调。冻结原始权重矩阵W。使用目标用例数据,仅更新低秩矩阵A和B。
然后,评估调整后的模型性能,超参数调优,模型评估。
最后,对模型进行部署和监控。
1.7什么是量化低秩适应(QLoRA)(Quantized Low-Rank Adaptation)?
将LoRA与量化相结合,优化内存使用和计算效率。
添加少量可训练的参数,同时保持原始参数冻结。
QLoRA通过将转换器模型量化到4位精度,并使用分页优化器处理内存峰值,来改进LoRA。
1.8什么是前缀调优(Prefix Tuning)?
一种通过在模型输入前,添加一系列可学习向量(前缀),来微调大型预训练模型的技术。
修改输入表示,而不是模型的内部参数,使其成为一种轻量级和高效的微调技术。
1.9什么是提示优化(prompt Tuning)?
提示优化是一种使用提示 来指导模型行为的技术。
提示可以是静态的(固定文本),
也可以是引入输入序列的动态的(可学习的嵌入)。
修改模型的输入上下文以指导它的响应,而不更改模型的内部参数。
前缀调优使用可学习的向量(不是实际的文本),而提示调优可以使用固定的文本提示或可学习的嵌入。
1.10 什么是过拟合?
记忆了过多的不必要的细节(偶然的、不重要的噪声),从而导致处理新数据时候,表现得不好。
1.11JSON和JSONL介绍
Javascript Object Notation 使用键值对来表示数据
通常包含一个对象(用{}表示),
键一般是字符串(“age”),
中间用冒号连接(:)
值可以为数字(30),字符串(“Zhang San”),boolean值(false),数组([“Chinese”,”Math”,”English”]),或者另一个对象。
JSON Lines
可以处理大型数据集
一行一个json
{“name”:”zhangsan”,”age”:18}
{“name”:”LI SI”,”age”:27}
1.12 主流数据集格式?
1.12.1.Alpaca
包括instruction、input、output、system、history组成
人类指令、人类输入、模型回答、提示词、历史消息记录表
更具体的可以看官方文档:
https://www.xfyun.cn/doc/spark/%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html#_1-alpaca%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E
例子:instruction为别人的话,output为甄嬛的话
数据来源:https://github.com/datawhalechina/self-llm/blob/master/dataset/huanhuan.json
例子
例子来源:https://github.com/datawhalechina/self-llm/blob/master/models/LLaMA3/04-LLaMA3-8B-Instruct%20Lora%20%E5%BE%AE%E8%B0%83.md
1.12.2.ShareGPT
人类指令、模型回答、可选的系统提示词、工具列表
来源:基于小说、剧本微调出个性化的聊天大模型
技术:大模型人格化:使得大模型在语言表达、行为模式和情感反应方面更加接近人类。
应用:1.客服机器人 2.AI老师 3.情感陪伴 4.内容创作
2.1相关资料
(1)项目背景参考
https://www.datawhale.cn/activity/110/21/78?rankingPage=1
(2)详细步骤参考
https://www.datawhale.cn/activity/110/21/76?rankingPage=1
2.2如何准备数据?
通过网络获得《甄嬛传》剧本数据,每一句的人物及对应的台词。
使用正则表达式或者其他方法进行快速的提取,并抽取出关注的角色的对话。
最后再将其整理成 json 格式的数据。
2.2.1 原始数据
如果没有台本的原始数据
可以通过LLM抽取对话
2.2.2.提取数据
2.2.3 处理结果
2.2.4正则提取
2.2.5 数据增强
利用两到三条数据作为 example 丢给LLM,让其生成风格类似的数据。
也可以找一部分日常对话的数据集,使用 RAG 生成一些固定角色风格的对话数据。
2.3如何微调?
定制一个自己的专属大模型最方便的步骤 ≈ 指定数据集 + 开源大模型 + 微调平台(如讯飞星辰Maas)
①选择基础模型
②选择微调方法
③上传数据集
2.3.1 参数调整
1.深度学习
学习率:控制每次迭代更新模型参数的步幅。较小学习率更新慢但精确,较大学习率训练速
度快但可能不稳定。
训练次数:建议根据数据规模设置合理的 epochs。
输入序列长度:模型输入序列的最大长度,短序列效率高,长序列适合上下文较多的任务。
2.LORA(低秩自适应)
LORA秩:决定模型更新参数的数量,影响计算量与性能表现。
·LORA随机丢弃:类似于正则化操作,避免过拟合,提升泛化能力。
LORA作用模块:主要在预训练模型的自注意力机制和前馈网络中进行权重适配。
LORA缩放因数:控制训练过程参数更新幅度,适配不同任务要求。
3.训练加速
Galore特性:通过低秩特性减少参数存储和计算量,提高模型加速效果。
BAdam特性:一种内存高效的优化算法,通过减少参数计算次数和内存占用,进一步提高
训练效率。
2.4如何评价生成结果?
人工评价:准确率、流畅度。
机器评价:BLEU分数、F1-score。
准确率 :计算模型生成的回答与真实回答的匹配度。
流畅度 :通过人工评估或使用语言模型评估生成文本的自然性。
BLEU分数 :用于评估生成文本与参考文本之间的相似度。
F1-score :用于评估模型在分类任务中的表现。
2.5如何优化?
通过以下方式优化微调方式及性能
(1)损失图 :绘制训练损失和验证损失的曲线图。
如果验证损失在训练损失持续下降时上升,可能表明模型过拟合。
(2)平衡语料比例 :根据原始语料和新添加语料的比例进行微调,防止模型过拟合。
可以采用如80%原始语料和20%新语料的比例开始。
2.6深入学习?
参考目录链接
https://www.datawhale.cn/activity/110/21/83?rankingPage=1
2.7《tianji blog:如何从零搜集网络数据形成训练语料》
如何建立自己的数据集
可以借助一个小工具:extract-dialogue 从文本中提取对话。
1.从原始数据中提取出角色和对话
2. 筛选出我们关注的角色的对话
3. 将对话转换成我们需要的格式
https://tianji.readthedocs.io/en/latest/finetune/get_finetune_data.html#
2.8《Chat-嬛嬛 是如何炼成的》
如何在自己的电脑进行训练,而非借助其他平台。
https://github.com/datawhalechina/self-llm/blob/master/examples/Chat-%E5%AC%9B%E5%AC%9B/readme.md
(3)加载 tokenizer 和半精度模型
模型以半精度形式加载,如果你的显卡比较新的话,可以用torch.bfolat形式加载。对于自定义的模型一定要指定trust_remote_code参数为True。
(4)定义 LoraConfig
模型类型,需要训练的模型层名字,秩,和lora_alaph
(5)自定义 TrainingArguments 参数
模型输出路径,每批训练数量,log输出步数,轮数,梯度检查(防止梯度爆炸或者梯度消失)
(6)使用 Trainer 训练
(7)保存 lora 权重
(8)加载 lora 权重推理
训练好了之后可以使用如下方式加载lora权重进行推理