引言
本文将指导你如何使用约30行JavaScript代码,快速构建并训练一个简单的神经网络。我们将借助Synaptic.js库,在浏览器或Node.js环境中实现一个学习异或(XOR)逻辑运算的神经网络模型。
神经网络基础概念
在开始编码前,我们先简要回顾几个核心概念。
神经元与突触
神经元是神经网络的基本单元,它接收输入,经过计算后产生输出。我们将使用Sigmoid神经元,其激活函数能将任意输入值映射到0到1之间。
一个神经元的输入通常是前一层神经元输出的加权和,加上一个偏置项。权重和偏置是神经网络通过训练学习的关键参数。
前向传播与反向传播
将多个神经元按层连接,就形成了神经网络。数据从输入层流向输出层的过程称为前向传播。
训练的目标是让网络学会“泛化”,例如正确分类数据。训练时,我们给网络输入大量样本,计算其预测值与真实值的误差,然后通过反向传播算法,将误差从输出层向输入层反向传递,并据此调整各层的权重和偏置,使下一次预测更准确。这个过程会重复成千上万次。
如果你想深入了解反向传播的原理,可以参考以下资源:
- 分步介绍反向传播案例 – Matt Mazur
- 神经网络骇客指南 – Andrej Karpathy
- 神经网络和深度学习 – Michael Nielsen
实战:用Synaptic.js构建神经网络
现在,我们进入代码实战环节。
1. 创建网络结构
首先,使用new Layer()创建网络的各层,参数代表该层的神经元数量。
// 引入Synaptic.js库
const { Layer, Network } = require('synaptic');
// 创建输入层(2个神经元)、隐藏层(3个神经元)、输出层(1个神经元)
const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);
接着,将这些层连接起来并实例化网络:
// 连接各层
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
// 实例化神经网络
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
这样就构建了一个2-3-1结构的神经网络(2个输入,3个隐藏神经元,1个输出)。
2. 训练神经网络
我们将训练网络学习XOR运算。XOR的真值表为:输入[0,0]或[1,1]时输出0;输入[0,1]或[1,0]时输出1。
// 定义学习率和训练数据
const learningRate = 0.3;
const trainingData = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
// 训练20000次
for (let i = 0; i < 20000; i++) {
trainingData.forEach(data => {
// 前向传播(激活网络)
myNetwork.activate(data.input);
// 反向传播(根据误差调整权重和偏置)
myNetwork.propagate(learningRate, data.output);
});
}
在每次迭代中,我们对四个可能的输入都进行一次前向传播和反向传播。propagate方法根据网络输出与目标输出的误差,使用学习率来更新内部参数。
3. 测试训练结果
训练完成后,我们可以测试网络的预测能力:
// 测试训练后的网络
console.log(myNetwork.activate([0, 0])); // 应接近 [0]
console.log(myNetwork.activate([0, 1])); // 应接近 [1]
console.log(myNetwork.activate([1, 0])); // 应接近 [1]
console.log(myNetwork.activate([1, 1])); // 应接近 [0]
将输出值四舍五入到最近的整数,应该能得到正确的XOR运算结果。
总结与后续
通过这个简单的例子,你已成功用JavaScript创建并训练了一个神经网络。虽然这只是深度学习的入门,但它为你使用Synaptic.js库打下了基础。该库的GitHub Wiki(链接)提供了更多高级教程和示例,值得进一步探索。
请注意,本文示例基于Synaptic.js库。虽然该库仍可使用,但社区中也有更多现代选择(如TensorFlow.js)。不过,其核心概念和训练流程是相通的。