← 返回讲义 扩展阅读 · 对应第 6 节 演示 ②

给追问的人准备的一页

那一步"压缩",
到底是什么?

讲义里为了照顾零基础的听众,把神经元的最后一步含糊地说成"压缩到 0 到 1 之间"。这一页把它摊开:公式是什么、0.57 是怎么一步步算出来的、函数长什么样,以及为什么今天的网络大多已经换掉了它。

一、 它有名字

这个压缩函数叫 sigmoid

演示 ② 的灯泡显示 0.57,中间那步"压缩"用的是 sigmoid 函数(也叫 logistic 函数)。它把任何一个实数——不管是 −1000 还是 +1000——都映射到 0 与 1 之间:

σ(z) = 11 + e−z σ 读作 sigma;e ≈ 2.71828,是自然常数

把它接在加权求和后面,就得到一个神经元的完整公式。演示 ② 里的三个输入 x₁ x₂ x₃、三个权重 w₁ w₂ w₃、一个偏置 b,合起来是:

a = σ(w1x1 + w2x2 + w3x3 + b) a 就是这个神经元的激活值,也就是灯泡的亮度

括号里那一坨,讲义里叫"加权总分",数学上通常记作 z。所以整件事就两步:先求 z,再套 σ。

二、 逐步代入

0.57 是怎么算出来的

用演示 ② 打开时的默认值:x₁=0.80、x₂=0.10、x₃=0.60,w₁=1.0、w₂=0.0、w₃=0.0,门槛 b=−0.5。

求加权总分 z(w₂ 和 w₃ 都是 0,所以 x₂、x₃ 这两票作废)
z = 0.80×1.0 + 0.10×0.0 + 0.60×0.0 + (−0.5) = 0.80 − 0.5 = 0.30
算 e 的 −z 次方
e−0.300.7408
加上 1,得到分母
1 + 0.7408 = 1.7408
取倒数,就是激活值
1 ÷ 1.7408 ≈ 0.5744  →  灯泡显示 0.57

页面里对应的代码,恰好也是两行:

// 第一步:加权总分
const z = x[0]*w[0] + x[1]*w[1] + x[2]*w[2] + b;
// 第二步:sigmoid 压缩
const a = 1 / (1 + Math.exp(-z));

三、 看图

sigmoid 长什么样

曲线的形状,比任何解释都能说明为什么选它。拖动滑块,看红点在曲线上滑动。

互动图:σ(z) 的全貌

横轴是加权总分 z(可以是任意实数),纵轴是压缩后的输出(永远落在 0 到 1 之间)。

sigmoid σ(z) ReLU(见第五节) 当前的 z
0.30
两头封死 z 再大,输出也顶不破 1;z 再小,也跌不破 0。所以它永远是一盏合格的"灯泡",亮度有上下限。
z = 0 时正好是 0.5 这解释了偏置为什么叫"门槛"。b = −0.5 的意思是:加权和必须先补上 0.5,这个神经元才刚过半亮。门槛越负,越难点亮。
中间陡、两端平 在 z = 0 附近,输入稍变一点,输出就明显变化——网络的"注意力"集中在决策边界附近。而在两端,输出几乎不再变化,这叫饱和
压缩不是为了好看,是为了让每个神经元的输出都有统一的量纲。

四、 一个副作用

饱和为什么会拖慢学习

回想讲义第 7 节的"蒙眼下山":机器靠感觉脚下的坡度来决定往哪挪。坡度,就是曲线在那一点的陡峭程度。

把上面那个"显示此处的陡峭程度"勾上,拖到两端看看——数值会掉到接近 0。这意味着:当一个神经元的总分很大或很小时,微调它的权重几乎不会改变输出,机器也就感觉不出该往哪走。坡太平,人就在原地打转。层数一多,这个问题会一路向前累积,训练慢得让人绝望。

顺带一提,sigmoid 的陡峭程度有个漂亮的写法,用它自己就能表达:

σ′(z) = σ(z) · (1 σ(z)) 当 σ 接近 0 或 1 时,这个乘积必然趋近于 0——这就是饱和

五、 替代方案

所以今天大多改用 ReLU

为了绕开饱和,现代网络的隐藏层普遍改用一个简单到近乎粗暴的函数——ReLU,全称"修正线性单元"(Rectified Linear Unit)。名字唬人,干的事只有一句:

ReLU(z) = max(0, z) 负数一律归零,正数原样通过

把上面互动图里的"叠加 ReLU 曲线"勾上,对比一下:ReLU 在正半轴是一条永不变平的直线,坡度恒为 1,机器随时都能感觉到方向。代价是它不再有 0 到 1 的上限——所以"灯泡"这个比喻在隐藏层里就不太贴切了,但网络并不在乎。

不过输出层通常还是要压缩的:认数字这类任务,最后一层常用 sigmoid 的多分类版本 softmax,好让十个输出加起来正好是 1,读作"概率"。

六、 从一个到一层

矩阵写法,与 13,002 的来历

一个神经元要写三项乘法。一层有 16 个神经元、上一层有 784 个,全写出来是 12544 项——没人这么干。把上一层所有亮度排成一列向量 a⁽⁰⁾,所有权重排成一个矩阵 W,所有偏置排成向量 b,整层的计算就浓缩成一行:

a(1) = σ(Wa(0) + b) σ 逐个作用在括号里的每一项上

这也顺带解释了为什么显卡对深度学习这么关键:训练也好、推理也好,主体工作就是飞快地做矩阵乘法。

最后核一下讲义里"一万三千多个旋钮"这个数。网络结构是 784 → 16 → 16 → 10:

部位算式个数
输入层 → 隐藏层 1 的权重784 × 1612,544
隐藏层 1 → 隐藏层 2 的权重16 × 16256
隐藏层 2 → 输出层的权重16 × 10160
各层神经元的偏置16 + 16 + 1042
合计13,002
网络的全部"本事",就写在这 13,002 个数里。
← 回到讲义第 6 节