我已经阅读了很多反向道具算法,但我不知道为什么我的正在做它正在做的事情。
阅读前的一些注意事项
- 无隐藏层可以“学习”给定训练集的所有线性方程。使用 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 多个数据点进行训练时,该值都不会改变......
任何想法?