JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

层层堆叠:多层感知机

单个神经元只能画一条直线。把神经元堆叠成层,你就得到一个能弯折、能塑形、几乎能勾勒出任意形状的网络——本文将精确讲清它的原理。

从一个神经元到一支团队

在上一篇里,你搭建了一个人工神经元:它接收若干输入,给每个输入乘上一个权重,加上一个偏置,再把总和送过一个激活函数。这台小机器很强大,却有一个顽固的局限——单凭自己,它只能用一条直线把数据切成两半。经典的例子是异或(XOR):四个点,没有任何一条直线能把正确的点分到各自一侧。一个神经元根本做不到。

解决办法简单得近乎可笑:用不止一个神经元,并让一部分神经元去听另一部分神经元、而不是去听原始输入。一整排并行工作的神经元就构成一个(layer)。当你把层堆叠起来,让前一层的输出喂给后一层的输入,你就造出了一个多层感知机(MLP)——最初的、最基础的神经网络。你听说过的所有更花哨的东西,从图像识别器到聊天机器人,都是这个想法的后代。

为什么堆叠会有用?因为第一层可以一次性把输入切成好几块直的,而下一层能把这些块组合成一个弯曲、带折角的形状——那是任何单条直线都画不出来的。第一层两个神经元,加上一个负责组合它们的神经元,就足以攻克 XOR。换句话说,深度让你能用直线拼出曲线。

三种层:输入、隐藏、输出

一个 MLP 按三种角色来组织。输入层其实根本不算神经元——它只是你的数字进入的那些槽位:每个特征一个槽。如果你喂给它一张 28×28 的灰度图像,输入层就有 784 个槽,每个像素一个。它不做任何计算,只是托住这些数值。

输出层是最后一排,它的工作是把答案以你需要的形状交付出来。对一个是/否的问题,你可能用一个带 sigmoid 的神经元;对一个十选一的问题(这是哪个数字?),你就用十个神经元加一个 softmax,让输出读起来像一组加和为一的概率。输出层的大小完全由问题决定,而非由你的喜好决定。

夹在中间的一切都是隐藏层——之所以「隐藏」,是因为你从不直接看到它的数值;它们是内部的草稿。这里有一个关键的思维转变:隐藏层的神经元并不去检测你事先命名好的东西。相反,网络会自己*发明*中间特征——也许一个神经元对圆形发放,另一个对竖直笔画发放——而它是在训练过程中自行发现这些的。隐藏层的数量和大小是你来选择的:它们是超参数,是你在训练前拨好的旋钮,而非数据递给你的值。

全连接:每根线连到每个神经元

在 MLP 中,每一层都是全连接的(也叫*稠密*层):本层中的每个神经元都从前一层的*每一个*值那里接收一根线。如果前一层有 100 个输出、本层有 50 个神经元,那就是 100 × 50 = 5000 个权重,外加每个神经元一个偏置。这些权重中的每一个,都是网络将要学习的数。

这正是我们钟爱矩阵的原因。与其一个一个地追踪 5000 次乘法,我们把权重打包进一张网格——一个权重矩阵——于是整层的计算就变成一次矩阵乘法,再加上偏置向量。你早先攀过的线性代数那一级并不是无用功:一个层从字面意义上*就是*一个仿射映射(一个线性映射加上一次平移),而矩阵就是它紧凑的书写形式。

前向传播:数据逐级上行

把一个输入送过网络以得到答案,这个过程叫前向传播。它机械得令人愉快:拿起输入向量,做本层的矩阵乘法并加偏置,套上激活函数,你就得到下一层的值。把这些交给下一层,重复即可。数字严格地朝一个方向流动——从输入流向输出——这正是 MLP 是一个无环的*前馈*网络的原因。

  1. 从输入向量 x 开始(你的原始特征)。
  2. 对每一层:计算 z = W·x + b——乘以权重矩阵,加上偏置。
  3. 套上激活函数:a = f(z),把结果弯折(例如 ReLU 或 sigmoid)。
  4. 把 a 作为输入喂给下一层;重复直至末层。
  5. 把末层的输出读作你的预测。
def forward(x, layers):
    a = x
    for (W, b, activation) in layers:
        z = W @ a + b        # matrix multiply, then add bias
        a = activation(z)    # the nonlinear bend
    return a                 # final-layer output = prediction
一个 MLP 的完整前向传播——在层上做的一个循环,里面只有三行真正干活的代码。

做出一个预测,真的就这么多。神秘之处不在前向传播——而在*好的权重究竟从何而来*。一开始它们是随机的,所以输出是一堆胡言。学习的意思是:把每个权重都微微挪动一点,让答案不那么错,如此反复。负责算出每个权重该往哪个方向挪的机器,就是反向传播配上梯度下降——而这正是下一篇的主题。

万能逼近——以及它并未承诺的东西

有一个听起来近乎魔法的著名结论:万能逼近定理。它说,哪怕只有一个隐藏层的 MLP,也能以你想要的任意精度逼近*任何*连续函数——前提是允许这个隐藏层足够宽。说白了:这个简单的架构在原理上表达力足够强,几乎能表示你想要的任何「输入到输出」的映射。

这也是为什么在实践中,人们会去用*深*网络,而不是用一个宽得不切实际的隐藏层。定理也许允许一个浅的解,但更深的网络往往能用少得多的神经元达到同样的精度,并且会促成分层特征——浅层学简单的部件,深层学更丰富的组合。全连接的 MLP 是一个诚实的起点;它的那些专门化的表亲,比如卷积网络,则加入了结构,让在图像或文本上的学习高效得多。

所以请记住这幅图景:一层层全连接的神经元,每两层之间夹一个激活函数,数据从输入向输出前向流动。这就是网络的躯体。它仍然缺少的,是一种自我改进的方法——把随机的初始权重变成好的权重。给它这个能力,这台死气沉沉的机器就变成了一台会学习的机器。那就是我们接下来要去的地方。