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
这段代码完成了:
- 构建完整的网络结构向量k,包含输入层、隐藏层和输出层
- 初始化权重矩阵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
前向传播过程:
- 每层计算加权和:W'*Z + b
- 隐藏层使用sigmoid激活函数
- 输出层使用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); % 交叉熵+正则项
损失函数包含两部分:
- 交叉熵损失:衡量预测概率分布与真实分布的差异
- 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
反向传播过程:
- 从输出层开始计算误差
- 逐层反向传播误差,考虑激活函数的导数
- 对于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:学习率,控制更新步长
- 梯度包含数据误差项和正则化项
关键参数解析
-
lambda:正则化系数
- 默认值1e-2
- 增大lambda增强正则化效果,防止过拟合
- 减小lambda让模型更关注训练数据拟合
-
eta:学习率
- 代码中固定为1e-3
- 学习率过大可能导致震荡或不收敛
- 学习率过小导致收敛速度慢
-
tol:收敛阈值
- 默认1e-4
- 当损失变化小于tol*L(iter-1)时停止迭代
-
maxiter:最大迭代次数
- 默认50000
- 防止算法长时间不收敛
使用建议
-
网络结构选择:
- 对于简单问题,1-2个隐藏层通常足够
- 每层节点数可尝试从输入层大小的1/2到2倍开始
-
参数调优:
- 先调整学习率eta,确保损失稳定下降
- 然后调整lambda控制模型复杂度
- 监控训练损失和验证集表现
-
特征预处理:
- 输入特征建议标准化到相似范围
- 可提高训练稳定性和速度
扩展思考
-
激活函数选择:
- 当前实现使用sigmoid,也可尝试ReLU等现代激活函数
- 输出层softmax适合多分类问题
-
优化算法改进:
- 可引入动量(Momentum)、Adam等高级优化器
- 可添加学习率衰减策略
-
正则化扩展:
- 除L2正则外,可考虑Dropout等正则化技术
- 批量归一化(BatchNorm)可提高训练稳定性
总结
mlpClass.m
实现了一个经典的多层感知机分类器,展示了神经网络的核心训练过程。通过理解这段代码,可以深入掌握反向传播算法的实现细节,为更复杂的深度学习模型打下坚实基础。在实际应用中,可根据具体问题调整网络结构和训练参数,以获得最佳性能。