Kle*_*ine 2 backpropagation neural-network
任何人都可以推荐一个网站,或者向我简要说明如何在NN中实施反向传播?我理解基本概念,但我不确定如何编写代码.
我发现的许多资料只是显示方程而没有给出他们为什么这样做的任何解释,变量名称使得很难找到.
例:
void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
int j;
double o, t, errsum;
errsum = 0.0;
for (j = 1; j <= nj; j++) {
o = output[j];
t = target[j];
delta[j] = o * (1.0 - o) * (t - o);
errsum += ABS(delta[j]);
}
*err = errsum;
}
Run Code Online (Sandbox Code Playgroud)
在那个例子中,有人可以解释的目的
delta[j] = o * (1.0 - o) * (t - o);
Run Code Online (Sandbox Code Playgroud)
谢谢.
的目的
delta [j] = o*(1.0 - o)*(t - o);
是在反向传播网络中找到输出节点的错误.
o表示节点的输出,t是节点的预期输出值.
术语(o*(1.0 - o))是所使用的公共传递函数的衍生物,即sigmoid函数.(其他传递函数并不罕见,并且需要重写具有sigmoid一阶导数的代码.函数和导数之间的不匹配可能意味着训练不会收敛.)节点具有"激活"值,通过传递函数馈送以获得输出o,如
o = f(激活)
主要的是反向传播使用梯度下降,并且通过应用链规则来向后传播误差.问题是信用分配问题,或者如果你愿意的话,对于输出不能与预期值直接比较的隐藏节点的问题.我们从已知和可比较的输出节点开始.该误差与输出的一阶导数乘以预期输出和实际输出之间的原始误差值成比例.
更具象征意义的是,我们将该行写为
delta [j] = f'(activation_j)*(t_j - o_j)
其中f是你的传递函数,f'是它的第一个导数.
进一步返回隐藏层,节点处的错误是其对下一层发现的错误的估计贡献.因此,后续图层的增量乘以连接权重,并将这些乘积相加.该总和乘以隐藏节点激活的一阶导数,以获得隐藏节点的增量,或
delta [j] = f'(activation_j)*Sum(delta [k]*w_jk)
其中j现在引用后续层中的隐藏节点和ka节点.