北京物流信息联盟

【人工智能】一文为你解析神经网络(附实例、公式)

2022-07-31 13:38:03

人工神经网络风靡一时,人们不禁要问,这个朗朗上口的名字是否在模型自身的营销和应用中起到了一定作用。


据我所知,很多商业经理会说他们的产品使用了人工神经网络和深度学习。显然他们肯定不会说产品使用了“连接圆模型”(Connected Circles Models)或者“失败-惩罚-修正模型”(Fail and Be Penalized Machines)。但毫无疑问,人工神经网络已经在图像识别、自然语言处理等许多领域取得了成功的应用。


作为一个并未完全理解这些技术的专业数据科学家,就像一个没有工具的建筑工人,这让我感到很羞愧。因此,我弥补了这些缺失的功课,并写下这篇文章来帮助别人克服那些我在学习过程中遇到的困难和难题。


注意:本文示例中的R代码可以在 https://github.com/ben519/MLPB/blob/master/Problems/Classify%20Images%20of%20Stairs/intro_to_nnets_article_materials.R找到。


我们从一个激励问题开始。在这里,我们收集了2*2网格像素的灰度图像,每个像素的灰度值在0(白)至255(黑)之间。目标是建立一个识别“阶梯”模式的网络模型。



首先,我们关心的是如何找到一个能够合理拟合数据的模型,至于拟合方法,后面再考虑。


预处理


对每一个图像,给像素打上x1,x2,x3,x4 的标签并且生成一个输入向量喂给模型。希望我们的模型可以把有阶梯模式的图像预测为True,没有阶梯模式的图像预测为False。





单层感知机(模型迭代0)


我们可以构建一个简单的单层感知机模型,它使用输入的加权线性组合返回预测分数。如果预测分数大于选定的阈值,则预测为1,反之预测为0。更正式的表达式如下:



我们重新表述如下:




 即为我们的预测分数。


更形象的描述,我们可以把输入节点喂给输出节点来表示一个感知机。



对应于我们的例子,假设我们建立了如下的模型:



下面是感知机如何在我们训练图像上执行:



这肯定比随机猜测好,而且有一定的逻辑性。在所有阶梯模式的底部都有深色阴影像素,这也对应着x3和x4有较大的正系数。但是,这个模型还是有一些明显的问题:


问题 1.1:这个模型输出一个与似然概念相关的实数(更高的值意味着图像代表阶梯的概率更大),但是将这些值解释为概率是没有依据的,特别是因为它们可能超出范围[ 0, 1 ]。

问题 1.2:这个模型不能捕捉到变量和目标之间的非线性关系,为了看到这个问题,可以考虑一下下面的假设场景:


  • 案例一:从一个图像开始x = [100, 0, 0, 125],x3 从0增加至60。



  • 案例二:还是上一个图像x = [100, 0, 60, 125],x3 从60增加至120。




直观上来看,案例一应该比案例二在上有更大的增长,但是我们的感知机模型是线性方程,在 x3 的等效+ 60的变化导致这两种情况下的等效+ 0.12。


虽然我们的线性感知机还有很多的问题,但是我们先从解决这两个问题开始。

 

具有Sigmoid激活函数的单层感知机

(模型迭代1)


我们可以通过在感知机中加Sigmoid激活函数来解决上面的问题1.1问题1.2回想一下,Sigmoid函数是一个S形曲线,在0和1之间的垂直轴上有界,因此经常被用来模拟二元事件的概率。




按照这个想法,我们可以用下面的图片和等式更新我们的模型:





看起来有点熟悉?没错,这就是逻辑回归。然而,将模型解释为具有Sigmoid“激活函数”的线性感知器是更合适的,因为这样可以给我们更多的空间去推广。另外,我们现在把解释为概率,那必须相应更新我们的决策规则。



继续我们的示例问题,假设我们提出以下拟合模型:






观察该模型如何在前一节中的同一示例图像上运行:



很明显,已经解决了上面的问题1.1,继续看如何解决问题1.2


  • 案例一:从一个图像开始x = [100, 0, 0, 125],x3 从0增加至60。



  • 案例二:还是上一个图像x = [100, 0, 60, 125],x3 从60增加至120。



注意,当增加时,Sigmoid函数的曲率如何引起案例一“点亮”的(迅速增加)。但是随着z继续增加,增长的速度就变得缓慢了。这符合我们的直觉,即与案例二相比,案例一是阶梯的概率增长幅度更大。



然而,这个模型还是存在问题:


问题 2.1:与每个变量是单调关系,如果我们想要辨识轻微的阴影阶梯该怎么办呢?


问题 2.2:该模型没有考虑变量之间的关系,假定图像底部一行是黑色,又如果左上角的像素是白色的,那么右上角的像素变暗会增加图像是阶梯的概率。如果左上角的像素是黑色的,右上角的像素变暗则会降低图像是阶梯的概率。换句话说,增加 x3 可能增加或减少取决于其他变量的值,很明显目前的模型无法达到这点。


具有Sigmoid激活函数的多层感知机

(模型迭代2)


可以通过向感知机模型再加一层来解决上述问题2.1问题2.2


我们构建一些基本模型,比如上面的一个模型,然后我们将每个基本模型的输出作为另一个感知机的输入。这个模型实际上是一个香草神经网络(“香草”是一种常见的“常规”或“没有任何花哨的东西”的委婉说法),让我们看看它对某些例子可能有什么作用。


示例1 识别阶梯模式


  • 搭建一个模型,当“左侧阶梯”被识别时,该模型“点亮”

  • 搭建一个模型,当“右侧阶梯”确定时该模型“点亮”

  • 把基本模型的分数加起来,这样当都比较大时才会把最后一层网络上Sigmoid函数“点亮”。

 




或者


  • 搭建一个模型,当最后一列是黑色时模型“点亮”

  • 搭建一个模型,当左上角的像素是黑色,右上角的像素;

  • 亮时模型“点亮”

  • 搭建一个模型,当左上角像素是亮的,右上角的像素是黑色时模型“点亮”

  • 把基本模型的分数加起来,只有当的值大或者的值大时才会让最后一层网络上Sigmoid函数“点亮”。(注意,不会同时很大)




示例2 识别微弱阶梯


  • 搭建几个基本模型,当底部一行是阴影,x1是阴影x2是白色,x2是阴影x1是白色时曲率“开火”

  • 搭建几个基本模型,当底部一行是黑色,x1是黑色x2是白色,x2是黑色x1是白色时曲率“开火”

  • 结合这几个基本模型,当结果输进Sigmoid函数之前把黑色识别器从阴影识别器中去除。




相关概念及方法解释


  • 神经网络:单层感知机只有一个输出层,因此,我们建立的模型也被称为双层感知机因为有一个输出层是另一个输出层的输入。但是,我们可以把这些网络统称为神经网络,并且三层网络分别称为输入层、隐藏层和输出层。



  • 不唯一的激活函数:我们的示例使用了Sigmoid激活函数,我们也可以选择其它类型的激活函数Tanh和Relu。不过激活函数必须是非线性的,否则神经网络将简化为等效的单层感知器。


  • 搭建多分类器:我们可以在输出层增加几个节点,从而很容易把我们的模型扩展为多分类器。每一个输出节点都是我们要预测的一个类别。我们可以使用softmax函数把的一个向量映射为一个向量,并且向量内的元素加和为1,以此来代替用Sigmoid函数把一个实数映射在[0, 1]之间。



  • 使用两层以上的网络(深度学习):你可能会想,“我们是否可以扩展我们的香草神经网络,使它的输出层被送入第四层(第五层,第六层等等)?”答案是Yes,而且这就是我们经常提到的深度学习,并且效果还很好。然而,值得注意的是,任何一个具有多个隐藏层的网络都可以由仅有一个隐藏层的网络模拟,根据Universal Approximation Theorem定理可以用一个隐层的神经网络来逼近任何连续函数。但是,经常用深层神经网络架构来代替单隐层架构,是因为它们在拟合过程中可以更快地收敛到一个比较好的结果。



从拟合模型到训练样本(反向传播)


目前为止,我们讨论了神经网络如何有效的工作,接下来我们说一下如何让网络模型拟合标记的训练样本。换句话说,我们如何根据标记的训练样本,来选择最合适的网络参数。一般大家会选择梯度下降优化算法(MLE最大似然估计也可以),梯度下降过程如下所示:


  • 从一些标记好的训练数据开始

  • 选择一个可微的损失函数找最小值

  • 选择一个网络架构,主要是确定网络有多少层,每层有多少节点

  • 随机初始化网络的权值

  • 在这个模型上运行训练数据,产生样本的预测值,然后根据损失函数计算总体误差(这称为正向传播)

  • 每一个权值的微小变化都决定着损失函数的大小,换句话说,要对每一个权值求梯度。(这称为反向传播)

  • 在负梯度方向上选择一个小的步长,比如,如果而且,这时我们需要减小来使当前的损失函数值降低。更新的方式(0.001是我们预先设置的步长值)

  • 重复这个过程(从第五步开始),直到设定的迭代次数或者损失函数收敛。


以上是基本的想法,实际上,这带来了很多挑战。


挑战 1:计算的复杂性


在拟合过程中,我们需要计算的一个问题是L相对于每个权值的梯度。显然这不容易,因为L依赖于输出层中的每个节点,每个节点依赖于它前面层中的每个节点,以此类推。而我们用到的神经网络可能会有数十层,高达上千个节点,这就意味着计算将会是链式法则的噩梦。


解决这个问题,就要认识到你在使用链式法则求时会重复使用中间导数,这可以让你避免重复计算同一个数。


另外一种解决方法,我们可以找一个特殊的激活函数,它的导数可以用函数值来表示,例如= 。在正向传播过程中,为了计算出预测值必须计算每个向量元素的。它可以用在反向传播中计算梯度值来更新每个节点的权值,这样不仅节省时间还节省内存。


第三种解决方法,把训练集分成“mini batches”,并不断根据每一个batch更新权值。例如,把你的训练集分为{batch1, batch2, batch3},在训练集上第一次过程如下:


  • 使用batch1更新权值

  • 使用batch2更新权值

  • 使用batch3更新权值


每次更新后重新计算L的梯度。


最后一种值得一提的技术是使用GPU而不是CPU,因为GPU更适合并行执行大量计算。


挑战 2:梯度下降可能找不到全局最小值


与其说是神经网络的挑战,不如是梯度下降的挑战。因为在梯度下降过程中,权值的更新可能会陷入局部最小值,也有可能越过最小值。也有解决的办法,可以在训练过程中选择不同的步长值或者增加网络的节点或层数来解决这个问题,在增加网络节点或层数时要注意防止过拟合。另外,一些探索式方法,例如momentum也可以有效解决这个问题。


挑战 3 如何泛化?


我们如何编写一个通用程序来拟合任意数量的节点和网络层的神经网络呢?我的答案是,“你不必这么做,完全可以借助Tensorflow”。但如果你真的想这样做,最困难的部分就是计算损失函数的梯度,所以把梯度表示成递归函数是你要考虑的一个重要问题。 更正式的名字是自动微分,一个五层的神经网络就是四层网络喂进一些感知机中,同样,四层的神经网络是三层的网络喂进一些感知机中,等等。


原文链接:

http://blog.kaggle.com/2017/11/27/introduction-to-neural-networks/


申利彬,研究生在读,主要研究方向大数据机器学习。目前在学习深度学习在NLP上的应用,希望在THU数据派平台与爱好大数据的朋友一起学习进步。


翻译组招募信息

工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。




卷积神经网络(CNN)在视觉识别任务上的表现令人称奇。好的CNN网络是带有上百万参数和许多隐含层的“庞然怪物”。事实上,一个不好的经验规则是:网络越深,效果越好。


AlexNet,VGG,Inception和ResNet是最近一些流行的CNN网络。


为什么这些网络表现如此之好?它们是如何设计出来的?为什么它们设计成那样的结构?回答这些问题并不简单,但是这里我们试着去探讨上面的一些问题。


网络结构设计是一个复杂的过程,需要花点时间去学习,甚至更长时间去自己动手实验。首先,我们先来讨论一个基本问题。


1. 为什么CNN模型战胜了传统的计算机视觉方法?



图像分类指的是给定一个图片将其分类成预先定义好的几个类别之一。图像分类的传统流程涉及两个模块:特征提取和分类


特征提取指的是从原始像素点中提取更高级的特征,这些特征能捕捉到各个类别间的区别。这种特征提取是使用无监督方式,从像素点中提取信息时没有用到图像的类别标签。


常用的传统特征包括GIST, HOG, SIFT, LBP等。特征提取之后,使用图像的这些特征与其对应的类别标签训练一个分类模型。常用的分类模型有SVM,LR,随机森林及决策树等。


上面流程的一大问题是:特征提取不能根据图像和其标签进行调整。如果选择的特征缺乏一定的代表性来区分各个类别,模型的准确性就大打折扣,无论你采用什么样的分类策略。


采用传统的流程,目前的一个比较好的方法是使用多种特征提取器,然后组合它们得到一种更好的特征。


但是这需要很多启发式规则和人力来根据领域不同来调整参数使得达到一个很好的准确度,这里说的是要接近人类水平。


这也就是为什么采用传统的计算机视觉技术需要花费多年时间才能打造一个好的计算机视觉系统(如OCR,人脸验证,图像识别,物体检测等),这些系统在实际应用中可以处理各种各样的数据。


有一次,我们用了6周时间为一家公司打造了一个CNN模型,其效果更好,采用传统的计算机视觉技术要达到这样的效果要花费一年时间。


传统流程的另外一个问题是:它与人类学习识别物体的过程是完全不一样的。自从出生之初,一个孩子就可以感知周围环境,随着他的成长,他接触更多的数据,从而学会了识别物体。


这是深度学习背后的哲学,其中并没有建立硬编码的特征提取器。它将特征提取和分类两个模块集成一个系统,通过识别图像的特征来进行提取并基于有标签数据进行分类。


这样的集成系统就是多层感知机,即有多层神经元密集连接而成的神经网络。


一个经典的深度网络包含很多参数,由于缺乏足够的训练样本,基本不可能训练出一个不过拟合的模型。


但是对于CNN模型,从头开始训练一个网络时你可以使用一个很大的数据集如ImageNet。这背后的原因是CNN模型的两个特点:神经元间的权重共享和卷积层之间的稀疏连接。


这可以从下图中看到。在卷积层,某一个层的神经元只是和输入层中的神经元局部连接,而且卷积核的参数是在整个2-D特征图上是共享的



2. 为了理解CNN背后的设计哲学,你可能会问:其目标是什么?


  • 准确度


如果你在搭建一个智能系统,最重要的当然是要尽可能地准确。公平地来说,准确度不仅取决于网路,也取决于训练样本数量。因此,CNN模型一般在一个标准数据集ImageNet上做对比。


ImageNet项目仍然在继续改进,目前已经有包含21841类的14,197,122个图片。自从2010年,每年都会举行ImageNet图像识别竞赛,比赛会提供从ImageNet数据集中抽取的属于1000类的120万张图片。


每个网络架构都是在这120万张图片上测试其在1000类上的准确度。


  • 计算量


大部分的CNN模型都需要很大的内存和计算量,特别是在训练过程。因此,计算量会成为一个重要的关注点。同样地,如果你想部署在移动端,训练得到的最终模型大小也需要特别考虑。


你可以想象到,为了得到更好的准确度你需要一个计算更密集的网络。因此,准确度和计算量需要折中考虑。


除了上面两个因素,还有其他需要考虑的因素,如训练的容易度,模型的泛化能力等。下面按照提出时间介绍一些最流行的CNN架构,可以看到它们准确度越来越高。


3. AlexNet


AlexNet


http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf


 是一个较早应用在ImageNet上的深度网络,其准确度相比传统方法有一个很大的提升。它首先是5个卷积层,然后紧跟着是3个全连接层,如下图所示:



Alex Krizhevs提出的AlexNet采用了ReLU激活函数,而不像传统神经网络早期所采用的Tanh或Sigmoid激活函数,ReLU数学表达为:


f(x)=max(0, x)


ReLU相比Sigmoid的优势是其训练速度更快,因为Sigmoid的导数在稳定区会非常小,从而权重基本上不再更新。这就是梯度消失问题。因此AlexNet在卷积层和全连接层后面都使用了ReLU。



AlexNet的另外一个特点是其通过在每个全连接层后面加上Dropout层减少了模型的过拟合问题。Dropout层以一定的概率随机地关闭当前层中神经元激活值,如下图所示:



为什么Dropout有效?


Dropout背后理念和集成模型很相似。在Drpout层,不同的神经元组合被关闭,这代表了一种不同的结构,所有这些不同的结构使用一个的子数据集并行地带权重训练,而权重总和为1。


如果Dropout层有 n 个神经元,那么会形成2^n个不同的子结构。在预测时,相当于集成这些模型并取均值。这种结构化的模型正则化技术有利于避免过拟合。


Dropout有效的另外一个视点是:由于神经元是随机选择的,所以可以减少神经元之间的相互依赖,从而确保提取出相互独立的重要特征。


4. VGG16


VGG16


https://arxiv.org/abs/1409.1556


是牛津大学VGG组提出的。VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,5x5)。


对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。


比如,3个步长为1的 3x3 卷积核连续作用在一个大小为7的感受野,其参数总量为 3*(9C^2), 如果直接使用7x7卷积核,其参数总量为  49C^2,这里  C 指的是输入和输出的通道数。


而且3x3卷积核有利于更好地保持图像性质。VGG网络的架构如下表所示:



可以看到VGG-D,其使用了一种块结构:多次重复使用同一大小的卷积核来提取更复杂和更具有表达性的特征。这种块结构( blocks/modules)在VGG之后被广泛采用。


VGG卷积层之后是3个全连接层。网络的通道数从较小的64开始,然后每经过一个下采样或者池化层成倍地增加,当然特征图大小成倍地减小。最终其在ImageNet上的Top-5准确度为92.3%。


5. GoogLeNet / Inception


尽管VGG可以在ImageNet上表现很好,但是将其部署在一个适度大小的GPU上是困难的,因为需要VGG在内存和时间上的计算要求很高。由于卷积层的通道数过大,VGG并不高效。


比如,一个3x3的卷积核,如果其输入和输出的通道数均为512,那么需要的计算量为9x512x512。


在卷积操作中,输出特征图上某一个位置,其是与所有的输入特征图是相连的,这是一种密集连接结构。


GoogLeNet


https://arxiv.org/pdf/1409.4842v1.pdf


基于这样的理念:在深度网路中大部分的激活值是不必要的(为0),或者由于相关性是冗余。因此,最高效的深度网路架构应该是激活值之间是稀疏连接的,这意味着512个输出特征图是没有必要与所有的512输入特征图相连。


存在一些技术可以对网络进行剪枝来得到稀疏权重或者连接。但是稀疏卷积核的乘法在BLAS和CuBlas中并没有优化,这反而造成稀疏连接结构比密集结构更慢。


据此,GoogLeNet设计了一种称为inception的模块,这个模块使用密集结构来近似一个稀疏的CNN,如下图所示。


前面说过,只有很少一部分神经元是真正有效的,所以一种特定大小的卷积核数量设置得非常小。同时,GoogLeNet使用了不同大小的卷积核来抓取不同大小的感受野。



Inception模块的另外一个特点是使用了一中瓶颈层(实际上就是1x1卷积)来降低计算量:


这里假定Inception模块的输入为192个通道,它使用128个3x3卷积核和32个5x5卷积核。5x5卷积的计算量为25x32x192,但是随着网络变深,网络的通道数和卷积核数会增加,此时计算量就暴涨了。为了避免这个问题,在使用较大卷积核之前,先去降低输入的通道数。


所以,Inception模块中,输入首先送入只有16个卷积核的1x1层卷积层,然后再送给5x5卷积层。这样整体计算量会减少为16x192+25x32x16。这种设计允许网络可以使用更大的通道数。


(译者注:之所以称1x1卷积层为瓶颈层,你可以想象一下一个1x1卷积层拥有最少的通道数,这在Inception模块中就像一个瓶子的最窄处)


GoogLeNet的另外一个特殊设计是最后的卷积层后使用全局均值池化层替换了全连接层,所谓全局池化就是在整个2D特征图上取均值。


这大大减少了模型的总参数量。要知道在AlexNet中,全连接层参数占整个网络总参数的90%。使用一个更深更大的网络使得GoogLeNet移除全连接层之后还不影响准确度。其在ImageNet上的top-5准确度为93.3%,但是速度还比VGG还快。


6. ResNet

  

从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。


这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差。


残差网络 [ResNet]


https://arxiv.org/abs/1512.03385


设计一种残差模块让我们可以训练更深的网络



深度网络的训练问题称为退化问题,残差单元可以解决退化问题的背后逻辑在于此:想象一个网络A,其训练误差为x。


现在通过在A上面堆积更多的层来构建网络B,这些新增的层什么也不做,仅仅复制前面A的输出。这些新增的层称为C。


这意味着网络B应该和A的训练误差一样。那么,如果训练网络B其训练误差应该不会差于A。但是实际上却是更差,唯一的原因是让增加的层C学习恒等映射并不容易。


为了解决这个退化问题,残差模块在输入和输出之间建立了一个直接连接,这样新增的层C仅仅需要在原来的输入层基础上学习新的特征,即学习残差,会比较容易。


与GoogLeNet类似,ResNet也最后使用了全局均值池化层。利用残差模块,可以训练152层的残差网络。其准确度比VGG和GoogLeNet要高,但是计算效率也比VGG高。152层的ResNet其top-5准确度为95.51%。


ResNet主要使用3x3卷积,这点与VGG类似。在VGG基础上,短路连接插入进入形成残差网络。如下图所示:



残差网络实验结果表明:34层的普通网络比18层网路训练误差还打,这就是前面所说的退化问题。但是34层的残差网络比18层残差网络训练误差要好。


7. 总结

   

随着越来越复杂的架构的提出,一些网络可能就流行几年就走下神坛,但是其背后的设计哲学却是值得学习的。这篇文章对近几年比较流行的CNN架构的设计原则做了一个总结。


(译者注:可以看到,网络的深度越来越大,以保证得到更好的准确度。网络结构倾向采用较少的卷积核,如1x1和3x3卷积核,这说明CNN设计要考虑计算效率了。)


一个明显的趋势是采用模块结构,这在GoogLeNet和ResNet中可以看到,这是一种很好的设计典范,采用模块化结构可以减少我们网络的设计空间,另外一个点是模块里面使用瓶颈层可以降低计算量,这也是一个优势。


这篇文章没有提到的是最近的一些移动端的轻量级CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,这些网络大小非常小,而且计算很高效,可以满足移动端需求,是在准确度和速度之间做了平衡。


8. 参考文献

   

http://cv-tricks.com/cnn/understand-resnet-alexnet-vgg-inception/

山西天赐达科技


提供有价值有深度的文章

做有深度的公司


微信搜索:山西天赐达科技

或长按下方图片,识别图中二维码,关注山西天赐达科技公众号

本文由山西天赐达科技整理编辑    微信公众号:山西天赐达科技


版权声明感谢原作者的辛苦创作,如转载涉及版权等问题,请联系我们,我们将在第一时间删除,谢谢!

投稿/合作邮箱:976530680@qq.com

联系微信:bbc18334789718


欢迎转载本公众号文章!请附上——文章来源:山西天赐达科技即可,谢谢!







友情链接

Copyright © 2023 All Rights Reserved 版权所有 北京物流信息联盟