用于解决XOR问题的自制神经网络反向传播未能正确收敛

为了学习目的,我正在用JavaScript从头开始实现自己的神经网络,并将解决XOR问题作为第一个任务。我已经能够解决OR和AND问题,但一旦需要隐藏层,我的权重就无法正确收敛。

我使用了一个三层网络,包含2个输入神经元+1个偏置神经元,1个隐藏层有2个神经元+1个偏置神经元,以及1个输出神经元。

这个网络架构应该完全能够解决这个问题。当我手动设置权重时

let W1 = new Matrix([ // 用于第一层和第二层之间的映射权重    [-10, 20, 20], // OR    [30, -20, -20] // NAND]);let W2 = new Matrix([ // 用于第二层和第三层之间的映射权重    [-30, 20, 20] // AND]); 

我得到了正确的输出(非常接近[0, 1, 1, 0])。

但是当我尝试学习XOR问题的权重时,我总是得到接近[0.5, 0.5, 0.5, 0.5]的输出,而不是[0, 1, 1, 0]。我尝试了各种不同的权重初始化、学习率和梯度下降迭代次数,均未见改善。

所以我几乎可以肯定我的反向传播算法(W1grad的计算)有错误,但我就是找不出问题所在…任何帮助都将不胜感激!

// X 输入,W1, W2 = 权重,y = 输出,alpha = 学习率function gradientDescent(X, W1, W2, y, alpha, n_iterations) {    for (let i = 0; i < n_iterations; i++) {        // 前向传播        let a1 = addBias(X); // addBias 只是在矩阵前面添加一列1        let z2 = a1.times(W1.t()); // t() = 转置        let a2 = addBias(z2.map(sigmoid));        let z3 = a2.times(W2.t());        let a3 = z3.map(sigmoid);        // 计算误差        let error = logCost(a3, y);        // 反向传播        let outputDelta = a3.minus(y);        let hiddenDelta = outputDelta.times(W2).etimes(addBias(z2.map(sigmoidGradient))); // etimes 是逐元素乘法        let W2grad = outputDelta.t().times(a2).timess(1 / X.h); // timess (带两个s) 是标量乘法。这个梯度似乎是正确的!        let W1grad = hiddenDelta.cols(1, hiddenDelta.w - 1).t().times(a1).timess(1 / X.h); // TODO 这个似乎是错误的...        // 更新权重        W1 = W1.minus(W1grad.timess(alpha));        W2 = W2.minus(W2grad.timess(alpha));    }    return [W1, W2];}

完整代码可在此处找到(相关部分在底部,输出在控制台中): https://codepen.io/anon/pen/oqagqd


回答:

原来问题还是出在权重初始化上!

不知为何,我的算法似乎对权重的初始化非常敏感…

使用-2.5到+2.5之间的随机值和5000+次梯度下降迭代,大多数情况下都能得到XOR问题的正确解。许多其他范围根本不起作用…

使用

W1 = rand(2, 3).map(x => (x-.5)*5); // 值在-2.5到+2.5之间W2 = rand(1, 3).map(x => (x-.5)*5);

返回的输出是

0.06762365789051230.94251327756686130.90952886631220720.05522288831217417

这是一个对XOR问题的满意近似(真实值 = [0, 1, 1, 0])。

顺便提一下:通过增加更多的隐藏神经元,更容易获得好的结果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注