原标题 | From Y=X to Building a Complete Artificial Neural Network
作者 | Ahmed Gad
译者 | AI小山(工程师)、朱慧94(上海大学)、Mr-UC(中国科学院大学)
本文编辑:王立鱼
英语原文:https://heartbeat.fritz.ai/from-y-x-to-building-a-complete-artificial-neural-network-327da18894af
在某些时候,你也许曾问过自己,人工神经网络的参数的来源是什么?权重的目的是什么?如果不用偏差(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
想要继续查看该篇文章相关链接和参考文献?
点击【从Y = X到构建完整的人工神经网络】即可访问:雷锋网雷锋网(公众号:雷锋网)雷锋网
今日博客推荐:神经网络之谜第一部分:深入挖掘神经网络背后的数学
如今,我们拥有许多诸如Keras、Tensorflow和PyTorch一类高封装级别的数据包,因此,我们不再时常担忧记不住加权矩阵的大小或者激活函数的导数是什么。通常我们只需要引用几个数据包以及几行代码,我们就可以创建一个神经网络,即使这个神经的结构十分复杂。可见这样就节省了大量时间去寻找代码中的bug也大大简化了我们的工作。但是!不可忽略的是,对神经网络内部运行原理的理解与认知,对模型的挑选和超参数的调整和优化是大有帮助的。