深度学习基础-神经网络

引言

大家好,笔者在互联网大厂搞过java,也玩过大数据,目前从事搜索和推荐系统的研发,做的越深发现搜广推系统的核心是模型预估,它对于搜索、推荐、广告业务效果的提升有着不可替代的作用,所以为了成为一个称职核心的搜索推荐工程师,笔者意识到得更新自己的操作系统了,我们也需要踏入人工智能的领域,这个说的有点太大了,其实我的目标就是先把深度学习搞定,它属于机器学习的一个重要分支,而机器学习又是人工智能的重要分支,哈哈,咱们目标就是要定的高远,而行动则需要足够具体,说不定以后有机会成为人工智能领域的专家,要知道21世纪是人工智能的世纪,这条通道如果能顺利走下去,未来必定一片光明!

好了,好了,刚说了一堆废话(嘻嘻,画大饼),我们要进入正题了,我第一篇文章不会先给大家补什么机器学习的数学基础知识啥的,比如线性代数、概率统计、微积分啥的,这些不是没用,是我觉得一开始学习,先要有个比较宏观的概念,所以我的方式会是从一个我自己觉得比较好的角度切入,比如神经网络,首先它是深度学习的基础,要知道像深度神经网络DNN(Deep Neural Network)都是建立在神经网络之上,另外就是我第一个想要和大家一起来学习它,是有个私人的原因(当然大家可能也有这个体会),就是会对神经网络这个概念非常好奇,为什么一个生物学上的东西可以用来进行机器学习的实现,到底它是怎样做的呢?本文主要就是用一种非常直白的方式和大家讲清楚这些东东。

神经元

神经网络是由一堆神经元组成,所以我们想来了解一下什么是神经元,它是如何运作的?

神经元是由细胞体、树突、轴突三个主要部分构成的。其他神经元的信号(输入信号)通过树突传递到细胞体(也就是神经元本体)中,细胞体把从其他多个神经元传递进来的输入信号进行合并加工,然后再通过轴突前端的突触传递给别的神经元。如下图所示

image.png

图1

假设一个神经元从其他多个神经元接收了输入信号,这时如果所接收的信号之和比较小,没有超过这个神经元固有的边界值(称为阈值),这个神经元的细胞体就会忽略接收到的信号,不做任何反应。反之则会向相邻的神经元传递信号(称之为点火),如下图所示

image.png

图2

神经元点火与否是根据来自其他神经元的输入信号的和来判定的,但这个求和的方式应该不是简单的求和。例如在网球比赛中,对于来自视觉神经的信号和来自听觉神经的信号,大脑是通过改变权重来处理的。

image.png

图3

因此,神经元的输入信号应该是考虑了权重的信号之和。用数学语言来表示的话,例如,来自相邻神经元1、2、3的输入信号分别为x1、x2、x3,则神经元的输入信号之和可以表示为公式(1)

y = w 1 x 1 + w 2 x 2 + w 3 x 3 y=w_1x_1+w_2x_2+w_3x_3

扫描二维码关注公众号,回复: 13768335 查看本文章

式中的w1、w2、w3是输入信号x1、x2、x3对应的权重(weight)。 神经元在信号之和超过阈值时点火,不超过阈值时不点火。于是,利用公式(1),点火条件可以如下表示:(θ是该神经元固有的阈值)

图4

图4

因为后续我们会涉及到多个神经元,所以我们简化上面神经元的图如下

image.png

图5

生物上来说,我们输出的信号只能是0和1,我们除去“生物”限制的话,输出则不受限制,所以上面图4则可以定义为公式2

y = u ( w 1 x 1 + w 2 x 2 + w 3 x 3 θ ) y = u(w_1x_1+w_2x_2+w_3x_3-\theta)

u通常我们称之为激活函数,y大家可以理解为神经元输出的兴奋度,这个兴奋度是由神经元输入的加权和和神经元阈值的差(我们简称D)输入到激活函数计算而来。在生物神经元中只能输出0和1,所以这个激活函数可以理解为单位阶跃函数(D>=0时,输出y=1,D<0时,输出y=0),而在我们神经网络里常用的激活函数是sigmoid函数,它们如下所示,z表示神经元输入的加权和和神经元阈值的差

image.png

图6

有同学肯定会问为什么神经网络里常用的是Sigmoid函数?(我自己学习的时候也莫名其妙) Sigmoid函数σ(z),其定义如下所示

image.png 大家不要被这个函数吓到,但是别担心其图像看起来确实非常漂亮,为什么说它非常漂亮呢?看图6右下的激活函数图像因为它取值是0到1之间,并且处处可导,这个好处是后续我们会在【深度学习基础】专题神经网络训练基础算法部分对梯度下降算法里跟大家详细分享。它可以认为输出值表示神经单元的兴奋度等。输出值接近1表示兴奋度高,接近0则表示兴奋度低。这里涉及到稍微多一点数学知识,如果大家还是不明白也不用担心,继续往下看吧。

神经网路

我们来总结上一节的神经元的功能: 将神经元的多个输入x1,x2,…,xn整理为加权输入z

z = w 1 x 1 + w 2 x 2 + w 3 x 3 + + w n x n + b z=w_1x_1+w_2x_2+w_3x_3+…+w_nx_n + b

Wn为权重,b为偏置,n为输入参数的个数,神经元通过激活函数u(z),根据加权输入z输出y:

y = u ( z ) y=u(z)

神经网络就是将这些神经元连接起来形成网络状,我们拿典型代表—阶层型神经网络来说明。 阶层型神经网络按照层(layer)划分神经单元,通过这些神经单元处理信号,并从输出层得到结果,如下图所示

image.png 输入层负责读取给予神经网络的信息,输出层顾名思义就是负责输出,输出的节点一般会是一个激活函数,输出层与隐藏层一样执行信息,它们是神经网络实际处理信息的部分。

恶魔组织

相比大家对于输入层和输出层都可以理解,但是对于上面提到的隐藏层感觉是不是有些神神秘秘,据说它肩负着提取特征的重要作用,是怎么做到的呢?接下来我会用一个隐喻的手法跟大家解释隐藏层是什么?相信大家看完后一定能够轻松掌握。那么我们开始吧。

神经网络是将神经单元部署成网络状而形成的。然而,将神经单元胡乱地连接起来并不能得到有用的神经网络,因此需要设计者的预估,这种预估对于隐藏层是特别重要的。因为支撑整个神经网络工作的就是这个隐藏层。我们一起看一个问题吧?

例题1:建立一个神经网络,用来识别通过4×3像素的图像读取的手写数字0和1。学习数据是64张图像,其中像素是单色二值。

前面已经提到过,模式识别的难点在于答案不标准,这个例题也体现了这样的特性。即使是区区一个4×3像素的二值图像,所读入的手写数字0和1的像素模式也是多种多样的。例如,下列图像可以认为是读入了手写数字0。

image.png 对于这样的数字0,即使人能设法识别出来,让计算机来判断也十分困难。

对于这种没有标准答案、识别困难的问题,怎么解决才好呢?思路就是“由网络进行判断”。乍一听会觉得这个方法不可思议,不过其中的逻辑却一点都不难,我们可以用恶魔组织的信息网络来做比喻。虽然这个比喻并不算准确,但是可以突出其本质。

假设有一个如下图所示的恶魔组织,隐藏层住着3个隐藏恶魔A、B、C,输出层住着2个输出恶魔0和1。输入层有12个手下①~⑫为隐藏恶魔A、B、C服务

image.png 最下层(输入层)的12个手下分别住在4×3像素图像的各个像素上,其工作是如果像素信号为OFF(值为0)就处于休眠状态;如果像素信号为ON(值为1)则变得兴奋,并将兴奋度信息传递给他们的主人隐藏恶魔A、B、C。

不过,隐藏恶魔A、B、C有不同的喜好。他们分别喜欢下图所示的模式A、模式B、模式C的图案。这个性质影响了神经网络的特性。(看清他们的不同“偏好”,就是我们最初所提及的设计者的预估。)

image.png

住在最上层的2个输出恶魔也是从住在下层的3个隐藏恶魔那里得到兴奋度信息。与隐藏恶魔一样,他们将得到的兴奋度信息进行整合,根据其值的大小,自己也变兴奋。然后,这些输出恶魔的兴奋度就成为整个恶魔组织的意向。如果输出恶魔0的兴奋度比输出恶魔1的兴奋度大,神经网络就判定图像的数字为0,反之则判定为1

可见,恶魔的世界里也存在着人际关系。隐藏恶魔A、B、C对模式有着各自的偏好,与12个手下有不同的交情。隐藏恶魔A的偏好是之前的模式A,因此与④、⑦性情相投。因为模式A的4号像素与7号像素是ON,所以理所当然地与对应的看守人④、⑦性情相投,如下图所示:

image.png 同样地,手下⑤、⑧与隐藏恶魔B,手下⑥、⑨与隐藏恶魔C性情相投,因此他们之间传递兴奋度的管道也变粗了,如下图所示

image.png 住在隐藏层的隐藏恶魔A、B、C与住在上层的2个输出恶魔也有着人际关系。由于某种羁绊,输出恶魔0与隐藏恶魔A、C性情相投,而输出恶魔1与隐藏恶魔B性情相投

image.png 我们来通过【案例1】来说明,假如我们手写一个数字0,作为像素看守人的手下④、⑦和手下⑥、⑨看到这个图像就变得非常兴奋了(下图)

image.png 这时,兴奋的手下④、⑦向性情相投的隐藏恶魔A传递了较强的兴奋度信息,兴奋的手下⑥、⑨也向性情相投的隐藏恶魔C传递了较强的兴奋度信息。相对地,几乎没有手下向隐藏恶魔B传递兴奋度信息。接收了来自手下的兴奋度信息的隐藏恶魔们会怎样呢?接收了较强的兴奋度信息的隐藏恶魔A和隐藏恶魔C自然也变兴奋了。另一方面,隐藏恶魔B变得怎样呢?因为几乎没有从手下接收到兴奋度信息,所以一直保持冷静,如下图

image.png 这样一来,读取手写数字0的图像后,根据恶魔之间的连锁关系,最终得到了“输出恶魔0兴奋,输出恶魔1冷静”的结果。根据前文中的“如果输出恶魔0的兴奋度比输出恶魔1的兴奋度大,神经网络就判断图像的数字为0”,恶魔的网络推导出了0这个解答。

每个恶魔都有自己的偏置

在这个恶魔组织中,下层的兴奋度会或多或少地传递到上层。但是,除了具有亲密关系的各层之间传递的兴奋度信息以外,还遗漏了少量信息,就是“噪声”。如果这些噪声迷住了恶魔的心,就会导致无法正确地传递兴奋度信息。因此,这就需要减少噪声的功能。对于恶魔组织的情形,我们就将这个功能称为“心的偏置”吧!具体来说,将偏置放在恶魔的心中,以忽略少量的噪声。这个“心的偏置”是各个恶魔固有的值(也就是个性)

说了这么多,大家发现【案例1】的输出0能推到出来的关键是什么?是恶魔之间的关系对吧。那如何表示恶魔之间的关系呢?我们可以把恶魔之间的交情看做是权重。隐藏恶魔A与手下④、⑦性情相投,这样的关系可以认为是从输入层神经单元④、⑦指向隐藏层神经单元A的箭头的权重较大。同样地,隐藏恶魔B与手下⑤、⑧性情相投,可以认为是从输入层神经单元⑤、⑧指向隐藏层神经单元B的箭头的权重较大。隐藏恶魔C与手下⑥、⑨性情相投,可以认为是从输入层神经单元⑥、⑨指向隐藏层神经单元C的箭头的权重较大。这样解释的话,神经网络读入手写数字0时,神经单元A和C的输出值较大,输出层神经单元0的输出值较大。于是,根据神经网络整体的关系,最终识别出数字0。

image.png 在像这个神经网络那样前一层与下一层全连接的情况下,在输入0的图像时,原本不希望做出反应的隐藏层神经单元B以及输出层神经单元1也有信号传递,因此需要禁止这样的信号并使信号变清晰,这样的功能就是偏置,在恶魔组织中表现为“心的偏置”。如上所述,权重和偏置的协力合作使得图像识别成为可能。这就是“由神经网络中的关系得出答案”的思想。

我们利用恶魔这个角色,考察了识别输入图像的机制。具体来说,就是根据恶魔组织中的关系来判断。不过,之前的讲解中事先假定了权重的大小,也就是假定了各层恶魔之间的人际关系。那么,这个权重的大小(恶魔的关系)是如何确定的呢?神经网络中比较重要的一点就是利用网络自学习算法来确定权重大小。那神经网络是如何学习的?思路是计算神经网络得出的预测值与正解的误差,确定使得误差总和达到最小的权重和偏置。这在数学上称为模型的最优化。关于预测值与正解的误差总和,有各种各样的定义。本书采用的是最古典的定义:针对全部学习数据,计算预测值与正解的误差的平方(称为平方误差),然后再相加。这个误差的总和称为代价函数(cost function)或者 损失函数(loss function)。利用平方误差确定参数的方法在数学上称为最小二乘法,它在统计学中是回归分析的常规手段.

image.png 上图就是一个神经网络模型在学习数据并从数据中做出预测(即正向传播),将预测结果和正确结果进行计算误差并利用梯度下降算法反过来更新网络结构中的参数(即反向传播),让后续的结果预测更加接近真实情况,这就是监督学习模型。这部分我们提到了最小二乘法、梯度下降算法、正向/反向传播,我也会在后续进行分享,大家这里留个印象即可。

深度学习

大家了解了神经元以及神经网络,那深度学习和神经网络又是啥关系呢? 深度学习顾名思义就是叠加了很多层的神经网络,为什么要做成“深度”的神经网络结构? 当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。(多层的好处是可以用较少的参数表示复杂的函数)

image.png 深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。因此,“深度模型”是手段,“特征学习”是目的。区别于传统的浅层学习,深度学习的不同在于:1)强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2)明确突出了特征学习的重要性,也就是说,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加容易。与人工规则构造特征的方法相比,利用大数据来学习特征,更能够刻画数据的丰富内在信息。

结语

本篇主要是带大家理解神经网络及其组成神经元,并且介绍了深度学习和神经网络的关系,这也是为大家后续学习深度学习打开了一道大门,希望之后能和大家继续分享我的总结。 感谢大家看到这里,因为要把一个难点讲清楚确实比较长,但是耐心和坚持是学习和掌握一门知识的无上法宝,大家学不会,绝大多数不是大家的智商问题,而是大家能不能坚持并有方法论地学习,我说的方法论是因人而异,一句话学习是有方法的,对于难点切忌一口气吃个胖子,因为你还没有吃胖很可能因为食物太硬核而把自己给噎死了。确定目标,制定计划,夯实基础,一步一步,苟日新、日日新、又日新!

猜你喜欢

转载自juejin.im/post/7082389124895899684