核心目标

本模块将带你深入大语言模型(LLM)的内部,了解其核心的组成部分和构建流程。学完本模块,你将能够:

  • 清晰地描述一个LLM从输入到输出的完整流程,并解释各关键组件的作用。
  • 熟悉并区分主流LLM(如BERT, GPT, T5, Llama)的架构特点和适用场景。
  • 理解构建一个大模型所涉及的关键步骤,包括数据准备、架构设计和分布式训练策略。

4.1 LLM的组成:从Tokenizer到输出层

详细文字讲解

一个大语言模型就像一个高度自动化的文本处理工厂,它接收原始文本,经过一系列精密的、环环相扣的加工,最终产出我们需要的文本(如答案、翻译、代码或故事)。这个“工厂”主要由以下几个核心车间组成:

1. Tokenizer (分词器)
  • 作用:这是模型接收人类语言的第一站,也是至关重要的一步。Tokenizer负责将原始的、连续的字符串文本切分成模型能够理解的、离散的、更小的单元,称为Token。Token可以是完整的词(word)、有意义的子词(subword)甚至是单个字符。
  • 为什么需要Tokenizer?
    • 构建有限的词汇表 (Vocabulary):自然语言的词汇量是近乎无限的(新词、组合词、拼写错误等)。模型不可能记住所有的词。通过将词切分为更小的子词(例如 unhappiness -> un, happi, ness),可以用一个固定大小、可控的词汇表来表示几乎所有的文本,极大降低了模型的复杂性。
    • 处理未登录词 (Out-of-Vocabulary, OOV):当遇到词汇表中没有的词(例如一个新创的品牌名“TraeAI”)时,Tokenizer可以将其分解为已知的子词(如 Trae, A, I),而不是简单地标记为一个无意义的“未知”符号(<UNK>),从而保留了部分语义信息。
  • 常见算法:Byte-Pair Encoding (BPE), WordPiece (BERT使用), SentencePiece (Llama使用)。这些算法的核心思想都是通过迭代合并最高频的字节对或字符对来构建词汇表。
  • 输出:一串整数ID,每个ID都是该Token在词汇表中的唯一索引。
代码示例:使用Hugging Face transformers库进行分词
from transformers import AutoTokenizer

# 加载一个预训练好的Tokenizer,例如Llama 3的Tokenizer
# 注意:你需要先登录Hugging Face Hub: huggingface-cli login
model_name = "meta-llama/Meta-Llama-3-8B"
try:
    tokenizer = AutoTokenizer.from_pretrained(model_name)
except Exception as e:
    print(f"无法加载Tokenizer,请确保已登录Hugging Face Hub并且网络通畅。错误: {e}")
    # 使用一个无需登录即可访问的替代模型
    model_name = "bert-base-uncased"
    print(f"将使用替代模型: {model_name}")
    tokenizer = AutoTokenizer.from_pretrained(model_name)

text = "Trae AI is the world's best IDE."

# 将文本编码为Token IDs
encoded_input = tokenizer(text)
input_ids = encoded_input["input_ids"]

print(f"原始文本: {text}")
print(f"Token IDs: {input_ids}")

# 将Token IDs解码回文本
decoded_text = tokenizer.decode(input_ids)
print(f"解码后的文本: {decoded_text}")

# 查看具体的Tokens
tokens = tokenizer.convert_ids_to_tokens(input_ids)
print(f"Tokens: {tokens}")
2. Embedding Layer (嵌入层)
  • 作用:将Tokenizer输出的、无实际数学意义的离散Token ID,转换为计算机能够处理的、连续的、稠密的向量表示,即词嵌入(Word Embedding)。这个向量能够在一个高维空间中捕捉Token的语义信息,意义相近的Token在空间中的距离会更近。
  • 工作原理:可以看作一个巨大的查询表(Lookup Table),或者一个不含激活函数的线性层。输入是一个Token ID(例如 29871),输出是该ID在嵌入矩阵中对应的行向量。这个向量的维度就是模型的隐藏层维度(d_model),例如768, 4096或更大。
  • 融合位置信息:在这个阶段,位置编码(Positional Encoding) 会被加到词嵌入上。这一步至关重要,因为它为天生不感知顺序的Transformer模型注入了关于Token在序列中绝对或相对位置的信息。
3. Transformer Layers (Transformer核心层)
  • 作用:这是LLM的核心计算引擎,负责对输入的嵌入向量序列进行深度的上下文信息提取和融合。一个LLM通常由数十甚至上百个相同的Transformer层堆叠而成,数据在这些层之间逐层传递,每一层都会对输入进行更深层次的抽象和加工。
  • 内部结构:每一层都包含两个关键子层:
    1. 多头自注意力机制(Multi-Head Self-Attention):让每个Token能够“看到”序列中的所有其他Token,并计算它们之间的相关性权重,从而动态地聚合信息,捕捉长距离依赖关系。
    2. 前馈神经网络(Feed-Forward Network):一个简单的全连接神经网络,对自注意力层的输出进行非线性变换,增加模型的表示能力,可以看作是信息的“精加工”步骤。
  • 残差连接与层归一化:每个子层都包裹在残差连接和层归一化(LayerNorm)之中,这是确保深度网络能够稳定训练的关键技术。
4. Output Layer (输出层)
  • 作用:这是模型的最后一站,负责将最顶层Transformer处理后的、富有上下文信息的高维向量,转换为人类可以理解的、有意义的最终输出。
  • 对于生成式模型(如GPT/Llama)
    • 通常是一个线性层(Linear Layer),也称为“语言模型头(LM Head)”。它将顶层Transformer的输出向量(维度为 d_model)映射到整个词汇表的大小(vocab_size)上,得到一个Logits向量
    • 然后,一个Softmax函数会作用于这个Logits向量,将其转换为一个概率分布。这个分布中的每个值代表了下一个Token是词汇表中对应Token的概率。
    • 最后,通过某种采样策略(Sampling Strategy)(如贪心搜索、束搜索、Top-k/Top-p采样)从这个概率分布中选择一个Token作为最终的输出。
流程图:LLM的完整工作流(精细版)
graph TD
    subgraph s_in[Input Processing]
        A[原始文本: Trae AI is…] --> B[1. Tokenizer]
        B --> C[Token IDs: 123, 456, 789, …]
    end
    
    subgraph s_core[Model Core]
        C --> D[2. Embedding Layer]
        D --> Add((+))
        PE[Positional Encoding] --> Add
        Add --> E[融合位置信息的嵌入向量]
        E --> F[3. Transformer Layers - N Stacked]
        F --> G[处理后的高级表示 - Hidden States]
    end

    subgraph s_out[Output Generation]
        G --> H[4. Output Layer - Linear Head]
        H --> I[Logits - 与词汇表等长]
        I --> J[Softmax]
        J --> K[下一个Token的概率分布]
        K --> L[5. 采样策略]
        L --> M[最终输出Token ID]
        M --> N[Decode]
        N --> O[输出文本 - the]
    end

    style F fill:#ccf,stroke:#333,stroke-width:2px

本节总结

  • LLM的工作流程是一个从离散ID到连续向量,再回到离散ID的过程。
  • Tokenizer是连接人类语言和机器语言的桥梁。
  • Embedding层将ID转化为有意义的语义向量,并与位置编码结合。
  • Transformer层是模型的核心,通过自注意力和前馈网络进行深度信息处理。
  • 输出层将处理结果映射回词汇表,通过Softmax采样生成最终文本。

4.2 主流模型特点介绍

详细文字讲解

基于Transformer架构,研究者们发展出了几种不同设计哲学的LLM,它们在预训练任务和结构上的差异,决定了它们各自的特点和适用场景。

1. Encoder-Only架构 (自编码模型, Auto-Encoding)
  • 代表模型BERT (Bidirectional Encoder Representations from Transformers), RoBERTa, DeBERTa。
  • 核心思想:像做“完形填空”一样学习语言。通过掩码语言模型(Masked Language Model, MLM) 任务进行预训练。具体来说,就是随机遮盖(Mask)输入文本中约15%的词,然后让模型去预测这些被遮盖的词是什么。
  • 结构特点
    • 只使用Transformer的Encoder部分。
    • 由于在预测一个被遮盖的词时,模型可以同时看到它左侧和右侧的所有上下文信息,因此这种表示是双向(Bidirectional) 的。这使得它能生成包含极其丰富的上下文信息的高质量文本嵌入
  • 优势:对文本的理解能力极强。
  • 适用场景:非常适合自然语言理解(NLU) 任务,如文本分类、情感分析、命名实体识别(NER)、句子关系判断(如NLI)、问答(抽取式)等。
  • 局限性:其“完形填空”式的预训练方式决定了它不适合直接用于连贯的长文本生成(即NLG任务)。
2. Decoder-Only架构 (自回归模型, Auto-Regressive)
  • 代表模型GPT系列 (Generative Pre-trained Transformer), Llama, Mistral, Gemma
  • 核心思想:像“文字接龙”一样学习语言。通过标准的因果语言模型(Causal Language Model, CLM) 任务进行预训练,即根据已经给出的上文,预测下一个最可能的词是什么。
  • 结构特点
    • 只使用Transformer的Decoder部分。
    • 在自注意力计算中使用了因果掩码(Causal Masking),确保在预测位置 t 的词时,只能看到它前面(从位置1到 t-1)的上下文,而不能“偷看”未来的信息。因此,其本质是单向(Uni-directional) 的(通常是从左到右)。
  • 优势:天生就是生成式的,结构简单高效,非常擅长遵循指令、进行对话、创作内容。
  • 适用场景:几乎所有的自然语言生成(NLG) 任务,如聊天机器人、文本续写、代码生成、创意写作、摘要、翻译等。这是目前最主流、最成功的LLM架构。
3. Encoder-Decoder架构 (序列到序列模型, Sequence-to-Sequence)
  • 代表模型T5 (Text-to-Text Transfer Transformer), BART
  • 核心思想:将一切NLP问题都看作是“文本转换”问题。它提出了一种统一的“文本到文本”(Text-to-Text)范式。它将所有的NLP任务都统一转换成一个“输入文本 -> 输出文本”的格式。
    • 分类任务:输入是句子,输出是类别名称的字符串(如“positive”)。
    • 翻译任务:输入是源语言句子,输出是目标语言句子。
    • 摘要任务:输入是长文章,输出是简短的摘要。
  • 结构特点
    • 同时使用Transformer的Encoder和Decoder。Encoder负责充分理解输入文本,生成其高级表示;Decoder则基于这些表示,自回归地生成输出文本。
  • 优势:在需要对输入文本有深入、完整的理解,同时又要进行复杂、有条件的生成的任务上表现出色。
  • 适用场景:机器翻译、文本摘要、问答等需要将一个输入序列映射到另一个新的输出序列的传统Seq2Seq任务。
架构对比图(精细版)
graph TD
    subgraph BERT (Encoder-Only) - NLU Expert
        direction TB
        Input1["The cat [MASK] on the mat"] --> E1{Encoder Stack};
        E1 --> Output1["Prediction for [MASK] is 'sat'"];
    end

    subgraph GPT (Decoder-Only) - NLG Expert
        direction TB
        Input2["The cat sat on the"] --> D1{Masked Decoder Stack};
        D1 --> Output2["Prediction for next word is 'mat'"];
    end

    subgraph T5 (Encoder-Decoder) - Seq2Seq Expert
        direction TB
        Input3["translate English to German: The cat sat on the mat"] --> E2{Encoder Stack};
        E2 -- Encoded Representation --> D2{Decoder Stack};
        D2 --> Output3["Die Katze saß auf der Matte"];
    end

本节总结

  • Encoder-Only (BERT):双向上下文,理解是长项,适合NLU任务。
  • Decoder-Only (GPT/Llama):单向上下文,生成是长项,适合NLG任务,是当前主流。
  • Encoder-Decoder (T5):结合两者,转换是长项,适合传统的Seq2Seq任务。

4.3 大模型的构建:从0到1的挑战

详细文字讲解

构建一个真正意义上的大语言模型(例如像Llama 3 8B这样拥有80亿参数的模型),是一个集资本、技术、工程于一体的巨大挑战。它远不止是编写几行PyTorch代码那么简单,而是一个涉及海量数据、庞大算力、复杂算法和精细工程优化的系统性工程。下面我们来拆解这个过程中的核心挑战。

1. 数据:模型的“食粮”
  • 规模与质量:大模型之所以“大”,首先在于其惊人的数据消耗量。训练一个基础模型通常需要万亿(Trillion)级别的Token。这些数据不仅要量大,还要质优。低质量、有偏见、包含有害信息的数据会直接“毒害”模型,导致模型产生错误、偏见甚至危险的输出。
  • 来源与多样性:数据来源必须极其广泛,以确保模型的“世界知识”全面且不偏科。常见来源包括:
    • 通用网络文本:如Common Crawl,提供了海量的网页文本,但需要深度清洗。
    • 高质量文本:书籍、科学论文(如arXiv)、百科(如Wikipedia)。
    • 代码数据:GitHub等代码托管平台,用于训练模型的代码能力。
    • 对话数据:社交媒体、论坛等,用于提升模型的对话和交互能力。
  • 数据预处理:这是最耗时、最关键的步骤之一,包括去重、过滤低质内容(如广告、导航栏)、去除有害信息、处理个人隐私(PII)、以及进行语言识别等。
2. 架构与算法:模型的“骨架”与“灵魂”
  • 架构选择:虽然主流是Decoder-Only架构,但具体到模型参数,如模型深度(层数)、宽度(隐藏层维度)、注意力头的数量等,都需要精心设计和权衡。更大的模型通常性能更强,但训练成本和推理延迟也更高。这背后是复杂的缩放法则(Scaling Laws) 在起作用,指导研究者如何在算力预算内最优化模型配置。
  • 算法创新:除了基础的Transformer架构,研究者们还在不断探索新的优化,例如:
    • 更高效的注意力机制:如FlashAttention,通过优化GPU内存读写来大幅加速计算并减少显存占用。
    • 新的位置编码方案:如RoPE (Rotary Positional Embedding),比传统的正弦位置编码在长序列上表现更好。
    • 归一化和激活函数:使用RMSNorm替代LayerNorm,使用SwiGLU等激活函数,都能在提升性能的同时保持训练稳定。
3. 分布式训练:协同作战的“军团”
  • 挑战:没有任何单一的计算设备(即使是顶级的NVIDIA H100 GPU)能够容纳一个数十亿甚至数千亿参数的模型。因此,必须将模型和数据拆分到数千个GPU组成的集群上,进行分布式训练

  • 核心并行策略

    1. 数据并行 (Data Parallelism, DP):最简单的方式。将同一份模型复制到每个GPU上,然后将训练数据分成多份,每个GPU处理一部分数据。计算完梯度后,通过通信(如All-Reduce)将所有GPU的梯度平均,然后更新各自的模型。适用于模型较小,但数据量很大的场景。
    2. 张量并行 (Tensor Parallelism, TP):当单个GPU无法容纳模型时使用。它将模型内部的巨大权重矩阵(例如前馈网络中的线性层)在层内进行切分,每个GPU只负责计算矩阵的一部分。这需要大量的GPU间高速通信。
    3. 流水线并行 (Pipeline Parallelism, PP):将模型的不同层(Layers) 分配到不同的GPU上。例如,GPU-1负责1-10层,GPU-2负责11-20层,以此类推,形成一个“流水线”。数据像在工厂流水线上一样,依次流过这些GPU。这可以有效降低单个GPU的显存压力,但可能导致“流水线气泡”(GPU空闲等待),需要通过微批次(Micro-batching)等技术来优化。
  • 混合并行:在实践中,通常会将这三种并行策略结合使用,形成复杂的3D并行方案,以最高效地利用整个GPU集群。

分布式训练策略图解
Distributed Training Strategies
Data Parallelism
Tensor Parallelism
Pipeline Parallelism
GPU 1: Layers 1-N
Input
GPU 2: Layers N+1-M
Output
Split Tensor
Input
GPU 1: Sub-Tensor A
GPU 2: Sub-Tensor B
Gather Results
Output
Grad 1
GPU 1: Model Replica, Data Batch 1
Grad 2
GPU 2: Model Replica, Data Batch 2
All-Reduce
Update Models
4. 训练后对齐:教会模型“说人话”
  • 预训练 vs. 对齐:预训练(Pre-training)完成的模型,虽然知识渊博,但它只是一个强大的“文本补全机器”,并不知道如何遵循人类的指令,也可能输出有害内容。它需要经过对齐(Alignment) 阶段,才能成为一个有用的AI助手。
  • 关键步骤
    1. 监督微调 (Supervised Fine-Tuning, SFT):用高质量的“指令-回答”数据对预训练模型进行微调,教会模型理解并遵循指令的格式。
    2. 奖励建模 (Reward Modeling, RM):训练一个“品味”模型。让人类对同一个指令的多个不同回答进行排序,奖励模型学习判断哪个回答更好。
    3. 强化学习 (Reinforcement Learning from Human Feedback, RLHF):使用奖励模型作为“裁判”,通过强化学习算法(如PPO)进一步微调SFT模型,鼓励它生成更符合人类偏好的回答(即奖励模型打分高的回答)。

本节总结

  • 构建大模型是一个系统工程,涉及数据、算法、算力三大支柱。
  • 数据是基础,需要海量、高质量、多样化的数据,并进行精细的预处理。
  • 分布式训练是核心工程挑战,需要结合数据并行、张量并行和流水线并行等策略。
  • 训练后对齐(SFT和RLHF)是模型从“博学”到“有用”的关键一步,确保模型能安全、有效地与人类交互。

详细文字讲解

构建一个类似GPT-3或Llama级别的大模型是一项集数据科学、算法工程和高性能计算于一体的巨大工程挑战,涉及三个核心要素:海量的高质量数据、精心设计的模型架构和庞大的计算资源。

1. 训练数据准备:模型的“食粮”
  • 数据收集 (Data Collection):需要从极其广泛的来源收集数TB甚至PB级别的海量文本和代码数据。主要来源包括:
    • 网页数据:如Common Crawl项目,提供了互联网的快照。
    • 书籍:如Google Books,提供了结构化、高质量的文本。
    • 代码:如GitHub,用于训练模型的代码生成和理解能力。
    • 学术论文:如ArXiv,提供科学和技术领域的知识。
    • 对话数据:用于提升模型的对话能力。
  • 数据清洗 (Data Cleaning):这是最关键也最耗时的一步,直接决定了模型的“品行”和能力上限。需要进行严格的、多阶段的过滤和处理:
    • 去重:在文档级别和句子级别去除重复内容。
    • 质量过滤:基于启发式规则(如文本长度、符号比例、语言识别)或模型打分,过滤掉低质量内容(如乱码、广告、自动生成的文本)。
    • 内容过滤:去除有害、有毒、非法内容,进行个人隐私信息(PII)的脱敏处理。
  • 数据混合 (Data Mixture):不同的数据源需要以精心设计的比例混合。通常,高质量的、经过筛选的语料(如书籍、维基百科)应该在训练中被过采样(upsampled),即出现更多次,以向模型注入更多高质量的知识和语言模式。
2. 模型架构设计:模型的“骨架”
  • 选择基础架构:是采用Decoder-Only,Encoder-Decoder,还是更复杂的混合专家(MoE)架构?目前,Decoder-Only因其结构简单和生成效果出色而成为主流选择。
  • 确定模型规模 (Scaling Laws):包括参数量(几十亿到数万亿)、层数(Depth)、隐藏层维度(Width)、注意力头的数量等。这些超参数的选择并非凭空猜测,而是遵循缩放法则(Scaling Laws),即模型性能与模型大小、数据量和计算量之间存在可预测的幂律关系。这使得研究者可以在小规模实验的基础上,估算大模型的性能。
  • 架构优化与改进:研究者们在原始Transformer的基础上提出了一系列关键改进,这些已成为现代LLM的标配:
    • 激活函数:使用如SwiGLU替代传统的ReLU,以获得更好的性能。
    • 位置编码:使用旋转位置编码(RoPE) 替代绝对位置编码,它在处理长序列时表现更佳。
    • 归一化层:使用RMSNorm替代LayerNorm,计算效率更高且效果相当。
    • Tokenizer:选择合适的词汇表大小和分词算法。
3. 分布式训练策略:模型的“引擎”

单个GPU的内存(通常为几十GB)完全无法容纳一个大模型(参数动辄数百GB)及其优化器状态。因此,必须采用复杂的分布式训练技术,将模型和数据拆分到数千个GPU组成的集群上。主要的并行策略有:

  • 数据并行 (Data Parallelism, DP):最简单的并行方式。将同一份模型复制到多个GPU上,每个GPU处理一小批(mini-batch)不同的数据,然后通过All-Reduce操作聚合所有GPU的梯度来更新模型。当模型本身太大无法放入单个GPU时,此方法失效。

  • 张量并行 (Tensor Parallelism, TP):将模型中的单个大矩阵(如权重矩阵)在维度上进行切分,分布到不同的GPU上。例如,一个矩阵乘法 Y = XA 可以被拆分,一个GPU计算 Y1 = XA1,另一个计算 Y2 = XA2,最后再通过All-Gather操作将 Y1Y2 拼接起来。这允许单个Transformer层内的计算在多个GPU上协同完成。

  • 流水线并行 (Pipeline Parallelism, PP):将模型的不同层(Layers)放置在不同的GPU上,形成一个“计算流水线”。数据像在流水线上一样,依次通过每个GPU(负责一部分层)的处理。为了减少GPU空闲(“流水线气泡”),通常会使用微批次(micro-batch)技术。

  • ZeRO (Zero Redundancy Optimizer):一种更高级的内存优化策略,它将数据并行提升到了新的高度。它不仅对数据进行分区,还对此优化器状态(Optimizer States)、梯度(Gradients)和模型参数(Parameters) 本身也进行分区存储,极大降低了每个GPU上的内存冗余。

在实践中,通常会结合使用多种并行策略(例如,在节点内使用张量并行,在节点间使用流水线并行,并用数据并行/ZeRO扩展到更多节点),以最高效地利用GPU集群资源。

本节总结

  • 构建大模型是一个涉及数据、算法、算力三位一体的系统工程。
  • 数据是基础,其质量和多样性决定了模型的上限。
  • 架构是核心,现代LLM是在经典Transformer基础上的持续优化和创新。
  • 分布式训练是关键,通过结合多种并行策略,才使得训练万亿参数模型成为可能。

模块总结

在本模块中,我们拆解了大语言模型这个“黑盒子”,从内部组件到宏观架构,再到其背后的构建挑战。

  • 我们学习了LLM从Tokenizer到输出层的完整内部工作流,并通过代码示例具体感受了Tokenizer的作用。
  • 我们详细对比了BERT (Encoder-Only)、GPT/Llama (Decoder-Only)、T5 (Encoder-Decoder) 这三类主流模型的架构差异、预训练目标和核心应用场景。
  • 我们探讨了构建一个大模型所面临的巨大挑战,从海量数据的清洗与混合,到遵循缩放法则的架构设计,再到复杂的分布式训练策略(DP, TP, PP, ZeRO),对LLM的诞生过程有了更全面、更深入的认识。

了解了LLM的构造之后,下一个模块我们将学习如何“驾驭”这些强大的模型,让它们为我们的特定任务服务——模型微调。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐