2

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

阅读前的一些注意事项

  • 无隐藏层可以“学习”给定训练集的所有线性方程。使用 5 / 2 训练,它甚至可以学习到 0.01% 的平均误差(相当低)
  • 使用隐藏层时。网络只会输出 2 个值。如果两个输入都为正,则为一个,如果两个输入为负,则为一个。
  • 输入 -> 隐藏 -> (最多)输出的激活函数为 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/primaegen/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 多个数据点进行训练时,该值都不会改变......

任何想法?

4

0 回答 0