Syncaptic.js 创建简单的神经网络,解决异或运算的问题
-
神经元在神经网络中可以理解成一个函数,接收一些输入返回一些输出结果,Sigmoid 神经元以 Sigmoid 函数作为激活函数
-
输入层节点通过权重参数处理,然后再加入偏差值,最后到达一个隐藏层节点
-
(1,0)输入,生成权重参数(7,3),(-2)作为偏差值,到达函数 Sigmoid(5) = 1 隐藏节点生成
-
神经元通过箭头指向连接新城神经网络。这些箭头指向可以理解为突触
-
Input --> hidden(生成隐藏节点) -->Output
-
模型依赖正确的权重和偏差的选择,实际场景有识别数字或者垃圾邮件判断等领域,通过神经网络的训练,拿到训练结果对测试样本进行预测, 得到算法的准确率,然后尝试选择更好的权重和偏差,期待更高的准确度,这种学习过程为反向传播
// 代码实现 const {Layout, Network} = window.synaptic; var inputLayer = new Layer(2); var hiddenLayer = new Layer(3); var outputLayer = new Layer(1); inputLayer.project(hiddenLayout); hiddenLayout.project(outputLayer); var myNetwork = new NetWork({ input: inputLayer, hiddem: [hiddenLayout], 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]); }
- 运行 myNetwork.activate([0,0]); 区间为输入值,对应的异或运算为 false,为 0,这个是向前的传播,称为激活网络。每次前向传播之后需要做一次反向传播更新权重和偏差
- 对于运算的结果取最接近的整数,就能得到正确的异或运算结果
- 创建简单的神经网络,可以解决一些异或运算的问题过程,算法原理才是神经网络的重点,这里涉及了太多的数学科学知识,所以不再展开,适当了解。