谷歌云计算技术基础架构,谷歌卷积神经网络

谷歌云计算技术基础架构,谷歌卷积神经网络_第1张图片

谷歌开源了TensorFlow,世界就要马上被改变了吗

Google开源了其第二代深度学习技术TensorFlow——被使用在Google搜索、图像识别以及邮箱的深度学习框架。这在相关媒体圈、工程师圈、人工智能公司、人工智能研究团队里有了一些讨论。

比较有趣的是,微软亚洲研究院立刻向媒体发邮件表示,我们发布了开源分布式机器学习工具包(DMTK)。对于大众来说,这件事让人“困惑”。

从“深度学习”到“分布式系统”,太多概念大众一知半解,现今给出的资料又让人难以理解。而对于“Google开源TensorFlow”这一事件,各个公司、团队、学术权威也是众说纷纭。

因此,出门问问为大家“破雾”,并讲一讲这次开源意味着什么。什么是深度学习?深度学习系统是什么?深度学习理论于2006年被提出,它通过模拟“人脑的神经网络”来解释图像、声音和文本等数据。

但是目前的计算机还达不到模拟人脑数量庞大的神经元(千亿级),因此便有了用到成千上万大型计算机(计算平台集群)来吸收数据对其进行自动分类的“分布式深度学习系统”。

TensorFlow的起源和此次开源事件Google将自家研发的深度学习系统命名为“DistBelief”,它使得Google能够同时处理成千上万台大型计算机的数据,构建更大型的神经网络和大规模训练。

Google的搜索、图像识别及邮箱等均采用了该技术。一般情况下,深度学习系统都需要先设定好feature(特征),再学习如何分辨。

但GoogleDistBelief神奇的地方在于,“GoogleBrain”开发团队“XLab”曾用它在未事先获取“猫的特征描述”信息的情况下,从大量YouTube视频中区分出了哪些是猫的视频。

这意味着深度学习系统“DistBelief”自行总结出了猫的feature(特征)!虽然这个案例的识别范围、识别率有待提高(81.7%),但作为人工智能最经典案例之一,为人工智能翻开了新的篇章。

而“猫”的事件,也让曾经的GoogleBrain开发团队“XLab”的核心人员、现在被李彦宏挖到百度的吴恩达得到了“GoogleBrain”之父的美誉。

不过,时代总是进步,而“DistBelief”有缺陷。Google称,虽然DistBelief非常成功,但它仅仅以神经网络为目的、十分局限,而且很难进行配置。

另外,DistBelief牢牢绑定在Google的内部基础设施上,几乎不可能将代码与外界共享。因此,本文的主角,Google的第二代深度学习系统“TensorFlow”横空出世了。

Google表示,TensorFlow在设计上尤其针对克服DistBelief的短板,灵活、更通用、易使用、更快,而且完全开源。

TensorFlow可以被架设在智能手机这样小的设备上,甚至仅一块电路板上,更灵活;TensorFlow可以被使用在很多计算平台,无论是智能手机还是大型计算机、单个CPU/GPU计算机还是成百上千GPU卡组成的分布式系统,ARM的还是X86的构架,更通用;TensorFlow支持多种编程语言,提供了很多深度学习模型库,易使用;在很多指标上,TensorFlow要比DistBelief要快一倍,更快。

但是,学术界和工程界的一些朋友并不喜欢这个“刚刚闯入”开源界的“小伙子”,判了它“意义不大”的死刑。

“TensorFlow”之所以“开源”却不讨好,是因为TensorFlow不是第一个被开源的深度学习系统,并且目前只开源了“单机版”,而非能够识别猫的“分布式版本”。

除了并非第一以及只开源了单机版代码这两点外,Google开源TensorFlow这件事最被人诟病的地方在于,在“用事实”、“用数据”说话的学术界、工程界,Google并未用“数据对比”证明TensorFlow的“灵活、更通用、易使用”。

对于TensorFlow,出门问问的看法是,TensorFlow对学术界意义不大,但是对工程界意义挺大。

TensorFlow对工程界有意义:其它开源工具虽然众多但对工程界很难有效使用Google这次开源的TensorFlow是一种人工智能(更具体的说是深度学习)编程语言或计算框架,学术界从来都不缺少类似的开源工具,尤其是“单机版工具包”有很多。

但是学术界的工具往往更多专注在核心算法上,在系统和工程方面比较欠缺,工业界很难直接有效的使用,而Google的TensorFlow在架构设计,跨平台可移植性,算法可扩展性等等偏工程方面会做的比较好。

所以,TensorFlow对学术界的帮助比较小,但对工业界的帮助有很大潜在可能性。

比如语音识别、自然语言理解、计算机视觉、广告等等都可以应用这种深度学习算法,Google也因为深度学习系统的应用使得Google语音识别水平提高25%。

有意义归有意义,意义的大小是另一回事了。在这个信息交流频繁的时代,没有公司能随便制造一个具有超大意义的事件或者跨时代的黑科技产品。

对于工程界,TensorFlow有意义但又不是神乎其神的东西,尤其是Google目前开源的“单机版”的TensorFlow意义要小一些。

因为在工程界里,若要完成一整件事,如识别语音,TensorFlow这种通用深度学习框架的存在更多是锦上添花,而非决定根本。

比如说在一个可以应用的语音识别系统里,除了深度学习算法外,还有很多工作是专业领域相关的算法以及海量数据收集和工程系统架构的搭建。其实,对于中国来说,TensorFlow还有一个意义。

在人工智能大潮下许多人和公司想入局,但大都没有能力理解并开发一个与国际同步的深度学习系统,而TensorFlow的存在会大大降低深度学习在各个行业中的应用难度。

至于弄懂TensorFlow要花费大量时间的问题,就像很多公司用Linux或者hadoop(一种分布式系统基础架构)但很少有公司弄懂了所有源代码一样,可以把TensorFlow当成一个黑盒,先快速用起来,之后再根据数据和专业领域知识来调整。

总的来说,如果Google按照其所说的那样,在未来完全开源TensorFlow——包括其“分布式版本”,那么TensorFlow对工程界的影响会更明显些——尤其对中国创业公司来说。

谷歌人工智能写作项目:小发猫

如何选择深度学习框架 TensorFlow/Torch/Mxnet/Theano

深度学习目前的应用领域很多,主要是计算机视觉和自然语言处理,以及各种预测等常见的神经网络结构

对于计算机视觉,可以做图像分类、目标检测、视频中的目标检测等,对于自然语言处理,可以做语音识别、语音合成、对话系统、机器翻译、文章摘要、情感分析等。

对于刚入行深度学习,想从事人工智能工业应用和研发的小白来说,选择一个适合自己的深度学习框架显得尤为重要。

那么在选择深度学习框架的时候,要注意哪些内容呢?通常我们在选择框架时要考虑易用性、性能、社区、平台支持等问题。

初学者应该考虑容易上手的框架,偏工业应用的开发者可以考虑使用稳定性高、性能好的框架,偏研究性的开发者,一般选择易用而且有领先的模型基线的框架。

目前这个阶段,TensorFlow因为背靠谷歌公司这座靠山,再加上拥有庞大的开发者群体,而且采用了称为“可执行的伪代码”的Python语言,成为最受欢迎的主流框架之一。

一些外围的第三方库(如Keras、TFLearn)也基于它实现了很多成果,Keras还得到TensorFlow官方的支持。

TensorFlow支持的上层语言也在逐渐扩大,对于不同工程背景的人转入的门槛正在降低。

因此,对于刚入行深度学习的小白,TensorFlow是一个非常好的选择,掌握TensorFlow对以后的求职发展很有帮助。

为了让大家更快地掌握深度学习技术,成为人工智能领域高端人才,中公教育联合中科院自动化研究所专家,强力推出人工智能《深度学习》,让大家学有所成、真正掌握机器学习模型以及算法背后的原理。

哪一个神经网络框架的运算速度最快

谷歌翻译这几个月的进化速度似乎突然加快了?

先上论文链接Google'sNeuralMachineTranslationSystem:BridgingtheGapbetweenHumanandMachineTranslation:首先以往翻译系统有如下缺点:基于短语翻译,长语句翻译效果不好系统训练和翻译推理计算成本较高难以应对罕见词以上是显著的缺点,而这些使得翻译系统在实际应用中的准确度和速度。

下图为翻译系统的核心算法框架图:Google'sNeuralMachineTranslationSystem由带有8个encoder和8个decoder的深度LSTM网络组成,同时加入了attention机制和残差连接(residualconnections)。

为了提升并行性从而降低训练时间,我们的注意机制将decoder的底层连接到了encoder的顶层。为了加速最终的翻译速度,我们在推理计算过程中使用了低精度运算。

为了改善对罕见词的处理,我们将词分成常见子词(sub-word)单元(词的组件)的一个有限集合,该集合既是输入也是输出。

这种方法能提供字符(character)-delimitedmodels的灵活性和词(word)-delimitedmodels的有效性之间的平衡、能自然地处理罕见词的翻译、并能最终提升系统的整体准确度。

我们的波束搜索技术(beamsearchtechnique)使用了一个长度规范化(length-normalization)过程,并使用了一个覆盖度惩罚(coveragepenalty),其可以激励很可能能覆盖源句子中所有的词的输出句子的生成。

在WMT'14英语-法语和英语-德语基准上,GNMT实现了可与当前最佳结果媲美的结果。

通过在一个单独的简单句子集合的人类对比评估中,它相比于谷歌已经投入生产的基于短语的系统的翻译误差平均降低了60%。

以上是论文的abstract翻译,随着深度学习在nlp领域的应用,加上一些新的算法的提出:如batchnormalization,各种LSTM变种,attention机制等,使得实际应用性能提升。

不过google还是大厂,总是搞些大新闻。

如何用PyTorch实现递归神经网络

从Siri到谷歌翻译,深度神经网络已经在机器理解自然语言方面取得了巨大突破。

这些模型大多数将语言视为单调的单词或字符序列,并使用一种称为循环神经网络(recurrentneuralnetwork/RNN)的模型来处理该序列。

但是许多语言学家认为语言最好被理解为具有树形结构的层次化词组,一种被称为递归神经网络(recursiveneuralnetwork)的深度学习模型考虑到了这种结构,这方面已经有大量的研究。

虽然这些模型非常难以实现且效率很低,但是一个全新的深度学习框架PyTorch能使它们和其它复杂的自然语言处理模型变得更加容易。

虽然递归神经网络很好地显示了PyTorch的灵活性,但它也广泛支持其它的各种深度学习框架,特别的是,它能够对计算机视觉(computervision)计算提供强大的支撑。

PyTorch是FacebookAIResearch和其它几个实验室的开发人员的成果,该框架结合了Torch7高效灵活的GPU加速后端库与直观的Python前端,它的特点是快速成形、代码可读和支持最广泛的深度学习模型。

开始SPINN链接中的文章()详细介绍了一个递归神经网络的PyTorch实现,它具有一个循环跟踪器(recurrenttracker)和TreeLSTM节点,也称为SPINN——SPINN是深度学习模型用于自然语言处理的一个例子,它很难通过许多流行的框架构建。

这里的模型实现部分运用了批处理(batch),所以它可以利用GPU加速,使得运行速度明显快于不使用批处理的版本。

SPINN的意思是堆栈增强的解析器-解释器神经网络(Stack-augmentedParser-InterpreterNeuralNetwork),由Bowman等人于2016年作为解决自然语言推理任务的一种方法引入,该论文中使用了斯坦福大学的SNLI数据集。

该任务是将语句对分为三类:假设语句1是一幅看不见的图像的准确标题,那么语句2(a)肯定(b)可能还是(c)绝对不是一个准确的标题?

(这些类分别被称为蕴含(entailment)、中立(neutral)和矛盾(contradiction))。

例如,假设一句话是「两只狗正跑过一片场地」,蕴含可能会使这个语句对变成「户外的动物」,中立可能会使这个语句对变成「一些小狗正在跑并试图抓住一根棍子」,矛盾能会使这个语句对变成「宠物正坐在沙发上」。

特别地,研究SPINN的初始目标是在确定语句的关系之前将每个句子编码(encoding)成固定长度的向量表示(也有其它方式,例如注意模型(attentionmodel)中将每个句子的每个部分用一种柔焦(softfocus)的方法相互比较)。

数据集是用句法解析树(syntacticparsetree)方法由机器生成的,句法解析树将每个句子中的单词分组成具有独立意义的短语和子句,每个短语由两个词或子短语组成。

许多语言学家认为,人类通过如上面所说的树的分层方式来组合词意并理解语言,所以用相同的方式尝试构建一个神经网络是值得的。

下面的例子是数据集中的一个句子,其解析树由嵌套括号表示:((Thechurch)((has(cracks(in(theceiling)))).))这个句子进行编码的一种方式是使用含有解析树的神经网络构建一个神经网络层Reduce,这个神经网络层能够组合词语对(用词嵌入(wordembedding)表示,如GloVe)、和/或短语,然后递归地应用此层(函数),将最后一个Reduce产生的结果作为句子的编码:X=Reduce(“the”,“ceiling”)Y=Reduce(“in”,X)...etc.但是,如果我希望网络以更类似人类的方式工作,从左到右阅读并保留句子的语境,同时仍然使用解析树组合短语?

或者,如果我想训练一个网络来构建自己的解析树,让解析树根据它看到的单词读取句子?

这是一个同样的但方式略有不同的解析树的写法:Thechurch)hascracksintheceiling)))).))或者用第3种方式表示,如下:WORDS:Thechurchhascracksintheceiling.PARSES:SSRSSSSSRRRRSRR我所做的只是删除开括号,然后用「S」标记「shift」,并用「R」替换闭括号用于「reduce」。

但是现在可以从左到右读取信息作为一组指令来操作一个堆栈(stack)和一个类似堆栈的缓冲区(buffer),能得到与上述递归方法完全相同的结果:1.将单词放入缓冲区。

2.从缓冲区的前部弹出「The」,将其推送(push)到堆栈上层,紧接着是「church」。3.弹出前2个堆栈值,应用于Reduce,然后将结果推送回堆栈。

4.从缓冲区弹出「has」,然后推送到堆栈,然后是「cracks」,然后是「in」,然后是「the」,然后是「ceiling」。

5.重复四次:弹出2个堆栈值,应用于Reduce,然后推送结果。6.从缓冲区弹出「.」,然后推送到堆栈上层。7.重复两次:弹出2个堆栈值,应用于Reduce,然后推送结果。

8.弹出剩余的堆栈值,并将其作为句子编码返回。我还想保留句子的语境,以便在对句子的后半部分应用Reduce层时考虑系统已经读取的句子部分的信息。

所以我将用一个三参数函数替换双参数的Reduce函数,该函数的输入值为一个左子句、一个右子句和当前句的上下文状态。该状态由神经网络的第二层(称为循环跟踪器(Tracker)的单元)创建。

Tracker在给定当前句子上下文状态、缓冲区中的顶部条目b和堆栈中前两个条目s1\s2时,在堆栈操作的每个步骤(即,读取每个单词或闭括号)后生成一个新状态:context[t+1]=Tracker(context[t],b,s1,s2)容易设想用你最喜欢的编程语言来编写代码做这些事情。

对于要处理的每个句子,它将从缓冲区加载下一个单词,运行跟踪器,检查是否将单词推送入堆栈或执行Reduce函数,执行该操作;然后重复,直到对整个句子完成处理。

通过对单个句子的应用,该过程构成了一个大而复杂的深度神经网络,通过堆栈操作的方式一遍又一遍地应用它的两个可训练层。

但是,如果你熟悉TensorFlow或Theano等传统的深度学习框架,就知道它们很难实现这样的动态过程。你值得花点时间回顾一下,探索为什么PyTorch能有所不同。

图论图1:一个函数的图结构表示深度神经网络本质上是有大量参数的复杂函数。深度学习的目的是通过计算以损失函数(loss)度量的偏导数(梯度)来优化这些参数。

如果函数表示为计算图结构(图1),则向后遍历该图可实现这些梯度的计算,而无需冗余工作。

每个现代深度学习框架都是基于此反向传播(backpropagation)的概念,因此每个框架都需要一个表示计算图的方式。

在许多流行的框架中,包括TensorFlow、Theano和Keras以及Torch7的nngraph库,计算图是一个提前构建的静态对象。

该图是用像数学表达式的代码定义的,但其变量实际上是尚未保存任何数值的占位符(placeholder)。图中的占位符变量被编译进函数,然后可以在训练集的批处理上重复运行该函数来产生输出和梯度值。

这种静态计算图(staticcomputationgraph)方法对于固定结构的卷积神经网络效果很好。但是在许多其它应用中,有用的做法是令神经网络的图结构根据数据而有所不同。

在自然语言处理中,研究人员通常希望通过每个时间步骤中输入的单词来展开(确定)循环神经网络。

上述SPINN模型中的堆栈操作很大程度上依赖于控制流程(如for和if语句)来定义特定句子的计算图结构。在更复杂的情况下,你可能需要构建结构依赖于模型自身的子网络输出的模型。

这些想法中的一些(虽然不是全部)可以被生搬硬套到静态图系统中,但几乎总是以降低透明度和增加代码的困惑度为代价。

该框架必须在其计算图中添加特殊的节点,这些节点代表如循环和条件的编程原语(programmingprimitive),而用户必须学习和使用这些节点,而不仅仅是编程代码语言中的for和if语句。

这是因为程序员使用的任何控制流程语句将仅运行一次,当构建图时程序员需要硬编码(hardcoding)单个计算路径。

例如,通过词向量(从初始状态h0开始)运行循环神经网络单元(rnn_unit)需要TensorFlow中的特殊控制流节点tf.while_loop。

需要一个额外的特殊节点来获取运行时的词长度,因为在运行代码时它只是一个占位符。

#TensorFlow#(thiscoderunsonce,duringmodelinitialization)#“words”isnotareallist(it’saplaceholdervariable)so#Ican’tuse“len”cond=lambdai,h:i

在这样的框架(也称为运行时定义(define-by-run))中,计算图在运行时被建立和重建,使用相同的代码为前向通过(forwardpass)执行计算,同时也为反向传播(backpropagation)建立所需的数据结构。

这种方法能产生更直接的代码,因为控制流程的编写可以使用标准的for和if。

它还使调试更容易,因为运行时断点(run-timebreakpoint)或堆栈跟踪(stacktrace)将追踪到实际编写的代码,而不是执行引擎中的编译函数。

可以在动态框架中使用简单的Python的for循环来实现有相同变量长度的循环神经网络。

#PyTorch(alsoworksinChainer)#(thiscoderunsoneveryforwardpassofthemodel)#“words”isaPythonlistwithactualvaluesinith=h0forwordinwords:h=rnn_unit(word,h)PyTorch是第一个define-by-run的深度学习框架,它与静态图框架(如TensorFlow)的功能和性能相匹配,使其能很好地适合从标准卷积神经网络(convolutionalnetwork)到最疯狂的强化学习(reinforcementlearning)等思想。

所以让我们来看看SPINN的实现。代码在开始构建网络之前,我需要设置一个数据加载器(dataloader)。

通过深度学习,模型可以通过数据样本的批处理进行操作,通过并行化(parallelism)加快训练,并在每一步都有一个更平滑的梯度变化。

我想在这里可以做到这一点(稍后我将解释上述堆栈操作过程如何进行批处理)。以下Python代码使用内置于PyTorch的文本库的系统来加载数据,它可以通过连接相似长度的数据样本自动生成批处理。

运行此代码之后,train_iter、dev_iter和test_itercontain循环遍历训练集、验证集和测试集分块SNLI的批处理。

fromtorchtextimportdata,datasetsTEXT=.ParsedTextField(lower=True)TRANSITIONS=.ShiftReduceField()LABELS=data.Field(sequential=False)train,dev,test=.splits(TEXT,TRANSITIONS,LABELS,wv_type='glove.42B')TEXT.build_vocab(train,dev,test)train_iter,dev_iter,test_iter=data.BucketIterator.splits((train,dev,test),batch_size=64)你可以在中找到设置训练循环和准确性(accuracy)测量的其余代码。

让我们继续。

如上所述,SPINN编码器包含参数化的Reduce层和可选的循环跟踪器来跟踪句子上下文,以便在每次网络读取单词或应用Reduce时更新隐藏状态;以下代码代表的是,创建一个SPINN只是意味着创建这两个子模块(我们将很快看到它们的代码),并将它们放在一个容器中以供稍后使用。

importtorchfromtorchimportnn#subclasstheModuleclassfromPyTorch’sneuralnetworkpackageclassSPINN(nn.Module):def__init__(self,config):super(SPINN,self).__init__()self.config=configself.reduce=Reduce(config.d_hidden,config.d_tracker)ifconfig.d_trackerisnotNone:self.tracker=Tracker(config.d_hidden,config.d_tracker)当创建模型时,SPINN.__init__被调用了一次;它分配和初始化参数,但不执行任何神经网络操作或构建任何类型的计算图。

在每个新的批处理数据上运行的代码由SPINN.forward方法定义,它是用户实现的方法中用于定义模型向前过程的标准PyTorch名称。

上面描述的是堆栈操作算法的一个有效实现,即在一般Python中,在一批缓冲区和堆栈上运行,每一个例子都对应一个缓冲区和堆栈。

我使用转移矩阵(transition)包含的「shift」和「reduce」操作集合进行迭代,运行Tracker(如果存在),并遍历批处理中的每个样本来应用「shift」操作(如果请求),或将其添加到需要「reduce」操作的样本列表中。

然后在该列表中的所有样本上运行Reduce层,并将结果推送回到它们各自的堆栈。

defforward(self,buffers,transitions):#Theinputcomesinasasingletensorofwordembeddings;#Ineedittobealistofstacks,oneforeachexamplein#thebatch,thatwecanpopfromindependently.Thewordsin#eachexamplehavealreadybeenreversed,sothattheycan#bereadfromlefttorightbypoppingfromtheendofeach#list;theyhavealsobeenprefixedwithanullvalue.buffers=[list(torch.split(b.squeeze(1),1,0))forbintorch.split(buffers,1,1)]#wealsoneedtwonullvaluesatthebottomofeachstack,#sowecancopyfromthenullsintheinput;thesenulls#areallneededsothatthetrackercanrunevenifthe#bufferorstackisemptystacks=[[buf[0],buf[0]]forbufinbuffers]ifhasattr(self,'tracker'):self.tracker.reset_state()fortrans_batchintransitions:ifhasattr(self,'tracker'):#IdescribedtheTrackerearlierastaking4#arguments(context_t,b,s1,s2),buthereI#providethestackcontentsasasingleargument#whilestoringthecontextinsidetheTracker#objectitself.tracker_states,_=self.tracker(buffers,stacks)else:tracker_states=itertools.repeat(None)lefts,rights,trackings=[],[],[]batch=zip(trans_batch,buffers,stacks,tracker_states)fortransition,buf,stack,trackinginbatch:iftransition==SHIFT:stack.append(())eliftransition==REDUCE:rights.append(())lefts.append(())trackings.append(tracking)ifrights:reduced=iter(self.reduce(lefts,rights,trackings))fortransition,stackinzip(trans_batch,stacks):iftransition==REDUCE:stack.append(next(reduced))return[()forstackinstacks]在调用self.tracker或self.reduce时分别运行Tracker或Reduce子模块的向前方法,该方法需要在样本列表上应用前向操作。

在主函数的向前方法中,在不同的样本上进行独立的操作是有意义的,即为批处理中每个样本提供分离的缓冲区和堆栈,因为所有受益于批处理执行的重度使用数学和需要GPU加速的操作都在Tracker和Reduce中进行。

为了更干净地编写这些函数,我将使用一些helper(稍后将定义)将这些样本列表转化成批处理张量(tensor),反之亦然。

我希望Reduce模块自动批处理其参数以加速计算,然后解批处理(unbatch)它们,以便可以单独推送和弹出。

用于将每对左、右子短语表达组合成父短语(parentphrase)的实际组合函数是TreeLSTM,它是普通循环神经网络单元LSTM的变型。

该组合函数要求每个子短语的状态实际上由两个张量组成,一个隐藏状态h和一个存储单元(memorycell)状态c,而函数是使用在子短语的隐藏状态操作的两个线性层(nn.Linear)和将线性层的结果与子短语的存储单元状态相结合的非线性组合函数tree_lstm。

在SPINN中,这种方式通过添加在Tracker的隐藏状态下运行的第3个线性层进行扩展。图2:TreeLSTM组合函数增加了第3个输入(x,在这种情况下为Tracker状态)。

在下面所示的PyTorch实现中,5组的三种线性变换(由蓝色、黑色和红色箭头的三元组表示)组合为三个nn.Linear模块,而tree_lstm函数执行位于框内的所有计算。

图来自Chenetal.(2016)。

谷歌开源了TensorFlow,世界就要马上被改变了吗

Google开源了其第二代深度学习技术TensorFlow——被使用在Google搜索、图像识别以及邮箱的深度学习框架。这在相关媒体圈、工程师圈、人工智能公司、人工智能研究团队里有了一些讨论。

比较有趣的是,微软亚洲研究院立刻向媒体发邮件表示,我们发布了开源分布式机器学习工具包(DMTK)。对于大众来说,这件事让人“困惑”。

从“深度学习”到“分布式系统”,太多概念大众一知半解,现今给出的资料又让人难以理解。而对于“Google开源TensorFlow”这一事件,各个公司、团队、学术权威也是众说纷纭。

因此,出门问问为大家“破雾”,并讲一讲这次开源意味着什么。什么是深度学习?深度学习系统是什么?深度学习理论于2006年被提出,它通过模拟“人脑的神经网络”来解释图像、声音和文本等数据。

但是目前的计算机还达不到模拟人脑数量庞大的神经元(千亿级),因此便有了用到成千上万大型计算机(计算平台集群)来吸收数据对其进行自动分类的“分布式深度学习系统”。

TensorFlow的起源和此次开源事件Google将自家研发的深度学习系统命名为“DistBelief”,它使得Google能够同时处理成千上万台大型计算机的数据,构建更大型的神经网络和大规模训练。

Google的搜索、图像识别及邮箱等均采用了该技术。一般情况下,深度学习系统都需要先设定好feature(特征),再学习如何分辨。

但GoogleDistBelief神奇的地方在于,“GoogleBrain”开发团队“XLab”曾用它在未事先获取“猫的特征描述”信息的情况下,从大量YouTube视频中区分出了哪些是猫的视频。

这意味着深度学习系统“DistBelief”自行总结出了猫的feature(特征)!虽然这个案例的识别范围、识别率有待提高(81.7%),但作为人工智能最经典案例之一,为人工智能翻开了新的篇章。

而“猫”的事件,也让曾经的GoogleBrain开发团队“XLab”的核心人员、现在被李彦宏挖到百度的吴恩达得到了“GoogleBrain”之父的美誉。

不过,时代总是进步,而“DistBelief”有缺陷。Google称,虽然DistBelief非常成功,但它仅仅以神经网络为目的、十分局限,而且很难进行配置。

另外,DistBelief牢牢绑定在Google的内部基础设施上,几乎不可能将代码与外界共享。因此,本文的主角,Google的第二代深度学习系统“TensorFlow”横空出世了。

Google表示,TensorFlow在设计上尤其针对克服DistBelief的短板,灵活、更通用、易使用、更快,而且完全开源。

TensorFlow可以被架设在智能手机这样小的设备上,甚至仅一块电路板上,更灵活;TensorFlow可以被使用在很多计算平台,无论是智能手机还是大型计算机、单个CPU/GPU计算机还是成百上千GPU卡组成的分布式系统,ARM的还是X86的构架,更通用;TensorFlow支持多种编程语言,提供了很多深度学习模型库,易使用;在很多指标上,TensorFlow要比DistBelief要快一倍,更快。

但是,学术界和工程界的一些朋友并不喜欢这个“刚刚闯入”开源界的“小伙子”,判了它“意义不大”的死刑。

“TensorFlow”之所以“开源”却不讨好,是因为TensorFlow不是第一个被开源的深度学习系统,并且目前只开源了“单机版”,而非能够识别猫的“分布式版本”。

除了并非第一以及只开源了单机版代码这两点外,Google开源TensorFlow这件事最被人诟病的地方在于,在“用事实”、“用数据”说话的学术界、工程界,Google并未用“数据对比”证明TensorFlow的“灵活、更通用、易使用”。

对于TensorFlow,出门问问的看法是,TensorFlow对学术界意义不大,但是对工程界意义挺大。

TensorFlow对工程界有意义:其它开源工具虽然众多但对工程界很难有效使用Google这次开源的TensorFlow是一种人工智能(更具体的说是深度学习)编程语言或计算框架,学术界从来都不缺少类似的开源工具,尤其是“单机版工具包”有很多。

但是学术界的工具往往更多专注在核心算法上,在系统和工程方面比较欠缺,工业界很难直接有效的使用,而Google的TensorFlow在架构设计,跨平台可移植性,算法可扩展性等等偏工程方面会做的比较好。

所以,TensorFlow对学术界的帮助比较小,但对工业界的帮助有很大潜在可能性。

比如语音识别、自然语言理解、计算机视觉、广告等等都可以应用这种深度学习算法,Google也因为深度学习系统的应用使得Google语音识别水平提高25%。

有意义归有意义,意义的大小是另一回事了。在这个信息交流频繁的时代,没有公司能随便制造一个具有超大意义的事件或者跨时代的黑科技产品。

对于工程界,TensorFlow有意义但又不是神乎其神的东西,尤其是Google目前开源的“单机版”的TensorFlow意义要小一些。

因为在工程界里,若要完成一整件事,如识别语音,TensorFlow这种通用深度学习框架的存在更多是锦上添花,而非决定根本。

比如说在一个可以应用的语音识别系统里,除了深度学习算法外,还有很多工作是专业领域相关的算法以及海量数据收集和工程系统架构的搭建。其实,对于中国来说,TensorFlow还有一个意义。

在人工智能大潮下许多人和公司想入局,但大都没有能力理解并开发一个与国际同步的深度学习系统,而TensorFlow的存在会大大降低深度学习在各个行业中的应用难度。

至于弄懂TensorFlow要花费大量时间的问题,就像很多公司用Linux或者hadoop(一种分布式系统基础架构)但很少有公司弄懂了所有源代码一样,可以把TensorFlow当成一个黑盒,先快速用起来,之后再根据数据和专业领域知识来调整。

总的来说,如果Google按照其所说的那样,在未来完全开源TensorFlow——包括其“分布式版本”,那么TensorFlow对工程界的影响会更明显些——尤其对中国创业公司来说。

可以输出拟合函数的神经网络框架

sigmoid函数的值域就在(0,1)内,所以你的输出结果肯定在0到1之间;至于能否拟合是zhi要看情况的;如果原来可以拟合,那么更换输出函数也可以,不过效果是否好就不敢保证了,虽然signoid做了一个同胚变换,但样本毕竟不是真的在一个连续函数上,有时候误差会导致变换时效果变差。

大脑的智慧就是一种非线性现象。人工神经元处于激活或抑制二种不同的状态,这种行为在数学上表现为一种非线性关系。具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量。

扩展资料:(1)非线性:非线性关系是自然界的普遍特性。大脑的智慧就是一种非线性现象。人工神经元处于激活或抑制二种不同的状态,这种行为在数学上表现为一种非线性关系。

具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量。(2)非局限性:一个神经网络通常由多个神经元广泛连接而成。

一个系统的整体行为不仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决定。通过单元之间的大量连接模拟大脑的非局限性。联想记忆是非局限性的典型例子。

参考资料来源:百度百科-人工神经网络。

你可能感兴趣的:(云计算,cnn,人工智能,神经网络)