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