Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 反向传播算法:误差计算_Matlab_Artificial Intelligence_Backpropagation - Fatal编程技术网

Matlab 反向传播算法:误差计算

Matlab 反向传播算法:误差计算,matlab,artificial-intelligence,backpropagation,Matlab,Artificial Intelligence,Backpropagation,我目前正在写一个反向传播脚本。我不确定如何更新我的体重值。这是一张简单的图片 我的问题:误差是如何计算和应用的 我知道k1和k2会产生错误值。我知道k1和k2产生单独的错误值(目标-输出)。不过,我不知道是否要使用这些设备 我是否应该使用两个误差值的平均值,然后将单个误差值应用于所有权重 还是我应该: update weight Wk1j1 and Wk1j2 with the error value of k1 update weight Wk2j1 and Wk2j2 with the e

我目前正在写一个反向传播脚本。我不确定如何更新我的体重值。这是一张简单的图片

我的问题:误差是如何计算和应用的

我知道k1和k2会产生错误值。我知道k1和k2产生单独的错误值(目标-输出)。不过,我不知道是否要使用这些设备

我是否应该使用两个误差值的平均值,然后将单个误差值应用于所有权重

还是我应该:

update weight Wk1j1 and Wk1j2 with the error value of k1
update weight Wk2j1 and Wk2j2 with the error value of k2
update weight Wj1i1 and Wj1i2 with the error value of j1
update weight Wj2i1 and Wj2i2 with the error value of j2
在你开始拍摄之前,我知道我必须使用sigmoids函数等。这不是问题。它总是说我必须计算输出的误差值,这就是我困惑的地方

然后通过以下方式获得净误差值:

((error_k1^2) + (error_k2^2) + (error_j1^2) + (error_j2^2)) / 2
从维基:

如图所示,在我的图像示例k1和k2中,这对于每个输出节点都是正确的。维基

图像下的两行是delta Wh和delta Wi。我应该使用哪个误差值(这基本上是我的问题,我应该使用哪个误差值来计算新的权重)

回答:


第3页(注18)#4

反向传播不直接使用误差值。反向传播的是误差对神经网络每个元素的偏导数。最终,这将为每个权重提供dE/dW,并朝该梯度方向迈出一小步

为此,您需要知道:

  • 每个神经元的激活值(在进行前馈计算时保留)

  • 误差函数的数学形式(例如,它可能是平方和差)。输出层的第一组导数为dE/da(其中E为误差,a为神经元的输出)

  • 神经元激活或传递函数的数学形式。这就是我们为什么使用sigmoid的原因,因为sigmoid函数的dy/dx可以方便地用激活值表示,dy/dx=y*(1-y)-这很快,也意味着不必存储或重新计算加权和

请注意,我将使用与您不同的符号,因为您的标签很难表示反向传播的一般形式

在我看来:

  • 括号(k)或(k+1)中的上标表示网络中的一个层

  • (k)层有N个神经元,下标为i

  • (k+1)层有M个神经元,下标为j

  • 神经元的输入之和为z

  • 神经元的输出是一个信号

  • 权重为Wij,将层(k)中的ai连接到层(k+1)中的zj。注W0j是偏差项的权重,有时需要包括它,尽管您的图表没有显示偏差输入或权重

使用上述符号,反向传播算法的一般形式为五步过程:

1) 为输出层中的每个神经元计算初始dE/da。其中E是您的错误值,a是神经元的激活。这完全取决于您的错误函数

然后,对于每个层(从输出层的k=最大值开始)

2) 层内每个神经元的反向传播dE/dadE/dz(其中a是神经元输出,z是所有输入的总和,包括偏差)。除了需要知道上面(1)中的值外,还使用传递函数的导数:

(为了与循环的其余部分保持一致,现在将k减少1):

3) 对于前一层中的所有输出,将dE/dz从上层反向传播到dE/da。这基本上涉及将输出神经元连接到上层输入的所有权重相加。对于输入层,不需要这样做。注意它如何使用(2)中计算的值

4) (独立于(3))对于将该层连接到前一层的所有权重(包括偏差项),将dE/dz从上层反向传播到dE/dW

只需重复2到4次,直到你的所有重量都dE/dW。对于更高级的网络(例如经常性网络),您可以通过重新执行步骤1来添加其他错误源

5) 现在你有了权重导数,你可以简单地减去它们(乘以学习率),朝着你希望的误差函数最小值迈出一步:


当你第一次看到这一点时,数学符号在某些地方似乎有点密集。但是如果你看几次,你会发现基本上只有几个变量,它们是由i,j,k值的组合索引的。此外,使用Matlab,您可以非常轻松地表示向量和矩阵。例如,这就是学习单个培训示例的整个过程:

清晰;全部关闭;clc;更多
输入向量=[0.5,0.2];
TrainingOutputVector=[0.1,0.9];
学习率=1.0;
W_inputohidden=randn(3,2)*0.6;
W_hiddentooput=randn(3,2)*0.6;
因为i=1:20,
%向隐藏层前馈输入
InputsPlusBias=[1,InputVector];
HiddenActivations=1.0./(1.0+exp(-InputsPlusBias*W_InputOHidden));
%将隐藏层前馈到输出层
HiddenPlusBias=[1,HiddenActivations];
输出激活=1.0./(1.0+exp(-HiddenPlusBias*W_HiddenToOutput));
%Backprop步骤1:输出层的dE/da(假设均方误差)
OutputActivationDelta=OutputActivations-TrainingOutputVector;
nn