在理解 LLM 预训练和微调的原理之前,我们先解释三个基础概念。
「Token」:在自然语言处理中,一个'token'是语言的基本单位,它可以是一个词、一个字或一个标点符号。例如,句子'我喜欢冬天'被切分为 3 个 tokens:'我'、'喜欢'、'冬天'。
「Prediction」:预测是指模型基于当前输入序列预测下一个可能出现的 token。这是语言模型的核心任务之一。
「Train」:训练则是指模型逐渐学会识别和预测文本中的模式的过程。例如在'我喜欢 X'的模式中,模型会观察到'我喜欢'后面可能跟着许多不同的词,但有些词(如'你'、'北京'、'世界')出现的频率更高。通过这种方式,模型不仅学会预测下一个词,还学会更深层次的语言结构和语义关系,这使得它在处理诸如文本生成、情感分析、机器翻译等 NLP 任务时更加有效。
要理解这一训练过程,最主要就是明白**「预训练的数据如何构造、数据怎么喂给模型、模型输出是什么以及如何计算 loss。」**
什么是 token?
token 是指文本中的一个词或者子词,给定一句文本,送入语言模型之前,首先对原始文本进行 tokenize,也就是将一个文本序列拆分为离散的 token 序列。
tokenize 是在大量未标注的文本数据上进行训练,创建一个固定的词表,这个词表包含了模型能够理解和操作的所有 tokens。
tokenizer 将文本转换为 tokens 序列之后,下来就是词嵌入,将每个 token 转换为其对应的向量表示,捕捉 token 的语义和上下文信息,使得模型能够在数学空间中进行计算和推理。
我们知道文本序列是有顺序的,而常见的语言模型都是基于 self-attention 机制的 Transformer 结构,而自注意力机制本身并未考虑序列中元素相对位置信息,因为需要手动加上位置编码,也就是每个 token 位置有个位置嵌入,与对应位置的 token embedding 相加。
模型训练或推理阶段经常会出现 Context Length 这个术语,这是指模型在一次前向传播中能够有效处理的 token 序列的最大长度,在训练阶段,如果模型只学习了较短的序列的位置 embedding,那模型在推理阶段就不能适用于较长文本。
预训练 Pre-train
输入序列经过 token embedding 和位置 embedding 处理后,会形成一个融合了词义信息和位置信息的嵌入向量序列,进而送入 Decoder-only 架构的 Transformer 模型中。
Transformer 模型会为每个输入 token 生成一个输出 embedding,这个输出 embedding 包含了丰富的上下文信息,可用于预测序列中的下一个 token。这个过程也可以当作一个分类问题看待,具体如下:
线性层映射:输出 embedding 通过一个线性层,其输出维度等于词表大小。这个线性层实际上是一个矩阵乘法,将每个 token 的 embedding 映射到一个与词表大小相同的向量上。这个向量中的每个元素可以看做是下一个 token 输入词表中相应类别的原始分数。
Softmax 变换:为了将这些原始分数转化为概率分布,需要应用 Softmax 函数。Softmax 函数将每个元素转换为概率值,并确保所有概率值之和为 1。
训练:在训练阶段,最大化概率使得它能够预测真实的下一个 token。
推理:在推理阶段,模型根据最后一个生成 token 的输出概率分布采样下一个 token。
在训练阶段,decoder-only 架构的 Transformer 模型利用因果自注意力(Causal Self-Attention)机制,能够一次性对整个输入序列的每个位置的 token 预测其下一个 token,并计算所有位置 token 的损失。
下面通过一个完整的例子介绍这个过程。假设有一个预训练数据集,
你知道什么是预训练吗?
假设经过 tokenize 后文本分成 token:
你:2
知道:5
什么:6
是:1
预训练:8
吗:7
?:6
原来的数据变为如下序列,后面补了三个 0(假设我们希望最大序列长度是 10)。
2 5 6 1 8 7 6 0 0 0
预测下一个 token 就类似于 2 预测 5,2、5 预测 6,…,以此类推,但是这样拆成很多个数据段比较低效,「因此可以考虑使用移位构造数据。」
即:
输入 X:2 5 6 1 8 7 6 0 0 0
输出 targets:5 6 1 8 7 6 0 0 0
这样就可以一次性把整条序列喂给模型,计算一次就包含了 6 个预测下一个 token 的损失了。这里模型的设计理念是:不能让输入看到后面的词(如果看得到的话就没必要进行预测了),也就是'你'在模型内看不到'知道','你 知道'在模型内看不到'什么',这个可以通过注意力机制实现。
通过移位构造的输入序列维度是 (1,10),其中 1 代表批量大小(这里为单样本训练),10 代表序列长度。经过 Embedding 层后,数据形状变为 (1,10,768),这里假设词嵌入维度是 768。


