LLM如何学习和回答 — 大型语言模型的训练与推理过程

LLM的训练是通过阅读海量文本,调整数十亿个参数以更好地预测下一个token的过程;而推理则是使用固定参数,逐个生成输入之后应出现的token的过程。

在之前的文章中,我们从历史和分类的角度探讨了人工智能、机器学习、深度学习与生成式AI之间的关系。在该分类中,大型语言模型(LLM)是基于深度学习生成文本的一种生成式AI。

这一次,我们将进一步深入分类内部。

当您向ChatGPT或Claude等服务输入问题时,几秒钟内就会出现自然的答案。从屏幕上看,模型似乎在阅读问题、搜索存储的知识,然后像人一样思考并撰写句子。

然而,内部发生的事情与此描述略有不同。LLM在训练阶段将语言的统计模式压缩到参数中,在推理阶段则利用这些参数和当前上下文来计算下一个token的概率。选择一个token后,将其附加到输入中,并重复相同的计算以生成句子。

本文将涵盖以下内容:

  • 原始文本如何成为训练数据的过程
  • 什么是token和参数,模型学习了什么
  • 预训练中前向传播、损失计算和反向传播的发生方式
  • 为什么需要监督微调和偏好对齐
  • 推理中预填充、KV缓存和解码的运作过程
  • 温度、Top-k和Top-p改变答案的原理
  • 训练、微调、RAG和推理的区别

首先要区分的两个阶段:训练与推理

理解LLM最重要的起点是区分训练和推理。

训练是改变模型参数的过程。它计算模型预测的下一个token与实际下一个token之间的差异,并逐步调整权重以减少该误差。通过在无数句子和批次上重复此操作,模型学习了单词的使用方式、句子结构、概念之间的关系以及各种问题解决模式。

推理是使用已训练模型的D过程。即使输入了用户的提示,在一般的推理过程中,模型的参数也不会改变。它只是利用已固定的参数和当前的对话上下文来计算下一个token。

这两个过程的区别首先总结如下表:

类别 训练 推理
目的 通过减少下一个token预测误差来形成能力 生成与输入匹配的输出token
参数 持续更新 通常固定
主要输入 大规模训练数据和正确token 用户提示和对话上下文
计算方向 前向传播和反向传播 以前向传播为主
并行处理 并行处理大量token和批次 预填充是并行,生成是逐token顺序处理
成本特性 一次训练需要巨大的计算量和时间 每次请求重复,运营规模决定成本
结果 检查点或完成的模型 文本、代码等生成结果

训练类似于制作教科书和进行长期训练的过程,而推理则类似于在考场上使用已学知识来撰写答案。然而,这个比喻中也有需要注意的地方。人类在考试时也能积累经验,但一般的LLM API调用并不会在请求结束后自动训练模型的基本参数。


第一步:收集文本并不能直接用于训练

LLM训练的第一步是数据准备。

虽然可以收集各种文本,如网页文档、书籍、论文、代码、问答资料和对话数据,但如果直接将收集到的原始文本用于训练,可能会出现质量和安全问题。

同一文档可能在多个网站上重复,并且可能混入自动生成的垃圾邮件、无意义的字符串、个人信息、有版权问题的资料、恶意代码和有害内容。如果特定语言、地区和视点的数据过多,模型的行为也会反映出这种偏见。

因此,在实际的数据管道中,以下工作至关重要:

  • 删除重复或相似文档
  • 文档质量判断和垃圾邮件过滤
  • 个人信息和敏感信息检测
  • 调整语言和领域比例
  • 删除过短或损坏的文档
  • 记录数据来源、使用权限和谱系
  • 分离训练、验证和评估数据

即使模型结构相同,训练数据的构成和清洗方式不同,结果也可能大相径庭。在LLM开发中,数据工作不仅仅是简单的预处理,更是决定模型知识范围、文体、偏见和安全性的核心设计过程。


第二步:将句子分割成Token

神经网络无法直接计算句子本身。为了将文本转换为数字,首先需要进行token化。

Token是模型处理文本的基本单位。一个token并不总是意味着一个单词或一个字符。经常出现的单词可能是一个token,而罕见的单词可能会被分成多个部分。韩语的助词和词尾、英语单词的前缀和后缀、空格和标点符号也会根据分词器的规则分解成不同的单位。

例如,以下句子可以根据模型和分词器分成多个token:

생성형 AI는 문장을 만듭니다.

概念上,它可能呈现出以下类似的形式:

[생성, 형, AI, 는, 문장, 을, 만듭니다, .]

实际的分割结果因模型而异。重要的是,每个token都被转换为词汇表中的整数ID。

[1842, 731, 9274, 118, 5321, 84, 22017, 13]

模型将这些ID转换为嵌入向量。嵌入是将token表示为数百或数千维的数字数组。随着训练的进行,在相似上下文中使用的token将具有相关方向的表示,模型在这个向量空间中计算单词和概念之间的关系。

Token化也会影响成本。即使是含义相同的句子,根据语言和表达方式,token数量也可能不同,大多数LLM服务都以输入和输出token为基准计算成本和使用量。


第三步:通过预测下一个Token来学习语言

许多自回归LLM的预训练目标出奇地简单:

根据前面出现的token预测下一个token。

假设以下句子在训练数据中:

인공지능은 데이터를 통해 패턴을 학습한다.

模型可以一次性学习以下多个预测问题:

인공지능은 → 데이터를
인공지능은 데이터를 → 통해
인공지능은 데이터를 통해 → 패턴을
인공지능은 데이터를 통해 패턴을 → 학습한다

即使不需要人工为每个句子手动添加正确标签,也可以将原文中后一个token作为正确答案。这被称为自监督学习。这是互联网规模的海量文本能够被用作训练数据的重要原因。

但这并不意味着模型仅仅记忆了前一个词和后一个词的频率。为了在各种上下文中准确预测下一个token,模型必须将语法、文体、事实关系、文档结构、代码规则和概念之间的关联性反映到其内部表示中。

例如,预测“韩国的首都是”之后出现的token需要反映地理信息;预测函数开始部分之后出现的代码需要追踪编程语法和前面变量的作用。这就是为什么从预测下一个token这个简单目标中会涌现出多种能力的原因。


第四步:Transformer计算上下文

当token ID转换为嵌入后,它们会通过Transformer层。

2017年提出的Transformer的核心是注意力机制。注意力机制计算在处理当前token时,应参考上下文中其他token的程度。

请看以下句子:

민수는 노트북을 가방에 넣었다. 그것은 새 제품이었다.

要判断“它”指代什么,需要查看前面出现的“笔记本”和“包”之间的关系。自注意力机制为每个token创建Query、Key和Value向量,并利用Query和Key的相似度来计算应混合多少其他token的Value。

概念上,它类似于:

Attention(Q, K, V) = softmax(QKᵀ / √d) V

多个注意力头可以关注不同的关系。有些头可能捕捉语法关系,另一些头可能捕捉相距较远的单词之间的指代或主题关系。

每个Transformer层不仅包含注意力机制,还包括前馈网络、残差连接和归一化。通过多次通过这些层,token表示从简单的词向量转变为反映当前上下文的表示。

最终的输出层为词汇表中的所有token生成分数,即logits。应用softmax后,可以得到下一个token的概率分布。

서울 0.72
부산 0.08
대한민국 0.05
도시 0.03
기타 토큰 0.12

在训练阶段,模型会进行修改,使这个分布为实际的正确token赋予高概率。


第五步:计算错误程度并更新参数

模型预测的概率与实际下一个token之间的差异称为损失。下一个token的训练通常使用交叉熵损失。

如果正确答案是“首尔”,而模型给“首尔”的概率是0.72,那么损失相对较小。如果只给了0.01,那么损失就很大。

计算损失后,反向传播开始。利用微积分的链式法则,计算输出误差对每个层和参数的影响程度,即梯度。

然后,优化器利用梯度逐步更新参数。

새 파라미터 = 기존 파라미터 - 학습률 × 기울기

实际训练中,还会同时使用Adam系列优化器、学习率调度、权重衰减和梯度裁剪等技术。虽然一个公式很简单,但在数十亿个参数和大规模批次上重复此计算需要大量的GPU或AI加速器以及分布式训练技术。

训练过程大致按以下循环重复:

데이터 배치 준비
→ 순전파
→ 다음 토큰 확률 계산
→ 손실 계산
→ 역전파
→ 파라미터 업데이트
→ 다음 배치

在此过程中,模型的参数和优化器状态会定期保存为检查点。这是为了在训练失败时进行恢复,评估特定时间点的模型,并将其用作后续微调的起点。


仅靠预训练难以成为优秀的对话式AI

完成预训练的模型虽然掌握了大量的语言和知识模式,但很难说它已经成为一个能够稳定遵循用户指令的对话式工具。

这是因为准确预测网页文档中下一个token的目标与“准确安全地回答问题”的目标并不相同。预训练模型可能会在问题之后继续提出另一个问题,生成不必要冗长的文档,或者直接响应有害请求。

因此,预训练之后会进行后训练。

监督微调

在监督微调(SFT)中,使用指令和模范答案对。

사용자: 다음 문장을 세 줄로 요약해줘.
도우미: <좋은 요약 답변>

通过学习这些数据,模型不再仅仅是连接互联网上的句子,而是学会区分用户和助手角色,并生成符合指令格式的答案。

反映人类偏好的对齐

许多问题没有唯一的正确答案。即使两个答案都是事实,其中一个可能更清晰、更友好。

在RLHF方法中,人类对多个答案进行偏好排序,然后训练一个奖励模型来预测这些偏好,之后可以对语言模型应用强化学习,使其获得更高的奖励。

DPO等方法则利用偏好和非偏好答案对直接优化策略模型。尽管实现方式不同,但目标相似:使模型更好地遵循人类偏好的实用性、诚实性、安全性和文体。

如果说预训练构建了模型的基础能力和广泛的知识表示,那么后训练则调整了这些能力在对话产品中如何展现。


推理第一步:将提示转换为Token并一次性读取

假设用户向已训练的模型发送了以下问题:

LLM의 학습과 추론 차이를 두 문장으로 설명해줘.

服务器将提示进行token化,并将token ID传递给模型。如果包含系统提示、之前的对话、搜索结果和工具执行结果,这些内容也会以预定格式包含在上下文中。

模型首次处理整个输入提示的阶段称为预填充(prefill)。在预填充中,输入token通过Transformer层,并计算每个位置的Key和Value向量。

这些结果存储在KV缓存中。这是为了避免每次生成下一个token时都重新计算整个先前提示的Key和Value。

预填充可以相对并行地处理输入token。因此,输入非常长的文档可能会增加第一个token出现前的时间并增加内存使用量,但并非所有输入token都必须逐字顺序生成。


推理第二步:逐个生成下一个Token

预填充完成后,解码开始。

模型根据当前上下文计算下一个token的logits和概率分布。解码器从该分布中选择一个token。

例如,第一个输出token的候选可能如下:

학습은 0.58
LLM의 0.18
두 0.07
모델 0.05
기타 0.12

如果选择了“学习是”,则将此token附加到上下文之后,并再次计算下一个token。

입력 프롬프트
→ “학습은” 생성
→ “학습은 모델의” 생성
→ “학습은 모델의 파라미터를” 생성
→ 계속 반복

这个过程称为自回归生成。由于每个新token都依赖于所有先前生成的token,因此输出生成本质上是顺序的。

KV缓存通过重用先前token的注意力Key和Value来减少重复计算。然而,随着输出变长,缓存会变大,并且每一步需要参考的上下文也会增加。这就是长上下文和长答案会增加延迟和内存使用量的原因。

当模型生成终止token、达到设定的最大token数或遇到服务指定的停止字符串时,生成过程结束。


为什么相同问题答案会不同

模型不仅仅输出一个下一个token,它还会计算整个词汇表的概率分布。选择哪个token取决于解码策略。

贪婪选择

在每一步中选择概率最高的token。结果相对一致,但可能会出现重复或过于平淡的句子。

温度

温度调节概率分布的尖锐度。

  • 低温度:更集中于高概率token,结果稳定
  • 高温度:低概率候选被选择的可能性增大,结果多样

温度高并不意味着模型更聪明。它只是改变了多样性和可预测性之间的平衡设置。

Top-k

只保留概率最高的k个token作为候选,其余的排除。

Top-p

将概率按降序相加,直到累积概率达到p为止,只使用这些候选。候选数量根据上下文动态变化。

如果需要精确的代码或结构化响应,低温度和限制性解码可能更有利;而对于创意构思或文体变化,更多样化的采样可能有所帮助。


模型在推理时会重新学习吗

在一般的推理请求中,模型的参数不会改变。

如果用户在对话中告知“我叫民秀”,模型可以在当前上下文中参考该信息。然而,一旦对话从上下文中消失,基础模型并没有永久性地学习到名为民秀的用户。

服务可以将对话历史存储在单独的数据库中,或者通过记忆功能再次将其放入提示中,或者稍后作为训练数据进行审查。但这与在一次推理过程中参数立即更新是不同的。

模型在推理过程中生成多步解释也是同样的原理。模型可以使用更多的输出token来分解中间问题,但在此过程中,其基本参数并没有重新学习。


微调和RAG属于哪一类

在LLM应用中,训练、微调和RAG经常被混淆。

微调

微调是使用特定数据对现有模型进行额外训练以改变其参数的过程。它可以更新所有参数,也可以像LoRA一样只训练少量额外参数。

它对于将特定文体、输出格式和重复业务模式反映到模型行为中非常有用。然而,将其用作数据库替代品以频繁更新最新事实,在管理和准确性方面可能效率低下。

RAG

检索增强生成(RAG)是一种通过搜索与问题相关的文档,将其放入提示中,然后进行推理的方法。它不改变模型的基本参数。

사용자 질문
→ 관련 문서 검색
→ 질문과 문서를 프롬프트로 구성
→ LLM 추론
→ 답변 생성

它适用于提供频繁变化的内部文档、产品说明书和政策等,这些知识的来源和时效性很重要。

提示工程

提示工程也是在推理阶段设计输入的过程。它通过明确角色、指令、示例和输出格式,帮助模型以期望的方式使用其已有的能力。它不直接改变模型的参数。

方法 参数更改 外部文档使用 最适合的目的
预训练 是 用作训练数据 形成基础语言能力和广泛表示
微调 是 用作额外训练数据 调整文体、格式和特定行为模式
RAG 否 推理时搜索并使用 提供最新事实、内部知识和依据
提示工程 否 可直接包含在输入中 控制指令和输出格式

—

为什么训练昂贵而推理成为运营问题

训练不仅需要前向传播,还需要反向传播和优化器状态计算。参数、梯度和优化器状态必须保存在内存中,并且必须在多个设备上处理大规模数据批次。

因此,一次大规模的预训练需要巨大的计算量、电力、高速网络和存储设备。

推理不进行反向传播,因此从单个请求来看,它比训练轻量。但在服务中,无数用户的请求持续涌入。输入长度、输出长度、并发用户数和响应时间目标决定了整体运营成本。

在推理系统中,以下指标很重要:

  • 第一个token出现所需的时间
  • 之后每秒生成的token数量
  • 可同时处理的请求数量
  • 每个请求的GPU内存和KV缓存使用量
  • 每个输入和输出token的成本
  • 在保持响应质量的同时可应用的量化水平

使用较小的模型,将参数量化到较低精度,将请求动态批处理,并有效管理KV缓存可以降低推理成本。相反,无条件地使用最大的模型和最长的上下文,可能会导致延迟和成本增加,其幅度超过质量收益。


为什么仅凭下一个Token预测也能生成听起来自然但错误的答案

LLM不是直接判断事实真伪的数据库,而是计算上下文中下一个token概率的模型。

即使遇到训练数据中没有或稀有的问题、相互冲突的信息、最新事件和模糊的提示,模型也可能继续生成看似合理的token,而不是停止。句子听起来自然与内容真实并非一回事。

要减少幻觉,系统设计比单纯增加模型大小更重要。

  • 通过RAG提供最新或内部资料
  • 要求答案提供来源和依据
  • 将计算和查询委托给可验证的工具
  • 通过规则和单独的验证模型确认重要结果
  • 在不知道的情况下应用“不知道”的回答策略
  • 通过评估数据反复测量准确性和失败类型

理解LLM的训练原理,就能明白为什么“模型学了很多,所以总会说真话”这种期望是危险的。


一次性连接整个过程

LLM的生命周期可以简化如下:

원시 데이터 수집
→ 정제·중복 제거·품질 관리
→ 토큰화
→ 사전 학습
→ 평가와 체크포인트 선택
→ 지도 미세 조정
→ 선호도 정렬과 안전성 조정
→ 배포
→ 프롬프트 입력
→ 프리필과 KV 캐시 생성
→ 토큰별 디코딩
→ 결과 검증과 사용자 응답

在训练中,与正确token的误差通过反向传播改变参数。在推理中,参数固定,利用提示和迄今为止生成的token来选择下一个token。

理解这个区别有助于回答以下问题:

  • 为什么一次对话不会永久训练模型?
  • 为什么长提示会增加首次响应时间?
  • 为什么长输出会逐个token缓慢生成?
  • 为什么改变温度会使相同问题的答案不同?
  • 为什么对于最新知识,RAG可能比微调更适合?
  • 为什么听起来自然的句子不一定意味着事实准确?

LLM既不是一个逐句存储知识并检索的搜索引擎,也不是一个每次请求都会自行修改参数的系统。

在训练阶段,它将大规模数据的模式压缩到参数中;在推理阶段,它利用这些参数和当前上下文重复生成下一个token。

准确理解这个简单原理是不过分夸大LLM能力和局限性,并正确地在需要的地方部署训练、微调、RAG和提示设计的起点。


参考文献


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注