机器学习实战(9):神经网络基础——从感知机到多层感知机


  • 机器学习中的神经网络部分是大模型LLM训练的基础之基础,熟练掌握这一部分的知识和基础技能对后续理解大模型原理至关重要!

第9集:神经网络基础------从感知机到多层感知机

在机器学习中,神经网络(Neural Networks) 是一种强大的工具,能够解决复杂的分类和回归问题。从简单的感知机到复杂的多层感知机(MLP),神经网络已经成为深度学习的核心技术之一。今天我们将深入探讨神经网络的基本结构,并通过实践部分使用 TensorFlow/Keras 构建一个多层感知机(MLP)来解决 MNIST 手写数字识别问题。


神经网络的基本结构

1. 感知机

感知机是神经网络的基本单元,其核心思想是通过加权求和和激活函数对输入数据进行非线性变换。公式如下:
y = f ( ∑ i = 1 n w i x i + b ) y = f(\sum_{i=1}^{n} w_i x_i + b) y=f(i=1∑nwixi+b)

其中:

  • x i 是输入特征。 x_i 是输入特征。 xi是输入特征。
  • w i 是权重。 w_i 是权重。 wi是权重。
  • b 是偏置。 b 是偏置。 b是偏置。
  • f 是激活函数。 f 是激活函数。 f是激活函数。

图1:感知机示意图

(图片描述:一个简单的感知机模型,包含输入节点、权重、偏置和激活函数。)

2. 多层感知机(MLP)

多层感知机由多个感知机组成,通常包括以下几层:

  • 输入层:接收原始数据。
  • 隐藏层:通过非线性变换提取特征。
  • 输出层:生成预测结果。

每一层的输出作为下一层的输入,形成前向传播过程。


激活函数

激活函数为神经网络引入非线性能力,使其能够拟合复杂的数据分布。以下是几种常见的激活函数:

1. ReLU(Rectified Linear Unit)

公式:
f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

特点:计算简单,避免梯度消失问题。

2. Sigmoid

公式:
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1

特点:将输出压缩到 [0, 1] 区间,适用于概率输出。

3. Tanh

公式:
f ( x ) = tanh ⁡ ( x ) = e x − e − x e x + e − x f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x

特点:将输出压缩到 [-1, 1] 区间,比 Sigmoid 更适合隐藏层。

图2:激活函数对比

(图片描述:折线图展示了 Sigmoid 、Tanh、ReLU和 Leaky ReLu 的形状,ReLU 和 Leaky ReLu 在正区间为线性增长,Sigmoid 和 Tanh 分别压缩到 [0, 1] 和 [-1, 1]。)


反向传播算法

反向传播是训练神经网络的核心算法,其目标是最小化损失函数。具体步骤如下:

  1. 前向传播:计算预测值。
  2. 计算损失:评估预测值与真实值之间的误差。
  3. 反向传播:根据链式法则计算梯度。
  4. 参数更新:使用梯度下降法更新权重和偏置。

公式如下:
Δ w = − η ∂ L ∂ w \Delta w = -\eta \frac{\partial L}{\partial w} Δw=−η∂w∂L

其中:

  • η 是学习率。 \eta 是学习率。 η是学习率。
  • L 是损失函数。 L 是损失函数。 L是损失函数。

使用 TensorFlow/Keras 构建简单的神经网络

Keras 是一个高级神经网络 API,支持快速构建和训练模型。我们使用 Keras 来实现一个多层感知机(MLP)。


实践部分:构建 MLP 解决 MNIST 手写数字识别问题

数据集简介

MNIST 数据集包含 70,000 张 28x28 像素的手写数字图像(0-9)。每张图像被展平为 784 维向量。目标是构建一个神经网络模型,能够准确识别手写数字。

完整代码

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical

# 加载 MNIST 数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 数据预处理
X_train = X_train.astype('float32') / 255.0  # 归一化到 [0, 1]
X_test = X_test.astype('float32') / 255.0
y_train = to_categorical(y_train, 10)  # 将标签转换为 one-hot 编码
y_test = to_categorical(y_test, 10)

# 构建多层感知机模型
model = Sequential([
    Flatten(input_shape=(28, 28)),  # 展平输入图像
    Dense(128, activation='relu'),  # 隐藏层,128 个神经元,使用 ReLU 激活函数
    Dense(64, activation='relu'),   # 隐藏层,64 个神经元,使用 ReLU 激活函数
    Dense(10, activation='softmax') # 输出层,10 个神经元,使用 Softmax 激活函数
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
history = model.fit(X_train, y_train, epochs=10, batch_size=128, validation_split=0.2)

# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {test_accuracy:.2f}")

# 绘制训练过程中的损失和准确率曲线
plt.figure(figsize=(12, 5))

# 损失曲线
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss Curve', fontsize=16)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('Loss', fontsize=12)
plt.legend()
plt.grid()

# 准确率曲线
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Accuracy Curve', fontsize=16)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('Accuracy', fontsize=12)
plt.legend()
plt.grid()

plt.show()

运行结果

输出结果
复制代码
Test Accuracy: 0.97
训练过程可视化

图3:损失与准确率曲线

(图片描述:左侧子图展示了训练和验证损失随 epoch 的变化,右侧子图展示了训练和验证准确率的变化,两条曲线均趋于平稳。)


总结

本文介绍了神经网络的基本结构、激活函数和反向传播算法,并通过实践部分展示了如何使用 TensorFlow/Keras 构建一个多层感知机(MLP)来解决 MNIST 手写数字识别问题。希望这篇文章能帮助你更好地理解神经网络的基础知识!


下集预告:机器学习实战(10):深度学习初探------卷积神经网络(CNN)

参考资料

相关推荐
Danceful_YJ3 小时前
33.Transformer架构
人工智能·pytorch·深度学习
美狐美颜SDK开放平台5 小时前
美颜SDK性能优化实战:GPU加速与AI人脸美型的融合开发
人工智能·音视频
AI浩6 小时前
VSSD:具有非因果状态空间对偶性的视觉Mamba模型
人工智能·目标检测·计算机视觉
lqqjuly6 小时前
Lidar调试记录Ⅳ之Ubuntu22.04+ROS2+Livox_SDK2环境下编译Livox ROS Driver 2
人工智能·机器人·自动驾驶
qq_436962186 小时前
数据中台:打破企业数据孤岛,实现全域资产化的关键一步
数据库·人工智能·信息可视化·数据挖掘·数据分析
宇若-凉凉7 小时前
BERT 完整教程指南
人工智能·深度学习·bert
JD技术委员会7 小时前
如何在跨部门沟通失误后进行协调与澄清
人工智能
PcVue China7 小时前
PcVue X 工控——工厂数字化转型与落地巡回研讨会圆满举行
人工智能·软件工程·scada·监控平台·工控网
StarPrayers.8 小时前
自蒸馏学习方法
人工智能·算法·学习方法
咚咚王者8 小时前
人工智能之编程进阶 Python高级:第十一章 过渡项目
开发语言·人工智能·python