<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>数学基础 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 01 Nov 2025 11:16:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《深度学习的数学》核心算法学习总结：从梯度下降到 CNN 反向传播（中学生友好版）</title>
      <link>https://ftmao.com/blog/posts/deep-learning-math-core-algorithms/</link>
      <pubDate>Sat, 01 Nov 2025 11:16:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/deep-learning-math-core-algorithms/</guid>
      <description>&lt;h1 id=&#34;深度学习的数学核心算法学习总结&#34;&gt;《深度学习的数学》核心算法学习总结&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;目标读者：学过函数、导数、向量/矩阵基础的中学生生或刚转行的工程师。&lt;br&gt;
参考书籍：涌井良幸《深度学习的数学》&lt;br&gt;
Excel 示例：&lt;code&gt;https://www.ituring.com.cn/book/2593&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在前面为什么要先搞懂这-5-个算法&#34;&gt;写在前面：为什么要先搞懂这 5 个算法？&lt;/h2&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;NN 求解器&lt;/strong&gt;：用 Excel/数值方法直接“暴力”找出神经网络权重。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NN 误差反向传播法&lt;/strong&gt;：用导数的链式法则高效计算每个权重的调整量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CNN 求解器&lt;/strong&gt;：把同样的思路用到图像上，用卷积和池化提取特征。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CNN 误差反向传播法&lt;/strong&gt;：把反向传播扩展到卷积层和池化层。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面每一节都会先讲直觉，再给公式、例子、图解和踩坑经验。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一梯度下降法gradient-descent&#34;&gt;一、梯度下降法（Gradient Descent）&lt;/h2&gt;
&lt;h3 id=&#34;11-一句话理解&#34;&gt;1.1 一句话理解&lt;/h3&gt;
&lt;p&gt;想象你蒙着眼睛站在山坡上，想走到最低点。你每一步都：&lt;strong&gt;用脚感觉最陡的方向，然后朝相反方向跨一小步&lt;/strong&gt;。重复很多次，就能接近山谷。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“最陡的方向” = 梯度（gradient）。&lt;/li&gt;
&lt;li&gt;“相反方向” = 梯度前面加负号。&lt;/li&gt;
&lt;li&gt;“一小步” = 学习率 η（eta）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;12-数学表达式&#34;&gt;1.2 数学表达式&lt;/h3&gt;
&lt;p&gt;要找函数 $z = f(x, y)$ 的最小值，每一步：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
x_{\text{新}} &amp;amp;= x_{\text{旧}} - \eta \cdot \frac{\partial z}{\partial x} \\
y_{\text{新}} &amp;amp;= y_{\text{旧}} - \eta \cdot \frac{\partial z}{\partial y}
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;其中 $\frac{\partial z}{\partial x}$ 读作“z 对 x 的偏导数”，意思是：&lt;strong&gt;只有 x 动一点点时，z 会变多少&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;13-计算例子z--x--y&#34;&gt;1.3 计算例子：z = x² + y²&lt;/h3&gt;
&lt;p&gt;这是最简单的碗状函数，最小值在 $(0, 0)$。&lt;/p&gt;
&lt;p&gt;偏导数很容易算：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\frac{\partial z}{\partial x} &amp;amp;= 2x \\
\frac{\partial z}{\partial y} &amp;amp;= 2y
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;取学习率 $\eta = 0.1$，起点 $(3, 2)$：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;步数 $i$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$x_i$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$y_i$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$\frac{\partial z}{\partial x}$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$\frac{\partial z}{\partial y}$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$\Delta x$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$\Delta y$&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;$z = x^2 + y^2$&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;6.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;4.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.60&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.40&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;13.00&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.40&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.60&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;4.80&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3.20&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.48&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.32&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;8.32&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.92&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.28&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3.84&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.56&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.38&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.26&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;5.32&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.54&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.02&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3.07&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.05&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.31&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.20&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3.41&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;4&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.23&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.82&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.46&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;1.64&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.25&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.16&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2.18&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;13&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.16&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.11&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.33&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.22&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.03&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.02&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.04&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;18&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.05&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.04&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.11&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.07&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.01&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;-0.01&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;30&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.01&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;0.00&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;可以看到：z 越来越小，x、y 越来越靠近 0。Excel 文件 &lt;code&gt;2-11 梯度下降法.xlsx&lt;/code&gt; 就是用完全相同的公式做出来的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;14-流程图&#34;&gt;1.4 流程图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[初始化参数 x, y] --&amp;gt; B[计算当前梯度]
    B --&amp;gt; C{梯度是否足够小？}
    C --&amp;gt;|是| D[结束，得到近似最优解]
    C --&amp;gt;|否| E[按 x := x - η·grad 更新]
    E --&amp;gt; B&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;15-结构分解图&#34;&gt;1.5 结构分解图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 输入
        X[&amp;#34;x&amp;#34;]
        Y[&amp;#34;y&amp;#34;]
    end
    subgraph 目标函数
        F[&amp;#34;z = x² + y²&amp;#34;]
    end
    subgraph 输出
        G[&amp;#34;梯度 (∂z/∂x, ∂z/∂y)&amp;#34;]
        L[&amp;#34;当前损失 z&amp;#34;]
    end
    X --&amp;gt; F
    Y --&amp;gt; F
    F --&amp;gt; G
    F --&amp;gt; L
    G --&amp;gt; U[&amp;#34;更新 x, y&amp;#34;]
    U --&amp;gt; X&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;16-使用注意点--避坑指南&#34;&gt;1.6 使用注意点 / 避坑指南&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;坑&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;现象&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;处理方法&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;学习率 η 太大&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;左右震荡、loss 不下降甚至发散到 NaN&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;先设小一点（如 0.001、0.01），再调大&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;学习率 η 太小&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;收敛极慢，训练一万轮还在原地&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;逐步放大，或使用学习率衰减/热身&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;局部最小值&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;卡在不是全局最低的山谷&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;换初始化、用 Momentum/Adam、增加随机性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;特征尺度不一致&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;某个参数梯度特别大，更新不稳定&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;先标准化/归一化输入数据&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;没有检查收敛&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一直在迭代，不知道何时停&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;设定 loss 阈值、最大迭代次数或早停 Early Stopping&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;17-异常场景处理&#34;&gt;1.7 异常场景处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Loss 变成 NaN/Inf&lt;/strong&gt;：立刻减小学习率，检查输入是否归一化，检查是否出现 &lt;code&gt;log(0)&lt;/code&gt; 或除零。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loss 不动&lt;/strong&gt;：检查梯度是否接近 0（可能进入平台或死区），换激活函数（如 ReLU），或减少正则化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loss 震荡不下降&lt;/strong&gt;：学习率过大，改用 Momentum 或 Adam，或者降低 batch size。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二nn-求解器用优化器求解器训练神经网络&#34;&gt;二、NN 求解器（用优化器/求解器训练神经网络）&lt;/h2&gt;
&lt;h3 id=&#34;21-神经网络在做什么&#34;&gt;2.1 神经网络在做什么？&lt;/h3&gt;
&lt;p&gt;神经网络 = 很多层“加权求和 + 激活函数”拼在一起。&lt;/p&gt;
&lt;p&gt;以书中“0 和 1 的识别”为例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：3×4 = 12 个像素（0 或 1）。&lt;/li&gt;
&lt;li&gt;隐藏层：3 个神经元。&lt;/li&gt;
&lt;li&gt;输出层：2 个神经元，分别代表“是 0”还是“是 1”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面就是它的经典结构图：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 输入层[&amp;#34;输入层（12 个像素）&amp;#34;]
        I1((x₁))
        I2((x₂))
        I3((x₃))
        IDOTS[...]
        I12((x₁₂))
    end
    subgraph 隐藏层[&amp;#34;隐藏层（3 个神经元）&amp;#34;]
        H1((h₁))
        H2((h₂))
        H3((h₃))
    end
    subgraph 输出层[&amp;#34;输出层（2 个神经元）&amp;#34;]
        O1((是 0))
        O2((是 1))
    end

    I1 --&amp;gt; H1
    I1 --&amp;gt; H2
    I1 --&amp;gt; H3
    I2 --&amp;gt; H1
    I2 --&amp;gt; H2
    I2 --&amp;gt; H3
    I3 --&amp;gt; H1
    I3 --&amp;gt; H2
    I3 --&amp;gt; H3
    I12 --&amp;gt; H1
    I12 --&amp;gt; H2
    I12 --&amp;gt; H3

    H1 --&amp;gt; O1
    H1 --&amp;gt; O2
    H2 --&amp;gt; O1
    H2 --&amp;gt; O2
    H3 --&amp;gt; O1
    H3 --&amp;gt; O2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;每个箭头都代表一个权重 &lt;code&gt;w&lt;/code&gt;，每个圆圈（神经元）里都会做“加权求和 + 激活函数”。&lt;/p&gt;
&lt;h3 id=&#34;22-前向传播公式&#34;&gt;2.2 前向传播公式&lt;/h3&gt;
&lt;p&gt;对单个神经元：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\text{加权求和：} \quad z &amp;amp;= w_1 x_1 + w_2 x_2 + \dots + w_n x_n + b \\
\text{激活输出：} \quad a &amp;amp;= \sigma(z) = \frac{1}{1 + e^{-z}}
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;&lt;code&gt;σ&lt;/code&gt; 叫 Sigmoid 函数，能把任意实数压到 0-1 之间，适合当“概率”。&lt;/p&gt;
&lt;p&gt;如果写成更清晰的“层”形式：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;隐藏层第 j 个神经元&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z_j^{(2)} &amp;amp;= \sum_{i=1}^{12} w_{ji}^{(1)} \cdot x_i + b_j^{(1)} \\
a_j^{(2)} &amp;amp;= \sigma\left(z_j^{(2)}\right)
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;输出层第 k 个神经元&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z_k^{(3)} &amp;amp;= \sum_{j=1}^{3} w_{kj}^{(2)} \cdot a_j^{(2)} + b_k^{(3)} \\
a_k^{(3)} &amp;amp;= \sigma\left(z_k^{(3)}\right)
\end{aligned}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x_i$：输入像素（12 个）。&lt;/li&gt;
&lt;li&gt;$w_{ji}^{(1)}$：输入到隐藏层的权重。&lt;/li&gt;
&lt;li&gt;$b_j^{(1)}$：隐藏层的偏置。&lt;/li&gt;
&lt;li&gt;$a_j^{(2)}$：隐藏层输出。&lt;/li&gt;
&lt;li&gt;$w_{kj}^{(2)}$：隐藏层到输出层的权重。&lt;/li&gt;
&lt;li&gt;$b_k^{(3)}$：输出层的偏置。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-excel-里的实现测试表&#34;&gt;2.3 Excel 里的实现（测试表）&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;3-5 NN（求解器）.xlsx&lt;/code&gt; 的“测试”表中，核心公式长这样：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-excel&#34; data-lang=&#34;excel&#34;&gt;# 隐藏层第一个神经元
=SUMPRODUCT(L5:N8, $D$5:$F$8) + $G$5

# Sigmoid 激活
=1/(1+EXP(-O11))

# 输出层
=MMULT($D$17:$F$17, O14:O16) + $G$17&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;对应上面的数学公式：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;Excel 公式&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;数学含义&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;Excel 函数说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;SUMPRODUCT(L5:N8, $D$5:$F$8)&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;$\sum_{i=1}^{12} w_i \cdot x_i$&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;把两个区域里&lt;strong&gt;对应位置相乘，再把所有乘积加起来&lt;/strong&gt;，本质就是向量的&lt;strong&gt;点积/内积&lt;/strong&gt;。这里输入像素放在 &lt;code&gt;L5:N8&lt;/code&gt;，对应权重放在 &lt;code&gt;$D$5:$F$8&lt;/code&gt;。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;+ $G$5&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;$+ b_j^{(1)}$&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;加上隐藏层第 1 个神经元的偏置。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;1/(1+EXP(-O11))&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;$\sigma(z) = \frac{1}{1 + e^{-z}}$&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Sigmoid 激活函数。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;MMULT($D$17:$F$17, O14:O16)&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;$\sum_{j=1}^{3} w_{kj}^{(2)} \cdot a_j^{(2)}$&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;矩阵乘法&lt;/strong&gt;。&lt;code&gt;$D$17:$F$17&lt;/code&gt; 是 1×3 的输出行权重，&lt;code&gt;O14:O16&lt;/code&gt; 是 3×1 的隐藏层输出列向量，乘出来是一个标量。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;+ $G$17&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;$+ b_k^{(3)}$&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;加上输出层第 k 个神经元的偏置。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一句话总结：&lt;strong&gt;Excel 里先用 &lt;code&gt;SUMPRODUCT&lt;/code&gt; 做点积，再用 &lt;code&gt;MMULT&lt;/code&gt; 做矩阵乘法，最后都加上偏置、过 Sigmoid&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;24-计算例子&#34;&gt;2.4 计算例子&lt;/h3&gt;
&lt;h4 id=&#34;例子-1隐藏层神经元sumproduct-在算什么&#34;&gt;例子 1：隐藏层神经元（SUMPRODUCT 在算什么）&lt;/h4&gt;
&lt;p&gt;完整公式是：&lt;/p&gt;
&lt;p&gt;$$
z_j^{(2)} = \sum_{i=1}^{12} w_{ji}^{(1)} \cdot x_i + b_j^{(1)}
$$&lt;/p&gt;
&lt;p&gt;为了手写方便，下面只看前 3 个输入和权重，演示这个过程。假设：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{w} = [-2.06,\ 3.36,\ -0.63]^\top,\quad b = -0.99,\quad \mathbf{x} = [1,\ 1,\ 1]^\top
$$&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z &amp;amp;= (-2.06) \times 1 + 3.36 \times 1 + (-0.63) \times 1 + (-0.99) \\
&amp;amp;= -0.32 \\[6pt]
a &amp;amp;= \sigma(-0.32) = \frac{1}{1 + e^{0.32}} \approx 0.42
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;Excel 里会用 &lt;code&gt;SUMPRODUCT(L5:N8, $D$5:$F$8)&lt;/code&gt; 一次性把 12 项都乘好再加起来，然后 &lt;code&gt;+ $G$5&lt;/code&gt; 加上偏置。&lt;/p&gt;
&lt;h4 id=&#34;例子-2输出层神经元mmult-在算什么&#34;&gt;例子 2：输出层神经元（MMULT 在算什么）&lt;/h4&gt;
&lt;p&gt;隐藏层输出（来自书中 Excel 第一个样本的近似值）：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{a}^{(2)} = [1.5 \times 10^{-6},\ 0.99999999,\ 0.99999997]^\top
$$&lt;/p&gt;
&lt;p&gt;输出神经元 1 的权重和偏置：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{w}_1^{(2)} = [-14.25,\ -3.70,\ 9.33],\quad b_1^{(2)} = 6.64
$$&lt;/p&gt;
&lt;p&gt;输出层的计算就是一次 &lt;strong&gt;1×3 矩阵 × 3×1 向量&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z_1^{(3)} &amp;amp;= (-14.25) \times 1.5 \times 10^{-6} + (-3.70) \times 0.99999999 + 9.33 \times 0.99999997 + 6.64 \\
&amp;amp;\approx -3.70 + 9.33 + 6.64 \\
&amp;amp;\approx 12.28 \\[6pt]
a_1^{(3)} &amp;amp;= \sigma(12.28) \approx 0.999995
\end{aligned}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;含义：模型非常确信这个样本是“0”。Excel 里的 &lt;code&gt;MMULT($D$17:$F$17, O14:O16)&lt;/code&gt; 做的就是这一步矩阵乘法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;25-流程图&#34;&gt;2.5 流程图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    I[&amp;#34;输入图像像素 x&amp;#34;] --&amp;gt; W1[&amp;#34;隐藏层加权求和 z²&amp;#34;]
    W1 --&amp;gt; A1[&amp;#34;Sigmoid 激活 a²&amp;#34;]
    A1 --&amp;gt; W2[&amp;#34;输出层加权求和 z³&amp;#34;]
    W2 --&amp;gt; A2[&amp;#34;输出概率 a³&amp;#34;]
    A2 --&amp;gt; C[&amp;#34;计算损失 C&amp;#34;]
    C --&amp;gt; S[&amp;#34;Excel 求解器调整 w, b&amp;#34;]
    S --&amp;gt; W1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;26-使用注意点--避坑&#34;&gt;2.6 使用注意点 / 避坑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;求解器=黑盒&lt;/strong&gt;：Excel Solver 是通过数值方法搜索最优解，参数多的时候很慢，且容易陷入局部最优。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权重初始化别全 0&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;：二分类用 Sigmoid + 交叉熵，多分类用 Softmax + 交叉熵。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;27-异常场景处理&#34;&gt;2.7 异常场景处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;求解器提示“找不到可行解”&lt;/strong&gt;：检查公式是否有 &lt;code&gt;#VALUE!&lt;/code&gt;、输入是否规范、约束是否合理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练集准确率 100% 但测试集很差&lt;/strong&gt;：过拟合，增加数据或加正则化/Dropout。&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;三nn-误差反向传播法backpropagation&#34;&gt;三、NN 误差反向传播法（Backpropagation）&lt;/h2&gt;
&lt;h3 id=&#34;31-核心思想链式法则&#34;&gt;3.1 核心思想：链式法则&lt;/h3&gt;
&lt;p&gt;反向传播就是&lt;strong&gt;从输出倒推，计算每个权重对最终误差的贡献&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;中学学过的复合函数求导：&lt;/p&gt;
&lt;p&gt;如果 $y=f(u)$，$u=g(x)$，那么 $\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}$。&lt;/p&gt;
&lt;p&gt;神经网络层数很多，就是一层一层套起来的复合函数。反向传播只是把链式法则系统化地算一遍。&lt;/p&gt;
&lt;h3 id=&#34;32-计算图&#34;&gt;3.2 计算图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    X[&amp;#34;x&amp;#34;] --&amp;gt; M[&amp;#34;× w&amp;#34;]
    B[&amp;#34;b&amp;#34;] --&amp;gt; S[&amp;#34;+ b = z&amp;#34;]
    M --&amp;gt; S
    S --&amp;gt; A[&amp;#34;Sigmoid a&amp;#34;]
    A --&amp;gt; L[&amp;#34;损失 C&amp;#34;]
    L --&amp;gt; D[&amp;#34;反向求 ∂C/∂w, ∂C/∂b&amp;#34;]
    D --&amp;gt; M
    D --&amp;gt; B&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;33-反向传播公式简化版&#34;&gt;3.3 反向传播公式（简化版）&lt;/h3&gt;
&lt;p&gt;设某层输出为 $a$，加权输入为 $z$，下一层传来的误差为 $\delta_{\text{next}}$：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\delta &amp;amp;= \delta_{\text{next}} \cdot w \cdot \sigma&amp;rsquo;(z) \\
\frac{\partial C}{\partial w} &amp;amp;= a_{\text{prev}} \cdot \delta \\
\frac{\partial C}{\partial b} &amp;amp;= \delta
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;其中 $\sigma&amp;rsquo;(z)$ 是 Sigmoid 的导数：&lt;/p&gt;
&lt;p&gt;$$
\sigma&amp;rsquo;(z) = \sigma(z) \cdot (1 - \sigma(z))
$$&lt;/p&gt;
&lt;h3 id=&#34;34-计算例子&#34;&gt;3.4 计算例子&lt;/h3&gt;
&lt;p&gt;假设只有一个输入 &lt;code&gt;x = 1&lt;/code&gt;，目标输出 &lt;code&gt;t = 1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;网络：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z &amp;amp;= w \cdot x + b \\
a &amp;amp;= \sigma(z) \\
C &amp;amp;= \frac{1}{2}(a - t)^2 \quad \text{（平方误差）}
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;初始 &lt;code&gt;w = 0.5&lt;/code&gt;，&lt;code&gt;b = 0&lt;/code&gt;，学习率 &lt;code&gt;η = 0.1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前向&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
z &amp;amp;= 0.5 \times 1 + 0 = 0.5 \\
a &amp;amp;= \sigma(0.5) \approx 0.6225 \\
C &amp;amp;= \frac{1}{2}(0.6225 - 1)^2 \approx 0.0712
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反向&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\frac{\partial C}{\partial a} &amp;amp;= a - t = -0.3775 \\
\sigma&amp;rsquo;(z) &amp;amp;= a(1 - a) \approx 0.6225 \times 0.3775 \approx 0.2350 \\
\delta &amp;amp;= \frac{\partial C}{\partial a} \cdot \sigma&amp;rsquo;(z) \approx -0.0887 \\[6pt]
\frac{\partial C}{\partial w} &amp;amp;= x \cdot \delta = -0.0887 \\
\frac{\partial C}{\partial b} &amp;amp;= \delta = -0.0887
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
w_{\text{new}} &amp;amp;= 0.5 - 0.1 \times (-0.0887) \approx 0.5089 \\
b_{\text{new}} &amp;amp;= 0 - 0.1 \times (-0.0887) \approx 0.0089
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;再算一次前向，&lt;code&gt;a&lt;/code&gt; 会比 0.6225 更接近 1，误差减小。&lt;/p&gt;
&lt;h3 id=&#34;35-流程图&#34;&gt;3.5 流程图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    F[&amp;#34;前向传播：算 z, a, C&amp;#34;] --&amp;gt; B[&amp;#34;从输出层开始反向求 δ&amp;#34;]
    B --&amp;gt; G[&amp;#34;计算 ∂C/∂w, ∂C/∂b&amp;#34;]
    G --&amp;gt; U[&amp;#34;梯度下降更新权重&amp;#34;]
    U --&amp;gt; F&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;36-使用注意点--避坑&#34;&gt;3.6 使用注意点 / 避坑&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;坑&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Sigmoid 梯度消失&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;输入很大或很小时，Sigmoid 导数接近 0，深层网络传不动误差&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用 ReLU / LeakyReLU&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;ReLU 死亡&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;某些神经元永远输出 0，梯度也永远 0&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用 LeakyReLU、PReLU，或调小学习率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;梯度爆炸&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;深层网络梯度越乘越大，权重变成 NaN&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度裁剪（Gradient Clipping）、BatchNorm、残差连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;损失与输出不匹配&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用 Sigmoid 配 Softmax 损失会出问题&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;二分类用 &lt;code&gt;binary_crossentropy&lt;/code&gt;，多分类用 &lt;code&gt;categorical_crossentropy&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;batch 太小&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度噪声大，训练抖动&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;增大 batch，或使用带动量的优化器&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;37-异常场景处理&#34;&gt;3.7 异常场景处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;某层梯度全为 0&lt;/strong&gt;：可能是激活函数“死”了，或学习率过大导致参数进入饱和区。检查激活函数输出分布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练 loss 下降但验证 loss 上升&lt;/strong&gt;：典型过拟合，早停或加 Dropout。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不同层梯度尺度差 1000 倍&lt;/strong&gt;：深层网络梯度不稳定，考虑 Batch Normalization 或更合适的初始化（He/Xavier）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四cnn-求解器卷积神经网络训练&#34;&gt;四、CNN 求解器（卷积神经网络训练）&lt;/h2&gt;
&lt;h3 id=&#34;41-卷积是什么&#34;&gt;4.1 卷积是什么？&lt;/h3&gt;
&lt;p&gt;卷积 = 用一个小窗口（卷积核 / filter）在图片上滑来滑去，&lt;strong&gt;局部加权求和&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;捕捉边缘、纹理等局部特征。&lt;/li&gt;
&lt;li&gt;同一个核扫完整张图，参数少很多。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;42-池化pooling&#34;&gt;4.2 池化（Pooling）&lt;/h3&gt;
&lt;p&gt;池化 = 把一小块区域压缩成一个数，常用 &lt;strong&gt;Max Pooling（取最大值）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;作用：降维、减少计算量、让特征对位置变化不那么敏感。&lt;/p&gt;
&lt;h3 id=&#34;43-计算例子&#34;&gt;4.3 计算例子&lt;/h3&gt;
&lt;p&gt;输入图像（4×4）：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 1 0 0
1 1 0 0
0 0 1 1
0 0 1 1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;卷积核（2×2）：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1  1
1 -1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;卷积&lt;/strong&gt;（无 padding，stride=1）第一步取左上角：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1×1 + 1×1 + 1×1 + (-1)×1 = 2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;滑完得到 3×3 特征图：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2  0  0
0  2  0
0  0  2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Max Pooling（2×2，stride=2）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2  0
0  2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;然后拉平成 &lt;code&gt;[2, 0, 0, 2]&lt;/code&gt;，接到全连接层做分类。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;书中 &lt;code&gt;5-4 CNN（求解器）.xlsx&lt;/code&gt; 就是用类似流程识别“文字 1、2、3”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;44-结构图&#34;&gt;4.4 结构图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    I[&amp;#34;输入图像&amp;#34;] --&amp;gt; C[&amp;#34;卷积层&amp;#34;]
    C --&amp;gt; R[&amp;#34;激活函数 ReLU/Sigmoid&amp;#34;]
    R --&amp;gt; P[&amp;#34;池化层 Max Pooling&amp;#34;]
    P --&amp;gt; F[&amp;#34;拉平 Flatten&amp;#34;]
    F --&amp;gt; D[&amp;#34;全连接层&amp;#34;]
    D --&amp;gt; O[&amp;#34;输出分类&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;45-使用注意点--避坑&#34;&gt;4.5 使用注意点 / 避坑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输出尺寸算错&lt;/strong&gt;：卷积后尺寸为 $H_{\text{out}} = \frac{H_{\text{in}} - K + 2P}{S} + 1$，忘记 padding 会导致后续层维度不匹配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核太大&lt;/strong&gt;：会丢失细节，图像任务一般 3×3 最常用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;池化丢失位置信息&lt;/strong&gt;：如果任务需要精确定位（如目标检测的边界框），Max Pooling 不宜太多。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通道数暴涨&lt;/strong&gt;：每加一个卷积层通道数翻倍会迅速爆显存，要结合池化或stride=2降采样。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;46-异常场景处理&#34;&gt;4.6 异常场景处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特征图全 0&lt;/strong&gt;：可能是权重初始化太差，或学习率过大导致 ReLU 全部死亡。加 BatchNorm 或换初始化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出尺寸报错&lt;/strong&gt;：逐层打印特征图 shape，检查核大小、stride、padding。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显存不足&lt;/strong&gt;：减小 batch size，或减少通道数/层数。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五cnn-误差反向传播法&#34;&gt;五、CNN 误差反向传播法&lt;/h2&gt;
&lt;h3 id=&#34;51-卷积层的反向传播&#34;&gt;5.1 卷积层的反向传播&lt;/h3&gt;
&lt;p&gt;卷积的反向传播本质上仍是卷积，只是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;误差图需要和&lt;strong&gt;旋转 180° 的卷积核&lt;/strong&gt;做卷积。&lt;/li&gt;
&lt;li&gt;再乘以当前层激活函数的导数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简化公式：&lt;/p&gt;
&lt;p&gt;$$
\delta_l = \delta_{l+1} \circledast \text{rot180}(W_{l+1}) \odot f&amp;rsquo;(z_l)
$$&lt;/p&gt;
&lt;p&gt;其中 &lt;code&gt;⊛&lt;/code&gt; 表示卷积，&lt;code&gt;⊙&lt;/code&gt; 表示对应元素相乘。&lt;/p&gt;
&lt;h3 id=&#34;52-池化层的反向传播&#34;&gt;5.2 池化层的反向传播&lt;/h3&gt;
&lt;p&gt;Max Pooling 反向传播最简单：&lt;strong&gt;把误差传回给“最大值所在位置”，其余位置填 0&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 前向
        A[&amp;#34;2 1\n0 3&amp;#34;] --&amp;gt; B[&amp;#34;Max=3&amp;#34;]
    end
    subgraph 反向
        E[&amp;#34;误差 0.5&amp;#34;] --&amp;gt; C[&amp;#34;0   0\n0 0.5&amp;#34;]
    end
    B -.-&amp;gt; E&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;53-计算例子&#34;&gt;5.3 计算例子&lt;/h3&gt;
&lt;p&gt;前向 Max Pooling 2×2：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;输入：          输出：
2  1            3
0  3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;反向时，如果输出位置误差是 &lt;code&gt;0.5&lt;/code&gt;，传回输入应为：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0    0
0  0.5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;然后继续往前传给卷积层。&lt;/p&gt;
&lt;h3 id=&#34;54-流程图&#34;&gt;5.4 流程图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 前向
        F1[&amp;#34;卷积 + 激活&amp;#34;] --&amp;gt; F2[&amp;#34;Max Pooling&amp;#34;] --&amp;gt; F3[&amp;#34;全连接输出&amp;#34;]
    end
    subgraph 反向
        B1[&amp;#34;输出层误差 δ&amp;#34;] --&amp;gt; B2[&amp;#34;池化层反向：把误差还给最大值位置&amp;#34;]
        B2 --&amp;gt; B3[&amp;#34;卷积层反向：rot180 核卷积 δ&amp;#34;]
        B3 --&amp;gt; B4[&amp;#34;更新卷积核权重&amp;#34;]
    end
    F3 -.-&amp;gt; B1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;55-使用注意点--避坑&#34;&gt;5.5 使用注意点 / 避坑&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;坑&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Max Pooling 不可导&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;它本身不是光滑函数，但反向传播时我们只把梯度传给最大值位置，工程上可行&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;注意保存前向时的“最大值位置掩码”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;stride &amp;gt; 1 反向 upsample 复杂&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;误差图尺寸变小，传回去要补 0&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;框架会自动处理，手写时要小心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Padding 的梯度&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;padding 区域不应该有梯度，加 padding 时要把这些位置屏蔽&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;反向传播只更新非 padding 区域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;BatchNorm 插在卷积后&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;会改变反向传播的梯度分布，但通常更稳定&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;BN 需要和卷积一起训练&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;56-异常场景处理&#34;&gt;5.6 异常场景处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;卷积核学不到东西&lt;/strong&gt;：检查初始化、学习率，或前面层是否已经“死掉”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深层 CNN loss 不下降&lt;/strong&gt;：可能是梯度消失，加残差连接（ResNet）或 BatchNorm。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练集准确率很高，测试集很低&lt;/strong&gt;：CNN 参数多，极易过拟合，加数据增强、Dropout、L2 正则化。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六通用训练避坑指南&#34;&gt;六、通用训练避坑指南&lt;/h2&gt;
&lt;p&gt;下面这 10 条适用于 NN 和 CNN：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据先归一化&lt;/strong&gt;：像素除以 255，数值特征减去均值除以标准差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;划分训练 / 验证 / 测试集&lt;/strong&gt;：不要拿测试集调参。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从小模型开始&lt;/strong&gt;：先跑通一个两层的 baseline，再加深。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习率是最重要的超参数&lt;/strong&gt;：先用默认值，再按 10 倍上下调。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控 loss 曲线&lt;/strong&gt;：训练 loss 和验证 loss 一起画，才能判断是否过拟合。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;早停 Early Stopping&lt;/strong&gt;：验证 loss 连续 N 轮不降就停。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权重初始化&lt;/strong&gt;：ReLU 用 He 初始化，Sigmoid/Tanh 用 Xavier/Glorot 初始化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch Size&lt;/strong&gt;：小 batch（16-64）通常泛化更好，大 batch 训练更快但可能陷在尖锐最小值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标签检查&lt;/strong&gt;：花 10 分钟抽样看标签是否正确，比调一周模型都有效。&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;七异常场景与业务异常处理&#34;&gt;七、异常场景与业务异常处理&lt;/h2&gt;
&lt;h3 id=&#34;71-训练阶段&#34;&gt;7.1 训练阶段&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;异常&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;可能原因&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Loss = NaN&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;学习率过大、梯度爆炸、log(0)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;降低学习率、梯度裁剪、加 ε&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Loss 完全不降&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;学习率太小、数据损坏、标签全相同&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;逐步调大 lr、检查数据pipeline&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;验证 loss 上升&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;过拟合&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;早停、Dropout、数据增强、简化模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;训练 loss 和验证 loss 都高&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;欠拟合&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;增加模型容量、训练更久、减少正则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;类别严重不平衡&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;某些类别样本极少&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;加权损失、过采样、Focal Loss&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;72-部署业务阶段&#34;&gt;7.2 部署/业务阶段&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;业务异常&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;表现&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;概念漂移&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;线上数据分布变了，模型准确率下降&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;监控分布、定期重训、在线学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;输入越界&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用户上传纯黑图、超大图、非图片文件&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;前置校验、异常输入兜底规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;** adversarial 样本**&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;人眼看不出区别，模型却错判&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;对抗训练、输出置信度+人工复核&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;长尾类别错误&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;冷门类别识别率低&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;收集更多样本、用度量学习/少样本学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;时延/成本超标&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;模型太大，推理慢&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;剪枝、量化、蒸馏、换小模型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;73-一个实用的排查-checklist&#34;&gt;7.3 一个实用的排查 checklist&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;□ 输入数据范围对吗？（0~1 还是 -1~1？）
□ 标签编码对吗？（one-hot / integer / 概率？）
□ 损失函数和输出激活匹配吗？
□ 第一层输出 shape 符合预期吗？
□ 权重还有在更新吗？（打印梯度范数）
□ 训练一个 batch 能过拟合吗？（ Sanity Check ）
□ 学习率是不是在合理区间？&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;八总结&#34;&gt;八、总结&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;算法&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;核心作用&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;一句话口诀&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度下降法&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;找函数最小值&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;看梯度，反方向，迈小步&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;NN 求解器&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用优化器直接调权重&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;输入加权求和，Sigmoid 出概率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;NN 反向传播&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;高效算每个权重的梯度&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;从后往前，链式求导&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;CNN 求解器&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;图像特征提取 + 分类&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;卷积找局部特征，池化降维&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;CNN 反向传播&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;卷积和池化的梯度回传&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;卷积核旋转 180°，池化只传最大值&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果你是第一次接触，建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先打开 &lt;code&gt;2-11 梯度下降法.xlsx&lt;/code&gt;，改改 &lt;code&gt;η&lt;/code&gt; 和起点，看 z 怎么变。&lt;/li&gt;
&lt;li&gt;再打开 &lt;code&gt;3-5 NN（求解器）.xlsx&lt;/code&gt;，试着改输入像素，观察输出概率。&lt;/li&gt;
&lt;li&gt;最后对照 &lt;code&gt;4-4&lt;/code&gt;、&lt;code&gt;5-4&lt;/code&gt;、&lt;code&gt;5-6&lt;/code&gt; 这几个 Excel，理解“求解器版”和“反向传播版”其实是同一套东西的不同实现方式。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;本文档持续维护中。如果有哪一步的公式或例子让你卡住，欢迎在评论区指出，我会继续用更直观的方式补充图解。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
