文章目录
- [基于 `Transformer` 工作机理](#基于
Transformer工作机理) - [使用 `LLMs` 实现文本生成](#使用
LLMs实现文本生成) - 偏好与限制
在讲述 Transformers之前,我们先了解自然语言处理( Natural Language Processing, NLP)和大语言模型( Large Language Models, LLMs)。
NLP 是一个更广泛的领域,专注于使计算机能够理解、解释和生成人类语言。NLP 包含许多技术和任务,如情感分析、命名实体识别和机器翻译。
NLP 是语言学和机器学习的一个领域,专注于理解与人类语言有关的一切。NLP 任务的目的不仅仅是理解单个单词,而是能够理解这些单词的上下文。下面列出的是 NLP 解决的一些通用任务:
- 对提供的句子文本做分类:根据输入文本判断文本表达的情感,检测电子邮件是否是垃圾邮件,确定一个句子是否语法正确,或者两个句子是否在逻辑上相关等。
- 对句子中的每个词汇做分类:识别句子的语法成分(名词、动词、形容词)或命名实体(人、地点、组织)。
- 生成文本:用自动生成的文本完成提示,使用遮罩词填充文本中的空白。
- 从文本中提取答案:给定一个问题和上下文,根据上下文提供的信息提取问题的答案。
- 根据输入文本生成新句:把一篇文章翻译成另一种语言,为文章提取摘要。
LLMs是 NLP模型的一个强大子集,其特点是它们具有庞大的规模,广泛的训练数据,并且能够以最少的任务特定训练执行广泛的语言任务。Llama、GPT或Claude系列等模型都是 LLMs 的例子,它们彻底改变了 NLP 的可能性。LLMs 具有如下特点:
- 规模:它们包含数百万、数十亿甚至数千亿个参数
- 一般能力:他们可以在没有特定任务训练的情况下执行多个任务
- 情境学习:他们可以从提示中提供的例子中学习
- 突发能力:随着这些模型规模的增长,它们展示了无须程式化或预期的能力
LLMs 的出现将范式从为特定的 NLP 任务构建专门的模型转变为使用单个的大型模型,该模型可以通过提示或微调以解决广泛的语言任务。这使得复杂的语言处理变得更加容易,同时也在效率、行为准则和部署等领域引入了新的挑战。但是,LLMs 也有重要的局限性:
- 幻觉:他们可以自信地产生错误的信息
- 缺乏真正的理解:他们缺乏对世界的真正理解,并且纯粹根据统计模式进行操作
- 偏差:它们可能会重现训练数据或输入中存在的偏差。
- 上下文窗口:它们具有有限的上下文窗口(尽管这正在改进)。
- 计算资源:它们需要大量的计算资源
计算机处理信息的方式与人类不同。例如,当我们读到"我饿了"这个句子时,我们很容易理解它的意思。同样地,给出两个句子,如"我饿了"和"我难过",我们可以很容易地确定它们的相似度。对于机器学习(ML)模型来说,这样的识别会很困难。
即使 LLMs 取得了进步,许多根本性的问题仍然存在。这些包括理解歧义、文化背景、讽刺语和幽默话题等等。 LLMs 通过在不同的数据集上进行大规模训练来解决这些问题,但在许多复杂的场景中, LLMs 仍然经常缺乏人类水平的理解。
基于 Transformer 工作机理
上面说过,Transformers 是 Transformer 在 Python 上的实现,在这里,我们回顾一下 Transformer 的架构图,它本身是由编码器和解码器两部分组成,因此,我们可以简化如下图:

该模型主要由两部分组成:
- 编码器(左):编码器接收输入并构建其表示(特征)。这意味着模型通过从输入中获取理解而得到优化。
- 解码器(右):解码器使用编码器生成表示(或叫特征)和其他输入来生成目标序列。这意味着该模型针对输出的生成得到了优化。
编码器和解码器都可以独立的使用;如果提供的模型仅能编码,那编码器就可以工作;提供的模型如果只能解码,则只能解码器工作;如果两者都提供,则编码器和解码器都可以工作。
注意力层
Transformer 模型的一个关键特性是用称为注意力层的特殊层构建的。在处理每个单词的表示时,该层将告诉模型特别注意传入的句子中的某些单词(或多或少地忽略其他单词)。
为了把它放到上下文中,考虑一下将文本从英语翻译成法语的任务。给定输入 You like this course,翻译模型需要特别注意相邻的单词 You,以获得单词 like 的正确翻译,因为在法语中,动词 like 根据主语的不同而有不同的变化;而句子的其余部分对这个词的翻译没有用处。同样,在翻译 this 时,模型还需要注意单词 course,因为 this 的翻译根据关联的名词是男性还是女性而有所不同。同样,句子中的其他单词对于 course 的翻译并不重要。对于更复杂的句子(及更复杂的语法规则),模型需要特别注意可能出现在句子中较远的单词,以便正确翻译每个单词。
同样的概念也适用于任何与自然语言相关的任务:一个单词本身有一个含义,但这个含义受到上下文的深刻影响,上下文可以是该单词之前或之后的任何其他单词。
架构和检查点
在深入研究 Transformer 模型时,将会提到架构、检查点以及模型等术语,它们的含义都略有不同:
- 架构(
Architecture):这是模型的骨架,每一层的定义以及模型中发生的每一个操作。 - 检查点(
Checkpoints):这些是将在给定架构中加载的权重。 - 模型(
Model):这是一个概括性术语,不像"架构"或"检查点"那样精确:它可以同时表示两者。
举个例子,BERT是一个体系结构,而 BERT -base-case(谷歌团队为 BERT 的第一个发行版训练的一组权重)是一个检查点。人们通常可以说 BERT模型或 BERT -base-case 模型,但是他们是有区分的。
模型
Transformers 的工作能力基于提供的模型。一些模型可能只实现某些技术,甚至从新的角度处理任务;但对于Transformer模型,一般的思想是相同的。由于其灵活的架构,大多数模型都是编码器、解码器或编码器-解码器结构的变体。
在 Transformers 库中,语言模型通常分为三种架构类型:
- 仅编码模型:适用于需要理解输入的任务,例如句子分类和命名实体识别。
- 仅解码器模型:适用于生成任务,如文本生成。
- 编解码模型:对于需要输入的生成任务来说很好,
编码器模型
编码器模型只使用 Transformer 模型的编码器。在每个阶段,注意层都能接触到最初句子中的所有单词。这些模型通常被描述为具有"双向"关注,并且通常被称为自动编码模型。
这些模型的预训练通常围绕着以某种方式破坏给定的句子(例如,通过屏蔽其中的随机单词),并将寻找或重建初始句子的任务交给模型。
编码器模型最适合需要理解完整句子的任务,例如文本分类、命名实体识别(以及更普遍的词分类)和抽取式问答。
该系列的模型代表包括 BERT、DistilBERT、ModernBERT。
解码器模型
解码器模型只使用 Transformer 模型的解码器。在每个阶段,对于给定的词,注意层只能访问句子中位于它前面的词。这些模型通常被称为自回归模型。
解码器模型的预训练通常围绕着预测句子中的下一个单词。这些模型最适合于涉及文本生成的任务。
该系列的模型代表包括 Hugging Face SmolLM Series、Meta's Llama Series、Google's Gemma Series、DeepSeek's V3 。
现在,大多数现代大型语言模型(LLMs)都采用仅解码器模型架构。在过去的几年中,这些模型在规模和功能上都有了显著的增长,其中一些最大的模型包含了数千亿个参数。
LLMs 的训练通常分为两个阶段:
- 预训练 :模型通过大量文本数据的学习,预测下一个
token。 - 指令调优:对模型进行微调以遵循指令并生成有用的响应。
这种方法已经产生了能够理解和生成自然语言的文本的模型,这些文本跨越了广泛的主题和任务。
编码器-解码器模型
编码器-解码器模型(也称为序列到序列模型)使用 Transformer 架构的两个部分。在每个阶段,编码器的注意力层可以访问初始句子中的所有词,而解码器的注意层只能访问输入中位于给定词之前的词。
这些模型的预训练可以采取不同的形式,但它通常涉及重建输入已被某种程度上损坏的句子(如被屏蔽的词)。T5 模型的预训练包括用单个特殊标记掩码替换文本的随机范围(可以包含几个单词),然后预测该掩码标记所替换的文本。
序列到序列模型最适合于根据给定输入生成新句子的任务,例如摘要、翻译或生成式问答。
序列到序列模型在需要将一种形式的文本转换为另一种形式同时保留含义的任务中表现出色。一些实际应用包括:
| 应用 | 说明 | 模型案例 |
|---|---|---|
| 机器翻译 | 将一种类型语言的文本翻译成另外一种语言的文本 | Marian, T5 |
| 文本摘要 | 为文章提取文章摘要 | BART, T5 |
| 数据到文本生成 | 将结构化的数据转化成自然语言表示 | T5 |
| 语法检查 | 修正文本中的语法 | T5 |
| 问答 | 基于上下文生成答案 | BART, T5 |
该系列的模型代表包括 BART、mBART、Marian、T5 。
使用 LLMs 实现文本生成
到目前为止,我们已经分析了 Transformer 架构在一系列离散任务(如文本分类或摘要)的应用。然而,大型语言模型主要用于文本生成,我们将探索 LLM 推理背后的核心概念,全面了解这些模型如何生成文本以及推理过程中涉及的关键组件。
首先从基本原理开始。推理是使用训练有素的 LLMs 从给定的输入提示生成自然语言表达的过程。语言模型利用他们从训练中获得的知识,一次一个词地构思响应。这些模型利用从数十亿个参数中学习到的概率来预测和生成序列中的下一个token。这种顺序生成允许 LLMs 生成连贯的和上下文相关的文本。
注意力机制充当的角色
注意力机制赋予 LLMs 理解语境和生成连贯的、和上下文相关的文本的能力。在预测下一个单词时,并不是句子中的每个单词都具有相同的权重;例如,在句子 the capital of France is... 中,单词 France 和 capital 对于确定下一个单词应该是 Paris 至关重要。这种专注于相关信息的能力就是我们所说的注意力。
通过识别最相关的单词来预测下一个 token 的过程已经被证明是非常有效的。尽管训练 LLMs 的基本原则是预测下一个 token(自 BERT 和 GPT-2 以来一直保持),但在神经网络的扩展性上,通过注意力机制以越来越低的成本工作于越来越长的序列方面,已经取得了重大进展。
上下文长度和注意力广度
如果我们关心 LLMs 实际上可以处理多少上下文,这就引出了上下文长度,或者模型的"注意力持续时间"。上下文长度指的是 LLMs 一次可以处理的 token(单词或单词部分)的最大数量。可以把它想象成模型工作内存的大小;这些能力受到几个实际因素的限制:
- 模型的架构和大小
- 可用的计算资源
- 输入和期望输出的复杂性
在理想情况下,我们可以为模型提供无限的上下文,但硬件限制和计算成本使这变得不切实际。这就是为什么不同的模型设计了不同的上下文长度,以平衡能力和效率。
提示的艺术
当我们将信息传递给 LLMs时,我们以一种引导 LLMs生成所需输出的方式来构建的输入。这叫做"提示"。
了解 LLMs 如何处理信息有助于我们制作更好的提示。由于模型的主要任务是通过分析每个输入标记的重要性来预测下一个 token,因此输入序列的措辞变得至关重要。
推理过程
现在我们了解了基本组件,让我们深入了解 LLMs 如何实际生成文本。这个过程可以分为两个主要阶段:预填充阶段和解码阶段。这些阶段像一条装配线一样一起工作,每一个阶段都在生成连贯的文本中起着至关重要的作用。
预填充阶段
预填充阶段就像烹饪的准备阶段。在这个阶段,所有的原料都被加工好并准备好。这个阶段包括三个关键步骤:
- 标记化 :将输入文本转换为
token(将其视为模型理解的基本构建块)。 - 嵌入转换 :将
token转换为数字表示形式以便捕获其含义。 - 初始处理:通过模型的神经网络运行这些嵌入,以创建对上下文的丰富理解
这个阶段是计算密集型的,因为它需要一次处理所有输入 token。把它想象成在开始构建响应之前阅读和理解整个段落。
解码阶段
在预填充阶段处理完输入之后,就进入实际生成文本的解码阶段。该模型每次生成一个 token,称之为自回归过程(其中每个新 token 依赖于所有先前的 token)。
解码阶段每个新 token 的生成涉及以下几个关键步骤:
- 注意计算 :回顾所有之前的
token以理解上下文 - 概率计算 :确定每个可能的下一个
token的可能性 token选择 :根据这些概率选择下一个token- 继续检查:决定是继续生成还是停止生成
这个阶段是内存密集型的,因为模型需要跟踪以前生成的所有令牌及其关系。
取样策略
既然我们已经理解了模型是如何生成文本的,那么让我们来探索控制这个生成过程的各种方法。就像作家可以在更有创意或更精确之间做出选择一样,我们可以调整模型如何进行标记选择。
根据概率选择 Token
当模型需要选择下一个 token 时,它从词汇表中每个单词的原始概率(称为 logits)开始。但我们如何将这些概率转化为实际的选择呢?让我们来分析一下这个过程:

- 原始逻辑:可以将其视为模型对下一个可能单词的最初直觉
- 温度控制 :就像一个创造力表盘------较高的设置( > 1.0 >1.0 >1.0)让选择更随机和更有创造性,较低的设置( < 1.0 <1.0 <1.0)让选择更集中和确定
top-p抽样 :不考虑所有可能的单词,而是只考虑最可能达到我们选择的概率阈值的单词(例如,前 90 % 90\text{\%} 90%)。top-k过滤 :一种替代方法,只考虑 k k k 个最可能的下一个单词
减少重复性
LLMs 面临的一个共同问题是都倾向于重复自己的观点------就像一个演讲者总是回到同样的观点上。为了解决这个问题,我们使用两种类型的惩罚:
- 存在惩罚 :无论重复频率如何,给定一个固定的惩罚。适用于任何以前出现过的
token。这有助于防止模型重用相同的单词。 - 频率惩罚 :根据
token被选中的频率来增加惩罚比例。一个单词出现的次数越多,再次被选中的可能性就越小。

这些惩罚在token 选择过程的早期应用,在应用其他采样策略之前调整原始概率。可以把它们看作是鼓励模特探索新词汇的温和推动。
控制生成长度
就像一个好故事需要适当的节奏和长度一样,我们也需要控制 LLMs 生成的文本长度。这对于实际应用来说是至关重要的,无论我们是生成一条短文还是一篇完整的博客文章。
可以通过几种方式控制生成长度:
token限制:设置最小和最大token数量- 停止序列:定义特定模式来指示生成如何结束
- 序列结束检测:让模型自然地结束其生成
例如,如果我们想生成一个段落,我们可以设置最多 100 个 token,并使用"\n\n"作为停止序列。这确保了我们的输出保持重点和适当的大小。
保证更好的相干性
到目前为止,我们讨论的策略每次只决定一个 token,而波束搜索(Beam Search)则采用更全面的方法:它不是在每一步都只做一个选择,而是同时探索多种可能的路径------就像棋手提前思考几步棋一样。

工作步骤:
- 在每一步中,维持多个候选序列(通常是 5 5 5 - 10 10 10 个);
- 对于每个候选序列,计算下一个
token的概率; - 只保留最有希望的序列和下一个
token的组合; - 继续这个过程,直到达到所需的长度或达到停止条件;
- 选择总概率最高的序列。
度量和优化
性能指标
当使用LLMs时,四个关键指标将影响您的实施决策:
- 第一个
token的时间(TTFT):你能多快得到第一个响应?这对用户体验至关重要,主要受预填充阶段的影响。 - 每个输出
token的时间(TPOT):生成后续token的速度有多快?这决定了总体的生成速度。 - 吞吐量:您可以同时处理多少个请求?这会影响规模和成本效率。
- 虚拟内存使用情况:你需要多少GPU内存?这通常成为实际应用程序中的主要约束。
上下文长度
LLMs 推理中最重要的挑战之一是有效地管理上下文长度。较长的上下文提供了更多的信息,但成本很高:
- 内存使用:随上下文长度呈二次增长
- 处理速度:随上下文变长而线性下降
- 资源分配:需要仔细平衡虚拟内存的使用
最近的模型如 Qwen2.5-1M 提供了令人印象深刻的 1M token上下文窗口,但这是以显著降低推理时间为代价的。关键是为您的特定用例找到适当的平衡。
KV 缓存优化
为了应对这些挑战,最强大的优化之一是键值(KV)缓存。该技术通过存储和重用中间计算,显著提高了推理速度。这种优化:
- 减少重复计算
- 提高生成速度
- 使长上下文生成变得实用
这样做的代价是额外的内存使用,但性能方面的好处通常远远超过这种成本。
偏好与限制
如果您打算在生产中使用预训练模型或微调版本,请注意,虽然这些模型是强大的工具,但它们也有局限性。其中最大的问题是,为了能够对大量数据进行预训练,研究人员经常过滤他们能找到的所有内容,将互联网上可用的内容中最好的和最差的都过滤掉。
为了给出一个快速的说明,让我们回到一个带有 BERT 模型的填充蒙版管道的例子:
from transformers import pipeline
unmasker = pipeline("fill-mask", model="bert-base-uncased")
result = unmasker("This man works as a [MASK].")
print([r["token_str"] for r in result])
result = unmasker("This woman works as a [MASK].")
print([r["token_str"] for r in result])
结果:
['lawyer', 'carpenter', 'doctor', 'waiter', 'mechanic']
['nurse', 'waitress', 'teacher', 'maid', 'prostitute']
当被要求填写这两个句子中缺少的单词时,模型只给出了一个不分性别的答案(waiter / waitress)。尽管 BERT 是为数不多的 Transformer 模型之一,它不是通过从互联网上收集数据而建立的,而是使用明显中立的数据。
因此,当您使用这些工具时,您需要记住,您使用的原始模型很容易产生可能的歧义内容。根据数据对模型进行微调不会使这种内在偏差消失。