《神经网络与深度学习》学习笔记(一)

原文地址

第一章 使用神经网络识别手写数字

作者: Michael Nielsen

简介

对于人类来说,识别手写数字是一件非常容易的事,但是当你尝试使用计算机来编程时,你会很容易迷失,不知从何处下手。
神经网络用一种特殊的方法来解决这个问题,即使用大量的手写字符来作为训练样本。
这里写图片描述
这些训练样本中隐含了识别手写字符所需要的信息,通过增加训练样本的数量,可以不断提高识别的准确度。
本章关注手写字符的识别是因为它是一个极好的从大方向上来把握神经网络的问题,今后会将解决这个问题的思想应用于其他领域,如自然语言处理。

感知器

尽管当今sigmoid神经元被使用得更多,但是我们仍需要先理解感知器,因为这有利于我们理解为什么要如此定义sigmoid神经元。
感知器的工作方式:得到一系列的输入,给出一个输出。

Rosenblatt给出了一个简单的法则来计算输出。他给每个输入定义了权重,通过判断这些变量的加权和是否超过阈值来决定输出0或1。

(1) output = { 0 if  j w j x j  threshold 1 if  j w j x j >  threshold

也可以理解为,感知器通过权衡各个因素对结果造成的影响来做出决定。
这样看起来,复杂的感知器网络可以做出精细的决定。
这里写图片描述
(从图上看似乎每个感知器有多个输出,但是其实只有一个)
在上图的网络中,第一层感知器只做最简单的事:给输出加上权重。而第二层感知器要做的是权衡第一层感知器的输出,并给出自己的输出。因此,第二层感知器可以从更抽象的角度,做出更复杂的决定。继而我们可以知道,一个由多层感知器构成的网络可以进行更加复杂的决策。
(1)中的公式也可以改写成如下形式:
(2) output = { 0 if  w x + b 0 1 if  w x + b > 0

其中 w 以及 x 均为向量表示, b 为阈值的相反数。
从表达式可以看出,对于一个拥有较大bias的感知器,它更容易输出1. 显然,bias只是阈值的另一种表达形式,但是它会对今后的符号简化带来帮助。
同时,感知器还可以用于逻辑门的表示,与非门可以表示成如下的形式:
这里写图片描述
对于每个输入的权重都设置为-2,bias设置为3,对于输入00,01,10,11四种情况,可以验证这是与非门的表现。
事实上,感知器网络可以计算任意逻辑函数,因为单纯用与非门可以实现任意逻辑表达式。

(上图的感知器网络形式)
图中存在重边,所以可以合并它们。一般来说,网络的输出可以单独视为一层,即输入层。改写成如下形式:
这里写图片描述
我们可以设计出学习算法,使之自动调节人工神经网络的weight和bias,它可以对外界的输入做出反应,这样我们的神经网络就可以自己学习解决问题。

Sigmoid 神经元

假设现在在多层感知机网络中,weigh或者bias出现了细微的变化,我们想要的是输出也产生相应的变化,这也正是学习的过程。
这里写图片描述
我们可以利用这一点来调整weight和bias来使得我们的网络表现得更符合我们的期待。重复这个过程,我们的网络会产生越来越好的输出,学习就实现了。
然而问题是,由感知器组成的网络并不能实现这一点,因为weight或bias产生的细小变化可能会导致输出的结果产生巨大的变化,而且这个变化是不可控的。
为了解决这个问题,我们提出了一种新的人工神经元,称之为Sigmoid神经元。它的特点是对它的weight以及bias进行细微的调整只会对最终结果产生很小的影响,这样我们的神经网络就可以学习了。
Sigmoid神经元描述如下:
这里写图片描述
与感知器不同的是,它的输入,weight,bias可以是0到1之间的任何数,输出也不仅仅是0或1,而是 σ ( w x + b ) ,其中

(3) σ ( z ) 1 1 + e z .

更具体的一种表示为:
(4) 1 1 + exp ( j w j x j b ) .

直观地来说,两种神经元的区别除了取值范围的不同之外,就是这个判定函数的不同,前者为:
这里写图片描述
后者为:
这里写图片描述
可以看出,后者的函数是光滑的,正是有了这个特性,使得微小的 Δ w j Δ b 可以产生微小的 Δ o u t p u t 而不至于产生突变。
微积分告诉我们:
(5) Δ output j output w j Δ w j + output b Δ b ,

这个式子表明了, Δ o u t p u t Δ w j 以及 Δ b 是线性相关的。有了线性的性质,我们可以更容易组合weight和bias的变化来达到我们期望的output上的变化。

神经网络的结构

首先介绍一些术语:
这里写图片描述
中间的隐藏层表明它既不是输入层也不是输出层。
神经网络中的输入层和输出层通常被设计得很直白。例如,我们像判断一张手写字符图片是否为9,假设这张图片是64*64的灰阶图,这样我们就有4096个输入神经元,并将灰阶值映射到0-1之间的数。输出由一个神经元构成,输出值小于0.5就判断它不是9,否则判断它是9.
由于输入层和输出层设计得相当直白,所以对于隐藏层的设计就显得是门艺术了,研究者需要在隐藏层的层数和训练所花费的时间之间做权衡。
我们在之前定义的网络被称为前馈神经网络,它代表网络中没有循环,信息总是向前传递,从不后退。
但是,也有其他形式的神经网络,如递归神经网络,它的主要思想是,一些神经元被激发并持续一段时间,同时它也会造成其他神经元被激发,经过一段时间后,我们便得到了一系列被激发的神经元,这种循环不会造成问题的原因是神经元会在稍后的时间去影响输入,并不是立刻影响。本书将重点放在前馈神经网络。

猜你喜欢

转载自blog.csdn.net/xj949967574/article/details/79271477