首页
/ PRML/PRMLT项目中的多层感知机分类实现解析

PRML/PRMLT项目中的多层感知机分类实现解析

2025-07-07 07:09:29作者:舒璇辛Bertina

概述

本文将深入解析PRML/PRMLT项目中mlpClass.m文件实现的多层感知机(MLP)分类算法。该文件实现了基于反向传播算法的多层感知机神经网络,用于解决多分类问题。我们将从算法原理、实现细节和参数调优等多个维度进行详细讲解。

多层感知机基础

多层感知机是一种前馈人工神经网络,由输入层、隐藏层和输出层组成。在mlpClass.m中,隐藏层可以有多层,每层使用逻辑(sigmoid)激活函数,输出层使用softmax函数进行多分类。

网络结构

网络结构由参数k决定,k是一个向量,指定了每层隐藏节点的数量。例如:

  • k = [10] 表示单隐藏层,10个节点
  • k = [20,10] 表示两个隐藏层,分别有20和10个节点

核心算法实现

1. 初始化阶段

k = [size(X,1);k(:);size(Y,1)];
T = numel(k)-1;
W = cell(T,1);
b = cell(T,1);
for t = 1:T
    W{t} = randn(k(t),k(t+1));
    b{t} = randn(k(t+1),1);
end

这段代码完成了:

  1. 构建完整的网络结构向量k,包含输入层、隐藏层和输出层
  2. 初始化权重矩阵W和偏置向量b,使用标准正态分布随机初始化

2. 前向传播

for t = 1:T-1
    Z{t+1} = sigmoid(W{t}'*Z{t}+b{t});  % 隐藏层使用sigmoid激活
end
Z{T+1} = softmax(W{T}'*Z{T}+b{T});     % 输出层使用softmax

前向传播过程:

  1. 每层计算加权和:W'*Z + b
  2. 隐藏层使用sigmoid激活函数
  3. 输出层使用softmax函数,得到类别概率分布

3. 损失计算

E = Z{T+1};
Wn = cellfun(@(x) dot(x(:),x(:)),W);  % 计算所有权重的L2范数
L(iter) = -dot(Y(:),log(E(:)))+0.5*lambda*sum(Wn);  % 交叉熵+正则项

损失函数包含两部分:

  1. 交叉熵损失:衡量预测概率分布与真实分布的差异
  2. L2正则化项:防止过拟合,lambda控制正则化强度

4. 反向传播

R{T} = Z{T+1}-Y;  % 输出层误差
for t = T-1:-1:1
    df = Z{t+1}.*(1-Z{t+1});  % sigmoid导数
    R{t} = df.*(W{t+1}*R{t+1});  % 计算隐藏层误差
end

反向传播过程:

  1. 从输出层开始计算误差
  2. 逐层反向传播误差,考虑激活函数的导数
  3. 对于sigmoid激活,其导数为f(1-f)

5. 参数更新

for t=1:T
    dW = Z{t}*R{t}'+lambda*W{t};  % 计算权重梯度
    db = sum(R{t},2);             % 计算偏置梯度
    W{t} = W{t}-eta*dW;           % 更新权重
    b{t} = b{t}-eta*db;           % 更新偏置
end

使用梯度下降法更新参数:

  • eta:学习率,控制更新步长
  • 梯度包含数据误差项和正则化项

关键参数解析

  1. lambda:正则化系数

    • 默认值1e-2
    • 增大lambda增强正则化效果,防止过拟合
    • 减小lambda让模型更关注训练数据拟合
  2. eta:学习率

    • 代码中固定为1e-3
    • 学习率过大可能导致震荡或不收敛
    • 学习率过小导致收敛速度慢
  3. tol:收敛阈值

    • 默认1e-4
    • 当损失变化小于tol*L(iter-1)时停止迭代
  4. maxiter:最大迭代次数

    • 默认50000
    • 防止算法长时间不收敛

使用建议

  1. 网络结构选择:

    • 对于简单问题,1-2个隐藏层通常足够
    • 每层节点数可尝试从输入层大小的1/2到2倍开始
  2. 参数调优:

    • 先调整学习率eta,确保损失稳定下降
    • 然后调整lambda控制模型复杂度
    • 监控训练损失和验证集表现
  3. 特征预处理:

    • 输入特征建议标准化到相似范围
    • 可提高训练稳定性和速度

扩展思考

  1. 激活函数选择:

    • 当前实现使用sigmoid,也可尝试ReLU等现代激活函数
    • 输出层softmax适合多分类问题
  2. 优化算法改进:

    • 可引入动量(Momentum)、Adam等高级优化器
    • 可添加学习率衰减策略
  3. 正则化扩展:

    • 除L2正则外,可考虑Dropout等正则化技术
    • 批量归一化(BatchNorm)可提高训练稳定性

总结

mlpClass.m实现了一个经典的多层感知机分类器,展示了神经网络的核心训练过程。通过理解这段代码,可以深入掌握反向传播算法的实现细节,为更复杂的深度学习模型打下坚实基础。在实际应用中,可根据具体问题调整网络结构和训练参数,以获得最佳性能。