您的位置:首页 > 其它

Neural Networks and Deep Learning系列(一)概述

2017-08-31 20:35 218 查看

本文主要讨论:

*两个重要的人工神经元——感知器和S型神经元。

*标准的神经网络学习算法——随机梯度下降算法。

1,感知器

  感知器在20世纪五、六十年代由科学家Frank Rosenblatt发明。现代的神经网络中,主要使用的是一种叫做S型神经元的神经元模型。但是要理解为什么S型神经元为什么被定义成那样的方式,就必须先从感知器入手进行研究。

  感知器是如何工作的呢?一个感知器接受几个二进制输入,x1,x2,...,并产生二进制输出:



  实例中的感知器有三个输入,x1,x2,...,。通常可以有更多或者更少输入。引入权重w1,w2,...,来计算输出,权重表示相应输入对于输出重要性的实数。神经元的输出,0或者1,则由分配权重后的总和∑jwjxj小于或者大于一些阈值决定。和权重一样,阈值是一个实数,一个神经元的参数。精确的数学表示如下:output=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪0if ∑jwjxj≤threshold1if ∑jwjxj≥threshold

这就是一个感知器所要做的所有事情。

  这是个数学模型,可以将感知器看作依据权重来作出决定的设备。举个例子:这个周末你所在城市有音乐会,你喜欢音乐,正试着决定是否去参加。你或许会通过三个因素设置权重来作出决定:

1.天气好吗?

2.你的男(女)朋友会不会陪你去?

3.举办地点是否靠近交通站点?(你没有车)

  可以把这三个因素对应地用二进制变量x1,x2,x3来表示。例如,如果天气好,就令x1=1,如果不好,x1=0。现在假设你厌恶糟糕的天气,如果天气太糟,你很有大的可能行不出门。你是个音乐爱好者,以至于即使你的男(女)朋友不感兴趣,也不管附近是否有交通站点,你都乐意去。你可以用感知器来给这种决策建立数学模型一种方式是给天气权重选择为w1=6,其他条件为w2=2,w3=3。w1被赋予更大的权重,表示天气对你十分重要。最后,假设你将感知器的阈值设为5。这样感知器实现了期望的决策模型,只要天气好久输出1,天气不好就输出0.对于你的男女朋友是否想去,或者附近是否有公共交通站,其输出没有差别。

  随着权重和阈值的变化,你可以得到不同的决策模型。例如,假设我们把阈值改为3。那么感知器会根据天气好坏,或者结合交通情况和你的男女朋友的意愿,来得到结果。换句话说,它变成了另一个不同的决策模型。降低阈值表示你更想去。

  这个例子说明了一个感知器如何能权衡不同的依据来决策。这看上去也可以大致解释一个感知器网络能够做出微妙的决定:



  在这个网络中,第一列感知器——我们称其为第一层感知器——通过权衡输入做出三个非常简单的决定。同样,每一个第二层的感知器都在权衡第一层 决策结果并做出决定。以这种方式,一个第二层中的感知器可以比第一层中的感知器做出更复杂和抽象的决策。第三层的感知器能做出更复杂的决策。以这种方式,一个多层的感知器网络可以从事复杂巧妙的决策。

  这里说一下,感知器只有一个输出。在上面的网络中感知器看上去像是有多个输出,实际上,他们仍是单输出。多个输出箭头仅仅便于说明一个感知器的输出被用作多个感知器的输入。

  为了简化感知器的数学描述,我们将∑jwjxj改写成点乘w⋅x,这里w和x对应权重和输入的向量。第二个改动是把阈值移到不等式的另一边,并用感知器的偏置b=−threshold代替。用偏置而不是用阈值,那么感知器的规则可以重写为:output={0if w⋅x+b≤01if w⋅x+b>0

  我们可以把偏置看作让感知器输出1的容易度的估算,如果偏置是一个非常大的数,那么感知器输出1是很容易的事情。但是如果感知器是一个很小的负数,那么感知器输出1是一个很困难的事情。

  这些权重和偏置参数可以不用手动调整,通过设计好的学习算法可以自动调整人工神经元的权重和偏置。

2,S型神经元

  学习算法听上去非常不错,但我们如何给一个神经网络设计这样的算法呢?以手写识别数字为例,网络的输入是一幅手写数字的扫描图像。我们想要网络能学习权重和偏置,这样网络的输出能正确分类这些数字。如下图所示:



  如果对权重(或者偏置)的微小改动能够仅仅引起输出的微小变化,那么我们的网络就可以通过学习来自动的修改权重和偏置,使其往我们想要的方向变化。例如,假设网络错误的把数字“9”的图像分类为“8”。我们能够计算怎样对权重和偏置做微小的改动,这样网络能够把“9”正确分类。然后我们重复这个工作,反复修改权重和偏置来产生更好的输出。这时网络就在学习。

  而当我们的网络包含感知器时这些不会发生。这是因为,网络中单个感知器上一个权重或者偏置的微小改动有可能使那个感知器的输出完全翻转,如从0变成1。这样的翻转可能接下来引起其余网络以及其复杂的方式改变(就好像蝴蝶效应)。因此,虽然你的“9”被正确分类,网络在其他图像上的行为很可能以一些很难控制的方式完全改变。这使得逐步修改权重和偏置来使神经网络接近期望行为变得困难。

  我们可以引入一种称为S型神经元的新的人工神经元来克服这个问题。S型神经元和感知器类似,但是权重和偏置的微小改动只引起输出的微小变化。这对于神经网络的学习是很关键的。

我们用和感知器同样的描述方式来描绘S型神经元:


  S型神经元也有多个输出,x1,x2,...。但是这些输入可以取0和1中的任意值,而不仅仅是0和1。例如,0.634…是一个S型神经元的有效输入。同样,S型神经元对每个输入有权重,w1,w2,...,和一个总的偏置b。但是输入不是0或1,。现在的输出是σ(w⋅x+b),这里σ被称为S型函数,定义为:σ(z)=11+e−z

  一个具有输入x1,x2,...,权重w1,w2,...,和偏置b的S型神经元的输出是:11+exp(−∑jwjxj−b)

σ的代数形式又是什么样子的呢?实际上,σ的精确形式不重要,重要的是这个函数的形状:


  初看上去,S型神经元和感知器有很大的区别,实际上,如果你熟悉了S型神经元的代数形式,你会发现二者有很多相似的地方。假设z=w⋅x+b是一个很大的正数。那么e−z≈0而σ(z)≈1,即,当z=w⋅x+b很大并且为正,S型神经元的输出为1,正好和感知器一样。相反地,假设z=w⋅x+b是一个很大的负数,那么e−z→∞,σ(z)≈0。所以当z=w⋅x+b是一个很大的负数,S型神经元的行为也非常近似一个感知器。只有在z=w⋅x+b取中间值时,两者才有较大的偏差。

σ的形状是阶跃函数平滑后的版本:


  如果sigma是阶跃函数,此时,输出会依赖于输入w⋅x+b是正数还是负数,那么S型神经元会成为一个感知器。利用实际的σ函数,如上面所说的,我们得到一个平滑的感知器。σ的平滑意味着权重和偏置的微小变化,即Δwj和Δb,会使神经元产生一个微小的输出变化Δoutput。利用微积分的知识,Δoutput可以很好的近似表示为:△output≈∑j∂output∂wjΔwj+∂output∂bΔb

其中求和是在所有的权重上进行的。Δoutput是一个反映权重和偏置变化——即Δwj和Δb——的线性函数。这一线性使得选择权重和偏置的微小变化来达到输出的微小变化的运算变得容易。

  虽然说对sigma重要的是形状而不是精确的形式,但是选择sigma作为激活函数是很常用的行为。这是因为,当我们使用不同的激活函数时,最大的变化是上式中的偏导数,而指数函数在求导时有些很好的属性。所以,sigma在神经网络中被普遍使用。

  很明显,一个S型神经元的输出不仅仅是0或1,它可以输出0和1之间的任何实数,所以诸如0.765…和0.235…等都是合理的输出。假设,我们希望网络的输出来表示“输入图像是一个9”,“或者输入图像不是一个9”。感知器是通过输出0或1来表示是或否。对于S型神经元,我们可以设定一个约定来解决这个问题,例如,约定不小于0.5的输出表示”这是一个9”,而其他小于0.5的输出表示”这不是一个9”。这些约定在使用前要很清楚的提出来。

3,神经网络的架构

假设我们有这样的网络:


  这个网络中最左边的称为输入层,其中的神经元称为输入神经元。最右边的,即输出层包含有输出神经元,在上例中,输出层只有一个神经元。中间层,既不是输入也不是输出,则被称为隐藏层。”隐藏”这一术语仅仅意味着”即非输入也非输出”,并没有深层的哲学或数学含义。有些网络可以有多个隐藏层。例如,下面的网络含有两个隐藏层:


  值得注意的是,由于历史原因,这种多层网络有时被称为多层感知器或者MLP。但我们要知道,网络中的神经元应该是S型神经元。

设计网络的输入输出层通常是比较直接和容易的。而隐藏层的设计则复杂的多,通过一些简单的经验法则来总结隐藏层的设计流程是行不通的。神经网络的研究人员已经为隐藏层开发了许多设计最优法则,这些法则可以帮助权衡隐藏层数量和训练网络所需的时间开销。

  目前为止,我们讨论的神经网络,都是以上一层的输出作为下一层的输入。这种网络称为前馈神经网络。这意味着网络中是没有回路的——信息总是向前传播,从不反向回馈。

  存在反馈环路的神经网络被称为递归神经网络。

4,利用梯度下降法进行学习

梯度下降算法

  我们将输入序列写成向量形式,并用符号x表示。y=y(x)表示对应的期望输出。我们下面去找一个算法,使得网络的输出y(x)能够拟合所有的训练输入x。为了量化我们如何实现这个目标,定义一个代价函数:C(w,b)=12n∑x∥y(x)−a∥2(1)

  这里w表示网络中所有权重的集合,b表示所有的偏置。n是训练集中输入数据的个数,a是表示当输入向量为x时的输出向量,求和则是在总的输入上进行的。输出a取决于x,w和b。符号∥v∥是指向量v的模。我们把C称为二次代价函数;有时也成为均方误差或者MSE。二次代价函数是非负的,因为求和公式中每一项都是非负的。如果代价函数C(w,b)≈0,精确的说,是当对于所有的输入x,y(x)都接近于输出a时。因此,如果我们的算法能够找到合适的权重和偏置,使得C(w,b)≈0,它就能很好的工作。相反,如果C(w,b)太大就不怎么好了,那意味着对大量的输入x,y(x)与输出a相差太大。因此我们训练算法的目的,是最小化权重和偏置的代价函数C(w,b)。一般采用梯度下降的算法来达到这个目的。

  为什么要用二次代价呢?以手写数字识别为例,我们最初感兴趣的内容不是能正确分类的图像数量吗?为什么不试着最大化这个数量,而是最小化一个二次代价的间接评量呢?这样做是因为在神经网络中,被正确分类是图像数量所关于权重和偏置的函数并不是一个平滑的函数。大多数情况下,对权重和偏置的微小变化完全不会影响被正确分类的图像的数量。这回导致我们很难去解决如何改变权重和偏置来取得改进的性能。

  我们现在使用的二次代价函数C(w,b)是一个平滑函数,我们的目的是使用梯度下降的技术来解决这个最小化问题。先用C(v)来代替C(w,b),我们用v代替了w和b以强调它可能是任意的函数——我们现在先不局限于神经网络的环境。为了最小化C(v),想象C是一个只有两个变量v1和v2的函数:


  一种解决这个问题的方式是用微积分来解析最小值。我们可以计算导数去寻找C的极值点。但是这种方法只适用变量比较少的函数,如果变量比较多的话那就是噩梦。而且神经网络中常常用到大量的变量,因此用微积分来计算最小值已经不可行了。

  实际可行的办法是我们可以用凸优化中的相关知识来最小化我们的二次代价函数。首先把我们的函数想象成一个山谷,想象有一个小球从山谷的斜坡滚落下来。我们日常的经验告诉我们,小球最终肯定会滚到谷底。也许我们可以用这一想法来找到函数的最小值?我们会为一个假想球随机设置一个位置,然后模拟球体滚落到谷底的运动。

  为了能更精确的描述这个问题,我们不妨在v1和v2方向分别将球体移动一个很小的量,即Δv1和Δv2时,球体将会发生什么情况。微积分告诉我们球体将会有如下变化:ΔC≈∂C∂v1Δv1+∂C∂v2Δv2(2)

  我们要寻找一种选择v1和v2的方法使得ΔC为负;也就是让球体滚落的方向。我们定义Δv为v变化的向量,Δv=(Δv1,Δv2)T

定义C的梯度为偏导数的向量,即:▽C=(∂C∂v1,∂C∂v2)T

有了这些定义,ΔC的表达式(2)可以被重写为:ΔC≈▽CT⋅Δv(3)

从这个方程我们看到了如何选取Δv才能让ΔC为负数。假设我们选取:Δv=−η⋅▽C(4)

  这里的η是个很小的正数(称为学习速率)。此时ΔC≈▽CT⋅Δv=−η∥▽C∥2。由于∥▽C∥2≥0,这保证了ΔC≤0,即,如果我们按照方程(4)的方向去改变v,那么C会一直减小,不会增加。球体移动到下一点的位置为:v→v′=v−η▽C

如此反复,我们将持续减小C,直到获取一个全局最小值。

  总结一下,梯度下降算法工作的方式就是重复计算梯度▽C,然后沿着相反的方向移动,沿着山谷”滚落”。像下图所示:


  为了使梯度下降能够正确地运行,我们需要选择足够小的学习速率η使得方程(3)能得到很好的近似。如果η太大,那么就有可能出现ΔC>0,将会使球体上升,这显然不好。同时,我们也不希望η太小,因为这会使得Δv的变化极小,梯度下降算法就会运行的非常缓慢。在实际的工作中,η通常是变化的,来使方程(3)得到很好的近似,同时算法又不会太慢。

  事实上,即使C是一个具有更多变量的函数,梯度下降法也能很好的工作。

  我们怎样在神经网络中用梯度下降法去学习呢?其思想就是利用梯度下降算法去寻找能使得二次代价函数取得极小值的权重wk和偏置bl。现在我们用权重和偏置代替变量vj。也就是说,现在“位置”变量有两个分量组成:wk和bl,而梯度向量▽C则有相应的分量∂C∂wk和∂C∂bl。用这些分量重写梯度下降的更新规则:wk→w′k=wk−η∂C∂wkbl→b′l=bl−η∂C∂bl

  通过重复这一规则,就有可能使得二次代价函数取到极小值,换句话说,这是一个能使神经网络学习的规则。

随机梯度下降

  应用梯度下降法则有很多挑战,其中之一就是如何降低计算梯度的成本。先回顾一下二次代价函数的形式,C=1n∑xCx,它是遍历每个训练样本代价Cx=∥y(x)−a∥22的平均值。在实践中,为了计算梯度▽C,我们需要为每个训练输入x单独地计算梯度值▽Cx,然后求平均值,▽C=1n∑x▽Cx。然而,当训练输入的数量过大时会花费很长时间,这会使学习变得非常缓慢。

  可采用随机梯度下降的算法来加速学习过程。其思想就是通过随机选取小量训练输入样本来计算▽Cx,进而估算梯度▽C。通过计算少量样本的平均值我们可以快速得到一个对于实际梯度▽C很好的估算,这有助于加速梯度下降,进而加速学习过程。

  更准确的说,随机梯度下降通过随机选取小量的m个训练输入来工作。我们将这些随机的训练输入标记为X1,X2,...,Xm,并称它们为小批量数据(mini-batch)。当m足够大时,∑mj=1▽CXjm≈∑x▽Cxn=▽C

  证实了我们可以通过仅仅计算随机选取的小批量数据的梯度来估算整体的梯度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: