一、基础概念
1、什么是神经元?
在MLP中,每个层由多个神经元组成。神经元是网络的基本单元,负责接收输入,进行加权求和,然后通过激活函数输出结果。
2、什么是激活函数?
激活函数的作用就像神经网络中的“开关”,它决定了每个神经元是否应该被激活,以及如何激活。
- “是否被激活”指的是一个神经元在给定输入的情况下是否应该参与到网络的计算中。这通常取决于输入信号的强度和权重,以及激活函数的阈值。
- “如何被激活”涉及到激活函数如何将输入信号转换为输出信号。激活函数定义了神经元的输出方式,这可以是简单的线性变换,也可以是复杂的非线性变换。
常见的激活函数
1. Sigmoid 函数
Sigmoid函数是一种将输入压缩到0和1之间的函数,它的数学表达式为:
σ(x)=11+e−xσ(x)=1+e−x1
特点:
- 输出范围:(0, 1)
- 非线性
- 容易饱和(在输入值很大或很小的时候,梯度接近于0,导致梯度消失问题)
应用场景:
- 二分类问题的输出层
2. ReLU 函数
ReLU(Rectified Linear Unit)函数是目前最流行的激活函数之一,它的数学表达式为:
ReLU(x)=max(0,x)ReLU(x)=max(0,x)
特点:
- 输出范围:[0, +∞)
- 在x>0时,梯度恒定为1
- 在x<0时,梯度为0
- 计算简单,速度快
- 容易死亡(如果输入为负,梯度为0,可能导致神经元不再更新)
应用场景:
-
大多数情况下的隐藏层
3. Tanh 函数
Tanh(双曲正切函数)是Sigmoid函数的变种,它的输出范围是-1到1,数学表达式为:
tanh(x)=21+e−2x−1tanh(x)=1+e−2x2−1
特点:
- 输出范围:(-1, 1)
- 零中心化(输出值以0为中心)
- 同样容易饱和
应用场景:
- 与Sigmoid类似,但因为输出是零中心化的,所以有时在隐藏层中使用
4. Softmax 函数
Softmax函数通常用于多分类问题的输出层,它可以将一个向量转换为概率分布,数学表达式为:
Softmax(xi)=exi∑jexjSoftmax(xi)=∑jexjexi
其中,xixi是向量中的第i个元素。
特点:
- 输出范围:(0, 1)
- 输出值的总和为1
- 可以看作是Sigmoid函数在多分类情况下的推广
5. Leaky ReLU
Leaky ReLU是ReLU函数的变种,它解决了ReLU的死亡问题。它的数学表达式为:
LeakyReLU(x)=max(0.01x,x)LeakyReLU(x)=max(0.01x,x)
特点:
- 对于正输入,梯度为1
- 对于负输入,梯度为0.01(或其他小常数)
应用场景:
- 隐藏层,特别是需要解决ReLU死亡问题时
3、什么是前馈?
MLP是前馈网络,意味着数据只在一个方向上流动,从不反向传播。
4、什么是多层感知机(MLP)?
多层感知机(Multilayer Perceptron,MLP)是神经网络的一种类型,由多个层组成,其中包括输入层、一个或多个隐藏层和输出层。
我们可以用一个简单的图来表示一个三层感知机:
二、MLP 的组成部分
1. 输入层 (Input Layer)
输入层的神经元数量通常与数据的特征数量相匹配。每个神经元代表一个特征。例如,如果你的数据集包含每个样本的3个特征,那么输入层将有3个神经元。
2. 隐藏层 (Hidden Layer)
- 神经元数量:隐藏层的神经元数量通常比输入层多,但具体数量需要通过实验来确定。有时,隐藏层的神经元数量会随着网络深度的增加而减少。
- 层数:隐藏层的数量也是根据问题复杂性来确定的。更多的层可以提供更强的学习能力,但也可能导致过拟合和训练难度增加。
- 激活函数:隐藏层通常使用非线性激活函数,如ReLU或Tanh,以引入非线性并增强网络的表达能力。
3. 输出层 (Output Layer)
输出层的神经元数量取决于问题的类型:
- 回归问题:输出层通常有一个神经元,输出一个连续值。
- 二分类问题:输出层通常有一个神经元,输出一个概率值,表示为0到1之间,通常使用Sigmoid激活函数。
- 多分类问题:输出层的神经元数量等于类别的数量,每个神经元对应一个类别。通常使用Softmax激活函数。
三、学习过程
神经网络的学习过程,也称为训练过程,是通过调整网络中的权重和偏置来最小化预测值和真实值之间的差异。这个过程通常包括以下几个关键步骤:
1. 前向传播(Forward Propagation)
在前向传播阶段,输入数据从输入层开始,逐层经过加权求和和激活函数处理,直到输出层产生预测结果。
步骤:
- 输入数据 XX 进入网络。
- 每一层的神经元计算加权和 z=wX+bz=wX+b,其中 ww 是权重,bb 是偏置。
- 应用激活函数 a=f(z)a=f(z) 来引入非线性。
- 重复上述步骤,直到数据到达输出层。
2. 计算损失(Loss Calculation)
一旦网络产生了预测结果,下一步是计算损失函数,以衡量预测值和真实值之间的差异。
常见的损失函数:
- 均方误差(MSE):用于回归问题。
- 交叉熵损失:用于分类问题,包括二分类和多分类。
损失函数: L=1N∑i=1N(yi−y^i)2L=N1∑i=1N(yi−y^i)2 其中 yiyi 是真实值,y^iy^i 是预测值,NN 是样本数量。
3. 反向传播(Backpropagation)
反向传播是神经网络学习的核心,它通过计算损失函数关于权重的梯度来更新权重。
步骤:
- 使用链式法则计算损失函数对每个权重的偏导数(梯度)。
- 梯度表示损失函数相对于权重的变化率。
- 从输出层开始,逆向通过网络,计算每个层的梯度。
4. 权重更新(Weight Update)
一旦计算出梯度,就可以更新网络中的权重和偏置。
步骤:
- 使用梯度下降或其变体(如Adam、RMSprop)来更新权重。
- 更新规则通常是 w=w−α×∇ww=w−α×∇w,其中 αα 是学习率,∇w∇w 是权重的梯度。
5. 迭代优化(Iteration)
学习过程是迭代的,意味着上述步骤会重复多次,直到网络在训练数据上表现良好。
步骤:
- 每个迭代周期称为一个“epoch”。
- 通常,网络会在多个epoch上进行训练,直到损失不再显著降低或达到预定的epoch次数。
6. 超参数调整(Hyperparameter Tuning)
超参数是在学习过程开始之前设置的参数,如学习率、批次大小、网络层数和神经元数量等。
步骤:
- 在训练过程中,可能需要调整超参数以提高性能。
- 可以使用交叉验证、网格搜索或随机搜索等方法来寻找最佳超参数。
7. 评估和测试(Evaluation and Testing)
在训练完成后,需要在独立的测试集上评估模型的性能,以确保模型没有过拟合。
步骤:
- 使用测试集来计算模型的准确率、召回率或其他性能指标。
- 根据测试结果调整模型或超参数。
下面是学习过程的简化图示:
输入数据 ---> 前向传播 ---> 损失计算 ---> 反向传播 ---> 权重更新 ---> 迭代优化 ---> 评估测试
四、项目实战
在接下来的篇章中,我们将深入探讨一个备受推崇的机器学习实战项目:使用多层感知机(MLP)进行手写数字识别。这一经典应用是展示神经网络核心概念与实践操作的绝佳示例。在本项目中,我们将采用Python编程语言,并借助PyTorch这一强大的深度学习框架来构建和训练我们的MLP模型,目标是精准识别MNIST数据集中的手写数字。