详聊LLaMa技能细节:LLaMA大模子是如何炼成的?
本文先容来自 Meta AI 的 LLaMa 模子,类似于 OPT,也是一种完全开源的大语言模子。LLaMa 的参数量级从 7B 到 65B 大小不等,是在数万亿个 token 上面练习得到。值得一提的是,LLaMa 固然只使用公共的数据集,依然取得了强悍的性能。本文目录
1 LLaMa:开源高效的大语言模子
(来自 Meta AI)
1.1 背景:模子参数量级的积累,或者练习数据的增长,哪个对性能提升帮助更大?
1.2 LLaMa 做到了什么
1.3 LLaMa 预练习数据
1.4 LLaMa 模子架构
1.5 LLaMa 的优化
1.6 LLaMa 的高效实现
1.7 LLaMa 实行结果
1.8 练习期间的性能变化
太长不看版
本文先容来自 Meta AI 的 LLaMa 模子,类似于 OPT,也是一种完全开源的大语言模子。LLaMa 的参数量级从 7B 到 65B 大小不等,是在数万亿个 token 上面练习得到。值得一提的是,LLaMa 固然只使用公共的数据集,依然取得了强悍的性能。LLaMA-13B 在大多数基准测试中都优于 GPT-3 (175B),LLaMA65B 与最佳模子 Chinchilla-70B 和 PaLM-540B 相比具有竞争力。
1 LLaMa:开源高效的大语言模子
论文名称:LLaMA: Open and Efficient Foundation Language Models
论文地址:
https://arxiv.org/pdf/2302.13971.pdf
代码链接:
https://github.com/facebookresearch/llama
1.1 背景:模子参数量级的积累,或者练习数据的增长,哪个对性能提升帮助更大?
以 GPT-3 为代表的大语言模子 (Large language models, LLMs) 在海量文本集合上练习,展示出了惊人的涌现能力以及零样本迁移和少样本学习能力。GPT-3 把模子的量级缩放到了 175B,也使得反面的研究工作继续去放大语言模子的量级。大家好像有一个共识,就是:模子参数量级的增长就会带来同样的性能提升。
但是究竟确实云云吗?
最近的 “Training Compute-Optimal Large Language Models” 这篇论文提出一种缩放定律 (Scaling Law):
练习大语言模子时,在计算成本达到最优情况下,模子大小和练习数据 (token) 的数量应该比例相等地缩放,即:假如模子的大小更加,那么练习数据的数量也应该更加。
翻译过来就是:当我们给定特定的计算成本预算的条件下,语言模子的最佳性能不但仅可以通过计划较大的模子搭配小一点的数据集得到,也可以通过计划较小的模子配合大量的数据集得到。
那么,相似成本练习 LLM,是大 LLM 配小数据练习,还是小 LLM 配大数据练习更好?
缩放定律 (Scaling Law) 告诉我们对于给定的特定的计算成本预算,如何去匹配最优的模子和数据的大小。但是本文作者团队认为,这个功能只思量了总体的计算成本,忽略了推理时候的成本。因为大部门社区用户其实没有练习 LLM 的资源,他们更多的是拿着训好的 LLM 来推理。在这种情况下,我们首选的模子应该不是练习最快的,而应该是推理最快的 LLM。呼应上题,本文认为答案就是:小 LLM 配大数据练习更好,因为小 LLM 推理更友好。
1.2 LLaMa 做到了什么
LLaMa 沿着小 LLM 配大数据练习的指导头脑,练习了一系列性能强悍的语言模子,参数量从 7B 到 65B。比方,LLaMA-13B 比 GPT-3 小10倍,但是在大多数基准测试中都优于 GPT-3。大一点的 65B 的 LLaMa 模子也和 Chinchilla 或者 PaLM-540B 的性能相当。
同时,LLaMa 模子只使用了公开数据集,开源之后可以复现。但是大多数现有的模子都依靠于不公开或未记录的数据完成练习。
1.3 LLaMa 预练习数据
LLaMa 预练习数据约莫包罗 1.4T tokens,对于绝大部门的练习数据,在练习期间模子只见到过1次,Wikipedia 和 Books 这两个数据集见过2次。
如下图1所示是 LLaMa 预练习数据的含量和分布,其中包罗了 CommonCrawl 和 Books 等不同域的数据。
https://img-blog.csdnimg.cn/img_convert/fda04e1fb3528c8de031126e3c0ec8ea.png
图1:LLaMa 预练习数据的含量和分布
CommonCrawl (占 67%): 包罗 2017 到 2020 的5个版本,预处理部门包罗:删除重复数据,去除掉非英文的数据,并通过一个 n-gram 语言模子过滤掉低质量内容。
C4 (占 15%): 在探索性实行中,作者观察到使用不同的预处理 CommonCrawl 数据集可以提高性能,因此在预练习数据会集加了 C4。预处理部门包罗:删除重复数据,过滤的方法有一些不同,主要依靠于开导式方法,比方标点符号的存在或网页中的单词和句子的数量。
Github (占 4.5%): 在 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 标签并按分数对答案进行排序。
Tokenizer 的做法基于 SentencePieceProcessor,使用 bytepair encoding (BPE) 算法。
LLaMa 的 PyTorch 代码如下,用到了 sentencepiece 这个库。
class Tokenizer:
def __init__(self, model_path: str):
# reload tokenizer
assert os.path.isfile(model_path), model_path
self.sp_model = SentencePieceProcessor(model_file=model_path)
logger.info(f"Reloaded SentencePiece model from {model_path}")
# BOS / EOS token IDs
self.n_words: int = self.sp_model.vocab_size()
self.bos_id: int = self.sp_model.bos_id()
self.eos_id: int = self.sp_model.eos_id()
self.pad_id: int = self.sp_model.pad_id()
logger.info(
f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id}"
)
assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()
def encode(self, s: str, bos: bool, eos: bool) -> List:
assert type(s) is str
t = self.sp_model.encode(s)
if bos:
t = + t
if eos:
t = t +
return t
def decode(self, t: List) -> str:
return self.sp_model.decode(t)
1.4 LLaMa 模子架构
Pre-normalization [受 GPT3 的开导]:
为了提高练习稳固性,LLaMa 对每个 Transformer 的子层的输入进行归一化,而不是对输出进行归一化。使用 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
常规的 Layer Normalization:
https://img-blog.csdnimg.cn/img_convert/13d8ca9449101bb74a22942218fd919b.png
式中, 和 是 LN 的 scale 和 shift 参数, 和 的计算如下式所示:
https://img-blog.csdnimg.cn/img_convert/0a5caeeb6cd3cc12317ce158b111c50e.png
RMSNorm:
相当于是去掉了 这一项。
https://img-blog.csdnimg.cn/img_convert/b466dc7167fd70a8605c787706189cd6.png
看上去就这一点小小的改动,有什么作用呢?RMSNorm 的原始论文进行了一些不变性的分析和梯度上的分析。
SwiGLU 激活函数 [受 PaLM 的开导]:
LLaMa 使用 SwiGLU 激活函数替换 ReLU 非线性以提高性能,维度从 变为 。
Rotary Embeddings [受 GPTNeo 的开导]:
LLaMa 去掉了绝对位置编码,使用旋转位置编码 (Rotary Positional Embeddings, RoPE),这里的 RoPE 来自苏剑林老师,其原理略微复杂,感兴趣的读者可以参考苏神的原始论文和官方博客先容:
https://spaces.ac.cn/archives/8265
针对所有自学遇到困难的同学们,我帮大家系统梳理大模子学习脉络,将这份 LLM大模子资料 分享出来:包罗LLM大模子书籍、640套大模子行业陈诉、LLM大模子学习视频、LLM大模子学习路线、开源大模子学习教程等,
页:
[1]