跳转到内容

2:多层感知机理论

机器学习Banner

🧠 从线性到非线性——走进深度学习的核心

Section titled “🧠 从线性到非线性——走进深度学习的核心”

线性回归给了你一条直线,但现实中绝大多数问题都不是一条直线能解决的。多层感知机(MLP) 通过在输入和输出之间插入隐藏层与非线性激活函数,让模型拥有了”弯曲”的表达能力——它是所有现代深度神经网络(CNN、RNN、Transformer)的构建基础。这一节,你要彻底搞懂它的原理。

你需要完成:

  1. 解释 MLP 涉及的核心概念
  2. 回答有关 XOR、参数量、激活函数和 Dropout 的关键问题
  3. 手写一个 MLP 类,并在双月数据集上训练验证

1. 基础结构:

  • 隐藏层
  • 全连接层
  • 激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、Softmax)
  • 权重矩阵与偏置

2. 训练机制:

  • 前向传播
  • 反向传播
  • 损失函数(MSE、Binary Cross Entropy、Cross Entropy)
  • 梯度下降与优化器(SGD、SGD+Momentum、Adam)

3. 常见问题与对策:

  • 过拟合、欠拟合
  • 梯度消失、梯度爆炸
  • 暂退法(Dropout)
  • 权重衰减(L1 / L2 正则化)
  • 批归一化(Batch Normalization)
  • 权重初始化(Xavier、He 初始化)
  • Dead ReLU 问题

  1. XOR 问题与 MLP 的意义

    • 为什么单层感知机(线性模型)无法解决 XOR 异或问题?请从几何角度分析。
    • MLP 是如何解决 XOR 问题的?最少需要几个隐藏层、几个隐藏神经元?
  2. 参数与计算量分析

    给定一个 MLP,结构为:输入维度 dd,一个隐藏层维度 hh,输出维度 oo

    • (1) 该网络共有多少可训练参数?(请写出公式,注意偏置项)
    • (2) 在 (1) 的基础上,若参数以 Float32 存储,占多少内存?以 INT8 存储呢?
    • (3) 前向传播的计算复杂度(乘加运算次数)是多少?写出表达式。
  3. 激活函数对比:ReLU vs Sigmoid vs Tanh

    • (1) 从梯度特性角度对比三者的优缺点。
    • (2) 什么是 Dead ReLU 问题?它是如何产生的?如何缓解?
    • (3) Sigmoid 的计算涉及指数运算,前向传播和反向传播中通常用什么方法简化计算?
  4. 暂退法(Dropout)如何防止过拟合?

    • 请从集成学习(Ensemble)和特征共适应的角度解释 Dropout 的工作原理。
    • 为什么训练时使用 Dropout,测试时却需要关闭它?

🔥 Part 3:动手实现 MLP 基础架构

Section titled “🔥 Part 3:动手实现 MLP 基础架构”

补全以下 MLP 类的代码。你需要实现 __init__、激活函数、以及 forward 方法。

import torch
import torch.nn as nn
class MLP(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
"""
初始化多层感知机
参数:
input_size: 输入特征维度
hidden_size: 隐藏层神经元数量
output_size: 输出维度
"""
super(MLP, self).__init__()
# TODO: 定义全连接层和激活函数
self.fc1 = ______ # 输入层 → 隐藏层
self.fc2 = ______ # 隐藏层 → 输出层
self.relu = ______
self.sigmoid = ______
def forward(self, x):
"""
前向传播
参数:
x: 输入数据,形状为 (batch_size, input_size)
返回:
输出值,形状为 (batch_size, output_size)
"""
# TODO: 补全前向传播过程
x = ______ # fc1 + relu
x = ______ # fc2 + sigmoid
return x

🧪 Part 4:MLP 分类实验——双月数据集

Section titled “🧪 Part 4:MLP 分类实验——双月数据集”

生成**双月(Two Moons)**形状的二分类数据,训练 MLP 学习非线性决策边界。

双月数据集由两个交织的新月形数据簇组成,是一个经典的非线性二分类问题。双月数据的决策边界是一条蜿蜒的 S 形曲线,单层线性模型完全无法分割。

  1. 生成数据:使用 sklearn.datasets.make_moons(或手动实现)生成双月形分布数据,补全以下函数:

    def generate_moon_data(n_samples=1000, noise=0.15, test_size=0.2):
    """
    生成双月数据集并划分训练/测试集
    返回:
    X_train, X_test, y_train, y_test (均为 numpy 数组)
    """
    from sklearn.datasets import make_moons
    from sklearn.model_selection import train_test_split
    # TODO: 生成数据、标准化、划分训练/测试集
    ______
    return X_train, X_test, y_train, y_test
  2. 构建模型:使用 Part 3 中你实现的 MLP 类(或基于它修改),构建一个适用于双月分类的网络。

  3. 训练与评估:自行编写训练循环,记录训练集和测试集的损失与准确率。

  4. 可视化(使用 matplotlib):

    • 绘制训练/测试损失曲线和准确率曲线
    • 绘制决策边界图(将数据点与模型预测的区域一同展示)

🎉 Part 5:深入探索(选做,加分)

Section titled “🎉 Part 5:深入探索(选做,加分)”
  1. 深度与宽度:尝试不同的隐藏层数量和每层神经元数量,分析增加深度 vs 增加宽度对模型效果的影响。

  2. 激活函数对比:将 ReLU 替换为 Sigmoid 或 Tanh,观察训练过程有何不同?是否出现了梯度消失的迹象?

  3. 过拟合与正则化:增大模型参数量使其过拟合,然后尝试加入 Dropout 或 L2 正则化,观察测试集准确率的变化。

  4. 优化器对比:尝试 SGD、SGD+Momentum、Adam 三种优化器,比较收敛速度和最终效果。


我们鼓励你借助 AI 工具学习,但请注意:

  1. 代码必须自己理解并添加注释说明,不要原封不动地粘贴
  2. 简答题请用自己的语言组织,直接复制 AI 输出既没意义也容易被识破
  3. 在代码或文档中注明你在哪些地方使用了 AI 的帮助
  • 代码文件

    将 Part 3 和 Part 4 的代码整合到一个.ipynb文件中,命名格式:ml-2-姓名-学号.ipynb

  • 文档报告

    将 Part 1、Part 2 的解答以及 Part 5 的探索(如做)写入.md文件,命名格式:ml-2-姓名-学号.md

  • 将两个文件压缩为ml-2-姓名-学号.zip提交

  • 邮箱: gimmerml401@163.com

  • 主题: 2-姓名-学号

出题人:出题人头像  Taffy

QQ:2078306188

邮箱:2078306188@qq.com