爱体育在线登录:这是极简略的人工神经网络说明

2022-08-12 05:25:49

来源:爱体育官方网站 作者:爱体育网页版

  我不会机器学习,但上个月我在 GitHub 上发现了一个极简、入门级的神经网络教程,示例代码为 Go言语。它简练易懂能用一行公式说理解的道理,不多写一句废话,我看后大喊过瘾。

  这么好的东西得让更多人看到,但原文是英文的无法直接共享,所以得先联络作者拿到翻译的授权,然后由小熊熊翻译了这个项目,终究才有您看到的这篇文章。进程艰苦耗时一个月实属不易,假如您看完觉得还不错,欢迎点赞、共享给更多人。

  温馨提示:公式虽多但仅仅看起来唬人,实践耐下心读并不难明。下面正文开端!

  受人脑作业机制的启示,人工神经网络有着彼此连接的模仿神经元,用于存储办法和彼此交流。一个模仿神经元最简略的办法是有一个或多个输入值和一个输出值,其间每个有一个权重。

  网络的作用在于经过多个参数模仿一个杂乱的函数,然后能够在给定一系列输入值的时分得到一个特定的输出值,而这些参数通常是咱们本身难以拟定的。

  在初始化时,由于咱们不知晓最优值,往往是对权重随机赋值,这儿咱们为了简略,将它们都初始化为 1 。

  咱们用方差来衡量得到的输出值与咱们希望的方针值之间的距离。经过平方的办法就能够去除负违背值的影响,愈加凸显那些违背较大的偏差值(不论正负)。

  为了纠正差错,咱们需求调整权重值,以使得成果趋近于咱们的方针值。在咱们这个比如中,将从 1.0 降到 0.5 就能够到达方针,由于

  但是,神经网络往往涉及到许多不同的输入和输出值,这种情况下咱们就需求一个学习算法来帮咱们主动完结这一步。

  现在是要凭借差错来帮咱们找到应该被调整的权重值,然后使得差错最小化。但在这之前,让咱们了解一下梯度的概念。

  梯度本质上是指向一个函数最大斜率的矢量。咱们选用来表明梯度,简略说来,它便是函数变量偏导数的矢量办法。

  让咱们用一些数字来模仿一个简略的比如。假定咱们有一个函数是,那么梯度将是

  下降则能够简略理解为经过梯度来找到咱们函数最大斜率的方向,然后经过反方向小步幅的屡次测验,然后找到使函数大局(有时是部分)差错值最小的权重。

  咱们选用一个称为学习率的常量来表明这个反方向的小步幅,在公式中咱们用来进行表征。

  假如取值太大,那有或许直接错失最小值,但假如取值太小,那咱们的网络就会花费更久的时刻来学习,并且也有或许堕入一个浅部分最小值。

  关于咱们比如中的两个权重值和,咱们需求找到这两个权重值相较于差错函数的梯度

  还记得咱们上面的公式和吗?关于和,咱们能够将其带入并经过微积分中的链式求导规律来别离核算其梯度

  一旦咱们有了梯度,将咱们拟定的学习率带入,能够经过如下办法来更新权重值:

  顺便的示例选用梯度下降法,将如下数据集练习成有两个输入值和一个输出值的神经网络:

  一旦练习成功,这个网络将会在输入两个 1 时输出 ~0,在输入 1 和 0 时,输出 ~1 。

  反向传达(英语:Backpropagation,缩写为 BP)是“差错反向传达”的简称,是一种与最优化办法(如梯度下降法)结合运用的,用来练习人工神经网络的常见办法。

  反向传达技能能够用来练习至少有一个躲藏层的神经网络。下面就来从理论动身结合代码拿下反向传达算法。

  感知机是这样一个处理单元:它承受输入, 选用激活函数对其进行转化,并输出成果。

  在一个神经网络,输入值是前一层节点输出值的权重加成总和,再加上前一层的差错:

  假如咱们把差错当作层中别的的一个常量为 -1 的节点,那么咱们能够简化这个公式为

  为什么咱们需求激活函数呢?假如没有,咱们每个节点的输出都会是线性的,然后让整个神经网络都会是依据输入值的一个线性运算后的输出。由于线性函数组合仍然是线性的,所以必需要引进非线性函数,才能让神经网络有差异于线性回归模型。

  原理是选用 forward pass 来核算网络输出值和差错,再依据差错梯度反向更新输入层的权重值。

  在 forward pass 中,咱们在输入层进行输入,在输出层得到成果。

  一旦输入值经过网络进行传达,咱们就能够核算出差错值。假如有多套相关,还记得咱们榜首部分学习的方差吗?这儿,咱们就能够选用均匀方差来核算差错。

  现在咱们现已得到了差错,就能够经过反向传输,来用差错来批改网络的权重值。

  经过榜首部分的学习,咱们知道对权重的调整能够依据差错对权重的偏导数乘以学习率,即如下办法

  类似地,关于躲藏层之间的权重调整,持续以上面的比如为例,输入层和榜首个躲藏层之间的权重调整值为

  对后半部分的,由于咱们在这一层选用了 sigmoid 函数,咱们知道,sigmoid 函数的导数办法是,因而,有

  在这个示例中,咱们经过实在数据来模仿神经网络中的每个过程。输入值是[1.0, 1.0],输出希望值为 [0.5]。为了简化,咱们将初始化权重设为 0.5 (虽然在实践操作中,经常会选用随机值)。关于输入、躲藏和输出层,咱们别离选用恒等函数、 sigmoid 函数 和恒等函数作为激活函数,学习率则定为 0.01 。

  然后,咱们将 J 层节点的值输入到 sigmoid 函数(,将代入,得到 0.731)进行激活。

  终究一步是用核算出的梯度更新一切的权重值。留意这儿假如咱们有多于一个的相关,那么便能够针对每组相关的梯度进行累计,然后更新权重值。

  能够看到这个权重值改变很小,但假如咱们用这个权重再跑一遍 forward pass,一般来说将会得到一个比之前更小的差错。让咱们现在来看下

  可见,差错得到了减小!虽然削减值很小,但关于一个实在场景也是很有代表性的。依照该算法重复运转,一般就能够将差错终究减小到0,那么便完结了对神经网络的练习。

  留意,XOR 运算符是不能经过榜首部分中的线性网络进行模仿的,由于数据集散布对错线性的。也便是你不能经过一条直线将 XOR 的四个输入值正确划分到两类中。假如咱们将 sigmoid 函数换为恒等函数,这个网络也将是不可行的。

  讲完这么多,轮到你自己来着手操作啦!试试选用不同的激活函数、学习率和网络拓扑,看看作用怎么?

  每日头条、业界资讯、热门资讯、八卦爆料,全天盯梢微博播报。各种爆料、内情、花边、资讯一扫而光。百万互联网粉丝互动参加,TechWeb官方微博等待您的重视。