深入理解LLaMA, Alpaca, ColossalChat 系列模型

知乎:紫气东来
https://zhuanlan.zhihu.com/p/618695885

一、从 LLaMA 到 Alpaca:大模型的小训练

1.1 LLaMA 概要与实践

LLaMA(Large Language Model Meta AI) 是由 Meta AI 发布了一款全新的大型语言模型,共有7B、13B、33B、65B 四种版本,其模型参数如下表所示:

2b7e73297592c11c337131e6a199ca35.png

与原始的 transformer Decoder 相比,LLaMA主要有以下改进:

  • 预归一化(Pre-normalization)[GPT3]
    为了提高训练的稳定性,LLaMA对每个transformer子层的输入进行归一化,而不是对输出进行归一化。同时使用RMSNorm归一化函数。

  • SwiGLU激活函数[PaLM]
    LLaMA用SwiGLU激活函数取代ReLU非线性,以提高性能。SwiGLU激活函数的实现如下:

其中 ,,具体实现参考这里[1]

  • 旋转嵌入(Rotary pos)[GPTNeo]

LLaMA删除了绝对位置嵌入,取而代之的是在网络的每一层添加旋转位置嵌入(RoPE),RoPE的实现参见这里[2]。当前 HuggingFace 已经实现了 LLaMA 模型 代码,可通过以下方式直接调用:

from transformers import LlamaForCausalLM
USE_8BIT = True # use 8-bit quantization; otherwise, use fp16
model = LlamaForCausalLM.from_pretrained(
            "pretrained/path",
            load_in_8bit=USE_8BIT,
            torch_dtype=torch.float16,
            device_map="auto",
        )
if not USE_8BIT:
    model.half()  # use fp16
model.eval()

1.2 Alpaca 如何使用小成本训练大模型

如下图所示,Stanford的研究者使用 52K 个 intruction-following examples 来微调 LLaMA 7B 模型,从而生成了 Alpaca[3] 7B。

Alpaca 团队使用 self-instruct[4] 提供的 175 个 prompts,调用 OpenAI 的text-davinci-003模型,利用 OpenAI 的模型来产生有价值的 instructions 。

b1ac99cffdb387c664a740cf2e03c1d1.png

将 OpenAI 性能完备的模型作为 Teacher,来指导参数更少的 Alpaca 模型进行训练,大幅降低了训练成本 。其中调用 OpenAI API 的成本不到 500 美元,另外微调 7B 参数的 LLaMA 模型,使用云服务商提供的 8 块 80GB A100 显卡,训练 3 小时,消费不到 100 美元,因此整体成本是小于 600 美元。

二、Alpaca 的优化、训练及应用

2.1 alpaca-lora 的优化

alpace-lora[5] 是在alpaca的基础上把训练方式改成用lora训练,仅需要在消费级的GPU上经过数小时的训练,就可以达到和alpaca差不多的效果。

LoRA(Low-Rank Adaptation) 技术

LoRA 的思想很简单,即在原始 Pretrained Weights 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的 intrinsic rank 。训练的时候固定 Pretrained Weights 的参数,只训练降维矩阵 与升维矩阵 。而模型的输入输出维度不变,输出时将 与 Pretrained Weights 的参数叠加。用随机高斯分布初始化 ,用0矩阵初始化 ,保证训练的开始此旁路矩阵依然是 0 矩阵。

具体来看,假设预训练的矩阵为,它的更新可表示为:

其中秩。

160c6ab95c5c77c06cf558798f6c2def.png

LoRA与Transformer的结合也很简单,仅在QKV attention的计算中增加一个旁路,而不动MLP模块。基于大模型的内在低秩特性,增加旁路矩阵来模拟全模型参数微调,LoRA通过简单有效的方案来达成轻量微调的目的,可以将现在的各种大模型通过轻量微调变成各个不同领域的专业模型。

2.2 PEFT(Parameter-Efficient Fine-Tuning) 方法

随着模型变得越来越大,在消费级硬件上对模型进行全部参数的微调变得不可行。此外,为每个下游任务独立存储和部署微调模型变得非常昂贵,因为微调模型与原始预训练模型的大小相同。PEFT 方法旨在解决这两个问题,PEFT 方法仅微调少量 (额外) 模型参数,同时冻结预训练 LLM 的大部分参数,从而大大降低了计算和存储成本。

HuggingFace 开源的一个高效微调大模型的 PEFT 库,目前包含LoRA,Prefix Tuning,Prompt Tuning,P-Tuning 四种算法,下面简要介绍后三种:

  • Prefix Tuning
    Prefix Tuning 算法是根据 下游任务 “前缀指令文本” 的所有层的embeding表示,学习到的前缀指令文本向量可以挖掘大模型的潜力去引导模型完成特定任务。

242f2291ea5cc105104f66fe10df8b83.png
  • P-Tuning
    P-Tuning 算法和 Prefix Tuning 的想法很相似,想通过微调”指令文本”,让指令文本去挖掘大模型的潜力去完成特定的任务。但是 P-Tuning 只学习 “指令文本” 输入层embeding的的表示。为了增强 “指令文本”的连续性,采用了一个 MLP(LSTM) 的结果去encoding “指令文本”。从微调参数量来看只有 0.65% 比 Prefix Tuning 和 LoRA 这些在所有层都增加参数的方法要少。

d7df33bb517febc913b634a6f3f7a4b7.png
  • Prompt Tuning
    Prompt Tuning 算法和 P-Tuning 很像,且更简单,就是是根据 下游任务 “指令文本” 输入层embeding的的表示。Prompt Tuning 没有增加任何的层,直接使用微调指令文本(prompt) 的embeding向量。

c4496db751cef67ceaeb000cf8d050e3.png

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年5月3日
下一篇 2023年5月4日

相关推荐