我们能对一个隐藏层的所有神经元应用同样的偏置值吗?

2020-07-06 10:28发布

1条回答
大泽九章
2楼 · 2020-07-15 23:05






第6章深度学习




介绍卷积网络


全连接层的网络不考虑图像的空间结构。

卷积神经网络采用了三种基本概念:局部感受野(localreceptivefields),共享权重(sharedweights),混合(pooling)。


局部感受野:是输入像素上的一个小窗口,每个连接学习一个权重。而隐藏神经元同时也学习一个总的偏置。


共享权重和偏置:每个隐藏神经元具有一个偏置和连接到它的局部感受野的5×5权重。我们打算对24×24隐藏神经元中的每一个使用相同的权重和偏置。

这意味着第一个隐藏层的所有神经元检测完全相同的特征,只是在输入图像的不同位置。

在图像中应用相同的特征检测器是非常有用的。用稍微更抽象的术语,卷积网络能很好地适应图像的平移不变性:例如稍稍移动一幅猫的图像,它仍然是一幅猫的图像。

因为这个原因,我们有时候把从输入层到隐藏层的映射称为一个特征映射。我们把定义特征映射的权重称为共享权重。我们把以这种方式定义特征映射的偏置称为共享偏置。共享权重和偏置经常被称为一个卷积核或者滤波器。

为了完成图像识别我们需要超过一个的特征映射。所以一个完整的卷积层由几个不同的特征映射组成。

共享权重和偏置的一个很大的优点是,它大大减少了参与的卷积网络的参数。对于每个特征映射我们需要25=5×5个共享权重,加上一个共享偏置。所以每个特征映射需要26个参数。如果我们有20个特征映射,那么总共有20×26=520个参数来定义卷积层。作为对比,假设我们有一个全连接的第一层,具有784=28×28个输入神经元,和一个相对适中的30个隐藏神经元,正如我们在本书之前的很多例子中使用的。总共有784×30个权重,加上额外的30个偏置,共有23,550个参数。换句话说,这个全连接的层有多达40倍于卷基层的参数。直观地,使用卷积层的平移不变性似乎很可能减少全连接模型中达到同样性能的参数数量。而更少的参数将导致更快的卷积模型的训练,并最终将有助于我们使用卷积层建立深度网络。


混合层:通常紧接着在卷积层之后使用。它要做的是简化从卷积层输出的信息。详细地说,一个混合层取得从卷积层输出的每一个特征映射并且从它们准备一个凝缩的特征映射。

一个常⻅的混合的程序被称为最大值混合(max-pooling)。在最大值混合中,一个混合单元简单地输出其2×2输入区域的最大激活值。

我们可以把最大值混合看作一种网络询问是否有一个给定的特征在一个图像区域中的哪个地方被发现的方式。然后它扔掉确切的位置信息。直观上,一旦一个特征被发现,它的确切位置并不如它相对于其它特征的大概位置重要。一个很大的好处是,这样可以有很多被更少地混合的特征,所以这有助于减少在以后的层所需的参数的数目。

最大值混合并不是用于混合的仅有的技术。另一个常用的方法是L2混合(L2pooling)。这里我们取2×2区域中激活值的平方和的平方根,而不是最大激活值。虽然细节不同,但其直观上和最大值混合是相似的:L2混合是一种凝缩从卷积层输出信息的方式。


网络中最后连接的层是一个全连接层。更确切地说,这一层将最大值混合层的每一个神经元连接到每一个输出神经元。




卷积神经网络在实际中的应用


使用Theano使得实现针对卷积神经网络的反向传播很容易,因为它自动计算涉及到的映射。

Theano也比我们前面代码更快(那些代码是为了容易理解,不是为了运行速度),这使它可实际用于训练更复杂的网络。

特别地,Theano的一个非常好的特性是它能够运行于CPU或者GPU上。运行于GPU上可以提供显著的增速。而且,有助于实际用于更复杂的网络。


版本1:仅使用一个隐藏层,包含100个隐藏神经元。

版本2:使用5×5局部感受野,跨距为1,20个特征映射。我们也会插入一个最大值混合层,它用一个2×2的混合窗口来合并特征。此外,有一个额外的全连接层(100个隐藏神经元,10个输出神经元)。

版本3:在已有的卷积–混合层和全连接隐藏层之间插入第二个卷积–混合层(再次使用一个40个特征,5×5局部感受野,混合2×2的区域)。

版本4:使用修正线性单元而不是S型激活函数。

版本5:扩展训练数据。扩展训练数据的一个简单的方法是将每个训练图像由一个像素来代替。无论是上一个像素,一个像素,左边一个像素,或右边一个像素。

版本6:插入一个额外的全连接层(这样我们就有两个100个隐

藏神经元的全连接层)。

版本7:应用弃权到最终的全连接层(全连接隐藏层有1,000个神经元,不是之前使用的100个)。

版本8:使用一个组合的网络。尽管网络都会有相似的准确率,他们很可能因为不同的随机初始化产生不同的错误。在这5个网络中进行一次投票来取得一个优于单个网络的分类,似乎是合理的。

版本9:一篇DanClaudiuCireșan,UeliMeier,LucaMariaGambardella和JürgenSchmidhuber所著的2010年论文《Deep,Big,SimpleNeuralNetsExcelonHandwrittenDigitRecognition》,网络是一个许多层的神经网络,仅使用全连接层(没有卷积层)。他们最成功的网络有分别包含有2,500,2,000,1,500,1,000和500个神经元的隐藏层。他们使用和Simard等人类似的想法来扩展他们的训练数据。除了这些,他们没有使用其它的技巧,包括没有卷积层。这是一个清晰的,简单的网络,这样的网络如果有足够的耐心,可以在80年代将其训练(如果MNIST数据集已经有了),假设那时有足够的计算能力。他们达到了一个99.65%的分类准确率,或多或少和我们一样。其关键是使用一个非常大,非常深的网络,并且使用一块GPU来加速训练。这让他们训练了很多个迭代期。他们也利用了他们的⻓训练时间来逐渐地将学习速率从0.001减小到0.000001。


规范化当前的网络确实可以提高准确率,但是得到的只是很小。

柔性最大值和对数似然代价在现代的图像分类网络中很常⻅。


tanh网络训练得比sigma网络稍微快些,但是最终的准确率非常相似。


修正线性激活函数好于S型或者tanh函数。原因是:一些人经常基于直觉或者启发式的理由试着用修正线性单元,他们在分类基准数据集时取得了很好的结果,并且其实践传播开了。


为什么只对全连接层应用弃权?

在卷积层上应用弃权是没必要的,因为卷积层有相当大的先天对于过度拟合的抵抗。共享权重意味着卷积滤波器被强制从整个图像中学习。这使他们不太可能去选择在训练数据中的局部特质。于是就很少有必要来应用其它规范化,例如弃权。


如何解决梯度不稳定问题?

答案是我们没有回避这些结果。相反,我们已经做了一些事情,帮助我们继续进行。

(1)使用卷积层极大地减少了这些层中的参数的数目,使学习的问题更容易;

(2)使用更多强有力的规范化技术(尤其是弃权和卷积层)来减少过度拟合,否则它在更复杂的网络中是更多的问题;

(3)使用修正线性单元而不是S型神经元,来加速训练——依据经验通常是3–5倍;

(4)使用GPU并愿意⻓时间的训练。

当然,我们也已经使用了其它主意:

利用充分大的数据集(为了避免过度拟合);

使用正确的代价函数(为了避免学习减速);

使用好的权重初始化(也是为了避免因为神经元饱和引起的学习减速);以算法形式扩展训练数据。


网络越深越好?

不赞同这样的态度,部分因为它使得深度学习的定义像是时刻就有结果的事。深度学习中实际的突破是认识到它超过浅的1、2层的网络是切实可行的,但除这之外,层的数目并不是主要的基本利益关系。更确切地说,使用更深层的网络是一种用来帮助实现其他目标工具——例如更好的分类精确率。




卷积网络的代码




图像识别领域中的近期进展


2012LRMD论文

源自斯坦福和谷歌的研究小组。

《Buildinghigh-levelfeaturesusinglargescaleunsupervisedlearning》

作者为QuocLe,Marc’AurelioRanzato,RajatMonga,MatthieuDevin,KaiChen,GregCorrado,JeffDean,AndrewNg(2012)。

他们使用的2011年ImageNet数据包含16,000,000幅全彩色图像,有20,000个种类。

LRMD的网络获得了一个不错的15.8%的准确率来正确分类ImageNet图像。那听上去可能不算令人印象深刻,但是和以前的最好成绩9.3%准确率相比已经是巨大的进步了。

2012KSH论文

《ImageNetclassificationwithdeepconvolutionalneuralnetworks》

作者为AlexKrizhevsky,IlyaSutskever,和GeoffreyE.Hinton(2012)。

KSH通过缩放每幅图像使得⻓和宽中短的⻓度为256来处理。然后他们从缩放后的图像中裁剪出一个256×256的区域。最后,KSH从256×256的图像中随机提取出224×224的子图像(和水平反射)。他们把这个随机的裁剪用作扩展训练数据的方式,这样减少过度拟合。

2014ILSVRC竞赛

使用了包含22层神经元的深度卷积网络。他们称此为GoogLeNet,作为向LeNet-5的致敬。GoogLeNet达到了93.33%的前5准确率,远超2013年的获胜者(Clarifai,88.3%)和2012年的获胜者(KSH,84.7%)。

其它

一个鼓舞人心的应用上的结果就是Google的一个团队做出来的,他们应用深度卷积网络在识别Google的街景图像库中街景数字上。在他们的论文中,对接近100,000,000街景数字的自动检测和自动转述已经能打到与人类不相上下的程度。




其他的深度学习模型


递归神经网络(RNN)

假如我们允许网络中的元素能够以动态方式不断地激活。例如,隐藏神经元的行为不是完全由前一层的隐藏神经元,而是同样受制于更早的层上的神经元的激活值。这样肯定会带来跟前馈神经网络不同的效果。也可能隐藏和输出层的神经元的激活值不会单单由当前的网络输入决定,而且包含了前面的输入的影响。

拥有这类时间相关行为特性的神经网络就是递归神经网络,常写作RNN。

维基百科上介绍了超过13种不同的模型。

RNN在处理时序数据和过程上效果特别不错。这样的数据和过程正是语音识别和自然语言处理中常⻅的研究对象。

⻓短期记忆单元(Longshort-termmemoryunits,LSTMs)

影响RNN的一个挑战是前期的模型会很难训练,甚至比前馈神经网络更难。原因就是我们在上一章提到的不稳定梯度的问题。回想一下,这个问题的通常表现就是在反向传播的时候梯度越变越小。这就使得前期的层学习非常缓慢。在RNN中这个问题更加糟糕,因为梯度不仅仅通过层反向传播,还会根据时间进行反向传播。如果网络运行了一段很⻓的时间,就会使得梯度特别不稳定,学不到东西。幸运的是,可以引入一个称为⻓短期记忆(longshort-termmemory)的单元进入RNN中。LSTM最早是由Hochreiter和Schmidhuber在1997年提出,就是为了解决这个不稳定梯度的问题。

深度信念网络,生成式模型和Boltzmann机

一个就是DBN是一种生成式模型。在前馈网络中,我们指定了输入的激活函数,然后这些激活函数便决定了网络中后面的激活值。而像DBN这样的生成式模型可以类似这样使用,但是更加有用的可能就是指定某些特征神经元的值,然后进行“反向运行”,产生输入激活的值。具体讲,DBN在手写数字图像上的训练同样可以用来生成和手写数字很像的图像。换句话说,DBN可以学习写字的能力。所以,生成式模型更像人类的大脑:不仅可以读数字,还能够写出数字。

另一个是DBN可以进行无监督和半监督的学习。例如,在使用图像数据学习时,DBN可以学会有用的特征来理解其他的图像,即使训练图像是无标记的。这种进行非监督学习的能力对于根本性的科学理由和实用价值(如果完成的足够好的话)来说都是极其有趣的。

为何DBN在已经获得了这些引人注目的特性后,仍然逐渐消失在深度学习的浪潮中呢?部分原因在于,前馈网络和RNN已经获得了很多很好的结果。例如在图像和语音识别的标准测试任务上的突破。所以大家把注意力转到这些模型上并不奇怪,这其实也是很合理的。然而,这里隐藏着一个推论。研究领域里通常是赢者通吃的规则,所以,几乎所有的注意力集中在最流行的领域中。这会给那些进行目前还不很流行方向上的研究人员很大的压力,虽然他们的研究⻓期的价值非常重要。我个人的观点是DBN和其他的生成式模型应该获得更多的注意。并且我对今后如果DBN或者相关的模型超过目前流行的模型也毫不诧异。

其他

在神经网络和深度学习中还有其他哪些正在进行的研究?其实还有很多大量的其他美妙的工作。热⻔的领域包含使用神经网络来做自然语言处理naturallanguageprocessing(seealsothisinformativereviewpaper)、机器翻译machinetranslation和更加惊喜的应用如音乐信息学musicinformatics。当然其他还有不少。如使用强化学习的技术来学习玩电子游戏playvideogameswell。其想法是使用卷积网络来简化游戏界面的像素数据,将数据转化成一组特征的简化集合,最终这些信息被用来确定采用什么样的操作:“上”、“下”、“开火”等。特别有趣的是单一的网络学会7款中不同的经典游戏,其中3款网络的表现已经超过了人类专家。现在,这听起来是噱头,当然他们的标题也挺抓眼球的——“PlayingAtariwithreinforcementlearning”。但是透过表象,想想系统以原始像素数据作为输入,它甚至不知道游戏规则!从数据中学会在几种非常不同且相当敌对的场景中做出高质量的决策,这些场景每个都有自己复杂的规则集合。所以这的解决是非常干净利落的。


神经网络的未来


意图驱动的用戶接口

搜索引擎使用机器学习技术对大量的用戶输入数据进行分析,研究查询本身的含义,并通过这些发现来进行合理的动作以提供最优的搜索结果。

而意图驱动接口这样的概念也不仅仅用在搜索上。在接下来的数十年,数以千计的公司会将产品建立在机器学习来设计满足更高的准确率的用戶接口上,准确地把握用戶的意图。现在我们也看到了一些早期的例子:如苹果的Siri,WolframAlpha,IBM的Watson,可以对照片和视频进行注解的系统,还有更多。

机器学习,数据科学和创新的循环

数据科学中,机器学习可以找到藏在数据中的“确知的未知”。

⻓期看来,很可能机器学习中最大的突破并不会任何一种单一的概念突破。更可能的情况是,最大的突破是,机器学习研究会获得丰厚的成果,从应用到数据科学及其他领域。如果公司在机器学习研究中投入1美元,则有1美元加10美分的回报,那么机器学习研究会有很充足的资金保证。换言之,机器学习是驱动几个主要的新市场和技术成⻓的领域出现的引擎。结果就是出现拥有精通业务的的大团队,能够获取足够的资源。这样就能够将机器学习推向更新的高度,创造出更多市场和机会,一种高级创新的循坏。

神经网络和深度学习的⻆色

可能更好的方式是看看机器学习的未来而不是单单看神经网络。

还有个原因是我们对神经网络的理解还是太少了。

神经网络和深度学习将会主导人工智能?

相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问