人工神经网络其实就像是一个复杂的计算器,你给它输入一些东西,它就能给你一个结果。就像你用计算器输入2+2,它会给你输出4一样,但人工神经网络能处理的不仅仅是数字加减,它能处理更复杂的东西,比如图片、文字等等。所以,当我们说人工神经网络是一个“函数逼近器”时,其实就是说它能模拟各种复杂的计算过程,帮助我们从输入得到想要的输出。
如果是一张汽车的图片,必须有一个函数,可以接收这张图片并预测它是什么类型的车,仅仅通过那些原始的像素值。
对于传统编程,如果有一段英文文本,必须有一个函数,可以接收这段文本并输出相同的文本,但是用中文。
如果你有一个问题,必须有一个函数,可以产生答案。
但问题是,在传统编程中,我们一直在编写函数,它们非常强大,但当函数太难以至于我们无法解释它时会发生什么?例如,当你看到这个数字时,
你知道它是5,但如果你必须编写一个算法,接收这张图片并说它是5,突然之间这变得极其困难。
任务很简单,但接收一张手写数字的图片并输出是哪个数字的函数非常难以编写,所以这就是为什么我们需要机器学习。这里的想法很简单,如果你知道一定存在一个可以解决这个问题的函数,但我们不知道那个函数是什么样子的,也许我们可以定义一个结构,一个人工神经网络,它可以学习这个函数,而为了学习这个函数,它需要一些可以学习的东西,这意味着它需要数据,比如很多不同的手写数字图片。
让我们看一个非常简单的例子,
你可以看到一些数据点,如果我问你模拟这些数据的函数是什么,你可能会想象一条穿过这些数据点的曲线。这就是神经网络也应该学习的,它应该学会逼近这些数据所代表的函数,如果出现了一个新的x值,我们应该能够预测y值,即使我们之前不知道这个点。
回到手写数字,一个非常著名的手写数字数据集叫MNIST,其中存储了成千上万个手写数字。
如果你想要制作一个从这些数据中学习的模型,以便能够识别未见过的手写数字,你可以借鉴人类大脑学习的方式。
我们的大脑由很多细胞组成,这些细胞叫做神经元。神经元有一些像天线一样的部分叫做树突,它们用来接收来自其他神经元的信号。神经元的主体会决定是否要把这些信号传递给下一个神经元。如果决定传递,神经元会通过一根叫做轴突的长线把信号发送出去,直到信号到达另一个叫做突触的地方。在突触处,信号会被传递给下一个神经元。这就是我们的大脑如何处理和传递信息的基本方式。
当我们学习时,大脑中神经元之间的连接发生变化,它们变得更强,形成新的连接,神经元变得更高效。
人工神经网络试图模拟这个过程,它们由人工神经元组成,即简单的函数,接收来自其他神经元的值,并将它们组合成一个传递给其他神经元的信号。
具体的情况下,上图是一个28x28像素的图片,每个像素值的范围是0到1,黑色像素是0,白色像素是1,这些像素构成了输入层。
现在我们想知道图片显示的是哪个数字,因为有10个可能的数字,所以我们对每个输入的图像产生10个预测,所以这里可以添加10个神经元并称之为输出层,
每个输入神经元(一个像素点)将连接到每个输出神经元(0-9的10个数字),我们用所谓的权重连接它们,每个权重仅仅是一个数字,一开始这个数字可以随机选择。
在这个例子中,有784个输入神经元(对应于28x28像素的图片),每个输入神经元都连接到10个输出神经元(对应于10个可能的数字)。所以总共会有784个像素点乘以10个数字,也就是7840个连接。每个连接都有一个权重,这些权重会在训练过程中进行调整,以便网络能够正确地识别输入图片中的数字。
每个输出神经元将取输入值,将每个值乘以相应的权重并将它们求和以得到一个新值,
在这个例子中,我们期望的是,代表数字5的那个神经元给出一个很高的数值(权重),而其他代表其他数字的神经元给出的数值都比较低。这样,网络就能正确地识别出输入图片是数字5。
如果输入数字0,再一次,只有代表0的输出神经元应该亮起(获得很高的数值),这可能是我们能构建的最简单的神经网络。
但我们的任务是教会这个人工神经网络识别这些数字,这意味着我们必须以某种方式改变权重,让模型做出更好的预测,这是通过向网络展示一系列的样本图片(比如手写数字的图片),然后观察网络的预测结果是否准确来完成的。如果网络的预测结果不准确,就需要调整权重。
为了知道如何调整权重,我们使用了一个叫做“损失函数(Loss )”的工具,它可以帮助我们衡量网络的预测结果和实际结果之间的差异。我们的目标是让这个损失尽可能小,这意味着我们的预测越准确。
事实上,如果你可视化每个神经元的权重,随着模型学习,我们可以看到,尽管它们一开始看起来是随机的。但随着模型的学习和训练,这些权重会逐渐调整,开始形成一些特定的模式。这些模式让模型能够识别不同数字的特征,从而区分它们。最初,模型可能只能学习简单的线性关系,这意味着它能区分一些非常基本的数字特征。
为了让模型能够学习更复杂的关系,我们可以在输入层和输出层之间添加更多的层,这些额外的层被称为隐藏层。
添加更多的隐藏层可以使神经网络变得“更深”,这就是“深度学习”的概念。隐藏层中的神经元和输出层中的神经元工作方式相似,但每个神经元还有一个激活函数( ),这个函数可以是非线性的,使得模型能够学习更复杂的关系,从而提高识别数字的准确性。
回到简单的二维函数示例,激活函数将使我们能够弯曲直线,以便我们可以更准确地模拟数据。
有许多激活函数,但其中最简单的一个叫做ReLu,它把负数变成0,正数保持不变。
当我们给神经网络添加更多的神经元或者层数时,它的能力会增加,也就是说它能学习到更复杂的东西。但是,有一个问题,如果我们让网络变得太大,它可能就会变得太“聪明”了,以至于它不仅学会了我们想让它学的东西,还记住了所有的训练数据。这种情况叫做过拟合,就像是模型变得太专注于训练数据,以至于在面对新的、没见过的数据时就表现不好了。另一方面,如果模型太简单,它可能就学不到足够的东西,这种情况叫做欠拟合。所以,神经网络的主要目标就是找到一个平衡点,构建一个既不太复杂也不太简单,能够从数据中学习规律的模型。
有话要说...