理解这个叫做“世界”的操作系统
灵光一现 → 精巧实现 → 无人知晓 → 自己遗忘,几乎是每个认真思考的工程师都会经历的隐性知识流失
用 PyTorch 从头实现语言模型
《Speech and Language Processing》(2025版草稿)中文版
理解这个叫做“世界”的操作系统
灵光一现 → 精巧实现 → 无人知晓 → 自己遗忘,几乎是每个认真思考的工程师都会经历的隐性知识流失
用 PyTorch 从头实现语言模型
《Speech and Language Processing》(2025版草稿)中文版
早在大语言模型出现之前,伦理与安全问题就一直是人工智能体设计中的核心考量。 玛丽·雪莱(Mary Shelley,见下图)在其小说《弗兰肯斯坦》中,正是围绕“在未考虑伦理与人文关切的情况下创造人工智能体”这一问题展开叙事的。 大语言模型(LLMs)可能以多种方式带来安全隐患。 例如,LLM 容易生成虚假内容,这一问题被称为“幻觉”(hallucination)。 语言模型的训练目标是生成可预测且连贯的文本,但截至目前我们所介绍的训练算法,并没有任何机制确保生成内容的真实性或正确性。 这对任何依赖事实准确性的应用场景都会造成严重问题! 与此相关的一个表现是,语言模型可能会建议危险行为,例如直接鼓励用户从事危险或非法活动,如自残或伤害他人。 当用户在涉及安全的关键场景中(如寻求医疗建议、处于紧急状况,或表达自残意图时)向语言模型求助,错误的建议可能带来危险,甚至危及生命。 需要指出的是,这类问题并非大语言模型所独有。例如,Bickmore 等人(2018)曾让参与者向三个 LLM 时代之前的商用对话系统(Siri、Alexa、Google Assistant)提出医疗问题,并根据系统回复决定采取何种行动;结果发现,许多被建议的行动一旦付诸实施,将可能导致伤害甚至死亡。 我们将在第 11 章再次讨论幻觉与事实性问题,届时会介绍诸如 “检索增强生成”(retrieval-augmented generation)等缓解方法;此外,在第 9 章中,我们也将探讨通过安全微调(safety tuning)和对齐(alignment)来提升模型安全性。 除了提供错误信息,系统还可能通过言语攻击用户,或造成表征性伤害(representational harms)(Blodgett 等,2020)。 例如生成带有侮辱性或有害的刻板印象(Cheng 等,2023),以及贬低特定群体的负面态度(Brown 等,2020;Sheng 等,2019)。 无论是言语辱骂还是刻板印象,都可能对用户造成心理伤害。 Gehman 等人(2020)的研究表明,即使输入完全无害的提示,大语言模型仍可能输出仇恨言论并对用户进行言语攻击。 Liu 等人(2020)测试了系统对两组模拟用户输入的响应,这两组输入内容完全相同,仅在提及的性别或种族上有所差异。 他们发现,仅仅将句子中的 “he” 改为 “she”,就可能导致系统回复更具冒犯性和更负面的情绪倾向。 Hofmann 等人(2024)进一步发现,大语言模型甚至会仅仅因为用户使用了特定方言(如非裔美国人英语)而对其产生歧视。 同样,这些问题在大语言模型出现前就已存在。 例如,微软于 2016 年推出的聊天机器人 Tay,上线仅 16 小时就被迫下线,因为它开始发布包含种族侮辱、阴谋论和人身攻击的内容。 Tay 的这些偏见和不当行为源于其训练数据,其中包括一些用户故意诱导它重复此类语言(Neff 和 Nagy,2016)。 另一个重要的伦理与安全问题是隐私(privacy)。 从计算机诞生之初,隐私就一直是人们关注的焦点。早在 1966 年,魏岑鲍姆(Weizenbaum)设计聊天机器人 ELIZA 作为计算心理治疗实验时,就已触及这一问题。 当时,人们很快对 ELIZA 产生了强烈的情感依赖,并与其进行极为私密的对话——甚至有人在输入信息时要求 Weizenbaum 离开房间。 而当 Weizenbaum 提出可能要保存这些对话记录时,用户立即指出这会侵犯他们的隐私。 如今,用户同样很可能向大语言模型透露非常私人的信息。 事实上,当前 LLM 最常见的用途之一就是提供个人建议与情感支持(Zao-Sanders, 2025)。 而且,系统表现得越像人类,用户就越倾向于披露敏感信息,同时却越不会担忧这种披露可能带来的危害(Ischen 等,2019)。 我们在前文(7.5.2 节)已提到,预训练数据本身往往包含电话号码、地址等私人信息。 这带来了严重风险:大语言模型可能会泄露(leak)其训练数据中的信息。 也就是说,攻击者有可能从语言模型中提取出训练数据中的具体内容,例如某人的姓名、电话号码和住址(Henderson 等,2017;Carlini 等,2021)。 如果模型是在极其敏感的私有数据集(如电子健康记录)上训练的,这一问题将更加严峻。 ...
我们可以从多个维度评估语言模型,例如预测未见过文本准确性(accuracy),或在问答、翻译等具体任务上的表现,或其他因素如推理速度、能耗、公平性等。 我们将在接下来的三节中逐一探讨这些评估维度。 7.6.1 困惑度(Perplexity) 正如我们在第 3 章首次提到的,评估语言模型的一种方法是衡量其预测未见文本的能力。 一个更好的语言模型能更准确地预测后续词元,因此当测试集中出现某个词时,它会赋予该词更高的概率(即“更不惊讶”)。 若要判断两个语言模型中哪一个对某段文本建模得更好,只需比较它们对该文本分配的概率高低;实践中,由于我们通常在对数空间处理概率,因此更常见的是比较对数似然(log likelihood)的大小。 我们一直在讨论逐词预测,即根据前面的上下文计算下一个词元 $w_i$ 的条件概率:$P(w_i \mid w_{< i})$。 但正如第 3 章所述,利用链式法则(chain rule),我们可以将单个词元的预测概率扩展为整段文本的概率: $$ \begin{align*} P(w_{1:n}) &= P(w_1)P(w_2|w_1)P(w_3|w_{1:2}) \cdots P(w_n|w_{1:n−1}) \\ &= \prod_{i=1}^n P(w_i|w_{< i}) \tag{7.8} \end{align*} $$因此,一段文本的概率可以通过将其每个词元的条件概率相乘得到。 该文本的(对数)似然值是一个有用的指标,可用于比较两个语言模型在该文本上的优劣: $$ \log \text{likelihood}(w_{1:n}) = \log \prod_{i=1}^n P(w_i|w_{< i}) \tag{7.9} $$然而,我们通常使用困惑度(perplexity)而非对数似然来评估语言模型。 原因在于:一段测试集(或任意序列)的概率与其包含的词元数量密切相关。 事实上,文本越长,其整体概率就越小——从链式法则可以看出,随着相乘的项数增加,而每一项概率都小于 1,最终乘积会越来越小。 因此,我们需要一个按词元归一化、与长度无关的指标,以便公平比较不同长度的文本。 概率的函数困惑度正是这样一种长度归一化的评估指标。 回顾第 45 页的内容,模型 $\theta$ 在未见测试集上的困惑度,定义为该模型赋予测试集概率的倒数,并按测试集的词元总数进行归一化。 对于包含 $n$ 个词元的测试集 $w_{1:n}$,其困惑度为: $$ \begin{align*} \text{Perplexity}_{\theta}(w_{1:n}) &= P_{\theta}(w_{1:n})^{-\frac{1}{n}} \\ &= \sqrt[n]{\frac{1}{P_{\theta}(w_{1:n})}} \tag{7.10} \end{align*} $$为了直观理解困惑度如何由语言模型对每个新词的预测概率计算得出,我们可以将链式法则代入上式: ...
我们如何训练一个语言模型?使用什么算法?在什么数据上进行训练? 大语言模型的训练通常分为三个阶段,如图 7.12 所示: 图 7.12 大语言模型训练的三个阶段:预训练(pretraining)、指令微调(instruction tuning)和偏好对齐(preference alignment)。 预训练(pretraining): 在第一阶段,模型在海量文本语料库上进行训练,目标是逐步预测下一个词。 训练采用交叉熵损失(有时称为语言建模损失),并通过反向传播将该损失信号贯穿整个网络。 训练数据通常来源于对互联网文本的大规模清洗与处理。 经过此阶段,模型具备了强大的词预测能力,并能生成连贯的文本。 指令微调(instruction tuning),也称为监督微调(supervised finetuning, SFT): 在第二阶段,模型继续使用交叉熵损失进行训练,但目标变为遵循人类指令——例如回答问题、生成摘要、编写代码、翻译句子等。 为此,模型在一个专门构建的数据集上训练,该数据集包含大量“指令-正确响应”对。 对齐(alignment),也称为偏好对齐(preference alignment): 在最后阶段,模型被进一步优化,以使其输出更有帮助且危害更小。 此时,模型接收的是偏好数据(preference data):每条数据包含一个上下文以及两个可能的后续生成结果,由人工(或其他方式)标注为“可接受”(accepted)或“应拒绝”(rejected)。 模型随后通过强化学习(reinforcement learning)或其他基于奖励的算法进行训练,目标是更倾向于生成被接受的续写,而非被拒绝的续写。 接下来我们将介绍预训练阶段,而指令微调与偏好对齐将在第 9 章详细讨论。 7.5.1 预训练的自监督训练算法 大语言模型预训练的核心思想,与我们在第 5 章学习词向量(如 word2vec)时所介绍的自训练(self-training)或自监督学习(self-supervision)是一致的。 在语言建模的自监督训练中,我们以一段文本语料作为训练材料,在每个时间步 $t$ 要求模型预测下一个词。 起初,模型在这个任务上表现很差,但由于我们始终知道正确答案(即语料中真实的下一个词!),随着时间推移,模型会越来越擅长预测正确的后续词元。 我们称这类模型为“自监督”的,是因为无需为数据额外添加人工标注的标签——词语本身的自然顺序就提供了监督信号! 我们只需训练模型,使其在预测训练序列中下一个真实词时的误差最小化。 在实践中,训练语言模型意味着调整其底层架构的参数。 我们将在下一章介绍的 Transformer 模型包含多个权重矩阵,分别用于前馈网络和注意力机制。 和所有神经网络一样,这些参数通过误差反向传播(backpropagation)配合梯度下降进行优化。 因此,我们只需要一个可最小化的损失函数,并将其误差信号反向传递回整个网络。 语言建模所使用的损失函数,正是我们在第 4 章和第 6 章已经见过两次的交叉熵损失(cross-entropy loss)。 回顾一下,交叉熵损失衡量的是模型预测的概率分布与真实分布之间的差异。 这里的分布是针对整个词元词汇表 $V$ 的,因此损失函数形式为: $$ L_{CE} = -\sum_{w \in V} \mathbf{y}_t[w] \log \hat{\mathbf{y}}_t[w] \tag{7.5} $$在语言建模中,真实分布 $y_t$ 来源于我们知道的下一个词。 它被表示为一个one-hot 向量:在词汇表中,真实的下一个词对应的位置为 1,其余位置均为 0。 因此,语言建模的交叉熵损失实际上只取决于模型赋予正确下一个词的概率(公式 7.5 中其他项因乘以 0 而消失)。 ...
语言模型在每一步应该生成哪个词元? 生成结果取决于每个词元的概率,所以我们先回顾一下这个概率分布的来源。 语言模型的内部网络(无论是 Transformer,还是 LSTM、状态空间模型等替代架构)会为词汇表中的每个词元生成一个称为logit 的得分(实数值)。 这个得分向量 $\mathbf{u}$ 随后通过 softmax 函数归一化,形成一个合法的概率分布——正如我们在第 4 章逻辑回归中所见。 所以,如果我们有一个形状为 $[1 \times |V|]$ 的 logit 向量 $\mathbf{u}$,其中每个元素对应一个可能的下一个词元的得分,那么将其通过 softmax 函数即可得到一个同样形状为 $[1 \times |V|]$ 的概率向量 $\mathbf{y}$,该向量为词汇表中每个词元分配一个概率,如下公式所示: $$ \mathbf{y} = \text{softmax}(\mathbf{u}) \tag{7.1} $$图 7.7 展示了一个教学示例:为了便于说明,这里仅使用一个包含 4 个单词的简化词汇表来计算 softmax。 图 7.7 将 logit 向量 $\mathbf{u}$ 通过 softmax 转换为概率向量 $\mathbf{y}$。 现在,有了这个词元上的概率分布,我们需要从中选择一个词元进行生成。 这种根据模型给出的概率选择要生成的词元的过程,通常称为解码(decoding)。 如前所述,以从左到右的方式(对于阿拉伯语等从右向左书写的语言则是从右到左)进行解码,并在每一步基于之前已选词元不断选择下一个词元,这种生成方式被称为自回归生成(autoregressive generation)。1 7.4.1 贪心解码(Greedy decoding) 生成词元最简单的方法是:在每一步始终选择当前上下文中概率最高的词元,这种方法称为贪心解码(greedy decoding)。 贪心算法(greedy algorithm)是指在每一步都做出局部最优的选择,而不考虑该选择从全局来看是否最终最优。 因此,在贪心解码中,我们在每个生成时间步将 logits 转换为词元上的概率分布,然后选择概率最高的那个词元作为输出 $\hat{w}_t$(即取 argmax): $$ \hat{w}_t = \mathrm{argmax}_{w \in V} \, P(w \mid \mathbf{w}_{< t}) \tag{7.2} $$图 7.8 显示,在我们的示例中,模型选择生成词元 all。 ...
这种基于上下文的生成思路本身已经非常强大,而当语言模型经过专门训练以回答问题和遵循指令后,其能力会进一步提升。 这种额外的训练称为指令微调(instruction-tuning)。 在指令微调中,我们从一个已通过词预测任务预训练好的基础语言模型出发,继续在一组特殊数据集上进行训练。该数据集由指令及其对应的正确构成。 数据集包含大量样本,如问题与答案、命令与执行结果,以及其他对话交互的示例。 我们将在第9章详细讨论指令微调的具体方法。 经过指令微调的语言模型非常擅长遵循指令、回答问题以及进行对话,因此可以被有效提示(prompted)。 所谓提示(prompt),是指用户向语言模型输入的一段文本,用以引导模型完成某项有用的任务。 在提示过程中,用户的提示文本被传入语言模型,模型则以此为条件,逐个生成后续词元。 为特定任务设计高效提示的过程,被称为提示工程(prompt engineering)。 正如我们在介绍条件生成时所提到的,提示可以是一个问题(例如 What is a transformer network?),也可以采用结构化格式(例如 Q: What is a transformer network? A: )。 提示也可以是一条明确的指令(例如 Translate the following sentence into Hindi: ‘Chop the garlic finely’)。 更明确地限定可能答案范围的提示,通常能带来更好的性能。 例如,以下是一个用于情感分析的提示模板,它预先规定了可能的答案选项: A prompt consisting of a review plus an incomplete statement Human: Do you think that “input” has negative or positive sentiment? Choices: (P) Positive. (N) Negative. Assistant: I believe the best answer is: ( ...
语言模型背后的一个基本原理是,几乎所有我们想用语言完成的任务,都可以建模为文本的条件生成(conditional generation)。 (这里特指解码器语言模型,即本章和下一章讨论的对象。) 所谓条件生成,是指在给定一段输入文本的条件下生成新文本。 具体来说,我们向大语言模型(LLM)提供一段输入文本,称为提示(prompt),然后让 LLM 以该提示及其后续已生成的词元为条件,逐个生成新的词元。 生成过程首先计算在已有上下文 $w_{...
我们在上文描述的那种从左到右(或称自回归)的语言模型架构,也就是本章将要定义的架构,实际上只是三种常见语言模型架构之一。 这三种架构分别是:编码器(encoder)、解码器(decoder)和编码器-解码器(encoder-decoder)。 图 7.3 示意了这三种架构。 图 7.3 语言模型的三种架构:解码器、编码器和编码器-解码器。 箭头表示三种架构中的信息流向。 解码器:输入词元,输出词元。 编码器:输入词元,输出每个词元的向量表示(编码)。 编码器-解码器:输入词元,输出一串词元。 解码器(decoder)就是我们上面介绍的架构。 它接收一串词元作为输入,并逐个迭代地生成输出词元。 GPT、Claude、Llama 和 Mistral 等大语言模型均采用解码器架构。 解码器的信息流是从左到右的,即模型仅根据前面的词来预测下一个词。 解码器属于生成式模型,给定输入词元,它们能生成全新的输出词元。 本章剩余部分及第8章将重点讨论解码器。 编码器(encoder)接收一个词元序列作为输入,并为每个词元输出一个向量表示(即编码)。 编码器通常是掩码语言模型(masked language model),其训练方式是遮盖某个词,然后利用该词左右两侧的上下文来预测它。 BERT、RoBERTa 以及 BERT 系列的其他模型都属于编码器模型。 编码器不是生成式模型,不用于生成文本。 它们通常被用作分类器的基础,例如输入一段文本,输出一个标签(如情感倾向、主题类别等)。 这种用途通过微调(finetuning)实现(在有监督的数据上训练)。 我们将在第10章介绍编码器模型。 编码器-解码器(encoder-decoder)接收一个词元序列作为输入,并输出另一串词元。 它与纯解码器模型的关键区别在于:输入词元与输出词元之间的对应关系更松散,且常用于在不同类型词元之间进行映射。 也就是说,在编码器-解码器中,输出词元可能来自完全不同的词表,长度也可能远长于或短于输入。 例如,机器翻译就使用编码器-解码器架构:输入词元是一种语言,输出词元是另一种语言,且长度通常不同。 语音识别也采用这种架构:输入是代表语音的词元,输出是代表文本的词元。 我们将在第12章介绍用于机器翻译的编码器-解码器架构,在第15章介绍其在语音识别中的应用。 这三种架构可以用多种神经网络实现。 目前最广泛使用的网络类型是Transformer,我们将在第8章介绍。 在 Transformer 中,每个输入词元都会经过一列 Transformer 层的处理,每一层由若干不同类型的子网络组成。 第13章将介绍一种较早但仍具影响力的架构——LSTM(一种循环神经网络)。 此外,还有许多更新的架构,例如状态空间模型(state space models)。 本书大部分内容将聚焦于 Transformer,但就本章而言,我们将保持架构中立:把实现解码器功能的网络视为一个黑箱。 该黑箱的输入是一串词元,输出是一个可从中采样的词元概率分布。 我们将以与具体网络无关的方式,描述学习与解码的机制。 第 7 章 大语言模型 目录 7.2 文本的条件生成:基本原理
“在任意时刻,我们究竟知道多少?我相信,远比我们意识到自己知道的要多得多。” ——阿加莎·克里斯蒂,《移动的手指》 幻想文学中充满了被赋予说话能力的无生命物体。 从奥维德笔下皮格马利翁的雕像,到玛丽·雪莱创作的弗兰肯斯坦故事,人类不断重述着这样一类故事:创造出某物,然后与它交谈。 传说米开朗基罗完成《摩西》雕像后,觉得它栩栩如生,竟轻拍它的膝盖,命令它开口说话。 这或许并不奇怪。语言是人类智慧与意识的标志。对话是最基本的语言场景。这是我们儿时最先学会的语言形式,也是我们日常持续使用的语言方式——无论是在教学或学习、点午餐,还是与家人朋友交谈。 本章介绍大语言模型(Large Language Model,简称 LLM)——一种能与人类进行对话交互的计算智能体。 LLM 专为与人交互而设计,这一事实对其架构和应用具有深远影响。 早在60年前,一个名为 ELIZA 的计算系统(Weizenbaum, 1966)就已揭示了这些影响。 ELIZA 被设计成模拟罗杰斯学派的心理治疗师。它凸显了聊天机器人面临的若干关键问题。 例如,用户会深深投入情感,进行极为私密的对话,甚至有人要求 Weizenbaum 在他们打字时离开房间。 这种情感投入与隐私问题提醒我们:必须审慎部署语言模型,并认真考虑其对交互者的影响。 本章首先介绍 LLM 的计算原理;下一章将讨论其在 Transformer 架构中的具体实现。 使 LLM 成为可能的核心新思想是预训练(pretraining)。因此,我们先从“从文本中学习”这一基本思路入手,这也是 LLM 训练的基本方式。 流畅使用语言的人,在理解和产出过程中会调动海量知识。 这些知识表现为多种形式,其中最显而易见的便是词汇,即我们对词语及其意义与用法所构建的丰富表征。 正因如此,词汇成为一个有效视角,来探索人类与机器如何从文本中获取知识。 对成年人词汇量的估计,在不同语言内部及跨语言之间差异巨大。 例如,据估计,讲美国英语的年轻人,词汇量介于3万到10万之间,差异取决于所采用的资源,以及对“掌握一个词”的定义不同。 由此可简单推知:儿童必须每天学习约7到10个新词,日复一日,才能在20岁时达到观测到的词汇水平。 事实上,从小学高年级到高中阶段的实证研究也证实了这一增长速率。 儿童是如何实现如此高速的词汇增长的? 研究表明,大部分词汇知识是在阅读过程中附带习得的。 阅读是一种丰富的语境处理过程。我们并非孤立地逐个学习单词。 事实上,在某些学习阶段,词汇增长的速度甚至超过了新词出现的频率! 这表明,每次阅读一个词时,我们也在强化对与之相关其他词的理解。 这些事实与第5章提出的分布假设(distributional hypothesis)一致。该假设认为,意义的某些方面仅凭我们一生所接触的文本即可习得,其依据是词语与其共现词之间的复杂关联(以及这些共现词自身的共现关系)。 分布假设指出:我们能从文本中获取大量知识,且这些知识可在初次习得很久之后仍被有效调用。 当然,结合现实世界的交互或其他模态信息,可以构建更强大的模型。但即便仅使用文本,效果也已非常显著。 现代自然语言处理革命之所以成为可能,正是因为大语言模型能够通过在(非常)大规模文本语料中反复根据上下文预测下一个词,从而习得关于语言、语境乃至世界的全部知识。 在本章及下一章中,我们将形式化这一思想,并称之为预训练——即通过在海量文本中迭代预测词元(token),来学习语言与世界知识。经此过程得到的模型,称为大语言模型。 正因预训练所获得的知识,大语言模型在各类自然语言任务上展现出卓越性能。 语言模型能从词语预测中学到什么? 请看下面的例子。 你认为模型在学习预测下划线处应填入哪个词时(正确答案以蓝色标出),可能学到哪些类型的知识? 在继续阅读下一段之前,请先针对每个例子思考一下: With roses, dahlias, and peonies, I was surrounded by ____ flowers (玫瑰、大丽花和牡丹环绕着我,我被____花朵包围了) The room wasn’t just big it was ____ enormous (这个房间不只是大,而是____巨大) ...
前馈神经网络属于监督式机器学习的一种:对于每个输入样本 $\mathbf{x}$,我们已知其对应的真实输出 $\mathbf{y}$。 系统通过公式 6.13 生成的是预测输出 $\hat{\mathbf{y}}$,即模型对真实标签 $\mathbf{y}$ 的估计。 训练的目标,就是为每一层 $i$ 学习到合适的参数 $\mathbf{W}^{[i]}$ 和 $\mathbf{b}^{[i]}$,使得对每个训练样本,模型的预测 $\hat{\mathbf{y}}$ 尽可能接近真实值 $\mathbf{y}$。 总体而言,我们采用第 5 章介绍的逻辑回归训练方法来实现这一目标,因此读者在继续阅读之前应已熟悉该章内容。 我们将探索简单通用网络的算法,而不是专门针对情感或语言建模设计的网络。 首先,我们损失函数(Loss Function)来衡量模型输出与真实标签之间差距,通常采用逻辑回归中使用的交叉熵损失(cross-entropy loss)作为损失函数。 其次,为了找到使损失函数最小化的参数,我们使用第 5 章介绍的梯度下降(gradient descent)算法。 第三,梯度下降要求我们知道损失函数关于所有参数的梯度——即一个包含损失函数对每个参数偏导数的向量。 在逻辑回归中,我们可以直接计算损失函数对某个权重 $w$ 或偏置 $b$ 的导数。 但在神经网络中,模型往往包含数百万个分布在多层中的参数,这就带来了一个难题:当损失是在网络末端计算的,我们如何求出第一层中某个权重对最终损失的偏导数? 换言之,如何将损失“分配”回所有中间层? 解决这一问题的算法就是著名的误差反向传播(error backpropagation),也称为反向自动微分(backward differentiation)。 6.6.1 损失函数 神经网络中使用的交叉熵损失(cross-entropy loss)与我们在逻辑回归中见到的完全相同。 如果神经网络被用作二分类器(即输出层使用 sigmoid 激活函数),其损失函数就与公式 (4.23) 中的逻辑回归损失一致: $$ \begin{align*} L_{\text{CE}}(\hat{y}, y) &= -\log p(y \mid \mathbf{x}) \\ = -\big[ y \log \hat{y} + (1 - y) \log(1 - \hat{y}) \big] \tag{6.25} \end{align*} $$如果网络用于三类或更多类别的分类任务,则损失函数与第 5 章第 80 页介绍的多项逻辑回归(multinomial regression)损失完全相同。为方便起见,我们在此简要回顾其要点。 当类别数超过两类时,我们需要将真实标签 $\mathbf{y}$ 和预测结果 $\hat{\mathbf{y}}$ 都表示为向量。 假设我们执行的是硬分类(hard classification),即每个样本仅属于一个正确类别。 此时,真实标签 $\mathbf{y}$ 是向量,有 $K$ 个元素,每个元度对应一个类别,其中若正确类别为 $c$,则 $\mathbf{y}_c = 1$,其余元素均为 0。 回忆一下,这种仅有一个元素为 1、其余为 0 的向量称为 one-hot 向量(独热向量)。 -分类器输出的预测向量 $\hat{\mathbf{y}}$ 同样包含 $K$ 个元素,每个元素 $\hat{y}_k$ 表示模型估计的条件概率 $p(\mathbf{y}_k = 1 \mid \mathbf{x})$。 ...
虽然人工设计特征是构建分类器的传统方法,但大多数 NLP 中的神经网络应用并不使用人工构造的特征作为输入。 相反,我们利用深度学习从数据中自动学习特征的能力,将词元(token)表示为嵌入向量(embeddings)。 在本节中,我们将使用第 5 章介绍过的静态词嵌入方法(如 word2vec 或 GloVe)来表示每个词元。 所谓静态嵌入(static embedding),是指每个词元都由一个固定的向量表示——该向量在预训练阶段一次性学习完成,之后存入一个大型字典中。 每当需要引用某个词元时,我们只需从该字典中取出其对应的嵌入向量即可。 然而,当我们把神经网络模型应用于语言建模任务(如第 8 章所述)时,情况会更复杂:我们会使用一种更强大的嵌入形式,称为上下文嵌入(contextual embedding)。 上下文嵌入的特点是:同一个词在不同上下文中会有不同的嵌入表示。 此外,网络在执行词语预测任务的过程中,会学习到这些嵌入。 现在,让我们回到前一节的文本分类场景,但改用静态嵌入作为输入特征,而非人工设计的特征。 我们聚焦于推理阶段,此时所有输入词元的嵌入已经预先训练好。 每个嵌入是一个维度为 $d$ 的向量,用于表示一个输入词元。 存储这些嵌入的字典被称为嵌入矩阵(embedding matrix)$\mathbf{E}$。 嵌入矩阵 $\mathbf{E}$ 的每一行对应词汇表 $V$ 中的一个词元,表示为一个 $d$ 维的(行)向量。 词汇表中有 $|V|$ 个词元,每个词元在 $\mathbf{E}$ 中对应一行,因此 $\mathbf{E}$ 的形状为 $[|V| \times d]$。 只要在神经 NLP 系统的输入中使用嵌入,这个嵌入矩阵 $\mathbf{E}$ 就扮演核心角色,包括后续章节将介绍的基于 Transformer 的大语言模型。 给定一个输入词元序列,例如 dessert was great,我们首先将其转换为词汇表中的索引(这些索引是在最初使用 BPE 或 SentencePiece 进行词元化时生成的)。 于是,dessert was great 可能被表示为索引序列 $\mathbf{w} = [3, 9824, 226]$ 接着,通过索引从嵌入矩阵 $\mathbf{E}$ 中选取对应的行(例如第 3 行、第 9824 行、第 226 行),从而得到每个词元的嵌入向量。 ...