admin 发布的文章

一、简介

论文:LLaMA: Open and Efficient Foundation Language Models :https://arxiv.org/pdf/2302.13971
github:https://github.com/meta-llama/llama
发布时间: 2023 年 2 月 25

LLaMA 是一系列从 7 B到 65B 参数的基础语言模型。Meta 训练这些模型使用了数万亿个 token,并且证明了完全可以只使用公开可得的数据集来训练最先进的模型,而无需使用专有和不可获取的数据集。特别是,LLaMA-13B 在大多数基准测试中表现优于GPT-3(175B),而 LLaMA-65B 在竞争中与最佳模型 Chinchilla70B 和PaLM-540B 持平。

二、LLaMa 预训练

1.预训练数据

LLaMa 预训练数据大约包含 1.4T tokens,对于绝大部分的训练数据,在训练期间模型只见到过1次,Wikipedia 和 Books 这两个数据集见过2次。

表1所示是 LLaMa 预训练数据的含量和分布,其中包含了 CommonCrawl 和 Books 等不同域的数据。

微信截图_20240516170118.png

English CommonCrawl [67%]:对五个 CommonCrawl 数据集进行预处理,时间跨度从2017年到2020年,使用 CCNet 流水线。该过程在行级别进行数据去重,使用 fastText 线性分类器进行语言识别,以删除非英语页面,并使用 n-gram 语言模型过滤低质量内容。此外,还训练了一个线性模型,用于将页面分类为 Wikipedia 中的引用页面与随机抽样页面,并丢弃未被分类为引用的页面。

C4 [15%]:C4的预处理还包括去重和语言识别步骤:与 CCNet 的主要区别在于质量过滤,这主要依赖于标点符号的存在或网页中的词语和句子数量等启发式方法。

Github [4.5%]:使用 Google BigQuery 上可用的公共 GitHub 数据集。只保留了在 Apache、BSD 和 MIT 许可下发布的项目。此外,使用基于行长度或字母数字字符比例的启发式方法过滤低质量文件,并使用正则表达式删除了诸如头文件之类的样板文件。最后,对生成的数据集进行了文件级别的去重,使用完全匹配的方法

Wikipedia [4.5%]:添加了截至2022年6月至8月的 Wikipedia 数据,涵盖20种语言。处理数据以去除超链接、评论和其他格式样板。

Gutenberg and Books3 [4.5%]:添加了两个书的数据集,分别是 Gutenberg 以及 ThePile (训练 LLM 的常用公开数据集) 中的 Book3 部分。处理数据时执行重复数据删除,删除内容重叠超过 90% 的书籍。

ArXiv [2.5%]:处理了arXiv Latex文件,以添加科学数据到数据集中。移除了第一节之前的所有内容,以及参考文献。还移除了.tex文件中的注释,并且内联展开了用户编写的定义和宏,以增加论文之间的一致性。

Stack Exchange [2%]。作者添加了 Stack Exchange,这是一个涵盖各种领域的高质量问题和答案网站,范围从计算机科学到化学。作者从 28 个最大的网站保留数据,从文本中删除 HTML 标签并按分数对答案进行排序

2、Tokenizer

使用字节对编码(BPE)算法对数据进行分词,使用 SentencePiece 的实现。值得注意的是,作者将所有数字分割成单个数字。

三、网络结构

在最近关于大型语言模型的研究中,LLaMa 的网络基于 Transformer 架构。作者利用了随后提出的各种改进,这些改进在不同模型(如PaLM)中得到了应用。以下是与原始架构的主要区别,以及从哪里得到了这种变化的灵感(括号中)。
410cacf197384fcdbaecd11ead5b957f.png

1、Pre-normalization [受 GPT3 的启发]

均方根:Root Meam Square
为了提高训练稳定性,LLaMa 对每个 Transformer 子层的输入进行归一化,而不是对输出进行归一化。LLaMa 使用了 RMSNorm 归一化函数。

class RMSNorm(torch.nn.Module):
    def __init__(self, dim: int, eps: float = 1e-6):
        super().__init__()
        self.eps = eps
        self.weight = nn.Parameter(torch.ones(dim))

    def _norm(self, x):
        return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)

    def forward(self, x):
        output = self._norm(x.float()).type_as(x)
        return output * self.weight

方差定义:
概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。
均方根:RMS:
是root mean square的缩写。RMS值实际就是有效值,就是一组统计数据的平方的平均值的平方根。

常规的 Layer Normalization:
微信截图_20240517145320.png
微信截图_20240517145409.png

2、SwiGLU 激活函数 [受 PaLM 的启发]:

LLaMa 使用 SwiGLU 激活函数替换 ReLU 以提高性能,维度从4d变为2/3 *4d。

SwiGLU 是2019年提出的新的激活函数,它结合了 SWISH 和 GLU 两种者的特点。SwiGLU 主要是为了提升Transformer 中的 FFN(feed-forward network) 层的实现。
微信截图_20240517154943.png

3、RoPE Rotary Embeddings [受 GPTNeo 的启发]:

LLaMa 没有使用之前的绝对位置编码,而是使用了旋转位置编码(RoPE),可以提升模型的外推性。关于 RoPE 的具体细节,可以参考下面的链接:

4、AdamW 优化器

LLaMa 使用了 AdamW 优化器进行训练,超参数为:β1 = 0.9,β2 = 0.95。
使用 cosine 学习率衰减策略,2000 步的 warm-up,最终学习率等于最大学习率的 10%,使用 0.1 的权重衰减和 1.0 的梯度裁剪。
微信截图_20240517164103.png

四、总结

总结一下 LLaMa 的技术要点:

1、模型结构:主体结构依然是 GPT,不同之处在于位置编码使用了旋转编码(RoPE),归一化使用了 RMSNorm,激活函数使用了 SwiGLU
2、训练优化:选择了小 LLM配大数据的思路,预训练使用了 1.4T 的 token,经过了充分的训练。

参考:
1.https://zhuanlan.zhihu.com/p/648774481

一般分三大类

  • Fine-Tuning:全量微调
  • PEFT:高效微调(SOTA PEFT),部分参数的微调方法
  • RLHF:基于人工反馈机制的强化方法

一、 Fine-Tuning:全参微调

定义:全微调是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练模型的所有层和参数都会被更新和优化,以适应目标任务的需求。
适用范围:这种微调方法通常适用于任务和预训练模型之间存在较大差异的情况,或者任务需要模型具有高度灵活性和自适应能力的情况。Full Fine-tuning需要较大的计算资源和时间,但可以获得更好的性能。

1.Fine tuning

经典的Fine tuning方法包括将预训练模型base-model与少量特定任务数据一起继续训练。在这个过程中,预训练模型的权重被更新,以更好地适应任务。所需的Fine-tuning量取决于预训练语料库和任务特定语料库之间的相似性。如果两者相似,可能只需要少量的Fine tuning。如果两者不相似,则可能需要更多的Fine tuning。

二、PEFT、高效微调(SOTA PEFT):部分参数的微调方法

微信截图_20240429141957.png

微调顶层:只微调预训练模型的顶层,以适应新的任务。
逐层微调:从底层开始,逐层微调预训练模型,直到所有层都被微调。
冻结底层:将预训练模型的底层固定不变,只对顶层进行微调。

P-tuning:( 2021年3月) 清华大学提出的可自动学习模版的P-tuning,这种方法通过引入连续提示(continuous prompts)的方式替代传统的离散文本提示(discrete text prompt),以更少的可训练参数量来适应特定下游任务。

在P-Tuning中,通常会为输入序列添加一个或多个可学习的向量(虚拟token),这些向量作为额外的“prompt”嵌入到模型的输入序列中,用于指导模型生成与特定任务相关的输出。相比于直接对整个模型进行微调,P-Tuning仅需要调整这部分新增的prompt参数,从而显著减少所需的计算资源和时间。

P-tuning2:(在每一层前面加入训练参数 2021年10月)基于Prefix Tuning,增加了多个Embedding层,连续的Prompts,在预训练的每一层都增加了prompts,适合GLM模型的微调

Adapter(在前面添加训练参数)Adapter Tuning:由Houlsby N等人在2019年提出,通过增加模型层数来引入额外的灵活性,但这也导致了额外的推理延迟
Prefix-tuning(在中间添加训练参数)由斯坦福大学提出,在原有模型基础上,增加一个可被训练的Embedding层,用于给提示词增加前缀,从而更好的让模型理解提示词的意图,通过修改输入的前缀来调整模型的行为,但这种方法难以训练,并且可能影响模型性能。
Prompt tuning:由谷歌提出,类似于Prefix-Tuning,通过修改输入提示来调整模型行为。
Lora(在旁边添加训练参数)(Low-Rank Adaptation):由微软在2021年提出,通过低秩矩阵分解来实现高效的参数调整。
QLora

在这些方法中,LORA因其优越的性能和较低的成本而备受推崇。

定义:部分微调是指在微调过程中只更新模型的顶层或少数几层,而保持预训练模型的底层参数不变。这种方法的目的是在保留预训练模型的通用知识的同时,通过微调顶层来适应特定任务。

适用范围:Repurposing通常适用于目标任务与预训练模型之间有一定相似性的情况,或者任务数据集较小的情况。由于只更新少数层,Repurposing相对于Full Fine-tuning需要较少的计算资源和时间,但在某些情况下性能可能会有所降低。

微调所有层:将预训练模型的所有层都参与微调,以适应新的任务。

1、P-tuning系列

P-tuning V1

英文名称: GPT Understands, Too
中文名称: GPT也懂
链接: https://arxiv.org/abs/2103.10385
作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang
机构: 清华大学, 麻省理工学院
日期: 2021-03-18

目标:大模型的 Prompt 构造方式严重影响下游任务的效果。离散化的 token 的搜索出来的结果可能并不是最优的,导致性能不稳定。本篇论文旨在探讨,如何提升预训练语言模型进行自然语言提示的有效性。

方法:作者提出了 P-Tuning,设计了一种连续可微的 virtual token(同 Prefix-Tuning 类似)。将 Prompt 转换为可以学习的 Embedding 层,用 MLP+LSTM 的方式来对 Prompt Embedding 进行处理。
微信截图_20240429140514.png

结论:弥合 GPT 和 NLU 应用程序之间的差距 (2021 年),P 调参后的 GPT 可以比在 NLU 调参的类似大小的 BERT 效果更好。
0240426110655.png
微信截图_20240429140632.png
主图:一个关于“英国的首都是 [MASK]”的提示搜索的例子。在蓝色区域表示上下文(“英国”),红色区域表示目标(“[MASK]”),橙色区域表示提示。在(a)中,提示生成器只接收离散的奖励;在(b)中,连续的提示嵌入和提示编码器可以通过可微的方式进行优化。
参考:https://kexue.fm/search/Prompt+Tuning/

P-tuning V2

英文名称: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
中文名称: P-Tuning v2:提示调整可以在各种规模和任务上普遍与微调相媲美
链接: http://arxiv.org/abs/2110.07602v3
作者: Xiao Liu, Kaixuan Ji, Yicheng Fu, Weng Lam Tam, Zhengxiao Du, Zhilin Yang, Jie Tang
机构: 清华大学, 北京人工智能学会, 上海启智研究院
日期: 2021-10-14

目标:研究的目的是探索如何通过优化提示调整方法,在各种模型规模和自然语言理解任务中实现普遍有效的目标。

方法:最显著的改进是在预训练模型的每一层应用连续提示,而不仅仅是输入层。深度提示调整增加了连续提示的容量,并缩小了不同设置下微调差距的范围,尤其适用于小型模型和复杂任务。

结论:研究发现,经过适当优化的提示调整方法可以在各种模型规模和自然语言理解任务中达到与微调相当的性能,而只需调整 0.1%-3% 的参数(P-tuning 调整 0.01% 参数)。P-Tuning v2 被认为可以作为微调的替代方法,并为未来研究提供了一个强有力的基准。

0426145459.png

5.png
主图:P-tuning 到 P-tuning v2 对比。橙色块(即 h0,…,hi)指的是可训练的提示嵌入;蓝色块是由冻结的预训练语言模型存储或计算的嵌入。

参考:
1.https://zhuanlan.zhihu.com/p/687481429
2.https://www.zhihu.com/tardis/zm/art/627642632?source_id=1003
3.https://zhuanlan.zhihu.com/p/675231376