MATLAB实现反向传播算法的MLP网络XOR分类时损失曲线异常排查
MATLAB实现多层感知器(MLP)训练XOR数据集损失震荡问题
实现目标
我尝试在MATLAB中编写多层感知器(Multi-Layer Perceptron, MLP)网络,以便深入理解反向传播所需的微积分原理。本次实现的目标是向网络输入XOR数据集(右上、左下象限数据为类别1,其余象限为类别0),完成模型训练后在新数据上测试。
问题描述
目前遇到的问题是训练过程得到的损失曲线表现十分异常:
损失值在极低误差和极高误差区间来回震荡,最终收敛到一个效果较差的中间误差值。
希望各位帮忙检查我在MATLAB语法下实现的链式求导部分是否存在错误。本次实现的MLP结构为:输入层2个神经元、单隐藏层2个神经元、输出层1个神经元。
对应实现代码
% 生成XOR数据集 x1pos = rand(500,1); x1neg = -rand(500,1); x1 = [x1pos; x1neg]; p = randperm(length(x1)); x1 = x1(p); x2pos = rand(500,1); x2neg = -rand(500,1); x2 = [x1pos; x1neg]; p = randperm(length(x2)); x2 = x2(p); Data = [x1 x2]; TrainingData = Data(1:800,:); TestData = Data(801:length(Data),:); T = gt((Data(:,1).*Data(:,2)),0); % 生成数据类别标签存入矩阵T % 神经网络训练逻辑 W1 = rand(2,2); % 初始化随机权重 W2 = rand(1,2); % 初始化随机权重 B1 = rand(2,1); % 初始化随机偏置 B2 = rand(1,1); % 初始化随机偏置 n = 0.05; % 设置学习率 for i = 1:800 % 前向传播 x1 = Data(i,1); x2 = Data(i,2); X = [x1; x2]; A1 = W1*X + B1; H1 = sigmoid(A1); A2 = W2*H1 + B2; Y = sigmoid(A2); % 计算损失 Loss = (Y-T(i))*(Y-T(i)); scatter(i, Loss) hold on; % 反向传播 dEdY = 2*(Y-T(i)); % 损失对输出的偏导 dYdA2 = Y*(1-Y); % 输出对输出层激活值的偏导 dA2dH1 = W2.'; % 输出层激活值对隐藏层输出的偏导 dH1dA1 = H1.*(1-H1); % 隐藏层输出对隐藏层激活值的偏导 % 链式求导 dEdW2 = dEdY.*dYdA2.*W2.'; dEdW1 = dEdY.*dYdA2.*dA2dH1.*dH1dA1.*W1.'; dEdB2 = dEdY.*dYdA2; dEdB1 = dEdY.*dYdA2.*dA2dH1.*dH1dA1; % 更新权重 W2 = (W2.' - n.*dEdW2).'; W1 = (W1.' - n.*dEdW1).'; % 更新偏置 B2 = B2 - n.*dEdB2; B1 = B1 - n.*dEdB1; end % 测试逻辑 for i = 801:1000 x1 = Data(i,1); x2 = Data(i,2); X = [x1; x2]; A1 = W1*X + B1; H1 = sigmoid(A1); A2 = W2*H1 + B2; Y = sigmoid(A2); end function o = sigmoid(input) o = []; for i = 1:length(input) o = [o; 1/(1+exp(-input(i)))]; end end
内容的提问来源于stack exchange,提问作者Harry Stout
相关产品推荐
相关产品推荐

