基于Lora微调本地Llama3大语言模型
| 2024-10-24
0  |  阅读时长 0 分钟
本文将从三个部分介绍,背景,方法,实验。

1. 背景:Llama 3

大家都用过OpenAI的GPT之类的闭源大模型,效果非常好。其实现在网上也有不少的开源大模型也已经达到了很不错的效果,就比如Meta推出的Llama,可以说是很多其它开源大语言模型参考的范本,比如清华的ChatGLM,阿里的Qwen等等。
那这个Llama3呢,是今年4月份推出的最新的一版,从参数量上来看有两个版本,一个是8B,也就是80亿参数的版本,另外一个版本是70B。相比Llama2,显著扩充了词表大小,上下文也从4k增加到了8k,并且使用了这个新的GQA也就是分组注意力机制可以提升不少的训练和推理效率。
notion image
 

2. 数据集介绍

对于大语言模型来说呢,最重要的就是训练数据了,甚至可以说很多效果不错的大模型就是在大量的训练数据上大力出奇迹的结果。
notion image
从Meta公布的资料来看,原始的Llama3在预训练阶段用到了15万亿个token,包含各种语料,为了保证数据质量,还对这些数据采取了一系列的数据清洗和处理。
我们这次实验是去微调它,用到了两种数据,其一是关于身份认证的信息,让它能有一些跟我们组相关的自我认知。第二就是一些金融相关的语料,让它在垂直领域能输出一些订制化的或者更专业的答案。

3. Llama结构

notion image
先整体地介绍一下Llama的模型结构,主要就是三个部分,第一块就是分词部分,主要是对输入进行一些处理。
第二块是主干的部分,
对于llama来说,只用了transformer 的decoder部分,简单的介绍一下要重点关注的几个概念:
  • Llama用到的是RoPE也就是旋转位置编码,去替换了原来的绝对位置编码,大概来说就是利用了二维旋转矩阵的一些性质去编码了一句话内token之间的相对位置关系。
  • SwiGLU,目前很多大模型的标配激活函数,用它去替换了FFN,实验验证了它的效果比较好
  • RMS:均方根层归一化,简化了原来的LayerNorm不用再算均值,计算量更小,更加高效。
  • GQA:也就是分组注意力查询,对原来的多头注意力机制做了一些改进,再对一些head进行分组,再加上一些kv cache的技术可以大大减少显存占用。
第三块是下游任务的处理部分,比如在下面接一个MLP层再用上交叉熵损失就可以去做文本的情感分类之类的任务。
 
接下来介绍一下LLM的训练过程,以“生命、宇宙和一切的终极问题的答案”这句话为例,
notion image
 
首先是对输入的原始文本做一些处理,包括分词tokenize也就是给每个token赋予一个唯一的ID,注意在这个过程中会加上一些额为的标记比如开始符,那么它现在的维度是[17, 1]。经过embedding 层后,也就是做了一些查表操作后变为[17, 4096],然后会经过标准化也就是RMS,形状不会改变只是值标准化了,然后就是去算各种QKV的注意力了,q矩阵的维度是[4096, 4096],其余的都是[1024, 4096],注意力头的数量是32。最终结果处的形状也是[17, 4096],最后再把embedding值解码为token,使用最后一个token的值来预测下一个值,得到的最终答案是42。
 

4. 各种微调

notion image
 
微调不同于Prompt Engineering以及in context Learning的一个地方在于,它是改变了模型的一些参数的,它是让模型具备了一些新概率和对一些新事物的识别的能力。
notion image
Lora是在算注意力的时候,增加了一个旁路。
先上一张图, 其实从图上已经能清楚地看到大致的原理的。 通俗地讲, 它的原理是这样的:大模型都是过参数化的, 当用于特定任务时, 其实只有一小部分参数起主要作用。 也就是参数矩阵维度很高, 但可以用低维矩阵分解近似。其实这个思想与矩阵特征向量, 主成分分析, 压缩感知等有异曲同工之妙。
具体做法是, 在网络中增加一个旁路结构,旁路是A和B两个矩阵相乘。 A矩阵的维度是dxr, B 矩阵的维度是rxd, 其中r<<d, 一般r取1,2,4,8就够了。那么这个旁路的参数量将远远小于原来网络的参数W。LoRA训练时, 我们冻结原来网络的参数W, 只训练旁路参数A和B。 由于A和B的参数量远远小于W, 那么训练时需要的显存开销就大约等于推理时的开销。 对采用Adam优化器来说, 需要的显存就大约相当于全参数finetune的1/3, 极大地减小了训练的代价。
论文中作者的实验也证明了这一点。 在GPT-3 175B的finetune中, 采用LoRA微调显存的消耗从1.2TB 降低到了350GB, 大约是三分之一
其实采用这种旁路相加的方式, 与ResNet的跳连方式也有异曲同工之妙。 原网络的参数不变, 在旁路上做些微小改变, 适应特定新任务。 这样就可以让网络基本保持原来的能力, 在特定任务上更精进了一步。
值得注意的是, LoRA微调并没有改变原有的预训练参数, 只是针对特定任务微调出了新的少量参数, 新的这些参数要与原有的预训练参数配合使用(实际使用时, 都是把旁路的参数和原来的参数直接合并, 也就是参数相加, 这样就完全不会增加推理时间)。这是非常方便的, 针对不同的任务, 都可以训练出自己的LoRA参数, 然后与原本的预训练参数结合, 做成插件式的应用。 这就是最近大火的SD + LoRA。全参数微调一般没这个条件, 但LoRA微调还是可以的。 目前Civitai上有上万LoRA的模型, 并且还在迅速增加。

5. 实验

notion image
推理:
notion image
 

参考

llm-action
liguodongiotUpdated Oct 24, 2024
llama3-from-scratch
naklechaUpdated Oct 24, 2024
 
Loading...
目录