感知机与第一次AI寒冬
人脑由神经元组成。生物学家告诉我们,神经元的工作方式很简单:
树突接收来自其他神经元的信号(输入)。细胞体负责累加这些信号。如果累加的信号超过某个阈值,轴突就“啪”地一下放电(激活),把信号传给下一个神经元。
数学家尝试用数学来模仿大脑。我们将这个生物过程写成公式,那么我们就形成了感知机 (Perceptron):
$$ o = \sigma(\mathbf{w}^T \mathbf{x} + b) $$
其中:
- $\mathbf{x}$ (Input): 输入信号(比如图像像素)。对应树突。
- $\mathbf{w}$ (Weights): 权重,代表连接的强弱。对应突触的连接强度。
- $\mathbf{w}^T \mathbf{x} + b$ (Weighted Sum): 细胞体里的信号累加。
- $\sigma$ (Activation Function): 激活函数。
- 在最原始的感知机中,$\sigma$ 是一个 阶跃函数 (Step Function):
- 如果总和 $> 0$,输出 1(激活/放电)。
- 如果总和 $\le 0$,输出 0(静默)。
这实际上和我们上一章学的 逻辑回归 (Logistic Regression) 几乎一模一样。
唯一的区别在于:逻辑回归用的 $\sigma$ 是平滑的 Sigmoid(输出概率),而原始感知机用的是硬邦邦的阶跃函数(输出 0 或 1)。
感知机能做什么?例如我们可以通过感知机来学习参数 $\mathbf{w}$ 和 $b$,把猫和狗分开。
从几何上看,公式 $\mathbf{w}^T \mathbf{x} + b = 0$ 定义了一个 超平面 (Hyperplane)。
- 线的一边,$\mathbf{w}^T \mathbf{x} + b > 0$,感知机喊“1”(是狗)。
- 线的另一边,$\mathbf{w}^T \mathbf{x} + b < 0$,感知机喊“0”(是猫)。
所以,单个感知机本质上就是一个线性分类器。
在 1950/60 年代,人们以为感知机无所不能。直到 1969 年,Minsky 和 Papert 写了一本书《Perceptron》,无情地指出了它的致命缺陷,直接导致了 AI 领域的第一次寒冬。这个缺陷就是 异或问题 (XOR Problem)。
XOR (异或门): 是一个执行相同时输出 0,不同时输出 1的逻辑门:
- (0, 0) -> 0
- (1, 1) -> 0
- (0, 1) -> 1
- (1, 0) -> 1
现在,你尝试在纸上画一个坐标系,然后:
- 在 $(0,0)$ 和 $(1,1)$ 画两个 红点(代表 0 类)。
- 在 $(0,1)$ 和 $(1,0)$ 画两个 绿点(代表 1 类)。
然后请你拿一把尺子,画一条直线,把红点和绿点完美分开。bro会发现根本做不到。无论你怎么画,总会有一个点被分错。
这就是导致单个感知机处理不了非线性可分 (Non-linearly Separable) 的数据的直接原因。而现实世界(比如图像、语言)几乎全是非线性的。
多层感知机与训练
那么还是同样的问题,如果我们能画两条线,你能不能分开这几个点?答案是可以的。
既然单个感知机没法解决XOR问题,我们想出的办法非常朴素:人多力量大,如果我们把很多个感知机连接起来,是不是就能产生奇迹?
答案是肯定的,但是我们需要一个极其关键的条件。
看下面这张图,现代神经网络其实就是层层堆叠的函数:

其中:
- Input Layer($x$)是原始数据,比如图片的像素。
- Hidden Layer($h$)是中间层,公式为:
$\mathbf{h} = \sigma(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)$。这一层我们进行特征提取 (Feature Extraction)。它把原始空间扭曲,折叠,试图把原本纠缠在一起的数据拉开。 - Output Layer ($y$)是我们的输出层。
$\mathbf{f} = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2$。这一步我们基于提取出来的特征,做最后的线性分类。
另外我们发现,我们必须需要使用非线性激活函数$\sigma$。如果我们去掉了激活函数$\sigma$,让每一层都只是线性的:$h = W_1 x$, $y = W_2 h$
那么我们最后得到的输出是:
$$ y = W_2 (W_1 x) = (W_2 W_1) x = W_{new} x $$
这样无论你堆叠了 100 层还是 1000 层线性层,如果你不采用非线性激活函数,它们最终**数学上等价于 1 层线性层。深层网络就退化回了单层感知机,XOR 问题依然无解。
因此,非线性激活函数 (Sigmoid, ReLU) 是赋予网络“扭曲空间能力”的灵魂。
多分类与损失函数
如果我们要分辨猫、狗、鸟等多个类,输出层该怎么办?
神经网络最后的输出往往是一组没有任何范围的实数,比如 $[2.0, 1.0, 0.1]$。而我们需要把它变成概率分布,它们的和应该为1。
我们可以使用Softmax 公式:
$$ p_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} $$
其中:
- 指数 ($e^z$): 把负数变正,同时拉大差距(大的更大)。
- 归一化 ($\sum$): 确保加起来等于 1。
那么,我们该如何衡量预测概率 $p$(比如 $[0.8, 0.1, 0.1]$)和真实标签 $y$(比如 $[1, 0, 0]$,即 One-hot 编码)之间的差距?
我们使用 交叉熵损失 (Cross-Entropy Loss):
$$ L = - \sum_{j=1}^K y_j \log p_j $$
由于真实标签 $y$ 通常只有正确的那一类是 1,其他是 0,公式简化为:
$$ L = - \log(p_{correct}) $$
如果正确类别的概率 $p_{correct} = 1$,则 $\log(1) = 0$,Loss = 0。
如果正确类别的概率 $p_{correct} \to 0$,则 $\log(0) \to -\infty$,Loss $\to \infty$。我们会施加一个巨大惩罚。
我们这里的目标,就是把正确类别的概率推向 1。
训练
现在有了网络结构,有了 Loss,怎么找到那一堆参数 $\mathbf{W}$ 和 $\mathbf{b}$?
我们这里使用SGD (随机梯度下降)。
但是,对于深层网络,求导数变得很复杂。比如求第一层的权重 $W_1$ 的导数,你需要穿过 $W_2$, $W_3$... 直到 Loss。
这就需要用到 链式法则 (Chain Rule)。在神经网络中,这个过程有一个专门的名字:反向传播 (Backpropagation)。
- Forward Pass: 数据从输入流向输出,算出 Loss。
- Backward Pass: 误差信号从 Loss 流向输入,沿途计算每个参数的梯度,告诉它们“该变大还是变小”。
来作题。
- 维度
假设输入 $x$ 是 100 维($100 \times 1$)。
隐藏层有 50 个神经元。
输出层有 10 个类别(做 Softmax)。
请问:
- 第一层权重矩阵 $W_1$ 的形状是多少?
- 第二层权重矩阵 $W_2$ 的形状是多少?
这是一道必须画图才能做对的题。记住一个核心原则:矩阵乘法 $(R \times C) \times (C \times 1) = (R \times 1)$,中间的维度必须消除。
第一层: 输入 $x$ 是 $100 \times 1$。输出 $h$ 是 $50 \times 1$。
- 公式:$h = W_1 x$
- 推导:$(? \times ?) \times (100 \times 1) = (50 \times 1)$
- 答案:$W_1$ 必须是 $50 \times 100$。(50 行代表有 50 个神经元,100 列代表每个神经元要接收 100 个输入像素的权重)。
第二层: 输入 $h$ 是 $50 \times 1$。输出 $z$ 是 $10 \times 1$(10个类别)。
- 公式:$z = W_2 h$
- 推导:$(? \times ?) \times (50 \times 1) = (10 \times 1)$
- 答案:$W_2$ 必须是 $10 \times 50$。
最后你可以记住,权重矩阵的形状永远是 [输出节点数 $\times$ 输入节点数]。
- Loss
假设做三分类(猫、狗、鸟)。真实图片是猫。
模型 A 预测概率:[0.6, 0.3, 0.1]
模型 B 预测概率:[0.9, 0.05, 0.05]
那么哪个模型的 Cross-Entropy Loss 更小?
我们传入真实图片是猫,因此猫的特征就应该是($y=1$)。
模型 A说它是猫的概率是 0.6。Loss = $-\log(0.6) \approx 0.51$。
模型 B说它是猫的概率是 0.9。Loss = $-\log(0.9) \approx 0.10$。
因此,模型 B 的 Loss 更小。
Cross-Entropy 是在衡量“惊讶程度”。既然是猫,B 很有信心(0.9),所以惩罚小;A 犹豫不决(0.6),所以惩罚大。
- 激活函数
如果我们把隐藏层的 Sigmoid 换成线性函数,但保留输出层的 Softmax。这个模型还能解决 XOR 问题吗?为什么?
很多人会想:“Softmax 是非线性的,应该能解决 XOR 吧?”
实际上我们不能,
我们不妨来看看会发生什么:
- 隐层:$h = W_1 x$ (线性)
- 输出层输入:$z = W_2 h = W_2 (W_1 x) = (W_2 W_1) x$。
- 本质: 两个矩阵相乘 $W_{new} = W_2 W_1$,它依然是一个矩阵。这说明从 $x$ 到 $z$ 的映射依然是纯线性的。
虽然 Softmax 本身是弯曲的,但它只是把线性的 $z$ 压扁成概率。决定分类边界(Decision Boundary)的依然是 $z$。在 $z$ 的空间里,正负样本依然是线性不可分的。因此,没有 Sigmoid/ReLU 这种“扭曲空间”的激活函数,多少层网络都会退化成单层感知机。
卷积神经网络 (CNN)
还记得上一章的多层感知机吗?每个神经元都要连接输入的所有像素。假设我们想要通过MLP建立一个处理图片的网络会发生什么》
已知一张普通的手机照片(1200万像素),输入向量 $x$ 的长度是 3600万。
如果你想在第一层仅仅放 100 个神经元。权重矩阵 $W$ 的大小就是 $36000000 \times 100 = 36$亿。
你会发现内存溢出,不仅训练不动,即使能跑得了也会因为参数比数据多太多极易过拟合。
生物学家发现,人眼看世界不是“一口气全看完”,而是有策略的:
- 局部性 (Locality): 这里的鸟嘴和那边树叶没关系。判断“鸟嘴”只需要看一小块区域。
- 平移不变性 (Translation Invariance): 鸟飞到左上角是鸟,飞到右下角还是鸟。识别“鸟”的规则(权重)应该是一样的。
于是,卷积 (Convolution) 诞生了。
我们不再用一个巨大的 $W$ 矩阵,而是用一个很小的 $3 \times 3$ 矩阵,我们称为 Kernel 或 kernal。
我们拿着这个小矩阵,像手电筒一样在图片上滑动 (Slide)。无论滑到哪里,用的都是同一个 $3 \times 3$ 矩阵。通过这样的方式,参数量从36亿瞬间降到了9个参数。简直就是降维打击。
卷积的微观算数
当 $3 \times 3$ 的 Kernel 盖在图像的某个 $3 \times 3$ 区域(Receptive Field)上时,我们做的事情很简单:
首先上下对应位置相乘,然后把这 9 个数加起来,再加上偏移量。你得到的这个标量,就是 Feature Map 上的一个像素点。
它代表了:“这一小块区域和我的 Kernel 长得像不像?”(像就是大正数,不像就是 0 或负数)。
我们有两个关键超参数需要介绍:
Stride (步长) $S$: 手电筒每次挪动几格?
- $S=1$: 细致扫描。
- $S=2$: 粗略扫描,同时输出尺寸直接减半。这就是下采样。
Padding (填充) $P$: 如果Kernal移出边界,我们怎么处理?
如果不填充,每次卷完图片都会变小(Corner 还没卷够)。因此通常补一圈 0,保持尺寸不变。
因此,我们可以得出我们的输出尺寸公式为:
$$ \text{Output Size} = \frac{N - K + 2P}{S} + 1 $$
其中:
- $N$: 输入大小
- $K$: Kernel大小
- $P$: Padding
- $S$: Stride
通道
由于我们处理的彩色图片不是只有一个通道,而是三个通道叠在一起(RGB)。所以,输入维度是 $H \times W \times 3$。
为了处理 RGB三个通道,我们的 Kernel 不能只是 $3 \times 3$,它必须是 $3 \times 3 \times 3$。你的深度必须匹配输入通道数。
接下来用这样的结构来做计算,它的 R 层卷输入的 R 层,G 层卷 G 层... 最后把这三个结果加起来。一个 Kernel 卷一次,吐出来的依然是一张单层的 Feature Map(二维矩阵)。
但如果我们只想提取一个特征,用 1 个 kernal 就够了。但我们要提取几百种特征(颜色、纹理、形状...)。
所以我们会选择用 $K$ 个不同的 kernal。每个 kernal 吐出一张 Map,$K$ 个 kernal 就吐出 $K$ 张 Map。我们将这 $K$ 张 Map 叠在一起,形成了下一层的输入:$H' \times W' \times K$。
架构进化史与Transformer
有了卷积层(提取特征)和池化层(Pooling,用来降维/模糊化),我们就能搭建大厦了。
在2012年,AlexNet证明了“深层”卷积网络在 GPU 加持下威力无穷。它的结构还是经典结构:卷积 -> 池化 -> 卷积 -> 池化 -> 全连接。这是深度学习的爆发。
随着网络越来越深(比如 20 层),人们发现效果反而变差了。原因是梯度消失 (Vanishing Gradient) :反向传播时,误差信号乘了几十次小于 1 的数,传到前面就没了。
2015年,ResNet使用了残差链接方式。它在两层网络之间加了一条“旁路”,直接把输入$x$加到输出上:$F(x) + x$。这就像给梯度修了一条高速公路。梯度可以不走复杂的卷积层$F(x)$,直接沿着$x$这条路无损地传回前面。这让网络有了“自我修正”的能力:如果某一层学废了,它至少可以把$x$原封不动地传下去(Identity Mapping),保证效果不会退化。
自这之后,网络深度就继续增加,从20层突破到了上千层。
Transformer
CNN是处理网格数据的绝对王者,但处理序列数据,如文本或语音时,他是怎么演变的?
之前我们使用循环神经网络RNN。它就像阅读一样一个字一个字读。读了上文,记住状态,再读下文。不仅慢,且容易“忘事”。
2017年,一份名叫Attention Is All You Need的文章横空初世。它抛弃了循环,引入了**自注意力 (Self-Attention)**机制。当它读到“银行”这个词时,它会同时看向句子里的所有其他词。如果看到“河流”,它知道这是“河岸”;如果看到“金钱”,它知道这是“金融机构”。它的并行计算能力极强,能捕捉极长距离的关联。这是 ChatGPT 等 LLM 的基石。
下一张,我们会具体深入Transformer,以及它背后的原理。