高宁,Saint,钱天培编译

30行JavaScript代码,教你分分钟创建神经网络

一、神经元和突触

神经网络的第一个模块,是神经元

神经元类似一个函数,你输入一些值,它就会输出返回值。

神经元有各种不同的类型。我们的神经网络将用到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/) – 作者:Matt Mazur

  • 神经网路骇客指南(http://karpathy.github.io/neuralnets/) – 作者:Andrej Karpathy

  • 神经网络深度学习(http://neuralnetworksanddeeplearning.com/chap1.html) – 作者:Michael Nielsen

二、用代码搭建神经网络

现在,你应该已经对神经网络有了基础概念,那就让我们进入代码部分吧。

1.创建神经网络

在synaptic中我们使用new layer()函数来创建。函数中传递的数字表示的是每一层会有多少个神经元

接下来我们将这些层进行连接并实例化一个神经网络,代码如下,

这是一个2-3-1结构的神经网络,可视化表示如下:

2.训练神经网络

我们共进行了20,000次的训练,每一次都进行四次正向传播和反向传播运算,分别传递四个可能的输入到神经网络:[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次后,我们可以通过传递四个可能的输入到激活网络,从而判断目前神经网络的预测情况:

如果我们将这些值四舍五入到最近的整数,就将得到异或方程的正确结果。万岁!

来源:https://medium.freecodecamp.org/how-to-create-a-neural-network-in-javascript-in-only-30-lines-of-code-343dafc50d49

大数据文摘
大数据文摘

秉承“普及数据思维,传播数据文化,助⼒产业发展”的企业⽂化,我们专注于数据领域的资讯、案例、技术,形成了“媒体+教育+⼈才服务”的良性⽣态,致⼒于打造精准数据科学社区。

入门激活函数神经元神经网络
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

推荐文章
暂无评论
暂无评论~