【LLM1】大型语言模型的基本生成机制
【LLM1】大型语言模型的基本生成机制
❝你好呀!我是 是Yu欸 👋 🚀 在感兴趣的领域扩展知识 🌈 感谢你的陪伴与支持(*^▽^*)
写在最前面
换方向啦,后面的论文想尝试大语言模型。现在从零开始,做下学习笔记。
详细地回顾一下大型语言模型(LLM)的基本生成机制。
你可以把它想象成一个分步的旅程:从理解你的问题,到在大脑(模型架构)中思考,再到一字一句地组织语言并最终输出。
LLM 的生成机制可以概括为以下流程:
输入 (Prompt) → Tokenization (词元化) → Embeddings (向量化) → [循环处理块:Self-Attention (上下文理解) + Feed-Forward Network (信息处理)] → 输出一个概率分布 → Decoding/Sampling (选择一个词) → 将新词加入输入序列 → 重复循环
核心思想:一个极其强大的“文字接龙”大师
从根本上说,所有大型语言模型的生成机制都基于一个核心任务:预测下一个最合理的“词元”(Token)。
一个“词元”可以是一个单词(如 "apple")、一个词根(如 "run" 在 "running" 中)或甚至是一个标点符号。模型通过分析已有的文本序列,计算出词汇表中成千上万个候选词元中,哪一个出现在下一个位置的概率最高。
这个过程是自回归(Autoregressive) 的,就像多米诺骨牌一样:
你给出一个提示(Prompt),比如 "今天天气真不错,适合去..."。 模型分析这句话,预测下一个最可能的词元是 "公园"。 然后,模型将 "公园" 添加到输入序列中,新的序列变成 "今天天气真不错,适合去公园..."。 它再次分析这个新序列,预测下一个词元,可能是 "散步"。 如此循环往复,一词一词地生成,直到满足停止条件(例如生成了结束符、达到最大长度或内容完整)。
所以,整个看似复杂的对话、写作、编程过程,都被拆解成了无数次“下一个词元是什么?”的概率问题。
第一步:理解输入 - 词元化与嵌入(Tokenization & Embeddings)
计算机不理解文字,只理解数字。当模型接收到你的提示(Prompt),比如 "今天天气真不错,适合去...",它不能直接理解这些文字。它需要将这些文字转换成自己能处理的数字格式。这个过程包含三步:
分词 (Tokenization)
是什么:把一句话切分成一个个更小的单元,这些单元被称为“词元”(Token)。Token 可以是一个完整的单词("today"),一个词根("runn"ing),甚至一个标点符号(",")。 为什么这么做:人类的词汇量是海量的,如果把每个单词都当作一个独立单元,那模型的词汇表会大到无法管理。通过分词,可以用有限的、几万个常用 Token 来组合表示出几乎所有的词语,大大提高了效率。例如,“unbelievable” 可能会被分成 “un”、“believe”、“able” 三个 Token。使用子词(sub-word)作为词元的好处是,模型既能处理常见词,也能通过组合子词来理解和生成它从未见过的罕见词或新词。 例子: "今天天气真不错" -> ["今天", "天气", "真", "不错"]
词嵌入 (Token Embedding)
是什么:将每个离散的 Token 转换成一个包含丰富语义信息的数学向量(一长串数字)。这个向量被称为“嵌入向量”(Embedding Vector)。这个向量可以被认为是该词元在“语义空间”中的坐标。 为什么这么做:纯粹的数字 ID(比如 "今天"=1, "天气"=2)无法表达词与词之间的关系。而嵌入向量是在一个高维空间中表示 Token 的位置。在这个空间里,意思相近的词,它们的向量也更接近。比如,“国王”的向量减去“男人”的向量,会约等于“女王”的向量减去“女人”的向量。这是模型理解语义的关键。 例子: ["今天"]
->[0.12, -0.45, 0.88, ..., -0.02]
(一个几百甚至几千维的向量)
位置编码 (Positional Encoding)
是什么:在词嵌入向量的基础上,再额外添加一个包含位置信息的向量。 为什么这么做:我们接下来要讲的核心机制——自注意力(Self-Attention)——本身是无法感知单词顺序的。在它看来,“你爱我”和“我爱你”的词汇完全一样。为了让模型理解语序,我们需要明确地告诉它每个 Token 在句子中的位置。位置编码就是给每个位置(第1个、第2个、第3个...)生成一个独特的数学签名,并将其融入到词嵌入中。
经过这三步,你的输入 "今天天气真不错" 就变成了一系列包含了语义信息和位置信息的向量,准备好进入模型的核心进行处理。
第二步:核心处理 - Transformer 架构与自注意力机制
这是 LLM 的“大脑”,现代 LLM 几乎都基于 Transformer 架构。这个架构由许多个被称为“Transformer Block”的模块堆叠而成。每个 Block 都在做同一件事:不断提炼和丰富每个 Token 向量的上下文信息。
其中最关键的机制是 **自注意力机制 (Self-Attention Mechanism)**。
1. 位置编码 (Positional Encoding)
原始的 Transformer 架构本身无法感知词元的顺序。为了解决这个问题,模型会在词嵌入向量中加入一个“位置编码”向量。这个额外的信息告诉模型每个词元在序列中的绝对或相对位置,使得模型能够理解 "A B" 和 "B A" 是不同的。
2. 自注意力机制 (Self-Attention Mechanism)
这是 LLM 的核心所在。自注意力机制允许模型在处理一个词元时,能够“关注”到输入序列中所有其他词元,并根据相关性赋予它们不同的“注意力权重”。
举例说明: 在句子
“机器人举起了红色的球,因为它很重”
中,当模型处理到 "它" 这个词时:自注意力机制会计算 "它" 和句子中其他所有词(机器人、球、红色、重...)的关联性。 它会发现 "它" 的 Query 向量和 "球" 的 Key 向量高度相关,而和 "机器人" 的相关性较低。 因此,"球" 会获得一个很高的注意力权重,而其他词的权重较低。 最终,"它" 的新向量表示会大量融入 "球" 的信息,模型从而理解了 "它" 指代的是 "球"。
**工作原理 (Query, Key, Value)**:这个过程是通过一种叫做 "Query-Key-Value" (QKV) 的模型来实现的。
生成三个向量:对于输入的每一个 Token 向量,模型都会通过不同的权重矩阵,生成三个新的向量: Query (Q) 向量:代表当前 Token 去“查询”其他 Token 的“提问”。可以理解为:“我是谁?我需要和谁建立联系?” Key (K) 向量:代表当前 Token 用来被其他 Token“检索”的“标签”。可以理解为:“我有什么特征?可以被如何描述?” Value (V) 向量:代表当前 Token 实际包含的“内容”。可以理解为:“我实际的意义是什么?”
计算注意力分数:要计算A对B的注意力,就是用 A 的 Query 向量和 B 的 Key 向量进行点积运算。这个分数代表了 B 对于理解 A 的重要程度。 **归一化 (Softmax)**:将计算出的所有分数进行一次 Softmax 运算,使其总和为1。这样,分数就变成了权重,表示在当前这个词的上下文中,应该给其他每个词分配多少“注意力”。 加权求和:将每个词的 Value 向量乘以它对应的权重,然后把所有结果加起来。这样就得到了一个全新的向量,它不仅包含了当前词自己的信息,还融合了整个句子中所有其他词的上下文信息,并且是根据重要性加权的。
通过这个机制,模型中的每个词都“看”过了句子中的所有其他词,并更新了自己对上下文的理解。一个 Transformer Block 还包含其他部分,比如前馈网络(Feed-Forward Network)来进一步处理信息,但自注意力是其精髓。
通过多层堆叠这样的注意力机制(Multi-head Attention),模型可以从不同角度捕捉复杂的语法和语义关系。
第三步:生成输出 - 解码与采样策略
当输入向量流经所有 Transformer Block 后,模型已经对输入有了非常深刻的理解。最后,它需要做出预测,也就是生成下一个 Token。
最终向量转换 (Linear Layer)
模型将最后一个 Transformer Block 输出的、代表“下一个待预测词”的向量,通过一个线性层进行转换。 这个线性层的输出维度等于模型词汇表的大小(比如 50,000)。输出的这个超长向量我们称之为 Logits。Logits 向量中的每一个值,都对应着词汇表中一个 Token 的“得分”,分数越高,代表模型认为这个 Token 是下一个词的可能性越大。
概率化 (Softmax Function)
Logits 只是原始得分,还不够直观。模型会再次使用 Softmax 函数,将这些得分转换成一个概率分布。 经过 Softmax 后,所有 Token 的得分总和为1,每个值都在0到1之间,可以直接看作是该 Token 成为下一个词的概率。 例子: 对于 "今天天气真不错,适合去...",模型可能会输出: "公园": 35% "爬山": 20% "吃饭": 15% "睡觉": 5% ... (其他所有词的概率)
选择下一个词 (Decoding Strategy)
现在,模型需要从这个概率列表中选择一个词元作为最终输出。这里有多种策略,它们直接影响了生成文本的质量、创造性和确定性。
1. 贪心搜索 (Greedy Search)
策略: 最简单直接的方法,总是选择当前概率最高的词元。 优点: 快速、计算成本低。 缺点: 非常容易产生重复、无聊、缺乏创造性的文本。因为它只看眼前最优,可能会错过全局更优的句子组合。
2. 束搜索 (Beam Search)
策略: 在每一步,不仅仅保留概率最高的一个选项,而是保留 k
个(k
被称为束宽,Beam Width)最可能的序列。在下一步,从这k
个序列出发,继续生成,并再次选出总概率最高的k
个新序列。优点: 生成的文本比贪心搜索更连贯、质量更高。 缺点: 计算成本更高,仍然倾向于生成比较“安全”和保守的文本。
3. 采样策略(引入随机性)
为了让生成内容更有创造性和多样性,我们可以在概率分布中引入随机性。
温度 (Temperature) 采样:
这是一个调节参数。高温(>1) 会让原始概率分布变得更平缓,使得低概率词元更容易被选中,结果更具创造性、随机性,但也可能出现更多错误和胡言乱语。低温(<1) 则让概率分布更尖锐,高概率词元更容易被选中,结果更接近贪心搜索,更保守、确定。 Temperature=0
就等同于贪心搜索。
Top-K 采样:
策略: 在所有词元中,只考虑概率最高的 K
个,然后在这K
个词元中按照它们的相对概率进行随机采样。优点: 限制了采样范围,避免了选中那些非常不靠谱的低概率词元。
Top-P (Nucleus) 采样:
策略: 一种更动态的策略。从概率最高的词元开始,不断累加它们的概率,直到总和超过一个预设的阈值 P
(例如 0.95)。然后,模型只从这个概率总和超过P
的核心词元集合(Nucleus)中进行采样。优点: 采样集合的大小是动态的。当模型非常确定下一个词时(例如 "I love" 之后很可能是 "you"),这个集合会很小;当模型不确定时(在一个开放式问题的开头),集合会很大,允许更多探索。这通常被认为是效果最好的采样策略之一。
总结
LLM 的生成机制可以概括为以下流程:
输入 (Prompt) → Tokenization (词元化) → Embeddings (向量化) → [循环处理块:Self-Attention (上下文理解) + Feed-Forward Network (信息处理)] → 输出一个概率分布 → Decoding/Sampling (选择一个词) → 将新词加入输入序列 → 重复循环
让我们把整个流程串起来,看模型是如何生成一个完整句子的:
输入: 你给出 "The cat sat on the" 处理: 模型经过分词 -> 嵌入 -> 位置编码,将输入转为向量。 思考: 向量流经多层 Transformer Blocks,通过自注意力机制,模型深刻理解了“猫坐在...”这个场景。 预测: 模型在最后输出一个概率分布,发现 "mat" (垫子) 的概率最高。 选择: 通过某种解码策略(比如 Top-K 采样),模型选择了 "mat" 作为输出。 循环: 模型将新生成的 "mat" 追加到输入序列的末尾,形成新的输入 "The cat sat on the mat"。 重复: 模型将这个新序列作为下一次预测的输入,重复上述 2-6 步,继续预测下一个词(可能是句号 "."),直到生成结束符( [EOS]
)或者达到预设的最大长度。
这个过程虽然在底层是纯粹的数学计算,但通过在海量数据上学习数十亿甚至上万亿的参数,使得模型能够捕捉到语言的复杂规律、事实知识乃至一定的推理能力,最终生成流畅、连贯且有逻辑的文本。
❝hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。 原文链接 👉 ,⚡️更新更及时。 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。
欢迎大家点开下面名片,添加好友交流。
本文由 mdnice 多平台发布