MLP是什么?多层感知机入门指南 – wiki基地


多层感知机 (MLP) 入门指南:原理、构建与应用

引言

在人工智能的浪潮中,神经网络无疑是最引人注目的技术之一。从图像识别到自然语言处理,再到复杂的决策制定,神经网络展现出了惊人的能力。而在这庞大的神经网络家族中,多层感知机(Multilayer Perceptron,简称 MLP)是最基础、也是最重要的一员。它不仅是许多复杂网络结构的基石,本身也是一种功能强大的模型,能够解决各种分类和回归问题。

如果你是刚刚接触神经网络,对那些深奥的术语感到困惑,那么恭喜你,你来对地方了。本文将带你深入浅出地了解 MLP 的世界,从最基础的单元——感知机开始,一步步构建起多层网络,理解信息如何在其中流动、知识如何被学习。我们将详细探讨 MLP 的结构、工作原理、训练过程,以及它的应用场景、优势与局限性。读完本文,你将对 MLP 有一个全面而深入的认识,为进一步探索更复杂的神经网络打下坚实的基础。

第一章:神经网络的基石——感知机 (Perceptron)

要理解多层感知机,我们必须先从它的“祖先”——感知机(Perceptron)说起。感知机是 Frank Rosenblatt 在 1957 年提出的,它是第一个具有学习能力的神经网络模型,虽然简单,但意义非凡。

1.1 感知机的基本结构与原理

想象一个非常简单的决策过程。比如,你想决定周末是否出去野餐,需要考虑几个因素:天气(晴朗/阴天)、温度(适宜/寒冷)、是否有朋友同行(是/否)。每个因素都有一个重要程度,比如天气可能最重要,朋友同行次之,温度最后。

感知机正是模仿这种过程。它接收多个输入信号,每个输入信号都有一个对应的“权重”(Weight),表示该信号的重要程度。然后,感知机将所有输入信号与其对应的权重相乘并求和,得到一个“加权和”。最后,将这个加权和与一个“阈值”(Threshold)进行比较。如果加权和超过阈值,感知机就输出 1;否则,输出 0。

数学上表示就是:

假设有 $n$ 个输入 $x_1, x_2, \dots, x_n$,对应的权重为 $w_1, w_2, \dots, w_n$。加权和为 $\sum_{i=1}^n w_i x_i$。
输出 $y$ 为:
$y = \begin{cases} 1 & \text{if } \sum_{i=1}^n w_i x_i \geq \text{阈值} \ 0 & \text{if } \sum_{i=1}^n w_i x_i < \text{阈值} \end{cases}$

为了数学上的方便,我们可以将阈值移项,并引入一个称为“偏置”(Bias)的概念。令 $b = -\text{阈值}$,那么条件就变成 $\sum_{i=1}^n w_i x_i + b \geq 0$。偏置 $b$ 可以看作是让神经元更容易或更难被激活的一个常数。

所以,一个带有偏置的感知机模型可以表示为:

$y = \begin{cases} 1 & \text{if } \sum_{i=1}^n w_i x_i + b \geq 0 \ 0 & \text{if } \sum_{i=1}^n w_i x_i + b < 0 \end{cases}$

这里的 $\sum_{i=1}^n w_i x_i + b$ 通常被称为“净输入”(Net Input)或“激活值”前的加权和。

1.2 感知机的学习规则

感知机最迷人的地方在于它能够从数据中学习。学习的目标是通过调整权重 $w_i$ 和偏置 $b$,使得感知机能够正确地对输入的样本进行分类。

感知机的学习算法非常简单直观:当它对一个训练样本的预测错误时,就根据错误的程度来调整权重和偏置。

具体规则如下:

假设训练样本的输入是 $(x_1, \dots, x_n)$,真实的期望输出是 $t$ (目标值,target),感知机的预测输出是 $y$。
如果预测正确 ($y=t$),则不调整权重和偏置。
如果预测错误 ($y \neq t$):
* 如果预测输出 $y=0$ 但期望输出 $t=1$ (应该输出1却输出0),说明加权和不够大,需要增大。调整方法是:将所有输入的 $x_i$ 加到对应的权重 $w_i$ 上,$w_i^{new} = w_i^{old} + x_i$。同时增大偏置:$b^{new} = b^{old} + 1$。
* 如果预测输出 $y=1$ 但期望输出 $t=0$ (应该输出0却输出1),说明加权和太大了,需要减小。调整方法是:将所有输入的 $x_i$ 从对应的权重 $w_i$ 中减去,$w_i^{new} = w_i^{old} – x_i$。同时减小偏置:$b^{new} = b^{old} – 1$。

为了控制学习的速度,通常会引入一个“学习率”(Learning Rate) $\alpha$ (一个介于 0 和 1 之间的小数)。调整规则变成:

  • 如果预测错误 $(t-y \neq 0)$:
    $w_i^{new} = w_i^{old} + \alpha \cdot (t – y) \cdot x_i$
    $b^{new} = b^{old} + \alpha \cdot (t – y)$

其中 $(t-y)$ 是误差项,当 $t=1, y=0$ 时,误差为 $1$,权重和偏置增加;当 $t=0, y=1$ 时,误差为 $-1$,权重和偏置减小。

这个简单的学习规则被称为感知机学习算法。通过反复迭代,感知机可以在有限的步骤内收敛,前提是训练数据是“线性可分”的。

1.3 感知机的局限性:异或问题 (XOR)

尽管感知机具有学习能力,但它有一个严重的局限性:它只能解决线性可分的问题。所谓线性可分,是指可以通过一条直线(或者在高维空间中是一个超平面)将不同类别的样本完全分开。

最经典的例子是“异或问题”(XOR)。异或操作的真值表如下:

输入 $x_1$ 输入 $x_2$ 输出 $x_1$ XOR $x_2$
0 0 0
0 1 1
1 0 1
1 1 0

如果我们把这些点绘制在二维平面上,你会发现 (0,0) 和 (1,1) 属于一类(输出 0),而 (0,1) 和 (1,0) 属于另一类(输出 1)。无论你如何尝试,都无法画出一条直线将这两类点完全分开。

感知机因为其简单的阈值输出(阶跃函数),本质上只能实现线性分类器。这个局限性在 20 世纪 60 年代末被 Marvin Minsky 和 Seymour Papert 在他们的著作《Perceptrons》中详细阐述,导致了神经网络研究进入了一个“寒冬”。

要克服这个局限性,就需要引入非线性,并且将多个感知机连接起来,形成一个更复杂的网络结构。这就是多层感知机诞生的动机。

第二章:从感知机到神经元——MLP的细胞单位

多层感知机(MLP)中的基本计算单元不再是简单的感知机,而是“神经元”(Neuron),有时也被称为“节点”(Node)。神经元的模型比感知机更通用,因为它引入了“激活函数”(Activation Function)。

2.1 神经元的模型

一个神经元接收来自前一层神经元的输入信号,每个输入信号都有一个对应的权重。它将这些输入信号与权重相乘并求和,加上一个偏置,得到净输入 $z$。

$z = \sum_{i=1}^n w_i x_i + b$

与感知机不同的是,神经元不会直接根据 $z$ 是否大于 0 来决定输出 0 或 1。而是将 $z$ 输入到一个“激活函数” $\sigma(\cdot)$ 中,激活函数的输出才是该神经元的最终输出 $y$。

$y = \sigma(z) = \sigma(\sum_{i=1}^n w_i x_i + b)$

激活函数的作用至关重要。它们引入了非线性。正是因为这些非线性激活函数,多层网络才能够学习和逼近任意复杂的非线性关系,从而解决像异或问题这样的非线性可分任务。

2.2 常见的激活函数

历史上和实践中,有很多不同的激活函数被使用。每种激活函数都有其特点和适用场景。

  • 步进函数 (Step Function): 这就是感知机使用的激活函数。当输入大于等于 0 时输出 1,否则输出 0。它是线性的,不适合多层网络。
    $\sigma(z) = \begin{cases} 1 & \text{if } z \geq 0 \ 0 & \text{if } z < 0 \end{cases}$

  • Sigmoid 函数 (Logistic Function): 这是早期神经网络中非常流行的激活函数。它将实数输入“挤压”(squash)到 (0, 1) 的范围内。
    $\sigma(z) = \frac{1}{1 + e^{-z}}$
    它的优点是可以将输出解释为概率。然而,它存在“梯度消失”(Vanishing Gradient)的问题,当输入 $z$ 很大或很小时,函数的梯度接近于 0,这会导致在反向传播时,传递给前一层的梯度非常小,使得网络难以学习,尤其是在深层网络中。此外,其输出不是以 0 为中心(zero-centered),这也可能对训练造成一定影响。

  • Tanh 函数 (Hyperbolic Tangent): 与 Sigmoid 函数类似,Tanh 函数也将实数输入压缩,但范围是 (-1, 1)。
    $\sigma(z) = \frac{e^z – e^{-z}}{e^z + e^{-z}}$
    Tanh 函数相对于 Sigmoid 函数的一个优点是其输出是以 0 为中心的,这通常有助于模型的训练。但它仍然存在梯度消失的问题。

  • ReLU 函数 (Rectified Linear Unit): 这是目前最常用的激活函数之一。它非常简单:当输入大于 0 时,输出就是输入本身;当输入小于等于 0 时,输出为 0。
    $\sigma(z) = \max(0, z)$
    ReLU 的优点在于计算简单高效,并且在正区间内梯度恒定为 1,有效缓解了梯度消失问题。然而,它也可能存在“死亡 ReLU”(Dying ReLU)的问题,即当神经元输入永远小于 0 时,其梯度永远为 0,导致该神经元再也无法被激活和学习。ReLU 函数也不是以 0 为中心。

  • Leaky ReLU: 为了解决死亡 ReLU 问题,Leaky ReLU 在输入小于等于 0 时引入一个小的非零斜率(通常是 0.01)。
    $\sigma(z) = \begin{cases} z & \text{if } z > 0 \ \alpha z & \text{if } z \leq 0 \end{cases}$
    其中 $\alpha$ 是一个小的正数。

  • Softmax 函数: Softmax 通常用在神经网络的输出层,用于解决多分类问题。它将一个向量的元素“压缩”到 (0, 1) 的范围内,并且所有元素的和为 1。这使得输出可以被解释为属于每个类别的概率。
    对于一个包含 $K$ 个输出的向量 $z = [z_1, z_2, \dots, z_K]$,Softmax 函数的第 $i$ 个输出为:
    $\text{Softmax}(z)i = \frac{e^{z_i}}{\sum{j=1}^K e^{z_j}}$

选择合适的激活函数是构建 MLP 的一个重要环节,它会影响网络的学习能力和训练效率。ReLU 及其变种是目前最流行的选择,而 Sigmoid 和 Tanh 在特定情况下(如循环神经网络)仍然有其用途。Softmax 几乎是多分类输出层的标配。

第三章:MLP 的架构——层层递进的力量

多层感知机之所以称为“多层”,是因为它包含至少一个隐藏层(Hidden Layer)。这是一个由多个神经元组成的层,位于输入层和输出层之间,对网络的学习能力至关重要。

一个典型的 MLP 结构包括:

  1. 输入层 (Input Layer):

    • 这一层不进行任何计算,只负责接收外部输入数据。
    • 输入层神经元的数量等于输入特征的数量。
    • 每个输入神经元将输入值传递给下一层的所有神经元。
  2. 隐藏层 (Hidden Layers):

    • MLP 可以有一个或多个隐藏层。
    • 每个隐藏层由一定数量的神经元组成。
    • 隐藏层中的每个神经元都与前一层(输入层或前一个隐藏层)的所有神经元全连接(Fully Connected),也称为密集连接(Dense Layer)。
    • 每个连接都有一个对应的权重。
    • 每个神经元都有一个偏置。
    • 每个神经元都会对其加权和加上偏置后应用一个激活函数。
    • 隐藏层的作用是通过组合输入特征,学习数据的更高级、更抽象的表示。随着层数的增加,网络能够学习到越来越复杂的模式。
  3. 输出层 (Output Layer):

    • 这是网络的最后一层,负责产生最终的预测结果。
    • 输出层神经元的数量取决于你要解决的问题类型。
      • 回归问题: 通常使用一个神经元,输出一个连续值(如预测房价)。输出层通常不使用激活函数,或者使用线性激活函数(即 $\sigma(z) = z$)。
      • 二分类问题: 可以使用一个神经元,结合 Sigmoid 激活函数,输出一个介于 0 和 1 之间的概率值。
      • 多分类问题: 通常使用与类别数量相同的神经元数量,结合 Softmax 激活函数,输出一个表示属于每个类别的概率分布的向量。
    • 输出层神经元与最后一个隐藏层的所有神经元全连接。

全连接 (Fully Connected): 在 MLP 中,通常指的是每一层的每个神经元都与前一层的所有神经元相连接。这使得网络能够最大化地利用前一层的信息。

深度 (Depth): MLP 的深度通常指的是包含的隐藏层数量。一个具有多个隐藏层的 MLP 被称为深度神经网络(Deep Neural Network, DNN)。MLP 是 DNN 的一种基本形式。

宽度 (Width): 指的是每个隐藏层中神经元的数量。选择合适的层数和每层神经元的数量是构建 MLP 的关键,这通常需要通过实验和调优来确定。

通过多层非线性的转换,MLP 能够将原始输入数据映射到新的特征空间,在这个空间中,原本非线性可分的问题可能变得线性可分。这是 MLP 解决复杂问题的核心能力。

第四章:核心机制——信息在网络中的流动 (前向传播)

理解了 MLP 的结构后,我们来看看信息如何在网络中流动,从输入到输出,这个过程称为前向传播 (Forward Propagation)

前向传播是 MLP 进行预测或产生输出的过程。当给定一个输入样本时,信息从输入层开始,逐层向前传递,直到输出层产生结果。

让我们以一个简单的 MLP 为例:一个输入层,一个隐藏层,一个输出层。

假设:
* 输入层有 $N_I$ 个神经元(对应 $N_I$ 个特征)。
* 隐藏层有 $N_H$ 个神经元。
* 输出层有 $N_O$ 个神经元。

步骤:

  1. 输入层: 接收输入向量 $X = [x_1, x_2, \dots, x_{N_I}]$。这些值直接作为输入层神经元的输出,传递给隐藏层。

  2. 输入层到隐藏层:

    • 每个隐藏层神经元 $j$ (共有 $N_H$ 个) 接收来自输入层所有 $N_I$ 个神经元 $i$ 的输出 $x_i$。
    • 这些连接有对应的权重 $W^{(1)}_{ji}$,表示从输入层神经元 $i$ 到隐藏层神经元 $j$ 的连接强度。
    • 每个隐藏层神经元 $j$ 也有一个偏置 $b^{(1)}_j$。
    • 计算隐藏层神经元 $j$ 的净输入 $z^{(1)}j$:
      $z^{(1)}_j = \sum
      {i=1}^{N_I} W^{(1)}_{ji} x_i + b^{(1)}_j$
      使用矩阵乘法表示,如果输入向量 $X$ 是行向量,权重矩阵 $W^{(1)}$ 是 $N_I \times N_H$ 矩阵,偏置向量 $b^{(1)}$ 是 $1 \times N_H$ 行向量:
      $Z^{(1)} = X W^{(1)} + b^{(1)}$
      其中 $Z^{(1)}$ 是包含所有隐藏层神经元净输入的 $1 \times N_H$ 行向量。
    • 对每个隐藏层神经元 $j$ 的净输入 $z^{(1)}_j$ 应用隐藏层的激活函数 $\sigma_h(\cdot)$,得到隐藏层神经元 $j$ 的输出 $a^{(1)}_j$:
      $a^{(1)}_j = \sigma_h(z^{(1)}_j)$
      矩阵表示:
      $A^{(1)} = \sigma_h(Z^{(1)})$
      其中 $A^{(1)}$ 是包含所有隐藏层神经元输出的 $1 \times N_H$ 行向量。这些输出 $A^{(1)}$ 将作为下一层(输出层)的输入。
  3. 隐藏层到输出层:

    • 每个输出层神经元 $k$ (共有 $N_O$ 个) 接收来自隐藏层所有 $N_H$ 个神经元 $j$ 的输出 $a^{(1)}_j$。
    • 这些连接有对应的权重 $W^{(2)}_{kj}$,表示从隐藏层神经元 $j$ 到输出层神经元 $k$ 的连接强度。
    • 每个输出层神经元 $k$ 也有一个偏置 $b^{(2)}_k$。
    • 计算输出层神经元 $k$ 的净输入 $z^{(2)}k$:
      $z^{(2)}_k = \sum
      {j=1}^{N_H} W^{(2)}_{kj} a^{(1)}_j + b^{(2)}_k$
      使用矩阵乘法表示,如果隐藏层输出 $A^{(1)}$ 是行向量,权重矩阵 $W^{(2)}$ 是 $N_H \times N_O$ 矩阵,偏置向量 $b^{(2)}$ 是 $1 \times N_O$ 行向量:
      $Z^{(2)} = A^{(1)} W^{(2)} + b^{(2)}$
      其中 $Z^{(2)}$ 是包含所有输出层神经元净输入的 $1 \times N_O$ 行向量。
    • 对每个输出层神经元 $k$ 的净输入 $z^{(2)}_k$ 应用输出层的激活函数 $\sigma_o(\cdot)$,得到输出层神经元 $k$ 的最终输出 $\hat{y}_k$:
      $\hat{y}_k = \sigma_o(z^{(2)}_k)$
      矩阵表示:
      $\hat{Y} = \sigma_o(Z^{(2)})$
      其中 $\hat{Y}$ 是包含所有输出层预测结果的 $1 \times N_O$ 行向量。这个 $\hat{Y}$ 就是 MLP 对输入 $X$ 的预测结果。

前向传播是一个相对简单的过程,主要是矩阵乘法和向量加法,然后应用激活函数。它的计算是线性的(加权求和)和非线性的(激活函数)交替进行。

第五章:MLP 如何学习——揭秘训练过程

MLP 的强大能力在于它的学习能力。学习过程就是通过不断调整网络中的权重 $W$ 和偏置 $b$,使得网络对训练数据的预测结果 $\hat{Y}$ 尽可能接近真实的期望输出 $Y$。这个过程通常称为训练 (Training)

MLP 的训练是一个迭代优化的过程,核心思想是梯度下降反向传播

5.1 衡量误差:损失函数 (Loss Function)

在学习过程中,我们需要一个方法来量化网络的预测结果与真实结果之间的差距,这个差距称为“误差”或“损失”。用于计算这个差距的函数就是损失函数 (Loss Function),也称为成本函数 (Cost Function) 或目标函数 (Objective Function)。

不同的问题类型使用不同的损失函数:

  • 回归问题:

    • 均方误差 (Mean Squared Error, MSE): 最常用的回归损失函数。计算预测值与真实值之差的平方的平均值。
      $L(Y, \hat{Y}) = \frac{1}{m} \sum_{i=1}^m (y_i – \hat{y}_i)^2$
      其中 $m$ 是样本数量,$y_i$ 是真实值,$\hat{y}_i$ 是预测值。
    • 平均绝对误差 (Mean Absolute Error, MAE): 计算预测值与真实值之差的绝对值的平均值。
      $L(Y, \hat{Y}) = \frac{1}{m} \sum_{i=1}^m |y_i – \hat{y}_i|$
  • 分类问题:

    • 交叉熵 (Cross-Entropy): 分类问题中最常用的损失函数,尤其与 Softmax 激活函数结合使用。它衡量两个概率分布之间的差异。
      • 二分类交叉熵 (Binary Cross-Entropy): 用于二分类问题 (输出层一个神经元,Sigmoid 激活)。
        $L(y, \hat{y}) = – [y \log(\hat{y}) + (1-y) \log(1-\hat{y})]$
        其中 $y$ 是真实标签 (0 或 1),$\hat{y}$ 是模型预测为类别 1 的概率。
      • 多分类交叉熵 (Categorical Cross-Entropy): 用于多分类问题 (输出层多个神经元,Softmax 激活)。
        $L(Y, \hat{Y}) = – \sum_{i=1}^N \sum_{k=1}^K y_{ik} \log(\hat{y}{ik})$
        其中 $N$ 是样本数量,$K$ 是类别数量,$y
        {ik}$ 是指示变量 (如果第 $i$ 个样本属于第 $k$ 类则为 1,否则为 0),$\hat{y}_{ik}$ 是模型预测第 $i$ 个样本属于第 $k$ 类的概率。

训练的目标就是找到一组权重 $W$ 和偏置 $b$,使得损失函数的值最小化。

5.2 优化算法:梯度下降 (Gradient Descent)

损失函数的值取决于网络中的所有权重和偏置。我们希望找到一个方法,能够系统地调整这些参数,使得损失函数不断减小。梯度下降就是这样的一个优化算法。

想象损失函数在一个高维空间中形成一个“地形”,其中每个维度代表一个权重或偏置,高度代表损失函数的值。我们的目标是找到地形的最低点(全局最小值或局部最小值)。

梯度是函数值变化最快的方向(方向导数最大的方向)。在损失函数的地形中,梯度指向损失函数值增加最快的方向。因此,如果我们想减小损失函数的值,就应该沿着梯度的反方向移动。

梯度下降算法的工作原理是:

  1. 随机初始化网络的权重和偏置。
  2. 在一个或一批训练样本上进行前向传播,计算预测输出 $\hat{Y}$。
  3. 使用损失函数计算当前预测结果与真实结果 $Y$ 之间的损失 $L$。
  4. 计算损失函数 $L$ 关于每个权重和偏置的梯度(即损失函数随每个权重和偏置的变化率)。这些梯度告诉我们,如果稍微改变某个权重或偏置,损失函数会如何变化。
  5. 沿着梯度的反方向更新每个权重和偏置。更新的步长由学习率 $\alpha$ 控制。
    $W^{new} = W^{old} – \alpha \cdot \frac{\partial L}{\partial W^{old}}$
    $b^{new} = b^{old} – \alpha \cdot \frac{\partial L}{\partial b^{old}}$
  6. 重复步骤 2-5,直到损失函数收敛(变化很小)或达到预设的训练轮次(Epoch)。

学习率 (Learning Rate): 是一个重要的超参数,它决定了每一步参数更新的幅度。学习率太小可能导致收敛非常缓慢,学习率太大可能导致训练过程不稳定,甚至错过最优解。

Epoch: 指的是在训练过程中,所有训练样本都被用来训练一遍的完整周期。

Batch Size: 在实践中,我们通常不会一次性使用所有训练样本计算梯度(这称为批量梯度下降,Batch Gradient Descent)。而是将训练数据分成若干个小批次(Batch)。每次更新参数时,只使用一个小批次的数据来计算梯度。这种方式称为随机梯度下降 (Stochastic Gradient Descent, SGD) 的变种(技术上是 Mini-batch Gradient Descent)。Batch Size 是指每个小批次包含的样本数量。使用小批次可以减少计算量,并引入一定的随机性,有助于跳出局部最优。

5.3 计算梯度:反向传播 (Backpropagation)

梯度下降算法的核心是计算损失函数关于每个权重和偏置的梯度。对于一个包含多个层的网络来说,手动计算这些梯度将非常复杂。幸运的是,有一种高效的算法可以自动完成这个任务,这就是反向传播算法 (Backpropagation)

反向传播是 Rumelhart, Hinton, 和 Williams 在 1986 年提出的一种计算神经网络梯度的方法,极大地推动了神经网络的发展。它的核心思想是利用链式法则(Chain Rule)从网络的输出层开始,计算损失函数相对于各层参数的梯度,并逐层向前传播,直到输入层。

简单来说,反向传播做了以下事情:

  1. 前向传播: 首先,输入样本通过网络进行前向传播,计算各层神经元的输出,直到计算出最终的预测结果 $\hat{Y}$ 和总的损失 $L$。
  2. 计算输出层误差: 计算输出层神经元的“误差”(或更准确地说,是损失函数关于输出层净输入的梯度)。这个误差是根据损失函数和输出层的激活函数计算出来的。
  3. 反向传播误差: 将输出层的误差向前传播给最后一个隐藏层。具体来说,根据链式法则,计算损失函数关于最后一个隐藏层净输入的梯度。这个梯度依赖于输出层的误差以及连接两层之间的权重。
  4. 计算隐藏层误差: 利用接收到的误差,计算该隐藏层自身的误差(即损失函数关于该层净输入的梯度)。
  5. 计算参数梯度: 利用该层的误差和前一层神经元的输出,计算损失函数关于该层权重和偏置的梯度。
  6. 重复: 重复步骤 3-5,将误差和梯度逐层向前传播,直到计算出损失函数关于所有权重和偏置的梯度。

反向传播的关键在于,它避免了重复计算,并且能够高效地计算出网络中每一个参数的梯度。有了这些梯度,我们就可以使用梯度下降(或其变种)来更新参数,从而减小损失函数的值。

反向传播算法和梯度下降优化器的结合,是训练 MLP 和大多数现代神经网络的基石。

5.4 优化器的变种

基本的批量梯度下降或随机梯度下降(SGD)可能存在收敛速度慢、容易陷入局部最优等问题。因此,研究人员开发了许多更高级的优化算法,它们在 SGD 的基础上进行改进,以提高训练效率和稳定性。常见的优化器包括:

  • SGD with Momentum: 引入动量项,模拟物理学中的动量概念,使得更新方向不仅取决于当前梯度,还受到之前更新方向的影响,有助于加速收敛和越过局部最优。
  • Adagrad: 根据参数的历史梯度大小来调整学习率,对于不频繁更新的参数给予较大的学习率,对于频繁更新的参数给予较小的学习率。
  • RMSprop: 改进 Adagrad,引入指数衰减平均,只考虑最近的梯度信息来调整学习率,解决了 Adagrad 学习率可能过快下降的问题。
  • Adam (Adaptive Moment Estimation): 结合了 Momentum 和 RMSprop 的优点,同时考虑梯度的第一阶矩估计(均值)和第二阶矩估计(方差)来自适应地调整每个参数的学习率。Adam 是目前最常用和效果最好的优化器之一。

选择合适的优化器也是训练 MLP 时需要考虑的因素。

第六章:训练 MLP 的实践要点

成功训练一个 MLP 不仅仅是理解原理,还需要掌握一些实践中的技巧和注意事项。

6.1 数据预处理

  • 特征缩放: 神经网络对输入数据的尺度很敏感。通常需要对输入特征进行标准化(Standardization,使数据均值为 0,方差为 1)或归一化(Normalization,将数据缩放到 [0, 1] 或 [-1, 1] 范围内)。这有助于加快梯度下降的收敛速度。
  • 处理类别特征: 类别特征(如颜色、城市)需要转换为数值形式,常用的方法是独热编码(One-Hot Encoding)。
  • 训练集、验证集和测试集划分: 将数据集划分为三个部分。
    • 训练集: 用于训练模型,即更新网络的权重和偏置。
    • 验证集: 用于在训练过程中评估模型的性能,并根据验证集上的表现调整超参数(如学习率、层数、神经元数量等),以及用于提前停止(Early Stopping)防止过拟合。模型在训练过程中不会接触验证集的标签信息。
    • 测试集: 用于在模型训练完成后,对模型的最终性能进行无偏评估。测试集只在训练完成后使用一次。

6.2 参数初始化

网络权重的初始值对训练过程有很大影响。糟糕的初始化可能导致梯度消失或爆炸,使训练难以进行。通常采用一些随机初始化方法,如 Glorot/Xavier 初始化或 He 初始化,这些方法会根据神经元的数量来调整权重的初始尺度。偏置通常初始化为 0。

6.3 过拟合与欠拟合

  • 欠拟合 (Underfitting): 模型在训练集上表现不佳,说明模型的学习能力不足,无法捕捉数据的内在模式。可能原因:模型太简单(层数或神经元太少)、训练不足、学习率太低、特征不足等。
  • 过拟合 (Overfitting): 模型在训练集上表现很好,但在验证集或测试集上表现很差,说明模型过度学习了训练数据中的噪声和细节,泛化能力差。可能原因:模型太复杂、训练数据不足、训练过度、学习率过高、特征过多等。

6.4 防止过拟合的技巧

防止过拟合是训练神经网络中的一个重要挑战。常用方法包括:

  • 增加训练数据: 数据越多,模型越不容易记住噪声。
  • 简化模型: 减少层数或每层神经元的数量。
  • 正则化 (Regularization):
    • L1/L2 正则化: 在损失函数中添加权重平方和(L2)或绝对值和(L1)的惩罚项,鼓励模型使用更小的权重,从而降低模型复杂度。
    • Dropout: 在训练过程中,随机地“关闭”(即输出为 0)一部分神经元及其连接。这迫使网络不过分依赖于任何单个神经元,提高了模型的鲁棒性和泛化能力。Dropout 只在训练时使用,测试时所有神经元都激活。
  • 提前停止 (Early Stopping): 在训练过程中监控模型在验证集上的性能。当验证集上的损失不再下降或开始上升时,就停止训练。这可以防止模型在训练集上继续优化,但在验证集上过拟合。

6.5 超参数调优

MLP 有很多超参数需要设置,如学习率、Batch Size、Epochs 数量、隐藏层数量、每层神经元数量、激活函数、优化器、正则化参数等。超参数的选择对模型的性能至关重要。通常通过实验(如网格搜索、随机搜索、贝叶斯优化等)在验证集上进行调优。

第七章:MLP 的应用场景

尽管现在有很多更复杂的神经网络结构(如 CNN、RNN),但作为基础模型,MLP 在许多领域仍然有广泛的应用,特别是在处理结构化数据(表格数据)的任务上。

  • 分类问题:
    • 手写数字识别(早期应用,如 MNIST 数据集)
    • 垃圾邮件检测
    • 信用评分
    • 疾病诊断(基于患者特征)
    • 客户流失预测
  • 回归问题:
    • 房价预测
    • 股票价格预测
    • 销售量预测
    • 工业过程控制
  • 模式识别:
    • 简单的图像识别(像素作为输入)
    • 语音识别(声学特征作为输入)
  • 数据压缩:
    • 使用自编码器(Autoencoder),其解码器部分本质上是一个 MLP。
  • 作为其他模型的组件: MLP 经常作为更复杂网络(如深度学习模型、强化学习中的策略网络或值函数网络)的一部分出现。

第八章:MLP 的优势与局限性

了解一个模型的优缺点,有助于判断何时使用它以及何时需要考虑其他模型。

8.1 优势

  • 结构简单,易于理解: 相对于 CNN 和 RNN 等更复杂的结构,MLP 的基本原理和结构更容易理解。
  • 理论基础: MLP 具有“通用近似定理”(Universal Approximation Theorem),该定理表明,一个包含一个隐藏层的 MLP,只要隐藏层神经元的数量足够多,理论上可以逼近任意连续函数。这赋予了 MLP 强大的建模能力。
  • 适用于结构化数据: 对于传统的表格数据,MLP 是一个强大且常用的模型。
  • 是其他复杂网络的基础: 许多现代神经网络的设计都借鉴了 MLP 的层和连接思想。

8.2 局限性

  • 对输入顺序不敏感: MLP 的输入是一个向量,它假设输入特征之间是独立的或其顺序不重要。这使得它不擅长处理序列数据(如文本、时间序列),这些任务更适合使用 RNN 或 Transformer。
  • 不擅长处理空间结构数据: 对于图像这样的具有空间局部性和平移不变性的数据,将像素直接展平作为 MLP 的输入会丢失重要的空间信息。CNN 是处理图像的更好选择。
  • 需要手动进行特征工程(有时): 虽然 MLP 可以学习特征组合,但在处理某些复杂数据时,可能需要先进行一定的特征工程,提取出对模型更有用的特征。
  • 梯度消失/爆炸问题: 尤其在使用 Sigmoid 或 Tanh 激活函数且网络较深时,容易出现梯度消失,导致难以训练。虽然 ReLU 及其变种缓解了这个问题,但仍需注意。
  • 超参数调优复杂: MLP 的性能对超参数的选择比较敏感,需要经验和实验来找到最优配置。

第九章:构建你的第一个 MLP(概念篇)

虽然本文不提供具体的编程代码,但我们将概述使用常用深度学习库(如 TensorFlow/Keras 或 PyTorch)构建和训练 MLP 的一般步骤。

  1. 准备数据:

    • 收集和清洗数据。
    • 进行特征工程和预处理(如缩放、编码)。
    • 将数据划分为训练集、验证集和测试集。
  2. 定义模型:

    • 选择使用顺序模型(Sequential Model)或其他模型容器。
    • 添加输入层(通常是隐式的,由第一层指定输入形状)。
    • 添加一个或多个 Dense(全连接)层作为隐藏层。
      • 指定该层的神经元数量。
      • 指定激活函数(如 ‘relu’)。
      • 如果这是第一个隐藏层,需要指定输入数据的形状 input_shape
    • 添加输出层。
      • 指定神经元数量(取决于问题类型)。
      • 指定输出层激活函数(回归通常为线性,二分类为 ‘sigmoid’,多分类为 ‘softmax’)。
  3. 编译模型:

    • 配置模型的学习过程。
    • 指定优化器(如 ‘adam’)。
    • 指定损失函数(取决于问题类型,如 ‘mse’、’binary_crossentropy’、’categorical_crossentropy’)。
    • 指定评估指标(如 ‘accuracy’ 用于分类,’mae’ 或 ‘mse’ 用于回归)。
  4. 训练模型:

    • 调用模型的 fit() 方法。
    • 传入训练数据(输入特征和标签)。
    • 指定训练轮次 epochs
    • 指定 Batch Size batch_size
    • 传入验证数据 validation_data 以监控训练过程和进行超参数调优。
    • 可以设置回调函数(Callbacks),如 EarlyStopping 来提前停止训练。
  5. 评估模型:

    • 训练完成后,使用测试数据调用模型的 evaluate() 方法,评估模型在未见过的数据上的泛化能力。
  6. 进行预测:

    • 使用训练好的模型调用 predict() 方法,对新的、未见过的数据进行预测。

这是一个简化的流程,但在实践中涉及更多细节,比如数据加载、模型保存与加载、更复杂的优化器配置等。但核心思想是定义结构、配置学习过程、输入数据进行迭代训练。

结论

多层感知机(MLP)作为最基础的神经网络结构之一,在机器学习领域扮演着承前启后的重要角色。它通过连接多个具有非线性激活函数的神经元,克服了单层感知机只能处理线性可分问题的局限性,具备了逼近任意复杂函数的能力。

本文从感知机的概念出发,介绍了神经元的模型、激活函数的作用,详细阐述了 MLP 的分层全连接架构。我们深入探讨了 MLP 的核心工作原理:前向传播如何计算输出,以及如何利用损失函数、梯度下降和反向传播进行学习和优化。同时,我们也讨论了训练过程中的实践要点,如数据预处理、初始化、过拟合与正则化,以及超参数调优。最后,我们回顾了 MLP 的常见应用场景、优势与局限性,并概述了构建 MLP 的基本步骤。

理解 MLP 是迈入神经网络和深度学习世界的关键一步。它是许多更先进模型的基础,其核心概念——层、神经元、权重、偏置、激活函数、前向传播、损失函数、梯度下降、反向传播——贯穿于整个深度学习领域。

虽然 MLP 在处理图像、序列等特定类型数据时可能不如 CNN 或 RNN 等专业网络结构,但它在处理结构化数据和作为其他模型组件方面依然具有价值。更重要的是,掌握 MLP 的原理,能让你更好地理解更复杂的深度学习模型,从而在不断发展的 AI 领域中游刃有余。

希望这篇详细的入门指南能帮助你建立起对多层感知机的清晰认识,激发你进一步探索神经网络和深度学习的热情!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部