本文首要从模型推理角度去总结论文,因而没有涉及到数据集处理、模型练习及试验报告的细节,只介绍了 LLaMA 模型的首要思维以及模型结构的细节,最终介绍一些根据 LLaMA finetune 的模型。

摘要

LLaMA(Large Language Model Meta AI),由 Meta AI 发布的一个敞开且高效的大型基础言语模型,共有 7B13B33B65B(650 亿)四种版别。其数据集来历都是揭露数据集,无任何定制数据集,保证了其作业与开源兼容和可复现,整个练习数据集在 token 化之后大约包括 1.4T 的 token。

关于模型功能,LLaMA 的功能非常优异:具有 130 亿参数的 LLaMA 模型「在大多数基准上」能够胜过 GPT-3( 参数量达 1750 亿),并且能够在单块 V100 GPU 上运转;而最大的 650 亿参数的 LLaMA 模型能够比美谷歌的 Chinchilla-70B 和 PaLM-540B。

关于练习集,其来历都是揭露数据集,无任何定制数据集,保证了其作业与开源兼容和可复现。整个练习数据集在 token 化之后大约包括 1.4T 的 token。其间,LLaMA-65B 和 LLaMA-33B 是在 1.4万亿个 token 上练习的,而最小的模型 LLaMA-7B 是在 1万亿个 token 上练习的。

介绍

Hoffmann 等人(2022)最近的作业表明晰,在给定的核算预算下,最佳功能不是由最大的模型完成的,而是根据更多数据上的练习较小模型完成的。

和之前的作业比较,本论文的重点是根据更多 tokens 的练习集,在各种推理预算下,练习出功能最佳的一系列言语模型,称为 LLaMA,参数范围从 7B65B 不等,与现有最佳 LLM 比较,其功能是有竞赛力的。比方,LLaMA-13B 在大多数基准测验中优于 GPT-3,虽然其尺寸只要 GPT-3 的十分之一。作者相信,LLaMA 将有助于使 LLM 的运用和研究平民化,因为它能够在单个 GPU 上运转!在规模较大的情况下,LLaMA-65B 也具有与最佳大型言语模型(如 Chinchilla 或 PaLM-540B)相竞赛的才能。

LLaMA 优势在于其只运用揭露可用的数据,这能够保证论文的作业与开源兼容和可复现。之前的大模型要么运用了不揭露的数据集去练习从而达到了 state-of-the-art,如 Chinchilla、PaLM 或 GPT-3;要么运用了揭露数据集,但模型作用不是最佳无法和 PaLM-62B 或 Chinchilla 相竞赛,如 OPT、GPT-NeoX、BLOOM 和 GLM。

模型结构

和 GPT 系列相同,LLaMA 模型也是 Decoder-only 架构,但结合前人的作业做了一些改进,比方:

  1. Pre-normalization [GPT3]. 为了进步练习稳定性,LLaMA 对每个 transformer 子层的输入进行归一化,运用 RMSNorm 归一化函数,Pre-normalization 由Zhang和Sennrich(2019)引进。
  2. SwiGLU 激活函数 [PaLM]. 将 ReLU 非线性替换为 SwiGLU 激活函数,且运用 234d\frac{2}{3}4d 而不是 PaLM 论文中的 4d,SwiGLU 由 Shazeer(2020)引进以进步功能。
  3. Rotary Embeddings [GPTNeo]. 模型的输入不再运用 positional embeddings,而是在网络的每一层添加了 positional embeddings (RoPE),RoPE 办法由Su等人(2021)引进。

不同模型的超参数详细信息在表2中给出。

LLaMA及其子孙模型概述

SwiGLU

Feed Forward 层全称是 Position-wise Feed-Forward Networks(FPN),FFN 接收一个向量 x(序列中特定方位的隐藏表示),并将其通过两个可学习的线性变换(由矩阵 W1 和 W2 以及偏置向量 b1 和 b2 表示)进行处理,在两个线性变换之间运用批改线性(ReLU)激活函数。核算进程用数学公式可表达为:

FFN(x,W_1,W_2,b_1,b_2)=max(0,xW_1+b_1)W_2+b_2\text{FFN}(x, W\_1, W\_2, b\_1, b\_2) = \text{max}(0, xW\_1 + b\_1 )W\_2 + b\_2

在 T5 模型的完成中,运用是没有偏置 bias 的版别,数学公式表达如下:

FFN(x,W_1,W_2)=max(0,xW_1)W_2\text{FFN}(x, W\_1, W\_2) = \text{max}(0, xW\_1)W\_2

后续的研究提出了用其他非线性激活函数替换ReLU,如高斯差错线性单元 (Gaussian Error Linear Units),GELU(x)=x(x)\text{GELU}(x) = x\Phi (x)Swish_(x)=x(x)\text{Swish}\_{\beta}(x) = x\sigma(\beta x)

FFN∗GELU(x,W_1,W_2)=GELU(xW_1)W_2FFN∗Swish(x,W_1,W_2)=Swish(xW_1)W_2\text{FFN}*{\text{GELU}}(x, W\_1, W\_2) = \text{GELU}(xW\_1)W\_2 \\ \text{FFN}*{\text{Swish}}(x, W\_1, W\_2) = \text{Swish}(xW\_1)W\_2

[Dauphin et al., 2016] 提出了门控线性单元(GLU),界说为输入的两个线性变换的逐元素乘积,其间一个经过了 sigmoid 激活。别的,他们还主张省略激活函数,称之为“双线性”(bilinear)层。

GLU(x,W,V,b,c)=(xW+b)⊗(xV+c)bilinear(x,W,V,b,c)=(xW+b)⊗(xV+c)\text{GLU}(x, W, V, b, c) = \sigma(xW+b)\otimes (xV+c) \\ \text{bilinear}(x, W, V, b, c) = (xW+b)\otimes (xV+c)

咱们还能够运用其他激活函数界说 GLU 变体,如下所示:

ReGLU(x,W,V,b,c)=max(0,xW+b)⊗(xV+c)GEGLU(x,W,V,b,c)=GELU(xW+b)⊗(xV+c)SwiGLU(x,W,V,b,c)=Swish(xW+b)⊗(xV+c)\text{ReGLU}(x, W, V,b, c) = \text{max}(0, xW+b)\otimes (xV+c) \\ \text{GEGLU}(x, W, V,b, c) = \text{GELU}(xW+b)\otimes (xV+c) \\ \text{SwiGLU}(x, W, V,b, c) = \text{Swish}(xW+b)\otimes (xV+c)

在本论文中,作者提出了 Transformer FFN 层的其他变体,这些变体运用 GLU 或其变体替代第一个线性变换和激活函数。同样也省略了误差项。

SwiGLU 激活函数是 Gated Linear Units (GLU) 变体之一,来历于论文 GLU Variants Improve Transformer。SwiGLU 数学表达式如下:

FPN∗SwiGLU(x,W,V,W_2)=(Swish∗1(xW)⊗xV)W_2\text{FPN}*{\text{SwiGLU}}(x, W, V, W\_2) = (\text{Swish}*{1}(xW)\otimes xV)W\_2

其间激活函数 Swish 的界说如下:

Swish(x)=x⋅Sigmoid(x)SiLU(x)=x⋅Sigmoid(x)\text{Swish}(x) = x⋅ \text{Sigmoid}(\beta x) \\ \text{SiLU}(x) = x⋅ \text{Sigmoid}(x)

原始的的 FPN\text{FPN} 层只要两个权重矩阵,但 FPN_SwiGLU\text{FPN}\_{\text{SwiGLU}} 的线性变换层有三个权重矩阵。为了坚持参数数量和核算量的恒定,需要将隐藏单元的数量 d_ff(W 和 V 的第二个维度以及 W2 的第一个维度)缩小 2/3。完成代码如下所示:

# -*- coding  : utf-8 -*-
# Author: honggao.zhang
import torch
import torch.nn as nn
import torch.nn.functional as F
class FFNSwiGLU(nn.Module):
    def __init__(self, input_dim: int, hidden_dim: int):
        super().__init__()
        hidden_dim = int(2 * hidden_dim / 3)
        self.fc1 = nn.Linear(input_dim, hidden_dim, bias=False)
        self.fc2 = nn.Linear(hidden_dim, input_dim, bias=False)
        self.fc3 = nn.Linear(input_dim, hidden_dim, bias=False) 
    def forward(self, x):
        # LLaMA 官方供给的代码是运用 F.silu() 激活函数
        return self.fc2(F.silu(self.fc1(x) * self.fc3(x)))
layer = FFNSwiGLU(128, 256)
x = torch.randn(1, 128)
out = layer(x)
print(out.shape) # torch.Size([1, 128])

代码分析

LLaMA 官方代码只供给了模型结构和推理 sample 代码,没有供给模型练习代码,别的看了官方供给的下载脚本,是没有直接供给下载链接,是需要自己请求!原版 LLaMA 模型需要去 LLaMA 项目请求运用或参考这个 PR。因版权问题本项目无法供给下载链接。

下载链接说明信息来历 Alpaca 库房。

LLaMA 模型结构也只运用 Decoder 结构。

[等待更新]

LLaMA 模型的线性核算层都是运用了 FairScale 库的 ColumnParallelLinear 层,它是一个并行的线性层,能够在多个 GPU 上并行核算,这个核算速度比 Linear 的 nn.Linear 层速度更快。

高功能 PyTorch 库-FairScale

1,FairScale: 用于在一台或多台机器/节点上进行高功能和大规模练习的 PyTorch库,由 Meta 发布。示例代码:

from torch import nn
import fairscale
model = nn.Sequential(
    nn.Conv2d(in_channels=3, out_channels=6, kernel_size=(5,5), stride=1, padding=0),
    nn.MaxPool2d(kernel_size=(2,2), stride=2, padding=0),
    nn.Conv2d(in_channels=6, out_channels=16, kernel_size=(5,5), stride=1, padding=0),
    nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0),
)
model = fairscale.nn.Pipe(model, balance=[2, 2], devices=[0, 1], chunks=8)

在 2 个 GPU 上运转 4 层模型。前两层在 cuda:0 上运转,后两层在 cuda:1 上运转。

根据 LLaMA finetune 的模型

以下这些项目都能够算是 Meta 发布的 LLaMA(驼马)模型的子子孙孙。

1,Alpaca

Alpaca 是斯坦福LLaMA 上对 52000 条指令跟从演示进行了精细调优的模型,是后续很多中文 LLM 的基础。

对应的中文版是 Chinese-LLaMA-Alpaca。该项目在原版 LLaMA 的基础上扩充了中文词表并运用了中文数据进行二次预练习,进一步提升了中文基础语义了解才能。同时,在中文LLaMA 的基础上,本项目运用了中文指令数据进行指令精调,明显提升了模型对指令的了解和履行才能。

值得注意的是,该项目开源的不是完好模型而是 LoRA 权重,了解为原 LLaMA 模型上的一个“补丁”,两者进行兼并即可取得完好版权重。提示:库房中的中文 LLaMA/Alpaca LoRA 模型无法单独运用,需要调配原版 LLaMA 模型[1]。能够参考本项目给出的兼并模型步骤重构模型。

  • repo: github.com/ymcui/Chine…

2,Vicuna

Vicuna) 是一款从 LLaMA 模型中对用户共享的对话进行了精细调优的谈天助手,根据的评价,这款谈天助手在 LLaMA 子孙模型中表现最佳,能达到 ChatGPT 90% 的作用。

LLaMA及其子孙模型概述
3,Koala(考拉)

一款从 LLaMA 模型中对用户共享的对话和开源数据集进行了精细调优的谈天机器人,其表现与Vicuna 相似。

  • blog: Koala: A Dialogue Model for Academic Research
  • demo: FastChat
  • repo: github.com/young-geng/…

4,Baize (白泽)

  • 论文:arxiv.org/pdf/2304.01…
  • demo: Baize Lora 7B – a Hugging Face Space by project-baize
  • repo: github.com/project-bai…

5,Luotuo (骆驼,Chinese)

  • repo: github.com/LC1332/Luot…

别的,中文 LLM 的有影响力的模型还有 ChatGLM,通常指 ChatGLM-6B, 一个由清华团队开源的、支撑中英双语的对话言语模型,根据 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户能够在消费级的显卡上进行本地部署 ChatGLM(INT4 量化级别下最低只需 6GB 显存)。

整体运用下来,其基本任务没问题,可是涌现才能还是有限的,且会有事实性/数学逻辑过错,别的,Close QA 问题也很一般。GLM 模型架构与 BERT、GPT4、T5 等预练习模型模型架构不同,它采用了一种自回归的空白填充办法。

个人感触

一些 LLM 的论文看下来,发现讲模型结构的内容真的很少,大部分内容都在讲数据集构建办法、模型练习办法、实验报告等内容。

参考资料

  1. Meta发布最新大模型LLaMA:参数规模更小,单卡就能跑赢GPT-3
  2. Hendrycks and Gimpel, 2016
  3. GLU Variants Improve Transformer