神经网络的目标是训练它的泛化能力,比如识别手写的数字或电子邮件中的垃圾邮件。而擅长泛化就是在整个网络中拥有正确的权重和偏差值。比如上面的例子中蓝色和棕色的数字。
在训练网络时,你只是简单地展示了大量的例子,比如手写的数字,并让网络来预测正确的答案。
在每次预测之后,你将计算所预测的误差,并调整权重和偏差值,以便下次网络能够更准确地猜出它们。这个学习过程叫做反向传播。
通过这样几千次的实践,你的网络很快就会变得让人满意。
从技术上讲,反向传播的作用超出了本教程的范围,这里有三个最好的信息来源值得你去了解:
const { Layer, Network } = window.synaptic;
var inputLayer = new Layer(2);
var hiddenLayer = new Layer(3);
var outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
var myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
// train the network - learn XOR
var learningRate = .3;
for (var i = 0; i < 20000; i++) {
// 0,0 => 0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate, [0]);
// 0,1 => 1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate, [1]);
// 1,0 => 1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate, [1]);
// 1,1 => 0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate, [0]);
}
[0,0]
是我们发送到网络的数据点。这是正向传播,也被称为激活网络。在每一个正向传播之后,我们需要做一个反向传播,在这个网络中,网络更新它自己的权重和偏差。learningRate
是一个常量,它每次都会告诉网络它应该调整多少权重。第二个参数0表示输入[0,0]的正确输出。console.log(myNetwork.activate([0,0]));
-> [0.015020775950893527]
console.log(myNetwork.activate([0,1]));
->[0.9815816381088985]
console.log(myNetwork.activate([1,0]));
-> [0.9871822457132193]
console.log(myNetwork.activate([1,1]));
-> [0.012950087641929467]