神经网络---反向传播算法错误(在javascript中!)

时间:2013-09-08 17:48:52

标签: javascript algorithm neural-network

我已经阅读了很多反向道具算法,我不知道为什么我的做法正在做。

阅读前的一些注意事项

  • 无隐藏层可以“学习”给定训练集的所有线性方程。使用5/2训练,它甚至可以学到0.01%的平均误差(相当低)
  • 使用隐藏图层时。网络只输出2个值。如果两个输入均为正数,则输入为1。
  • 输入的激活功能 - > hiddens - > (最多)输出是f(x)= 1 /(1 + e ^ -x)
  • 输出的激活功能是线性的(f(x)= x)
  • 错误计算
    • 我相信这是我可能出错的地方!
    • 输出:E(k) = (target(k) - O(k).output) * f'(O(k).output) = (target - actual) * 1线性激活fn得到1作为导数
    • 输入和隐藏:E(j) = sum(w(kj) * E(k)) * f'(N(j).output) = sum(w(kj) * E(k) * N(j).output * (1 - N(j).output)
  • 完整的源代码可以在这里找到 http://www.github.com/primeagen/neural-js

来源!它在javascript!

  • 请记住:前馈和输出错误似乎是正确的,因为非隐藏层网络可以学习任何线性函数,并且在0.01%的训练集之外进行推断。所以我认为这是正确的

后支柱误差计算

// Output layer
for (var i = 0; i < this._outputs.length; i++) {
    var o = this._outputs[i];
    o.error = targetOutputs[i] - o.output;
    this._mse += o.error * o.error;
}

// Go through hidden layers
for (var cIdx = this._layers.length - 2; cIdx > 0; cIdx--) {
    var curr = this._layers[cIdx];
    var next = this._layers[cIdx + 1];

    // Go through hidden neurons
    for (var hN = 0, hLen = curr.length; hN < hLen; hN++) {
        var h = curr[hN];
        var sum = 0;

        for (var nN = 0, nLen = next.length; nN < nLen; nN++) {
            var n = next[nN];
            sum += n.w[hN] * n.error;
        }
        h.error = sum * h.dActivationFn(h.output);
    }
}

激活功能及其衍生物

/**
 * The logisticFunction function is 1 / (1 + e ^ (-x))
 * @param x
 */
function logisticFunction(x) {
    return 1 / (1 + Math.pow(Math.E, -x));
}

/**
 * The derivative of the logistic function
 * @param {Number} x
 * @returns {Number}
 */
function dLogisticFunction(x) {
    return x * (1 - x);
}

Neuron.dActivation = dLogisticFunction

我的网络只是收敛到一个答案(随机),无论输入是什么(当为正数时),当使用100多个数据点进行训练时,该值不会改变...

有什么想法吗?

0 个答案:

没有答案