<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Self-Attention on Jeanphilo Blog</title><link>https://jeanphilogong.github.io/jeanblog/zh/tags/self-attention/</link><description>Recent content in Self-Attention on Jeanphilo Blog</description><generator>Hugo -- 0.168.0</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:13:23 +0800</lastBuildDate><atom:link href="https://jeanphilogong.github.io/jeanblog/zh/tags/self-attention/index.xml" rel="self" type="application/rss+xml"/><item><title>Transformer 结构推导：一步一步搭出最小可运行 PyTorch 实现</title><link>https://jeanphilogong.github.io/jeanblog/zh/ai/llm/transformer-architecture-overview/</link><pubDate>Thu, 23 Apr 2026 10:13:23 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/ai/llm/transformer-architecture-overview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;副标题 / 摘要&lt;/strong&gt;
这篇文章不把 Transformer 当成一个现成黑盒来介绍，而是直接从一个最小翻译任务开始，让需要的结构一层一层长出来，最后收束成一份最小可运行的 PyTorch encoder-decoder Transformer。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="从一个最小翻译任务开始"&gt;从一个最小翻译任务开始&lt;/h2&gt;
&lt;p&gt;假设源序列是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;bos&amp;gt; I love apples &amp;lt;eos&amp;gt;
&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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;bos&amp;gt; 我 喜欢 苹果
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当模型要生成“苹果”时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它不能看目标序列里未来还没生成的位置&lt;/li&gt;
&lt;li&gt;它需要重点读取源序列中的 &lt;code&gt;apples&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;它可能还需要参考前面的“我 喜欢”来决定当前词&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以这里天然会逼出三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;目标侧必须有&lt;strong&gt;因果约束&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;源侧和目标侧都需要&lt;strong&gt;全局读取&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;解码器不仅要读自己，还要读编码器输出&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;RNN 和 CNN 也能处理序列，但它们在长距离依赖和全并行训练上都有明显限制。
所以这里真正要解决的，不只是“做一个更深的网络”，而是让任意位置能直接交互，并且显式控制信息流方向。&lt;/p&gt;
&lt;p&gt;下面开始按这个压力一步一步长代码。&lt;/p&gt;
&lt;h2 id="step-1先有输入表示但先不谈注意力"&gt;Step 1：先有输入表示，但先不谈注意力&lt;/h2&gt;
&lt;p&gt;先看一个已经分词并编号后的最小输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;bos&amp;gt; I love apples &amp;lt;eos&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-&amp;gt; [1, 15, 982, 204, 2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;1, 15, 982, 204, 2&lt;/code&gt; 还不是模型已经理解后的表示。
它们只是词表里的编号，作用更接近“标签”或“学号”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;15&lt;/code&gt; 比 &lt;code&gt;204&lt;/code&gt; 小，不代表它们语义上更接近&lt;/li&gt;
&lt;li&gt;直接拿这种离散编号去做线性变换或点积，含义也不对&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以第一步只解决一个更具体的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;怎样把“词表编号”变成“模型后面可以继续计算的一组连续数值”？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里再引入两个词：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;token id&lt;/code&gt;：分词后查词表得到的离散编号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;embedding&lt;/code&gt;：把每个离散编号映射成长度为 &lt;code&gt;d_model&lt;/code&gt; 的可学习向量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先写最小版，不额外引入别的机制：&lt;/p&gt;</description></item><item><title>Attention Is All You Need：Transformer 的核心算法与工程落地</title><link>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/attention-is-all-you-need/</link><pubDate>Sun, 25 Jan 2026 20:08:41 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/attention-is-all-you-need/</guid><description>从算法抽象、复杂度与工程约束出发，解释 Transformer 如何用注意力替代递归与卷积，并给出可运行示例与选型指南。</description></item><item><title>为什么使用多头注意力机制：能力、稳定性与工程取舍</title><link>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/why-multi-head-attention/</link><pubDate>Sat, 24 Jan 2026 16:20:59 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/why-multi-head-attention/</guid><description>用 ACERS 框架解释多头注意力的必要性、核心原理与工程场景，并给出最小可运行示例。</description></item><item><title>Self-Attention vs Cross-Attention：机制、差异与工程应用</title><link>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/self-attention-vs-cross-attention/</link><pubDate>Sat, 24 Jan 2026 15:44:12 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/ai/attention/self-attention-vs-cross-attention/</guid><description>用 ACERS 框架讲清 self-attention 与 cross-attention 的核心差异、公式与工程场景。</description></item></channel></rss>