URL
TL;DR
- 本质是标准
Multi-Head Attention和Multi-Query Attention的一个折衷。

- 目的是 降低
Attention过程内存带宽成本,并没有降低计算复杂度,计算复杂度依然是
Algorithm
1 | import torch |
Thought
GQA介于MHA和MQA之间,每个group内部实际上是MQA
Multi-Head Attention 和 Multi-Query Attention 的一个折衷。
Attention 过程内存带宽成本,并没有降低计算复杂度,计算复杂度依然是 O(n2)1 | import torch |
GQA 介于 MHA 和 MQA 之间,每个 group 内部实际上是 MQAMulti-Head Attention 中的 Key 和 Value 退化为 Single-Head,Query 保留 Multi-HeadAttention 过程内存带宽成本,并没有降低计算复杂度,计算复杂度依然是 O(n2)1 | import torch |
Attention 的部分 multi-head 化HiPPO 全称是 High-order Polynomial Projection Operators,是 SSM (State Space Model) 的开山之作,之后作者延续 SSM 思路,做出了可以和 Transformer 结构掰手腕的 MambaHiPPO 的目标是用一个有限维的向量来储存这一段 u(t) 的信息,实现方式是将 u(t) 通过 Legendre (勒让德)多项式展开,用有限维的向量存储勒让德多项式系数,且这些 向量的值通过求解勒让德多项式得出,不在训练过程中通过梯度下降更新HiPPO 可以给 RNN 提供一种记忆表示方法,因此一个实际的用处是使用 HiPPO 作为 RNN 的记忆存储算子HiPPO 的记忆更新公式是 m(t+1)=Am(t)+Bu(t),其中 A 和 B 是 HiPPO 参数,m(t) 表示记忆向量,u(t) 表示更新向量,m(t+1) 表示更新后的记忆向量
N 表示记忆单元的参数尺度,类似于 Transformer 的 hidden size,越大记忆能力越强HiPPO 有 LegT (Translated Legendre Measure) 和 LegS (Scaled Legendre Measure) 两种度量方法,二者都使用上述记忆更新公式,只是 A 和 B 参数不同
LegT 使用 翻译 任务的勒让德多项式,本质是一个滑动窗口,只记忆当前时刻前 θ 窗口内容,θ 为超参数
LegS 使用 缩放 的勒让德多项式,记忆全部时刻的序列内容
Permute Mnist 分类任务的例子讲解 HiPPO 如何作为 RNN 的单元参与计算,以及HiPPO 的记忆单元如何更新Permute Mnist 任务是将 28x28 的 Mnist 图像的每一类按照同一种 pattern 进行 shuffle,训练并分类HiPPO 作为记忆单元的 RNN 网络解决 Permute Mnist 任务的计算过程,input_t 是每次顺序输入图片的一个像素值,是一个时间步总长为 28 * 28 = 784 的 RNN 网络,最后一个 hidden state 输出映射到 class dim 上进行分类graph TD
subgraph input;
input_t([input_t]);
h_t;
end;
subgraph fully_connect;
W_hxm;
W_gxm;
W_uxh;
end;
h_t([h_t])-->|512|Concat_1-->|513|W_uxh-->|1|u_t([u_t]);
input_t([input_t])-->|1|Concat_1[Concat];
subgraph update_memory;
A([A])-->|max_length, 512, 512|get_index_A[get_index]-->|512, 512|A_t;
timestep([timestep])-->get_index_A;
A_t([A_t])-->|512, 512|MatMul_A[MatMul];
m_t([m_t])-->|1, 512|MatMul_A-->|1, 512|Add;
m_t([m_t])-->|1, 512|Add;
timestep([timestep])-->get_index_B;
B([B])-->|max_length, 512|get_index_B[get_index]-->|512, 1|B_t;
B_t([B_t])-->|512, 1|MatMul_B[MatMul];
u_t([u_t])-->|1|MatMul_B-->|1, 512|Add-->|1, 512|m_t+1([m_t+1]);
end;
m_t+1-->|512|Concat_2;
input_t-->|1|Concat_2[Concat]-->|513|W_hxm-->|512|Tanh-->|512|hidden([hidden]);
Concat_2-->|513|W_gxm-->|512|gate([gate]);
h_t-->|512|Alpha_Blending-->|512|h_t+1([h_t+1])-->|512|until_last_h{until_last_h};
hidden-->|512|Alpha_Blending;
gate-->|512|Alpha_Blending;
subgraph output;
until_last_h-->|512|map_to_class_dim-->|10|classification_result([classification_result]);
end;
LegT 和 LegS 的参数计算过程需要较强的数学功底才能完全理解A 和 B 当做 万能的不需要梯度下降更新的神经网络记忆力更新参数,那么实际上并不复杂T5 名字的由来是:Text-to-Text Transfer Transformer(文本到文本转换的 Transformer)T5 使用了 《Attention is all you need》 中提出的标准 Transformer 网络,没有任何改变T5 是一个 encoder-decoder 架构的模型,可以用来做文本翻译,本例子使用 Hello, world! 英语翻译法语为例prompt 的作用是在输入之前加上对任务的描述english_to_franch("Hello, world!") API 会被 prompt 为 "translate English to French: Hello, world!" 纯文本输入到模型T5 使用的分词算法是 unigram,词表可以在 https://huggingface.co/google-t5/t5-base/blob/main/tokenizer.json 这里找到"translate English to French: Hello, world!" 会被 tokenize 为:[13959, 1566, 12, 2379, 10, 8774, 6, 296, 55, 1]GPT 系列没有区别,需要把 encoder input token id 查表变成 token embeddingGPT 系列使用可学习的 position embedding 不同,T5 使用的是 position encodingGPT 系列只在模型 casual decoder 第一层输入加入 position embedding 不同,T5 的 position encoding 是在 encoder 以及 decoder 的每一层都是使用了GPT 系列直接使用 token embedding + position embedding 直接得到 hidden state 来输入 decoder 不同,T5 有 encoder 结构T5 的 encoder 结构采用标准 transformer encoder 结构,每个 token 可以看到所有 token(双向注意力机制)encoder 一共 12 层,每一层包括如下顺序结构为:
self attention block
layer normself attentiondropoutFFN
layer normMLPdropoutencoder 最终输出一个 shape = (batch, input_token_len, encoder_dim) 的 encoder hidden stateGPT 系列不同之处在于 T5 在 decoder 阶段需要 decoder inputdecoder input 是 <BOS> 或 <S> 等特殊标记,token 长度仅仅为 1,用于表示序列开始decoder input token embedding 和 position encoding 过程和 encoder input token embedding 和 position encoding 并无区别token embedding + position encoding 得到 decoder hidden state,其 shape = (batch, 1, decoder_dim)decoder 一共 12 层,每一层包括如下顺序结构为:
self attention block
layer normself attentiondropoutcross attention block
layer normself attentiondropoutFFN
layer normMLPdropoutself attention 的输入是 decoder hidden state(注意不是 encoder hidden state),在 self attention 中,和 GPT 类似,采用 单向注意力decoder hidden state 和 encoder hidden state 输入到 cross attention中,Cross attention 和 Self attention 实际上只有一个区别:
self attention 的 query / key / value 都由同一个 hidden state 得到,因此称为 selfcross attention 的 key / value 由同一个 hidden state 得到,query 由另一个 hidden state 得到,因此称为 crossencoder-decoder 架构的 transformer 中,decoder 中的 cross attention 的 key / value 通常由 encoder output hidden state 得到,query 通常由 decoder hidden state 得到Cross attention 中每个 decoder hidden state 可以查询到所有的 encoder hidden state12 层,最终输出 shape = (batch, 1, decoder_dim) 的 decoder output hidden statedocoder output hidden state 用一层 MLP 转化到 vocabulary 空间,找到最可能的一个 tokentoken 对应的单词即为模型最终输出的第一个词。标准 transformer 的行为
encoder 输入所有文本,双向注意力,得到 encoder hidden statedecoder 输入初始化为 <BOS>,长度为 1decoder 每一层包含:
self attention,单向注意力cross attention,双向注意力,decoder hidden state 做 query,encoder hidden states 做 key and valueFFNLLM (large language model) 和 PLM (pretrain language model) 主要有三个区别:
LLM 表现出一些令人惊讶的涌现能力,这些能力可能在以前较小的 PLM 中没有观察到。LLM 将彻底改变人类开发和使用人工智能算法的方式,与小型 PLM 不同,访问 LLM 的主要方法是通过提示接口(例如 GPT-4 API)。LLM 的发展不再明确区分研究和工程。训练 LLM 需要在大规模数据处理和分布式并行训练方面具有丰富的实践经验。LLM 的进展:
LLMLLMLLM 解决各种下游任务LLM 的涌现能力(Emergent Abilities)被正式定义为:在小型模型中不存在但在大型模型中产生的能力,这里介绍三种典型涌现能力:
In-context learning(上下文学习)ICL 能力是由 GPT-3 正式引入的:假设已经为语言模型提供了一个自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列的方式来为测试实例生成预期的输出,而无需额外的训练或梯度更新。Instruction following(指令遵循)LLM 在未见过的以指令形式描述的任务上表现出色。Step-by-step reasoning:(逐步推理)Chain-of-Thought, CoT)提示策略,LLM 可以通过利用包含中间推理步骤的提示机制来解决这类任务,从而得出最终答案。
LLM 的关键技术主要分为以下五个方面:
Scaling(扩展)Transformer 语言模型存在明显的扩展效应,更大的模型/更大的数据规模/更多的训练计算通常会导致模型能力的提升。Training(训练)LLM 网络参数所必需的,其中通常联合使用各种并行策略。DeepSpeed 和 Megatron-LM。Ability eliciting(能力引导)LLM 具备了作为通用任务求解器的潜在能力。LLM 执行一些特定任务时,这些能力可能不会显式地展示出来。ICL 策略可以激发这些能力。Alignment tuning(对齐微调)InstructGPT 设计了一种有效的微调方法,使 LLM 能够按照期望的指令进行操作,其中利用了 基于人类反馈的强化学习技术(RLHF),采用精心设计的标注策略,它将人类反馈纳入训练循环中。Tools manipulation(操作工具)LLM 的能力。例如,LLM 可以利用计算器进行准确计算,利用搜索引擎检索未知信息,这种机制可以广泛扩展 LLM 的能力范围。
GPT-1: 2018 年2018 年,OpenAI 发布了 GPT-1,代表生成式预训练(Generative Pre-Training)。GPT-1 是基于生成型的、仅含有解码器的 Transformer 架构开发的,并采用了无监督预训练和有监督微调的混合方法。GPT-1 为 GPT 系列模型建立了核心架构,并确立了对自然语言文本进行建模的基本原则,即预测下一个单词。GPT-2: 2019 年15 亿,并使用大规模的网页数据集 WebText 进行训练。GPT-2 旨在成为一个无监督的多任务学习器,但与监督微调的 SOTA 方法相比,其整体性能仍然较差。GPT-3: 2020 年175 亿,引入了 ICL 的概念,它是以小样本或零样本的方式使用 LLM。ICL 可以指导 LLM 理解以自然语言文本的形式给出的任务。GPT-3 不仅在各种 NLP 任务中表现出色,而且在一些需要推理或领域适配能力的特殊设计的任务中也表现出色。GPT-3 可以被视 为从 PLM 到 LLM 进化过程中的一个重要里程碑。它通过实证证明,将神经网络扩展到大的规模可以大幅增加模型的能力。OpenAI 为了提高 GPT-3 的性能,使用了两种策略:
GPT-3 模型(在纯文本上进行预训练)的一个主要限制在于缺乏复杂任务的推理能力,例如完成代码和解决数学问题。OpenAI 在 2021.07 推出了 Codex,这是一个在大量 GitHub 代码上微调的 GPT 模型,Codex 可以解决非常困难的编程问题,并且在数学问题上有显著的性能提升。GPT-3.5 模型是在基于代码的 GPT 模型(code-davinci-002)的基础上开发的。InstructGPT 在 2022.01 提出,以改进 GPT-3 模型与人类对齐能力,正式建立了一个三阶段的基于人类反馈的强化学习(RLHF)算法。RLHF 算法对于缓解有害或有毒内容的生成问题十分有效,这对于 LLM 在实践中的安全部署至关重要。OpenAI 在对齐研究中的方法,总结了三个有前途的方向:
AI 系统ChatGPT: 2022 年InstructGPT 的方式进行训练的(在原始文章中称为“InstructGPT 的姊妹模型”),但专门针对对话能力进行了优化。ChatGPT 训练数据是通过将人类生成的对话(扮演用户和 AI 两个角色)与 InstructGPT 数据集结合起来以对话形式生成。ChatGPT 在与人类的交流中表现出卓越的能力:
ChatGPT 支持了插件机制,进一步通过已有工具或应用扩展了 ChatGPT 的功能。GPT-4: 2023 年GPT-4 对于具有恶意或挑衅的提问的响应更加安全,并采用了多种干预策略来减轻语言模型的可能问题,如幻觉、隐私和过度依赖。API


常用的用于预训练的语料库有:
BooksBookCorpus 是之前小规模模型(如 GPT 和 GPT-2)中常用的预训练数据集,包含超过 11,000 本电子书,涵盖广泛的主题和类型(如小说和传记)。Gutenberg 是更大的数据语料库,包含超过 70,000 本文学作品,包括小说、散文、诗歌、戏剧、历史、科学、哲学和其他公共领域的作品。GPT-3 中使用到的 Books1 和 Books2 是比 Gutenberg 大的多的语料库,但并未开源。CommonCrawlCommonCrawl 是最大的开源网络爬虫数据库之一,能力达到了百万亿字节级别,已经被广泛运用于训练 LLM。CommonCrawl 的过滤数据集:
Reddit LinkReddit 是一个社交媒体平台,用户可以在上 面提交链接和帖子,其他人可以通过“赞同”或“反对”投票。高赞的帖子通常被认为对多数用户是有帮助的,可以用来创建高质量的数据集。WebText 就是一个著名的基于 Reddit 的 语料库,它由 Reddit 上高赞的链接组成,但尚未公开。OpenWebText。Reddit 中提取的语料库是 PushShift.io.WikipediaWikipedia 是一个在线百科全书,包含大量高质量的文章,涵盖各种主题。其中大部分文章都采用解释性写作风格(并支持引用),覆盖了多种不同语言和广泛的知识领域。CodeGitHub)StackOverflow)Google 公开发布了 BigQuery 数据集,其中包括各种编程语言的大量开源许可证代码片段, 是一个典型的代码数据集。OtherThe Pile 是一个大规模、多样化、开源的文本数据集,有超过 800GB 数据,内容包括书籍、网站、代码、科学论文和社交媒体平台等。它由 22 个多样化的高质量子集构成。ROOTS 由各种较小的数据集(完全为 1.61 TB 的文本)组成,涵盖了 59 种不同的语言(包含自然语言和传统语言)。GPT-3(175B) 是在混合数据集(共 3000 亿 token)上进行训练的,包括:
CommonCrawlWebText2Books1Books2WikipediaPaLM(540B) 使用了共包含 7800 亿 token 的数据集,包括:
GithubLLaMA 使用了更多的数据预训练,其中 LLaMA(6B) 和 LLaMA(13B) 的训练数据大小为 1.0 万亿 token,而 LLaMA(32B) 和 LLaMA(65B) 使用了 1.4 万亿 token,包括:
CommonCrawlC4GithubWikipediaArXivStackExchangeFine-tuning 语料库instrction tuning (指令微调) 常用数据集instrction tuning (指令微调) 过程可将预训练好的多任务模型在 Zero-shot 任务上表现更好。
NLP task dataset
P3 (Public Pool of Prompts)
Prompted 英文数据集集合,Prompt 是输入模板和目标模板的组合。NLI)数据集的情况下,数据示例将包括 Premise(前提)、Hypothesis(假设)和 Label(标签) 字段。{Premise} 为真,则 {Hypothesis} 也为真吗?”,而目标模板可以定义为:选择的选项为 Choices[label]。这里的 Choices 是特定于 Prompt 的元数据,包含对应于标签为包含(0)、中性(1)或矛盾(2)的选项 yes、maybe、no。FLAN 使用的 instrction tunning 数据集
FLAN 实际上是 google 的 《Finetuned Language Models Are Zero-Shot Learners》提出的模型,该模型用了大量的自然语言理解(NLU)和自然语言生成(NLG)任务数据集做指令微调。
Zero-shot 任务上表现更好。Daily chat dataset
ShareGPT:由用户资源上传的和 ChatGPT 或 GPT4 的对话,总量大约 90,000 组对话。OpenAssistant:多语言的人类和 AI 助手的对话,包含 35 种语言,66,497 组对话和 461,292 个人类标注。Dolly:由 Databricks 公司制作的 15,000 条英文人类对话,包含 7 大子类:
closed-book quality assurance)open-book quality assurance)Self-Instruct-52K:一个由 Self-Instruct 框架生成的指令遵循数据集,共 82,000 个实例包含约 52,000 条指令。Alpaca:一个用于训练和评估指令遵循型语言模型的集合,它包含了 52,000 条独特的指令和相应的输出,这些数据是基于 OpenAI 的 text-davinci-003 模型自动生成的。Baize:是一个开源的多轮对话数据集,它通过让 ChatGPT 自我对话生成,旨在为训练和评估对话模型提供高质量的语料资源。对话全部为英文,共包含 111.5K 个实例。Alignment(对齐) 常用数据集Alignment(对齐)过程的目的是让 LLM 对齐人类的价值观和偏好。Alignment 数据集需要是高质量的、有帮助的、诚实的、无害的。
HH-RLHF :是由 Anthropic 公司收集的,用于训练和评估强化学习中的偏好(或奖励)模型的数据集,包含约 169K 实例。这个数据集包含两部分:
SHP:包含 385,000 条人类偏好的数据集,这些偏好是对 18 个不同主题领域中问题/指令的回答进行的。PKU-SafeRLHF:由北京大学团队开发的,用于支持和推动安全强化学习(RLHF)技术的研究和发展的数据集。这个数据集是目前为止最大的多轮 RLHF 数据集之一,规模达到 100 万条,包含了一系列安全偏好的标注,这些标注覆盖了侮辱、歧视、犯罪、心理伤害、悲观情绪、色情、隐私等多种维度,用于对 RLHF 技术进行细粒度的约束价值对齐。Stack Exchange Preferences:是一个从 Stack Overflow 数据转储中提取的问答对数据集,它被设计用于偏好学习(preference learning)。这个数据集包含了大量的问题和答案,其中答案基于得票数进行了评分。数据集的大小超过了 20GB,并且包含了数百万条问题和答案对。Sandbox Alignment Data 是一个由大型语言模型(LLM)生成的对齐数据集,包含约 169K 个实例,它包含了来自模拟社交互动环境 SANDBOX 的反馈。在 SANDBOX 中,模型模拟了人类社会中的交互,通过这种方式生成的对话数据被用来训练和评估语言模型,使其更好地符合人类的价值观和社交规范。TransformersTransformer 架构构建模型的开源 Python 库,由 Hugging Face 开发和维护。它具有简单和用户友好的 API,方便使用和定制各种预训练模型。DeepSpeedMicrosoft 开发的深度学习优化库(与 PyTorch 兼容),已用于训练多个 LLM,例如 MTNLG 和 BLOOM。它提供了各种分布式训练优化技术的支持,例如内存优化(ZeRO 技术、梯度检查点)和管道并行。Megatron-LMNVIDIA 开发的深度学习库,用于训练 LLM。它提供了丰富的分布式训练优化技术,包括模型和数据并行、混合精度训练和 FlashAttention。这些优化技术可以大大提高训练效率和速度,并实现 GPU 间的高效分布式训练。JAXGoogle 开发的用于高性能机器学习算法的 Python 库,允许用户在带有硬件加速(例如 GPU 或 TPU)的情况下进行数组的高效运算。它可以在各种设备上进行高效计算,还支持自动微分和即时编译等特色功能。Colossal-AIHPC-AI Tech 开发的用于训练大规模人工智能模型的深度学习库。它基于 PyTorch 实现,并支持丰富的并行训练策略。BMTrainOpenBMB 开发的用于以分布式方式训练大规模参数模型的高效库,强调代码简洁、低资源占用和高可用性。FastMoEMoE(即混合专家)模型的训练库。vLLMLLM 代码库,用于 LLM 的推理和服务。DeepSpeed-MIIDeepSpeed Model Implementations for Inference,一个比 vLLM 更快的模型推理服务框架。DeepSpeed-ChatDeepSpeed 的一键式训练 RLHF,提速 15 倍。预训练为 LLM 的语言理解和生成能力奠定了基础。
WebpagesConversation textBooks一个好用的数据处理代码库是 Data-Juicer
wikipedia)作为正样本,候选文本作为负样本,训练二分类器,用于给出一个文本的质量分数。perplexity)来检测和删除不自然的文本。HTML 标签、超链接、模板等。personally identifiable information(可识别个人信息,PII)。LLM 在隐私攻击下的脆弱性可能归因于预训练数据中存在重复的可识别个人信息。Tokenization)LLM 的输入。常用的分词方式有以下三种:
BPE (Byte-Pair Encoding tokenization) 字节对编码,计算过程如下:
WordPiece tokenization,计算过程如下:
BPE 选择合并后词频最大的词作为 Subword,WordPiece 基于语言模型似然概率的最大值生成新的 Subword,具体的基于语言模型似然概率的定义如下:
S 由 n 个子词组成。S 的似然概率定义为:logP(S)=∑i=1nlogP(ti)P() 表示一个训练好的语言概率模型。Unigram LM,计算过程如下:
Unigram 和 BPE 以及 WordPiece 有个很大的不同是:
BPE 和 WordPiece 都是初始化小词表逐步变大直到满足词表大小要求。Unigram LM 是初始化大词表逐步删词直到满足词表大小要求。Unigram LM 删词的根据和 WordPiece 一致,都是基于语言模型似然概率与小规模的 PLM 不同,由于对计算资源的巨大需求,通常不可能对 LLM 进行多次预训练迭代。因此,在训练 LLM 之前构建一个准备充分的预训练语料库尤为重要。
目前,不同的 LLM 模型预训练采用不同的预训练策略,下图是一些模型的预训练数据分布图:

不过,存在几个有效的混合策略:
diversity)Webpages)比删除语料库中的高质量数据(例如:学术语料库)对模型的影响更大。general 数据训练模型通用能力,再用 skill-spcific 数据训练模型专业能力
basic skill 再训练 target skill 比直接训练 target skill 模型表现更好
Casual Decoder 结构
GPT 博客 中的 Hello, world! 续写例子Encoder-Decoder 结构
T5 博客 中的 Hello, world! 英语翻译法语的例子Prefix Decoder 结构
Encoder-Decoder 和 Casual Decoder 的折中,在 prefix 前缀文本中使用双向注意力,在生成后续序列时使用单向注意力Prefix Decoder 的模型有:
U-PaLMGLM 等Mixture-of-Experts (混合专家)结构
GPT-4 使用了 MOE 结构Emergent Architectures(新兴结构)
Transformer 架构一个很大的问题是推理时复杂度较高,每一个 token 需要计算和之前的每一个 token 计算相关性RNN 架构推理的复杂度就很低,每一个 token 只需要和上一个 token 以及一个不断更新的 hidden state 计算相关性(本质是 hidden state 在某种程度上存储了之前所有 token 的信息)RNN 数据依赖问题非常强,导致训练难以并行化,且通常效果较差H3/S4RWKVHyenaMambaRetNetTransformer 一样可以并行训练 + 像 RNN 一样高效推理,且效果可以和 Transformer 媲美SSM 论文 HiPPO 可参考 这篇论文
LayerNorm 和 BatchNorm 只有两个差别,为了简化,假设 Channel = 1 即 feature shape = N, 1, H, W:
BatchNorm 统计整个 feature map 的均值和标准差(scalar),然后在整个 feature map 做标准正态化;同时记录(滑动平均算法)到 running_mean / running_var 参数中LayerNorm 统计每一个样本的均值和标准差(均值和标准差都是长度为 N 的 vector),然后每个样本逐个做标准正态化;均值标准差用完即扔,无需记录BatchNorm 推理时不需要计算 feature 的均值和标准差,而是使用训练统计得到的 running_mean / running_var,因此是个静态行为,可以被前面的 Conv2d 运算吸收LayerNorm 推理阶段和训练阶段运算方式基本一致shape 为 N, C, L 分别表示 batch / feature_dim / seq_lengthk / b 都是可学习的 per channel 向量LayerNorm 相比 RMSNorm 有如下优势:
RMSNorm 不需要计算输入数据的均值,因此减少了计算量,使得模型训练更加高效。RMSNorm 在训练过程中的速度通常比 LayerNorm 更快。RMSNorm 的计算更简单,但它在保持与 LayerNorm 相当性能的同时,甚至可能在某些情况下提供更好的性能。RMSNorm 保留了输入数据的均方根比例不变性,这有助于模型在面对不同尺度的输入数据时保持一致的性能。RMSNorm 通过归一化输入数据的 RMS,为模型提供了一种隐式的学习率适应能力,有助于模型在训练过程中更好地调整参数。DeepNorm 可以看做是一种增强型 LayerNorm,对 LayerNorm 改动较小,但效果惊人,DeepNorm 用在 Post-LN 架构上替代传统 LayerNorm 运算,可稳定训练,可训练深度超过 1,000 层的 TransformerDeepNorm 对 LayerNorm 的改动如下:
Pre-LN 是一种 Transformer 架构,计算公式是:Post-LN 是另外一种 Transformer 架构,计算公式是:Sandwich-LN 是 Pre-LN 的改进,公式为:erf 表示高斯误差函数,值域是 [-1, 1]GeLU 是 LLM 中使用最广泛的激活函数Transformer 上,有两种:
position encoding):使用正弦得到位置编码position embedding):使用可学习的 embedding 编码:position_embedding = nn.Embedding(max_seq_length, d_model)position embedding 通常会 element-wise 加到输出 token embedding 作为 Transformer 输入,即:token embedding,pi 表示 position embeddingshape = [2 * n - 1, 2 * n - 1, num_head] = [5, 5, num_head][i, j, k] 表示第 k 的 self-attention 头上 Qi 和 Kj 的相对位置position embedding 加上 token embedding 作为 Transformer 输入self-attention 上,即 Aij=WqxixjTWkT+ri−j
self-attention scoreRelativePositionBias (相当于 self-attention 的 bias)ALiBi 博客RoPE
position encoding 位置编码方式,编码本身是绝对位置编码,但通过 self-attention 之后,key 和 query 会产生相对位置关系shape = [max_seq_len, d_model]self-attention 之前的 key / query 分别进行 旋转(本质是和旋转矩阵做复数乘法,然后再转换到实数空间),此步骤不改变 key / query 的 shapeself-attentionposition embedding 和 token embedding 的 shape 相同,作用在 query / key / value 生成之前position embedding 和 token embedding 的 shape 相同,作用在 self-attention 之前,只作用在 key / query 上,不对 value 生效position embedding 和 token embedding 的 shape 不同,和 attention map 的 shape 相同,作用在 self-attention 生成的注意力矩阵上self-attention,即LLM 语境下通常 n >> d,softmax 是非线性运算,所以需要先计算 QKT∈Rn∗n,这决定了 full attention 的计算复杂度为 O(n2),因此 full attention 复杂度也被称为 softmax 计算复杂度softmax,那么 QKTV 可以通过结合律先计算 KTV∈Rd×d,然后再计算 QKTV∈Rn×d,计算复杂度退化为 O(n),变成了线性复杂度self-attention 的基础上,提前生成一个固定的二值的 sparse attention mask,将 self-attention (O)(n2) 的计算复杂度变成 (O)(nn)sparse attention mask 可以有多种形式,比如:1 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
MQA 是将标准 MHA 中的 key / value 的 Multi-Head Attention 退化成 Single-Head,query 保持不变GQA 是将 Multi-Head 分组,每个组内是 MQAFlash attention 和 Flash attention v2 是标准 self-attention 的完全等价的高效实现,通过更合理的实现大幅降低了 SRAM 和 HBW 之间的 IO 量,从而大幅加速训练 / 推理速度Paged attention 的目的是解决生成式模型 kv cache 占用太多显存导致显存利用率低的问题,kv cache 详细分析可参考 这篇博客Paged attention 通过类似分页内存管理的方法管理 kv cache 显存,随着序列变长,动态分配显存,显存物理空间不连续,最多只浪费一页,极大提高了显存利用率,使得可以运行更大的 batch sizeLLM 最常用的预训练任务,在很多下游任务上甚至无需 fine-tuningtoken 为噪声,然后训练模型去恢复原始信息MoD 是出自 Google UL2 大模型,此大模型使用了 MoD 作为预训练任务,是前面提到的两种预训练任务的组合
长文本建模是指模型在推理阶段实际输入的序列长度比训练阶段更长,即 train short, test long,主要有两种范式:
Scaling Position Embeddings)
RoPE 的旋转角度间隔等。LLMs 倾向于更多关注起始和最近的令牌,采用选择性保留初始和最近令牌的注意力掩码。keys)在外部记忆,并使用 k-最近邻搜索方法检索最相关的令牌。language modeling 解码策略就足够了,即预测下一个概率最大的词,这种解码策略也被称为 Greedy searchlanguage modeling 解码策略对于比如机器翻译、文本总结等任务是够用的,但是对于比如故事生成、对话等任务就有问题,会输出大量重复的、无意义的文本argmax 变成 softmax),这种策略被称为 Random samplingGreedy search 的改进
Beam search:集束搜索可以缓解模型预测陷入局部最优解,beam size 通常设置在 3 ~ 6 之间,太大会降低模型效果Length penalty:对于集束搜索的搜索空间进行长度惩罚,最终加权选择最优生成序列Random sampling 的改进Random sampling 是根据预测概率随机选,因此每个词都有可能被选中(即使概率很低),这可能会导致输出完全不合逻辑的文本序列,因此需要改进
Temperature sampling
t 代表温度softmax 得到概率分布的优化,加入了温度系数,可有效缓解随机采样导致的采样到不合理值的问题t = 1 时,退化为 random samplingt 趋近于 0 时,退化为 greedy searchtop-k sampling
k 种取值top-p sampling(nucleus sampling)
p 的最小集;也就是按照预测概率降序,保留累计概率小于 p 的样本contrastive search
typical sampling
top-p 算法的升级版本top-p 算法,参考了 typical sampling作为主流的 GPT-like LLM,解码(推理)可以分为两个阶段:
prefill stage
input / prompt 输入到模型中计算 hidden state 的阶段A100 80GB GPU + LLaMA-13B 为例,计算访存比为 113.78(硬件理论最高效计算访存比为 156)incremental decoding stage
<EOS> 或 max_lengthA100 80GB GPU + LLaMA-13B 为例,计算访存比为 1.97incremental decoding stage,对于增量解码阶段的优化主要有两个方向:IO
IO 是指 HBM 和 SRAM 之间Flash Attention 通过分块计算 Attention,可大幅降低数据 IO 量Multi-Query Attention 和 Grouped-Query Attention 通过共享/分组共享 KV 来减小 IOT5
beam size = 4 的 beam search,长度惩罚系数 0.6GPT-3
beam size = 4 的 beam search,长度惩罚系数 0.6Alpaca
top-k (k = 50) 和 top-p (p = 0.9) 以及 0.7 的温度LLaMA
0.1 和 0.8(分别为 Pass@1 和 Pass@100)Open-AI API
greedy search:通过设置温度为 0beam search:设置 best_oftemperature sampling:设置 temperaturenucleus sampling:设置 top-ppresence_penaltyfrequency_penaltycausal decoder 是主流的大模型架构,主要原因有两点:
fine-tuning 的情况下,causal decoder 表现比 encoder decoder 架构更好,即对于 zero-shot / few-shot 任务,causal decoder 效果更好scaling law 在 causal decoder 中表现明显,对于 encoder decoder 的研究缺乏Batch Training
Language model pre-training 任务(例如 bert 等),通常用较大的 batch size,例如 2048 examples 或者 4M tokens,这样通常可以提高训练稳定性和吞吐量。LLM 任务(例如 GPT-3 / PaLM),引入了动态 batch size 的做法,GPT-3 在训练过程中会将 batch size 从 32K tokens 逐步增加到 3.2M tokens,动态 batch size 可提高 LLM 训练稳定性Learning Rate
LLM 的训练通常采用 warmup + decay 的训练策略warmup 过程通常占总训练 step 数量的 0.1% - 0.5%,学习率逐步从 0 提高到最大值,最大值通常在 5e-5 ~ 1e-4 之间(GPT-3 是 6e-5)。decay 过程通常使用 cosine decay 策略,在剩余的 training step 中逐步将 learning rate 降低到最大值的 10%Optimizer
Adam / AdamW / Adafactor 优化器中的一种Adam / AdamW,超参数配置为 β1=0.9, β2=0.95, ϵ=10−8,GPT-3 就使用了这组配置。Adafactor 优化器相比 Adam / AdamW,优点是训练过程更省显存,超参数配置为 β1=0.9, β2=1.0−k−0.8,k 表示训练步数,PaLM / T5 就使用了 Adafactor 优化器。LLM 训练不稳定是常见情况,可以会导致训练崩溃weight decay 0.1gradient clipping to 1.0loss spike)也会导致训练不稳定,通常做法有:
loss spike 出现之前最近一次 checkpoint,且弃用导致 loss spike 的数据,PaLM / OPT 使用了这种方法GLM 模型发现 Embedding layer 不正常梯度容易导致 loss spike,因此缩小了 embedding layer gradientLLM 训练会有两个技术难题:训练吞吐量的增加 和 加载大模型到显存,解决方法包含以下几种(以下几种并不冲突,可以同时使用):
3D Parallelism
Data parallelism
pytorch 的 ddp)GPU,每个 GPU 独立前向反向step 中 gradient 都需要聚合一次,以确保每个 GPU 上参数更新保持一致Pipeline parallelism
Tensor parallelism
Tensor parallelism 是把模型一层的参数切成多份,每份独立计算,因此也叫做 Model parallelism。Pipeline parallelism 是横向把模型切成几段,而 Tensor parallelism 是纵向把模型切成几段。Tensor parallelism 是将 A 纵向切分为 [A1,A2] 放到不同的 GPU 上独立运算,则 Y=[X@A1,X@A2]Tensor parallelism 需要分析每个算子的数据依赖情况,比如矩阵乘的右矩阵可以按列划分,但不可以按行划分。Tensor parallelism,例如 Megatron-LM (可参考 这篇博客) 和 Colossal-AIZeRO
ZeRO-DP 和 ZeRO-R 可参考 这篇博客FSDP 是 PyTorch 官方提出和实现的类似于 ZeRO 的算法,全称是 Fully Sharded Data Parallel。
| Format | Bits | Exponent | Fraction |
|---|---|---|---|
| FP32 | 32 | 8 | 23 |
| FP16 | 16 | 5 | 10 |
| BF16 | 16 | 8 | 7 |
FP16 和 FP32 混合训练是比较常见的操作,但最近有研究发现 FP16 会造成模型精度降低。BF16 是为了解决 FP16 造成精度降低而提出的数据类型,全称是 Brain Floating Point,这种数据类型牺牲了表达精度,提高了表达范围。3D Parallelism
3D Parallelism 通常是联合使用的,例如 BLOOM 模型,是用了:
4 路 Tensor Parallelism8 路 Data Parallelism12 路 Pipeline Parallelism384 (384=4 x 8 x 12) 块 A100 GPU 训练得到的。DeepSpeed、Colossal-AI、Alpa 等开源库都对三种并行支持较好ZeRO 和 FSDP 等算法可有效降低大模型训练过程中的显存占用,从而可以训练参数量非常大的模型。DeepSpeed、PyTroch、Megatron-LM 等开源库都已集成此功能。predictable scaling
GPT-4 提出的,在小模型上等效预测放大后模型的效果,对超大规模网络训练来说必不可少。LLM 的适配微调Instruction Tuning(指令微调):用来提高或解锁大模型在某些方面的能力。Alignment Tuning(对齐微调):对齐人类三观。Instruction Tuning 指令微调Instruction Tuning 可以大幅提高 LLM 的指令遵循能力,即让 LLM 可以解决具体的任务(指令)Instruction Tuning 通常需要两步:
LLM
NLP 任务数据(如图 11.a)11.b)11.c)NLP 任务数据
NLP 任务是指常见的自然语言任务,例如:
text summarization)text classification)translation)NLP 任务数据通常由四部分组成:
Task description)Demonstrations)PromptSource 是个很好用的格式化 NLP 任务数据的开源工具,提供了很多任务模板,同时提供了一个开源 Prompt 集合数据集称为 Public Pool of Prompts (P3)NLP 数据集上的格式化实例缺乏 Prompt 的多样性,且和人类实际需求不匹配Task description)ChatGPT API 收集到的问题以及人类标注员,内容包含:
opened generation)open question answering)brainstorm)chatting)Scaling the instructions)
Formatting design)
LLM 理解任务至关重要CoT (Chain-of-Thought) 和非 CoT 数据会让 LLM 在需要多跳推理能力的任务和不需要多跳推理的任务上表现好LLM 性能影响较小或会产生负面影响LLM 自动构建指令数据集是一种有效的方法NLP 任务数据集(FLAN v2)ShareGPT)GPT4-Alpaca)OPT-IML 模型GLM-130B 和 Galactica 等Capacity forgetting issue),通常在日常对话指令数据微调过程中加入少量任务格式化指令数据LLM 微调,且只对 机器输出的对话部分计算损失LLM 的自我认知
LLM 建立自我认知对于部署应用 LLM 很有必要,例如:名称、开发者和隶属关系AI 助手之间的对话“LLM,预训练 NLP 模型也可以用BLOOMZ-P3 是在 BLOOM 上仅用纯英文数据 P3 微调得到的,经测试发现在多语种语句补全任务上,BLOOMZ-P3 比 BLOOM 提升超过 50%,表明即使用纯英文数据做指令微调,可以提高大模型在其他语言上的表现FLAN-T5 包含 1836 个任务的超过 15M 条指令数据ShareGPT,包含 63K 条真实用户指令Self-Instruct-52K 包含 52K 条指令对共计 82K 个实例的输入输出WizardLM 设计,通过增加约束、提高推理步骤、提高输入复杂度的方式,逐步提高指令的复杂性LLM 对其进行话题多样性扩写,例如用 ChatGPT 扩写 Self-Instruct-52K 数据LLaMa 推理指令输出的困惑度来对指令的困难程度排序,删除过难过易的样本Survey 的作者亲自做的指令微调实验的设置和结果分析LLaMa 做指令微调,包括 LLaMa-7B 和 LLaMa-13B 两个模型code base: [YuLan-Chat](https://github.com/RUC-GSAI/YuLan-Chat) 一个作者实验室开源的代码8 卡 A800-80G GPU 服务器[Stanford Alpaca](https://github.com/tatsu-lab/stanford_alpaca) 指令微调超参数相同(Stanford Alpaca 是一个基于 LLaMa 的指令跟随模型)Chat setting 和 QA setting 两个微调配置
Chat setting:
baseline(对照组):在 Self-Instruct-52K 上微调的 LLaMa-7B 和 LLaMa-13B 模型benchmark:[AlpacaFarm evaluation set](https://github.com/tatsu-lab/alpaca_farm)benchmark 的每一条数据,用实验组和对照组的两个模型分别推理给出结果,让 ChatGPT 评判哪个更好,最后比较胜率QA setting:
NLP 任务的问答数据集做微调benchmark:[MMLU (Massive Multitask Language Understanding)](https://arxiv.org/abs/2009.03300) 和 [BBH (BIG-Bench Hard)](https://arxiv.org/abs/2210.09261) 数据集Prompt:
benchmark 推理时都加NLP 任务格式化指令数据对 QA setting 任务有效,对 Chat setting 任务无效GPU)Alpha 开源库做微调LLM 模型和指令微调数据集,开始微调LoRA 等微调方式Alignment Tuning 对齐微调NLP 任务中表现出非凡的能力,但有时会生成一些负面的内容,例如:
3H(helpfulness / honesty / harmlessness)alignment tax(对齐税)Helpfulness 帮助性
Honesty 诚实性
Helpfulness 和 Harmlessness 相比,Honesty 更客观,因此对齐需要的人力付出会更少Harmlessness 无害性
人类反馈在对齐微调大模型的过程中至关重要
RLHF 人类反馈的强化学习RLHF 系统
LLMInstructGPT 175B 是在预训练的 GPT-3 上对齐的GopherCite 280B 是在 Gopher 上对齐的LM 的微调,也可以是 LM 从头训练LLM 参数量少,例如 OpenAI 用 6B GPT-3 作为 Reward Model,DeepMind 用 7B Gopher 作为 Reward ModelPPO (Porximal Policy Optimization) 比较常用RLHF 关键步骤
RLHF 中,此步骤可以跳过LM 生成对每个指令生成一系列输出,由人类标注员对输出进行 偏好排序 作为训练数据AI Agent 代替标注员对 LM 的输出进行偏好排序(RLAIF)AI Agent 的排序原则是预设的指令对齐原则,这种方式的优势是:
LM 进行训练,其中强化学习的各个要素分别为:
policy):微调后的 LMaction space):LM 的词表state):目前生成的 token 序列reward):由第二步训练得到的 RM 提供InstructGPT 通过在奖励函数中加入当前模型输出和微调之前的模型输出之间的 KL 散度,缓解模型的退化问题RM 的训练)和本步(强化学习微调),可以得到较好的模型RLHF 实践策略RLHF 是比较困难的,这里提供一些实践上的策略和技巧
InstructGPT 用 6B GPT 作为奖励模型)和大模型(和对齐模型一样大或者更大的模型作为奖励模型)两条路线,其中大模型路线在评判 LLM 输出质量方面更优LLM 预训练过程中的检查点参数初始化 RM,这样可以缓解由于预训练数据不一致导致的对齐策略不匹配问题,LLaMa 2 就是这么做的LLM 对每个输入推理得到 N 个输出N 个输出,得到最优的输出LLM,知道模型的表现不再提升(收敛)benchmark 用来真实地评价模型对齐效果API 调用beam search)效率更高,且可以提高输出的质量和多样性RLHF 的过程监督
RLHF 的监督可以分为两种:
LLM 对于输入指令的完整输出LLM 的输出过程,例如输出的每个句子、每个单词、每个推理步等PRM800K
PRM800K 是 OpenAI 开源的 RLHF 过程监督数据集,可以用其训练 PRM (Process-supervised Reward Model) 过程监督奖励模型PRM800K 包含:
12K 个过程标注的数学问题75K 个由 LLM 生成的解法800K 个过程正确性标签,标签分为:
Positive 正面Negative 负面Neutral 中性Expert Iteration (EXIT))结合RLHF 的对齐RLHF 做对齐微调的痛点
RLHF 过程中常用的 PPO 算法非常复杂,且对超参数敏感RLHF 的对齐如何做?
SFT 代替 RLHF,即用基于有监督微调代替基于人类反馈的强化学习LLM 可以从对齐数据集中学习到对齐行为Constitutional AI 将人类监督映射为一组原则(自然语言指令的集合),让 LLM 重复的用这组原则批判并修正自己的输出Self-Align 是先用 Self-Instruct 方法生成多样性强的指令数据集,然后模型会被提示多个人类编写的原则,这些原则描述了期望的模型规则和行为,以生成符合 3H 标准的数据用于对齐训练FIGA 采用正样本(LLM 精炼后的输出)和负样本(原始到低质量输出)对比学习的方法,缓解了 SFT 只能用正样本监督学习的问题,使 LLM 能够深入理解哪些细粒度的修改实际上导致了良好的响应Stable Alignment 通过多个 LLM 交互来获得改进的反馈,从而实现自我改进Sequence-to-Sequence 的交叉熵损失,但一些研究提出对主要训练目标的改机,并提出了一些辅助损失,可用于挖掘对齐数据集的潜力,提高对齐质量
CoT (Chain of Hindsight) 对有监督微调数据集中的正负样本分别添加“一个有帮助的回答”和“一个没有帮助的回答”两种指令,且仅对有特殊掩码的响应标记计算损失Quark 将模型响应数据(对齐监督训练数据)按对齐质量分成不同的分位数,每个监督数据前加入一个特殊的奖励 token,用于表示响应的奖励等级DPO (Direct preference optimization) 将大模型本身用于奖励模型,从而不需要显式的奖励模型FIGA 定义细粒度对比学习损失RLHF 是用对齐数据训练一个 RM,然后用 RM 指导模型微调(给模型的响应打分)SFT 是直接用对齐数据微调模型RLHF 学习的是响应级监督,而 SFT 学习的是 token 级监督SFT 微调的模型,在遇到对齐微调数据集之外的数据时,更倾向产生幻觉,尤其是在对齐微调数据集是由大模型生成的时候SFT 对标注质量更敏感RLHF 对缓解有害输出和增强模型能力方面非常有效,在 LLaMa 2 中,RLHF 同时提高了模型的帮助性和无害性得分,并将其归功于 RLHF 实现了一种更优的 “LLM —— 人类” 交互方式RLHF 实际上是通过鼓励 LLM 通过对比自己生成内容的 “好” 和 “不好” 评价,找到一种纠正策略;而不是像 SFT 一样,强制让模型去模仿 “好” 的外部内容(非自我生成)RLHF 可以减轻幻觉行为,这一点在 GPT-4 中被证实RLHF 一样不少,比如样本效率低下和训练稳定性差RLHF 的 LLM 必须先用 SFT 预训练收敛的参数初始化RLHF 需要标注员参与到复杂的迭代过程中,不能像 SFT 一样标注和训练解耦RLHF 的结果对实验过程细节非常敏感,例如:
PPO 的训练策略SFT 可以提高预训练模型的容量,RLHF 可能会提高 SFT 的模型容量RLHF 过程还比较原始,需要探索和优化的点还有很多
Adapter Tuning 适配器微调
2019 年 Parameter-Efficient Transfer Learning for NLP,是 Bert 时代的产物Transformer 模型预训练结束后,在每个 Transformer block 中加入两个 Adapter block,其他参数冻结,只微调 Adapter blockAdapter block 中包含降采样(Down project)算子,因此计算量和参数量都较小Adapter block 在 Transformer block 中的位置以及 Adapter block 长什么样?
图中所有的绿色块表示微调过程中可训练的参数
Prefix Tuning / Prompt Tuning 前缀微调
Prefix Tuning,详细分析可参考 这篇博客P-Tuning,详细可参考 这篇博客Prefix Tuning 的小修改版本,Prompt Tuning,详细分析可参考 这篇博客P-Tuning 进行了升级 P-Tuning v2,详细可参考 这篇博客Low-Rank Adaptation (LoRA)
APPLE 发展策略:
Awareness: 认知管理者的要求,以及自身优势。Path: 制定一个最小化的发展路线图。从优势出发,给自己建立一个支撑点,并制定一个包括发展目标,具体行动和检验方法的计划。Practice: 付诸行动,通过刻意和反复的练习,跟过去的习惯已建立好的脑区地图抢夺资源,建立起新的通往目的地的路径。Learn: 学习知识,结合实践总结和反思。在实践中先有体验,学习就是带着问题寻找答案的主动过程。Evaluation: 定期评估,学会重新看待“评价”,把评价看做反映某一阶段性状态的中性动作。管理者易走入的两个极端:
但如果包装后的公众自我与你的内在自我差别很大,就会出现问题。
具体可以参考以下三个步骤:
专项复盘分为三步曲:
管理者进行辅导的第一步:切实有效地在辅导上投入时间。管理者要注意:
管理者在和员工制定辅导目标时,需要遵循以下三个原则:
在成功辅导员工的过程中,管理者要做到三件事情:与员工建立相互信任的辅导关系;激发员工不断提升自我的积极性;赋能员工,提升员工解决问题的能力。
员工的能力提升需要经历持续练习和反馈的过程。管理者需要在这个过程中持续跟进员工的行为表现,及时发现并指出员工的问题,帮助他们持续改进。管理者还需要及时看到员工取得的进展,并及时给予鼓励和肯定。
跟进最难的地方在于坚持,管理者可以按照管理项目的方式,始终聚焦辅导目标,制订跟进计划,明确责任人,使用辅助工具,以帮助自己形成跟进的习惯。
员工的成长并非一蹴而就,管理者需要给员工时间和试错的空间,并且当员工取得进步时,即使没有达到期待,也要给予正向的鼓励。
跟进是评价和反馈的基础,要做到正确地批评和表扬,管理者要以事实为依据,以解决问题为导向,并在沟通时保持真诚。
管理自我阶段的关键挑战:稳定可靠地交付工作成果、保持并提高专业的水准和效率、与客户和工作伙伴顺畅沟通。
所需完成的关键跨越:
管理他人阶段的关键挑战:获得团队的认可和信任、让团队稳定可靠地交付工作成果、帮助团队改进和提升。
所需完成的关键跨越:
管理管理者阶段的关键挑战:
应对常态化的模糊和不确定状况、以经营思维管理职能部门或事业部、确保人才梯队支持业务持续发展。所需完成的关键跨越:
还有几个底层能力,在整个职业发展过程中也起着决定性作用。这些能力包括:
发展关键跨越上的能力需要做到:
如同电影《和平战士》中,心灵导师苏格拉底对主人公丹·米尔曼所说:“没有开始或者终止,只有过程。”人生是一场修炼,修的是心性,炼的是技能,没有终点,出生即开始,永远都在进程中。我们陪伴了很多管理者走过“至暗时刻”,别着急,每个人都会经历,没有谁比谁更高明,只要坚持就会成功。在坚持的路上,除了职场的收获,你还会获得很多可迁移的技能。正如在游泳池中学会了游泳,在大海中也能施展一样。管理者练就的管理技能、打磨的心性,都可以在更多人生的场景找到应用机会。所以可以说,一旦成为管理者,就进入了这场修行的经验加速区:管理技能要求的倾听、沟通、共情,用在处理家庭矛盾、开展子女教育中,也效果明显;管理角色要求的时间管理、任务分配、绩效辅导、培养员工等技能,在自我管理、家庭决策、子女教育中,同样增益匪浅。成为管理者,能加速人生的修炼,乃至成就更好的自己。
UFLD 算法每条车道线需要占据一个输出 channel 。
channel 输出即可检测任意多条车道线?一个可以想到的简单方法是:
channel = 1 的 heat map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率。channel = 1 的 heat map 和一个 channel = 2 的 offset map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率,每个位置的 offset map value 表示 如果该点是关键点,那么该点相对于本条车道线起始点的偏移(x, y),起始点表示一条车道线关键点中最靠近图片下方的点。offset 得到新的点 p',理论上同一条车道线的每一个关键点偏移后得到的新位置 p' 都一致,都是车道线起始点。loss == 0,因此还需要对所有的 p' 进行聚类,每个类表示一条车道线实例,本质相当于将聚类中的距离判定逻辑吸到神经网络内部。GANet 算法的核心思想:用固定的有限个输出通道去预测任意条车道线。

num_adjacent_keypoints 个点的 offset,进行显式监督。offset 引导可变形卷积改进关键点局部特征。1 | import torch |
LFA module,主要是用到了可形变卷积,对于大多数动态性较差的端侧芯片来说,不容易部署。BEV 算法中 View Transform 都是通过 LSS 实现 Image View 到 BEV View 的转变,这种视角转换方法依赖于图像视角的深度估计(显式(例如 BEVDepth)或隐式(例如 LSS / BEVDet 等))。View Transform 方法,在 Neuscenes 数据集上取得了不错的 3D 目标检测成绩(略差于 BEVDet4D)。
6 张)BEV Queries(shape = [num_voxel, dim])History BEV Feature(上一帧的 BEV Feature 输出,shape = [num_voxel, dim])BEV Feature(shape = [num_voxel, dim]),记作 Bt6 张图片单独做 CNN base 特征提取,输出记作 FtBEV Queries(记作 Q),和上一帧的 BEV Feature(记作 Bt−1)做 Self-AttentionQ 作为 Query,Bt−1 作为 Key / value,做 Attention 运算Query / Key / Value 并不同源,但依然被称为是 Self-Attention 而不是 Cross-Attention,是因为 Q 和 Bt−1 都属于 BEV 语义Q'BEVFormer 通过这一步将透视图特征转换为俯视图特征Q'Cross-Attention 运算,其中:
Q' 作为 QueriesKey / ValueBEV Queries 去查询图片总体特征,得到 BEV Feature 输出,记作 BtBEV FeatureBEV 视角下的检测 / 分割等任务预测结果CNN base 也可以是 Transformer base 的Attention 过程都需要额外添加 Position embeddingDETR,都熟悉这种套路:预设一个无意义的(随机初始化但可学习) pattern 序列作为 Query 去查询 image features,得到有意义的结果(或者说是可监督的结果)Query 有意义化(例如通过一个轻量化 2D 检测头预检测,得到 proposal 并编码为 Query)