自己搭建神经网络太复杂?不要害怕!今天我们将教你如何用30行代码轻松创建一个神经网络。在本文中,您将学习:如何使用Synaptic.js(https://synaptic.juancazala.com/#/)创建和训练神经网络。通过这个工具,我们可以在浏览器中使用Node.js进行深度学习。我们今天要讨论的例子是一个非常简单的神经网络,我们将用它来学习逻辑异或方程。同时,我还在Scrimba上创建了一个交互式截屏视频。您也可以通过观看视频来学习本教程。(https://scrimba.com/casts/cast-1980)在我们开始编程之前,让我们快速浏览一下神经网络的一些基本概念。神经元和突触神经网络的第一个构建块是神经元。一个神经元就像一个函数,你输入一些值,它会输出一个返回值。有多种类型的神经元。我们的神经网络将使用sigmoid神经元(https://en.wikipedia.org/wiki/Sigmoid_function)来压缩0到1之间的任何输入给定值。下图中的圆圈代表一个sigmoid神经元。它的输入值为5,输出值为1。箭头代表神经元的突触,用于连接神经网络其他层的神经元。为什么有一个红色的数字5?它是连接到神经元的三个突触(左边的3个箭头)的值之和。在最左边,我们看到有两个值加上了所谓的偏差值。1和0的值是绿色的,而-2的偏差值是棕色的。首先,将两个输入值分别乘以各自的权重,分别是蓝色数字7和3。然后,我们将它们与偏置值相加,结果为5,对应红色数字。这个红色数字是我们人工神经元的输入值。由于我们的神经元是sigmoid神经元,它会将任何值压缩到0和1之间的区间中,因此输出值被压缩为1。如果将这些神经元网络连接起来,就形成了一个神经网络。通过神经元之间的突触连接从输入到输出的正向传播。如下图所示:神经网络的目标是训练它的泛化能力,比如识别手写数字或者垃圾邮件。要实现良好的泛化,重要的是通过神经网络找到合适的权重和偏置值。就像上面例子中的蓝色和棕色数字。在训练神经网络时,我们只需要加载大量示例数据,比如手写数字,让神经网络预测出正确的数字即可。每次预测之后,都需要计算预测的偏差程度,然后调整权重和偏差值,让神经网络在接下来的操作中预测得更准确。这种学习过程称为反向传播。重复此操作数千次,您的神经网络将很快变得擅长泛化。本教程不介绍反向传播的工作原理,但我找到了3个很好的教程来帮助您理解:反向传播的分步示例(https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/)–作者MattMazur神经网络黑客指南(http://karpathy.github.io/neuralnets/)–作者AndrejKarpathy神经网络和深度学习(http://karpathyneuralnetworksanddeeplearning.com/chap1.html)–MichaelNielsen用代码构建神经网络现在您已经对什么是神经网络有了基本的了解,让我们进入代码。1.创建一个神经网络层在synaptic中我们使用新的layer()函数来创建它。函数中传递的数字表示每一层中将有多少个神经元。接下来,我们连接这些层并实例化一个神经网络。代码如下。这是一个具有2-3-1结构的神经网络。可视化表示如下:2.训练神经网络。一次执行四个前向和反向传播操作,将四个可能的输入传递给神经网络:[0,0][0,1][1,0][1,1]。我们从myNetwork.activate([0,0])激活函数开始,[0,0]是神经网络的输入值,这个过程就是前向传播,也称为激活网络。在每次前向传递之后,我们需要进行反向传播以更新神经网络的权重和偏差。反向传播是通过下面这行代码实现的myNetwork.propagate(learningRate,[0])learningRate是一个常量,用来告诉神经网络权重值每次应该调整多少。第二个参数0表示当输入为[0,0]时,正确的输出参数为0。然后,神经网络将预测值与真实值进行比较,判断预测是否正确。它以比较的结果作为调整权重和偏置值的依据,使得接下来的预测可以更加准确。执行此过程20,000次后,我们可以通过将四个可能的输入传递给激活网络来判断神经网络当前的预测效果如何:如果我们将值四舍五入到最接近的整数,我们将得到XOR方程的正确结果.万岁!这就是本教程的全部内容。虽然我们只触及了神经网络的表面,但这应该足以让您开始使用Synaptic并继续学习。另外,Synaptic的wiki中有很多不错的教程,可以点击以下链接浏览(https://github.com/cazala/synaptic/wiki)。
