【Python】搭建你的第一个简单的神经网络_理论篇_NN&DL学习笔记(一)

前言

本文为《Neural Network and Deep Learning》学习笔记(一),可以转载但请标明原文地址

本人刚刚入门、笔记简陋不足、多有谬误,而原书精妙易懂、不长篇幅常有柳暗花明之处,故推荐阅读原书。

《Neural Network and Deep Learning》下载地址(中文版):Neural Network and Deep Learning(中文版)

注:这本书网上有很多免费版,随便搜一下就有了,不用非得花积分下载我上传的资料。


第一部分:理论篇(介绍神经网络)

若不想看干巴巴的理论,想要直接食用源码,可以跳到实践篇(抱歉现在还没有写出来orz)。

但理论篇不长,也不难懂,都是最基本的知识,看一下也是好的。

一、人工神经元

顾名思义,神经网络的基本节点。

1.1 感知器:一种简单的人工神经元

1、感知器的定义

一个感知器接受几个二进制输入(x1、x2、x3…),产生一个二进制输出(output)

(注:二进制的意思就是,x1、x2、x3、output这些变量的取值只有0和1)

2、output的计算公式

显然,输出(output)需要由输入(x1、x2、x3…)计算得来,如何计算呢?

① 引入权重(w1、w2、w3…)分别表示输入(x1、x2、x3…)的重要性

② 引入阈值(threshold),表示output更容易输出0还是1(这似乎有点难理解,会在下文解释)

下面给出output的计算公式,就很好理解了:

这个公式的意思是:我们用来表示w1*x1+w2*x2+w3*x3……,把这个叫做加权和,当这个加权和<=阈值threshold时,output输出0;反之输出1。

由此可见,阈值threshold越大,output越容易输出1,越小越容易输出0.

这就是简单的感知器的全部工作。

我们把上面那个公式变换一下,使它看起来更漂亮:

① 用w*x代替,不要忘了,w为权重向量(刚刚引入的)、x为输入向量

② 将不等式右边的threshold移到左边,变成-threshold,再令b=-threshold,给b起个名字叫做偏置

那么上面那个公式就变成了这样(看起来更熟悉叭):

由上式可以看出,偏置b的意义也在于【b越大,output越容易输出1】,此后我们将不再使用阈值threshold,而总是使用偏置b。

1.2 S型神经元:一种也很简单但更常用的神经元

1、为什么要引入S型神经元?

首先想一个问题:为什么感知器不常用呢?

答案是:output只有两个值0和1,很小的权重w和偏置b的变化,可能会引起完全翻转,网络的输出变化太大,我们很难微调。

我们希望有一种神经元,当我们微调权重w和偏置b的时候,output也相应有微小变化,这样才可能一点点接近目标,达到我们的目的(比如正确识别手写数字)。通过改变w和b,进而改变output,这个过程就叫做学习

于是我们引入了S型神经元。

2、定义

S型神经元有多个输入(x1、x2、x3…),一个输出output,与感知器不同的是:输入x1、x2、x3可以取0和1之间的任何值

(感知器的输入是二进制输入,只有0和1)

3、output的计算公式

同样的,为了得到output的计算公式,我们也引入权重w和偏置b,作用跟感知器里面w和b的作用相同(还记得w和b的作用吗?)

但是,我们使用了一个新的函数来计算output,这个函数叫做S型函数,记作\sigma

假设这个函数\sigma的输入是z,那么输出\sigma \left ( z \right )由下面这个公式计算得出:

而在我们的S型神经元里,函数\sigma的输入是\sum {_{j}} w{_{j}} x{_{j}} + b,简写就是wx+b,将这个输入代入上面的公式,得到输出output的计算公式如下:

output=\sigma \left ( wx+b \right )=\frac{1}{1+e^{-wx-b}}=\frac{1}{1+exp\left ( -wx-b\right )}

(注:exp()的意思就是e^,这样的形式看着更整齐一点)

4、S型神经元能够满足我们的要求吗?

这样的S型神经元能够满足我们的要求吗?当w和b改变很小的时候,output也会改变很小吗?只要看看S型函数\sigma \left ( z \right )的函数图像我们就明白了:

 我们再看看感知器的函数图像(其实就是一个阶跃函数):

可以看出不同了吧?上面的是平滑的,下面的会有跳动。因此S型神经元能够满足我们的要求:微小变化。

但是又出现了一个新问题,如何解释output的输出值呢?

在感知器中,output只有两个值0和1,假如我们要识别手写数字9,那输出1代表“输入图像是一个9”、输出0代表“输入图像不是一个9”;

在S型神经元中,output能够输出0和1之间的所有值,这时我们可以人为约定,输出0.5以上的值代表“输入图像是一个9”、输出0.5以下的值代表“输入图像不是一个9”.

二、神经网络的架构

介绍完单个的神经元,自然要把他们连起来,连起来就变成神经网络啦。

1、神经网络的基本架构

假设我们把很多S型神经元连起来,得到了一个下面这样的网络,这种网络常被人叫做多层感知器或者MLP

(注:虽然由S型神经元构成,不是由感知器构成,但网络名字却叫多层感知器,作者表示他也很困惑,并拒绝使用这个名字)

由上图可见:最左边的一个竖层叫输入层(input layer),里面有3个输入神经元;

最右边的一个竖层叫输出层(output layer),里面有1个输出神经元(也可以是多个输出神经元);

除了输入层和输出层,中间的所有层都叫做隐藏层(hidden layer),上图中只有一个隐藏层(有的网络有多个)。

2、如何设计属于自己的神经网络

2.1 设计输入层和输出层

可以看出,设计输入层和输出层是比较简单的,我们举一个例子:

假设我们需要输入一张手写数字图片,输出“这张图片是否是9”,那么我们可以这么设计输入层和输出层:

① 对于输入层:我们可以将图片像素的强度进行编码,作为输入神经元。

如果图像是一个64×64的灰度图像(请自行百度灰度图像和彩色图像的区别),那么我们会需要4096=64×64个输入神经元,每个神经元根据灰度取0到1之间合适的值。

② 对于输出层:我们只需要一个输出神经元(还记得我们使用的S型函数的图像吗?那副图像表明输出值只能是0和1之间的值。)

我们应该人为约定输出值的意义,比如这么约定:当输出值小于0.5,表示“输入图像不是9”;反之表示“输入图像是9”.

2.2 设计隐藏层

作者:设计隐藏层是一种艺术,是没有经验可言的。

但是,神经网络的研究人员为隐藏层开发了许多设计最优法则,可以帮助我们权衡隐藏层数量、和训练网络所需的时间开销。

但在这里,按下不表,我们可以通过实践来学习隐藏层的设计。

3、神经网络的分类

上文中,我们讨论的神经网络,都是以上一层的输出作为下一层的输入,比如输入层→隐藏层→输出层,这样的网络叫做前馈神经网络。如下图(a)所示。

在前馈神经网络中,信息总是向前传播(显然右边是“前”),从不反向回馈。

然而,在一种如下图(b)所示的递归神经网络中,存在着“反向回馈”,也就是网络中形成了一个环路,\sigma函数的输出值又接入到网络的输入中,并在经过几层神经元之后又影响输出值。递归网络的学习算法不太强大,但原理上比前馈网络更接近大脑的实际工作,并且在一些领域表现得比前馈网络更好。

而前馈网络的影响力更大,本书只使用更广泛的前馈网络。


【2018/11/18后记】

1、本来该复习下一门考试的,然而又手贱打开了博客开始码字……然后一个上午就过去了orz,因为这本书实在太棒了,太适合我这种初学者了,所以忍不住想要把自己学到的东西发上来啊orz

2、争取很快找时间把实践篇写出来,run成功的那一刻心情超棒的qwq。

3、希望通过这个NNandDL学习笔记系列让访问量快点破万!

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/84195930