Press "Enter" to skip to content

从Y = X到构建完整的人工神经网络

 

在某些时候,你也许曾问过自己,人工神经网络的参数的来源是什幺?权重的目的是什幺?如果不用偏差(bias)会怎样?

 

在本教程中,我们打算回答那些问题,我们从最简单的人工神经网络(ANN)做起,一直到复杂得多的模型。让我们从构建一个没有参数的机器学习模型开始,即Y=X。

 

然后,我们将逐步增加一些参数到模型中,直到我们建立了一个单个神经元,这个神经元被设计成接收一个或多个输入。接着,神经元从数学公式映射成图形形式。通过连接多个神经元,就能生成一个完整的ANN。读完本教程后,我希望权重和偏差的用途就能清楚明白了。

 

 

   从最简单的模型 Y=X 开始

 

机器学习的基础部分其实非常简单。即使是完全的初学者也能构建一个基本的机器学习模型。所谓的监督式机器学习,它的目标是找到(即学习)一个函数,能够在输入和输出集合之间完成映射。等到学习过程结束,函数应该能对每一个给定的输入,返回正确的输出。根据下表给出的数据,我们来讨论如何完成一个最简单的目标。

 

有4组样本。每个样本有一个单一的输入以及一个单一的输出。观察了数据之后,我们需要准备一个函数来针对每一个给定的输入返回正确的输出,并使得误差最小。观察数据,我们明显发现输出Y跟输入X完全相同。如果X等于2,Y也等于2。如果X是4,Y也是4。

 

因此,我们需要的是一个函数,接收一个单独的输入X并返回一个单独的输出。这个输出跟输入相同。毫无疑问,函数是F(X)=X。为简单起见,我们用Y代替F(X)。于是,函数变成Y=X。

 

 

  误差计算

 

找到合适的机器学习模型(即函数)后,我们需要对它进行测试,看看它能不能准确预测结果,是否还存在一定误差(error)。我们可以用一个简单的误差函数,根据下面的公式,计算出正确的输出与预测的输出之间的差的绝对值。它在数据样本中循环执行,对每一个样本,计算出正确输出与预测输出之差的绝对值,并最终对所有的差的绝对值求和,存入误差变量中。求和运算中的符号N表示样本的个数。

 

 

下表给出了计算的细节。根据这个表格,函数准确地预测了所有的输出,所以总误差为0。很棒!但是不要忘这我们做的只是纯入门的最简单的题目。在把题目改得更难一点之前,我要提一个问题。在每一个机器学习模型中,有2个主要环节,分别是学习(即训练)和测试。我们已经看到了最基本的测试环节。但是学习环节在哪里?在前面那个模型里,我们有没有做学习?答案是否定的。

 

 

学习意味着模型里的一些参数是在训练环节中从数据里学来的。前面那个模型的函数(Y=X)没有参数可学。函数只是把输入X与输出Y等同起来,没有中间参数来平衡两者的关系。在这种情况下,就没有了学习环节,因为模型是非参数的。“非参数”意思是说模型不需要从数据中学习参数。常见的非参数机器学习模型是K近邻算法(K-nearest neighbors, KNN)。

 

  常数型权重

 

讲明白不用学习参数的原因后,我们来对使用的数据做一些修改。新数据如下表所示。你发现哪些改动了吗?其实很简单。每一个输出Y不再与输入X相等,而变成输入的两倍,即2X。我们还是用前面的函数(Y=X)预测输出并计算总的误差。

 

 

误差计算的细节在下面一张表格中。在这种情况下,跟前面的例子不一样,总的误差不是0,而是14。数据中误差的存在表明模型函数不能在输入和输出之间正确地映射。

 

为了减少误差,我们必须修改函数。问题是,我们改变函数里的什幺东西,能够减少它的误差呢?函数只有两个变量X和Y。一个代表输入,另一个代表输出。这两个都不能改。最后结论是,函数是非参数的,所以没有办法对它进行修改以减少误差。

 

 

但是还有希望,如果函数目前还没有参数,为什幺不添加一个或多个参数呢?你可以大胆采用能减少误差的方法去设计机器学习模型。如果你发现往函数里增加东西能解决问题,立马就加。

 

在新数据中,输出Y是输入X的两倍。但函数没有针对这个做修改,仍然用Y=X。我们修改函数,使得输出Y等于2X而不是X。现在我们得到的函数是Y=2X。使用这个函数之后,总的预测误差用下表来计算。总误差现在又是0了。不错。

 

 

在把2加到函数里之后,我们的模型变成有参数的了吗?不!模型仍然是无参数的。一个有参数的模型从数据中学习到参数的值。这里,参数值的计算与数据无关,所以说模型仍然是无参数的。刚才的模型用2乘以X,但是数值2与数据无关。所以,模型仍是无参数的。

 

我们把前面的数据用下表进行修改。

 

 

因为没有学习环节,我们能直接跳到测试环节,在这个环节里我们用最新的那个函数(Y=2X)来计算预测输出,然后计算出预测的误差。总的误差用下表进行计算。总的误差现在不再是0,而是14了。这是怎幺回事?

 

 

解决这个问题的模型是建立在输出Y是输入X的两倍(2X)基础之上的。现在,输出Y不再等于2X,而3X了。因此,我们可以肯定误差会增加。为了消除这个误差,我们不得不改变模型函数,用3,而不是2。新的函数是Y=3X。

 

新的函数Y=3X会将误差重新调整为0值。但适用于处理先前数据的Y是X的两倍即Y=2X,在处理当下数据时会造成误差。所以,我们必须以X的3倍去调整总误差。在处理先前的数据时,我们还必须手动把倍数变为2。

 

看起来当每一次数据调整的时候,我们就必须手动调整模型。对这种烦人的情况,我们有一个解决方法。我们可以避免在函数当中使用常量,而用变量代替。这就是代数,一个使用变量多于常量的领域。

 

  将权重作为变量

 

比起在函数中使用常量,比如Y=2X中的2或者Y=3X中的3,我们可以在y=wx当中使用w这个变量。这个变量的数值可以基于数据计算而来,因为这个模型涵盖了由数据计算得来的变量,所以模型可以说是有参数的。因为模型含有参数,在变量值可以计算的基础上,模型就有了学习步骤。这个参数就是人工神经网络中的一个神经元。接下来就看一下,当先前的数据符合y=2x这一规律时,模型是如何为参数w赋值2的。数据在下面已经给出。

 

将参数初始化为一个通常情况下随机选择的初始值,对于每一个参数值,总误差都是可以计算的。在一些参数值的基础上,我们可以决定减少误差的方向,这有助于参数值的最佳(最优)选择。

 

 

  优化参数

 

假设参数w的初始值设定为1.5,我们现在的函数是y=1.5x,我们可以根据下面的表格在此函数基础上计算出总误差。总误差是8,因为这里存在误差,我们可以改变参数w的值。

 

但是目前我们不知道应该向哪一个方向改变参数w的值。我是说,哪一种方向更好?我们是应该增加还是减少这个参数的值?所以我们可以选择任何值,无论是比现在的1.5大还是小。

 

 

假设新的w参数值是0.5,那幺新的函数是y=0.5x,我们可以在此基础上计算新的总误差得到21。比起之前的参数值1.5和结果8,总误差增加了。这就是我们往错误方向为参数值赋值的暗示。我们可以往数值更大的方向改变w的参数值,然后看结果有没有改善。

 

 

如果新的参数值是2.5,新函数是y=2.5x, 在这个函数的基础上计算总误差,计算结果可见以下表格,当总误差为7时,比之前参数值1.5和0.5两个案例的结果更优,所以我们应该为w赋比1.5更大的值,以减少总误差。我们可以接着为w增加赋值。

 

 

假设新的参数值是3,那函数就是y=3x, 在此基础上计算所得的总误差如以下表格中显示,为14。误差比之前更大。

 

 

为了对这种情况有更好的观察,我们可以在下表中总结先前选择的参数w赋值和与之相对应的总误差。可以看出减少误差的参数w的值域在1.5-2.5之间。我们可以在此范围内取值2,这个过程会测试持续更多的值,直到最终总结出2是可以达到最小可能误差的最优值。当函数为y=wx,当 w为2时,总误差为0。

 

 

这是针对于函数y=2x的数据,当y=3x时,我们可以重复以上过程为参数值为3的函数找到最优值。到目前为止,在人工神经网络中使用权重的目的已经很清晰了。

 

我们现在可以讨论偏移值了。为此我们需要修饰数据,新的数据已经在下表中给出。

 

 

   偏差为常数

 

此数据与Y = 2X时使用的数据相同,但我们为每个Y值增加了1。我们可以测试前一个函数Y = wX,其中w = 2,并根据下面的表计算总误差。总误差为4。

 

 

根据我们之前的讨论,4的误差意味着wis的值不是最好的,我们必须改变它直到达到误差为0。但是在某些情况下,仅使用权重的话将不会达到0误差。这个例子是一个证据。

 

仅使用权重w,我们可以达到0误差吗?答案是否定的。在这个例子中只使用权重,我们可以接近正确的输出,但仍然会有错误。让我们更详细地讨论这个问题。

 

对于第一个样本,在等式Y = wX中w的最佳值是什幺,它返回一个等于0的误差?这很简单。我们有一个包含3个变量的方程,但我们知道2个变量的值,即Y和X.这就省去了一个变量w,可以使用w = Y / X轻松计算。对于第一个样本,Y等于5,X等于2,因此w = Y / X = 5/2 = 2.5。因此,正确预测第一个样本输出的w的最佳值是2.5。我们可以对第二个样本重复相同的操作。

 

对于第二个样本,Y = 7且X = 3。因此,w = Y / X = 7/3 = 2.33。因此,正确预测第二个样本输出的w的最佳值是2.33。该值不同于与第一个样本一起使用的w的最佳值。根据第一个和第二个样本的w的2个值,我们找不到w的单个值来正确预测它们的输出。使用w = 2.5将在第二个样本中产生错误,使用w = 2.33将在第一个样本产生错误。

 

作为结论,仅使用权重,我们不能达到0的误差。为了解决这种情况,我们必须使用偏差。

 

通过在w和X之间的乘法结果中加1值可以得到0的误差。因此,新函数是Y = wX + 1,其中w = 2。根据下表,总误差现在为0. 很好。

 

 

   偏差作为变量

 

我们仍然使用常量值1添加到wX。根据我们之前的讨论,在函数中使用常量值会使此值依赖于特定问题而非通用。

 

因此,我们可以使用变量,而不是使用常数1。因此,新函数是Y = wX + b。变量(参数)b表示ANN中的偏差。在解决问题时,我们现在有2个参数w 和 b来决定它们的最优值。这使问题变得更加困难。我们要求优化2个参数w(权重)和b(偏差),而不是仅仅找到权重w的最佳值。这需要花费比以前更多的时间。

 

为了找到2个参数的最优值,一个好方法是首先优化单个参数,直到达到最小可能的误差。通过更改此参数确保错误不再下降后,我们再开始优化下一个参数。

 

在优化参数w时将此策略应用于前一个示例,我们将注意到即使和w = 2有微小的偏差都会增加误差。这表示值2是参数w的最佳值,我们可以开始优化下一个参数b。

 

  从数学形式到神经元的图形形式

 

此时,我们推导出具有2个参数的函数Y = wX + b。第一个是表示权重的w,第二个是表示偏差的b。该函数是ANN中接受单个输入的神经元的数学表示。输入为X,权重等于w。神经元的偏差为b。

 

通过将权重(w)乘以输入(X)并将结果与偏差(b)相加,神经元的输出为Y,其被视为与其连接的其他神经元的输入。神经元也可以表示为总结所有这些信息的图表,如下图所示。

 

在图中,您可以找到数学函数中的参数与神经元图之间的映射。只有一个地方需要注意。偏差被视为输入值为1的权重。这使得对于正常输入操纵偏差变得容易。

 

 

   具有多个输入的神经元

 

到目前为止,权重和偏差的目的现在已经很明确,我们也能够以数学和图形的形式表示神经元。但神经元目前仍只接受单一输入。我们如何允许它支持多个输入?这也很简单。只需在等式中添加您需要的任何输入,并为每个输入分配权重。如果有3个输入,则数学形式如下:

 

关于图形形式,只需为每个输入创建一个新连接,然后将输入和权重放在连接上。这在下图中给出。通过连接这种形式的多个神经元,我们可以创建一个完整的人工神经网络。记住,整个过程的起点仅仅是Y = X而已。

 

 

   乘积之和

 

在数学形式中,我们注意到重复了不同的项。这些项对应每个输入乘以其相应的权重。我们可以在求和运算符中汇总所有这些乘积。该操作符将返回每个输入与其相应权重之间的乘积之和。

 

下面给出了神经元的新数学形式。注意,求和从0开始,而不是1.这意味着将存在权重(w)和具有索引为0的输入(X)。索引为0的权重将指向偏差b。其输入将始终指定为+1。

 

 

你也可以在求和完成后再加上偏差作为单独的一项(如下所示)。在这种情况下,求和从1开始。

 

 

   结论

 

本教程提供了一个非常详细的解释,说明如何从一个非常简单的函数Y = X开始创建一个完整的人工神经网络。在整个教程中,我们探讨了权重和偏差的目的。此外,此教程在数学形式和神经元的图形形式之间进行了一一对应。

 

本文编辑:王立鱼

 

英语原文:https://heartbeat.fritz.ai/from-y-x-to-building-a-complete-artificial-neural-network-327da18894af

原标题 |  From Y=X to Building a Complete Artificial Neural Network

作 者 |  Ahmed Gad

译者 | AI小山(工程师)、朱慧94(上海大学)、Mr-UC(中国科学院大学)

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注