Zhangzhe's Blog

The projection of my life.

0%

A Survey of Large Language Models

URL

TL;DR

  • 一篇关于大模型的综述,截止到 2023 年 9 月 ,对现有的大模型做了较为详细的梳理。

Survey

1. Introduction

  • LLM (large language model)PLM (pretrain language model) 主要有三个区别:

    1. LLM 表现出一些令人惊讶的涌现能力,这些能力可能在以前较小的 PLM 中没有观察到。

    2. LLM 将彻底改变人类开发和使用人工智能算法的方式,与小型 PLM 不同,访问 LLM 的主要方法是通过提示接口(例如 GPT-4 API)。

    3. LLM 的发展不再明确区分研究和工程。训练 LLM 需要在大规模数据处理和分布式并行训练方面具有丰富的实践经验。

  • 本文主要从四个方面介绍 LLM 的进展:

    1. 预训练:如何训练出一个有能力的 LLM

    2. 适配微调:如何从有效性和安全性两个角度有效地微调预训练的 LLM

    3. 使用:如何利用 LLM 解决各种下游任务

    4. 能力评估:如何评估 LLM 的能力和现有的经验性发现

2. Overview

2.1 大语言模型的涌现能力

LLM 的涌现能力(Emergent Abilities)被正式定义为:在小型模型中不存在但在大型模型中产生的能力,这里介绍三种典型涌现能力:

  1. In-context learning:上下文学习。ICL 能力是由 GPT-3 正式引入的:假设已经为语言模型提供了一个自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列的方式来为测试实例生成预期的输出,而无需额外的训练或梯度更新。

  2. Instruction following:指令遵循。通过使用自然语言描述的混合多任务数据集进行微调(称为指令微调),LLM 在未见过的以指令形式描述的任务上表现出色。

  3. Step-by-step reasoning:逐步推理。通过使用思维链(Chain-of-Thought, CoT)提示策略,LLM 可以通过利用包含中间推理步骤的提示机制来解决这类任务,从而得出最终答案。

LLM_survey_1.png

2.2 大语言模型的关键技术

LLM 的关键技术主要分为以下五个方面:

  1. Scaling(扩展)Transformer 语言模型存在明显的扩展效应,更大的模型/更大的数据规模/更多的训练计算通常会导致模型能力的提升。

  2. Training(训练):分布式训练算法是学习 LLM 网络参数所必需的,其中通常联合使用各种并行策略。为了支持分布式训练,已经发布了一些优化框架来促进并行算法的实现和部署,例如 DeepSpeedMegatron-LM。此外,优化技巧对于训练稳定性和模型性能也很重要,例如预训练以克服训练损失激增和混合精度训练等。

  3. Ability eliciting(能力引导):在大规模语料库上预训练之后,LLM 具备了作为通用任务求解器的潜在能力。然而,当 LLM 执行一些特定任务时,这些能力可能不会显式地展示出来。作为技术手段,设计合适的任务指令或具体的 ICL 策略可以激发这些能力。

  4. Alignment tuning(对齐微调)InstructGPT 设计了一种有效的微调方法,使 LLM 能够按照期望的指令进行操作,其中利用了 基于人类反馈的强化学习技术(RLHF),采用精心设计的标注策略,它将人类反馈纳入训练循环中。

  5. Tools manipulation(操作工具):利用外部工具可以进一步扩展 LLM 的能力。例如,LLM 可以利用计算器进行准确计算,利用搜索引擎检索未知信息,这种机制可以广泛扩展 LLM 的能力范围。

2.3 GPT 系列模型的演进

LLM_survey_2.png

  1. GPT-1: 2018 年

    • 2018 年,OpenAI 发布了 GPT-1,代表生成式预训练(Generative Pre-Training)。

    • GPT-1 是基于生成型的、仅含有解码器Transformer 架构开发的,并采用了无监督预训练和有监督微调的混合方法。

    • GPT-1GPT 系列模型建立了核心架构,并确立了对自然语言文本进行建模的基本原则,即预测下一个单词

  2. GPT-2: 2019 年

    • 将参数规模增加到了 15 亿,并使用大规模的网页数据集 WebText 进行训练。

    • 它旨在通过无监督语言建模来执行任务,而无需使用标记数据进行显式微调

    • 尽管 GPT-2 旨在成为一个无监督的多任务学习器,但与监督微调的 SOTA 方法相比,其整体性能仍然较差。

  3. GPT-3: 2020 年

    • 参数规模增加到了 175 亿,引入了 ICL 的概念,它是以小样本或零样本的方式使用 LLMICL 可以指导 LLM 理解以自然语言文本的形式给出的任务。

    • GPT-3 不仅在各种 NLP 任务中表现出色,而且在一些需要推理或领域适配能力的特殊设计的任务中也表现出色。

    • GPT-3 可以被视 为从 PLMLLM 进化过程中的一个重要里程碑。它通过实证证明,将神经网络扩展到大的规模可以大幅增加模型的能力。

    • OpenAI 为了提高 GPT-3 的性能,使用了两种策略:

      1. 使用代码数据进行训练

        • 原始的 GPT-3 模型(在纯文本上进行预训练)的一个主要限制在于缺乏复杂任务的推理能力,例如完成代码和解决数学问题。
        • OpenAI2021.07 推出了 Codex,这是一个在大量 GitHub 代码上微调的 GPT 模型,Codex 可以解决非常困难的编程问题,并且在数学问题上有显著的性能提升。
        • 实际上,GPT-3.5 模型是在基于代码的 GPT 模型(code-davinci-002)的基础上开发的。
      2. 与人类对齐

        • InstructGPT2022.01 提出,以改进 GPT-3 模型与人类对齐能力,正式建立了一个三阶段的基于人类反馈的强化学习(RLHF)算法。
        • 除了提高指令遵循能力之外,RLHF 算法对于缓解有害或有毒内容的生成问题十分有效,这对于 LLM 在实践中的安全部署至关重要。
        • OpenAI 在对齐研究中的方法,总结了三个有前途的方向:
          1. 使用人类反馈训练 AI 系统
          2. 协助人类评估
          3. 做对齐研究
  4. ChatGPT: 2022 年

    • 它是以类似 InstructGPT 的方式进行训练的(在原始文章中称为“InstructGPT 的姊妹模型”),但专门针对对话能力进行了优化。
    • ChatGPT 训练数据是通过将人类生成的对话(扮演用户和 AI 两个角色)与 InstructGPT 数据集结合起来以对话形式生成。
    • ChatGPT 在与人类的交流中表现出卓越的能力:
      1. 拥有丰富的知识库
      2. 擅长解决数学问题
      3. 准确追踪多轮对话中的上下文
      4. 与人类的价值观保持一致以确保被安全使用
    • ChatGPT 支持了插件机制,进一步通过已有工具或应用扩展了 ChatGPT 的功能。
  5. GPT-4: 2023 年

    • 将文本输入扩展到多模态信号,性能有大幅提升。
    • GPT-4 对于具有恶意或挑衅的提问的响应更加安全,并采用了多种干预策略来减轻语言模型的可能问题,如幻觉、隐私和过度依赖。

3. 大语言模型公开可用资源

3.1 公开可用的模型检查点或 API

LLM_survey_3.png
LLM_survey_4.png
LLM_survey_5.png

3.2 常用预训练语料库

常用的用于预训练的语料库有:

  1. Books

    1. BookCorpus 是之前小规模模型(如 GPTGPT-2)中常用的预训练数据集,包含超过 11,000 本电子书,涵盖广泛的主题和类型(如小说和传记)。

    2. Gutenberg 是更大的数据语料库,包含超过 70,000 本文学作品,包括小说、散文、诗歌、戏剧、历史、科学、哲学和其他公共领域的作品。

    3. GPT-3 中使用到的 Books1Books2 是比 Gutenberg 大的多的语料库,但并未开源。

  2. CommonCrawl

    1. CommonCrawl 是最大的开源网络爬虫数据库之一,能力达到了百万亿字节级别,已经被广泛运用于训练 LLM

    2. 由于网络数据中存在大量的噪音和低质量信息,因此使用前需要进行数据预处理。目前有四个较为常用的基于 CommonCrawl 的过滤数据集:

      1. C4

      2. CC-Stories

      3. CC-News

      4. RealNews

  3. Reddit Link

    1. Reddit 是一个社交媒体平台,用户可以在上 面提交链接和帖子,其他人可以通过“赞同”或“反对”投票。高赞的帖子通常被认为对多数用户是有帮助的,可以用来创建高质量的数据集。

    2. WebText 就是一个著名的基于 Reddit 的 语料库,它由 Reddit 上高赞的链接组成,但尚未公开

    3. 作为替代,有一个易于获取的开源替代品叫做 OpenWebText

    4. 另一个从 Reddit 中提取的语料库是 PushShift.io.

  4. Wikipedia

    1. Wikipedia 是一个在线百科全书,包含大量高质量的文章,涵盖各种主题。其中大部分文章都采用解释性写作风格(并支持引用),覆盖了多种不同语言和广泛的知识领域。
  5. Code

    1. 为了收集代码数据,现有工作主要是从互联网上爬取有开源许可证的代码。代码数据有两个主要来源:

      1. 包括开源许可证的公共代码库(例如 GitHub

      2. 与代码相关的问答平台(例如 StackOverflow

    2. Google 公开发布了 BigQuery 数据集,其中包括各种编程语言的大量开源许可证代码片段, 是一个典型的代码数据集。

  6. Other

    1. The Pile 是一个大规模、多样化、开源的文本数据集,有超过 800GB 数据,内容包括书籍、网站、代码、科学论文和社交媒体平台等。它由 22 个多样化的高质量子集构成。

    2. ROOTS 由各种较小的数据集(完全为 1.61 TB 的文本)组成,涵盖了 59 种不同的语言(包含自然语言和传统语言)。

经典模型使用的预训练语料库:

  1. GPT-3(175B) 是在混合数据集(共 3000 亿 token)上进行训练的,包括:

    1. CommonCrawl

    2. WebText2

    3. Books1

    4. Books2

    5. Wikipedia

  2. PaLM(540B) 使用了共包含 7800 亿 token 的数据集,包括:

    1. 社交媒体对话

    2. 过滤后的网页

    3. 书籍

    4. Github

    5. 多语言维基百科

    6. 新闻

  3. LLaMA 使用了更多的数据预训练,其中 LLaMA(6B)LLaMA(13B) 的训练数据大小为 1.0 万亿 token,而 LLaMA(32B)LLaMA(65B) 使用了 1.4 万亿 token,包括:

    1. CommonCrawl

    2. C4

    3. Github

    4. Wikipedia

    5. 书籍

    6. ArXiv

    7. StackExchange

3.3 常用 Fine-tuning 语料库

  1. instrction tuning (指令微调) 常用数据集

    instrction tuning (指令微调) 过程可将预训练好的多任务模型在 Zero-shot 任务上表现更好。

    1. NLP task dataset

      1. P3 (Public Pool of Prompts)

        1. 一个涵盖各种自然语言处理任务的 Prompted 英文数据集集合,Prompt 是输入模板和目标模板的组合。

        2. 模板是将数据示例映射到自然语言输入和目标序列的函数。例如,在自然语言推理(NLI)数据集的情况下,数据示例将包括 Premise(前提)、Hypothesis(假设)和 Label(标签)字段。

        3. 输入模板可以定义为:“如果 {Premise} 为真,则 {Hypothesis} 也为真吗?”,而目标模板可以定义为:选择的选项为 Choices[label]。这里的 Choices 是特定于 Prompt 的元数据,包含对应于标签为包含(0)、中性(1)或矛盾(2)的选项 yesmaybeno

      2. FLAN 使用的 instrction tunning 数据集

        1. FLAN 实际上是 google 的 《Finetuned Language Models Are Zero-Shot Learners》提出的模型,该模型用了大量的自然语言理解(NLU)和自然语言生成(NLG)任务数据集做指令微调。
          LLM_survey_6.png

        2. 指令微调后的模型在 Zero-shot 任务上表现更好。

    2. Daily chat dataset

      1. ShareGPT:由用户资源上传的和 ChatGPTGPT4 的对话,总量大约 90,000 组对话。

      2. OpenAssistant:多语言的人类和 AI 助手的对话,包含 35 种语言,66,497 组对话和 461,292 个人类标注。

      3. Dolly:由 Databricks 公司制作的 15,000 条英文人类对话,包含 7 大子类:

        1. 头脑风暴
        2. 内容生成
        3. 信息提取
        4. 摘要
        5. 分类
        6. 开卷考试的质量保证 (closed-book quality assurance)
        7. 闭卷考试的质量保证 (open-book quality assurance)
    3. 合成数据

      1. Self-Instruct-52K:一个由 Self-Instruct 框架生成的指令遵循数据集,共 82,000 个实例包含约 52,000 条指令。

      2. Alpaca:一个用于训练和评估指令遵循型语言模型的集合,它包含了 52,000 条独特的指令和相应的输出,这些数据是基于 OpenAItext-davinci-003 模型自动生成的。

      3. Baize:是一个开源的多轮对话数据集,它通过让 ChatGPT 自我对话生成,旨在为训练和评估对话模型提供高质量的语料资源。对话全部为英文,共包含 111.5K 个实例。

  2. Alignment(对齐) 常用数据集

    Alignment(对齐)过程的目的是让 LLM 对齐人类的价值观和偏好。Alignment 数据集需要是高质量的、有帮助的、诚实的、无害的。

    1. HH-RLHF :是由 Anthropic 公司收集的,用于训练和评估强化学习中的偏好(或奖励)模型的数据集,包含约 169K 实例。这个数据集包含两部分:

      1. 有益和无害性的人类偏好数据

      2. 红队对抗数据

    2. SHP:包含 385,000 条人类偏好的数据集,这些偏好是对 18 个不同主题领域中问题/指令的回答进行的。

    3. PKU-SafeRLHF:由北京大学团队开发的,用于支持和推动安全强化学习(RLHF)技术的研究和发展的数据集。这个数据集是目前为止最大的多轮 RLHF 数据集之一,规模达到 100 万条,包含了一系列安全偏好的标注,这些标注覆盖了侮辱、歧视、犯罪、心理伤害、悲观情绪、色情、隐私等多种维度,用于对 RLHF 技术进行细粒度的约束价值对齐。

    4. Stack Exchange Preferences:是一个从 Stack Overflow 数据转储中提取的问答对数据集,它被设计用于偏好学习(preference learning)。这个数据集包含了大量的问题和答案,其中答案基于得票数进行了评分。数据集的大小超过了 20GB,并且包含了数百万条问题和答案对。

    5. Sandbox Alignment Data 是一个由大型语言模型(LLM)生成的对齐数据集,包含约 169K 个实例,它包含了来自模拟社交互动环境 SANDBOX 的反馈。在 SANDBOX 中,模型模拟了人类社会中的交互,通过这种方式生成的对话数据被用来训练和评估语言模型,使其更好地符合人类的价值观和社交规范。

3.4 常用代码库资源

  1. Transformers:一个使用 Transformer 架构构建模型的开源 Python 库,由 Hugging Face 开发和维护。它具有简单和用户友好的 API,方便使用和定制各种预训练模型。

  2. DeepSpeed:由 Microsoft 开发的深度学习优化库(与 PyTorch 兼容),已用于训练多个 LLM,例如 MTNLGBLOOM。它提供了各种分布式训练优化技术的支持,例如内存优化(ZeRO 技术、梯度检查点)和管道并行。

  3. Megatron-LM:由 NVIDIA 开发的深度学习库,用于训练 LLM。它提供了丰富的分布式训练优化技术,包括模型和数据并行、混合精度训练和 FlashAttention。这些优化技术可以大大提高训练效率和速度,并实现 GPU 间的高效分布式训练。

  4. JAX:由 Google 开发的用于高性能机器学习算法的 Python 库,允许用户在带有硬件加速(例如 GPUTPU)的情况下进行数组的高效运算。它可以在各种设备上进行高效计算,还支持自动微分和即时编译等特色功能。

  5. Colossal-AI:由 HPC-AI Tech 开发的用于训练大规模人工智能模型的深度学习库。它基于 PyTorch 实现,并支持丰富的并行训练策略。

  6. BMTrain:由 OpenBMB 开发的用于以分布式方式训练大规模参数模型的高效库,强调代码简洁、低资源占用和高可用性。

  7. FastMoE:一种专门用于 MoE(即混合专家)模型的训练库。

  8. vLLM:一个快速、内存高效、易用的 LLM 代码库,用于 LLM 的推理和服务。

  9. DeepSpeed-MIIDeepSpeed Model Implementations for Inference,一个比 vLLM 更快的模型推理服务框架。

  10. DeepSpeed-Chat:基于 DeepSpeed 的一键式训练 RLHF,提速 15 倍。

4. 预训练

预训练为 LLM 的语言理解和生成能力奠定了基础。

4.1 数据收集和处理

  1. 数据来源

    1. 通用文本数据

      1. Webpages

      2. Conversation text

      3. Books

    2. 专用文本数据

      1. 多语音文本

      2. 科学文本

      3. 代码

  2. 数据处理

    一个好用的数据处理代码库是 Data-Juicer

    1. 质量过滤

      为删除语料库中的低质量数据,通过有两种方式:基于分类器的方法基于启发式的方法

      1. 基于分类器的方法

        1. 通常采用高质量文本(例如 wikipedia)作为正样本,候选文本作为负样本,训练二分类器,用于给出一个文本的质量分数。

        2. 预计分类器的质量过滤方法可能会 无意识的删除口语化、方言、社会语音的文本

      2. 基于启发式的方法

        启发式方法通常采用一系列预设的规则来过滤低质量文本,具体的方法有:

        1. 基于语言的过滤:例如删除小语种文本等。

        2. 基于度量的过滤:例如基于困惑度(perplexity)来检测和删除不自然的文本。

        3. 基于统计的过滤:例如根据标点符号的分布、符合和单词的比例等删除。

        4. 基于关键词的过滤:例如删除 HTML 标签、超链接、模板等。

    2. 数据去重

      1. 现有研究表明,重复数据会降低语料库的多样性,可能导致训练过程不稳定,从而影响模型性能。

      2. 三种粒度的数据去重:

        1. 句子级

        2. 文档级

        3. 数据集级

    3. 隐私去除

      1. 预训练数据大多来自网络,可能包含敏感隐私信息,存在隐私泄露风险。因此需要从数据集中删除 personally identifiable information(可识别个人信息,PII)。

      2. 一种有效的删除方法是通过规则(例如:关键字识别)来检测和删除可识别各人信息(例如:姓名、电话、地址等)。

      3. 现有研究表明,LLM 在隐私攻击下的脆弱性可能归因于预训练数据中存在重复的可识别个人信息。

    4. 分词(Tokenization

      分词也是数据预处理的关键步骤,它的目的是将原始文本分割成词序列,随后用作 LLM 的输入。常用的分词方式有以下三种:

      1. BPE (Byte-Pair Encoding tokenization) 字节对编码,计算过程如下:

        1. 首先将文本拆分成字母和分隔符,并统计每个字母或分隔符出现的频率。

        2. 计算任意两个字母/分隔符合并后出现的频率,找到最高频的字母/分隔符对合并,重新统计词频并更新词表。

        3. 重复第二步,直到词表大小满足要求。

        4. 特点:

          1. 简单高效

          2. 贪心算法,每一步都选择频数最大的相邻字符进行合并,这种做法可能不一定是全局最优、频数也不一定是最好的合并指标。

          3. 适合拉丁字母组成的语言,不适合汉字、日韩文字等。

      2. WordPiece tokenization,计算过程如下:

        1. 首先将文本拆分成字母和分隔符。

        2. 不同于 BPE 选择合并后词频最大的词作为 SubwordWordPiece 基于语言模型似然概率的最大值生成新的 Subword,具体的基于语言模型似然概率的定义如下:

          1. $S=(t_1,t_2,…,t_n)$,句子 Sn 个子词组成。

          2. 则句子 S 的似然概率定义为:$log P(S)=\sum_{i=1}^n logP(t_i)$

          3. 其中 P() 表示一个训练好的语言概率模型。

        3. 找到合并后可以使得句子的似然概率最大的子词合并,更新词表,重复这个过程。

      3. Unigram LM,计算过程如下:

        1. UnigramBPE 以及 WordPiece 有个很大的不同是:

          1. BPEWordPiece 都是初始化小词表逐步变大直到满足词表大小要求。

          2. Unigram LM 是初始化大词表逐步删词直到满足词表大小要求。

        2. Unigram LM 删词的根据和 WordPiece 一致,都是基于语言模型似然概率

  3. 预训练数据对大语言模型的影响

    与小规模的 PLM 不同,由于对计算资源的巨大需求,通常不可能对 LLM 进行多次预训练迭代。因此,在训练 LLM 之前构建一个准备充分的预训练语料库尤为重要。

    目前,不同的 LLM 模型预训练采用不同的预训练策略,下图是一些模型的预训练数据分布图:

    LLM_survey_7.png

    不过,存在几个有效的混合策略:

    1. 增加数据的多样性(diversity

      预训练阶段,数据的多样性比数据的质量更重要,有实验表明,删除语料库中的多样性数据(例如:Webpages)比删除语料库中的高质量数据(例如:学术语料库)对模型的影响更大。

    2. 可以通过数据混合实验优化数据混合策略

      1. 在大模型上做数据混合实验是非常昂贵且耗时的,通过会在小模型上测试不同的数据混合策略的优劣,再将小模型测试得到的结果用在大模型上。

      2. 但小模型得到的数据混合策略结论在大模型上可能是不成立的,越大的小模型得出来结论越可信。

    3. 先用 general 数据训练模型通用能力,再用 skill-spcific 数据训练模型专业能力

      1. 不同的数据训练的模型有不同的能力,比如:

        1. 用代码训练的模型对数学和编程更擅长。

        2. 用书籍训练的模型更擅长从文本中捕捉长期依赖。

      2. 先训练 basic skill 再训练 target skill 比直接训练 target skill 模型表现更好

4.2 网络结构

LLM_survey_8.png

  1. 典型结构

    1. Casual Decoder 结构

      1. 参考 GPT 博客中的 Hello, world! 续写例子
    2. Encoder-Decoder 结构

      1. 参考 T5 博客中的 Hello, world! 英语翻译法语的例子
    3. Prefix Decoder 结构

      1. 是对 Encoder-DecoderCasual Decoder 的折中,在 Encoder 中使用双向注意力,在 Decoder 中使用单向注意力

      2. 用到 Prefix Decoder 的模型有:

        • U-PaLM
        • GLM
    4. Mixture-of-Experts (混合专家)结构

      1. 优势:是一种灵活的模型参数扩展方法;性能提高明显;

      2. 劣势:由于路由操作复杂等原因,训练容易不稳定;

      3. 传言 GPT-4 使用了 MOE 结构

    5. Emergent Architectures(新兴结构)

      LLM_survey_9.png

      1. 现有架构存在的问题:

        1. Transformer 架构一个很大的问题是推理时复杂度较高,每一个 token 需要计算和之前的每一个 token 计算相关性

        2. 相比之下,RNN 架构推理的复杂度就很低,每一个 token 只需要和上一个 token 以及一个不断更新的 hidden state 计算相关性(本质是 hidden state 在某种程度上存储了之前所有 token 的信息)

        3. RNN 数据依赖问题非常强,导致训练难以并行化,且通常效果较差

      2. 一些新兴架构包括:

        1. H3/S4
        2. RWKV
        3. Hyena
        4. Mamba
        5. RetNet
      3. 这些新兴架构几乎无一例外的想做同一件事:Transformer 一样可以并行训练 + 像 RNN 一样高效推理,且效果可以和 Transformer 媲美

  2. 配置细节

    LLM_survey_11.png

    1. 归一化方法

      1. LayerNorm

        • LayerNormBatchNorm 只有两个差别,为了简化,假设 Channel = 1feature shape = N, 1, H, W

          • 训练时差别:

            • BatchNorm 统计整个 feature map 的均值和标准差(scalar),然后在整个 feature map 做标准正态化;同时记录(滑动平均算法)到 running_mean / running_var 参数中

            • LayerNorm 统计每一个样本的均值和标准差(长度为 Nvector),然后每个样本逐个做标准正态化;均值标准差用完即扔,无需记录

          • 推理时差别:

            • BatchNorm 推理时不需要计算 feature 的均值和标准差,而是使用训练统计得到的 running_mean / running_var,因此是个静态行为,可以被前面的 Conv2d 运算吸收

            • LayerNorm 推理阶段和训练阶段运算方式基本一致

      2. RMSNorm

        • 假设输入 shapeN, C, L 分别表示 batch / feature_dim / seq_length

        • $RMS(x_c)=\sqrt{\frac{1}{C}\sum_{n=1}^N\sum_{l=1}^Lx_{nl}^2}\\RMSNorm(x_c)=\frac{x_c}{RMS(x_c)}*k+b$

        • 其中,k / b 都是可学习的 per channel 向量

        • LayerNorm 相比 RMSNorm 有如下优势:

          1. 更小的计算开销:RMSNorm 不需要计算输入数据的均值,因此减少了计算量,使得模型训练更加高效。
          2. 训练速度更快:由于减少了计算量,RMSNorm 在训练过程中的速度通常比 LayerNorm 更快。
          3. 性能相当或更好:尽管 RMSNorm 的计算更简单,但它在保持与 LayerNorm 相当性能的同时,甚至可能在某些情况下提供更好的性能。
          4. 保留重要的不变性:RMSNorm 保留了输入数据的均方根比例不变性,这有助于模型在面对不同尺度的输入数据时保持一致的性能。
          5. 隐式学习率适应:RMSNorm 通过归一化输入数据的 RMS,为模型提供了一种隐式的学习率适应能力,有助于模型在训练过程中更好地调整参数。
      3. DeepNorm

        • DeepNorm 可以看做是一种增强型 LayerNorm,对 LayerNorm 改动较小,但效果惊人,DeepNorm 用在 Post-LN 架构上替代传统 LayerNorm 运算,可稳定训练,可训练深度超过 1,000 层的 Transformer

        • DeepNormLayerNorm 的改动如下:

          $LayerNorm (x + f(x)) \rightarrow LayerNorm(x*\alpha + f(x))$

          LLM_survey_10.png

    2. 归一化位置

      1. Pre-LN

        • Pre-LN 是一种 Transformer 架构,计算公式是:

          $x=x+MHA(LayerNorm(x))\\x=x+FFN(LayerNorm(x))\\x = LayerNorm(x)$

      2. Post-LN

        • Post-LN 是另外一种 Transformer 架构,计算公式是:

          $x=LayerNorm(x+MHA(x))\\x=LayerNorm(x+FFN(x))$

      3. Sandwich-LN

        • Sandwich-LNPre-LN 的改进,公式为:

          $x=x+LayerNorm(MHA(LayerNorm(x)))\\x=x+LayerNorm(FFN(LayerNorm(x)))\\x = LayerNorm(x)$

    3. 激活函数

      1. GeLU

        $GeLU(x)=0.5x*(1+erf(\frac{x}{\sqrt 2}))\\erf(x)=\frac{2}{\sqrt \pi}\int_0^xe^{-t^2}dt$

        • 其中 erf 表示高斯误差函数,值域是 [-1, 1]

        • GeLULLM 中使用最广泛的激活函数

      2. Swish

        $Swish(x) = x*sigmoid(x)$

      3. SwiGLU

        $SwiGLU(x_1, x_2) = Swish(x_1) * x_2$

      4. GeGLU

        $GeGLU(x_1, x_2)=GeLU(x_1) * x_2$

    4. 位置编码

      1. 绝对位置编码

        • 用在传统 Transformer 上,有两种:

          1. 位置编码(position encoding):使用正弦得到位置编码

          2. 可学习位置编码(position embedding):使用可学习的 embedding 编码

      2. 相对位置编码