<?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>笔记 on Afan&#39;s Blog</title>
    <link>https://afan.ml/tags/%E7%AC%94%E8%AE%B0/</link>
    <description>Recent content in 笔记 on Afan&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 12 May 2026 05:30:56 +0000</lastBuildDate>
    <atom:link href="https://afan.ml/tags/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Attention Mask 笔记</title>
      <link>https://afan.ml/posts/attention--mask/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/attention--mask/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：Mask 是在计算 softmax 之前，把某些位置的注意力分数强制设为 $-\infty$，使 softmax 后这些位置的权重变为 0，相当于&amp;quot;屏蔽掉&amp;quot;不该看的位置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要-mask&#34;&gt;一、为什么需要 Mask？&lt;/h2&gt;
&lt;p&gt;Attention 的计算是：&lt;/p&gt;
&lt;p&gt;$$
\text{scores} = \frac{QK^T}{\sqrt{d_k}}, \quad \text{weights} = \text{softmax}(\text{scores}), \quad \text{output} = \text{weights} \cdot V
$$&lt;/p&gt;
&lt;p&gt;默认情况下，每个 token 的 Q 会和序列中&lt;strong&gt;所有&lt;/strong&gt; token 的 K 做点积，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无意义的 &lt;code&gt;[PAD]&lt;/code&gt; 填充 token&lt;/li&gt;
&lt;li&gt;未来还没生成的 token（训练时）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两种情况都需要用 Mask 屏蔽掉。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二两种-mask&#34;&gt;二、两种 Mask&lt;/h2&gt;
&lt;h3 id=&#34;21-padding-mask填充遮罩&#34;&gt;2.1 Padding Mask（填充遮罩）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：一个 batch 里不同句子长度不同，需要用 &lt;code&gt;[PAD]&lt;/code&gt; token 补齐到相同长度，但 &lt;code&gt;[PAD]&lt;/code&gt; 是无意义的，不应该被 Attention 到。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;batch 里两个句子（补齐到长度5）：
  句子1: [&amp;#34;今&amp;#34;, &amp;#34;天&amp;#34;, &amp;#34;好&amp;#34;, &amp;#34;[PAD]&amp;#34;, &amp;#34;[PAD]&amp;#34;]   ← 实际长度3，补了2个PAD
  句子2: [&amp;#34;天&amp;#34;, &amp;#34;气&amp;#34;, &amp;#34;真&amp;#34;, &amp;#34;不&amp;#34;,    &amp;#34;错&amp;#34;   ]   ← 实际长度5，无需补

Padding Mask（1=有效位置，0=PAD位置）：
  句子1: [1, 1, 1, 0, 0]
  句子2: [1, 1, 1, 1, 1]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;屏蔽效果：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Batch Norm vs Layer Norm 学习笔记</title>
      <link>https://afan.ml/posts/b-n-vs--l-n/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/b-n-vs--l-n/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;核心问题：为什么需要归一化？神经网络训练时，每层的输入分布会随参数更新不断变化（Internal Covariate Shift），导致训练不稳定、收敛慢。归一化就是把数据&amp;quot;拉回&amp;quot;到均值为0、方差为1的分布，再通过可学习参数还原表达能力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一公式两者一样区别在于沿哪个维度算&#34;&gt;一、公式（两者一样，区别在于&amp;quot;沿哪个维度算&amp;quot;）&lt;/h2&gt;
&lt;p&gt;$$
\hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}}, \quad y = \gamma \hat{x} + \beta
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mu$、$\sigma^2$：均值和方差（&lt;strong&gt;统计维度不同是BN和LN的核心区别&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;$\gamma$、$\beta$：可学习的缩放和偏移参数&lt;/li&gt;
&lt;li&gt;$\epsilon$：防止除零的小常数&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二batch-normbn&#34;&gt;二、Batch Norm（BN）&lt;/h2&gt;
&lt;h3 id=&#34;核心思想&#34;&gt;核心思想&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;跨样本、同一特征维度&lt;/strong&gt;做归一化。&lt;/p&gt;
&lt;h3 id=&#34;统计维度&#34;&gt;统计维度&lt;/h3&gt;
&lt;p&gt;假设输入 shape 为 &lt;code&gt;[B, C, H, W]&lt;/code&gt;（B=batch，C=通道，H/W=空间）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对每个通道 C，在 &lt;strong&gt;B、H、W&lt;/strong&gt; 三个维度上计算均值和方差&lt;/li&gt;
&lt;li&gt;每个通道有一组独立的 $\gamma$、$\beta$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;直觉理解&#34;&gt;直觉理解&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;把这批图片里，同一个通道的所有像素值，统一归一化&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;具体例子&#34;&gt;具体例子&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入：4张图，每张1个通道，2x2像素
数据（展平后每行是一张图的像素）：
  图1: [1, 2, 3, 4]
  图2: [5, 6, 7, 8]
  图3: [2, 3, 4, 5]
  图4: [6, 7, 8, 9]

BN 把这 4×4=16 个数一起算均值和方差：
  所有数：1,2,3,4,5,6,7,8,2,3,4,5,6,7,8,9
  μ  = (1+2+3+4+5+6+7+8+2+3+4+5+6+7+8+9) / 16 = 80/16 = 5.0
  σ² = [(1-5)²+(2-5)²+...+(9-5)²] / 16 = 88/16 = 5.5
  σ  = √5.5 ≈ 2.345

  归一化示例（以图1的像素值1为例）：
  x̂ = (1 - 5.0) / √(5.5 + ε) ≈ -4.0 / 2.345 ≈ -1.706

  所有16个像素值都用同一个 μ=5.0、σ≈2.345 归一化
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;优点&#34;&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;效果好，训练稳定，允许更大学习率&lt;/li&gt;
&lt;li&gt;CV 任务（CNN）的标配&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;缺点&#34;&gt;缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;依赖 batch size&lt;/strong&gt;：batch 太小时均值/方差估计不准，效果差&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理时需要维护全局统计量&lt;/strong&gt;（running mean/var）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不适合 RNN/Transformer&lt;/strong&gt;：序列长度不固定，batch 内样本差异大&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三layer-normln&#34;&gt;三、Layer Norm（LN）&lt;/h2&gt;
&lt;h3 id=&#34;核心思想-1&#34;&gt;核心思想&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;同一样本、跨特征维度&lt;/strong&gt;做归一化。&lt;/p&gt;</description>
    </item>
    <item>
      <title>BPE 与 Tokenizer 笔记</title>
      <link>https://afan.ml/posts/b-p-e%E4%B8%8E-tokenizer/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/b-p-e%E4%B8%8E-tokenizer/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：BPE（Byte Pair Encoding）是一种把文本切分成&amp;quot;子词单元&amp;quot;的算法，是现代大模型 Tokenizer 的核心。tiktoken 是 OpenAI 实现的高性能 BPE 库，GPT 系列模型使用它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要-tokenizer&#34;&gt;一、为什么需要 Tokenizer？&lt;/h2&gt;
&lt;p&gt;模型不能直接处理文字，需要先把文字转成数字（token ID），再转成向量（embedding）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;原始文本：&amp;#34;今天天气很好&amp;#34;
    ↓ Tokenizer
token 序列：[&amp;#34;今天&amp;#34;, &amp;#34;天气&amp;#34;, &amp;#34;很&amp;#34;, &amp;#34;好&amp;#34;]
    ↓ 查词表
token ID：[1234, 5678, 910, 1112]
    ↓ Embedding 层
向量矩阵：[[...], [...], [...], [...]]   ← 模型真正处理的输入
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;二三种切分粒度的对比&#34;&gt;二、三种切分粒度的对比&lt;/h2&gt;
&lt;p&gt;在 BPE 出现之前，有两种极端方案：&lt;/p&gt;
&lt;h3 id=&#34;方案1词级别word-level&#34;&gt;方案1：词级别（Word-level）&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;unhappiness&amp;#34; → [&amp;#34;unhappiness&amp;#34;]   ← 一个词一个 token
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;词表会非常大（英语有几十万个词）&lt;/li&gt;
&lt;li&gt;遇到训练时没见过的新词（OOV，Out-of-Vocabulary）就不认识&lt;/li&gt;
&lt;li&gt;不同语言、不同形态的词需要分别存储（&amp;ldquo;run&amp;rdquo;、&amp;ldquo;running&amp;rdquo;、&amp;ldquo;ran&amp;rdquo; 是三个不同 token）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;方案2字符级别character-level&#34;&gt;方案2：字符级别（Character-level）&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;unhappiness&amp;#34; → [&amp;#34;u&amp;#34;,&amp;#34;n&amp;#34;,&amp;#34;h&amp;#34;,&amp;#34;a&amp;#34;,&amp;#34;p&amp;#34;,&amp;#34;p&amp;#34;,&amp;#34;i&amp;#34;,&amp;#34;n&amp;#34;,&amp;#34;e&amp;#34;,&amp;#34;s&amp;#34;,&amp;#34;s&amp;#34;]   ← 每个字符一个 token
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;序列太长，Attention 的 $O(T^2)$ 复杂度爆炸&lt;/li&gt;
&lt;li&gt;字符本身语义信息太少，模型难以学习&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;方案3子词级别subword-level-bpe-的目标&#34;&gt;方案3：子词级别（Subword-level）—— BPE 的目标&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;unhappiness&amp;#34; → [&amp;#34;un&amp;#34;, &amp;#34;happi&amp;#34;, &amp;#34;ness&amp;#34;]   ← 有意义的子词单元
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>KV Cache 笔记</title>
      <link>https://afan.ml/posts/k-v-cache/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/k-v-cache/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：KV Cache 是推理时把已经算过的 Key 和 Value 缓存起来，避免每生成一个新 token 都重复计算历史 token 的 K/V，是大模型推理加速的核心技术。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要-kv-cache&#34;&gt;一、为什么需要 KV Cache？&lt;/h2&gt;
&lt;h3 id=&#34;大模型生成-token-的方式自回归auto-regressive&#34;&gt;大模型生成 token 的方式：自回归（Auto-regressive）&lt;/h3&gt;
&lt;p&gt;大模型生成文本是&lt;strong&gt;一个 token 一个 token 地生成&lt;/strong&gt;的，每次生成下一个 token 时，都要把&lt;strong&gt;所有历史 token&lt;/strong&gt; 作为输入重新过一遍 Transformer。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入：  &amp;#34;今天天气&amp;#34;
生成：  &amp;#34;今天天气&amp;#34; → &amp;#34;很&amp;#34;
生成：  &amp;#34;今天天气很&amp;#34; → &amp;#34;好&amp;#34;
生成：  &amp;#34;今天天气很好&amp;#34; → &amp;#34;！&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每一步生成，Attention 都要计算：&lt;/p&gt;
&lt;p&gt;$$
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
$$&lt;/p&gt;
&lt;p&gt;其中 Q、K、V 都来自&lt;strong&gt;当前所有 token&lt;/strong&gt;（包括历史的）。&lt;/p&gt;
&lt;h3 id=&#34;没有-kv-cache-时的重复计算&#34;&gt;没有 KV Cache 时的重复计算&lt;/h3&gt;
&lt;p&gt;假设已经生成了 t 个 token，现在要生成第 t+1 个：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;第1步生成&amp;#34;很&amp;#34;：
  对 token [&amp;#34;今&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;气&amp;#34;] 全部计算 K、V
  → K = [K_今, K_天, K_天, K_气]
  → V = [V_今, V_天, V_天, V_气]

第2步生成&amp;#34;好&amp;#34;：
  对 token [&amp;#34;今&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;气&amp;#34;,&amp;#34;很&amp;#34;] 全部计算 K、V
  → K = [K_今, K_天, K_天, K_气, K_很]   ← 前4个和上一步完全一样！
  → V = [V_今, V_天, V_天, V_气, V_很]   ← 前4个和上一步完全一样！

第3步生成&amp;#34;！&amp;#34;：
  对 token [&amp;#34;今&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;天&amp;#34;,&amp;#34;气&amp;#34;,&amp;#34;很&amp;#34;,&amp;#34;好&amp;#34;] 全部计算 K、V
  → 前5个 K/V 和上一步完全一样！
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;历史 token 的 K/V 每次都重新算，纯属浪费。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linear Attention（线性注意力）笔记</title>
      <link>https://afan.ml/posts/linear-attention/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/linear-attention/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：标准 Attention 的复杂度是 $O(N^2)$，Linear Attention 通过改变计算顺序，把复杂度降到 $O(N)$，代价是用核函数近似替代 softmax，牺牲了一定的表达能力，但换来了推理时的递推形式（类似 RNN），天然支持无限长序列。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一问题背景标准-attention-的瓶颈&#34;&gt;一、问题背景：标准 Attention 的瓶颈&lt;/h2&gt;
&lt;p&gt;标准 Attention 的计算：&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$&lt;/p&gt;
&lt;p&gt;序列长度为 $N$ 时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算 $QK^T$ 需要 $O(N^2)$ 时间和空间&lt;/li&gt;
&lt;li&gt;中间的 $N \times N$ 注意力矩阵需要 $O(N^2)$ 显存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;后果&lt;/strong&gt;：序列长度翻倍，计算量翻 4 倍，显存翻 4 倍。长序列（如 100K token）几乎不可能用标准 Attention。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二核心思想改变计算顺序&#34;&gt;二、核心思想：改变计算顺序&lt;/h2&gt;
&lt;h3 id=&#34;标准-attention-的计算顺序&#34;&gt;标准 Attention 的计算顺序&lt;/h3&gt;
&lt;p&gt;$$\text{out} = \underbrace{\text{softmax}(QK^T)}_{\text{先算这个，}N \times N \text{ 矩阵}} V$$&lt;/p&gt;
&lt;p&gt;必须先把完整的 $N \times N$ 矩阵算出来，才能乘以 $V$。&lt;/p&gt;
&lt;h3 id=&#34;linear-attention-的关键洞察&#34;&gt;Linear Attention 的关键洞察&lt;/h3&gt;
&lt;p&gt;如果去掉 softmax，矩阵乘法满足结合律：&lt;/p&gt;
&lt;p&gt;$$\text{out} = (QK^T) V = Q \underbrace{(K^T V)}_{\text{先算这个，}d \times d \text{ 矩阵}}$$&lt;/p&gt;</description>
    </item>
    <item>
      <title>LoRA / QLoRA / Unsloth 微调笔记</title>
      <link>https://afan.ml/posts/lo-r-a--q-lo-r-a-%E5%BE%AE%E8%B0%83/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/lo-r-a--q-lo-r-a-%E5%BE%AE%E8%B0%83/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：LoRA 用低秩矩阵大幅减少微调参数量；QLoRA 在此基础上把基础模型量化到 4bit，让消费级 GPU 能微调 70B 模型；Unsloth 是工程加速库，把整个流程再提速 2-5×。三者是层层叠加的关系。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要参数高效微调peft&#34;&gt;一、为什么需要参数高效微调（PEFT）？&lt;/h2&gt;
&lt;p&gt;全量微调（Full Fine-tuning）的问题：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GPT-3（175B 参数）全量微调：
  - 参数量：175B × 4 bytes（FP32）= 700 GB 显存
  - 梯度：再 × 1 = 700 GB
  - 优化器状态（Adam）：再 × 2 = 1400 GB
  - 合计：约 2800 GB 显存 → 需要 35 张 A100（80GB）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;核心矛盾&lt;/strong&gt;：预训练模型越来越大，但大多数下游任务只需要微调模型的&amp;quot;方向&amp;quot;，不需要改变所有参数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参数高效微调（PEFT）&lt;/strong&gt; 的思路：&lt;strong&gt;冻结大部分参数，只训练少量新增参数&lt;/strong&gt;，效果接近全量微调，但显存和计算量大幅减少。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二lora低秩适配low-rank-adaptation&#34;&gt;二、LoRA：低秩适配（Low-Rank Adaptation）&lt;/h2&gt;
&lt;h3 id=&#34;核心思想&#34;&gt;核心思想&lt;/h3&gt;
&lt;p&gt;LoRA（2021，微软）的关键洞察：&lt;strong&gt;预训练模型的权重更新矩阵是低秩的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;全量微调时，权重更新为：&lt;/p&gt;
&lt;p&gt;$$W&amp;rsquo; = W_0 + \Delta W$$&lt;/p&gt;
&lt;p&gt;其中 $W_0 \in \mathbb{R}^{d \times k}$ 是预训练权重，$\Delta W$ 是更新量。&lt;/p&gt;
&lt;p&gt;LoRA 假设 $\Delta W$ 是低秩的，用两个小矩阵的乘积来近似：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mamba / SSM（状态空间模型）笔记</title>
      <link>https://afan.ml/posts/mamba--s-s-m/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/mamba--s-s-m/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：Mamba 是 Linear Attention 的&amp;quot;升级版&amp;quot;——同样是 $O(N)$ 复杂度、固定大小隐状态，但通过&lt;strong&gt;选择性机制（Selective SSM）&lt;/strong&gt; 让模型能动态决定&amp;quot;记住什么、忘记什么&amp;quot;，效果接近 Transformer，推理速度接近 RNN。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一从-linear-attention-到-mamba解决什么问题&#34;&gt;一、从 Linear Attention 到 Mamba：解决什么问题？&lt;/h2&gt;
&lt;p&gt;回顾 Linear Attention 的递推公式：&lt;/p&gt;
&lt;p&gt;$$S_t = S_{t-1} + \phi(k_t) v_t^T$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：衰减是固定的（没有衰减，或者 RetNet 里用固定的 $\gamma$），模型无法根据输入内容动态决定&amp;quot;这个历史信息重不重要&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;RNN（LSTM）：有遗忘门，可以选择性地清除历史
Linear Attention：没有遗忘门，历史信息只增不减，全部堆进 S 矩阵
RetNet：有固定衰减 γ，但 γ 是超参数，不随输入变化
Mamba：衰减因子由输入动态生成，每个 token 的&amp;#34;遗忘程度&amp;#34;不同
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;二ssm-的数学基础&#34;&gt;二、SSM 的数学基础&lt;/h2&gt;
&lt;p&gt;Mamba 基于&lt;strong&gt;状态空间模型（State Space Model，SSM）&lt;/strong&gt;，这是控制论里的经典框架。&lt;/p&gt;
&lt;h3 id=&#34;连续时间-ssm&#34;&gt;连续时间 SSM&lt;/h3&gt;
&lt;p&gt;$$h&amp;rsquo;(t) = A h(t) + B x(t)$$
$$y(t) = C h(t)$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x(t)$：输入信号&lt;/li&gt;
&lt;li&gt;$h(t)$：隐状态（类比 RNN 的 hidden state）&lt;/li&gt;
&lt;li&gt;$y(t)$：输出&lt;/li&gt;
&lt;li&gt;$A$：状态转移矩阵（控制历史信息如何演化）&lt;/li&gt;
&lt;li&gt;$B$：输入投影矩阵（控制输入如何影响隐状态）&lt;/li&gt;
&lt;li&gt;$C$：输出投影矩阵（控制隐状态如何映射到输出）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;离散化实际使用的形式&#34;&gt;离散化（实际使用的形式）&lt;/h3&gt;
&lt;p&gt;连续 SSM 需要离散化才能用于序列建模，使用&lt;strong&gt;零阶保持（ZOH）&lt;/strong&gt; 方法：&lt;/p&gt;</description>
    </item>
    <item>
      <title>MoE（Mixture of Experts）混合专家模型笔记</title>
      <link>https://afan.ml/posts/mo-e%E6%B7%B7%E5%90%88%E4%B8%93%E5%AE%B6%E6%A8%A1%E5%9E%8B/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/mo-e%E6%B7%B7%E5%90%88%E4%B8%93%E5%AE%B6%E6%A8%A1%E5%9E%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：MoE 是对 Transformer 中 FFN 层的改进——把一个 FFN 替换成多个并行的&amp;quot;专家&amp;quot;FFN，每个 token 只激活其中少数几个专家，从而在&lt;strong&gt;不增加计算量&lt;/strong&gt;的前提下大幅扩展模型参数量。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一问题背景dense-模型扩参数的代价&#34;&gt;一、问题背景：Dense 模型扩参数的代价&lt;/h2&gt;
&lt;p&gt;标准 Transformer（Dense 模型）每个 token 都要经过所有参数：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;参数量翻倍 → 计算量翻倍 → 训练/推理成本翻倍
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;想要更强的模型，就必须付出更高的计算代价。有没有办法&lt;strong&gt;让参数量和计算量解耦&lt;/strong&gt;？&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二核心思想条件计算conditional-computation&#34;&gt;二、核心思想：条件计算（Conditional Computation）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;不是每个 token 都需要用到所有知识，让不同的 token 走不同的&amp;quot;专家&amp;quot;路径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MoE 的核心设计：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;把 FFN 层替换成 N 个并行的专家 FFN
每个 token 由一个路由器（Router）决定激活哪 K 个专家
只有被选中的专家才参与计算，其余专家跳过
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;总参数量 = N 个专家的参数之和（很大）&lt;/li&gt;
&lt;li&gt;每次计算量 = 只激活 K 个专家（很小）&lt;/li&gt;
&lt;li&gt;参数量和计算量&lt;strong&gt;不再线性绑定&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三结构对比&#34;&gt;三、结构对比&lt;/h2&gt;
&lt;h3 id=&#34;dense-ffn原始&#34;&gt;Dense FFN（原始）&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入 x（形状：[seq_len, d_model]）
  ↓
FFN（W_gate, W_up, W_down）
  ↓
输出（形状：[seq_len, d_model]）
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;moe-ffn替换后&#34;&gt;MoE FFN（替换后）&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入 x（形状：[seq_len, d_model]）
  ↓
Router（路由器）：为每个 token 计算各专家的得分，选出 Top-K
  ↓
并行调用被选中的 K 个专家 FFN
  ↓
按路由权重加权求和，合并输出
  ↓
输出（形状：[seq_len, d_model]）← 形状和 Dense FFN 完全一致
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Attention 层不变，只有 FFN 层被替换成 MoE。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Multi-Head Attention（MHA）多头注意力笔记</title>
      <link>https://afan.ml/posts/m-h-a-%E5%A4%9A%E5%A4%B4%E6%B3%A8%E6%84%8F%E5%8A%9B%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/m-h-a-%E5%A4%9A%E5%A4%B4%E6%B3%A8%E6%84%8F%E5%8A%9B%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;前置知识：已了解 Self-Attention（自注意力）。
MHA 的本质：&lt;strong&gt;把 Self-Attention 并行做多次，每次关注不同的语义子空间，最后合并结果。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要多头self-attention-有什么不足&#34;&gt;一、为什么需要多头？Self-Attention 有什么不足？&lt;/h2&gt;
&lt;p&gt;单头 Self-Attention 每次只能学到一种&amp;quot;关注模式&amp;quot;。例如：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;句子：&amp;#34;The animal didn&amp;#39;t cross the street because it was too tired&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;头1 可能学到：&lt;code&gt;it&lt;/code&gt; → &lt;code&gt;animal&lt;/code&gt;（指代关系）&lt;/li&gt;
&lt;li&gt;头2 可能学到：&lt;code&gt;tired&lt;/code&gt; → &lt;code&gt;animal&lt;/code&gt;（状态描述）&lt;/li&gt;
&lt;li&gt;头3 可能学到：&lt;code&gt;cross&lt;/code&gt; → &lt;code&gt;street&lt;/code&gt;（动作与地点）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;单头只能同时关注一种模式，多头让模型在不同子空间里并行捕捉多种关系。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二mha-整体结构&#34;&gt;二、MHA 整体结构&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入 X
  │
  ├──→ 线性投影 W_Q^1 → Q1 ─┐
  ├──→ 线性投影 W_K^1 → K1 ─┤→ Attention(Q1,K1,V1) → head_1 ─┐
  ├──→ 线性投影 W_V^1 → V1 ─┘                                   │
  │                                                              │
  ├──→ 线性投影 W_Q^2 → Q2 ─┐                                   │
  ├──→ 线性投影 W_K^2 → K2 ─┤→ Attention(Q2,K2,V2) → head_2 ─┤→ Concat → 线性投影 W_O → 输出
  ├──→ 线性投影 W_V^2 → V2 ─┘                                   │
  │                                                              │
  ├──→ ...（共 h 个头）                                          │
  │                                                              │
  └──→ 线性投影 W_Q^h → Qh ─┐                                   │
      线性投影 W_K^h → Kh ─┤→ Attention(Qh,Kh,Vh) → head_h ─┘
      线性投影 W_V^h → Vh ─┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;三完整公式&#34;&gt;三、完整公式&lt;/h2&gt;
&lt;h3 id=&#34;单头-scaled-dot-product-attention回顾&#34;&gt;单头 Scaled Dot-Product Attention（回顾）&lt;/h3&gt;
&lt;p&gt;$$
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
$$&lt;/p&gt;</description>
    </item>
    <item>
      <title>优化器（Optimizer）笔记</title>
      <link>https://afan.ml/posts/%E4%BC%98%E5%8C%96%E5%99%A8-optimizer/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/%E4%BC%98%E5%8C%96%E5%99%A8-optimizer/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：优化器决定&amp;quot;用梯度怎么更新参数&amp;quot;。从最朴素的 SGD，到加了动量的 SGD Momentum，再到自适应学习率的 Adam/AdamW，每一步改进都在解决上一代的具体问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一梯度下降的基本框架&#34;&gt;一、梯度下降的基本框架&lt;/h2&gt;
&lt;p&gt;所有优化器的核心都是：&lt;/p&gt;
&lt;p&gt;$$\theta_{t+1} = \theta_t - \text{update}(g_t)$$&lt;/p&gt;
&lt;p&gt;其中 $g_t = \nabla_\theta \mathcal{L}$ 是当前 batch 的梯度，不同优化器只是 $\text{update}$ 的计算方式不同。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三种梯度下降变体&lt;/strong&gt;（按 batch 大小区分）：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;批量梯度下降（BGD）：  用全部数据算梯度，准确但极慢
随机梯度下降（SGD）：  用 1 条数据算梯度，快但噪声大
小批量梯度下降（MSGD）：用 mini-batch 算梯度，实践中的标准做法
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现代所有&amp;quot;SGD&amp;quot;都指小批量梯度下降。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二sgd最朴素的优化器&#34;&gt;二、SGD：最朴素的优化器&lt;/h2&gt;
&lt;p&gt;$$\theta_{t+1} = \theta_t - \eta \cdot g_t$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\eta$：学习率（步长）&lt;/li&gt;
&lt;li&gt;$g_t$：当前 mini-batch 的梯度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&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;strong&gt;容易卡在鞍点&lt;/strong&gt;：梯度为零但不是极值点&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三sgd--momentum加入惯性&#34;&gt;三、SGD + Momentum：加入惯性&lt;/h2&gt;
&lt;p&gt;$$v_t = \beta \cdot v_{t-1} + g_t$$
$$\theta_{t+1} = \theta_t - \eta \cdot v_t$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$v_t$：速度（历史梯度的指数加权平均）&lt;/li&gt;
&lt;li&gt;$\beta$：动量系数，通常为 0.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;直觉&lt;/strong&gt;：像一个球滚下山坡，历史的速度会叠加到当前更新上。&lt;/p&gt;</description>
    </item>
    <item>
      <title>位置编码（Positional Encoding）笔记</title>
      <link>https://afan.ml/posts/%E4%BD%8D%E7%BD%AE%E7%BC%96%E7%A0%81-positional-encoding/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/%E4%BD%8D%E7%BD%AE%E7%BC%96%E7%A0%81-positional-encoding/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：Transformer 的 Attention 对输入顺序无感知，位置编码负责把&amp;quot;第几个 token&amp;quot;这个信息注入模型。从固定正弦函数到可学习参数，再到当前主流的旋转编码（RoPE），每一代都在解决上一代的长度外推问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要位置编码&#34;&gt;一、为什么需要位置编码？&lt;/h2&gt;
&lt;p&gt;RNN 逐步处理序列，天然感知顺序。Transformer 并行处理所有 token，Attention 本质是&lt;strong&gt;集合操作&lt;/strong&gt;，对顺序完全无感：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[&amp;#34;我&amp;#34;, &amp;#34;爱&amp;#34;, &amp;#34;你&amp;#34;]  和  [&amp;#34;你&amp;#34;, &amp;#34;爱&amp;#34;, &amp;#34;我&amp;#34;]
→ Attention 看到的是完全相同的三个向量集合，无法区分
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;必须手动把位置信息注入模型，这就是位置编码的作用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二发展历程简览&#34;&gt;二、发展历程（简览）&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;时间&lt;/th&gt;
          &lt;th&gt;方案&lt;/th&gt;
          &lt;th&gt;代表模型&lt;/th&gt;
          &lt;th&gt;核心问题&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;2017&lt;/td&gt;
          &lt;td&gt;Sinusoidal PE（正弦固定编码）&lt;/td&gt;
          &lt;td&gt;原版 Transformer&lt;/td&gt;
          &lt;td&gt;外推效果差，只有绝对位置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2018&lt;/td&gt;
          &lt;td&gt;Learned PE（可学习编码）&lt;/td&gt;
          &lt;td&gt;BERT、GPT-2&lt;/td&gt;
          &lt;td&gt;硬性长度上限，超出训练长度就失效&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2019&lt;/td&gt;
          &lt;td&gt;Relative PE（相对位置编码）&lt;/td&gt;
          &lt;td&gt;Transformer-XL、T5&lt;/td&gt;
          &lt;td&gt;实现复杂，外推仍有限&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2021&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;RoPE（旋转位置编码）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;LLaMA、Qwen、DeepSeek&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;当前主流&lt;/strong&gt; ✅&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2022&lt;/td&gt;
          &lt;td&gt;ALiBi（线性偏置）&lt;/td&gt;
          &lt;td&gt;MPT&lt;/td&gt;
          &lt;td&gt;强制近距离偏好，长程依赖受损&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三前三代简述&#34;&gt;三、前三代简述&lt;/h2&gt;
&lt;h3 id=&#34;sinusoidal-pe2017&#34;&gt;Sinusoidal PE（2017）&lt;/h3&gt;
&lt;p&gt;用不同频率的正弦/余弦函数生成固定位置向量，直接加到 token embedding 上：&lt;/p&gt;
&lt;p&gt;$$PE_{(pos,\ 2i)} = \sin!\left(\frac{pos}{10000^{2i/d_{model}}}\right), \quad PE_{(pos,\ 2i+1)} = \cos!\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：无需训练，参数量为 0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：超出训练长度后效果急剧下降，只有绝对位置信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;learned-pe2018&#34;&gt;Learned PE（2018）&lt;/h3&gt;
&lt;p&gt;把位置编码当成普通 Embedding 参数，随模型一起训练（BERT 最大 512，GPT-2 最大 1024）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>残差网络（ResNet）笔记</title>
      <link>https://afan.ml/posts/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C-res-net/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C-res-net/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：残差网络通过在层与层之间添加&amp;quot;跳跃连接&amp;quot;（Skip Connection），让网络学习输入与输出的&lt;strong&gt;差值&lt;/strong&gt;而非完整映射，从而解决深层网络的梯度消失和退化问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一问题背景深层网络为什么会退化&#34;&gt;一、问题背景：深层网络为什么会退化？&lt;/h2&gt;
&lt;p&gt;直觉上，更深的网络应该更强——至少多出来的层可以学成&amp;quot;什么都不做&amp;quot;（恒等映射）。&lt;/p&gt;
&lt;p&gt;但实验发现：&lt;strong&gt;网络越深，训练误差反而越大&lt;/strong&gt;，不是过拟合，是训练本身就失败了。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;20层网络的训练误差  &amp;lt;  56层网络的训练误差   ← 这不正常！
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;根本原因：梯度消失&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;反向传播时，梯度要经过几十层连乘。每层梯度都小于 1，连乘后趋近于 0，浅层几乎学不到任何东西。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二核心思想学差值而不是学完整映射&#34;&gt;二、核心思想：学&amp;quot;差值&amp;quot;而不是学&amp;quot;完整映射&amp;quot;&lt;/h2&gt;
&lt;h3 id=&#34;原来的目标&#34;&gt;原来的目标&lt;/h3&gt;
&lt;p&gt;让网络直接学习从输入到输出的完整映射：&lt;/p&gt;
&lt;p&gt;$$H(x) = \text{网络想要的输出}$$&lt;/p&gt;
&lt;h3 id=&#34;残差的目标&#34;&gt;残差的目标&lt;/h3&gt;
&lt;p&gt;把目标拆成两部分：&lt;/p&gt;
&lt;p&gt;$$H(x) = F(x) + x$$&lt;/p&gt;
&lt;p&gt;其中 $F(x) = H(x) - x$ 就是&lt;strong&gt;残差&lt;/strong&gt;（输出和输入的差值），网络只需要学 $F(x)$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么这样更容易学？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果这一层什么都不需要做（恒等映射），只需让 $F(x) \to 0$，把权重归零即可&lt;/li&gt;
&lt;li&gt;让网络直接学 $H(x) = x$ 要难得多——它需要精确拟合一个恒等函数&lt;/li&gt;
&lt;li&gt;学&amp;quot;微小的修正量&amp;quot;比学&amp;quot;完整的变换&amp;quot;容易得多&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三结构图&#34;&gt;三、结构图&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入 x
  │
  ├──────────────────────────┐  ← shortcut（跳跃连接，直接复制 x）
  │                          │
  ▼                          │
Conv → BN → ReLU             │
  ▼                          │
Conv → BN                    │
  │                          │
  └──────────── + ───────────┘  ← 相加（不是拼接！）
                │
              ReLU
                │
             输出 H(x) = F(x) + x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键细节&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>重要性采样（Importance Sampling）笔记</title>
      <link>https://afan.ml/posts/%E9%87%8D%E8%A6%81%E6%80%A7%E9%87%87%E6%A0%B7-importance-sampling/</link>
      <pubDate>Tue, 12 May 2026 05:30:56 +0000</pubDate>
      <guid>https://afan.ml/posts/%E9%87%8D%E8%A6%81%E6%80%A7%E9%87%87%E6%A0%B7-importance-sampling/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：计算期望本质是计算积分，积分算不了就用采样均值代替，均匀采样浪费在无效区域导致方差大，重要性采样换一个&amp;quot;聪明的分布 q&amp;quot;集中采有效区域，再用权重 p/q 修正偏差，保证结果无偏且方差更小。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要重要性采样&#34;&gt;一、为什么需要重要性采样？&lt;/h2&gt;
&lt;h3 id=&#34;计算期望--计算积分&#34;&gt;计算期望 = 计算积分&lt;/h3&gt;
&lt;p&gt;$$\mathbb{E}_p[f(x)] = \int f(x) \cdot p(x) , dx$$&lt;/p&gt;
&lt;p&gt;很多场景这个积分&lt;strong&gt;没有解析解&lt;/strong&gt;，无法直接用数学公式算：&lt;/p&gt;
&lt;ul&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;strong&gt;采样代价高&lt;/strong&gt;：强化学习里从新策略采样需要重新跑环境，代价极高&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时只能用&lt;strong&gt;蒙特卡洛方法&lt;/strong&gt;：采样求均值代替积分。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二蒙特卡洛采样求均值&#34;&gt;二、蒙特卡洛：采样求均值&lt;/h2&gt;
&lt;p&gt;从分布 $p$ 采 $N$ 个样本，用样本均值估计期望：&lt;/p&gt;
&lt;p&gt;$$\mathbb{E}&lt;em&gt;p[f(x)] \approx \frac{1}{N} \sum&lt;/em&gt;{i=1}^{N} f(x_i), \quad x_i \sim p$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：如果直接从 $p$ 采样很难（或代价高），或者均匀采样导致大量样本浪费在 $f(x) \approx 0$ 的区域，方差就会很大。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;估算 P(x &amp;gt; 4)，x ~ N(0,1)：
均匀采样 100 万个点，平均只有 31 个落在 x&amp;gt;4
→ 99.997% 的样本对结果没有贡献，方差极大
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;三重要性采样换一个更好的分布&#34;&gt;三、重要性采样：换一个更好的分布&lt;/h2&gt;
&lt;h3 id=&#34;核心公式&#34;&gt;核心公式&lt;/h3&gt;
&lt;p&gt;从另一个容易采样的分布 $q$ 采样，用权重修正偏差：&lt;/p&gt;
&lt;p&gt;$$\mathbb{E}_p[f(x)] = \mathbb{E}&lt;em&gt;q\left[f(x) \cdot \frac{p(x)}{q(x)}\right] \approx \frac{1}{N} \sum&lt;/em&gt;{i=1}^{N} f(x_i) \cdot \frac{p(x_i)}{q(x_i)}, \quad x_i \sim q$$&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
