大语言模型 --- 简历强相关

一、LLAMA

note: 对于给定的计算预算,最佳性能不是由最大的模型实现的,而是由在更多数据上训练的较小模型实现的。

1. 预训练数据:只使用公开可用的数据。

2. 架构:基于Transformer架构

2.1 预归一化 [GPT3]:

        为了提高训练稳定性,我们对每个transformer 子层的输入进行归一化,而不是对输出进行归一化。我们使用 RMSNorm 归一化函数。

        与layerNorm相比,RMS Norm的主要区别在于去掉了减去均值的部分,作者认为这种模式在简化了Layer Norm的同时,可以在各个模型上减少约 7%∼64% 的计算时间。

Pre-Norm/Post-Norm 对比:

  • Post-Norm会削弱残差的作用,深度保持,但是收敛和调参困难
  • Pre-Norm会将网络变成浅且宽的结构,收敛容易,但是精度会有一定损失

2.2 SwiGLU 激活函数 [PaLM]: 用SwiGLU 激活函数替换 ReLU 非线性以提高transformer中的FFN(feed-forward network)层性能。SwiGLU结合了SWISHGLU两者的特点.


 2.3 旋转嵌入 [GPTNeo]:
我们删除了绝对位置嵌入,取而代之的是在网络的每一层添加旋转位置嵌入(RoPE),通过绝对位置编码的方式实现相对位置编码。
  • 主要就是对attention中的q, k向量注入了绝对位置信息,然后用更新的q,k向量做attention中的内积就会引入相对位置信息了。

BERT:从随机初始化训练出来的绝对位置编码,一般的最大位置设为了512,因此顶多只能处理512个token,多出来的部分就没有位置编码可用了。

2.4 优化器:AdamW

3. llama2 跟 llama的区别

相比于 Llama 1,Llama 2 的训练数据多了 40%,上下文长度也翻倍(token数:2048 ---> 4096)

二、vicuna

Vicuna是在LLaMa-13B的基础上使用监督数据微调得到的模型,数据集来自于ShareGPT.com 产生的用户对话数据,共70K条。

 三、sft

1. 有一个预训练模型

2. 通常只有预训练模型中的一部分层被微调,例如只微调模型的最后几层或者某些中间层。

四、LoRA & QLoRA

1. LoRA :该方法的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。

在涉及到矩阵相乘的模块,在原始的PLM旁边增加一个新的通路,通过前后两个矩阵A,B相乘,第一个矩阵A负责降维,第二个矩阵B负责升维,中间层维度为r,从而来模拟所谓的本征秩(intrinsic rank)

在图中我们对A使用随机高斯随机分布初始化,对B使用零初始化,因此在训练开始时∆W = BA为零。然后,通过αr对∆Wx进行缩放,其中α是r中的一个常数。在使用Adam优化时,适当地缩放初始化,调整α的过程与调整学习率大致相同。因此,只需将α设置为我们尝试的第一个r,并且不对其进行调整。这种缩放有助于在改变r时减少重新调整超参数的需求。

参数设置:

影响模型训练效果的参数主要有下面几个
lora_rank(int,optional): LoRA 微调中的秩大小。这里并不是越大越好,对于小型数据集如果r=1就可以达到很不错的效果,即便增加r得到的结果也没有太大差别。

lora_alpha(float,optional): LoRA 微调中的缩放系数。

lora_dropout(float,optional): LoRA 微调中的 Dropout 系数。

learning_rate(float,optional): AdamW 优化器的初始学习率。如果设置过大会出现loss值无法收敛或过拟合现象即过度适应训练集而丧失泛化能力,对非训练集中的数据失去原本的计算能力。

num_train_epochs(float,optional): 训练轮数,如果loss值没有收敛到理想值可以增加训练轮数

 2. QLoRA: 将预训练模型量化为 4 bit,然后添加一小组可学习的低秩适配器权重,这些权重通过量化权重的反向传播梯度进行微调。
 

其他LLM的主流微调方式:P-Tuning、Freeze

五、langchain

LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库

 我们要做的(上一阶段):对话提summary --> summary生成embedding --> embedding存进vector_database

我们用到langchain的东西:openai的embedding生成,生成(存入)vector_database,retrieve,用retrieve回答问题。

六、大语言模型

6.1 大纲

6.2 self-instruction

1)指令生成

从一小部分人类编写的指令种子中扩充指令数据

2)识别指令是否代表分类任务

之所以需要区分分类任务和生成任务,是因为模型对于分类任务,会更容易倾向于生成同一个标签的文本。因此让模型先输出label(output),在输出input。

3)用输入优先或输出优先的方法生成实例

为分类任务另外提出了一种输出优先的应用方法,即首先生成可能的类标签,然后根据每个类标签确定输入生成的条件,

4)过滤低质量数据。

使用ROUGE筛选掉高重复的指令、同时筛选掉例如 图片、视频等无法被llm处理的指令。

6.3 RLHF

1)花钱招人给问题(prompt)写回答(demonstration),然后finetune一个GPT3。

2)用多个模型(可以是初始模型、finetune模型和人工等等)给出问题的多个回答,然后人工给这些问答对按一些标准(可读性、无害、正确性blabla)进行排序,训练一个奖励模型/偏好模型来打分(reward model)。

3)用强化学习训练上面那个finetune后的GPT3模型。用强化学习做LM训练是PPO算法,即Proximal Policy Optimization。

6.4 推理优化

6.4.1 降低精度:使用float16或bfloat16。这将使模型加速约20%,内存消耗减少2倍。
6.4.2 使用8位或4位量化:使用8位或4位的模型量化方式可以将内存消耗减少2倍或3倍。这种方法对需要运行于内存受限的小型设备上的模型效果最好。需注意:量化会降低模型预测的质量。
6.4.3 使用adapters(LoRA[2]、QLoRA[3])进行微调,能够提高模型在特定数据上的预测准确性和性能。与模型量化技术结合使用效果良好。

适配器的工作原理是在现有模型层中添加紧凑的额外层(compact additional layers),并仅针对它们进行训练。这些适配器层拥有轻量级参数(lightweight parameters),使得模型能够快速适应和学习。

6.4.4 使用张量并行技术(tensor parallelism)能够加速大模型在多GPU上的推理。
6.4.5 如果可能,尽可能使用LLM推理和服务库,如Text Generation Inference、DeepSpeed[4]或vLLM[5]。这些库已经包含了各种优化技术:张量并行(tensor parallelism)、模型量化(quantization)、对连续到达的请求进行批处理操作(continuous batching of incoming requests)、经过优化的CUDA核函数(optimized CUDA kernels)等等。

连续批处理(continuous batching)。Orca实施了iteration-level scheduling,而不再需要等待批处理(batch)中的每个序列都完成生成,而是根据每次迭代来确定批大小(batch size)。这样做的结果是,一旦批中的一个序列完成生成,就可以插入一个新的序列,从而实现比静态批处理更高的GPU利用率。并行处理来自不同用户的请求。这样可以提高服务器的吞吐量。

张量并行

deepspeed

它通过将模型参数拆散分布到各个GPU上,以实现大型模型的计算

· 混合精度训练
· ZeRO可以减少内存占用,优化大模型训练,将模型参数分成了三个部分:Optimizer States、Gradient 和 Model Parameter。在使用 ZeRO 进行分布式训练时,可以选择 ZeRO-Offload 和 ZeRO-Stage3 等不同的优化技术。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值