前言
本文的例子和素材均来自https://www.3blue1brown.com/lessons/neural-networks
这篇博客以“识别数字”为例,深入探讨了神经网络的概念、组成要素以及数据在网络中的传播方式等基础知识。
什么是神经网络
这张图片展示了一个简单的神经网络,其任务是识别手写数字图像,并输出对应的数字结果。
在https://www.3blue1brown.com/lessons/neural-networks这篇文章的开头,提供了一个交互式的体验程序。可以让你直观的感受神经网络的执行过程。
要通过传统的if-else和for-loop方式编写代码实现这个功能可能非常困难。因为人为手写的数字是不确定的,每个人的书写风格可能不同,所以很难用一个标准来准确评估何为一个数字。
当我们看到上面的三张图时,我们的大脑立即能够识别它们都代表着数字“3”。这是为什么呢?这种思考驱使人们研究一种模仿人类大脑工作模式的技术,即神经网络。
在这个例子中,我们无法定义一套标准去告诉神经网络应该如何识别数字,我们只是把一系列的图片和图片对应正确的数字输入神经网络,由神经网络自主调整和学习。
神经网络的结构
神经网络有多种类型,如卷积神经网络(CNN)、递归神经网络(RNN)等等。它们的区别在于网络内部的结构,每种网络都有其独特的侧重点和能力。在本例中,我们首先介绍最简单的全连接网络。
神经元
神经网络包含多个层,每一层都由多个神经元组成。你可以将神经元理解为一个容器,其中包含一个称为“激活值”的数字。你可以想象,激活值越大,神经元就越明亮,而明亮的神经元表示其活跃程度更高。
所有信息都存储在神经元中。在这个例子中,我们的图片如何输入到神经元当中呢?
一张图片的信息也就是每个像素点的RGB值(严格一点还有每个像素点所处的坐标,本文不讨论),所以我们要把这些RGB值都传入神经网络。由于我们的例子中是黑白图片,因此只需要传递灰度值即可。
在例子中,把灰度值通过算法压缩到了0-1之间,在后续的章节会解释,暂可不必纠结。
在本例中,图片大小为28 * 28,因此为了将这784个像素传入网络,神经网络的第一层必须包含784个神经元,才能充分存储这张图片的信息。
在将图片输入神经网络时,你可以选择按顺序将像素值从左到右依次填入神经元的激活值,也可以选择按顺序从上到下。当然这样的选择可能会影响训练效果。
在本例中,神经网络的最后一层由十个神经元组成。当图片从输入一路运行到最后一层时,这十个神经元的激活值代表了图片对应每个数字的可能性。
正如之前所描述的,激活值越大表示神经元越亮,意味着输入图片对应该数字的概率越高。举个例子,如果在运行后发现“4”和“9”这两个神经元的亮度相近,这表明网络此时存在疑惑,无法确定输入图片究竟是4还是9。
(你仍然可以选择一个激活值最大的进行输出,但是答案很可能是错的)
中间的两层代表了神经网络的隐藏层。人工智能的一个显著特点是其不可解释性,因此不必过于深究为什么中间有16个神经元或为什么要有两层隐藏层。我们可以将中间的结果视为隐藏层的输出。
中间的两层16个神经元的结构并不是固定的,它是任意选择的。因此,无法解释它代表了什么特征
为什么要使用层次结构
在这个网络中,每一层的神经元都与下一层的神经元相连,这意味着每一层的神经元的激活值会影响下一层的神经元。
另外,我们可以观察到第二层的神经元在进行运算时有亮有暗,这是因为第二层的每一个神经元都受到了第一层所有神经元的影响,而这些影响可能是正向的(增强激活)也可能是负向的(抑制激活)。
在讨论神经网络为什么要分层之前,我们先思考一种识别数字的方法:
对于数字9来说,它可能是由一个“o”加一个“|”组成,所以当我们识别到图片中有这两个特征时,这张图片是9的概率就非常大。
因此我们可以把识别数字分解为识别“o”、“|”这样的特征符号。
我们假设神经网络倒数第二层就是在识别“o”和“|”这样的特征形状,当“o”和“|”对应的神经元被激活时,它们的激活值传递到最后一层,最终激活数字“9”对应的神经元。
同样的,我们再细分一下,“o”由很多个圆弧组成
这时我们再假设倒数第三层是专门用来识别这些特殊符号的。在这一层,我们关注的特征就会更加细化和具体。
以上都只是假设,第二层和第三层具体关注了什么内容,是比较复杂的
最后,我们回到为什么要分层的问题上。分层能够让神经网络将复杂的问题简化,将大问题拆解成小问题。尽管我们并不知道具体是如何拆解的,但这种分层的结构能够帮助网络更有效地处理复杂任务。
总结
本文带领读者初步了解了神经网络、神经网络的分层结构以及神经元。在下一篇文章中,我们将继续介绍神经网络的其他重要概念。