【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 多平台发布