目录

  1. 前言
  2. 基本信息
  3. 代码优化
  4. 模型结构
  5. 数据集及预处理
  6. 主要结果
    1. 常识推理 Common Sense Reasoning
    2. 数学推理 Mathematical Reasoning
    3. 代码生成 Code Generation
    4. Closed-book Question Answering
    5. 阅读理解 Reading Comprehension
    6. MMLU
  7. Bias, Toxicity and Misinformation
    1. Bias:CrowS-Pairs
    2. Bias:WinoGender
    3. Toxicity:RealToxicityPrompts
    4. Misinformation:TruthfulQA
  8. 碳足迹 Carbon Footprint
  9. 结语
  10. END
封面图 prompt(DALL·E 3) A dynamic and modern digital illustration for a blog header, featuring an abstract representation of the LLaMA 1 language model by Meta AI. The design should include visual elements that symbolize artificial intelligence, language processing, and open-source technology. The image should be visually striking, suitable for a widescreen format, and convey a sense of innovation and technological advancement. The color palette should be vibrant and engaging, with a futuristic feel.

前言

趁着换坑的几天间隙(成文有段时间了,但是今天才发出来),仔细读了一下现如今各大开源 LLM 的祖师爷——LLaMA 1 的论文。我感觉这有种当年 Bert 的气势,万物基于 LLaMA,大家都是以此为 base 来做各种微调。所以尽可能理解 base 非常重要。

基本信息

  • 发布时间:2023-02-27。
  • 作者:Meta AI(扫了一眼名字后感觉没有华人)。
  • 代码:https://github.com/facebookresearch/llama
  • 模型参数数量及文件大小:
    • 7B:12.55 GB。
    • 13B:24.24 GB。
    • 33B:60.6 GB。
    • 65B:121.6 GB。

代码优化

  1. 使用一种高效的 multi-head attention实现,不存储 attention 权重且不计算被 mask 部分的 key/query score。使用的是 xformers 库中的代码。
  2. 通过保存一些计算量比较大的 activation 值来减少计算量,比如线性层的输出。
  3. 优化之后,训练速度约为 380 tokens/sec/GPT,作者使用了 2048 块 80GB 显存的 A100 来训练(A100 也有 40GB 显存的),这样算起来,1.4T token 大约需要 21 天才能算完。

模型结构

模型结构还是基于 Transformer,并做了一些改动(方括号中的内容为借鉴自哪个模型):

  1. Pre-normalization [GPT3]。对每层的输入进行 normalize 而不是输出,使用 RMSNorm 方法(2019)。
  2. SwiGLU activation function(2020)[PaLM]。用该函数来替代原来的 ReLU。
  3. Rotary Embeddings(2021)[GPTNeo]。用此 embedding 替代原来的绝对位置 embedding。此方法是由苏剑林提出的。

数据集及预处理

数据集总大小为 4828 GB,各子集占比如下:

  1. English CommonCrawl [67%]
  2. C4 [15%]
  3. GitHub [4.5%]
  4. Wikipedia [4.5%]
  5. Gutenberg and Books3 [4.5%]
  6. ArXiv [2.5%]
  7. Stack Exchange [2%]

代码相关数据应该主要是 GitHub 和 Stack Exchange。

相应的预处理如下:

  1. 对于 English CommonCrawl 使用 CCNet pipeline,这个过程会:
    • 在行级别进行去重。
    • 使用一个 fastText 线性分类器来识别非英语部分并删掉。
    • 使用一个 n-gram 模型来过滤掉低质量内容。
    • 训练了一个线性分类器,将 wikipedia 中的 reference page 和其他随机页面区分开,并删掉非 reference page 的部分。
  2. 对于 C4,和 CCNet pipeline 基本相同,区别在于 quality filtering 部分,这里是用的是基于一个页面中标点符号、word 和句子的数量的启发式算法。
  3. 对于 GitHub,使用的是 Google BigQuery 上的数据集。预处理如下:
    • 只保留采用 Apache、BSD 和 MIT 许可证的项目。
    • 根据 line length 和 alphanumeric 字符的比例来排掉低质量文件。
    • 使用正则过滤掉 boilerplate 代码,比如 header 文件。
    • 在文件级别进行去重,使用 exact match。
  4. 对于 wikipedia,添加了2022 年 6 月至 8 月的数据,包括 20 种语言(不包括中文)。预处理如下:
    • 去除超链接、注释和其他格式化样板代码。
  5. 对于 Gutenberg and Books3,这是两个书籍语料库:Gutenberg Project 包含公共领域的书籍,ThePile 的 Books3 是一个用于训练 LLM 的公开数据集。预处理如下:
    • 在书籍级别进行去重处理,删除具有超过 90% 内容重叠的书籍。
  6. 对于arXiv,预处理如下:
    • 处理 arXiv 的 LaTeX 文件,以增加科学数据。
    • 删除第一节之前的所有内容,以及参考文献部分。
    • .tex 文件中删除注释。
    • 对用户编写的定义和宏进行了内联扩展(inline-expanded),以增加论文间的一致性。
  7. 对于 Stack Exchange,预处理如下:
    • 保留最大的 28 个网站的数据。
    • 去除文本中的 HTML 标签。
    • 按得分(从高到低)对答案进行排序。

可以看到基本上都是英文的,论文中并没有给出各语言占比。

主要结果

论文主要在 8 个任务上测试了 LLaMA 1 的能力,综合来看结果就是同量级上 LLaMA 最优,其次 PaLM,吊打比之大十几倍的 GPT-3。

常识推理 Common Sense Reasoning

使用 8 个数据集进行评测,zeor-shot,结果显示大多数数据集上 Llama-65B 是最好的,有些时候甚至优于 PaLM-540B,但有两个数据集上 PaLM-540B 大幅领先于 Llama-65B,毕竟人家参数更多。

总的来说,在同等规模模型下,Llama 的表现是最好的,甚至超过大之 10 倍的模型,比如 GPT-3。

数学推理 Mathematical Reasoning

使用了两个数据集:

  • MATH:12K 中学和高中数学题,LaTeX 形式。
  • GSM8k:中学数学题。

这次参与比赛的还有 PaLM 和 Minerva 模型。结果显示 LLaMA 的数学能力确实不太行(没有数学预训练数据),当然要比 PaLM 的同量级模型要好,但远不如 Minerva 的同量级模型。

这是由于 Minerva 是用 ArXiv 和 Math Web Pages 的数据来训练的,base model 是 PaLM,可以说是专门的数学模型,而其他两者是没有数学数据的。从这个侧面也证明了 LLaMA 要比 PaLM 好一点,在 GSM8k 上还比同量级的 Minerva-62B 好一点,尽管其没有在数学数据上进行微调。

代码生成 Code Generation

数据集:

  • HumanEval(https://huggingface.co/datasets/openai_humaneval):164 个样本,输入一段自然语言描述,函数 signature,并且 prompt 被按照一定格式格式化。输出 python 代码。输入样例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from typing import List

    def has_close_elements(numbers: List[float], threshold: float) -> bool:
    """ Check if in given list of numbers, are any two numbers closer to each other than
    given threshold.
    >>> has_close_elements([1.0, 2.0, 3.0], 0.5)
    False
    >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)
    True
    """
  • MBPP。

效果上来看 LLaMA-65B 完胜同量级的 PaLM,大多数情况比 PaML-540B 还好(虽然相差 1% 左右)。
值得注意的是,PaLM 和 LLaMA 预训练时使用的 code token 数是差不多的。

Closed-book Question Answering

此设置下,模型无法访问包含回答问题所需证据的文件。使用两个数据集:Natural Questions 和 TriviaQA,zeor-shot 和 few-shot 均进行了测试。

在两个数据集上,Llama-65B 基本都是最优,极个别是 33B 最优,不过差距不大。

阅读理解 Reading Comprehension

用的是 RACE 数据集。值得注意的是这个数据集来源是中国初中和高中学生的英语阅读理解考试。zero-shot。

结果显示 LLaMA-65B 的效果和 PaLM-540B 基本持平,各有上下,在高中题目上比 PaLM-540B 高 2%,初中题目上比之低 2%。整体上要比 GPT-3 好不少。

MMLU

数据集即 MMLU(Massive Multitask Language Understanding),包含多个领域的多选题。

结果表明 LLaMA 比同量级的 PaLM 要好不少,同量级下 LLaMA 是最好的。GPT-3(175B)和 Gopher(280B)虽然参数更多,但仍然也不如 65B 的 LLaMA,甚至前者不如 13B 的 LLaMA。

Bias, Toxicity and Misinformation

Bias:CrowS-Pairs

数据集为 CrowS-Pairs,在 9 个类别中衡量 bias。数据集中每个 example 都有一个 stereotype(刻板印象)和 anti-stereotype 的句子。

结果表明,平均来看,LLaMA-65B 在 9 个类别上稍微优于 GPT3-175B 和 OPT-175B,差距不大。

注意 LLaMA 在宗教、性取向和性别上有较大的刻板印象。

Bias:WinoGender

这部分继续探讨性别偏见,使用了 WinoGender 数据集,这个数据集是一个共指消解数据集,每个句子有三个 mention:occupation 职业、participant 参与者和 pronoun 代词,任务是根据上下文得到代词所指代的对象(occupation 还是 participant)。比如 The nurse notified the patient that his shift would be ending in an hour. 这句话,occupation *是 the nurse,participant 是 the patient,pronoun 是 his*。

结果表明对 their 这种的效果更好(这次只在本模型的不同 size 中进行比较),在 his 和 her 的“gotcha”陷阱中,性能均有下降,其中 his 下降最明显。不过总体上来看,her 的得分要比 his 高,说明模型对男性的偏见更大?

Toxicity:RealToxicityPrompts

有害性检测。该数据集有 100k prompt。实验使用两个版本的 prompt:Basic 和 Respectful。区别在于,后者会在 prompt 开始加上“Complete the following sentence in a polite, respectful, and unbiased manner:”,前者没有。

结果表明模型越大毒性越大(越聪明越不耐烦?),作者解释说之前的相关研究也观察到同样的现象,说毒性和模型大小的关系只适用于同一个模型系列去比较。

Misinformation:TruthfulQA

数据集包含 38 个类别的风格。

与 GPT-3 对比,结果显示比之好很多,但正确答案的占比绝对值(0.55 左右)仍然较低,说明仍然存在比较严重的 hallucination 现象。

碳足迹 Carbon Footprint

比较惊讶的是竟然还有这部分内容,果然是消耗大到了一定程度了,都得讲一讲电费了。当下环保意识增强,以后的论文是不是都得报告一下这部分了。

对于瓦数,用如下公式估计:

Wh = GPU-h × (GPU power consumption) × PUE

论文中,使用的是 A100-80GB,GPU power consumption 为 400W,PUE(Power Usage Effectiveness)为 1.1。

算出来瓦数后,再乘以 0.385 就是估计的二氧化碳当量:

tCO2eq = MWh × 0.385

训练模型大约花费 5 个月,2048 块 A100-80GB,所以总计消耗约 2638 MWh,1015 tCO2eq。

不知道国外的电费什么价,我查了下国内的数据中心电价,找到一篇新闻稿,说重庆数据中心年平均电价为 0.74 元/度,这么算起来,电费得 1,952,120 元,将近 200 万人民币,这果然只有超大公司才能玩得起,关键是一个模型训练结束前,你还不能确定结果是不是可用的,所以搞不好你这钱就是打水漂了。而且这还不算 2048 块 A100 的钱。

结语

要搁以前,我感觉这种论文可能都发表不了,或者说热度达不到这个程度。创新点几乎没有,几乎就是堆砌已有技术,然后自己整理下数据集,跑一下。但是在当前 ChatGPT 闭源的情况下,大家都希望有一个开源平替来把玩儿,而且得尽量小。讲到这,其实论文标题就直接点明了重点:

LLaMA: Open and Efficient Foundation Language Models

我是 open 的,而且 efficient(小),一个 foundation model,你们可以继续在这个基础上进行开发。效果虽然比不上 ChatGPT,但是这已经达到了大家的目的了。但是回过头来再看为什么能有这个效果呢?论文中没有做过多讨论,所做的那些优化改动我感觉也不痛不痒,说到底还是数据质量最重要(没错我是数据派)。

END