一起看看matlab工具箱内部是如何实现BP神经网络的

目录

一、源码复现效果

二、训练主流程

三、效果差异来源分析

四、不同训练方法的效果对比

五、相关文章


原创文章,转载请说明来自老饼讲解-BP神经网络www.bbbdata.com

如果我们直接使用梯度下降法去求解BP神经网络,

往往没有matlab工具箱的效果那么好。

这个问题曾经困扰笔者好一段时间,

那我们不妨扒出源码看看,matlab工具箱是怎么实现BP神经网络的,

为什么我们自写的训练效果没有工具箱BP神经网络的好。

一、源码复现效果


扒出matlab工具箱梯度下降traingd算法源码,梳理算法流程后,

自写代码求得的一个2隐层BP神经网络的权重

调用工具箱newff求得的权重:

可以看到,两个结果是一样的,说明完全理解和复现了工具箱的BP神经网络训练逻辑。


二、训练主流程


BP神经网络梯度下降法主流程如下


先初始化权重阈值,

然后用梯度迭代权重阈值,

如果达到终止条件则退出训练

终止条件为:误差已达要求、梯度过小或者达到最大次数


代码如下:


function [W,B] = traingdBPNet(X,y,hnn,goal,maxStep)
%------变量预计算与参数设置-----------
lr        = 0.01;            % 学习率  
min_grad  = 1.0e-5;          % 最小梯度

%---------初始化WB-------------------
[W,B] = initWB(X,y,hnn);  % 初始化W,B

%---------开始训练--------------------
for t = 1:maxStep
    % 计算当前梯度
    [py,layerVal] = predictBpNet(W,B,X);         % 计算网络的预测值
    [E2,E]        = calMSE(y,py);              % 计算误差
    [gW,gB]       = calGrad(W,layerVal,E);    % 计算梯度
    
    %-------检查是否达到退出条件----------
    gradLen = calGradLen(gW,gB);              % 计算梯度值
    % 如果误差已达要求,或梯度过小,则退出训练
    if E2 < goal   || gradLen <=min_grad
        break;                 
    end
    
    %----更新权重阈值-----
    for i = 1:size(W,2)-1
        W{i,i+1} = W{i,i+1} + lr * gW{i,i+1};%更新梯度
        B{i+1} = B{i+1} + lr * gB{i+1};%更新阈值
    end
end
end

(这里的代码复现我们屏蔽掉归一化处理、泛化验证这两个算法通用操作)

三、效果差异来源分析


效果差异来源


主流程与常规算法教程并没有差异,

那么为什么matlab的结果会更好呢,

原因主要在初始化上,

很多教程,都建议随机初始化,

而实际上,matlab工具箱使用的是nguyen_Widrow法进行初始化


nguyen_Widrow法


nguyen_Widrow法初始化思想如下:

以单输入网络为例,它会把网络初始化成以下的形式:

它的目的就是让各个隐节点均匀分布在输入数据的范围。

理由就是,如果BP神经网络最后每个神经元都是被充分利用的,

那么应该较近似以上的分布(对输入范围全覆盖、每个神经元都充分利用),

与其随机初始化再慢慢调整,不如一开始就给出这样一个初始化。

该方法的原文为:

Derrick Nguyen 和Bernard Widrow的《Improving the learning Speed of 2-Layer Neural Networks by Choosing Initial Values of the Adaptive Weights 》


四、不同训练方法的效果差异


效果比较


而作者又用traingd、traingda、trainlm进行效果对比,

发现同一个问题,

traingd训练不出来的,traingda能训练出来,

而traingda训练不出来的,trainlm又能训练出来。

即在训练效果上

traingd< traingda < trainlm


那么,如果我们直接使用自写的梯度下降法算,

仍然是远远不如我们使用matlab工具箱效果好的。

matlab的BP神经网络默认用的是trainlm算法


原因简述


那traingda为什么比traingd强呢,trainlm又为什么比traingda强呢?

经过扒取源码分析,主要是traingda中加入了自适应学习率,

而trainlm则是利用了二阶导数的信息,使学习速度更加快。


五、相关文章


复现完整代码见:

《重写traingd代码(梯度下降法)》

初始化方法见:

《BP神经网络初始化》


这就是matlab神经网络工具箱中梯度下降法的算法逻辑了,如此简单~!

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在MATLAB工具箱实现BP神经网络,可以按照以下步骤进行操作: 1. 准备数据集:首先,需要准备用于训练和测试的数据集。确保数据集中包含输入特征和对应的目标输出。 2. 构建神经网络模型:使用MATLAB中的Neural Network Toolbox来构建BP神经网络模型。可以选择使用feedforwardnet函数创建一个前馈神经网络模型。 3. 设置网络结构:使用网络对象的属性和方法来设置网络的结构,例如设置输入层的大小、隐藏层的大小、激活函数等。 4. 训练网络:使用train函数对神经网络进行训练。可以选择不同的训练算法和参数来优化网络权重和偏差。 5. 测试网络:使用测试数据集对训练好的神经网络进行测试,并评估其性能。可以使用sim函数来进行预测并计算误差。 下面是一个简单的示例代码: ```matlab % 准备数据集 load iris_dataset x = irisInputs; t = irisTargets; % 构建神经网络模型 net = feedforwardnet([10, 5]); % 设置网络结构 net.layers{1}.transferFcn = 'logsig'; % 设置输入层激活函数 net.layers{2}.transferFcn = 'logsig'; % 设置隐藏层激活函数 net.layers{3}.transferFcn = 'softmax'; % 设置输出层激活函数 % 训练网络 net = train(net, x, t); % 测试网络 y = sim(net, x); perf = perform(net, t, y); ``` 这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。更详细的使用方法可以参考MATLAB的官方文档或Neural Network Toolbox的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值