当前位置: 首页 > news >正文

【LLM1】大型语言模型的基本生成机制

【LLM1】大型语言模型的基本生成机制

你好呀!我是 是Yu欸 👋
🚀 在感兴趣的领域扩展知识
🌈 感谢你的陪伴与支持(*^▽^*)

写在最前面

换方向啦,后面的论文想尝试大语言模型。现在从零开始,做下学习笔记。

详细地回顾一下大型语言模型(LLM)的基本生成机制

你可以把它想象成一个分步的旅程:从理解你的问题,到在大脑(模型架构)中思考,再到一字一句地组织语言并最终输出。

LLM 的生成机制可以概括为以下流程:

输入 (Prompt) → Tokenization (词元化) → Embeddings (向量化) → [循环处理块:Self-Attention (上下文理解) + Feed-Forward Network (信息处理)] → 输出一个概率分布 → Decoding/Sampling (选择一个词) → 将新词加入输入序列 → 重复循环

核心思想:一个极其强大的“文字接龙”大师

从根本上说,所有大型语言模型的生成机制都基于一个核心任务:预测下一个最合理的“词元”(Token)

一个“词元”可以是一个单词(如 "apple")、一个词根(如 "run" 在 "running" 中)或甚至是一个标点符号。模型通过分析已有的文本序列,计算出词汇表中成千上万个候选词元中,哪一个出现在下一个位置的概率最高。

这个过程是自回归(Autoregressive) 的,就像多米诺骨牌一样:

  1. 你给出一个提示(Prompt),比如 "今天天气真不错,适合去..."。
  2. 模型分析这句话,预测下一个最可能的词元是 "公园"。
  3. 然后,模型将 "公园" 添加到输入序列中,新的序列变成 "今天天气真不错,适合去公园..."。
  4. 它再次分析这个新序列,预测下一个词元,可能是 "散步"。
  5. 如此循环往复,一词一词地生成,直到满足停止条件(例如生成了结束符、达到最大长度或内容完整)。

所以,整个看似复杂的对话、写作、编程过程,都被拆解成了无数次“下一个词元是什么?”的概率问题。


第一步:理解输入 - 词元化与嵌入(Tokenization & Embeddings)

计算机不理解文字,只理解数字。当模型接收到你的提示(Prompt),比如 "今天天气真不错,适合去...",它不能直接理解这些文字。它需要将这些文字转换成自己能处理的数字格式。这个过程包含三步:

  1. 分词 (Tokenization)

    • 是什么:把一句话切分成一个个更小的单元,这些单元被称为“词元”(Token)。Token 可以是一个完整的单词("today"),一个词根("runn"ing),甚至一个标点符号(",")。
    • 为什么这么做:人类的词汇量是海量的,如果把每个单词都当作一个独立单元,那模型的词汇表会大到无法管理。通过分词,可以用有限的、几万个常用 Token 来组合表示出几乎所有的词语,大大提高了效率。例如,“unbelievable” 可能会被分成 “un”、“believe”、“able” 三个 Token。使用子词(sub-word)作为词元的好处是,模型既能处理常见词,也能通过组合子词来理解和生成它从未见过的罕见词或新词。
    • 例子: "今天天气真不错" -> ["今天", "天气", "真", "不错"]
  2. 词嵌入 (Token Embedding)

    • 是什么:将每个离散的 Token 转换成一个包含丰富语义信息的数学向量(一长串数字)。这个向量被称为“嵌入向量”(Embedding Vector)。这个向量可以被认为是该词元在“语义空间”中的坐标。
    • 为什么这么做:纯粹的数字 ID(比如 "今天"=1, "天气"=2)无法表达词与词之间的关系。而嵌入向量是在一个高维空间中表示 Token 的位置。在这个空间里,意思相近的词,它们的向量也更接近。比如,“国王”的向量减去“男人”的向量,会约等于“女王”的向量减去“女人”的向量。这是模型理解语义的关键。
    • 例子: ["今天"] -> [0.12, -0.45, 0.88, ..., -0.02] (一个几百甚至几千维的向量)
  3. 位置编码 (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) 的模型来实现的。

    1. 生成三个向量:对于输入的每一个 Token 向量,模型都会通过不同的权重矩阵,生成三个新的向量:
      • Query (Q) 向量:代表当前 Token 去“查询”其他 Token 的“提问”。可以理解为:“我是谁?我需要和谁建立联系?”
      • Key (K) 向量:代表当前 Token 用来被其他 Token“检索”的“标签”。可以理解为:“我有什么特征?可以被如何描述?”
      • Value (V) 向量:代表当前 Token 实际包含的“内容”。可以理解为:“我实际的意义是什么?”
    2. 计算注意力分数:要计算A对B的注意力,就是用 A 的 Query 向量和 B 的 Key 向量进行点积运算。这个分数代表了 B 对于理解 A 的重要程度。
    3. **归一化 (Softmax)**:将计算出的所有分数进行一次 Softmax 运算,使其总和为1。这样,分数就变成了权重,表示在当前这个词的上下文中,应该给其他每个词分配多少“注意力”。
    4. 加权求和:将每个词的 Value 向量乘以它对应的权重,然后把所有结果加起来。这样就得到了一个全新的向量,它不仅包含了当前词自己的信息,还融合了整个句子中所有其他词的上下文信息,并且是根据重要性加权的。

通过这个机制,模型中的每个词都“看”过了句子中的所有其他词,并更新了自己对上下文的理解。一个 Transformer Block 还包含其他部分,比如前馈网络(Feed-Forward Network)来进一步处理信息,但自注意力是其精髓。

通过多层堆叠这样的注意力机制(Multi-head Attention),模型可以从不同角度捕捉复杂的语法和语义关系。


第三步:生成输出 - 解码与采样策略

当输入向量流经所有 Transformer Block 后,模型已经对输入有了非常深刻的理解。最后,它需要做出预测,也就是生成下一个 Token。

  1. 最终向量转换 (Linear Layer)

    • 模型将最后一个 Transformer Block 输出的、代表“下一个待预测词”的向量,通过一个线性层进行转换。
    • 这个线性层的输出维度等于模型词汇表的大小(比如 50,000)。输出的这个超长向量我们称之为 Logits。Logits 向量中的每一个值,都对应着词汇表中一个 Token 的“得分”,分数越高,代表模型认为这个 Token 是下一个词的可能性越大。
  2. 概率化 (Softmax Function)

    • Logits 只是原始得分,还不够直观。模型会再次使用 Softmax 函数,将这些得分转换成一个概率分布。
    • 经过 Softmax 后,所有 Token 的得分总和为1,每个值都在0到1之间,可以直接看作是该 Token 成为下一个词的概率。
    • 例子: 对于 "今天天气真不错,适合去...",模型可能会输出:
      • "公园": 35%
      • "爬山": 20%
      • "吃饭": 15%
      • "睡觉": 5%
      • ... (其他所有词的概率)
  3. 选择下一个词 (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 (选择一个词) → 将新词加入输入序列 → 重复循环

让我们把整个流程串起来,看模型是如何生成一个完整句子的:

  1. 输入: 你给出 "The cat sat on the"
  2. 处理: 模型经过分词 -> 嵌入 -> 位置编码,将输入转为向量。
  3. 思考: 向量流经多层 Transformer Blocks,通过自注意力机制,模型深刻理解了“猫坐在...”这个场景。
  4. 预测: 模型在最后输出一个概率分布,发现 "mat" (垫子) 的概率最高。
  5. 选择: 通过某种解码策略(比如 Top-K 采样),模型选择了 "mat" 作为输出。
  6. 循环: 模型将新生成的 "mat" 追加到输入序列的末尾,形成新的输入 "The cat sat on the mat"。
  7. 重复: 模型将这个新序列作为下一次预测的输入,重复上述 2-6 步,继续预测下一个词(可能是句号 "."),直到生成结束符([EOS])或者达到预设的最大长度。

这个过程虽然在底层是纯粹的数学计算,但通过在海量数据上学习数十亿甚至上万亿的参数,使得模型能够捕捉到语言的复杂规律、事实知识乃至一定的推理能力,最终生成流畅、连贯且有逻辑的文本。


hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。 原文链接 👉 ,⚡️更新更及时。 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。

欢迎大家点开下面名片,添加好友交流。

本文由 mdnice 多平台发布

http://www.dtcms.com/a/337043.html

相关文章:

  • 将 iPhone 连接到 Windows 11 的完整指南
  • Chromium base 库中的 Observer 模式实现:ObserverList 与 ObserverListThreadSafe 深度解析
  • AI 在金融领域的落地案例
  • 强化学习-CH2 状态价值和贝尔曼等式
  • 算法详细讲解:数据结构 - 单链表与双链表
  • Nacos-6--Naco的QUIC协议实现高可用的工作原理
  • cesium中实时获取鼠标精确坐标和高度
  • IB数学课程知识点有哪些?IB数学课程辅导机构怎么选?
  • GitLab 安全漏洞 CVE-2025-7739 解决方案
  • GitLab 安全漏洞 CVE-2025-6186 解决方案
  • AI全链路赋能:smardaten2.0实现软件开发全流程智能化突破
  • Leetcode 3651. Minimum Cost Path with Teleportations
  • 嵌入式 C++ 语言编程规范文档个人学习版(参考《Google C++ 编码规范中文版》)
  • USB基础 -- 字符串描述符 (String Descriptor) 系统整理文档
  • 2025年8月更新!Windows 7 旗舰版 (32位+64位 轻度优化+离线驱动)
  • hla mHAg
  • cortex-m中断技巧
  • 数组学习2
  • 十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
  • idea部署到docker
  • 静配中心配药智能化:基于高并发架构的Go语言实现
  • MySQL 函数大赏:聚合、日期、字符串等函数剖析
  • Ps切片后无法导出原因(存储为web所用格式)为灰色,及解决文案
  • Day119 持续集成docker+jenkins
  • Dockerfile优化指南:利用多阶段构建将Docker镜像体积减小90%
  • 【音频信号发生器】基本应用
  • LAMP 架构部署:Linux+Apache+MariaDB+PHP
  • C# 使用注册表开机自启
  • [C#] WPF - 自定义控件(行列间距UniformGrid)
  • docker compose再阿里云上无法使用的问题