HelloAI
L3 第 1 篇 🐣 难度 🕒 12 分钟

从感知机到多层神经网络:深度学习的起点

所有神经网络都是从一个 1958 年的简单模型扩展来的。这一篇讲清楚"神经元"到底是个啥。

阿莱
2026/7/1

L1 学完,你已经懂梯度下降和反向传播。L3 我们正式打开深度学习的世界。

第一站:神经网络到底是个什么东西

灵感来源:人脑的神经元

人脑约有 860 亿个神经元。每个神经元接收多个信号,加权综合,超过某个阈值就”激活”,把信号传给下一个。


信号1 ───→  ┌────────┐
信号2 ───→  │ 神经元 │ ──→ 输出
信号3 ───→  └────────┘

1958 年,Frank Rosenblatt 用数学模拟了这件事——感知机

第一站:感知机(Perceptron)

最简单的”人工神经元”:

y={1,if iwixi+b>00,otherwisey = \begin{cases} 1, & \text{if } \sum_i w_i x_i + b > 0 \\ 0, & \text{otherwise} \end{cases}
  • xix_i:输入信号(特征)
  • wiw_i:权重(学到的)
  • bb:偏置
  • 阶跃函数:超阈值输出 1,否则 0

这本质就是一个二分类器——和 L2-03 的逻辑回归非常像,只是用阶跃函数代替了 sigmoid。

它能学什么

感知机能学线性可分的问题。比如:

●●●  ○○○
●●● | ○○○    ← 一条直线分开就行
●●●  ○○○

但不能学非线性可分的,比如经典的 XOR 问题:

●  ○
○  ●    ← 一条直线分不开

历史插曲:1969 年 Minsky 在《Perceptrons》一书里证明了感知机连 XOR 都学不会,直接掐死了 15 年神经网络研究——第一次 AI 寒冬(详见 L0-02)。

第二站:多层感知机(MLP)

解决方案极其简单——多堆几层

输入 → [神经元层 1] → [神经元层 2] → [神经元层 3] → 输出
       (4 个神经元)   (4 个神经元)   (2 个神经元)

每一层的每个神经元都接收上一层所有神经元的输出(全连接),然后输出给下一层。

这种结构叫 MLP(Multi-Layer Perceptron),也叫 全连接网络(FCN)前馈网络(Feedforward)

它能学什么

理论上 MLP 能拟合任意连续函数(通用近似定理 / Universal Approximation Theorem)——只要参数足够多、层数足够深、训练得当。

XOR?两层 MLP 就能学。

第三站:但是有一个关键问题

如果每一层只是 y=Wx+by = Wx + b(线性变换),无论多少层堆起来,整体仍然是线性的

y=W3(W2(W1x+b1)+b2)+b3=Wx+by = W_3 (W_2 (W_1 x + b_1) + b_2) + b_3 = W' x + b'

数学上能合并成一层!多层就失去意义了

解决:每层后面加一个非线性激活函数

第四站:激活函数家族

激活函数让每层的输出”非线性化”——这是深度学习的灵魂。

Sigmoid

σ(z)=11+ez\sigma(z) = \frac{1}{1 + e^{-z}}

S 形曲线,输出 0-1。

  • ✅ 早期用得多(生物学动机)
  • ❌ 两端饱和(梯度消失)
  • ❌ 输出不是 0 中心
  • 今天主要用在二分类输出层(不再用在隐藏层)

Tanh

tanh(z)=ezezez+ez\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}

类似 sigmoid,但输出 -1 到 1。比 sigmoid 略好(0 中心),但仍有饱和问题。

ReLU(修正线性单元)

ReLU(z)=max(0,z)\text{ReLU}(z) = \max(0, z)

深度学习革命的关键。简单到不像数学——负数变 0,正数保留。

  • ✅ 计算极快(一次比较)
  • ✅ 在正区间梯度不衰减——解决梯度消失
  • ✅ 稀疏激活(很多神经元输出 0,模型像被”剪枝”)
  • ❌ “死神经元”问题:如果某个神经元输出永远为负,它的梯度永远 0,永远学不到东西

ReLU 在 2010-2012 年的”重新发现”,是深度学习从可能变现实的关键。

Leaky ReLU / PReLU

为了修复”死神经元”:

Leaky ReLU(z)={z,z>00.01z,z0\text{Leaky ReLU}(z) = \begin{cases} z, & z > 0 \\ 0.01 z, & z \le 0 \end{cases}

负数部分不是 0,是一个小斜率。

GELU(Gaussian Error Linear Unit)

GELU(z)=zΦ(z)\text{GELU}(z) = z \cdot \Phi(z)

Φ\Phi 是标准正态分布的累积分布函数。ReLU 的平滑版本——更”软”。

现代 Transformer / LLM 几乎全用 GELU(GPT, BERT, Llama 都是)。 因为 GELU 在大模型上表现略好于 ReLU。

SwiGLU

更复杂的变种,Llama / PaLM 等最新 LLM 用的。比 GELU 又好一点(不多)。

怎么选

场景推荐
CNN 视觉ReLU(经典选择)
Transformer / LLMGELU 或 SwiGLU
二分类输出层Sigmoid
多分类输出层Softmax
循环网络Tanh(历史选择)

实战中先用 ReLU——它快、稳、够好。除非你训 Transformer,否则不用换。

第五站:用 PyTorch 搭一个

import torch
import torch.nn as nn

class MLP(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.ReLU(),                          # ← 关键的非线性
            nn.Linear(hidden_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, output_dim)
        )

    def forward(self, x):
        return self.layers(x)

model = MLP(input_dim=10, hidden_dim=64, output_dim=2)

# 看一眼
print(model)
total_params = sum(p.numel() for p in model.parameters())
print(f"参数总数: {total_params}")  # ~ 5000+

这就是最基础的深度学习模型——MLP。

第六站:MLP 的局限

MLP 是基础,但它有问题:

1. 不适合图像

一张 224×224 彩色图有 15 万个像素。如果输入层 15 万 + 隐藏层 1000——参数就是 1.5 亿,还只有一层!显然不可行

解决:CNN(L3-06 已讲)—— 用卷积共享参数。

2. 不适合序列

每个位置都和其他位置无关——MLP 看不到顺序。

解决:RNN(L3-04)→ Attention(L3-05)。

3. 不适合层次结构

像句法树、知识图谱这种结构化数据,MLP 把它们打平了。

解决:图神经网络(GNN)、Transformer。

所以”深度学习的进步” = “为不同数据找到更好的归纳偏好(inductive bias)”

  • 图像 → CNN
  • 序列 → RNN → Transformer
  • 图 → GNN

每种架构都是 MLP 的”特化版本”。

第七站:但是 MLP 仍然无处不在

虽然 MLP 不能独当一面,但它作为子模块遍布所有现代神经网络:

  • Transformer 的 FFN 层:每个 Transformer block 的第二部分就是一个 2 层 MLP
  • ResNet 的最后一层分类头:CNN 抽完特征,最后一层就是 MLP
  • 嵌入投影:Q/K/V 矩阵就是用 MLP 算的
  • 大部分回归 / 分类任务的尾巴:从向量到输出

现代 AI 模型 = MLP 子模块 + 特殊的”信息流动方式”(卷积、注意力、循环)。

💡 深度学习的设计哲学

不要孤立地学每种网络架构。把它们想成”对 MLP 加了什么特殊约束”:

  • CNN:MLP + 局部连接 + 参数共享
  • RNN:MLP + 时间维度上的复用
  • Transformer:MLP + 灵活的位置无关的信息融合
  • GNN:MLP + 节点-边的传递规则

理解这一层,所有架构都是一家人。

下一篇:《RNN / LSTM 兴衰:从序列到序列的语言模型简史》

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。