前言
本文为《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型函数,记作
假设这个函数的输入是z,那么输出由下面这个公式计算得出:
而在我们的S型神经元里,函数的输入是,简写就是,将这个输入代入上面的公式,得到输出output的计算公式如下:
(注:exp()的意思就是e^,这样的形式看着更整齐一点)
4、S型神经元能够满足我们的要求吗?
这样的S型神经元能够满足我们的要求吗?当w和b改变很小的时候,output也会改变很小吗?只要看看S型函数的函数图像我们就明白了:
我们再看看感知器的函数图像(其实就是一个阶跃函数):
可以看出不同了吧?上面的是平滑的,下面的会有跳动。因此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)所示的递归神经网络中,存在着“反向回馈”,也就是网络中形成了一个环路,函数的输出值又接入到网络的输入中,并在经过几层神经元之后又影响输出值。递归网络的学习算法不太强大,但原理上比前馈网络更接近大脑的实际工作,并且在一些领域表现得比前馈网络更好。
而前馈网络的影响力更大,本书只使用更广泛的前馈网络。
【2018/11/18后记】
1、本来该复习下一门考试的,然而又手贱打开了博客开始码字……然后一个上午就过去了orz,因为这本书实在太棒了,太适合我这种初学者了,所以忍不住想要把自己学到的东西发上来啊orz
2、争取很快找时间把实践篇写出来,run成功的那一刻心情超棒的qwq。
3、希望通过这个NNandDL学习笔记系列让访问量快点破万!