<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Attention on XEDCZQ的博客</title><link>https://xedczq.cn/tags/attention/</link><description>Recent content in Attention on XEDCZQ的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 05 Jun 2026 23:10:00 +0800</lastBuildDate><atom:link href="https://xedczq.cn/tags/attention/index.xml" rel="self" type="application/rss+xml"/><item><title>Transformer 20 步可视化学习笔记</title><link>https://xedczq.cn/post/transformerexplainer/</link><pubDate>Fri, 05 Jun 2026 23:10:00 +0800</pubDate><guid>https://xedczq.cn/post/transformerexplainer/</guid><description>&lt;img src="https://xedczq.cn/img/transformer-explainer/steps/step-03.jpg" alt="Featured image of post Transformer 20 步可视化学习笔记" /&gt;&lt;h1 id="transformer-20-步可视化学习笔记"&gt;&lt;a href="#transformer-20-%e6%ad%a5%e5%8f%af%e8%a7%86%e5%8c%96%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" class="header-anchor"&gt;&lt;/a&gt;Transformer 20 步可视化学习笔记
&lt;/h1&gt;&lt;p&gt;本文参考 &lt;a class="link" href="https://poloclub.github.io/transformer-explainer/" target="_blank" rel="noopener"
 &gt;Transformer Explainer&lt;/a&gt; 的交互式讲解，按它的 20 个步骤整理一篇中文学习笔记。这个网站用 GPT-2 small 作为示例模型，把文本生成过程可视化成从输入 token 到输出概率的完整流水线。&lt;/p&gt;
&lt;p&gt;先记住一句话：&lt;strong&gt;GPT 类 Transformer 的核心任务是下一个 token 预测&lt;/strong&gt;。给定提示词：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Data visualization empowers users to
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;模型要回答的问题是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;下一个最可能出现的 token 是什么？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了回答这个问题，Transformer 会经历：分词、嵌入、位置编码、多层 Transformer Block、自注意力、MLP、logits、概率分布、采样策略等步骤。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;本文所有步骤截图均截取自 &lt;a class="link" href="https://poloclub.github.io/transformer-explainer/" target="_blank" rel="noopener"
 &gt;Transformer Explainer&lt;/a&gt;，该项目由 Georgia Tech Polo Club 团队开发。截图用于个人学习笔记，建议结合原网站交互查看。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="what-is-transformertransformer-是什么"&gt;&lt;a href="#what-is-transformertransformer-%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;What is Transformer：Transformer 是什么
&lt;/h2&gt;&lt;p&gt;Transformer 是现代大语言模型最常用的基础架构。GPT、Llama、Gemini 这类文本生成模型，核心都可以理解为 Transformer 架构的扩展版本。&lt;/p&gt;
&lt;p&gt;它最重要的能力不是“背答案”，而是从大量文本中学会语言模式，然后在推理时根据上下文预测下一个 token。这个预测会反复进行：预测一个 token，把它接到原文本后面，再继续预测下一个。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 1: What is Transformer" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-01.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer，&lt;a class="link" href="https://poloclub.github.io/transformer-explainer/" target="_blank" rel="noopener"
 &gt;https://poloclub.github.io/transformer-explainer/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="how-transformers-work文本生成的本质"&gt;&lt;a href="#how-transformers-work%e6%96%87%e6%9c%ac%e7%94%9f%e6%88%90%e7%9a%84%e6%9c%ac%e8%b4%a8" class="header-anchor"&gt;&lt;/a&gt;How Transformers Work：文本生成的本质
&lt;/h2&gt;&lt;p&gt;Transformer 生成文本时并不是一次性写完整段话，而是逐步生成。每一步都在做同一个任务：&lt;strong&gt;根据已有上下文，预测下一个 token 的概率分布&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;例如当前输入是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Data visualization empowers users to
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;模型可能认为下一个 token 是 &lt;code&gt;visualize&lt;/code&gt; 的概率最高，也可能给 &lt;code&gt;create&lt;/code&gt;、&lt;code&gt;see&lt;/code&gt;、&lt;code&gt;make&lt;/code&gt; 等 token 分配较高概率。最终输出哪个 token，还会受到 temperature、top-k、top-p 等采样参数影响。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 2: How Transformers Work" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-02.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="transformer-architecture整体架构"&gt;&lt;a href="#transformer-architecture%e6%95%b4%e4%bd%93%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;Transformer Architecture：整体架构
&lt;/h2&gt;&lt;p&gt;一个文本生成 Transformer 可以拆成三大部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Embedding&lt;/strong&gt;：把人类文本变成模型能处理的向量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer Blocks&lt;/strong&gt;：反复加工每个 token 的表示，核心包括 Self-Attention 和 MLP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output Probabilities&lt;/strong&gt;：把最终向量变成词表中每个 token 的概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从宏观上看，信息流是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;文本输入 -&amp;gt; token -&amp;gt; embedding -&amp;gt; 多层 Transformer Block -&amp;gt; logits -&amp;gt; 概率 -&amp;gt; 采样下一个 token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="Step 3: Transformer Architecture" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-03.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="embedding把文本变成向量"&gt;&lt;a href="#embedding%e6%8a%8a%e6%96%87%e6%9c%ac%e5%8f%98%e6%88%90%e5%90%91%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;Embedding：把文本变成向量
&lt;/h2&gt;&lt;p&gt;模型不能直接理解字符串。Embedding 的作用是把每个 token 转成一串数字，也就是向量。这个向量不是随便编码的，而是在训练过程中学出来的。&lt;/p&gt;
&lt;p&gt;如果两个 token 经常出现在相似语境中，它们的 embedding 往往会在高维空间中更接近。可以把 embedding 理解成模型内部的“词义坐标”。&lt;/p&gt;
&lt;p&gt;GPT-2 small 的隐藏维度是 768，所以每个 token 会被表示成一个 768 维向量。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 4: Embedding" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-04.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="token-embedding分词与-token-查表"&gt;&lt;a href="#token-embedding%e5%88%86%e8%af%8d%e4%b8%8e-token-%e6%9f%a5%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;Token Embedding：分词与 token 查表
&lt;/h2&gt;&lt;p&gt;Tokenization 会把输入文本切成 token。token 可以是完整单词，也可以是子词。例如示例里的 &lt;code&gt;empowers&lt;/code&gt; 被切成了 &lt;code&gt;em&lt;/code&gt; 和 &lt;code&gt;powers&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;每个 token 都有一个唯一 ID。GPT-2 的词表大小是 50,257，所以 token embedding 矩阵大致是：&lt;/p&gt;
$$
50257 \times 768
$$&lt;p&gt;模型拿到 token ID 后，会去这个大矩阵里查出对应的 768 维向量。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 5: Token Embedding" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-05.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="positional-encoding注入位置信息"&gt;&lt;a href="#positional-encoding%e6%b3%a8%e5%85%a5%e4%bd%8d%e7%bd%ae%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&gt;Positional Encoding：注入位置信息
&lt;/h2&gt;&lt;p&gt;Self-Attention 本身不天然知道顺序。如果只给模型一组 token 向量，它并不知道哪个 token 在前、哪个在后。&lt;/p&gt;
&lt;p&gt;所以需要位置编码。GPT-2 使用可学习的位置 embedding，把 token 的语义向量和位置向量相加：&lt;/p&gt;
$$
x_i = \text{TokenEmbedding}_i + \text{PositionEmbedding}_i
$$&lt;p&gt;这样模型既知道“这个 token 是什么”，也知道“它在第几个位置”。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 6: Positional Encoding" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-06.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="repetitive-transformer-blocks重复堆叠的-transformer-block"&gt;&lt;a href="#repetitive-transformer-blocks%e9%87%8d%e5%a4%8d%e5%a0%86%e5%8f%a0%e7%9a%84-transformer-block" class="header-anchor"&gt;&lt;/a&gt;Repetitive Transformer Blocks：重复堆叠的 Transformer Block
&lt;/h2&gt;&lt;p&gt;Embedding 只是输入表示，还不是充分理解后的语义表示。真正的上下文建模发生在 Transformer Block 中。&lt;/p&gt;
&lt;p&gt;GPT-2 small 有 12 个 Transformer Block。每个 block 大致包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-Head Self-Attention：让 token 之间交换信息。&lt;/li&gt;
&lt;li&gt;MLP：对每个 token 的表示做非线性加工。&lt;/li&gt;
&lt;li&gt;Residual、LayerNorm、Dropout：让训练更稳定，泛化更好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多层堆叠的意义是：底层更偏局部和词法信息，高层更容易形成复杂语义和任务相关表示。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 7: Repetitive Transformer Blocks" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-07.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="multi-head-self-attention多头自注意力"&gt;&lt;a href="#multi-head-self-attention%e5%a4%9a%e5%a4%b4%e8%87%aa%e6%b3%a8%e6%84%8f%e5%8a%9b" class="header-anchor"&gt;&lt;/a&gt;Multi-Head Self Attention：多头自注意力
&lt;/h2&gt;&lt;p&gt;Self-Attention 的目标是让每个 token 根据上下文更新自己。比如 &lt;code&gt;to&lt;/code&gt; 这个 token 在不同句子里含义不同，它需要“看”前面的 &lt;code&gt;Data visualization empowers users&lt;/code&gt;，才能形成更准确的表示。&lt;/p&gt;
&lt;p&gt;Multi-Head 的含义是：模型不是只用一种注意力视角，而是并行使用多个 head。GPT-2 small 有 12 个 attention heads。不同 head 可以学习不同关系，例如语法关系、短距离搭配、长距离语义依赖等。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 8: Multi-Head Self Attention" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-08.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="query-key-valueqkv-是什么"&gt;&lt;a href="#query-key-valueqkv-%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;Query, Key, Value：Q、K、V 是什么
&lt;/h2&gt;&lt;p&gt;Self-Attention 会把每个 token 的输入向量分别映射成三个向量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query (Q)&lt;/strong&gt;：当前 token 想查什么信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key (K)&lt;/strong&gt;：每个 token 能被别人匹配到的特征。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value (V)&lt;/strong&gt;：真正要被聚合传递的信息内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们来自线性变换：&lt;/p&gt;
$$
Q = XW_Q,\quad K = XW_K,\quad V = XW_V
$$&lt;p&gt;一个通俗类比是搜索引擎：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query 是搜索词。&lt;/li&gt;
&lt;li&gt;Key 是网页标题或索引。&lt;/li&gt;
&lt;li&gt;Value 是网页正文内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先用 Query 和 Key 算相关性，再根据相关性加权读取 Value。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 9: Query, Key, Value" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-09.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="multi-head把-qkv-切成多个头"&gt;&lt;a href="#multi-head%e6%8a%8a-qkv-%e5%88%87%e6%88%90%e5%a4%9a%e4%b8%aa%e5%a4%b4" class="header-anchor"&gt;&lt;/a&gt;Multi-head：把 Q/K/V 切成多个头
&lt;/h2&gt;&lt;p&gt;GPT-2 small 的 embedding 维度是 768，attention head 数是 12，所以每个 head 处理的维度通常是：&lt;/p&gt;
$$
768 / 12 = 64
$$&lt;p&gt;多头机制的好处是并行学习多种关系。一个 head 可能关注相邻词，另一个 head 可能关注主谓关系，还有 head 可能关注更远处的语义提示。&lt;/p&gt;
&lt;p&gt;多个 head 不是重复劳动，而是让模型拥有多个“观察角度”。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 10: Multi-head" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-10.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="masked-self-attention带掩码的自注意力"&gt;&lt;a href="#masked-self-attention%e5%b8%a6%e6%8e%a9%e7%a0%81%e7%9a%84%e8%87%aa%e6%b3%a8%e6%84%8f%e5%8a%9b" class="header-anchor"&gt;&lt;/a&gt;Masked Self Attention：带掩码的自注意力
&lt;/h2&gt;&lt;p&gt;GPT 这类模型是从左到右生成文本的。预测当前位置时，不能偷看未来 token，所以要使用 causal mask，也叫 masked self-attention。&lt;/p&gt;
&lt;p&gt;核心计算公式是：&lt;/p&gt;
$$
\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V
$$&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$QK^T$：计算 token 两两之间的相似度。&lt;/li&gt;
&lt;li&gt;$\sqrt{d_k}$：缩放因子，避免点积值过大导致 softmax 过尖。&lt;/li&gt;
&lt;li&gt;$M$：mask 矩阵，把未来位置设为 $-\infty$。&lt;/li&gt;
&lt;li&gt;softmax：把分数变成概率。&lt;/li&gt;
&lt;li&gt;乘以 $V$：按注意力权重汇总信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Step 11: Masked Self Attention" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-11.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="attention-output--concatenation注意力输出与拼接"&gt;&lt;a href="#attention-output--concatenation%e6%b3%a8%e6%84%8f%e5%8a%9b%e8%be%93%e5%87%ba%e4%b8%8e%e6%8b%bc%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;Attention Output &amp;amp; Concatenation：注意力输出与拼接
&lt;/h2&gt;&lt;p&gt;每个 head 都会输出一份上下文增强后的 token 表示。因为 GPT-2 small 有 12 个 head，所以会得到 12 份结果。&lt;/p&gt;
&lt;p&gt;接下来模型会把这些 head 的输出拼接起来，再经过一次线性投影，回到原来的隐藏维度 768：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;head_1, head_2, ..., head_12 -&amp;gt; concat -&amp;gt; linear projection
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这一步的意义是：先让多个 head 分别提取信息，再把多种视角融合成一个统一表示。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 12: Attention Output &amp; Concatenation" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-12.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="mlp逐-token-的非线性加工"&gt;&lt;a href="#mlp%e9%80%90-token-%e7%9a%84%e9%9d%9e%e7%ba%bf%e6%80%a7%e5%8a%a0%e5%b7%a5" class="header-anchor"&gt;&lt;/a&gt;MLP：逐 token 的非线性加工
&lt;/h2&gt;&lt;p&gt;Attention 负责 token 之间的信息流动，MLP 负责对每个 token 自己的表示进行加工。&lt;/p&gt;
&lt;p&gt;GPT-2 的 MLP 通常包含两层线性变换，中间接 GELU 激活：&lt;/p&gt;
$$
\text{MLP}(x)=W_2\cdot \text{GELU}(W_1x+b_1)+b_2
$$&lt;p&gt;第一层会把维度从 768 扩展到 3072，第二层再压回 768。扩展维度可以让模型在更高维空间中表达更复杂的特征。&lt;/p&gt;
&lt;p&gt;注意：MLP 不像 Attention 那样跨 token 交流信息，它是对每个 token 独立处理。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 13: MLP" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-13.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="output-logit输出-logits"&gt;&lt;a href="#output-logit%e8%be%93%e5%87%ba-logits" class="header-anchor"&gt;&lt;/a&gt;Output Logit：输出 logits
&lt;/h2&gt;&lt;p&gt;经过所有 Transformer Blocks 后，模型会拿最后一个位置的输出向量去预测下一个 token。&lt;/p&gt;
&lt;p&gt;这个向量会经过最终线性层，映射到词表大小：&lt;/p&gt;
$$
\text{logits}=h_{\text{last}}W_{\text{vocab}}+b
$$&lt;p&gt;GPT-2 的词表大小是 50,257，所以 logits 是一个长度为 50,257 的向量。每个数对应一个候选 token 的原始分数。&lt;/p&gt;
&lt;p&gt;logit 不是概率。它可以是任意实数，还需要经过 softmax 才能变成概率分布。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 14: Output Logit" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-14.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="probabilities从-logits-到概率"&gt;&lt;a href="#probabilities%e4%bb%8e-logits-%e5%88%b0%e6%a6%82%e7%8e%87" class="header-anchor"&gt;&lt;/a&gt;Probabilities：从 logits 到概率
&lt;/h2&gt;&lt;p&gt;Softmax 会把 logits 转换成概率：&lt;/p&gt;
$$
p_i=\frac{e^{z_i}}{\sum_j e^{z_j}}
$$&lt;p&gt;转换后有两个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个 token 的概率都在 0 到 1 之间。&lt;/li&gt;
&lt;li&gt;所有 token 的概率加起来等于 1。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图中可以看到，示例输入后，模型认为 &lt;code&gt;visualize&lt;/code&gt;、&lt;code&gt;create&lt;/code&gt;、&lt;code&gt;see&lt;/code&gt;、&lt;code&gt;make&lt;/code&gt; 等 token 是比较可能的下一个 token。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 15: Probabilities" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-15.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="temperature温度控制生成随机性"&gt;&lt;a href="#temperature%e6%b8%a9%e5%ba%a6%e6%8e%a7%e5%88%b6%e7%94%9f%e6%88%90%e9%9a%8f%e6%9c%ba%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;Temperature：温度控制生成随机性
&lt;/h2&gt;&lt;p&gt;Temperature 会在 softmax 前缩放 logits：&lt;/p&gt;
$$
p_i=\frac{\exp(z_i/T)}{\sum_j \exp(z_j/T)}
$$&lt;p&gt;其中 $T$ 是 temperature：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$T &amp;lt; 1$：概率分布更尖锐，高分 token 更容易被选中，输出更稳定。&lt;/li&gt;
&lt;li&gt;$T = 1$：不额外调整 logits。&lt;/li&gt;
&lt;li&gt;$T &amp;gt; 1$：概率分布更平坦，低概率 token 也有更多机会被选中，输出更多样。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通俗地说，temperature 越低越保守，越高越发散。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 16: Temperature" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-16.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="sampling-strategy采样策略"&gt;&lt;a href="#sampling-strategy%e9%87%87%e6%a0%b7%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;Sampling Strategy：采样策略
&lt;/h2&gt;&lt;p&gt;得到概率分布后，模型还要决定如何选下一个 token。常见策略有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Greedy Search&lt;/strong&gt;：永远选概率最高的 token，稳定但容易死板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top-k&lt;/strong&gt;：只保留概率最高的 k 个 token，再从中采样。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top-p&lt;/strong&gt;：保留累计概率达到 p 的最小 token 集合，也叫 nucleus sampling。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Top-k 更像固定候选池，Top-p 更像动态候选池。实际使用时，temperature 和 top-k/top-p 经常一起调。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 17: Sampling Strategy" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-17.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="residual-connection残差连接"&gt;&lt;a href="#residual-connection%e6%ae%8b%e5%b7%ae%e8%bf%9e%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;Residual Connection：残差连接
&lt;/h2&gt;&lt;p&gt;残差连接会把某一层的输入直接加到输出上：&lt;/p&gt;
$$
y = x + F(x)
$$&lt;p&gt;它的作用是保留原始信息，并让梯度更容易穿过深层网络。如果没有残差连接，模型层数很深时，训练会更困难，早期层的信息也更容易丢失。&lt;/p&gt;
&lt;p&gt;在 Transformer 中，Attention 和 MLP 周围通常都有残差连接。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 18: Residual Connection" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-18.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="layer-normalization层归一化"&gt;&lt;a href="#layer-normalization%e5%b1%82%e5%bd%92%e4%b8%80%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;Layer Normalization：层归一化
&lt;/h2&gt;&lt;p&gt;Layer Normalization 会对一个 token 向量内部的数值做归一化，使均值和方差更稳定：&lt;/p&gt;
$$
\text{LayerNorm}(x)=\gamma\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta
$$&lt;p&gt;它能减少训练不稳定，让每一层输入分布更可控。GPT-2 使用的是 pre-norm 风格：在进入 Attention 和 MLP 前先做 LayerNorm。&lt;/p&gt;
&lt;p&gt;通俗理解：LayerNorm 像是在每次进入关键计算前，先把数值尺度整理到比较合适的范围。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 19: Layer Normalization" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-19.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="dropout训练时的随机失活"&gt;&lt;a href="#dropout%e8%ae%ad%e7%bb%83%e6%97%b6%e7%9a%84%e9%9a%8f%e6%9c%ba%e5%a4%b1%e6%b4%bb" class="header-anchor"&gt;&lt;/a&gt;Dropout：训练时的随机失活
&lt;/h2&gt;&lt;p&gt;Dropout 是训练阶段的正则化方法，会随机把一部分连接或激活置零，避免模型过度依赖某些局部特征。&lt;/p&gt;
&lt;p&gt;它的直觉是：训练时不要让模型每次都走完全相同的路径，迫使它学到更稳健的表示。&lt;/p&gt;
&lt;p&gt;需要注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dropout 主要用于训练。&lt;/li&gt;
&lt;li&gt;推理时 Dropout 会关闭。&lt;/li&gt;
&lt;li&gt;很多新一代大模型因为训练数据极大，Dropout 使用得比早期模型更少。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Step 20: Dropout" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xedczq.cn/img/transformer-explainer/steps/step-20.jpg"&gt;&lt;/p&gt;
&lt;p&gt;图源：Transformer Explainer&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一张流程图总结"&gt;&lt;a href="#%e4%b8%80%e5%bc%a0%e6%b5%81%e7%a8%8b%e5%9b%be%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;一张流程图总结
&lt;/h2&gt;&lt;p&gt;可以把 GPT 类 Transformer 的推理流程压缩成下面这条链路：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 A["输入文本"] --&gt; B["Tokenization"]
 B --&gt; C["Token Embedding"]
 C --&gt; D["Positional Encoding"]
 D --&gt; E["Transformer Block x N"]
 E --&gt; F["Multi-Head Self-Attention"]
 F --&gt; G["MLP"]
 G --&gt; H["Final Linear"]
 H --&gt; I["Logits"]
 I --&gt; J["Softmax Probabilities"]
 J --&gt; K["Temperature / Top-k / Top-p"]
 K --&gt; L["采样下一个 token"]&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="和-rnn-的关键区别"&gt;&lt;a href="#%e5%92%8c-rnn-%e7%9a%84%e5%85%b3%e9%94%ae%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;和 RNN 的关键区别
&lt;/h2&gt;&lt;p&gt;结合之前的 RNN 学习，可以这样理解二者差异：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;对比点&lt;/th&gt;
 &lt;th&gt;RNN&lt;/th&gt;
 &lt;th&gt;Transformer&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;信息传递方式&lt;/td&gt;
 &lt;td&gt;依赖隐藏状态逐步传递&lt;/td&gt;
 &lt;td&gt;Self-Attention 让 token 直接互相读取&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;并行能力&lt;/td&gt;
 &lt;td&gt;时间步依赖强，难并行&lt;/td&gt;
 &lt;td&gt;同层 token 可并行计算&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长距离依赖&lt;/td&gt;
 &lt;td&gt;路径长，容易衰减&lt;/td&gt;
 &lt;td&gt;任意位置可直接建立联系&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;上下文表示&lt;/td&gt;
 &lt;td&gt;压缩进隐藏状态&lt;/td&gt;
 &lt;td&gt;显式保留整段 token 表示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;大模型训练&lt;/td&gt;
 &lt;td&gt;扩展效率较差&lt;/td&gt;
 &lt;td&gt;更适合 GPU/TPU 大规模矩阵计算&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这也是为什么现代 LLM 主流选择 Transformer：它不仅建模能力强，而且工程上更适合大规模预训练。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="学习来源"&gt;&lt;a href="#%e5%ad%a6%e4%b9%a0%e6%9d%a5%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;学习来源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://poloclub.github.io/transformer-explainer/" target="_blank" rel="noopener"
 &gt;Transformer Explainer: LLM Transformer Model Visually Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/poloclub/transformer-explainer" target="_blank" rel="noopener"
 &gt;Transformer Explainer GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2408.04619" target="_blank" rel="noopener"
 &gt;Transformer Explainer Paper, arXiv:2408.04619&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vaswani et al., &lt;a class="link" href="https://arxiv.org/abs/1706.03762" target="_blank" rel="noopener"
 &gt;Attention Is All You Need&lt;/a&gt;, 2017&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>