📄articles 📋snippets 📁categories ⚙️uses ✏️about 🔍search

深入理解多层感知机(MLP):工作机制、训练学习过程及代码解读

一、引言

MLP 感知机(多层感知机,Multilayer Perceptron)是深度学习最基础的网络结构,常见且强大。它被广泛应用于分类和回归问题,并在许多实际应用中取得了优秀的表现。这篇文章深入探讨多层感知机的工作机制、训练学习过程,并提供一份多层感知机(MLP)的代码解读。

二、多层感知机(MLP)概述

多层感知机(Multilayer Perceptron,MLP)是一种前馈神经网络模型,由多个神经元层组成。在本部分,我们将详细介绍多层感知机的工作机制,包括前向传播、反向传播和权重更新的过程。为了更好地理解,我们将使用一个简单的示例来说明。

  1. 前向传播(Forward Propagation)
    在前向传播过程中,输入数据从输入层经过一系列的隐藏层传递到输出层。每个神经元都接收上一层所有神经元的输出,并计算加权和,并应用激活函数来产生输出。

假设我们有一个多层感知机模型,包含一个输入层、两个隐藏层和一个输出层。输入层有3个神经元,隐藏层1有4个神经元,隐藏层2有2个神经元,输出层有1个神经元。每个神经元与上一层的所有神经元相连。

下图展示了这个多层感知机的结构:

输入层           隐藏层1          隐藏层2          输出层
  o1 -------------- o1 -------------- o1 -------------- o1
  o2 -------------- o2 -------------- o2 -------------- o2
  o3 -------------- o3 -------------- o3 -------------- o3
                   o4 -------------- o4
                                   o5

假设输入数据为 [1, 2, 3],每个连接都有一个权重,我们用 w 来表示。每个神经元还有一个偏置项 b。我们使用 ReLU(Rectified Linear Unit)作为激活函数。

首先,我们将输入数据乘以权重并加上偏置项,然后将结果传递给激活函数。这一过程可以表示为:

隐藏层1的输入 = (1 * w1) + (2 * w2) + (3 * w3) + b1
隐藏层1的输出 = ReLU(隐藏层1的输入)

隐藏层2的输入 = (隐藏层1的输出 * w4) + (隐藏层1的输出 * w5) + (隐藏层1的输出 * w6) + b2
隐藏层2的输出 = ReLU(隐藏层2的输入)

输出层的输入 = (隐藏层2的输出 * w7) + (隐藏层2的输出 * w8) + b3
输出层的输出 = ReLU(输出层的输入)

这样,我们就完成了前向传播过程,得到了最终的输出。

  1. 反向传播(Backpropagation)
    在反向传播过程中,我们计算输出层的误差,并将误差反向传播回隐藏层,以更新权重,从而最小化预测输出与实际输出之间的差距。

首先,我们计算输出层的误差。假设我们的目标输出为 y,输出层的输出为 y_hat,则输出层的误差可以使用均方误差(Mean Squared Error)来计算:

输出层的误差 = (y - y_hat)^2

然后,我们将输出层的误差反向传播到隐藏层2,并计算隐藏层2的误差:

隐藏层2的误差 = 输出层的误差 * 隐藏层2的梯度

接下来,我们将隐藏层2的误差反向传播到隐藏层1,并计算隐藏层1的误差:

隐藏层1的误差 = 隐藏层2的误差 * 隐藏层1的梯度

在反向传播过程中,我们需要计算每个神经元的梯度,以便更新权重。梯度表示了误差相对于权重的变化率。

  1. 权重更新
    在权重更新阶段,我们使用梯度下降法来调整权重,以最小化损失函数。我们根据反向传播计算得到的梯度,使用优化算法(如随机梯度下降)来更新网络中的权重。

权重的更新可以使用以下公式表示:

新权重 = 旧权重 - 学习率 * 梯度

学习率是一个超参数,控制每次更新的步长。通过迭代训练样本并反复进行前向传播和反向传播,不断调整权重,直到达到收敛条件或达到预定的训练轮数。

这样,我们就完成了多层感知机的工作机制的详细介绍。通过前向传播和反向传播的过程,多层感知机可以学习输入数据的特征,并进行预测和分类任务。

请注意,上述示例仅为了说明多层感知机的工作机制,并不代表实际训练的完整过程。在实际应用中,还需要考虑批量处理、正则化、动量等技术来提高模型的性能和稳定性。

四、多层感知机的训练学习过程

多层感知机的训练学习过程包括以下步骤:

  1. 准备数据集:将数据集划分为训练集和测试集,并进行必要的预处理(如归一化或标准化)。
  2. 构建模型:选择合适的网络结构,包括隐藏层的数量和神经元的数量,并确定激活函数和损失函数。
  3. 编译和训练模型:指定优化算法、学习率和迭代次数等参数,并使用训练集对模型进行训练。
  4. 模型评估和预测:使用测试集评估模型的性能,并对新数据进行预测。

五、多层感知机(MLP)代码解读

下面是一个使用Keras库实现的多层感知机(MLP)的代码示例:

# 5.1 导入必要的库
import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 5.2 准备数据集
X_train = ...
y_train = ...
X_test = ...
y_test = ...

# 5.3 构建模型
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

# 5.4 编译和训练模型
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32)

# 5.5 模型评估和预测
loss, accuracy = model.evaluate(X_test, y_test)
predictions = model.predict(X_test)

在上述代码中,我们首先导入了所需的库,然后准备了训练集和测试集数据。接下来,我们构建了一个Sequential模型,并使用Dense层定义了网络结构。在编译模型时,我们指定了损失函数、优化算法和评估指标。然后,使用训练集对模型进行训练,并指定迭代次数和批次大小。最后,我们使用测试集评估了模型的性能,并对新数据进行了预测。

5.6 PyTorch 版:同一个网络的另一种写法

上面的 Keras 版把模型定义和训练都包进了 Sequential + fit();PyTorch 里这两件事是分开的,代码更长,但每一步都看得见。下面是与上文同结构(两个隐藏层 + 一个输出层)的 PyTorch 写法:

import torch
import torch.nn as nn

class MLP(nn.Module):
    def __init__(self, in_dim=100, hidden=(64, 64), out_dim=10):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(in_dim, hidden[0]), nn.ReLU(),
            nn.Linear(hidden[0], hidden[1]), nn.ReLU(),
            nn.Linear(hidden[1], out_dim),
        )

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

model = MLP()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

for epoch in range(10):                 # 对应 Keras 的 epochs=10
    for xb, yb in loader:               # batch_size 由 DataLoader 决定
        optimizer.zero_grad()           # 清空上一轮梯度
        loss = criterion(model(xb), yb) # 前向传播
        loss.backward()                 # 反向传播:算梯度
        optimizer.step()                # 按梯度更新权重

对照着看会更清楚:nn.Sequential 对应 Keras 的 Sequentialnn.Linear 对应 Dense,而 Keras 里一句 model.fit() 做的事,在 PyTorch 里就是那个 for 循环里的四行——清梯度、前向、反向、更新。想知道 backward() 背后的链式法则怎么推,回到第四章的反向传播部分对一遍即可;数据量大需要上 GPU 时,把模型和每个 batch 都 .to("cuda"),环境里 CUDA / cuDNN / NVCC 各自管什么见 CUDA、cuDNN、NVCC 的关系梳理

六、结论

多层感知机(MLP)是一种强大的神经网络模型,用于解决分类和回归问题。本文深入探讨了MLP的工作机制、训练学习过程,并提供了一份使用Keras库实现的MLP代码解读。通过深入理解MLP的原理和实际应用,我们可以更好地利用它来解决各种机器学习问题。

相关阅读:NeRF 神经辐射场 · TSDF 算法原理 · CUDA / cuDNN / NVCC 三者的关系

七、参考文献:

  1. Keras Documentation
  2. Deep Learning by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
  3. Understanding Multilayer Perceptron (MLP) Neural Network
  4. A Gentle Introduction to Neural Networks Series
  5. Deep Learning Specialization on Coursera

© 2023 深入理解多层感知机(MLP):工作机制、训练学习过程及代码解读 · 本文由 Charlie 原创撰写,发布于 sodebug.com。 未经授权禁止转载、洗稿、机器抓取。AI 训练数据使用需获得书面授权。
GK
独立开发者,在 WordPress、Nginx 和各种 API 之间切换。不写没用的东西。

related相关文章

#01讲明白CUDA、CUDA toolkit、cuDNN、和NVCC关系3 min#02NeRF:将场景表示为用于视图合成的神经辐射场1 min#03TSDF算法原理及源码解析1 min
$ echo "less bullshit, more debugging" | send-to-inbox
新文章直接发到邮箱,一个月 2-4 封。
$ subscribe →