LLM调研笔记

news/2024/7/20 19:25:08 标签: 大模型, LLM, 调研笔记

这里写目录标题

  • LLM调研
    • 1. 外挂知识库
    • 2. 微调数据
      • prompting和fine-tuning的对比
    • 3. NLP的发展
    • 4. 大语言模型的涌现能力
    • 5. 大模型的几个关键技术
    • 6. 数据预处理
    • 7. 主流架构
    • 8. 模型训练
    • 9. 大模型的微调
    • 10. 大模型的使用
    • 11. 大模型的评估

LLM_1">LLM调研

大模型的不足:在特定的专属知识领域,表现不尽人意

改进:

  • 外挂知识库:向模型提问时,额外给他一些专用知识的相关信息,让他找到正确答案。优点:快速实现。不涉及模型训练。缺点:效果上限较低
  • 大模型垂直领域训练:在专用知识上训练大模型,效果上限高,灵活性强,针对不同领域的知识做定制化训练和优化

微调的几种方法:

  • Freeze:冻结原有模型的大部分参数,只对小部分参数进行训练
  • LORA:在原有模型上新增额外的参数,原有参数冻结,仅训练新增的参数

RLHF:基于人类反馈的强化学习

通过精细设置的海量例题,引导模型做出更符合我们期望的回答

teacher-student:训练一个teacher模型为student模型打分,student模型就是我们需要的精炼模型

具体做法:

  • 数据标注:准备一些问题,然学生模型给出多个答案,由标注员对这些答案排序
  • 打分模型训练:将问题和人工标注的答案排序输入给模型,让模型对各个答案打分,目标时让各个答案的分数排序和人工排序的一致
  • student模型训练:给student输入海量问题,让其作答,教师模型对答案评分,让学生模型根据教师模型的反馈进行自我更新、迭代

大模型训练的三个阶段:

  • 预训练:成百上千的数据预训练
  • 微调:针对专用领域或任务的少量数据进行训练
  • RLHF:通过精细准备的例题,让模型的回答更符合人类期望
  1. 垂直领域的数据较少,可以选择开源模型继续进行微调,实现较快,但是原有模型的通用能力会下降
  2. 垂直领域的数据较多,可以在base模型上继续预训练+微调

1. 外挂知识库

  1. 从知识库中挑选问题相关的内容,涉及对文档的加载,切分,向量化,相似度对比等操作
  2. 挑选出与问答内容相关的知识内容,输入给大模型,涉及prompt的编写

具体流程:

  1. 知识库文件转换为文本格式
  2. 文本分割
  3. 文本向量化(将分割好的文本转化为数值向量,方便计算文本相似度)TF-IDF ;word2vec;语言模型
  4. 文本存储(文本向量化后存储到数据库中),常见的有pincone, qdrant, waviate, milvus, chroma
  5. 问句向量化:采用知识库文本相同的向量化处理方式,将查询问题转化为语义向量,用于问题和知识库文本之间的相似度计算
  6. 从知识库文本中挑选top k个相关文本:信息检索的核心,通过余弦相似度、欧氏距离等计算方法,找出与问题向量最接近的文本向量,找到top k个相关文本
  7. 挑选的文本与问题合成为prompt输入给语言模型

具体的方案实现:

  • 模型的选择:开源or闭源 (Baichuan2 ChatGLM2 LLaMA2)
  • 模型应用开发工具:langchain

langchain把大模型开发应用的功能进行模块化的封装,提升开发效率:

  1. data augmented generation:额外信息的封装
  2. llms and prompts:封装对不同模型的管理和调用,提示词部分定义、封装了不同的提示词模板
  3. memeory:记忆模块,保存与模型交互时的上下文状态,处理长期记忆,获得更加准确的结果
  4. chain:针对不同应用场景,封装了对模型和多个组件的一系列调用
  5. agents:代理,执行任务的具体对象,调用上述组件完成任务

闻达:LLM调用平台,目标为针对特定环境的高效内容生成。

Quivr:专门面向知识库问答的开源解决方案,可以本地部署,开箱即用

2. 微调数据

两种形式:单轮对话或多轮对话

参数微调:全量参数微调(FFT FULL FINE TUNING)、部分参数训练(PEFT Parameter-Efficient Fine Tuning): LORA/QLORA、P-TuningV2

FFT的问题:训练成本高,容易导致灾难性遗忘,微调注入的领域表现变好,但是原来表现好的领域可能效果变差

监督式微调:SFT

人类反馈的强化学习微调:RLHF

基于AI反馈的强化学习微调:RLAIF

微调平台

LLaMA-Efficient-Tuning.

LLaMA Factory

ChatGLM2-6B 微调完整的代码地址为:
https://github.com/SpongebBob/Finetune-ChatGLM2-6B

LoRA微调框架是alpaca-lora

先验知识

可以使用huggingfaceTrainer API进行模型微调,例如:

Fine-tune a pretrained model (huggingface.co)

使用自己的数据集使用huggingfaceTrainer API进行微调的步骤:

https://zhuanlan.zhihu.com/p/66

一些开源微调模型

Chinese-LLaMA-Alpaca

prompting和fine-tuning的对比

  • 首先有一点很重要的是:普通的prompt可能造成吞吐量很高,比如你只是说了一句:“please think step by step and you may ask yourself some subquestions to solve this math word problem”,它就会输出很长一段文本,但是你知道调用GPT-4是按照token数计数的,它会很烧钱。。。
  • fine-tuning则不一样,只要你准备好了微调的训练数据,后期只需要让chatGPT生成数学题的答案即可,而不需要很多中间推理过程,省了很多钱。。。
  • 其次,chatGPT直接进行prompt的话,它有时候会忘记你的数据或提示词,可能会胡乱地给你一些东西,它更适合一些泛化的任务
  • fine-tuning则不一样,它可以很稳定地在你自己的数据集或任务上进行稳定的输出,只要你的微调训练数据是高质量的
  • 微调非常适合用于特定领域的任务求解,比如math word problems

一些有趣的问题:大模型的微调多少个epoch不会过拟合? 大模型的微调一般训练多少epoch不会过拟合?

百万数据量:1个epoch

几千上完的数据量:1-3个epoch

结合验证集的loss来做early stop

微调出效果的关键是在数据上,可能95%的效果取决于你得数据,剩下的5%在于你不要用错误的参数来破坏数据,如果不是为了刷榜没必要去追求一个最优的参数组合。你可能觉着你得训练数据里面只有几条脏数据,对大模型来说根本无所谓,但是可能就因为这些少量的脏数据影响了整个模型的效果。不必追求完美的学习率,因为它并不存在。只需要朝着正确的方向努力,如果数据集好的话,大部分时间你都能达到预期的效果。

  1. 你无法在13b上微调出100%可靠的微调模型。你会接近最优解,但是它时不时的就会给你一些胡说八道的结果。33b则会好很多,不幸的是,在家用显卡上训练33b并没有多大意义,因为你必须量化来进行推理,但是这样基本上是在破坏模型。至少需要48GB的内存才能训练33b,并进行适当的微调。
  2. 在能够处理多个batch,梯度累积可能会降低质量,可能存在某个最佳点。当然,bs大小为1且梯度累积为32时,会比bs大小为1且梯度累积为1时效果更好。
  3. 数据集的大小在对基础模型进行微调时很重要,但在对已经进行过良好微调的模型(chat版)进行微调时,重要性较小。实际上,有时候较小的数据集效果更好,否则可能会破坏之前的微调效果。
  4. alpha = 2x rank似乎没有太多意义,它只是乘以权重而已
  5. 常用的是warmup,预热1个epoch,然后余弦下降到下一个1- x个epoch。
  6. rank实际上就是可训练参数的数量,不需要试图找到其他含义(风格vs知识)。就像使用100万像素和1600万像素拍摄的照片一样,你总是可以看到整个画面,但在100万像素的照片上,细节非常模糊。

3. NLP的发展

  • 统计语言模型(SLM):基于马尔科夫假设建立词预测模型,遭遇维度灾难,当词较多时,独热编码的维度会非常大,使得模型难以训练
  • 神经语言模型(NLM):通过引入分布式词向量来表征单词。word2vec通过一个浅层的神经网络(分为CBOW和Skip-gram两种方式)来学习分布式单词的表示。从而在向量空间中,可以通过语义的叠加和删减从一个单词得到另外一个单词(比如:皇后-女性=国王)
  • 预训练模型(PLM):由于transformer架构的出现,其优越的并行能力和注意力机制,ELMO,BERT的预训练-微调范式(在下游的分类头或其他适配器上进行参数训练)极大的提高了模型在各类NLP任务中的性能。
  • 大语言模型(LLM):随着模型参数的疯狂扩大,基于decoder的GPT-3.5开始在复杂任务上展现了优越的性能,涌现能力。同时上下文学习ICL和思维链COT的特点,使得大模型在更多未知的复杂任务上表现出色

4. 大语言模型的涌现能力

  • 上下文学习:ICL能力,具体来说就是为LLM提供特定的指令和几个任务实例,LLM就可以通过完成输入文本的单词预测来完成上下文场景中的任务
  • 指令遵循:通过prompt使得模型具有完成新任务的能力
  • 逐步推理:COT能力,最早发现在prompt中加上”think step by step“,则模型的复杂推理能力(比如数学应用题)则会有改善

5. 大模型的几个关键技术

  • 模型的扩展:更大的模型+更多数据=更强大的能力。(高质量的预训练数据集,attention的计算方法)
  • 模型的训练:在可行的时间内,成功的训练模型。(分布式并行训练,混合精度训练)
  • 模型的能力引导:设计合适的prompt和ICL使得模型在特定任务上表现更好
  • 模型的对齐微调:RLHF/RLAIF,通过对齐微调使得模型的输入符合人类的期望,过滤屏蔽掉有害的输出
  • 模型的工具使用:instructGPT,利用外部工具(比如计算器,网络搜索工具)等弥补大语言模型的缺陷
  • 多模态大模型的构建:使得模型能够识别其他模态的含义并做出相应操作(图像,语音,视频)

6. 数据预处理

适当的对话文本数据可以增强LLM的对话能力。过度的对话文本数据会导致陈述性指令和疑问句的输入,被认为是对话的开始,使得指令有效性下降。

数据的质量过滤:使用高质量数据集作为正样本,采样候选样本数据作为负样本来训练二元分类器,衡量数据的分数进行数据的过滤

数据的分词:使用专门为预训练语料库设计的分词器会效果更好

高质量的数据是模型训练能否成功的重中之重

7. 主流架构

encoder:GLM, PaLM

decoder:GPT

encoder-decoder:T5, BART

  • 标准化:LN的位置:前置LN可以实现更稳定的训练,但是会带来一定的性能损失。Sandwich-LN, RMS Norm, DeepNorm
  • 激活函数:广泛使用GeLU作为激活函数。其变体SwiGLU, GeGLU在实践中可以获得更好的性能
  • 位置编码:RoPE中键和查询之间的分数可以使用相对位置信息计算,有利于建模长序列,被应用于新LLM
  • 注意力机制:稀疏注意力机制(分解注意力)复杂度更低

建议采用前置的RMS进行层标准化、选择SwiGLU或GeGLU作为激活函数。位置编码采用RoPE或ALiBi(长序列中表现更好)

8. 模型训练

对于预训练而言

batch_size尽量大(2048-成千上万)

学习率:先预热warm-up,再衰减decay

优化器:Adam/AdamW优化器

为了学习稳定会广泛使用权重衰减(衰减率设置为0.1)和梯度裁剪(阈值设置1.0)

三种并行方式:

  • 数据并行:(适用于模型较小,单卡可以训练的情况下,提升训练效率)将模型参数和优化器状态复制到多个GPU上,数据划分后并行的放到每个GPU上,进行前向计算和反向传播。各GPU中计算的梯度统一传输到一个GPU上进行梯度的聚合和更新,并复制更新的参数到每个GPU的模型中。
  • 模型并行:(适用于模型较大,单卡无法放下整个模型的情况,GPU利用效率可能降低)将模型不同层放在不同GPU上,使得多卡可以训练一个较大的模型。
  • 张量并行:将参数矩阵分解为子矩阵,使得LLM可以在多个GPU上加载

加快训练速度的方法:

  • ZeRO技术,DeepSpeed库提出,专注于解决数据并行中的内存冗余问题。
  • 混合精度训练:全精度和半精度混合,可以大大提高训练效率

9. 大模型的微调

指令微调和对齐微调:前者为了增强大模型的能力,后者为了规范大模型的输出

  • 指令微调:PromptSource众包平台,指令的多样化比实例数量更加重要。重用现有的格式化的数据集,利用LLM来自动构建指令

指令的微调策略:可以视为一个有监督的训练过程,但是和预训练不同,其损失函数(序列到序列的损失),优化参数(更小的批次和学习率)。常常我们会混合几个数据集的数据后按比例来采样指令实例使得其多样性更好。

  • 对齐微调:为了规范大模型的行为(大模型的幻觉,编写虚假信息,产生有害的,或者误导性,有偏见的表达)。但是对齐微调可能会损害大模型的通用能力。常用的方法是RLHF,RLAIF。

一些微调的方法:

  • 适配器微调:在transformer模块中引入适配器(小型的神经网络模块,一般包含非线性变换),一般放在注意力层和前馈层的后面,微调时,冻结原有的参数,仅仅训练并更新适配器的参数
  • 提示微调:P-Tuning,主要是在输入层加入可训练的提示向量
  • 前缀微调:在每个transformer模块前添加可学习的连续向量,使得其具有任务的特异性
  • 低秩微调:LoRA通过添加低秩约束来近似每层的更新矩阵。将参数的更新抽象成近似参数更新矩阵,先缩小再放大,从而大大节省存储成本

10. 大模型的使用

主要是通过设计合理的prompt来激活LLM解决各类问题的能力

当前研究的主流能力为上下文学习和思维链提示

  • ICL(in-content-learning):prompt = task description + true instance + task instance:基于任务范式,LLM可以在没有显示梯度更新的情况下执行新任务。(示范instance的选择、格式、顺序(倾向于重复示范结尾的答案)都是ICL能否成功的关键)
  • COT(chain-of-thought): 将相似问题的解决的步骤给出,使得LLM获得复杂问题的推理能力。分为few-shot和zero-shot

11. 大模型的评估

  • 语言生成
    • 语言建模:关注基本的语言理解和生成能力。perplexity困惑度是重要的衡量指标,用于评估零样本情况下模型的性能
    • 条件文本生成:在给定条件(任务)下生成满足需求的文本。包括机器翻译、文本摘要等任务。通常使用自动化指标(包括准确率、BLEU, ROUGE)和人类评分来评价LLM的生成结果
  • 知识利用
    • 闭卷回答:从预训练得到的知识,基于给定的上下文回答问题
    • 开卷回答:可以基于外接知识库或者搜索引擎来回答问题
    • 知识补全:类似完型填空来补全句子,使其符合事实或者逻辑
  • 复杂推理
    • 知识推理:
    • 符号推理:
    • 数学推理:

参考文献:RUC赵老师组的大模型综述(中英双版,非常nice,推荐阅读)


http://www.niftyadmin.cn/n/5287950.html

相关文章

手把手带你死磕ORBSLAM3源代码(十)System.cc System类代码分析

目录 一.前言 二.代码分析 2.1 引用头文件 2.2 静态成员变量 2.3 System函数 一.前言 这部分代码介绍引用头文件以及System类的函数定义文件。 二.代码分析 2.1 引用头文件 #include "System.h" #include "Converter.h" #include <thread> #…

Stable Diffusion模型原理

1 Stable Diffusion概述 1.1 图像生成的发展 在Stable Diffusion诞生之前&#xff0c;计算机视觉和机器学习方面最重要的突破是 GAN&#xff08;Generative Adversarial Networks 生成对抗网络&#xff09;。GAN让超越训练数据已有内容成为可能&#xff0c;从而打开了一个全新…

SpringBoot实用开发(二)-- Redis客户端选择

目录 引言: Redis客户端切换成jedis客户端技术操作步骤,具体如下: 1.在pom.xml文件里,导入jedis坐标

网页乱码问题(edge浏览器)

网页乱码问题&#xff08;edge&#xff09; 文章目录 网页乱码问题&#xff08;edge&#xff09;前言一、网页乱码问题1.是什么&#xff1a;&#xff08;描述&#xff09;2.解决方法&#xff1a;&#xff08;针对edge浏览器&#xff09;&#xff08;1&#xff09;下载charset插…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

小区物业大数据监控服务平台(PSD文件资料)

现分享简约物业大数据平台页面、小区物业大数据监控服务平台模版的UI源文件&#xff0c;供设计师们快速获取PS源文件完成工作。 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#xff1a;200套精选数据可视化大屏&#xff0c;大屏PSD设计&#xff08;各行业大屏…

Linux:查询当前进程或线程的资源使用情况

目录 一、/proc/[PID]/下的各个文件1、proc简介2、/proc/[PID]/详解 二、通过Linux API获取当前进程或线程的资源使用情况1、getrusage2、sysinfo3、times 在工作中&#xff0c;我们排除app出现的一些性能/资源问题时&#xff0c;通常要先知道当前app的资源使用情况&#xff0c…