神经网络 stag.1

神经网络


神经元和感知器

生物学神经元 neural unit

生命是伟大的奇迹,是在超过千百亿年来斗转星移之间,在无数的诞生与消逝之中,有超过 1 0 11 10^{11} ,超过20种神经元,有着约 1 0 14 10^{14} 个突触。
在这里插入图片描述

感知器 perceptron

下面是一个简单的感知器,输入 x i x_{i} ,并且每个输入都有相应的输入权重 w i w_{i} ,而最终的输出取决于每个输入和相应的权重的乘积和,即 j w j x j \sum_{j}w_{j}x_{j} ,是否大于某个给定的阈值:
在这里插入图片描述
事实上,这个乘积和可以看成是这样的两个向量 x x , w w 的乘积:
(1) j w j x j = [ x 0 x 1 x j ] [ w 0 w 1 . . . w j ] \sum_{j} w_{j}x_{j} = \left[ \begin{matrix} x_{0} x_{1}\dots x_{j} \end{matrix} \right] \left [ \begin{matrix} w_{0} \\ w_{1} \\ .\\ .\\ .\\ w_{j} \end{matrix} \right] \tag{1}
对于多层感知器的神经网络,有时候我们从向量的角度来思考问题时,运用一些向量和矩阵运算的技巧,有时可以在很大程度上简化我们的问题。这个矩阵的输出 o u t p u t output 最终可以用下面的式子表示:
(2) o u t p u t = { 1 j w j x j t h r e s h o l d 0 j w j x j < t h r e s h o l d output = \left\{ \begin{matrix} 1 & \sum_{j}w_{j}x_{j} \ge threshold\\ 0 & \sum_{j}w_{j}x_{j} < threshold \end{matrix} \right . \tag{2}
当乘机和大于阈值时,输出为1,小于阈值时,输出为0。但是事实上,我们通常会把阈值移到狮子左端,也就是说,此时它不在作为一个阈值来表示,而是作为一个偏置量 b i a s bias ,并且我们用 w w x x 表示权重和输入的向量。这样的话,上面的式子将写成:
(3) o u t p u t = { 1 j w j x j + b i a s 0 0 j w j x j + b i a s < 0 output = \left\{ \begin{matrix} 1 & \sum_{j}w_{j}x_{j} + bias \ge 0\\ 0 & \sum_{j}w_{j}x_{j} + bias \lt 0 \end{matrix} \right . \tag{3}

模拟电路

感知器可以用于模拟电路逻辑。这是非常重要的一点,这意味着我们可以通过感知器实现任何电路的逻辑功能。下面是一个简单的与非门的实现:
在这里插入图片描述
我们可以看到,当且仅当 x 1 x_1 , x 2 x_2 都为1时,输出是小于0的,否则偏置量3都将会使得结果大于0,也就是一个与非门的输出结果。同理,我们可以非常简单的构造出其他电路逻辑单元,基于这些电路逻辑单元,我们就可以自然而然的实现任意复杂的电路逻辑。

对于感知器来说,输入和权重微小的改变很容易引起输出完全反转的情况发生。并且你可能会发现,所谓的感知器,不过就是与非门而已,并不是什么特别具有革命性的东西。但是事实上比较关键的在于,我们可以设计学习算法,自动调整参数,而不需要程序员一一进行调整。

S型神经元

S型神经元不同于感知器,它允许输入在0到1之间,也就是浮点数输入,最重要的是,相比于感知器,S型神经元在输入到输出之前,还经过了一个激励函数的映射。这个激励函数的表达式如下:
(4) σ ( z ) 1 1 + e z \sigma(z) \equiv \frac{1}{1 + e^{-z}} \tag{4}
在这里插入图片描述
而对于一个输入为 x x ,权重为 w w ,偏置为 b b 的S型神经元,输出为:
(5) 1 1 + e x p ( j w j x j ) \frac{1}{1 + exp(-\sum_{j}w_{j}x_{j})} \tag{5}
对于这个函数 σ ( z ) \sigma(z) ,他的形状事实上就是一个阶跃函数的平滑,而阶跃函数,事实上就是前面我们设置阈值的表达式对应的函数。
在这里插入图片描述
对于S型神经元的输出,我们可以这样来理解:它落在0到1之间,那么我们可以把这个输出结果当作一个相似程度。例如,对于手写数字识别,假如对数字是不是’9‘的输出为0.8,也就是说这个数字很有可能是9,我们可以这样来约定:如果小于0.5,说明这不是一个9.如果大于等于0.5的话,那么我们就认为这是一个9。这样就能够很清楚的根据输出结果进行判断了。

神经网络模型

前馈神经网络 Feed Forward Neural Network

我们这里所讨论的神经网络,都是以上一层的输出作为下一层的输入,这样的神经网络就叫做前馈神经网络。下图是一个简单的前馈神经网络,总共有3层,第一层是输入层,总共有三个输入,最右边一层是输出层,只有一个输出。中间这一层既不是输出,也不是输入,称为隐藏层。一个神经网络可以有多个隐藏层。
在这里插入图片描述
显然,前馈神经网络的结构,输入到输出,是不允许回路的存在的,即输出重新作用到输入上,这会使得神经网络变得复杂,难以理解,甚至有时候我们完全无法预料任何参数的修改将会导致什么变化。因此,前馈神经网络具有更为广泛的运用。
但是事实上,这样的结构虽然简单,似乎并不是很贴合生物神经网络的工作方式,显然人类神经网络功能是更加强大的。那么,我们自然而然会想,肯定存在有更好的神经网络架构的实现,具有更加强大的功能。

递归神经网络 Recursive Neural Network

递归神经网络最大的特点,也是和前馈神经网络所不同的,就是它允许反馈回路的存在,也就是输出会反过来作用于输入。这种模型的设计思想,是具有休眠前会在⼀段有限的时间内保持激活状态的神经元。这种激活状态可以刺激其它神经元,使其随后被激活并同样保持⼀段有限的时间。这样会导致更多的神经元被激活,随着时间的推移,我们得到⼀个级联的神经元激活系统。

简单的手写字识别神经网络 MNIST

手写字识别 (MNIST) 的过程可以分为两部分,首先是分割,就是把手写数字串图片分割成一张一张28x28的数字图片。这里我们不详细讨论分词算法。第二部分就是数字分类,比如说我们有下面这样的一张图片:
在这里插入图片描述
输入显然应该就是每个像素的灰度值,也就是28x28总共784个输入,这里我们只列出一部分输入,如下图。而输出自然就是0到9的10个输出,相应的输出神经元被激活的话,例如第一个输出神经元被激活的话,就说明输入的图片显示的数字是0。
既然第一层代表的是像素级别,那么第二层,也就是隐藏层代表的是什么呢?
显然一张数字图片,首先就是由像素组成的,就像一个人的基本组成单位是细胞一样。人体细胞构成组织器官,再形成系统,最终才形成我们所看到的人。那图片是不是也可以从这样的角度来看呢?假如我们简单的对0分成这样几个部分:在这里插入图片描述
在这里插入图片描述
这几个部分分别将对应图片中一系列相应的像素,这一系列的像素在第一层输入层的输出将作为这个部分所对应的神经元在隐藏层的输入,当然你会发现其他像素对应的神经元的输出也将作为这个隐藏层神经元的输入,但是它们的权重将会相对比较小,因为这些像素对这个结构部分的相关程度较小,甚至不相关。当然,我们还会有其它构成剩余1到9这几个数字的结构,这一些列的结构部分将构成我们手写数字识别神经网络的隐藏层。然后我们再根据不同部分和相应数字的相关程度,设置不同的权重,最终,我们便得到了我们手写数字识别神经网络,可以参考下图:
在这里插入图片描述
对应输出层的神经元被激活的话,我们便判断图片中显示的是相应的数字。

参考书目:《神经网络与深度学习 Neural Networks and Deep Learning》(美)Michael Nielsen 著, Xiaohu Zhu Freeman Zhang 译

猜你喜欢

转载自blog.csdn.net/Lyn_B/article/details/88765174