当下神经网络及其应用都非常受欢迎,但是大多数人用的神经网络多是一个库或者选择一段开源代码,对于其中的数学基础以及其中的架构知之甚少,这次我们就通过讲解所有神经网络的数学公式以及通过数学公式在办公软件Excel上实现对数字的识别。
讲解数学公式部分我就不用latex来打,因为时间实在不够,全程采用书写,Excel文件会上传到博客资源中提供下载。
我们这次的讲解的角度主要源自“深度学习的数学”一书,下面是这本书的第一章的链接,感兴趣的伙伴可以买来学习。
第一章内容
这些数学基础不会太难,大多数都是具备高中文凭都可以轻松掌握的数理知识,接下来我们看一下吧。
神经网络是以从神经元抽象出来的数学模型为出
发点的。整理神经元的工人的大脑是由多个神经元互相连接形成网络而构成的。也就是说,一个神经元从其他神经元接收信号,也向其他神经元发出信号。大脑就是根据这个网络上的信号的流动来处理各种各样的信息的。
如上图所示,神经元是由细胞体、树突、轴突三个主要部分构成的。其他神经元的信号(输入信号)通过树突传递到细胞体(也就是神经元本体)中,细胞体把从其他多个神经元传递进来的输入信号进行合并加工,然后再通过轴突前端的突触传递给别的神经元。
那么,神经元究竟是怎样对输入信号进行合并加工的呢?让我们来看看它的构造。
假设一个神经元从其他多个神经元接收了输入信号,这时如果所接收的信号之和比较小,没有超过这个神经元固有的边界值(称为阈值),这个神经元的细胞体就会忽略接收到的信号,不做任何反应。
不过,如果输入信号之和超过神经元固有的边界值(也就是阈值),细胞体就会做出反应,向与轴突连接的其他神经元传递信号,这称为点火。
那么,点火时神经元的输出信号是什么样的呢?信号的大小是固定的。即便从邻近的神经元接收到很大的刺激,或者轴突连接着其他多个神经元,这个神经元也只输出固定大小的信号。点火的输出信号是由 0 或 1 表示的数字信息。
根据神经元点火的结构,我们有以下的特征
(1) 来自其他多个神经元的信号之和成为神经元的输入。
(2) 如果这个信号之和超过神经元固有的阈值,则点火。
(3) 神经元的输出信号可以用数字信号 0 和 1 来表示。即使有多个输出端,其值也是同一个。
下面让我们用数学方式表示神经元点火的结构。
首先,我们用数学式表示输入信号。由于输入信号是来自相邻神经元的输出信号,所以根据 (3),输入信号也可以用“有”“无”两种信息表示。因此,用变量 x 表示输入信号时,如下所示。
接下来,我们用数学式表示输出信号。根据 (3),输出信号可以用表示点火与否的“有”“无”两种信息来表示。因此,用变量 y 表示输出信号时,如下所示。
最后,我们用数学方式来表示点火的判定条件。
从 (1) 和 (2) 可知,神经元点火与否是根据来自其他神经元的输入信号的和来判定的,但这个求和的方式应该不是简单的求和。例如在网球比赛中,对于来自视觉神经的信号和来自听觉神经的信号,大脑是通过改变权重来处理的。因此,神经元的输入信号应该是考虑了权重的信号之和。用数学语言来表示的话,例如,来自相邻神经元 1、2、3 的输入信号分别为 x_1、x_2、x_3,则神经元的输入信号之和可以如下表示。
根据 (ii),神经元在信号之和超过阈值时点火,不超过阈值时不点火。于是,利用式 (1),点火条件可以如下表示。
这里,***(那个圆圈我打不出来)是该神经元固有的阈值。
点火条件的图形表示
下面我们将表示点火条件的式 (2) 图形化。以神经元的输入信号之和为横轴,神经元的输出信号 y 为纵轴,将式 (2) 用图形表示出来。如下图所示,当信号之和小于 那个圆圈(这里打不出来)时,y 取值 0,反之 y 取值 1。
利用单位阶跃函数 u(z),式 (2) 可以用一个式子表示如下。
简化神经元的图形
然而,为了画出网络,需要画很多的神经元,在这种情况下上面那样的图就不合适了。因此,我们使用如下所示的简化图,这样很容易就能画出大量的神经元。
激活函数
将神经元的示意图抽象化之后,对于输出信号,我们也对其生物上的限制进行一般化。
根据点火与否,生物学上的神经元的输出 y 分别取值 1 和 0(下图)。
然而,如果除去“生物”这个条件,这个“0 和 1 的限制”也应该是可以解除的。这时表示点火与否的下式(1 - 2 节式 (3))就需要修正。
这里的函数 a 是建模者定义的函数,称为激活函数(activation function)。x_1、x_2、x_3 是模型允许的任意数值,y 是函数 a 能取到的任意数值。这个式 (2) 就是今后所讲的神经网络的出发点。
注:虽然式 (2) 只考虑了 3 个输入,但这是很容易推广的。另外,式 (1) 使用的单位阶跃函数 u(z) 在数学上也是激活函数的一种。
请注意,式 (2) 的输出 y 的取值并不限于 0 和 1,对此并没有简单的解释。一定要用生物学来比喻的话,可以考虑神经单元的“兴奋度”“反应度”“活性度”。
Sigmoid 函数
激活函数的代表性例子是 Sigmoid 函数 \sigma(z),其定义如下所示。
这里先来看看它的图形,Sigmoid 函数 \sigma(z) 的输出值是大于 0 小于 1 的任意值。此外,该函数连续、光滑,也就是说可导。这两种性质使得 Sigmoid 函数很容易处理。
单位阶跃函数的输出值为 1 或 0,表示点火与否。然而,Sigmoid 函数的输出值大于 0 小于 1,这就有点难以解释了。如果用生物学术语来解释的话,如上文中的表格所示,可以认为输出值表示神经单元的兴奋度等。输出值接近 1 表示兴奋度高,接近 0 则表示兴奋度低。
偏置
再来看一下激活函数的式 (2)。
这里的 \theta 称为阈值,在生物学上是表现神经元特性的值。从直观上讲,\theta 表示神经元的感受能力,如果 \theta 值较大,则神经元不容易兴奋(感觉迟钝),而如果值较小,则神经元容易兴奋(敏感)。
然而,式 (2) 中只有 \theta 带有负号,这看起来不漂亮。数学不喜欢不漂亮的东西。另外,负号具有容易导致计算错误的缺点,因此,我们将 -\theta 替换为 b。
经过这样处理,式子变漂亮了,也不容易发生计算错误。这个 b 称为偏置(bias)。
神经网络作为本书的主题,它究竟是什么样的呢?
通过我们刚才建立了这个基础单元模型,将这样的神经单元连接为网络状,就形成了神经网络。
神经网络各层的职责
阶层型神经网络如下图所示,按照层(layer)划分神经单元,通过这些神经单元处理信号,并从输出层得到结果,如下图所示。
构成这个网络的各层称为输入层、隐藏层、输出层,其中隐藏层也被称为中间层。
各层分别执行特定的信号处理操作。
输入层负责读取给予神经网络的信息。属于这个层的神经单元没有输入箭头,它们是简单的神经单元,只是将从数据得到的值原样输出。
隐藏层的神经单元执行前面所复习过的处理操作 (1) 和 (2)。在神经网络中,这是实际处理信息的部分。
输出层与隐藏层一样执行信息处理操作 (1) 和 (2),并显示神经网络计算出的结果,也就是整个神经网络的输出。
深度学习,顾名思义,是叠加了很多层的神经网络。接下来我们来说下各层神经网络的含义。
这个简单的神经网络的特征是,前一层的神经单元与下一层的所有神经单元都有箭头连接,这样的层构造称为全连接层(fully connected layer)。这种形状对于计算机的计算而言是十分容易的。
下面让我们来简单地看一下各层的含义。
输入层由 12 个神经单元构成,对此我们立刻就能够理解,因为神经网络一共需要读取 4×3 = 12 个像素信息。
输入层的神经单元的输入与输出是相同的。一定要引入激活函数 a(z) 的话,可以用恒等函数(a(z)=z)来充当。
输出层由两个神经单元构成,这是因为我们的题目是识别两种手写数字 0 和 1,需要一个在读取手写数字 0 时输出较大值(即反应较大)的神经单元,以及一个在读取手写数字 1 时输出较大值的神经单元。
例如,将 Sigmoid 函数作为激活函数使用。在这种情况下,读取数字 0 的图像时,输出层上方的神经单元的输出值比下方的神经单元的输出值大;而读取数字 1 的图像时,输出层下方的神经单元的输出值比上方的神经单元的输出值大,如下图所示。像这样,根据输出层的神经单元的输出的大小,对整个神经网络进行判断。
隐藏层具有提取输入图像的特征的作用。然而,隐藏层为何能够提取输入图像的特征呢?这不是一个简单的话题。另外,在这个解答示例中,隐藏层为何是 1 层而不是 2 层?为何是由 3 个神经单元构成而不是 5 个?想必读者会涌现出诸多疑问。为了解决这些疑问,就需要理解下一节所讲的神经网络的结构。
隐藏层其实是工作量最大,难度最高的。这是因为隐藏层肩负着特征提取(feature extraction)的重要职责,需要很长的篇幅来介绍。
神经网络是将神经单元部署成网络状而形成的。然而,将神经单元胡乱地连接起来并不能得到有用的神经网络,因此需要设计者的预估,这种预估对于隐藏层是特别重要的。因为支撑整个神经网络工作的就是这个隐藏层。
前面已经提到过,模式识别的难点在于答案不标准,这个例题也体现了这样的特性。即使是区区一个 4×3 像素的二值图像,所读入的手写数字 0 和 1 的像素模式也是多种多样的。例如,下列图像可以认为是读入了手写数字 0。
思路:由神经单元之间的关系强度给出答案
对于这种没有标准答案、识别困难的问题,怎么解决才好呢?思路就是“由网络进行判断”。乍一听会觉得这个方法不可思议,不过其中的逻辑却一点都不难,我们可以用恶魔组织的信息网络来做比喻。虽然这个比喻并不算准确,但是可以突出其本质。
假设有一个如下图所示的恶魔组织,隐藏层住着 3 个隐藏恶魔 A、B、C,输出层住着 2 个输出恶魔 0 和 1。输入层有 12 个手下①~⑫为隐藏恶魔 A、B、C 服务。
最下层(输入层)的 12 个手下分别住在 4×3 像素图像的各个像素上,其工作是如果像素信号为 OFF(值为 0)就处于休眠状态;如果像素信号为 ON(值为 1)则变得兴奋,并将兴奋度信息传递给他们的主人隐藏恶魔 A、B、C。
最下层(输入层)的 12 个手下分别住在 4×3 像素图像的各个像素上,其工作是如果像素信号为 OFF(值为 0)就处于休眠状态;如果像素信号为 ON(值为 1)则变得兴奋,并将兴奋度信息传递给他们的主人隐藏恶魔 A、B、C。
住在最上层的 2 个输出恶魔也是从住在下层的 3 个隐藏恶魔那里得到兴奋度信息。与隐藏恶魔一样,他们将得到的兴奋度信息进行整合,根据其值的大小,自己也变兴奋。然后,这些输出恶魔的兴奋度就成为整个恶魔组织的意向。如果输出恶魔 0 的兴奋度比输出恶魔 1 的兴奋度大,神经网络就判定图像的数字为 0,反之则判定为 1。
可见,恶魔的世界里也存在着人际关系。
隐藏恶魔 A、B、C 对模式有着各自的偏好,与 12 个手下有不同的交情。隐藏恶魔 A 的偏好是之前的模式 A,因此与④、⑦性情相投。因为模式 A 的 4 号像素与 7 号像素是 ON,所以理所当然地与对应的看守人④、⑦性情相投。
同样地,手下⑤、⑧与隐藏恶魔 B,手下⑥、⑨与隐藏恶魔 C 性情相投,因此他们之间传递兴奋度的管道也变粗了(下图)。
住在隐藏层的隐藏恶魔 A、B、C 与住在上层的 2 个输出恶魔也有着人际关系。由于某种羁绊,输出恶魔 0 与隐藏恶魔 A、C 性情相投,而输出恶魔 1 与隐藏恶魔 B 性情相投。
以上就是恶魔组织的所有人际关系。除了隐藏恶魔 A、B、C 有不一样的偏好以外,这是一个人类社会中到处都可能存在的简单的组织。
于是,作为像素看守人的手下④、⑦和手下⑥、⑨看到这个图像就变得非常兴奋了(下图)。
这时,兴奋的手下④、⑦向性情相投的隐藏恶魔 A 传递了较强的兴奋度信息,兴奋的手下⑥、⑨也向性情相投的隐藏恶魔 C 传递了较强的兴奋度信息。相对地,几乎没有手下向隐藏恶魔 B 传递兴奋度信息(下图)。
接收了来自手下的兴奋度信息的隐藏恶魔们会怎样呢?接收了较强的兴奋度信息的隐藏恶魔 A 和隐藏恶魔 C 自然也变兴奋了。另一方面,隐藏恶魔 B 变得怎样呢?因为几乎没有从手下接收到兴奋度信息,所以一直保持冷静。
住在最上层的输出恶魔变得怎样了呢?输出恶魔 0 由于与兴奋的隐藏恶魔 A、C 关系亲密,从而获得了较强的兴奋度信息,所以自己也兴奋起来了。相对地,输出恶魔 1 与隐藏恶魔 A、C 关系疏远,而与之关系亲密的隐藏恶魔 B 一直保持冷静,所以输出恶魔 1 没有获得兴奋度信息,因此也保持冷静。
这样一来,读取手写数字 0 的图像后,根据恶魔之间的连锁关系,最终得到了“输出恶魔 0 兴奋,输出恶魔 1 冷静”的结果。根据前文中的“如果输出恶魔 0 的兴奋度比输出恶魔 1 的兴奋度大,神经网络就判断图像的数字为 0”,恶魔的网络推导出了 0 这个解答。
恶魔的心的偏置
在这个恶魔组织中,下层的兴奋度会或多或少地传递到上层。但是,除了具有亲密关系的各层之间传递的兴奋度信息以外,还遗漏了少量信息,就是“噪声”。如果这些噪声迷住了恶魔的心,就会导致无法正确地传递兴奋度信息。因此,这就需要减少噪声的功能。对于恶魔组织的情形,我们就将这个功能称为“心的偏置”吧!具体来说,将偏置放在恶魔的心中,以忽略少量的噪声。这个“心的偏置”是各个恶魔固有的值(也就是个性)。
现在我们将恶魔的工作用神经网络的语言来描述。
恶魔之间的“交情”表示权重
上面考察了恶魔组织识别手写数字 0、1 的结构。将这个组织替换为神经网络,我们就能理解神经单元发挥良好的团队精神进行模式识别的结构。
首先,将恶魔看作神经单元。隐藏层住着 3 个隐藏恶魔 A、B、C,可以解释为隐藏层有 3 个神经单元 A、B、C。输出层住着 2 个输出恶魔 0、1,可以解释为输出层有 2 个神经单元 0、1。此外,输入层住着 12 个恶魔的手下,可以解释为输入层有 12 个神经单元(下图)。
接下来,将恶魔的“交情”看作神经单元的权重。隐藏恶魔 A 与手下④、⑦性情相投,这样的关系可以认为是从输入层神经单元④、⑦指向隐藏层神经单元 A 的箭头的权重较大。同样地,隐藏恶魔 B 与手下⑤、⑧性情相投,可以认为是从输入层神经单元⑤、⑧指向隐藏层神经单元 B 的箭头的权重较大。隐藏恶魔 C 与手下⑥、⑨性情相投,可以认为是从输入层神经单元⑥、⑨指向隐藏层神经单元 C 的箭头的权重较大。
隐藏恶魔 A、C 与上层的输出恶魔 0 性情相投,这个关系表示从隐藏层神经单元 A、C 指向输出层神经单元 0 的箭头的权重较大。同样地,隐藏恶魔 B 与输出恶魔 1 性情相投,这个关系表示从隐藏层神经单元 B 指向输出层神经单元 1 的箭头的权重较大。
这样解释的话,神经网络读入手写数字 0 时,神经单元 A 和 C 的输出值较大,输出层神经单元 0 的输出值较大。于是,根据神经网络整体的关系,最终识别出数字 0。
在像这个神经网络那样前一层与下一层全连接的情况下,在输入 0 的图像时,原本不希望做出反应的隐藏层神经单元 B 以及输出层神经单元 1 也有信号传递,因此需要禁止这样的信号并使信号变清晰,这样的功能就是偏置,在恶魔组织中表现为“心的偏置”。
如上所述,权重和偏置的协力合作使得图像识别成为可能。这就是“由神经网络中的关系得出答案”的思想。
1、读入学习用的图像数据
为了让神经网络进行学习,学习数据当然必不可少。如下图所示,我们将学习数据读入工作表。
由于图像是单色二值的,所以我们将图像灰色部分转换为1,一白色部分转换为零。将正解带入到变量t1、t2中,当输入图像的手写数字为零时,(t1,t2)=(1,0),当输入图像的手写数字为一时(t1,t2)=(0,1);
2、设置权重和偏置的初始值
下面我们来设置权重和偏置的初始值,根据设置的不同存在求解器计算不收敛的情况,这时需要重新设置初始值
3、从第一张图像开始计算各个神经单元的加权输入,输出平方差
对于第一张图像,我们来计算个个神经单元的加权输入z的值输出值平方差c
4、对全部数据复制三中建立的函数。
将处理第一张图像时建立的函数复制到所有图像实例求出代价函数CT的值
5、利用求解器执行最优化
利用excel的标准插件,求解器算出代价函数CT的最小值如下设置单元格,然后运行求解器
求解器的可变单元格计算出的值就是最优化之后的神经网络的权重和偏置,此外,由于代价函数CT的值为零,所以这个神经网络完全拟合了学习数据
测试
我们来看一看步骤,五中得到的权重和偏置确定的神经网络是否正确输入手写数字0和1,看看能否得到我们想要的解