致敬2023年每一个努力生活的人

致敬2023年每一个努力生活的人

致敬2023年每一个努力生活的人 我知道什么是劳动!它是世界上一切欢乐和美好事情的源泉!

五月是全世界劳动者共同的节日,劳动是人类文明进步的源泉,在这片辽阔的土地上,中华儿女用双手书写了上下五千年的历史文明,未来我们还将日以继夜创造辉煌的明天!正如高尔基所说:”劳动是世界上一切欢乐和一切美好事情的源泉。” enter image description here 五一劳动节的由来

一切乐境,都可由劳动得来: 一切苦境,都可由劳动解脱。

劳动节源于1886年的芝加哥工人大罢工,为纪念这次工人运动,1889恩格斯提出设立五一国际劳动节,同年7月第二国际宣布将每年的5月1日定为国际劳动节并得到世界各国工人的积极响应。

五一劳动节的意义

未来将属于两种人:思想的人和劳动的人。 实际上他们是同一种人,因为思想也是劳动。

五一劳动节的意义在于它体现了劳动者顽强、英勇不屈的奋斗精神,为自己争取到了合法的权益,是人类文明民主的历史性进步!五一劳动节的存在将时刻提醒着我们奋斗的精神值得敬佩和学习,这才是五一劳动节的精髓所在。 enter image description here

劳格科技五一放假安排

4月29日至5月3日放假调休,共5天。4月23日(星期日)、5月6日(星期六)为上班日。节日期间为确保联系畅通,公司全体同仁都将保持电话24小时开机,如需联系我们可拨打相关负责人或经办人电话,紧急事宜请拨打电话:17723115448。

致敬2023年每一个努力生活的人 ——劳动最可贵,幸福变很美!

请用幸运的锄犁,耕种幸福的种子,再用欢乐的时光灌溉出希望的嫩芽,收获幸福、甜美的一生!

劳格科技祝您劳动节快乐!

红星闪闪放光彩,红星灿灿暖胸怀!

红星闪闪放光彩,红星灿灿暖胸怀!

为什么我们的脚步轻轻,为什么我们的心意重重! 今天是您的生日,我们的祖国母亲!73年前,在1949年10月1日毛主席在天安门上向全世界庄严宣告——“中华人民共和国成立”了,这是中国历史上一个最伟大的转变。enter image description here

青春换得江山壮,碧血染将天地红

在祖国九百六十万平方公里的土地上,您是长江、是黄河、是巍巍昆仑、是我们一脉相承的华夏儿女。在华夏五千年的历史长河中热爱你的儿女有很多:大禹治水“三过家门而不入”为国为民,锲而不舍;范仲淹豪言“先天下之忧而忧,后天下之乐而乐”为祖国的前途和命运分忧担愁;夏明翰临危不惧“杀了夏明翰,还有后来人”赤子之心和将个人生死置之度外的革命气魄可歌可泣;周总理一句”为中华之崛起而读书”更是对以爱国主义为核心的民族精神的传承和升华,激励着我们奋发努力、不断进取!母亲您看,有多少儿女前仆后继血染五星红旗,又有多少儿女挥洒着汗水为祖国默默奉献!

国歌即将奏响,五星红旗迎风飘扬!

在您73周华诞让我们举国同庆,祝伟大的祖国国泰民安,繁荣昌盛!同时,劳格科技衷心感谢一直以来对我司关心、支持与帮助的朋友们!在这里祝您及家人身体健康、阖家幸福、美满!祝劳格科技的客户和伙伴们:秋日镀金、冬日储银、春日蓬勃、夏日蒸蒸日上! enter image description here

2022年国庆节劳格科技放假时间如下:

10月1日(周六)-10月7日(周五),共放假7天,其中10月8日(周六)和10月9日(周日)为正常上班调休时间。放假期间,为确保与您的联系畅通,公司全体同仁都将保持电话24小时开机,如需联系可拨打相关负责人、联系人电话或者通过其他方式联系我们,也可拨打电话:17723115448。

再次感谢您对重庆劳格科技的支持! 愿国庆小长假平安与您相随,快乐与您相伴!

好时节,愿得年年,常见中秋月

好时节,愿得年年,常见中秋月

人有团圆情,月是中秋明

中秋节又称祭月节、拜月节,是中国民间传统节日,由上古时代秋夕祭月演变而来。中秋节自古便有祭月、赏月、吃月饼、看花灯、赏桂花、饮桂花酒等民俗,“嫦娥奔月”、“吴刚伐桂”、“玉兔捣药”等神话传说流传至今。 enter image description here 最初“祭月节”的节期是在干支历二十四节气“秋分”这天,后来才调至夏历八月十五日。中秋节在2006年5月20日被国务院将其列入首批国家级非物质文化遗产名录,与春节、清明节、端午节并称为中国四大传统节日。

月满满,桂香飘,年年岁岁望今朝

在中秋节这天月亮通常圆满,自古就有八月十五中秋赏月的习俗,赏月是依据“农历”进行的仪式,而农历与新历的不相同之处,就在于农历是根据月亮的满亏盈缺来决定日历。《礼记》中载有“天子春朝日,秋夕月。朝日以朝,夕月以夕。”而“夕月”就是祭拜月神。 enter image description here

今夜月明人尽望,不知秋思落谁家

繁星似珠,秋月似盘; 星河璀璨,万家团圆。 在中秋的思乡夜、团圆夜,劳格科技SparkleComm智能移动通信系统助力思家思乡的朋友们云团圆。 无需寄情思,八方聚云端; 科技来助力,云上共月明。

劳格科技预祝我们的员工、客户、合作伙伴及广大朋友: 中秋节快乐、阖家团圆!

放假时间为:2022年 9 月10日至2022 年 9 月 12日,共 3 天。节假日期间公司全体同仁都将保持电话24小时开机,如需联系我们,可以拨打相关负责人、联系人电话或者通过邮件等其他方式联系我们。如需申请电子版扫码挪车二维码,关注微信公众号“劳格科技Loogear”,发送“我要领取二维码”即可。

深度学习-准备部分-第一章:介绍

深度学习-准备部分-第一章:介绍

深度学习

Deep Learning

原作者:Yoshua Bengio、Ian Goofellow、Aaron Courville等

原文发表于MIT网站:https://www.deeplearningbook.org







第一章:介绍

发明家们一直梦想着创造可以思考的机器。古希腊神话中就描述过智能物品例如会动的活的雕像和随叫随到的装满食物与饮品的餐桌。


从第一次被构想出来开始到第一台可编程计算机(Lovelace,1842)问世的一百多年间,人们一直想知道它是否可以像人一样具有智慧。如今,人工智能(artificial intelligence,AI)领域已经是一个拥有许多实用程序与活跃着研究课题的蓬勃发展的领域。我们期待着可以进行自动化常规劳动、理解语言与图片,进行医学诊断以及辅助基础科研工作的职能软件的诞生。


在人工智能发展的早期阶段,该领域通常用来快速解决那些人类智力上难以解决的,但可以用正式的数学规律描述的,对机器来说比较直观的问题。对于人工智能来说真正的挑战是那些对人来说很容易执行但却很难正式表述的事情。比如那些我们可以自动感觉到或根据直觉解决的问题,像语音与面部图像识别。


这本书就是关于这些更依赖直觉的问题的解决方法。这一解决方法允许电脑从经验中学习并依据概念层次理解世界,其中每一个概念都是依据与它相关的其他更简单的概念定义的。通过整合从经验中学到的知识,这种方法不再需要人类操作员将电脑所需的所有知识一一正式写入电脑。概念层次允许电脑通过搭建简单概念来学习复杂的概念。如果我们画出这些概念是怎样一个一个搭建在一起的,这幅画的层数回非常多,会非常深(deep)。因此,我们将这种方法称为人工智能深度学习(AI deep learning)。


许多早期的人工智能成功案例发生在相对无菌(sterile)和正规的环境下,且不需要电脑拥有过多的关于这个世界的知识。例如IBM的深蓝国际象棋系统在1997年打败了世界国际象棋冠军Garry Kasparov。国际象棋当然只是一个非常简单的世界,只包含64个位置坐标和32个只能以固定方式移动的棋子。设计一套成功的国际象棋策略是一个了不起的成就,但是这个挑战的难点并不在于向电脑描述相关概念。国际象棋完全可以通过几条简明的正式规则来描述,而且以前的编程人员以及提供了相关代码。


讽刺的是,抽象而正式的任务是人类最困难的思维任务之一,但对电脑来说,这是最简单的任务之一。电脑很早以前就可以战胜人类最强的国际象棋选手,对于识别物体与语音着了任务来说,但直到近些年才与普通人的能力相当。一个普通人的日常生活涉及到巨量关于这个世界的知识,而这些知识中又有很大一部分是主观的、直觉的,因而难以通过正式语言表达。电脑需要捕捉相同的知识才能以智慧的方式运行。人工智能领域最大的挑战之一就是如何让电脑捕捉到这种非正式知识。


有几个人工智能项目试图用硬代码的方式将关于这个世界的知识用正式语言表示。电脑可以自动通过逻辑推理规则推理这些正式语言中的语句。这正是被称为基于知识的人工智能算法。这些项目中没有任何一个项目真正成功。其中最有名的项目是Cyc(Lenat and Guha,1989).Cyc是一个推理引擎,一个用一种名叫CycL的语言写成的数据库。这些语句通过人类监督员人工写入。这是一个很繁琐的进程。工作人员得费很大力来创造足够复杂以精确描述这个世界的正式规则。例如,Cyc理解不了:“一个叫Fred的人在早上剃胡子”这样的故事(Linde,1992)。它的推理引擎在这个故事里发现了一处矛盾:它知道人类没有电动部分,但由于Fred正拿着一个电动剃须刀,因此它相信正在剃胡子的Fred作为一个整体拥有电动部分。由此,它问在Fred在剃胡子的时候Fred还是不是人类。


依靠硬代码知识的系统还面对另一个问题,AI系统需要自行从原始数据中提取特征获得知识的能力,这种能力被称为机器学习(machine learning)。机器学习的引入允许电脑解决包含了真实世界知识的问题并做出看起来主观的决定。一个简单的机器学习算法叫做逻辑回归(logistic regression),这种算法可以做出是否建议进行剖腹产的决定(Mor-Yosef et al.,1990)。另一个简单的机器学习算法名叫单纯的贝叶斯(naïve Bayes),它可以从垃圾邮件中分辨出有用的邮件。


这些机器学习算法的表现很大程度上依赖于它们被给予的数据的表述方式(representation)。例如当逻辑回归被用于给出关于剖腹产的建议时,AI系统并不直接检查病人的身体状况,而是需要医生告诉系统几条相关信息,例如是否有子宫疤痕等。每一条包含着对患者的描述的信息被称为特征(feature)。逻辑回归算法将会学习每一条患者的特征与不同结果之间只如何关联起来的。然而,这种算法却无论如何也无法改变特征的定义方式。如果逻辑回归算法得到的是一张患者3D核磁共振影像作为输入,而不是医生的正规报告,那此算法将无法做出有用的判断,毕竟核磁共振影像中每一个单一体素的状态和任何可能发生在分娩过程中的难题之间都几乎没有相关性。


这种对表述方式的依赖普遍存在于电脑科学、甚至是日常生活中。在电脑科学领域,如果需要搜索的数据集能够被智能地结构化与索引,那么搜索的效率可以以指数级提升。人们可以简单地进行阿拉伯数字计算,而对于罗马数字计算则要多花一些时间。显然,表述方式的选择对于机器学习算法的表现有着巨大的影响。图1.1展示了一个简单的视觉例子。

enter image description here

图1.1 不同的表述方式之间的区别:假设我们想通过散点图中的一条线将两类数据分开。 对于左图来说,由于我们使用卡尔迪坐标系表达数据,导致这一任务不可实现。 而对于右图,我们通过极坐标表达数据又使得这一任务变得简单直接。


许多人工智能任务都可以通过为简单的机器学习算法提供设计正确的可提取的特征集来解决。例如音高特征就是在发言人识别中一个非常有用的声音特征。音高的定义可以被正式指明——它是频谱图中最低频率的主峰。之所以说音高特征在发言人识别方面很有用,是由于它是由声道的大小决定的,这样一来就可以利用这一特征清晰分辨发言人是男人、女人还是小孩。


然而,对于很多任务来说我们本身就不知道该提取什么特征。例如,假设我们想写一个可以从图片中识别汽车的程序。因为我们都知道车有轮子,所以我们或许可以用是否有轮子作为特征。然而很可惜,通过图像像素值来描述轮子长什么样子是十分困难的。一个轮子本身具有的几何形状非常简单,但它的图像可能因为投射在轮子上的阴影、阳光照耀下轮子金属部件的反光、不同汽车的不同挡泥板或汽车前景中的遮掩了部分轮胎的物体等其他要素变得非常复杂。


这个问题的解决方法之一就是不仅利用机器学习来发现表述方式与输出之间的映射,同时也要发现表述方式本身。这种方法被称为表述方式学习(representation learning)。通过学习得来的表述方式得到的表现结果常常比手工设计的表述方式得到的表现结果更好。这种方法同样让AI系统可以在只需要非常少人工干预的情况下可以快速适应新的任务。一套表述方式学习算法可以在几分钟内为一个简单的任务发现一组高效的特征,或而对于复杂的任务则要话费几小时到几个月。为一个复杂任务人工设计特征需要耗费大量的时间与精力,甚至可能需要整个研究人员群体花费几十年时间。


表述方式学习算法中一个比较经典的例子是自动编码器(autoencoder)。一个自动编码器结合了一个用来将输入数据转化为不同表述方式的编码器(encoder)函数和一个用来将新的表述方式转变回原始数据的解码器(decoder)函数。自动编码器被训练为当输入数据运行通过编码器和解码器时尽可能不损失信息量,同时让新的表述方式拥有多种良好特性。


在设计特征或学习特征的算法时,我们的目标通常是分离那些可以解释观察数据的变化因素(factors of variation)。在本书中,我们用“因素”这个词简单的指独立的影响源,这些因素通常不会用乘法进行合并。这种因素通常不是可以直接被观察到的量,但它们的存在方式可能是未被观察到的物体或是作用在可被观察到的量上的现实世界中的力,也可能是人脑中可以为被观察数据提供有用的简化解释或推断其原因的概念。它们可以被想成帮助我们理解数据的丰富的可变形的抽象概念。在分析一条语音数据时,变化因素包括:发言人的年龄与性别、发言人的口音以及发言人说的字。当分析一辆车的图片时,变化因素包括车的位置、颜色、使用年龄和阳光下的反光。


在许多现实世界人工智能应用程序中困难的主要来源是,许多变化因素可以影响我们能观察到的每一条独立数据。在一张红车图片中的一个独立像素在晚上可能非常接近黑色而汽车轮廓的形状取决于观察的角度。大多数应用程序要求我们理清(disentangle)变化因素并抛弃我们不在乎的部分。


当然,从原始数据中直接提取如此高级而抽象的特征可能是非常困难的。这些变化因素中的许多因素,例如发言者的口音,只能通过非常复杂的,近乎人类层面的数据理解进行识别。当获得一个表述方式几乎与直接解决原始问题一样困难时,乍一看表述方式学习似乎并不能帮到我们。


深度学习(deep learning)通过用其他更简单的表述方式来表示表述方式。 解决了表述方式学习中的核心问题。深度学习让电脑通过更简单的概念来搭建复杂的概念。图1.2展示了深度学习系统是如何通过组合例如角和轮廓线等简单的概念来表示“一张人类的图片”这一复杂概念的,其中角和轮廓线等概念也是根据边缘定义的。

enter image description here 图1.2:一个深度学习模型举例:对电脑来说理解原始感觉输入数据的意义是十分困难的,比如这张图像就表示为像素值的集合。将一组像素映射到一个对象标识的函数非常复杂。如果想要直接解决问题,直接学习或估计这个映射似乎是不可能的。深度学习通过将所求的复杂映射分解成一系列嵌套的简单映射解决了这一问题,而每一个简单映射都由模型的不同层进行描述。输入展现在可视层(visible layer),之所以这么命名是因为这一层包含的变量是我们可以观察的。然后是一系列隐藏层(hidden layers)用来从图像中一步一步的提取抽象特征。这些层之所以被命名为“隐藏层”是因为它们的值不会在数据中被给出,且模型必须判断哪些概念是对解释观察到的数据间的关系有帮助的。这里的图片是对隐藏层中的特征类型进行了可视化处理后显示的图形。在给定像素的情况下,第一层可以通过比较相邻像素的亮度很轻松的识别出边缘。基于第一隐藏层对于边缘的描述,第二隐藏层可以很简单的通过识别边缘的集合搜索到角和扩展轮廓。基于第二隐藏层依据角和轮廓对图片的描述,第三隐藏层可以通过搜索特定的角和轮廓的集合检测此集合属于那个特定物体的那个部分。最后,对图像内对象所包含的部分形态的描述可以被用来识别图像内的具体对象。此图片由Zeiler和Fergus(2014)授权提供。


深度学习模型中最典型的例子是多层感知器(multilayer perceptron)。一个多层感知器只是一个将几组输入值映射到输出值的数学函数而已。此函数是由许多更简单的函数组成的。我们可以把不同数学函数中的每个应用想象成提供给输入数据的新的表述方式。


这种学习数据正确表述方式的想法为深度学习提供了一个视角。深度学习的另一个视角是它允许电脑学习一个多步电脑程序。表述方式的每一层都可以被理解为在并行执行完另一组指令之后的的计算机内存状态。深度更大的网络可以按顺序执行更多的指令。可以按顺序执行命令也就代表着后执行的命令可以直接参考先执行的命令的结果。根据深度学习中的这一观点,并不是层中对输入数据的表述方式中的所有必要的编码了变化因素的信息都可以解释输入数据。表述方式同样用来储存可以帮助执行可以理解输入数据的程序的状态信息。这种状态信息类似于传统计算机程序中的计数器或指针。具体地说,它与输入的内容无关,但它可以帮助模型组织数据处理。


以下有两种主流的测量模型深度的方法。 第一种方法基于评估结构时必须执行的顺序指令数量。我们可以将其视为通过流程图的最长路径,该流程图描述了如何基于输入计算每个模型的输出。就像两个等价的电脑程序,如果使用的编程语言不同,那么代码长度也会不同。两个相同的函数可能也会因为我们允许在流程图各个步骤使用的函数的不同导致流程图的深度不同。图1.3举例说明了不同语言的选择是如何导致相同的结构却具有不同的深度的。


另一个方法通常被用于深度概率模型,此方法计算的不是计算图的深度,而是概念间相互关联的图的深度。在这种情况下,由于需要计算各个概念之间的关系,整体计算的流程图的深度也许比概念本身的关系图深得多。这是因为系统对简单概念的理解可以为更复杂的概念提供精细化的信息。比如在一个AI系统观察一张有一只眼睛被遮盖在阴影里的脸的图像时,AI一开始可能认为图里只有一只眼睛,但在检测到有脸的存在时,它接着会推测另一只眼睛可能同样存在。在这种情况下,概念图只包含两层——一层是眼睛一层是脸,但如果我们对每个概念进行n次精炼估计,计算图就将包含2n层。

enter image description here 图1.3:将一个输入映射到输出的计算流图图例,其中每一个节点代表一次操作。一个流图的深度表示从输入到输出的最长路径,不过也取决于可能的计算路径的组成方式的定义。上图描述的计算是逻辑回归模型σ(ω^T x)的输出,其中σ是逻辑sigmoid函数。如果我们使用加法、乘法和逻辑sigmoid算法作为我们计算机语言的元素,那么此模型的深度为3。如果我们把逻辑回归看成一个元素,那么此模型深度为1。


由于很多时候并不清楚计算图的深度和概率模型图的深度两种视角哪种相关性跟高,而且因为不同的人回选择不同的最小元素集来构建他们的图,所以综上,在描述一个框架的深度时往往有不止一个正确值,就像对于同样功能的函数代码行数往往也不止一个正确值一样。同样,也没有一个一致的标准去判断到底多深的模型深度才能叫“深”。不过你可以通过研究一个模型是否比常规机器学习模型有更大量的学习函数或学习概念来有效的判断此模型是否是深度学习模型。


综上所述,本书的主题深度学习明显是一种AI框架的搭建方式,是一类机器学习,是一种让电脑系统可以通过经验与数据进行提升的技术。根据本书作者的说法,机器学习是唯一可行的建立在复杂的现实世界环境中的AI系统。深度学习特指一种机器学习,此种机器学习通过学习表述这个世界实现了强大功能与高灵活性的结合,作为一个嵌套的多层概念与表述方式系统,每一个高级概念都由它和更简单的概念之间的关系来定义,每一个更加抽象的表述方式都依据更不抽象的表述方式进行计算描述。图1.4举例说明了不同的AI学科之间的关系。图1.5给出了每个学科的高级图表。

enter image description here 图1.4 一张展示为什么深度学习是一种表述方式学习的维恩图。同时深度学习也是一种机器学习,这种机器学习可以用于大量但不是全部AI方式。维恩图中每一节包含一个AI技术的例子。


enter image description here 图1.5 此图展示了不同AI学科中不同AI系统部分之间是什么样的关系。阴影部分表示这部分结构可以从数据中进行学习。




1.1谁应该读这本书

这本书对各种各样的读者来说都是有用的,但我们在写这本书时主要考虑两类主要目标读者。其中一类读者是学习机器学习的大学生,包括即将从事与深度学与人工智能研究相关工作的群体。另一类目标人群是没有机器学习或统计学背景,但想快速获取相关知识并在他们的产品或平台上开始使用深度学习软件工程师群体。软件工程师可以从事的大量产业都可以利用到深度学习,而且很多产业对机器学习的使用也被证明是成功的,例如电脑视觉、语音和自动处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、在线广告和经济学等。


为了能适应不同群体读者的需求,这本书被组织成三部分。第一部分介绍了基础数学工具与机器学习概念。第二部分将描述最成熟的深度学习算法,这些算法的问题基本已被解决。第三部分将描述被普遍认同将在未来深度学习研究中起重要作用的更多实验性想法。


读者可以根据自身情况自行选择需要阅读的部分,跳过哪些不重要的部分。比如哪些熟悉线性代数、概率论和基础机器学习概念的读者可以跳过第一部分,而那些只想使用一个工作系统的读者只需要阅读第二部分。


我们假设所有读者都具有电脑科学背景。我们假定读者熟悉编程工作,对计算性能问题都有一个基础的了解,知道复杂性理论,懂得入门级微积分并了解一些图形理论的术语。




1.2深度学习领域的历史趋势

理解深度学习最简单的方法就是联系上下文。我们并不是把深度学习的历史事无巨细的讲出来,而是确认几个关键趋势: ·深度学习有非常久远且丰富的,但在过去它有许多名字,分别反映了不同的哲学观点,而且在受欢迎程度上有起有伏。 ·随着可用的训练数据的增加,深度学习已经变得更加有用。 ·随着深度学习使用的硬件与软件基础架构的提升,其规模也与日俱增。 ·随着时间的推移,深度学习的精确性不断提高,变得越来越复杂的应用程序也就不成问题。



1.2.1神经网络历史上的天才们

我们认为这本书的许多读者都应该听说过深度学习是一种激动人心的新技术,并且会对看到在介绍这样一种新兴领域的书中提到历史感到惊奇。事实上,深度学习有一段长而丰富的历史。深度学习只是看起来很新,因为与它现在的受欢迎程度相比,深度学习以前可以说是默默无闻了许多年,而且还有许多不同的名字。虽然“深度学习”这一称呼非常新,但是这一领域可以追溯到1950年代。由于受到不同研究人员与不同观点的影响,这一领域被重塑过很多次。


对深度学习的全部历史的研究超出了本教学教科书的讨论范围。不过一些基础背景对于理解深度学习还是很有帮助的。总体而言,历史上共有三次三次深度学习的发展浪潮,分别是:1940年代到1960年代,这期间深度学习被称为控制论(cybernetics);1980年代到1990年代,这期间深度学习被称为连接主义;以及从2006年开始的又一次的复苏,这一次被称为深度学习(deep learning)。详见图1.6的时间轴。

enter image description here 图1.6 历史上三次人工神经网络研究浪潮,从1940-1960年代的控制论开始,从只能训练一个单一神经的感知器(Rosenblatt,1958),到使用反向传播(back- propagation)(Rumelhart等人,1986a)来训练拥有一到两个隐藏层的神经网络的1980-1995年间的连接主义方法,再到现在的开始于大概2006年的深度学习浪潮(Hinton 等人, 2006; Bengio等人, 2007a; Ranzato 等人, 2007a),让我们可以训练非常深的网络


一些我们如今见到的最早的学习算法都旨在成为生物学习的计算模型,例如模拟学习过程在大脑里是如何发生或怎样才能发生的模型。因此,深度学习曾经使用过的一个名字就叫做人工神经网络(artificial neural networks,ANNs)与之相对应的对于深度学习模型的看法是,深度学习模型就是由生物学大脑启发的工程系统(可以使人类的也可以是其他动物的大脑)。对于深度学习的神经方面的看法主要是由两种观点驱动。第一个观点表明:大脑本身证明了智能行为是可行的,而建立智能的一条在观念上非常直接的方式就是对大脑运行背后的计算原理进行逆向工程并复制其功能。另一个看法认为:理解大脑和哪些构成人类智能的准则本身非常有趣,所以除了这些模型本身具有的解决工程应用难题的能力外,能够阐明基础科学问题的机器学习模型本身就很有用。


现代术语中表达的“深度学习”已经超过了神经科学视角下的当前版本机器学习模型,它需要更通用的多层组合学习准则(multiple levels of composition)。这种准则需要可以被应用到并非启发神经网络的自机器学习框架。


最早期的现代深度学习前身是神经科学观点下的简单的线性模型,此模型被设计成拥有一组n个输入值x_1……x_n,并联系输入数据与输出数据y。这种模型会学习到一组权重ω1……ω_n,并计算他们的输出ƒ(x ,ω_)=x_1 ω_1+⋯+x_n ω_n。第一次神经网络研究浪潮被称为控制论(cybernetics),见图1.6.。


McCulloch-Pitts Neuron(McCullochhe 和Pitts,1943)是一种早期的大脑功能模型。这一线性模型可以通过测试ƒ(x_ ,ω)的正负性来识别两个不同的输入类型。当然,为了使模型可以与所需要的类型的定义相符合,需要设置正确的权重,这些权重可以通过人类操作员进行设置。在1950年代,感知器(Rosenblatt,1958,1962)成为第一个可以从每一类给出的输入示例中进行权重定义学习的模型。自适应线性元素(ADALINE)和感知器可以追溯到同一时间,它只简单的返回函数值ƒ(x)本身来预测一个实数(Widrow和Hoff,1960),而且也可以从数据中学习预测这些数。


这些简单的学习算法很大程度上影响了机器学习的现代前景。ADALINE上用的适应权重的训练算法是一个名叫随机梯度下降算法(stochastic gradient descent)中的特例。稍微改良过后的随机梯度下降算法如今依然是深度学习领域中的主流算法。


感知器与ADALINE使用的基于ƒ(x,ω)函数的模型被称为线性模型(linear models)。这些模型依然是一些使用最为广泛的机器学习模型,虽然这些模型很多情况下的训练方式与最开始的训练方式并不相同。


线性模型会受很多限制。其中最出名的是这些模型无法学习异或函数,异或函数的表述方式为ƒ([0,1], ω)=1、ƒ([1,0], ω)=1和ƒ([1,1], ω)=1、ƒ([0,0], ω)=1。观察到线性系统的这些缺陷的评论员对生物学启发的学习产生了强烈的抵制(Minsky和Papert,1969)。这是在我们广阔时间线上神经网络受欢迎程度的第一次下降(图1.6)。


如今,神经科学依然被认为是深度学习研究人员的重要的灵感来源,但已经不再是深度学习领域的主导指引学科了


如今,神经科学在深度学习研究领域的重要性降低的主要原因仅仅是已经没有足够的关于大脑的信息可供我们用作指导了。为了获得大脑使用的真实算法,我们需要能够同时显示(至少)数千交互神经元的活动。由于我们做不到这一点,导致我们甚至距离理解一些最简单、已经充分研究过的大脑部分都有很长的距离(Olshausen和Field,2005)。


神经科学让我们有理由去希望一个单一的深度学习算法可以解决许多困难的任务。神经科学家已经发现,只要将大脑重新布线,将视觉信号传输到音频处理区域,雪貂可以学习用他们大脑的音频处理区域来“看”(Von Melchner等人,2000)。这一研究表明许多哺乳动物的大脑可能使用单一的算法来完成绝大多数不同任务。在这一假说出现之前,机器学习研究更为零散,自然语言处理、视觉、动作规划和语音识别分别被不同的研究者群体研究。如今,这些应用程序社区依然是分开的,但对于深度学习研究者群体来说,同时研究几个、甚至全部这些应用领域都是很正常的。


我们可以从神经科学中得出一些粗略的指导方针。只有让许多计算单元相互连接作用才能获得智能之一基础思想正是受到大脑的启发。新认知机(Fukushima,1980)介绍了一种功能强大的图像处理模型架构。此架构正是受到了哺乳动物视觉系统的启发,而后成为了我们将在9、11章中看到的现代卷积网络(LeCun等人,1998a)的基础。如今的大多数神经元网络是基于一种被称为修正线性单元(rectified linear unit)的模型神经元。这些神经元是从大量不同学科视角下开发的,其中(Nair和Hinton,2010b)和Glorot等人(2011a)引入了神经科学领域,而Jarrett等人(2009a)引入了更偏向工程方面的领域。虽然神经科学领域是灵感的重要来源,但也不必把它当作死板的教条。我们发现真实神经的计算函数与现代修正线性单元的差别很大,我们并没有发现但对神经的更深入的模拟所具有的机器学习方面的价值或解释(but greater neural realism has not yet found a machine learning value or interpretation)。同时,虽然神经科学成功启发了几个神经网络架构,但我们目前对神经科学领域的生物学习方面还不够了解,还不能为我们用来训练这些框架的学习算法提供多少指导。


媒体账号总是强调深度学习和大脑之间的相似性。要说的是,虽然深度学习研究者确实相较于其他机器学习领域(例如核心机器或贝叶斯统计)的研究者来说更喜欢提及大脑的影响,人们也不该把深度学习视作一种对大脑模拟的尝试。现代深度学习可以从很多领域获取灵感,尤其是应用数学基本原理,像线性代数、概率论、信息论和数值优化。要知道,在有一些深度学习研究人员将神经科学作为一种重要影响进行引用的同时,另一些研究者可能根本不会考虑神经科学领域。


值得注意的是从算法领域理解大脑运行方式的努力一直存在且相当活跃。这种尝试主要被称为“计算神经科学”(computational neuroscience)而且是一个与深度学习领域不同的领域,且常有研究人员在两个领域之间来回切换。深度学习领域主要关心如何搭建可以成功解决需要智能的任务计算机系统,而计算神经科学领域主要关心搭建更能精确反映大脑真实工作的模型。


在1980年代,神经网络研究的第二个浪潮很大程度上是在一个被称为连接主义(connectionism)或并行分布式处理(parallel distributed processing)(Rumelhart等人,1986b)运动中出现的。连接主义出现在认知科学的文章上。认知科学是一个跨学科的理解思维的方式,结合了多种不同层次的分析。在1980年代早期,大多数认知科学家研究符号推理模型。尽管他们很受欢迎,符号学模型依然很难准确解释大脑是如何通过神经元实现功能的。而连接主义则开始研究事实上可以基于神经元实现的认知模型,复兴了许多可以追溯到1940年代的心理学家Donald Hebb的工作思想(Hebb,1949)。


连接主义的核心观点是:大量简单的计算单元可以通过网络互联实现智能行为。这一观点同样适用于生物神经系统中的神经元和计算模型中的隐藏单元。


1980年代在连接主义运动期间出现的即可关键概念至今仍然是深度学习的核心概念。


这些概念中的一个是分布式表示,其主体思想是系统的每一个输入都应可以被数个特征表述,且每个特征都应被包含在许多可能的输入的表述中。例如我们有一个可以识别轿车、卡车和鸟且这些东西可以是红、绿或蓝色的视觉系统。表示这些输入数据的一种方法是使每个可能的出现的组合都拥有一个单独的神经元或隐藏单元。这就要求拥有九种不同的神经,而且每个神经必须独立学习关于颜色和对象标识的概念。一种改善这种情况的方法就是用分布式表示法,用三个神经描述颜色,三个神经描述对象标识。这就只需要六种神经而不是九种,且描述红色的神经可以从汽车、卡车和小鸟的图片中学习什么是红色,而不是只能从一个特定类型的对象中学习。分布式表示是本书的核心概念,在本书第16章将描述详细细节。


另一个连接主义运动的主要成就是成功利用反向传播(back-propagation)训练具有内部表述方式的深度神经网络,并广泛传播了反向传播算法(Rumelhart等人,1986a;LeCun,1987)。这个算法的受欢迎程度有起有伏,但对于本文来说,此算法是训练深度模型的主要算法。


神经网络研究的第二浪潮一直持续到了1990年代中旬。在那时,神经网络的受欢迎度又一次下降。此次低潮部分是原因是神经网络(和人工智能总体研究)没能完成各种寻求神经网络风险投资的投资者所提出的过于理想的承诺所导致的负面反应,另一部分原因则是机器学习的另一领域:核心机(kernel machines,Boser等人,1992;Cortes和Vapnik,1995;Schölkopf等人,1999)和概率图模型(graphical models,Jordan,1998)出现了一些发展。


核心机享有许多优秀理论保证。特别是,训练一个核心机是一个凸优化问题(将在第四章描述更多细节),这就代表着训练过程中可以保证能高效寻找优化模型。这让核心机非常易于“只需要工作(just work)”类型软件实现,而不需要人类操作员理解底层逻辑。很快,大多数机器学习应用程序都包含手动设计的好特点来为各个不同应用领域提供核心机。


在这段时间里,神经网络依然在一些任务上取得令人印象深刻的表现。(LeCun等人,1998b;Bengio等人2001a)。加拿大高级研究所(CIFAR)通过它的神经计算和适应性感知研究室帮助维持了神经网络研究的活力。这项目联合了多伦多大学的Geoffrey Hinton团队,蒙特利尔大学的Yoshua Bengio团队和纽约大学的Yan LeCun团队这些机器研究组。它具有多学科的特性,其中也包含神经科学家与人类和电脑视觉的专家。


此时此刻,深度网络普遍被认为是十分难以训练的。我们现在知道从1980年代就存在的算法可以很好的工作,但这在2006年前后并不明显。其中的问题可能只是简单的这些算法所需消耗的计算能力太大,当时的硬件普遍计算能力无法支持大量实验。


第三波神经网络研究浪潮开始于2006年的一项突破。Geoffrey Hinton展示了一种被称为深信网络的神经网络,这种网络可以利用一种名叫贪婪分层预训练的策略(Hinton等人,2006)进行高效训练。在16.1节中,我们将进行详细描叙。其他附属于CIFAR的研究团队很快发现这一策略可以被用于训练许多其他类型的深度网络(Bengio等人,2007a;Ranzato等人,2007a)并且可以系统性地帮助提升测试示例的泛化能力。这一次神经网络研究浪潮推广了深度学习这一术语的使用,强调了与以前有可能训练相比,训练研究人员现在已经可以训练深度神经网络以及深度的理论上的重要性(Bengio 和 LeCun, 2007a; Delalleau 和 Bengio, 2011; Pascanu 等人, 2014a; Montufar等人, 2014)。深度神经网络之所以在这段时间里能够在几个重要的应用领域取代需要手动设置参数的核心机一部分原因是因为训练核心机所需要的时间与内存与数据集大小成平方比关系,随着数据集越来越庞大,时间与内存的代价逐渐掩盖了凸优化所带来的优势。第三波神经网络浪潮一直持续到本书写作的时候,不过在这股浪潮中深度学习的研究重点发生了巨大变化。第三波浪潮开始于对新的无人监督学习技术的关注以及深度模型从小数据集中优秀的一般化能力。但现在,更多的人对更古老的监督学习算法以及深度模型利用大型标记数据集的能力更感兴趣



1.2.2不断增大的数据库规模

人么可能会疑惑,问什么深度学习在1950年代就出现了,而在近些年才被认为是一项关键技术呢。深度学习在1990年代就已经被成功的用于商业用途了,但在那个时候深度学习一般被认为是一项艺术而不是技术,是一种只有专家才会用的东西,直到近些年这种思想才被改变。诚然,想要深度学习算法表现出优秀的性能是需要一些技术的。幸运的是,随着训练数据量的增加,所需要的技能量也会随之减少。如今那些在处理复杂问题时能与人类表现相当的学习算法与1980年代那些艰难处理玩具问题的学习算法几乎相同,而我们用这些算法训练的模型在经过对深层次架构的训练的简化后,已经发生了变化。其中最重要的发展是如今我们可以为这些算法运行提供成功所需要的资源。图1.7展示了基准数据集是如何随着时间不可思议的增长的。社会的数字化趋势是此增长的重要动力源泉。随着我们在电脑上的活动越来越频繁,我们的活动也越来越多的被记录了下来。随着我们的电脑越来越多的被网络连接在一起,将这些活动记录集中起来并整理成适合机器学习应用程序的工作也就越来越简单。大数据时代(the age of“Big Data”)让机器学习更加简单,这也是因为统计估计中的关键困难——观察一小部分数据,就能很好的推广到新数据——已经被很大程度的减轻。在2015年,一条粗略的经验规则是,一个监督深度学习算法之需要大概每类5000个标记示例就可以总体实现可接受的算法表现,而在经过至少拥有1000万标签示例的数据集的训练之后其表现就与人类相当,甚至超越人类。如何降低成功所需的数据集要求是一个很重要的研究领域,特别是聚焦于我们应该如何利用无人监督或半监督学习发挥出大量无标记示例的优势。

enter image description here 图1.7 随着时间的推移,数据集规模发生了很大提升。在1900年代早期,统计学家们通过数百甚至上千个手动编译的测量值来研究数据集(Garson,1900; Gosset,1908; Anderson,1935; Fisher,1936)。在1950到1980年代,受生物学启发的机器学习先驱通常使用很小的人工数据集,例如字母的低分辨率位图,这些位图的设计目的就是为了降低算力消耗并最终证明了神经网络可以学习特定类型的功能(Widrow和Hoff,1960;Rumelhart 等人,1986b)。在1980到1990年代,机器学习在本质上变得更加倾向统计学并且开始利用更大的包含了数万示例的数据集,例如手写数字的扫描数据集MNIST (LeCun等人,1998b)。在21世纪的前十年,更多类似CIFAR-10 (Krizhevsky和Hinton,2009)这样的更复杂的同等规模的数据集相继被制造了出来。在这十年的末期和2010年代的前半部分,明显变大的包含数十万到数千万示例的数据库完全改变了深度学习的可能性。这些数据集包含了公开的数据库Street View House Numbers (Netzer等人,2011),各种版本的ImageNet数据库(Deng等人,2009,2010a;Russakovsky等人,2014a),以及Sports-1M 数据库(Karpathy等人,2014)。在图表的最顶端,我们可以看到翻译语句数据库,例如IBM的由Canadian Hansard (Brown等人,1990)和WMT 2014 数据库(Schwenk,2014)组成的数据集就远比其他数据库规模大。



1.2.3不断增大的模型尺寸

相对于1980年代以来取得的相对较少的成功,另一个神经网络可以取得如此广泛成功的关键原因是我们如今拥有了可以运行大的多的模型的计算资源。连接主义的主要观点之一是当许多动物神经系统一起工作时,它们也能获得智能。一个单独的神经元或神经元的小规模连接并不特别有用。


生物学神经元的连接并不特别紧密。如图1.8所示,我们的机器学习模型中所拥有的每个神经元的连接量在几十年的时间里甚至和哺乳动物的大脑处于一个数量级。


如图1.9,就神经元的总体数量而言,神经元网络直到最近依然非常小。自从引入了隐藏单月,人工神经网络规模大概每2.4年翻一倍。这种增长是由拥有更大内存更快速度的电脑和更大的数据集的出现推动的。更大的网络可以以更高的精度处理更复杂的信息。这一趋势看起来似乎会持续数十年。除非新的技术为我们提供更快的扩展速度,人工神经网络在至少2050年以前都不可能拥有和人类大脑一样的神经元数量。生物神经元似乎具有比当前的人工神经元更复杂功能,也就是说生物神经元网络也许甚至比这节中描述的还要大。


回过头来看,拥有神经元比水蛭(leech)还少的神经元网络无法解决复杂的人工智能问题也就不奇怪了。就算是我们以计算系统的观点看来相当大的如今的网络,其神经系统规模都比青蛙这类相当原始的脊椎动物的神经系统规模要小。


模型规模之所以可以随着时间不断增大,是因为随着时间的推移,我们获得了更快的CPU、更先进的通用型GPU、更快的网络连接速度以及更优秀的分布式计算机软件基础设置。不断增大的模型规模是深度学习历史上最重要的趋势之一。预期这一趋势总体上在未来会很好的持续下去。

enter image description here 图1.8 最开始,人工神经网络中神经元间连接的数量会受到硬件能力的限制。如今,神经元间连接的数量主要是受到设计考虑因素的影响。一些人工神经网络所具有的神经元间连接数量已经接近猫的大脑,而在其他神经网络中连接数量超过类似于老鼠这样的哺乳动物已经是非常常见的事情了。即使是人脑,每个神经元的连接数也不会特别多。生物神经网络稀疏的连接意味着即使在硬件条件受限的情况下我们依然有机会制造出与生物神经网络能力相当的人工神经网络。现代神经网络比任何脊椎动物的大脑都要小得多,但是由于我们通常只会训练网络去完成一种任务,而动物的大脑却要分成不同的区域去完成不同的任务。动物神经网络规模来自维基百科(2015)。

  1. Adaptive Linear Element (Widrow和Hoff,1960)
  2. Neocognitron (Fukushima,1980)
  3. GPU-accelerated convolutional network (Chellapilla等人,2006)
  4. Deep Boltzmann machines (Salakhutdinov和Hinton,2009a)
  5. Unsupervised convolutional network (Jarrett等人,2009b)
  6. GPU-accelerated multilayer perceptron (Ciresan等人,2010)
  7. Distributed autoencoder (Le等人,2012)
  8. Multi-GPU convolutional network (Krizhevsky等人,2012a)
  9. COTS HPC unsupervised convolutional network (Coates等人,2013) 10.GoogLeNet(Szegedy等人,2014a)

enter image description here 图1.9 自从引入隐藏单元,冉工神经网络规模大约每2.4年翻一番。生物神经网络规模引自维基百科(2015)。

  1. Perceptron (Rosenblatt,1958,1962)
  2. Adaptive Linear Element (Widrow和Hoff,1960)
  3. Neocognitron (Fukushima,1980)
  4. Early backpropagation network (Rumelhart等人,1986b)
  5. Recurrent neural network for speech recognition (Robinson和Fallside,1991)
  6. Multilayer perceptron for speech recognition (Bengio等人,1991)
  7. Mean field sigmoid belief network (Saul等人,1996)
  8. LeNet-5 (LeCun等人,1998a)
  9. Echo state network (Jaeger和Haas,2004) 10.Deep belief network (Hinton等人,2006) 11.GPU-accelerated convolutional network (Chellapilla等人,2006) 12.Deep Boltzmann machines (Salakhutdinov和Hinton,2009a) 13.GPU-accelerated deep belief network (Raina等人,2009) 14.Unsupervised convolutional network (Jarrett等人,2009b) 15.GPU-accelerated multilayer perceptron (Ciresan等人,2010) 16.OMP-1 network (Coates和Ng,2011) 17.Distributed autoencoder (Le等人, 2012) 18.Multi-GPU convolutional network (Krizhevsky等人,2012a) 19.COTS HPC unsupervised convolutional network (Coates等人,2013) 20.GoogLeNet (Szegedy等人,2014a)


1.2.4精确性增加,应用复杂化和现实世界影响

从1980年代开始,深度学习的识别与预测能力的精准性就持续提升。此外,成功应用深度学习的领域也不断扩大。


最早期的深度模型被用于识别紧密裁剪的极小图片中的单个对象(Rumelhart等人,1986a)。从那时起神经网络可以处理的图片大小就开始不断增大。现代物体识别网络可以处理丰富的高分辨率图片且不需要将需要识别的物体沿边缘剪下(Krizhevsky等人,2012b)。类似的,最早期的网络只能识别两类对象(或在一定情况下,判断某一种对象是否存在),而现代网络通常能够识别至少1000种不同类型的对象。物体识别领域最大的竞赛是每年举办的图像软件大型视觉识别竞赛(ImageNet Large-Scale Visual Recognition Competition)。深度学习迅速崛起过程中的一个戏剧性时刻来自于一个卷积网络第一次以巨大优势赢得了这项比赛并将最先进的错误率从26.1%降到了15.3%(Krizhevsky等人,2012b)。从那时起这类比赛的赢家就一直是深度卷积网络,到目前为止,由深度学习带来的优势已经将这场比赛的最新错误率利用更深的网络下降到了图1.10中展示的6.5%(zegedy等人,2014a)。在竞赛框架之外,如今的这类错误率已经下降到了5%以下(Ioffe和Szegedy,2015;Wu等人,2015).


深度学习对语音识别领域同样也有重大影响。经过整个1990年代的提升,语音识别的错误率改善工作在大概2000年开始陷入停滞。将深度学习引入语音识别(Dahl等人,2010;Deng等人,2010b;Seide等人,2011;Hinton等人,2012a)。直接导致错误率下降近半!我们将在12.3.1中详细介绍这段历史。


深度网络同样在行人识别和图像分段方面有巨大提升(Sermanet等人,2013; Farabet等人,2013a;Couprie等人,2013)而且在交通标志分类方面产生了超越人类的表现(Ciresan等人,2012)。


与此同时,深度网络的规模、精确性以及它们所能解决的问题的复杂性也提升了。Goodfellow等人(2014d)展示了神经网络可以学习从一张图片中输出整个字符序列,而不只是识别一个单独的对象。在此之前,人们普遍相信这类学习需要对序列里的每个单独元素进行标记(Gülçehre和Bengio,2013)。从那时起,长短期记忆(the Long Short-Term Memory,LSTM),一种被设计用于建模序列的神经网络人气激增。LSTM与相关模型现在被用于建模序列(sequences)之间的关系而不仅仅是固定输入与序列间的关系。这种序列到序列的学习似乎处于另一个革命性领域的前沿:机器翻译(Sutskever等人,2014a;Bahdanau等人, 2014)。


随着神经图灵机(Graves等人,2014)的引入,这种复杂性日益增加的趋势已经被推出了合乎逻辑的结论,这是一种可以学习整个程序的网络。这一神经网络一显示在给出置乱和排序序列的情况下可以学习对数据列表进行排序。这种自我编程技术还处于初期,但是在未来,这种技术原则上可以被运用到几乎任何任务上。


深度学习的许多应用程序是高利润的,因为有足够的数据可以应用深度学习。深度学习现在被许多顶尖技术公司使用包括谷歌、微软、脸书、IBM、百度、苹果、Adobe、Netflix、NVIDIA和NEC。


深度学习也为其他科学领域做了贡献。对象识别方面的现代卷积网络提供了一个可供神经科学家研究的视觉处理模型(DiCarlo,2013)。深度学习同样在科学领域的大量复杂数据处理和提供高效预测方面提供有用的工具。这类工具可以通过预测分子相互作用来帮助制药公司设计新药(Dahl等人,2014),帮助搜索亚原子粒子(Baldi等人,2014),和自动解析用来构造人脑三维地图的显微镜影像(KnowlesBarley等,2014)。我们期待深度学习未来出现在更多科学领域中。


总的来说,深度学习是一种在过去几十年的发展中极大借鉴了我们的大脑、统计学和应用数学的机器学习方法。在近几年,由于更强大的电脑、更大的数据集和能训练更深的网络的技术的出现,深度学习在受欢迎程度和有用性上都有很大的提高。在之后的几年甚至未来的很长时间都充满了提升机器学习能力并将它引入全新领域的挑战与机遇。

enter image description here 图1.10 自从深度网络达到了参加了图像处理软件大规模视觉识别竞赛的规模要求后,就持续赢得了每年的冠军,并每一次都会降低错误率。数据由Russiakovsky等人提供(2014b)。

ArrayFier:一种GPU加速平台

ArrayFier:一种GPU加速平台

论文译文

外文原文题目:ArrayFire: a GPU acceleration platform

中文译文题目:ArrayFier:一种GPU加速平台

原文作者:James Malcolm, Pavan Yalamanchili, Chris McClana- han, Vishwanath Venugopalakrishnan, Krunal Patel, 和 John Melonakos

所属单位:Emory University、Gujarat Power Engineering and Research Institute、ArrayFire等

译文作者:岳昕阳

所属单位:重庆劳格科技有限公司

原文发表于:researchgate网站

https://www.researchgate.net/publication/258716823_ArrayFire_a_GPU_acceleration_platform

版权所有 非授权谢绝转载  

摘要

ArrayFire是一个可以利用C、C++、Fortran和Python语言实现通用型GPU(general purpose GPU,GPGPU)计算应用程序的快速软件开发的GPU矩阵库。ArrayFire包含一个简单的应用程序编程接口(API)并且为CUDA框架和支持OpenCL的设备提供完整的GPU计算能力。它同样还可以提供数千种GPU调谐功能,包括线性代数、卷积、约减与快速傅立叶变换(FFTs),同时还提供信号、复数、统计学与制图学库。我们将进一步描述ArrayFire是如何支持GPU计算应用程序的开发的并且将着重介绍其中一些关键功能在实际代码操作中如何实现。

关键词:CUDA,GPU,GPGPU,ArrayFire,OpenCL



1.介绍

ArrayFire是一个搭建在AccelerEyes网站上的软件平台,它可以为使用者和编程人员提供C、C++、Fortran和Python语言的快速并行数据程序开发,并且在低级GPU应用程序编程接口(例如CUDA、OpenCL和OpenGL)上提供一种简单的高级矩阵抽象,再加上利用数千种GPU调谐组件,可以为使用者在科学、工程、金融等方面保持GPU硬件的完整优势。由于同时拥有使用简单的阵列界面、自动内存管理功能、程序运行中编译功能、用于构造环的并GPU和交互式硬件加速图像库,ArrayFire可以很好的完成并行数据算法的快速原型设计任务与构建已经部署的应用程序任务。


过去十年间,消费者和计算机开发人员对GPU的需求快速上升,尽管成功案例越来越多,GPU软件被开发出来后被采用的数量却只有缓慢的提升。采用量提升缓慢的原因主要是GUP编程较为困难


Cg、GLSH、HLSL和Brook语言的出现标志着流编程开始出现,而流编程语言又是通用型GPU编程的前身,而通用型GPU会将运算映射到图像管道进而导致收到各种限制。随着这些技术的发展,CUDA和OpenCL介绍了一种更加综合性的可编程软件结构,这种结构比流编程更简单,但是也比标准的单线程C/C++更难编程。然而,就算是新的可编程软件结构有这么多优点,绝大多数编程人员依然需要花费大量的时间学习CUDA、OpenCL等新语言才能完成一次成功的编程。


有几家私人企业同样打算达到这些目的。首批这样的公司之一,PeakStream创建了一个C/C++的运行时间和提供大量GPU构造工具集的函数库。RapidMinds公司创建了一个灵活的支持多种前端语言和多种后端硬件目标的中间层。这两项尝试都打算帮助开发人员去更好的控制硬件。而ArrayFire作为最新的GPU构造平台,打算把高级功能移植到底层硬件上去,最终实现在不牺牲整体性能的情况下,提供可编程性与可移植性。




2.ARRAYFIRE



2.1语言支持:C++、Fortran、Python

ArrayFire围绕单个矩阵对象(阵列),此矩阵可以容纳浮点值(单或双精度)、实数或复数值和布尔数据。以下是一个展示如何使用矢量化ArrayFire表示法利用蒙特卡罗估计表示π的值:创建两个向量样本(x,y),并计算有多少落在单位圆的一象限内。

enter image description here 图1 使用ArrayFire利用随机取样法估算π的值


ArrayFire的阵列式是多维度的,可以通过简单的矩阵生成函数例如(ones、randu等)生成,而且可以通过算法和函数进行操纵。另外,ArrayFire提供一条并行for循环工具——gfor——可以以并行数据的形式任意执行许多独立历程。更多细节和例子已经上传到网络上。



2.2例子:立体视差

enter image description here 图2 使用ArrayFire通过平面扫面和5-by-5相关窗口计算两个图像之间的水平差距。所有视差计算和最终最小值都是并行执行的,而且执行时保证源代码是简单且不被更改的,不需要深入到低级GPU的应用程序接口中。


在上方展示的简易例子中(图2)我们展示了两张图片之间立体视差的计算方式。这段代码可以在任何支持ArrayFire的设备上运行,而且由于不需要类似于CUDA或OpenCL的低级GPU编程API而保持了简明。ArrayFire通过使用平面扫描和5-5相关窗口实现水平差计算。所有差值计算与最终最小值都是并行执行的,且源代码可以保持干净简洁而不涉及到低级GPU应用程序编程接口。


程序是被逐行的描述的,left、right和sad的声明表明我们将使用4位浮点阵列而且left和right是我们已经获得的图像。我们假定所有阵列大小相同。我们还创建了核,一个单精度5-5滑动窗口(sliding 5-by-5 window)。


第二行利用gfor关键词表示了我们将并行运算一下模块从0到nshift共nshift+1次。所有后面的指令依然只读区一次,不过每条指令都将调用nshift+1次计算而不是只调用一次。因此,下一个指令将right图片移动一个像素、两个像素、以此类推,然后将结果(如果立刻编译并执行)作为把手(handle)储存在变量shifted中。剩下的命令行将在一个5-5的滑动窗口中计算两个图片之间的绝对差值的和。最后,就得到了所有计算所得绝对差值的和的最小值。需要注意的是在执行期间,Array Fire编译指令可以惰性编译,也就是说,前面提到的所有操作可以合并成一个GPU执行批次并派发给GPU。




3.惰性编译

ArrayFire使用了一种名叫惰性编译的技术(有时也被称为及时计算,Just-In-Time computation,JIT)用于尽可能提升用户程序的运行速度。这项正在申请专利的技术在保证了灵活性的情况下既可以在运行中生成计算设备代码又可以优化内存传输以达到最大流率。


在GPU上执行运算程序最简单的方法就是在用户输入/运行代码的时候在GPU上执行每个操作。这是可行的,而且可能加快运算速度,但并不是理论上最快的。


每当ArrayFire端口连接到GPU都需要耗费一些时间。除了计算实际耗费的时间外,设备之间通讯和GPU通讯同样会消耗时间。ArrayFire将追踪用户正在进行的计算并储存公式、输入值与最终结果,当需要执行命令时,ArrayFire将直接给出结果而不是再次进行计算以此来使第二次执行的速度更快。


考虑以下代码: enter image description here 在后台程序中,ArrayFire将建立这些部分表达式,但在实际计算任何设备代码时: enter image description here 在计算C之前I是否更改无关紧要,ArrayFire持续追踪输入源头,而你将总是得到正确答案。每当你需要C的值,它都将自动进行运算。由于对C的计算可以作为单个核进行批处理而不是把里面的每个式子都执行一遍,这种处理方式相对于把每一步都交给GPU处理一次来说节省了时间。ArrayFIre利用这些信息进一步优化更大图片的计算版本,否则一条一条执行操作将变得不可能。你能从其中得到的另一个优点是在你代码里运行计算了一个,你实际上永远不会使用的值时,ArrayFire可以直接跳过它。如果计算C所需要的内存开始不足或者计算过程开始变得极端复杂,ArrayFire也可以自行预计算C的一部分。




4.索引

ArrayFire提供了几种灵活高效的方法,用于将下标索引进数组。和C/C++、Python以及Fortran相同,Array Fire的下标也是从0开始的,即A(0)是第一个元素。索引功能可以通过以下方法的组合实现: ·整型标量 ·seq 表示线性序列 ·end 表示维度的最后一个元素 ·span 代表整个维度 ·row(i)或col(i)指定单行或单列 ·rows(first,last)或cols(first,last)指定行或列的跨度。


下标阵列索引举例: array A = randu(3,3); array a1 = A(0); //首元素 array a2 = A(0,1); //首行第二列元素


A(end); //最后一个元素 A(-1); //也表示最后一个元素 A(end-1); //倒数第二个元素


A(1,span); //第二行 A.row(end); //最后一行 A.cols(1,end); //除了第一列的全部


float b_host[] = {0,1,2,3,4,5,6,7,8,9}; array b(b_host,10,dim4(1,10)); b(seq(3)); //{0,1,2} b(seq(1,7)); //{1,2,3,4,5,6,7} b(seq(1,2,7)); //{1,3,4,7} b(seq(0,2,end)); //{0,2,4,6,8}


在考虑性能时,数组索引很重要。因为内存的移动与重排操作代价昂贵,很容易就会让对下标的索引操作吃掉你从其他地方利用快速运算获得的加速。与我们需要尽量避免利用下标访问标量值相反,下标可以表示整个向量或元素矩阵。数据是被按列以主顺序存储(与Fortran相同),因此我们建议以连续的跨度按列索引,例如调用一整列A(span,a),而不是分散访问,例如调用那些跳过元素之间内存的行A(2,span)。你可以在网络上找到更多例子。




5.图形

除了通用型计算之外,GPU也是最快最重要的图像处理器。基于这一事实,ArrayFire附带了免费的和用于商业用途的软件包。ArrayFire比较独特的一点是,他的图形引擎是在考虑了GPGPU的基础计算的情况下从头开始设计的:所有的原语都是从卡上的内存里提取。因此,所有的计算与可视化处理都由GPU处理,省去了在主机CPU与设备之间内存转换的步骤。让GPU去做那些他擅长的工作,比如并行数据处理和图像输出,而CPU则负责一系列计算和图像后端的定位。

enter image description here 图3 潜水模拟中场景的各个子视图。

图像包包含了几种基础绘图原语,其中有: ·2D与3D线性绘图 ·立体渲染 ·用于比较分析的叠加图 ·图像可视化 ·其他还有很多


图像后端的工作应该简单一些,这样你才能集中精力解决问题,而不是把精力花在OpenGL或多线程实现等这些问题上。比如要画出图三所示的图像,只需要以下几条简单的C++代码: subfigure(2,2,1); plot3d(A); subfigure(2,2,3); imgplot(A); subfigure(2,1,2); points(dx,dy,dz);




6.GFOR

ArrayFire提供仅用于GPU的并行数据循环关键词:gfor。在代码中用gfor代替标准for 循环对批进程数据做并行数据处理。比如,如果我们使用for循环计算几个矩阵连续相乘需要以下代码:

for(int I = 0; i<2 ;i++){ C(span,span,i)=A(span,span,i)*B; }


同样的三个矩阵相乘的运算,使用gfor可以一次完成而不是三次。

gfor(array i,2){ C(span,span,i)=A(span,span,i)*B; }


与前一个循环连续计算了每个矩阵乘法运算不同,后一个循环一次性完成了所有矩阵乘法运算。与之相同的,gfor可以直接用于其他类似的麻烦的并行代码。一个考虑gfor的好方法是将它视为一个语法糖(syntactic suger):gfor提供一个用于编写其他矢量算法的迭代风格。




7.多GPU互联

ArrayFire可以仅通过调用很少几条函数实现单GPU到多GPU互联的扩展配置。我们可以通过调用函数deviceset()来选择用来运算的GPU。此函数将给出允许调用ArrayFire的GPU的数量。为了同时在多个GPU上运行计算,我们将输入数据进行分块(如果必要)并将数据块分发给每个GPU。通过在循环中调用deciceset()函数来选择系统中的GPU并创建array对象可以实现上述目的。

enter image description here


然后是另一个循环,此循环调用快速傅立叶变换(FFT)函数对每个单独的数据块进行处理,所有运算过程都在系统中的各个GPU上并行运行。 enter image description here


ArrayFire同样提供同步函数sync(),此函数可以阻止主线进程直到所有其他设备结束等待中的所有函数调用。为了将数据返回给主机,我们运行另一个循环将数据传送给主机上的缓冲区。 enter image description here


如上所述,利用Array Fire中非常友好的API可以非常简单的将单个GPU扩展到多GPU并行。




8.基准

ArrayFire很快。它利用GPU的并行数据处理能力获得比其他已知的所有商业用途或免费的库更强大的性能优势。我们对Array Fire支持的大量功能进行了样本基准测试。所有曲线都表示吞吐量,更高的曲线则表示更好的性能。所有测试均在以下标准下测试: ·硬件:Intel i7 920, Tesla C2050 ·软件:ArrayFire 1.0, Intels MKL 10.3, Intels IPP 7.0, Eigen 3.0. enter image description here enter image description here enter image description here enter image description here enter image description here




9.总结

新的软件工具与基于GPU的高性价比电脑的出现,为研究技术问题的科学家、工程师和分析师开创了一个新的时代。这篇文章描述的ArrayFire平台为那些正在寻找利用GPU计算能力的非计算机科学家提供了更加高效的选择。ArrayFire是一个快速GPU矩阵库,可以用C/C++ 、Fortran和Python语言编写通用GPU计算程序。本文展示了Array Fire的简单的API,并描述了为何它能快速构造GPU运算应用程序。ArrayFire实用性的关键元素是一边进行文字描述一边利用实际代码举例。最后,我们的测试结果展示了ArrayFire提供了一种快速的GPU计算方法。




参考文献

[1] AccelerEyes. Addr.: 800 W Peachtree St NW, Atlanta, GA 30308, USA. URL: http://www.accelereyes.com.

[2] Andy Webb: “MATLABs Racing Jacket”. Automated Trader, vol. 16, no. 1, pp 54–61. 2010.

[3] AccelerEyes: “Jacket v1.7.1: Getting Started Guide”. URL: http://www.accelereyes.com/services/documentation

[4] Mark Harris, “Optimizing CUDA”. SuperComputing 2007 Tutorial, Reno, NV, USA. November 2007.

[5] V.Volkov and J.W.Demmel,“Benchmarking GPUs to Tune Dense Linear Algebra”. SC ’08: Proceedings of the 2008 ACM/IEEE conference on Supercomputing, pp. 1-11, Austin, Texas, USA, 2008.

[6] Torben’s Corner. Available at the Wiki of AccelerEyes at: URL:http://www.accelereyes.com/wiki/index.php?title=Torben’s_Corner.

[7] nVidia, “CUDA programming guide 1.1,” Available at http://developer.download.nvidia.com/ compute/cuda/1_1/NVIDIA_CUDA_Programming_Guide_1.1.pdf

[8] nVidia, “CUDA CUBLAS Library 1.1,” Available at http://developer.download.nvidia.com/ compute/cuda/1_1/CUBLAS_Library_1.1.pdf

[9] nVidia, “CUDA CUFFT Library 1.1,” Available at http://developer.download.nvidia.com/compute/ cuda/1_1/CUFFT_Library_1.1.pdf

[10] nVidia, “PTX: Parallel Thread Execution ISA Version 1.1”, Available at http://www.nvidia.com/ object/cuda_develop.html

[11] Buck, I., Foley, T., Horn, D., Sugerman, J., Fatahalian, K., Houston, M., and Hanrahan, P., “Brook for GPUs: Stream computing on graphics hardware.” Transactions on Graphics and Visualization vol. 23, no. 3, Aug. 2004.

[12] Tarditi, D., Puri, S., and Oglesby, J.. Accelerator: Using data parallelism to program GPUs for General- Purpose uses. In International Conference on Architectural Support for Programming Languages and Op- erating Systems (2006)

[13] McCool, M. and Toit, S.D., Metaprogramming GPUs with Sh. A K Peters, 2004.

[14] Mark, W.R., Glanville, R.S., Akeley, K., and Kilgard, M.J. “Cg: A system for programming graphics in a c-like language.” Transactions on Graphics and Visualization vol. 22, no. 3, pp. 896-907, 2003

[15] Matt Pharr, ed., GPU Gems 2, Addison-Wesley, 2005.

[16] Hubert Nguyen, ed., GPU Gems 3, Addison-Wesley, 2007.

[17] D. G ̈oddeke, GPGPU Basic Math Tutorial, tech. report 300, Fachbereic Mathematik, Universitt Dortmund, 2005



wav2letter++_最高效的语音识别系统

wav2letter++_最高效的语音识别系统

论文译文

外文原文题目:WAV2LETTER++: THE FASTEST OPEN-SOURCE SPEECH RECOGNITION SYSTEM

中文译文题目:WAV2LETTER++,最高效的开源语音识别系统

原文作者: Vineel Pratap, Awni Hannun, Qiantong Xu, Jeff Cai, Jacob Kahn, Gabriel Synnaeve, Vitaliy Liptchinsky, Ronan Collobert

所属单位:Facebook AI Research

译文作者:岳昕阳

所属单位:重庆劳格科技有限公司

原文发表于:Cornell University网站

https://arxiv.org/abs/1812.07625

版权所有 非授权谢绝转载    





摘 要

这篇论文将会介绍当前最高效的基于深度学习的语音识别架构——wav2letter++。wav2letter++完全由C++语言编写并使用了能最大化提升效率的ArrayFire张量库。本文将介绍wav2letter++系统的整体框架与设计并将其与其他现存常见的主要的开源语音识别系统相比较。比较后可以发现在一定情况下wav2letter++比其他已经经过优化的端到端语音识别神经网络训练速度快超过两倍以上。我们同样会展示在对一亿个参数的模型进行训练测试时,wav2letter++的训练次数最多线性扩展到了64GPU。高性能结构可以加快迭代速度,而迭代速度很多时候又是直接关乎研究与训练新的数据库或任务模型的成功率的重要参数。

关键词:语音识别,开源软件,端到端





1. 介绍

随着大众对于自动语音识别(automatic speech recognition,ASR)技术关注的不断加强,在众多开源软件社区中语音识别软件系统与工具包软件激增。其中包括Kaldi[1]、ESPNet[2]、OpenSeq2Seq[3]和Eesen[4]。经过过去十年的发展,这些框架已经从传统的基于隐马尔可夫模型(Hidden Markov Models,HMM)和高斯混合模型(Gaussian Mixture Models,GMM)发展到基于端到端的神经网络模型。许多当前的ASR工具包都不是基于声音单位(phonemes)的而是使用基于图形单位(graphemes)的端到端声学建模。本文章所介绍的ASR工具包也是如此。产生这样的转变主要有以下两方面原因:首先,端到端模型十分简单;其次,此模型与HMM/GMM系统之间原有的精确度差距正在急剧缩小。


C++是当前世界上第三广泛使用的编程语言,能够完全控制高性能任务关键型系统的所有资源。更重要的是,C++中所具有的静态数据类型可以在对大规模程序进行编译时捕捉所有协议不匹配错误(contract mismatches)。不仅如此,事实上几乎所有编程语言都可以轻松调用本地库(native libraries)。尽管在机器学习领域采用C++语言会遇到一定的困难,例如在主流框架里缺少经过完善定义的C++应用程序编程接口(API)以及在工作中C++几乎都被应用于关键性能组件方面而不是机器学习方面,由于常用语言的不同可能导致的学习成本增加等问题。但是随着机器学习代码库变得愈加庞大,在脚本语言与C++之间来回切换也变的愈发困难且容易出错。与此同时,随着现代C++的发展,只要有足够的库支持C++语言的编程速度和脚本语言的编程速度之间已经没有太大的差距。在本文中,我们将介绍第一款完全由C++语言开发的开源语音识别系统。 我们利用现代C++语言对机器学习系统进行的设计可以在不牺牲编程简易度的情况下保持软件的高效率与高可扩展性。在本工作中,我们主要将聚焦于例如训练时间、解码速度与可扩展性等ASR系统的技术方面。


接下来,我们将在第二节讨论wav2letter++的具体设计;在第三节大致讨论其他现存主要的开源系统;并在第四节中将这些系统与我们的系统进行比较。




2.设计

wav2letter++的设计主要需要满足三项需求。首先,工具包必须可以在包含数千小时语音数据的数据库中高效的训练模型。第二,必须能尽量简单地合并与表达新的网络结构和损失函数,尽可能简化其他代码操作。第三,从模型研究到模型部署的路径应该在保证研究的灵活性的基础上尽量做到简洁、直白并尽可能减少对新代码的需求。



2.1ArrayFire张量库

我们之所以采用ArrayFire作为张量操作的库主要是有以下几个原因:首先,ArrayFire是一种可以执行多种后端包括CUDA GPU后端和CPU后端的已经经过了高度优化的张量库。其次,ArrayFire使用即时代码生成技术(just-in-time code generation,也被称为惰性编译技术,lazy evaluation)来将数条简单的操作合并成一条内核调用,这可以加快内存带宽限制操作的执行速度并减少峰值内存的使用时间。另一个ArrayFire的重要特点是它具有简单的阵列构建与操作界面。与其他同样支持CUDA的C++张量库相比,ArrayFire界面不那么冗长且更少的依赖C++特性。

enter image description here

图1 wav2letter++库结构



2.2数据准备与特征提取

我们的特征提取支持多种音频文件格式(例如wav、flac.../mono、stereo/int、float)和数种特征类型,包括原始音频、线性可扩展功率谱、log-Mels(MFSC)和MFCC等。我们使用FFTW库来计算离散傅里叶变换。wav2letter++的数据加载过程是先进行动态特征计算,再进行网络评估,再加上完全端到端管道可以以单二进制文件运行,这让搜索替代特征更加简单,并使得本设计允许动态数据扩充,让模型部署变得更加简单。为了在训练模型时提高效率,我们采取并行异步的方式来加载和解码音频文件以及计算特征。对于我们已经尝试过的模型与批量大小来说,花费在数据加载上的时间是可以忽略不计的。



2.3模型

我们支持数种端到端模型。每个模型分别由“网络”和“标准”两部分组成。“网络”部分是只与输入有关的函数而“标准”部分是与输入和靶转录(target transcription)都有关的函数。与“网络”部分总是有参数不同,“标准”部分的函数并不一定有参数。这种抽象概念允许我们可以很轻松的利用相同的训练管道训练不同的模型。支持的标准包括基于神经网络连接的时序分类(Connectionist Temporal Classification,CTC)[7],原始wav2letter的AutoSegCriterion(ASG)[8],和拥有注意力算法的序列到序列模型(S2S)[9,10],其中CTC标准没有参数而ASG和S2S模型都包含可被学习的参数。与此同时,我们注意到由于像ASG和CTC这样的损失函数可以在C++中被高效使用,添加新的序列标准变得十分简单。我们同样兼容支持大量网络框架与激活函数,这里就不再一一列举。


我们用更高效的cuDNN算法扩展了核心ArrayFire CUDA后端,在cuDNN提供的众多程序中主要使用1D和2D卷积以及RNN程序。由于使用的网络库提供动态图型构造与自动微分功能,我们不用费多大劲就能进行类似新建层这样的基本操作。后文将举出一个例子展示如何建立与训练一个拥有二进制交叉熵损失的一层MLP(如图2),以此来论证C++界面的简易性。

enter image description here

图2 例:由二进制交叉熵和SGD训练的单隐藏层MLP,使用自动微分。



2.4训练与扩展

我们的训练管道为使用者使用不同的特征、框架与优化参数进行实验提供了最大程度的灵活性。训练程序可以在三种模式下运行:-train(平启动(flat-start)训练),continue(从检查点位置继续)和fork(例如转移学习)


此设计支持标准优化算法包括SGD和其他常用的基于梯度的优化器。我们通过数据并行同步SGD将wav2letter扩展为一个更大的数据库。使用英伟达多GPU通信库(NVIDIA Collective Communication Library,NCCL2)实现进程内通信。


为了尽可能减小进程间等待时间并提升单一进程工作效率,我们会在建立训练批次前对数据库中的数据按输入长度进行分类。



2.5解码

wav2letter++使用的解码器是经过数次提升效率优化的柱状搜索解码器,与文献[13]使用的相同,包含了来自语言模型与词语插入项的限制。解码器接口接收来自声学模型的输出与转换(如果相关)。我们同时为解码器设置了一个包含词语字典和语言模型的字典树。此解码器支持所有拥有解码器所需接口的语言模型,包括N元语言模型(n-gram LMs)和无状态参数语言模型(stateless parametric LM),并为N元语言模型提供基于KenLM的简易封装。




3. 相关工作

我们对其他常用开源语音识别系统做了一个简要概括,包括Kaldi[1],ESPNet[2]和OpenSeq2Seq[3]。卡迪语音识别工具包(The Kaldi Speech Recongnition Toolkit,Kaldi)目前是上述系统中出现时间最早的,它拥有一套独立式命令行工具包。Kaldi支持HMM/GMM与混合式基于HMM/NN的声学模型并包含基于电话的菜单(phone-based recips)。


端到端语音处理工具包(End-to-End Speech Processing Toolkit,ESPNet)与Kaldi之间联系很紧密,ESPNet将Kaldi用来进行特征提取与数据预处理。ESPNet一般将Chainer[15]或PyTorch[16]用作后端来训练语言模型,虽然主要用Python编写,但与Kaldi风格相同,高级工作流程采用实用脚本程序(bash scripts)编写。虽然这样便于系统组件的解耦,但同时也缺乏拥有静态类型的面向对象的编程语言所具有的类型安全、可靠性高和交互界面直观等优点。ESPNet具有同时拥有基于CTC的和基于注意力的解码译码器以及结合这两个标准的混合模型的特点。


OpenSeq2Seq与ESPNet类似,都具有基于CTC和拥有编码器解码器模型的特点,且都是用Python编写的,都使用TensorFlow作为后端而不使用PyTorch。若要处理高级工作流,OpenSeq2Seq同样依赖于调用Perl和Python脚本的实用脚本程序。OpenSeq2Seq系统的一个值得注意的特点是它支持混合精度训练。而且,ESPNet和OpenSeq2Seq支持文本到语音模型(Text-To-Speech,TTS)。


表1描述了这几个开源语音识别系统的具体情况。如表所示,wav2letter++是唯一一个完全使用C++编写的系统,它事实上可以很简单的和现存的用任何语言编写的应用程序整合到一起。由于它使用的C++语言具有静态变量且面向对象,所以它可以更好地适应大规模开发需求。在第四章中,我们可以看到它在与其他系统相对比时同样具有最大效率。与他形成对比的是类似Python这样的动态类型语言虽然可以提高原型设计的速度,但强制静态类型的缺失总是会妨碍大规模开发。 enter image description here

表1 主要开源语音识别系统




4.实验

在这一章我们将通过对比研究讨论ESPNet、Kaldi、OpenSeq2Seq和wav2letter++之间的表现差距,通过利用华尔街日报(WSJ)数据库中的大量词汇对自动语音识别系统进行工作评估。我们会测量训练中的平均历元时间以及平均语音解码延迟。来实验的机器硬件配置如下:每台机器配置装有八个NVIDIA Tesla V100 Tensor Core GPU的NVIDIA SXM2 模块和16GB内存,每个计算节点拥有两个Intel Xeon E5-2698 v4 CPU,总共40个核心,80个硬件线程,工作频率2.20GHz。所有机器通过100Gbps无线带宽网络进行连接。



4.1训练

我们通过扩展网络参数和增加GPU使用数量评估训练时间。我们考虑两种神经网络结构:循环结构网络,拥有三千万个参数;还有纯卷积模式,拥有一亿个参数。两种网络结构分别在图4的上下两幅图中做出了具体描述。


对于OpenSeq2Seq,我们同时考虑float32和混合精度float16训练。对于两种网络,我们使用40维log-mel滤波器组作为输入以及CTC作为标准(基于CPU的实现,CPU-based implementation)。


对于Kaldi,由于CTC训练标准在标准Kaldi菜单(recipes)中不可用,我们使用LF-MMI[19]标准。 所有模型都使用带动量(momentun)SGD进行训练。 我们使用的批次大小为每个GPU处理4条语音。每次运行限制每个GPU最多使用5个CPU核心。 图3可以提供关于训练管道主要组件的更多细节,图中展示单个GPU运行情况下在一个完整的历元时间内,对每个批次所消耗的时间进行的平均处理。


对于只有三千万个参数的更小的模型来说,就算是在单个GPU上运行wav2letter++也比第二优秀的系统快15%以上。需要注意的是由于我们使用的是8GPU设备,当我们需要进行16、32甚至64GPU实验的时候,需要引入多节点通信。但ESPNet并不支持多节点训练开箱即用(out-of-the-box)。我们通过使用PyTorch的DistributedDataParallel模式和NCCL2后端对它进行扩展。ESPNet依赖于对输入特征的预先计算,而wav2letter++和OpenSeq2Seq则由于对灵活性的需求而选择在程序运行过程中计算特征。在一些情况下,混合精度训练可以将OpenSeq2Seq的历元时间降低1.5倍以上,这项优化在未来也可以被运用在wav2letter++上。由于Kaldi的菜单在进行LF-MMI时无法同步SGD上传数据的梯度,导致每次历元花费的时间慢了20倍以上。(The Kaldi recipe for LF-MMI does not synchronize gradients for each SGD update; the per-epoch time is still more than 20x slower.)由于使用了不同的标准(LF-MMI)和优化算法导致难以进行比较,我们并没有把Kaldi包含进表4中。 enter image description here

图3 训练循环中主要步骤消耗毫秒数。



4.2解码

wav2letter++包含一个用C++实现的单通柱状搜索解码器(详见2.5节)。我们将此解码器与OpenSeq2Seq和ESPNet中可获得的其他柱状搜索解码器相比较。不把Kaldi引入比较主要是因为它内置了的基于WFST的解码器并不支持CTC解码。我们利用在LibriSpeech上通过Wave2Letter+训练的完全优化的OpenSeq2Seq模型产生完全相同的,经过预先计算的数据并传输给两个解码器,这样我们就可以得到在相同模型情况下的独立的实验结果数据。由于ESPNet并不支持N元语言模型解码,我们使用的4元LibriSpeech语言模型主要用来给OpenSeq2Seq与wav2letter++提供数据。在表2中,我们主要汇报了基于LibriSpeech dev-clean的单线程解码的解码时间与峰值内存使用,验证其误码率是否低于5%并记录每个框架最低可达到的误码率。我们对超参数进行了严格的调整这样报告就可以反映在报告误码率下最大可能达到的速度。最终结果显示,mav2letter++不仅比类似的解码器表现优秀一个数量级以上,还可以大量节约内存资源。

enter image description here

表2 基于LibriSpeech dev~clean的解码表现   enter image description here

图4 训练时间对比图。上方图是一个三千万参数RNN[12], 下方图是一个一亿参数CNN[13]。




5.结论

本论文主要介绍了wav2letter:一个用于开发端到端语音识别器的高速简单系统。其框架完全通过C++实现,这使得它不仅可以高效训练模型还可以进行实时解码。我们的初步实践与其他语音框架相比展现了极大的前景,而且wav2letter++可以在未来的进一步更新中持续优化。由于它简单且可扩展的界面,wav2letter++很适合成为端到端语音识别的快速研究平台。与此同时,我们依然保留了对基于Python的ASR系统进行优化的可能性,以使其缩小与wav2letter++的差距。




  .

参考文献

[1] Daniel Povey, Arnab Ghoshal, Gilles Boulianne, Lukas Burget, Ondrej Glembek, Nagendra Goel, Mirko Han- nemann, Petr Motlicek, Yanmin Qian, Petr Schwarz, et al., “The kaldi speech recognition toolkit,” in IEEE 2011 workshop on automatic speech recognition and understanding. IEEE Signal Processing Society, 2011, number EPFL-CONF-192584.

[2] Shinji Watanabe, Takaaki Hori, Shigeki Karita, Tomoki Hayashi, Jiro Nishitoba, Yuya Unno, Nelson En- rique Yalta Soplin, Jahn Heymann, Matthew Wiesner, Nanxin Chen, et al., “Espnet: End-to-end speech processing toolkit,” arXiv preprint arXiv:1804.00015, 2018

[3] Oleksii Kuchaiev, Boris Ginsburg, Igor Gitman, Vi- taly Lavrukhin, Carl Case, and Paulius Micikevicius, “Openseq2seq: extensible toolkit for distributed and mixed precision training of sequence-to-sequence mod- els,” arXiv preprint arXiv:1805.10387, 2018.

[4] Yajie Miao, Mohammad Gowayyed, and Florian Metze, “Eesen: End-to-end speech recognition using deep rnn models and wfst-based decoding,” in Automatic Speech Recognition and Understanding (ASRU), 2015 IEEE Workshop on. IEEE, 2015, pp. 167–174.

[5] James Malcolm, Pavan Yalamanchili, Chris McClana- han, Vishwanath Venugopalakrishnan, Krunal Patel, and John Melonakos, “Arrayfire: a gpu acceleration plat- form,” 2012.

[6] Matteo Frigo and Steven G. Johnson, “The design and implementation of FFTW3,” Proceedings of the IEEE, vol. 93, no. 2, pp. 216–231, 2005, Special issue on “Pro- gram Generation, Optimization, and Platform Adapta- tion”.

[7] Alex Graves, Santiago Ferna ́ndez, Faustino Gomez, and Ju ̈rgen Schmidhuber, “Connectionist temporal classifi- cation: labelling unsegmented sequence data with recur- rent neural networks,” in Proceedings of the 23rd inter- national conference on Machine learning. ACM, 2006, pp. 369–376.

[8] Ronan Collobert, Christian Puhrsch, and Gabriel Synnaeve, “Wav2letter: an end-to-end convnet- based speech recognition system,” CoRR, vol. abs/1609.03193, 2016.

[9] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Ben- gio, “Neural machine translation by jointly learning to align and translate,” arXiv preprint arXiv:1409.0473, 2014.

[10] Jan K Chorowski, Dzmitry Bahdanau, Dmitriy Serdyuk, Kyunghyun Cho, and Yoshua Bengio, “Attention-based models for speech recognition,” in Advances in neural information processing systems, 2015, pp. 577–585.

[11] Sharan Chetlur, Cliff Woolley, Philippe Vandermersch, Jonathan Cohen, John Tran, Bryan Catanzaro, and Evan Shelhamer, “cudnn: Efficient primitives for deep learn- ing,” arXiv preprint arXiv:1410.0759, 2014.

[12] Awni Hannun, Carl Case, Jared Casper, Bryan Catan- zaro, Greg Diamos, Erich Elsen, Ryan Prenger, San- jeev Satheesh, Shubho Sengupta, Adam Coates, et al., “Deep speech: Scaling up end-to-end speech recogni- tion,” arXiv preprint arXiv:1412.5567, 2014.

[13] Vitaliy Liptchinsky, Gabriel Synnaeve, and Ronan Col- lobert, “Letter-based speech recognition with gated con- vnets,” CoRR, vol. abs/1712.09444, 2017.

[14] Kenneth Heafield, “Kenlm: Faster and smaller language model queries,” in Proceedings of the Sixth Workshop on Statistical Machine Translation. Association for Com- putational Linguistics, 2011, pp. 187–197.

[15] Seiya Tokui, Kenta Oono, Shohei Hido, and Justin Clay- ton, “Chainer: a next-generation open source frame- work for deep learning,” in Proceedings of workshop on machine learning systems (LearningSys) in the twenty- ninth annual conference on neural information process- ing systems (NIPS), 2015, vol. 5, pp. 1–6.

[16] Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan, Edward Yang, Zachary DeVito, Zeming Lin, Alban Desmaison, Luca Antiga, and Adam Lerer, “Au- tomatic differentiation in pytorch,” 2017.

[17] Mart ́ın Abadi, Paul Barham, Jianmin Chen, Zhifeng Chen, Andy Davis, Jeffrey Dean, Matthieu Devin, San- jay Ghemawat, Geoffrey Irving, Michael Isard, et al., “Tensorflow: a system for large-scale machine learn- ing.,” in OSDI, 2016, vol. 16, pp. 265–283.

[18] Douglas B Paul and Janet M Baker, “The design for the wall street journal-based csr corpus,” in Proceedings of the workshop on Speech and Natural Language. Associ- ation for Computational Linguistics, 1992, pp. 357–362.

[19] Daniel Povey, Vijayaditya Peddinti, Daniel Galvez, Pe- gah Ghahremani, Vimal Manohar, Xingyu Na, Yim- ing Wang, and Sanjeev Khudanpur, “Purely sequence- trained neural networks for asr based on lattice-free mmi.,” in Interspeech, 2016, pp. 2751–2755.

利用控制面板控制会议及成员状态

利用控制面板控制会议及成员状态

点击所有会议界面上的管理按钮,选择“进入房间”。

enter image description here

在会议房间内,创建者和管理员可以点击控制面板,对会议进行一些开始会议、结束会议、全员静音、开始录音等等操作。

enter image description here

点击开始会议,此时被邀请的成员的SparkleComm 客户端会弹出会议电话,成员可以选择接通还是挂断,如果成员的SparkleComm账号具有落地电话功能,那么当成员未接通会议来电时,系统将自动给该成员对应的手机号进行呼叫。如果您想为您的SparkleComm账号天机落地电话权限,请登录我们的官网www.loogear.com并与我们取得联系。

除了可以呼叫整体,还可以通过点击管理成员,对会议中的单个成员进行呼叫、静音、删除等操作,也可以邀请新的成员加入本次会议(只有创建者和管理员有权限)。成员只能呼叫自己和挂断自己,不能开始会议\结束会议、全体静音等。 管理员和创建者视图:

enter image description here

成员视图:

enter image description here

创建者(拥有者)和管理员开始会议之后,系统默认对本次会议进行录音,录音记录可在历史会议的会议详情中查看。

enter image description here

为现代工作而设计的 VoIP电话

为现代工作而设计的 VoIP电话

SparkleComm为每个企业提供动力的 VoIP 服务。

基于云的商务电话系统是一种完全在互联网上运行的高级电话系统。如果您连接到 PSTN,VoIP 会将您的模拟语音信号转换为数字数据包,反之亦然。

使用 IP 语音,您的数据被压缩并通过数字网络发送。要开始使用云电话系统,您只需要一个可靠的 VoIP 提供商,例如 SparkleComm

通话功能——不仅仅是拨号音。

与 VoIP、视频和聊天的统一通信
全国范围内语音通话、消息
24/7 全天候支持的惊人服务
免费免费电话、虚拟语音信箱和自动助理

流动性——随时随地工作。

兼容 iOS 和 Android 终端的移动应用
适用于 Windows 和 Mac 的易于使用的桌面应用程序
从您的移动设备发送消息
从您的手机一键式电话会议

会议——电话会议

主持无限的音频和视频会议
带有消息和屏幕共享的音频会议
为您的所有会议提供专用会议桥
清晰的高清音频,在线无静电
带通话录音的高级 VoIP 会议

合作——将团队聚集在一起。

使用您的商务电话软件进行协作
创建群组以通过聊天、视频和音频进行连接
聊天、屏幕共享和文件共享变得简单

集成——集成您团队的工具。

将您的商务电话软件与其他应用程序集成
通过连接您的 CRM 和 VoIP 系统来提高效率
与第三方软件等轻松集成
单击以在业务应用程序中拨打电话号码
改善您的业务沟通
为什么使用网络研讨会来改善客户体验?

为什么使用网络研讨会来改善客户体验?

什么造就了出色的客户体验?

首先,什么是客户体验?客户体验是指您的客户与您的品牌互动的整体体验。当某人建立对公司的第一印象时,每次互动都很重要,从第一次访问您的网站、加载需要多长时间等,到与支持团队的对话以及您交付产品的速度。买家体验好不好,决定了他们是否会回来。

为什么通过提供出色的体验来留住客户很重要?因为已经向你购买的人是未来潜在收入的最佳来源。保留率增加 5% 可能会带来 25%-95% 的额外利润。此外,50% 的买家表示,现在客户体验对他们来说更重要。完美的客户体验使买家很容易实现使用您的产品或接受您的服务的目标。有趣的是,SparkleComm 网络研讨会可以成为客户体验的有用部分。

enter image description here

为什么使用网络研讨会来改善客户体验?

使用SparkleComm 网络研讨会来提升客户体验是合乎逻辑的。早在 2020 年,  96% 的用户就 增加了观看在线视频的时间。此外,十分之九的人会寻找更多他们喜欢的品牌的视频。 预计到2022年,用户平均每天将花费100分钟观看各种视频。同样 积极的视频统计数据 也适用于 B2B 营销。

SparkleComm 网络研讨会不仅仅是销售渠道的一部分,您可以在其中提供一些有用的信息并将其余的视频用于销售您的产品和服务。各种在线会议、现场课程和虚拟培训也可以视为网络研讨会

SparkleComm 网络研讨会对企业的用处现在更清楚了。那么,为什么要使用它们?简单。教育您的客户以明智和富有成效的方式使用您的产品和服务。这种方法将:

提高客户满意度 提高留存率 建立信任 提高客户忠诚度。

从长远来看,教育材料和实用建议可以成为您品牌的一部分,并提高品牌知名度和对公司的信任。

如何给网络研讨会定价

如何给网络研讨会定价

SparkleComm 网络研讨会定价并不像 ABC 那样简单。这是因为在确定最适合的价格时需要考虑许多因素。您可以问自己几个问题以找到正确的平衡点:

你的听众是谁? 你的内容是什么? 您使用的是什么网络研讨会平台? 让我们更详细地讨论它们。

你的听众

你的目标受众是谁?你不会向一群学生收取与一群企业大亨相同的价格。不仅因为他们的赚钱能力,还因为你将为他们提供的价值水平。与企业大亨相比,学生可能在不同程度上感知价值,企业大亨不仅代表自己,还代表整个组织。经验法则是,您的观众越富裕,您的SparkleComm 视频会议的价格就应该越高。

enter image description here

您的内容

即使大公司可能有钱可以花钱,你仍然应该对你的内容的价值持现实态度。提前做好市场调查。看看你的竞争对手在做什么,看看是否有什么让你与众不同。问问自己:相比之下,您的业务主张有多独特?

您是否提供以其他方式难以获得的专业知识?你有独到的观点或教学方法吗?为什么你可以为你的观众提供他们自己无法通过百度搜索的东西?在开始定价之前先回答这些问题。

您的平台

另一个需要考虑的重要事情是网络研讨会软件本身。您的目标受众是否必须购买软件才能参加您的网络研讨会?您对网络研讨会SparkleComm 参会者的数量有限制吗?与您的平台相关的许多因素都会影响成本和定价。重要的是要考虑您的平台对用户的友好程度,因为您的SparkleComm 参会者不会愿意为给他们带来压力的平台上的网络研讨会支付高昂的费用。

考虑定价策略

定价策略主要有三种:成本加成、市场导向和价值导向。在确定网络研讨会的价格时,您应该考虑所有这些因素。 首先,仔细监控您在创建SparkleComm 网络研讨会上花费了多少时间。当然,时间不等于质量,但如果您进行了深入研究并找到了创新的教学和演示方法,那么将价格保持在太低是不公平的。因此,不要害怕根据您致力于提高SparkleComm 网络研讨会质量的时间来提高定价。

其次,看看竞争对手的收费是多少。这并不意味着您应该盲目地采用他们的价格。他们可能有比你更好或更差的价值主张,在这种情况下,价格不可能相同。本质上,仅将他们的价格用于分析和比较目的,以帮助您根据所提供的产品确定最好的价格。 

最后也是最重要的,知道你给观众带来了什么价值。如果您的报价确实是独一无二的,您会找到您的付费观众,即使价格比市场上高一点。人们总是愿意为高价值付费,尤其是现在任何人都可以在没有任何专业知识或真正价值的情况下醒来并发布内容。当您从人群中脱颖而出时,为您的网络研讨会定价将不会是一件麻烦事。

我们相信您会成功,Loogear SparkleComm服务是您理想网络研讨会的绝佳平台。