Zhangzhe's Blog

The projection of my life.

0%

LLM / 自动驾驶相关

  1. LN和BN
  2. 介绍RLHF
  3. 介绍MoE和变体
  4. 介绍LoRA和变体
  5. LoRA 参数更新机制
  6. 如何减轻LLM中的幻觉现象?
  7. MLM和MIM的关系和区别?
  8. Stable Diffusion的技术原理
  9. 解決LLM Hallucination的方法
  10. Occupancy预测的出发点是什么?
  11. 介绍RWKV、Mamba和Mamba-2
  12. 2D图像预训练怎么迁移到3D点云任务
  13. 为什么现在的LLM都是Decoder only的架构?
  14. 把Transformer模型训深的问题有哪些?怎么解决
  15. 现在车道线检测的主流的loss是什么?你有哪些想法?
  16. 为什么GAN中经常遇到mode collapse,而Diffusion比较少?

Transformer 相关

  1. 介绍Transformer和ViT
  2. 介绍Transformer的QKV
  3. 介绍Layer Normalization
  4. Transformer训练和部署技巧
  5. 介绍Transformer的位置编码
  6. 介绍自注意力机制和数学公式
  7. 介绍Transformer的Encoder模块
  8. 介绍Transformer的Decoder模块
  9. Transformer和Mamba(SSM)的区别
  10. Transformer中的残差结构以及意义
  11. 为什么Transformer适合多模态任务?
  12. Transformer的并行化体现在哪个地方?
  13. 为什么Transformer一般使用LayerNorm?
  14. Transformer为什么使用多头注意力机制?
  15. Transformer训练的Dropout是如何设定的?

URL

TL;DR

  • HiPPO 全称是 High-order Polynomial Projection Operators,是 SSM (State Space Model) 的开山之作,作者延续 SSM 思路,后续做出了可以和 Transformer 结构掰手腕的 Mamba

  • HiPPO 的目标是用一个有限维的向量来储存这一段 u(t) 的信息,实现方式是将 u(t) 通过 Legendre (勒让德)多项式展开,用有限维的向量存储勒让德多项式系数,且这些 向量的值通过求解勒让德多项式得出,不在训练过程中通过梯度下降更新

  • HiPPO 可以给 RNN 提供一种记忆表示方法,因此一个实际的用处是使用 HiPPO 作为 RNN 的记忆存储算子

Algorithm

  • 勒让德多项式本身是定义在连续函数上的,但实际使用中需要记忆的内容是离散的,因此需要离散化过程

  • HiPPO 的记忆更新公式是 $m(t+1) = Am(t)+Bu(t)$,其中 ABHiPPO 参数,m(t) 表示记忆向量,u(t) 表示更新向量,m(t+1) 表示更新后的记忆向量

    • $A\in\mathbb R^{N\times N}$
    • $B\in\mathbb R^{N\times 1}$
    • N 表示记忆单元的参数尺度,类似于 Transformerhidden size,越大记忆能力越强
  • HiPPOLegT (Translated Legendre Measure)LegS (Scaled Legendre Measure) 两种度量方法,二者都使用上述记忆更新公式,只是 AB 参数不同

    • LegT 使用 翻译 任务的勒让德多项式,本质是一个滑动窗口,只记忆当前时刻前 $\theta$ 窗口内容,$\theta$ 为超参数

      • $A_{nk}=\frac{1}{\theta}
        \begin{cases}
        (-1)^{n-k}(2n+1) & if & n\ge k\\
        2n+1 & if & n < k
        \end{cases}$
      • $B_n=\frac{1}{\theta}(2n+1)(-1)^n$
    • LegS 使用 缩放 的勒让德多项式,记忆全部时刻的序列内容

      • $A_{nk}=\frac{1}{\theta}
        \begin{cases}
        (2n+1)^{\frac{1}{2}}(2k+1)^{\frac{1}{2}} & if & n\gt k\\
        n+1 & if & n = k\\
        0 & if & n < k
        \end{cases}$
      • $B_n=(2n+1)^{\frac{1}{2}}$
  • Permute Mnist 分类任务的例子讲解 HiPPO 如何作为 RNN 的单元参与计算,以及HiPPO 的记忆单元如何更新

  • Permute Mnist 任务是将 28x28Mnist 图像的每一类按照同一种 pattern 进行 shuffle,训练并分类

  • 下图为使用 HiPPO 作为记忆单元的 RNN 网络解决 Permute Mnist 任务的计算过程,input_t 是每次顺序输入图片的一个像素值,是一个时间步总长为 28 * 28 = 784RNN 网络,最后一个 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;
    input_t([input_t])-->|1|Concat_1[Concat];
    h_t([h_t])-->|512|Concat_1-->|513|W_uxh-->|1|u_t([u_t]);
    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;
    B([B])-->|max_length, 512|get_index_B[get_index]-->|512, 1|B_t;
    timestep([timestep])-->get_index_B;
    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;

Thought

  • LegTLegS 的参数计算过程需要较强的数学功底才能完全理解
  • 如果只把 AB 当做 万能的不需要梯度下降更新的神经网络记忆力更新参数,那么实际上并不复杂

URL

TL;DR

  • T5 名字的由来是:Text-to-Text Transfer Transformer文本到文本转换的 Transformer

Algorithm

example

  • T5 是一个 encoder-decoder 架构的模型,可以用来做文本翻译,本例子使用 Hello, world! 英语翻译法语为例

0. prompt

  • prompt 的作用是在输入之前加上对任务的描述
  • 比如 english_to_franch("Hello, world!") API 会被 prompt"translate English to French: Hello, world!" 纯文本输入到模型

1. encoder input tokenize

2. encoder input token embedding

  • GPT 系列没有区别,需要把 encoder input token id 查表变成 token embedding

3. encoder input position encoding

  • GPT 系列使用可学习的 position embedding 不同,T5 使用的是 position encoding
  • 且使用的是相对位置编码,而不是绝对位置编码
  • GPT 系列只在模型 casual decoder 第一层输入加入 position embedding 不同,T5position encoding 是在 encoder 以及 decoder 的每一层都是使用了

4. encoder

  • GPT 系列直接使用 token embedding + position embedding 直接得到 hidden state 来输入 decoder 不同,T5encoder 结构
  • T5encoder 结构采用标准 transformer encoder 结构,每个 token 可以看到所有 token
  • encoder 一共 12 层,每一层包括如下顺序结构为:
    • self attention block
      • layer norm
      • self attention
      • dropout
    • FFN
      • layer norm
      • MLP
      • dropout
  • encoder 最终输出一个 shape = (batch, input_token_len, encoder_dim)encoder hidden state

5. decoder input token embedding and position encoding

  • GPT 系列不同之处在于 T5decoder 阶段需要 decoder input
  • 通常情况下 decoder input<BOS><S> 等特殊标记,token 长度仅仅为 1,用于表示序列开始
  • decoder input token embeddingposition encoding 过程和 encoder input token embeddingposition encoding 并无区别
  • token embedding + position encoding 得到 decoder hidden state,其 shape = (batch, 1, decoder_dim)

6. decoder

  • decoder 一共 12 层,每一层包括如下顺序结构为:
    • self attention block
      • layer norm
      • self attention
      • dropout
    • cross attention block
      • layer norm
      • self attention
      • dropout
    • FFN
      • layer norm
      • MLP
      • dropout
  • 其中 self attention 的输入是 decoder hidden state注意不是 encoder hidden state
  • decoder hidden stateencoder hidden state 输入到 cross attention中,Cross attentionSelf attention 实际上只有一个区别:
    • self attentionquery / key / value 都由同一个 hidden state 得到,因此称为 self
    • cross attentionkey / value 由同一个 hidden state 得到,query 由另一个 hidden state 得到,因此称为 cross
    • encoder-decoder 架构的 transformer 中,decoder 中的 cross attentionkey / value 通常由 encoder output hidden state 得到,query 通常由 decoder hidden state 得到
  • 重复跑完 12 层,最终输出 shape = (batch, 1, decoder_dim)decoder output hidden state

7. decoder output hidden state to token

  • 需要将 docoder output hidden state 用一层 MLP 转化到 vocabulary 空间,找到最可能的一个 token
  • token 对应的单词即为模型最终输出的第一个词。
  • 如果这个词是词表中的结束符,则停止输出。如果不是,则用此词替代前一个词,重复上述的 5. decoder input token embedding and position encoding6. decoder7. decoder output hidden state to token 过程,直到达到最长输出长度限制或出现停止符。

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. 相对位置编码

新手管理者的关键跨越

1. 新手管理者会遇到的 9 个管理难题和需要完成的 3 个关键跨越

1.1 九个管理难题

  1. 从同时变为管理者,接受和适应“管理者”的身份。
  2. 空降到团队做管理者,被团队接纳和认可。
  3. 给团队成员分配合理的任务,提出合理的要求。
  4. 让员工承担更多或更有挑战性的工作,付出额外的努力。
  5. 让员工理解和认同管理者的要求,真正承担起责任。
  6. 处理团队搞不定的问题和突发状况。
  7. 及时掌握团队的任务执行情况,提前干预。
  8. 用恰当的方式给予员工反馈。
  9. 根据员工的不同情况,因材施教。

1.2 三个关键跨越

  1. 获得团队的认可和信任,完成“承担管理责任”的跨越。
  2. 让团队稳定可靠地交付工作成果,完成“推动执行”的跨越。
  3. 帮助团队改进和提升,完成“辅导他人”的跨越。

2. 新手管理者为何难以完成关键跨越

2.1 新手管理者普遍存在的现象

  • 通常当前在任的一线管理者在“承担管理责任”和“推动执行”方面表现良好,但在“辅导他人”方面表现很差,同时这也是相对最不受企业重视的能力。

2.2 管理者难以完成管理跨越的原因

  1. 从关注“事”到关注“人”,管理工作需要把工作对象和重心从“事”转移到“人”,这会挑战一部分管理者的工作习惯。
  2. 从“短期”到“长期”,管理工作相对需要更长的时间的投入才能看到成效,一部分管理者会等不及。
  3. 从“优势”变成“陷阱”,管理者习惯用过去自己习惯和擅长的方式解决问题,也更喜欢做自己擅长的事情。

2.3 新手管理者应该怎么做

  1. 需要做好的心态准备是“空杯心态”。
  2. 对“我过去这样成功过”的想法保持警惕。
  3. 列出一个反向待办事项清单,训练自己少做和不做过去自己擅长的事。

3. 成功跨越:在行动中改变

3.1 新手管理者在进行管理发展时,需要先理解两个问题

  1. 某些人可能更具有管理潜力,更适合做管理。具备潜力的人有更高的起点和更好的准备状态,但无论多有管理潜力,都与管理岗位的要求存在差距,而缩小差距的唯一办法就是进行管理实践。
  2. “知行不合一”是常态,管理者能采取有效的管理行动却未必具备相应的素质能力,同样,不具备一定优势的管理者,仍然可以先努力使自己的行为贴近团队管理者应有的表现。

3.2 新手管理者若想获得发展,需要采取的发展原则是从自身优势出发,先行动起来

  1. 了解自己的优势,把自己的优势作为一个支撑点和发力点。
  2. 行动起来,在行动中学习和发展。
  3. 通过管理历练和具体的时间,发展出相应的素质和能力。

3.3 新手管理者可以采用 APPLE 发展策略

APPLE 发展策略:

  1. Awareness: 认知管理者的要求,以及自身优势。
  2. Path: 制定一个最小化的发展路线图。从优势出发,给自己建立一个支撑点,并制定一个包括发展目标,具体行动和检验方法的计划。
  3. Practice: 付诸行动,通过刻意和反复的练习,跟过去的习惯已建立好的脑区地图抢夺资源,建立起新的通往目的地的路径。
  4. Learn: 学习知识,结合实践总结和反思。在实践中先有体验,学习就是带着问题寻找答案的主动过程。
  5. Evaluation: 定期评估,学会重新看待“评价”,把评价看做反映某一阶段性状态的中性动作。

关键跨越一:承担管理责任

4. 信任的基石:承担管理责任

4.1 新手管理者上任后的首要任务是取得团队的认可和信任

  1. 必须表现出一个管理者该有的样子,承担起管理的责任。
  2. 承担管理责任有三个关键要点:表率垂范、为结果负责和组织意识。

4.2 表率垂范包括以身作则和身先士卒

  1. 以身作则的核心是,要求下属的管理者自己要先做到。
  2. 身先士卒主要是,管理者在困难或关键时刻能顶上,冲在最前面。
  3. 要做到表率垂范,态度和勇气比能力更重要,是愿不愿的问题,而非能不能到问题。

4.3 为结果负责包括为所做决定负责和为团队的工作结果负责

  1. 要做到为决定负责,得学会适应两个常态:一是会犯错,二是不能两全其美。
  2. 为团队的工作结果负责要区分“好”的和“坏”的结果。取得坏结果时要帮团队“背锅”,取得好结果时则要把舞台和聚光灯留给下属。

4.4 组织意识包括遵守和代表组织的规则,以及团队的利益为先

  1. 在建章立制之前,应先适应和符合现有的规则。
  2. 团队利益为先是指你要为团队和公司着想,把个人利益放在团队之后。

5. 新手管理者容易走进的误区

5.1 新手管理者在取得下属认可和信任时,容易走入的第一类误区

  1. 过于依赖个人的专业能力,想要靠专业征服团队。这会带来的主要问题是管理者成为团队能力的上限,限制员工的发展。
  2. 认为可以完全不靠专业,发挥领导力即可。这会带来的问题是管理浮于表面,无法获得实质性的成效。

5.2 在进入管理岗位后,管理者需要在个人能力上实现两个转换

  1. 从运用自己的专业能力解决具体问题,转换为将专业优势赋能于团队。
  2. 从运用自己的个人实力去带领团队,转换为培养和成就团队。

5.3 第二类误区是让下属满意,还是让上级满意的问题

  1. 唯下”的管理者通常用两种方式取悦下属:一是让下属尽量少吃苦,二是滥用物质奖励。本质上都只是满足了保障性因素,只能让下属处于“不是不满意,也不是满意”的中性状态。
  2. “唯上”的管理者围绕上级开展工作,不太关心员工的感受。这类管理者的个人发展极为有限,更易受领导更换或组织环境变化影响。

5.4 管理者只需要让客户满意,这本质上是对绩效负责

  1. 管理者需要为此而帮助下属改进和挑战下属突破。这是管理者与团队建立信任的正确方式。

5.5 第三类误区是关于与下属的距离和关系

管理者易走入的两个极端:

  1. 制造距离感,以树立个人领导权威。
  2. 过于注重经营关系,导致为关系所累,或是只运用人际和影响技巧而不交心,变成对下属的操纵控制。

5.6 管理者需要把握不同场合的交往分寸

  • 管理者需要把握不同场合的交往分寸,做到“工作时严肃立规矩,私下可称兄道弟”。“事务”导向和“人际”导向的管理者所需要的努力不同,前者需要增加交流和互动,后者需要把握好情感投入的度。这样管理者与下属之间才能既有信任,也有温度。

6. 真诚是最好的套路

6.1 真诚是赢得信任的终极套路,包括真诚坦率和展现真我

6.2 真诚坦率包括两个维度

  1. 管理者能分享真实的信息,不隐瞒、不遮掩、不欺骗。
  2. 管理者能站在员工的角度理解员工,照顾员工的感受,真正为员工着想。根据这两个维度,管理者与下属相处有四种方式。

    • 虚伪应付:不告知员工信息或不讲真话,同时也不在乎员工的感受。这是最不真诚的,管理者展现的是一种高高在上地掌控一切的傲慢。
    • 真情假意:因为担心员工受伤害,而遮遮掩掩,不直接沟通。这样反而会弄巧成拙,员工会感觉到管理者有话不明说,因而会有各种猜测,从而造成很多误会。
    • 直言不讳:有话明说,但不太考虑员工的感受。尽管可能会让员工感觉不舒服,但这种方式比虚伪应付和真情假意更真诚。
    • 真诚坦率:既讲真话、实话,又能照顾到员工的感受。

6.3 做到真诚坦率要注意五点

  1. 就事论事
  2. 讲具体的事
  3. 多分析背景信息
  4. 不带着情绪
  5. 多给建议和指导

6.4 为了满足各种社会期待,每个人都会包装自己

但如果包装后的公众自我与你的内在自我差别很大,就会出现问题。

  1. 虚张声势很容易会被看出来,让管理者看起来不值得被信赖。
  2. 过度假装会让管理者自己很不开心。

6.5 展现真我要做到三点

  1. 认识你自己
  2. 建立你内心的准则
  3. 适当地暴露弱点

关键跨越二:推动执行

7. 新手管理者的执行力 2.0

7.1 新手管理者需要将个人执行力升级为团队执行力

  • 新手管理者需要将个人执行力升级为团队执行力,把最大化团队产出作为自己的工作目标,投入精力完成管理工作。

7.2 新手管理者要充分发挥团队成员的能力

  • 新手管理者要充分发挥团队成员的能力,激发团队成员的工作动力,并提供必要的支持,为团队成员减少工作阻力。

7.3 新手管理者需要警惕常见的六大误区

  • 新手管理者需要警惕常见的六大误区,规避不适用的思维模式和行为模式,完成管理角色转型。

    • 误区一:超人心态
    • 误区二:完美主义
    • 误区三:想当然
    • 误区四:控制狂
    • 误区五:疏离旁观
    • 误区六:安于现状

8. 做该做的事,把“猴子”还给下属

8.1 管理者要多做自己该做的事,少做或不做不该做的事

  1. 员工现有能力可以完成的任务,要坚定不移地交给员工去做。
  2. 员工“跳一跳”能完成的任务也可以交给员工去做,同时管理者要提供必要的辅导和资源支持。
  3. 员工能力差距较大但有意愿去挑战的任务,如果有试错的空间,管理者可以和员工一起做,并承担失败的风险。

8.2 忍住,让员工去思考和解决问题,避免接过原本属于员工的“猴子”

  1. 不要直接给员工答案。
  2. 用提问的方式启发员工,让员工思考下一步如何行动。
  3. 让员工为工作任务负起责任来。

8.3 不要做“超人”,放平心态

  1. 对团队多一些耐心,不要为了快速达成目标而代替员工完成工作。
  2. 通过帮助团队成长获得新的成就感,不要因为无法站在舞台中央的失落感,就选择自己做事,和下属竞争站回舞台中央的机会。
  3. 不要因为害怕失败就不敢冒险放手让下属尝试,要给员工犯错空间,并学会把失败当成自己和团队学习的机会。
  4. 不需要通过代替员工做事去刻意讨好下属,得有把任务派给员工后被讨厌的勇气。

9. 要事第一:目标取舍的智慧和勇气

9.1 良好的开端是成功的一半,在明确目标阶段管理者要做到“要事第一”

  1. 到重要的20%,重点投入。
  2. 跟上级充分沟通,让上级帮助明确不同目标的重要性和优先级排序。
  3. 不要追求面面俱到,得学会取舍,避免目标平均主义。

9.2 管理者在完成短期目标的同时,需要考虑如何实现年度目标,逐步建立长期思维

  1. 管理工作本身就是在为长期目标负责。
  2. 学会拉长时间维度去评估投入与收益。
  3. 根据业务紧迫性和团队成熟度对目标的优先级进行动态调整。

10. 人事匹配:让对的人去做对的事

10.1 根据意愿能力四象限,完成人事匹配

  1. 对于高意愿高能力的明星员工,可以把有难度的重要工作交给他们。
  2. 对于低意愿低能力的问题员工,需要进行绩效反馈,明确绩效改进方向。
  3. 对于高意愿低能力的“潜力股”员工,应以能胜任的工作任务为主,同时分配一些“跳起来”可以够得着的挑战性任务来提升其能力。
  4. 对于低意愿高能力的“精明人”员工,需要适当激发,并保证团队内部任务分配和激励回报的公平性。

10.2 可以通过观察、询问、实战三个环节来判断员工的意愿和能力

10.3 在进行任务沟通时,管理者要做到四点

  • 第一,将工作“翻译”成员工更容易听懂的语言,解释清楚“为什么”。
  • 第二,清晰无误地说明任务要求,不遗漏必要信息。
  • 第三,进行双向沟通,获得员工及时反馈。
  • 第四,与员工沟通不同工作的优先级。

10.4 管理者要避免陷入“想当然”误区

  • 管理者要避免陷入“想当然”误区,主动反思自己是否以己度人,忽略了人与人之间的差异,或低估了任务的难度。

10.5 管理者要避免“想当然”,应该在行动上向员工展现出欢迎提问的姿态,也需要在工作中多观察员工的行为,了解员工的意愿和能力

11. 过程管理:把握尺度

11.1 根据任务容错率和员工成熟度选择不同的管控方式,避免一刀切

  1. 对于容错率高的任务,如果员工成熟度高,可以让员工放手去做;如果员工成熟度低,则需要加强过程辅导。
  2. 对于容错率低的任务,即使员工成熟度高,管理者仍需要管理过程中的关键节点;如果员工成熟度低,这项任务应该由管理者自己负责,带着员工一起完成。

11.2 在过程管理中要避免陷入微观管理,变成“控制狂”,也不能放手不管,做一个远离团队的“甩手掌柜”

11.3 过程管理更有效的方式是设置合理的信息沟通反馈机制

  • 管理者可以通过以下方式获取需要的信息:
    • 定期开例会
    • 建立抄送邮件的规则
    • 工作进度可视化
    • 开展专项会议讨论
    • 加强非正式沟通

12. VUCA时代需要敏捷执行

12.1 VUCA时代需要敏捷执行,核心是以终为始,抓住关键矛盾

12.2 产出最小化可交付成果,尽早获得最终用户的反馈,通过多次迭代来更聪明、高效地工作,完成比完美更重要

12.3 制订有弹性的工作计划,给自己预留20%的时间用于应对临时出现的重要任务或者就用于思考,避免被不重要的事情塞满日程表

12.4 管理者要敢于说“不”,赢回自己的时间

具体可以参考以下三个步骤:

  • 复述对方的要求
  • 解释拒绝的原因
  • 坦诚说“不”

13. 复盘让管理实现闭环

13.1 复盘让管理形成闭环,为管理者提供思考的空间,也是团队改进和提升的原点

13.2 成功的复盘要求管理者和团队成员建立信任,保持开放、包容的心态,并有能力从过往的实践中提炼出规律性的结论,指导行动

13.3 复盘可以作为日常管理的工具,要做到及时和精要,才能保证良好的复盘效果

13.4 专项复盘可以帮助团队及时总结失败教训,沉淀成功经验

专项复盘分为三步曲:

  • 还原事实
  • 分析问题根因
  • 制订行动计划

关键跨越三:辅导他人

14. 辅导他人,亟待提升

14.1 .辅导员工的关键四步

  • 投入时间:坚持在辅导上投入时间,切实帮助团队提升。
  • 明确目标:以绩效目标为导向,了解员工现状,和员工就发展目标达成共识。
  • 反馈与指导:在辅导现场,直面挑战,提升员工的积极性,帮助员工解决问题。
  • 跟进与评价:跟进与评价员工的表现,评价他们的行为进展,并通过正确地批评和表扬他们,帮助他们更好地提升。

14.2 新手管理者在辅导上容易陷入的三个误区

  • 理想化:辅导形式大于内容,不考虑业务需求和员工现状。
  • 以自我为中心:只从自己的想法出发,忽视员工与自己的差异,遇到问题不是从自身寻找原因。
  • 急于求成:对员工的成长没有耐心,辅导员工时容易急躁,急于给员工下定论,难以持续投入。

15. 辅导的开始:如何投入时间

管理者进行辅导的第一步:切实有效地在辅导上投入时间。管理者要注意:

15.1 不为自己没有在辅导上投入找借口

  1. 正视自己没有辅导员工的现状,思考自己要如何改变。
  2. 相信自己可以决定自己的时间,并为自己的时间负责。

15.2 找到问题的症结所在,避免陷入“越努力,越忙碌”的处境

  1. 管理者面对的问题是系统性问题,单一的问题解决思路会起到反效果。
  2. 评估自己的行为会对团队产生的影响,通过辅导提升团队能力,从而建立自己在工作中的正向循环。

15.3 坚持在辅导上进行投入

  1. 辅导更需要细水长流的投入,考验的是管理者是否能坚持。
  2. 管理者需要有意识地培养自己的辅导习惯,可以通过诸如“辅导他人行为清单”的方式提醒自己。

15.4 基于二八原则分配自己的时间

  1. 管理者辅导员工时需要以团队的产出最大化为目标。
  2. 表现优秀的员工更值得,也更需要管理者的辅导。
  3. 只关注绩效表现不佳的员工,容易让其他员工感到不公平。
  4. 有效分配时间的关键在于准确地对员工进行分类。
  5. 管理者在评估员工时,要同时关注当下工作和未来工作的要求。

16. 明确目标,促进绩效达成

管理者在和员工制定辅导目标时,需要遵循以下三个原则:

16.1 促进绩效提升

  1. 基于对绩效目标的分析,结合员工当下的重点工作,初步找出可能需要提升的地方。
  2. 还原工作现场,通过行为观察、他人反馈、情境模拟等多种方式,了解员工实际的工作情况。
  3. 深入分析,找到员工表现背后的原因,制定有针对性的辅导方向。

16.2 和员工达成共识

  1. 在与员工沟通前,管理者和员工都需要做好充分的准备。
  2. 鼓励员工发表意见,认真倾听员工的想法,并且即使遇到冲突也就事论事,不强求员工听取自己的意见,也不和员工去争一时的对错。

16.3 辅导目标可评估、可实现

  1. 辅导目标要注重可行性,不要好高骛远。
  2. 辅导目标中应该包含具体的行为,有助于管理者和员工达成共识。

17. 信任、激发与赋能

在成功辅导员工的过程中,管理者要做到三件事情:与员工建立相互信任的辅导关系;激发员工不断提升自我的积极性;赋能员工,提升员工解决问题的能力。

17.1 建立相互信任的辅导关系

  1. 管理者要让员工尽快感受到自己的提升,从而让其对辅导抱有信心。
  2. 管理者需要避免高高在上,和员工做平等沟通,多倾听员工的想法。

17.2 激发员工的积极性

  1. 面对受挫的员工:管理者需要引导员工从长远和正向的角度看待问题,理解其受挫的感受和心情,并通过工作的调配转移其注意力。
  2. 面对积极性不高的员工:让员工更客观地认知自己的水平;为员工树立榜样,展现未来发展愿景;通过竞争持续调动员工的积极性。
  3. 面对缺少行动力的员工:发挥目标的管控作用,要求员工必须有行动;让员工为自己负责,管理者避免越俎代庖;必要时,终止辅导关系。

17.3 赋能员工

  1. 理解员工能力提升的三个阶段:知道、理解和应用。员工要逐步形成自己的知识体系,并通过思考和实践,不断地获得反馈和提升。
  2. 只让员工去尝试而不给予反馈,或只让员工学习知识而不实践都不是适合员工的辅导方式。
  3. 在赋能员工时,管理者要让员工通过历练,感受到挑战和问题所在,并对问题进行分析和思考,进而在实践中做出尝试和探索。在逐步探索中,管理者要鼓励员工形成自己的判断,通过对外输出,将自己的经验转化为能力。

18. 跟进与评价

员工的能力提升需要经历持续练习和反馈的过程。管理者需要在这个过程中持续跟进员工的行为表现,及时发现并指出员工的问题,帮助他们持续改进。管理者还需要及时看到员工取得的进展,并及时给予鼓励和肯定。

18.1 把辅导当成项目来管理

跟进最难的地方在于坚持,管理者可以按照管理项目的方式,始终聚焦辅导目标,制订跟进计划,明确责任人,使用辅助工具,以帮助自己形成跟进的习惯。

18.2 对员工的成长有耐心

员工的成长并非一蹴而就,管理者需要给员工时间和试错的空间,并且当员工取得进步时,即使没有达到期待,也要给予正向的鼓励。

18.3 做出正确的批评和表扬

跟进是评价和反馈的基础,要做到正确地批评和表扬,管理者要以事实为依据,以解决问题为导向,并在沟通时保持真诚。

成为管理者

19. 管理者发展的全景图:五个阶段的关键跨越

19.1 一个人的职业发展会历经很多角色,了解管理者发展的全景图,能帮助你提前做好准备,学会换位思考,理解上下级的工作挑战和想法

19.2 你会经历的职场角色有五个阶段

  1. 管理自我
  2. 管理他人
  3. 管理管理者
  4. 管理职能/事业部
  5. 管理企业

19.3 管理自我阶段的关键挑战

管理自我阶段的关键挑战:稳定可靠地交付工作成果、保持并提高专业的水准和效率、与客户和工作伙伴顺畅沟通。

所需完成的关键跨越:

  1. 高效执行
  2. 展现专业素养
  3. 有效沟通

19.4 管理他人阶段的关键挑战

管理他人阶段的关键挑战:获得团队的认可和信任、让团队稳定可靠地交付工作成果、帮助团队改进和提升。

所需完成的关键跨越:

  1. 承担管理责任
  2. 推动执行
  3. 辅导他人

19.5 管理管理者阶段的关键挑战

管理管理者阶段的关键挑战:

  1. 系统性地解决问题
  2. 让一线管理者充分发挥作用
  3. 统一目标,平衡资源和利益

所需完成的关键跨越:

  1. 系统化思考
  2. 授权
  3. 协同增效

19.6 管理职能/事业部阶段的关键挑战

应对常态化的模糊和不确定状况、以经营思维管理职能部门或事业部、确保人才梯队支持业务持续发展。所需完成的关键跨越:

  1. 模糊决策
  2. 经营意识
  3. 构建人才梯队

19.7 整个职业发展过程中也起着决定性作用的另外几个底层能力

还有几个底层能力,在整个职业发展过程中也起着决定性作用。这些能力包括:

  1. 清晰的自我认知能力
  2. 持续学习能力
  3. 弹性和韧性

19.8 发展关键跨越上的能力

发展关键跨越上的能力需要做到:

  1. 充分了解这些能力的完整行为链条
  2. 保持刻意练习
  3. 做好打持久战的准备

20. 一生的修炼,更好的自己

如同电影《和平战士》中,心灵导师苏格拉底对主人公丹·米尔曼所说:“没有开始或者终止,只有过程。”人生是一场修炼,修的是心性,炼的是技能,没有终点,出生即开始,永远都在进程中。我们陪伴了很多管理者走过“至暗时刻”,别着急,每个人都会经历,没有谁比谁更高明,只要坚持就会成功。在坚持的路上,除了职场的收获,你还会获得很多可迁移的技能。正如在游泳池中学会了游泳,在大海中也能施展一样。管理者练就的管理技能、打磨的心性,都可以在更多人生的场景找到应用机会。所以可以说,一旦成为管理者,就进入了这场修行的经验加速区:管理技能要求的倾听、沟通、共情,用在处理家庭矛盾、开展子女教育中,也效果明显;管理角色要求的时间管理、任务分配、绩效辅导、培养员工等技能,在自我管理、家庭决策、子女教育中,同样增益匪浅。成为管理者,能加速人生的修炼,乃至成就更好的自己。

1. 三维重建流程

1.1 运动恢复结构(Structure from Motion, SfM)

  • 输入:

    • 多视角图像
    • 相机内参
  • 输出:

    • 稀疏三维点云
    • 相机外参(位姿)
  • 主要过程:

    • 特征提取: 从图像中提取出能够用于匹配的特征点,如角点、边缘等。
    • 特征匹配: 在图像序列中匹配相对应的特征点,以建立图像之间的对应关系。
    • 相机定位: 利用特征匹配信息,估计相机在不同图像之间的运动,即相机的位姿。
    • 三维重建: 基于相机的位姿估计和特征点的视差信息,计算出场景中物体的三维坐标。

1.2 多立体视觉(Multi-View Stereo, MVS)

  • 输入:

    • 多视角图像
    • 相机内外参
    • 稀疏三维点云
  • 输出:

    • 稠密三维点云
  • 主要过程:

    • 图像对齐: 通过相机定位和特征匹配,将多个图像对齐,确保它们在同一坐标系下。
    • 深度图生成: 对每个像素估计其在场景中的深度或距离。这可以通过多个视角的图像之间的视差信息来实现,视差越大表示物体离
    • 机越近。
    • 点云重建: 利用深度图,将每个像素映射到三维空间中,形成一个点云表示物体的表面。

1.3 表面重建

  • 输入:稠密三维点云

  • 输出:场景/模型的三角网格(三角面片)

  • 主要过程:

    • 网格生成: 将点云转换为更为紧凑和结构化的表示,通常是三角网格。
  • 表面模型通常可导入可视化软件,也可进行物理仿真

1.4 纹理重建

  • 输入:

    • 多视角图像
    • 相机内外参
  • 输出:

    • 场景/模型的纹理图像
  • 主要过程:

    • 纹理映射(Texture Mapping): 将从图像中捕捉到的纹理信息映射到三维模型的表面上。这可以通过将图像中的颜色信息映射相应的三维模型表面上的顶点或像素来实现。这样,模型就能够呈现出与真实世界相似的外观。
    • 相邻像素插值: 由于模型表面上的顶点或像素数量有限,需要进行插值操作,以在整个表面上创建平滑和连续的纹理。这通常涉及对相邻像素之间的颜色进行插值,以便在纹理映射的过程中产生平滑的过渡效果。
    • 去除失真和伸缩: 在将图像纹理映射到三维模型时,可能会发生一些失真和伸缩。为了保持模型的准确性和真实性,需要进行一些校正步骤,以修复这些失真。
  • 纹理重建后即可可视化

2. 神经辐射场(Neural Radiance Fields, NeRF)

  • 将三维重建流程存储在 三角面片和纹理信息 的三维信息用神经网络拟合(隐式建模)。

  • 缺点是无法进行物理仿真。

  • 优点:

    • ppl 简单
    • 无空洞
    • 高逼真

URL

TL;DR

  • 传统基于关键点检测的车道线检测网络通常需要根据任务的定义设计模型输出头结构,比如 UFLD 算法每条车道线需要占据一个输出 channel

  • 本论文提出一种新颖的车道线检测范式,解耦了任务和网络,仅使用固定的输出通道数即可检测任意多条车道线。

Algorithm

总体思路

ganet2.png

  • 如何实现只用一个 channel 输出即可检测任意多条车道线?一个可以想到的简单方法是:

    1. 输出一个 channel = 1heat map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率。

    2. 使用阈值过滤得到所有车道线的关键点坐标(每条车道线关键点数量应 >= 2)。

    3. 使用聚类的方式将一堆关键点分成若干组,每组关键点表示一条车道线。聚类中的 “距离” 判定逻辑需要根据一些先验知识进行设计(比如:因为车道线在图片中更接近竖直方向,因此水平距离权重小于垂直距离)。

  • 上述操作中的聚类过程包含了很多人为总结的先验知识,非常不 “机器学习”,于是我们可以改进这个过程:

    1. 输出一个 channel = 1heat map 和一个 channel = 2offset map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率,每个位置的 offset map value 表示 如果该点是关键点,那么该点相对于本条车道线起始点的偏移(x, y),起始点表示一条车道线关键点中最靠近图片下方的点。

    2. 使用阈值过滤得到所有关键点,将关键点对应位置的偏移 offset 得到新的点 p',理论上同一条车道线的每一个关键点偏移后得到的新位置 p' 都一致,都是车道线起始点。

    3. 因为神经网络不太能拟合到 loss == 0,因此还需要对所有的 p' 进行聚类,每个类表示一条车道线实例,本质相当于将聚类中的距离判定逻辑吸到神经网络内部。

  • 以上就是本论文提出的 GANet 算法的核心思想:用固定的有限个输出通道去预测任意条车道线。

网络结构

ganet1.png

LFA(Lane-aware Feature Aggregator)

ganet3.png

动机

  • 传统的2D卷积在固定的网格状区域内采样特征,这不适用于处理车道线的狭长形状。

  • 因此作者使用如下步骤改进各关键点上的局部特征:

    1. 预测该关键点同一条车道线紧邻的 num_adjacent_keypoints 个点的 offset,进行显式监督。
    2. 用预测的 offset 引导可变形卷积改进关键点局部特征。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import torch
import torch.nn as nn
from torchvision.ops import deform_conv2d
import math

class LFA(nn.Module):
def __init__(self, in_channels, out_channels, num_adjacent_keypoints=5):
super(LFA, self).__init__()
self.offset_conv = nn.Conv2d(in_channels, 2 * num_adjacent_keypoints, kernel_size=1)
self.deform_conv_weight = nn.Parameter(torch.Tensor(out_channels, in_channels, 3, 3))
nn.init.kaiming_uniform_(self.deform_conv_weight, a=math.sqrt(5))

def forward(self, x):
# x: input feature map with shape [batch_size, in_channels, height, width]

# Step 1: Predict the offsets for adjacent keypoints
offsets = self.offset_conv(x) # shape: [batch_size, 2 * num_adjacent_keypoints, height, width]

# Step 2: Perform deformable convolution to aggregate features
aggregated_features = deform_conv2d(x, offsets, self.deform_conv_weight, stride=1, padding=1)

return aggregated_features, offsets # Return both aggregated features and offsets

# Initialize LFA module
lfa = LFA(in_channels=64, out_channels=128, num_adjacent_keypoints=5)

# Dummy input feature map with shape [batch_size, in_channels, height, width]
input_feature_map = torch.randn(16, 64, 128, 128)

# Forward pass
aggregated_features, predicted_offsets = lfa(input_feature_map)

# aggregated_features 是特征输出
# predicted_offsets 是预测的相邻的 num_adjacent_keypoints 个车道线的偏移量,显式监督

Thought

  • 提出了一种灵活的车道线检测范式,具有较好的可拓展性,目前在车道线榜单上比较靠前。

  • 另外一个创新点是LFA module,主要是用到了可形变卷积,对于大多数动态性较差的端侧芯片来说,不容易部署。

URL

TL;DR

  • 传统 BEV 算法中 View Transform 都是通过 LSS 实现 Image ViewBEV View 的转变,这种视角转换方法依赖于图像视角的深度估计(显式或隐式)。

  • 本文提出一种新的通过时空注意力机制实现的 View Transform 方法,在 Neuscenes 数据集上取得了不错的 3D 目标检测成绩(略差于 BEVDet4D)。

Algorithm

URL

TL;DR

  • 本文提出一种 BEV 视角下的的 3D 目标检测算法,作者认为尽管深度对相机 3D 检测至关重要,但最近的方法中的深度估计却出奇地不足。

  • BEVDepth 通过利用显式深度监督(来自 lidar 点云)来解决这个问题。

  • 同时使用关键帧和过渡帧在 bev feature 维度进行特征融合,引入时序信息,提高模型效果。

Algorithm

bevdepth1.png

  • BEVDet4Dpipeline 很相似,区别是 BEVDepth 使用了 DepthNet 用激光雷达点云数据做了深度监督。

  • DepthNet 深度监督的输入是 6v 图像特征和每个相机的内外参,输出为 相机相关深度估计(camera_awareness_depth_estimation)

bevdepth2.png

显式监督效果和 baseline 对比还是很赞的!

table.png

MAPNDS 吊打了一众基于纯视觉的算法

Thought

  • 多帧训练中过渡帧使用了 nuScenes 数据集的 Sweep 数据(没有人工标注的原始数据,只包含图像和 lidar 点云),无形中拓展了数据量。

  • 本文创新点不多,基本是 BEVDet4D + DepthNet,更像是一个工程优化,比如:用 cuda 写了 voxel pooling 过程,计算过程非常高效。

URL

TL;DR

  • BEVDet4D 是基于 BEVDet 加入了时序信息的一篇论文

  • 具体来说就是将上一帧的 BEV Feature 和本帧的 BEV Feature 对齐后 Concat 到一起送入 BEV Encoder 中进行 BEV 视角下的 3D 目标检测

  • BEVDet 论文中的 image encoder + view transformer 完全保持不变

  • 由于有两帧的信息,所以对速度的预测相较于单帧有较大提升

Algorithm

整体流程

bevdet4d.png

BEV Feature 层面(View Transformer 的输出)融合两帧信息

算法的伪代码表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class BEVDet4D:
def __init__(self):
# 初始化相关的编码器、转换器和其他必要的组件
self.image_view_encoder = ImageViewEncoder()
self.view_transformer = ViewTransformer()
self.bev_encoder = BEVEncoder()
self.head = DetectionHead()
self.previous_bev_feature = None

def spatial_alignment(self, feature):
# 这里执行空间对齐操作,具体细节可能需要根据原始论文进行补充
# 实际代码中这里似乎没有开,即上一帧的 BEV feature 直接和本帧 BEV feature map concat
aligned_feature = ...
return aligned_feature

def forward(self, current_image):
# 使用图像视图编码器和视图转换器处理当前图像
image_feature = self.image_view_encoder(current_image)
transformed_feature = self.view_transformer(image_feature)

# 使用BEV编码器获取当前帧的BEV特征
current_bev_feature = self.bev_encoder(transformed_feature)

# 如果存在前一帧的BEV特征,则进行空间对齐和融合
if self.previous_bev_feature:
aligned_previous_feature = self.spatial_alignment(self.previous_bev_feature)
fused_feature = concatenate(aligned_previous_feature, current_bev_feature)
else:
fused_feature = current_bev_feature

# 使用检测头部进行3D物体检测
detections = self.head(fused_feature)

# 保存当前帧的BEV特征以供下一帧使用
self.previous_bev_feature = current_bev_feature

return detections

# 实例化BEVDet4D并进行前向传递
bevdet4d = BEVDet4D()
detections = bevdet4d.forward(current_image)

result

BEVdet4D2.png

效果比 BEVDet 好了不少,尤其是 mAVE (速度误差)

Thought

  • 没有很大的创新点,更像是 BEVDet 的一个使用 trick

  • BEVDet 的计算量主要分布在 image encoderview transformer,所以复用上一帧的 BEV feature 即充分利用了上一帧的计算量,对当前帧引入的额外计算量也比较可控(BEV encodertask head 都比较轻量)