一幅GAN网络创造的肖像图卖了40万美金,但那又怎样?

摘要: 价值不菲的艺术创造到底是否能被科技代替?在2018年一场著名的拍卖会上,一部AI制作的肖像以432,500美元的价格成交!这篇新闻在科技媒体上被广泛讨论,有些人认为这一事件对人类艺术家构成了威胁。其实,这只是深度学习快速发展中众多不可思议的案例中的一个,这些故事创造了关于人工智能的耸人听闻的头条新闻,或者是说人工智能表现出与人类同等的艺术创造力。一些言论:“人工智能写作已经到来”,“人工智能很快就能写出比人类更好的小说”等等在网络上大量出现。事实上,与任何其他技术创新一样,人工智能或者更具体地说机器学习和深度学习将影响我们创造音乐,艺术和文学的方式。但是在过去的一年里,我研究了这个领域并与参与开发和使用产生艺术作品的人工智能技术的艺术家和工程师进行了交谈,了解到了关于人工智能在艺术创造发明的应用及艺术家对它的看法。发现深度学习并不是人类创造力的替代!即使一个AI创意成功售价数十万美元。人与机器艺术的区别要理解深度学习对人类创造力的影响,我们必须首先理解人工智能与人类在产生艺术之间的差异。尽管人类思维,其技术较旧,处理能力较慢且存储不稳定,但在创建艺术作品时,人类思维过程比最先进的AI算法要复杂得多。当你画一幅画,创作一首歌,写一部小说(甚至是这篇博文)时,你的生活经历、文化、宗教、政治和社会倾向都会混合成一堆混乱的情绪和化学反应,影响到你的工作。因为我们对我们的大脑知之甚少,所以我们无法真正理解人类的创造过程,人类艺术的每一项工作本身都是独一无二的。试图重现它实际上就像一个人能两次踏进同一条河流。相反,我们非常清楚AI算法如何生成视觉、音频和文本数据,即使它们的内部工作机制有时会困扰我们。最近人工智能创新的核心是神经网络,这种复杂结构特别擅长检查和匹配模式以及对信息进行分类。各种艺术和音乐生成工具中使用的深度学习技术也各不相同,但是已经变得非常流行的一种特定技术是生成性对抗网络(GAN)。GAN涉及两个神经网络,一个用于生成新数据,另一个用于评估第一个输出,以查看它是否通过了特定类别的数据。例如,如果分类器网络已经学习了足够的爱尔兰民间音乐样本,它将能够告诉你一个新的音乐音符序列是否属于爱尔兰民俗类。因此,爱尔兰音乐GAN将有一个生成器网络创建音乐样本并通过分类器运行它们以查看它是否作为爱尔兰音乐传递。如果结果不令人满意,则生成器修改数据,通过分类器重新运行并重复该过程,直到后者将其评定为可接受的爱尔兰音乐样本。我们可以应用相同的方法来创建各种数据。去年,图形芯片巨头Nvidia使用GAN为不存在的人创造逼真的图像。最近,一个开发团队使用GAN创建了一幅画,售价超过40万美元。一些不法分子则使用GAN创造出名人和政治家的假色情片。但是我们要清楚,神经网络和分类器都不知道他们正在创造的数据内容,以及它的艺术价值或它可能对其他人造成的潜在伤害。这些内容是没有情感,没有灵感和想象力的火花。GAN和其他所有表现创造力的深度学习或人工智能技术都是使用数学和统计学来创建数据并将它们与之前看到的其他样本进行比较。深度学习将自动完成一些创造性任务我们不得不承认深度学习和神经网络在创作艺术、音乐和文学作品方面的局限性,但是如果说艺术创造力肯定不会自动化是不对的。像人工智能影响的其他行业一样,人类的创造力必然会受到一些破坏。至少,我们必须重新思考我们对创造力的定义。我在与不同专家的谈话中得出的结论是,深度学习将使某些形式的艺术自动化。例如“功能音乐”:我们在演示广告和一些更简单的视频游戏的背景中播放的音频类型,可以通过神经网络自动化,神经网络根据用户提供的输入参数生成新的音乐序列,这些输入可以是风格,节奏和心情等。目前有几家公司已经开发或正在开发类似的AI应用程序,他们的产品市场非常丰富。很容易看到类似的发展在视觉艺术领域发生,其中AI算法可以为视频和演示的背景创建独特的功能视觉效果。但功能艺术可能并不完全被视为创意内容。它们旨在帮助用户专注于其他内容,例如演示文稿或视频的内容。“我们认为功能性音乐是一种因其用例而受到重视的音乐,而不是制作它的创造力。”纽约人工智能创业公司Amper Music的首席执行官兼联合创始人Drew Silverstein说。但西尔弗斯坦解释说:艺术音乐“更多的是关于这个过程而不是用例。”然而,有些人正在以创造功能性音乐和艺术为生。他们的工作自动化会发生什么?深度学习将增强人类的创造力功能艺术仅占整个行业的一小部分,更广泛的AI行业深度学习进步的真正发展是人类能力的提升。事实上是神经网络和深度学习将使更多人更容易变得富有创造力。现在已经有不同的深度学习工具有助于提高业余爱好者和专业艺术家的创造性技能。例如,神经网络可以绘制并修改一幅画以使其具有梵高或毕加索风格。另一个例子是Google开发的一种工具,它使用机器学习来检查粗略的草图并将其转换为清晰的图纸。在更专业的层面上,深度学习可以帮助艺术家找到新的想法并加快他们的创作过程。去年,我写了一篇关于folk-rnn的文章,这是一个创造爱尔兰凯尔特音乐的深度学习应用程序。我与爱尔兰音乐家兼作曲家达伦巴纳尔斯进行了交谈,他告诉我,虽然他对一些作品有好感并且感到惊讶,但显然它们仍需要添加一些人性才能完成。他并不担心神经网络可以取代他的工作,有趣的是中间会出现一些他想不到的新想法。巴纳尔斯希望像folk-rnn这样的工具可以帮助他完成工作。“当我不得不开始大规模的作曲时,我总觉得这很令人生畏。也许我可以给计算机一些参数:玩家的数量、心情、甚至我最喜欢的作曲家的名字,它可以为我生成一个基本结构。我不希望它开箱即用,但这将是一个起点!”巴纳尔斯说。在文学领域,即使人工智能对人类语言的理解有限,但深度学习也会在帮助专业作家方面找到一些有趣的用例。本月“纽约时报”刊登了一个故事,描述了作家如何使用机器学习来寻找他的写作思路和完成句子的建议。软件背后的技术细节并不多,并且使用的技术是自然语言处理和生成(NLP/NLG)人工智能的一个分支,帮助计算机分析和创建人类文本。同样,这里没有涉及创造力,只有统计模式匹配和预测。但就像民谣一样,NLP/NLG有时会提出作者不会想到的有趣想法。在某些方面,比如说作为独立业务模型的出现应用程序编程接口(API)。API并没有让程序员的失业,但他们使更多没有任何编程背景的人能够开发应用程序。我在去年12月采访过的Spotify创造者技术研究实验室主任弗朗索瓦·帕切特(Francois Pachet),他将创造性人工智能工具与80年代的数字合成器进行了比较,当时人们担心计算机会导致音乐家失去工作,但恰恰相反,数字合成器在某种意义上说,使每个人都带上量这些新的机器和硬件且学会了如何有效地使用它们,音乐界也因此得到了快速发展。为什么AI不会取代人类的创造力人工智能技术将继续改进并更好地模仿人类的创造力。在某些时候,它甚至可能创造出与人类艺术家无法区分的音乐和艺术。但是,使艺术品有价值的东西不一定是输出。大多数时候,了解人类成就的过程和劳动与最终结果同样重要和珍贵。一台机器人可以在很短时间内被训练为投篮大师,同样一个职业篮球运动员需要花费几十年才会成为投篮大师。此外,如果你做了一些更新,教给机器人一个新的技能,你可以迅速将其推广到所有类型,这是人类无法做到的。但我们对人类运动员的欣赏不仅仅是他们在场上的统计数据和表现,我们应该更欣赏他们的坚持和努力。同样,我们应该欣赏音乐家、艺术家、作家以及每个创造性人类的故事,因为他们的个人努力,他们克服生活的挑战,并从他们所经历的一切中寻找灵感。这是人类艺术的真正本质,即使我们实现了始终难以捉摸的一般人工智能,这也是无法自动化的。让我写这篇文章的原因是关于在拍卖会上出售的GAN画作的故事。但有趣的是,创造GAN开发者对这件事的评价(生成式对抗网络的发明者Goodfellow称这是一个有趣的转折)。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 21, 2019 · 1 min · jiezi

一份关于机器学习端到端学习指南

摘要: 本文是一份关于机器学习端到端过程的指导指南,其中列出了实现机器学习模型所需遵循的步骤及对应的参考文章;人工智能、机器学习已经火了有一阵了,很多程序员也想换到这方向,目前有关于深度学习基础介绍的材料很多,但很难找到一篇简洁的文章提供实施机器学习项目端到端的指南,从头到尾整个过程的相关指南介绍。因此,个人在网上搜集到了许多有关于实施机器学习项目过程的文章,深入介绍了如何实现机器学习/数据科学项目的各个部分,但更多时候,我们只需要一些概括性的经验指导。在我不熟悉机器学习和数据科学的时候,我曾经寻找一些指导性的文章,这些文章清楚地阐述了在项目的某些步骤时候我需要做什么才能很好地完成我的项目。本文将介绍一些文章,旨在为成功实现机器学习项目提供一份端到端的指南。基于此,闲话少叙,下面让我们开始吧简而言之,机器学习项目有三个主要部分:第一部分是数据理解、数据收集和清理,第二部分是模型的实现,第三部分是进行模型优化。一般而言,数据理解、收集和清理需要花费整个项目60-70%的时间。为此,我们需要该领域专家。场景假设现在假设我们正在尝试一个机器学习项目。本文将为你提供实施项目可以遵循的步骤指南,确保项目成功。在项目开始时,我们的大脑中肯定会出现多个问题:比如:如何开始这个项目?需要开发者或者统计学者?选择何种语言进行开发?数据集是否干净?各种依赖包是否安装齐全正确?项目问题是回归还是分类问题?应该采取何种机器学习方法?如何调参?机器学习项目简单来讲是一种试错过程,整个研究过程和递归过程比较类似,是一种不断试错寻找更优解法的过程。该过程同时也是实践和理论的结合,对相关研究领域的专业知识有所要求,完成每个项目后也会提升个人的战略技能,从事该领域的研究人员需要掌握统计相关的知识以及具备一定的编程能力。最重要的是,机器项目会教会你保持耐心,每做完一次实验后,都会分析实验结果,进而寻找到更优的答案(调参)。步骤必须进行的两个步骤:1.确保你了解机器学习是什么以及它的三个关键领域。可以阅读下面这篇文章:8分钟了解机器学习机器学习是现在,也是未来。所有的技术人员、数据科学家和金融专家可以从中受益,同时,如果上述这些人员在之后的日子不对该项技术有所涉猎的话,很可能会被时代所淘汰。2.选择合适的编程语言。需要熟练掌握Python,请点击阅读:从零开始学pythonPython是数据分析和机器学习最流行的编程语言中的一种,并且有很多封装好的工具包可供我们调用,实现起来相对而言比较简单。开始实施1.选择合适的机器学习算法。如何选择合适的算法可以参考下面这篇文章:机器学习算法大乱斗 现实中,不管是工业界,亦或是学业界,都有大量的机器学习算法可供使用。上述文章中将分析典型的机器学习算法各自的优缺点,及针对的具体问题。 到目前为止,你可能已经理解了你需要解决的项目问题是有监督问题还是无监督问题。 然而,机器学习不像经典的程序设计一样(给定一个输入,其输出是固定), 机器学习总有可能找到另外一个正确的答案。比如,预测问题中通常有多个正确的答案。2.如果这是一个有监督的机器学习问题,那么请确保你了解该项目是回归还是分类问题。想弄清楚这点可以阅读下面这篇文章:有监督的机器学习:回归与分类在上述文章中,将阐述有监督学习中回归问题和分类问题之间的关键差异。3.如果是时间序列回归问题,则在预测时间之前使时间序列数据保持不变。具体做法参考下面这篇文章:我是如何预测时间序列?预测、建模和推导时间序列在许多领域越来越受欢迎。时间序列一般用于预测未来。4.找出一种预先测量算法性能的方法。如何确定评测指标可以参考下面这篇文章:每个数据科学家必须知道的数学度量方法每个数据科学家都需要了解大量的数学度量方法,比如准确度、AUC。5.测量时间序列回归模型的性能。可以参考下面这篇文章:搭建的预测模型性能有多好——回归分析预测是计量经济学和数据科学中的一个重要概念,它也广泛用于人工智能中。6.调查是否需要使用ARIMA模型。详细内容请参考下面这篇文章:了解差分整合移动平均自回归模型——ARIMA 在文章“如何预测时间序列?”中,提供了关于时间序列分析的相关概述。这篇文章的核心是了解ARIMA模型。7.如果是无监督的机器学习问题,那么需要了解群集是如何工作和实施的。详细内容请参考下面这篇文章:无监督机器学习:聚类和K均值算法上述文章解释了聚类在无监督机器学习中的工作原理。8.探索神经网络和深度学习,看看它是否适用于你的问题。详细内容请参考下面这篇文章:了解神经网络:从激活函数到反向传播上述文章旨在阐述神经网络的基本概述,讲解基本概念,包含激活函数、反向传播算法。9.丰富你的特征集合,对其进行缩放、标准化和归一化等。详细内容请参考下面这篇文章:处理数据以提高机器学习模型的准确性有时我们会建立一个机器学习模型,用我们的训练数据训练它,当我们训练好后进行预测时,效果并不是很理想,有部分原因是数据集存在脏数据或不够全面,因此需要对数据进行进一步的处理,比如数据清洗、增强等。干净的数据=良好的结果。10.减少特征尺寸空间。详细内容请参考下面这篇文章:在数据科学中,什么是降维?虽然现在是大数据时代,有很多的数据可供使用,大量数据可以促使我们创建一个预测模型,但数据量不是越大越好,而是越精越好。如果在丰富特征并减小尺寸后,模型没有产生准确的结果,那么需要重新调整模型的参数。11.微调机器学习模型参数。详细内容请参考下面这篇文章:如何微调机器学习模型以提高模型的预测准确性?微调机器学习预测模型是提高预测结果准确性的关键步骤。这个过程有些枯燥,需要一些耐心和运气。始终确保模型不会过拟合或欠拟合。12.最后,重复这些步骤,直到获得准确的结果:丰富模型特征;微调模型参数;始终对数据集进行分析,看看是否缺少任何的重要信息,在看到问题时解决问题,但在开始进行新的实验前,始终需要备份并保存你前一份的工作内容,这是一个好的习惯么,因为你可能需要返回上一步再一次进行其它的实验。机器学习在本质上是回溯过程。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 18, 2019 · 1 min · jiezi

阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算

摘要: 由阿里巴巴统一大数据计算平台MaxCompute研发团队,历经1年多研发,打破大数据、科学计算领域边界,完成第一个版本并开源。 Mars,一个基于张量的统一分布式计算框架。使用 Mars 进行科学计算,不仅使得完成大规模科学计算任务从MapReduce实现上千行代码降低到Mars数行代码,更在性能上有大幅提升。日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发。此前,早在2018年9月的杭州云栖大会上,阿里巴巴就公布了这项开源计划。Mars 突破了现有大数据计算引擎的关系代数为主的计算模型,将分布式技术引入科学计算/数值计算领域,极大地扩展了科学计算的计算规模和效率。目前已应用于阿里巴巴及其云上客户的业务和生产场景。本文将为大家详细介绍Mars的设计初衷和技术架构。*概述科学计算即数值计算,是指应用计算机处理科学研究和工程技术中所遇到的数学计算问题。比如图像处理、机器学习、深度学习等很多领域都会用到科学计算。有很多语言和库都提供了科学计算工具。这其中,Numpy以其简洁易用的语法和强大的性能成为佼佼者,并以此为基础形成了庞大的技术栈。(下图所示)Numpy的核心概念多维数组是各种上层工具的基础。多维数组也被称为张量,相较于二维表/矩阵,张量具有更强大的表达能力。因此,现在流行的深度学习框架也都广泛的基于张量的数据结构。随着机器学习/深度学习的热潮,张量的概念已逐渐为人所熟知,对张量进行通用计算的规模需求也与日俱增。但现实是如Numpy这样优秀的科学计算库仍旧停留在单机时代,无法突破规模瓶颈。当下流行的分布式计算引擎也并非为科学计算而生,上层接口不匹配导致科学计算任务很难用传统的SQL/MapReduce编写,执行引擎本身没有针对科学计算优化更使得计算效率难以令人满意。基于以上科学计算现状,由阿里巴巴统一大数据计算平台MaxCompute研发团队,历经1年多研发,打破大数据、科学计算领域边界,完成第一个版本并开源。 Mars,一个基于张量的统一分布式计算框架。使用 Mars 进行科学计算,不仅使得完成大规模科学计算任务从MapReduce实现上千行代码降低到Mars数行代码,更在性能上有大幅提升。目前,Mars 实现了 tensor 的部分,即numpy 分布式化, 实现了 70% 常见的 numpy 接口。后续,在 Mars 0.2 的版本中, 正在将 pandas 分布式化,即将提供完全兼容 pandas 的接口,以构建整个生态。 Mars作为新一代超大规模科学计算引擎,不仅普惠科学计算进入分布式时代,更让大数据进行高效的科学计算成为可能。Mars的核心能力符合使用习惯的接口Mars 通过 tensor 模块提供兼容 Numpy 的接口,用户可以将已有的基于 Numpy 编写的代码,只需替换 import,就可将代码逻辑移植到 Mars,并直接获得比原来大数万倍规模,同时处理能力提高数十倍的能力。目前,Mars 实现了大约 70% 的常见 Numpy 接口。充分利用GPU加速除此之外,Mars 还扩展了 Numpy,充分利用了GPU在科学计算领域的已有成果。创建张量时,通过指定 gpu=True 就可以让后续计算在GPU上执行。比如:a = mt.random.rand(1000, 2000, gpu=True) # 指定在 GPU 上创建(a + 1).sum(axis=1).execute()稀疏矩阵Mars 还支持二维稀疏矩阵,创建稀疏矩阵的时候,通过指定 sparse=True 即可。以eye 接口为例,它创建了一个单位对角矩阵,这个矩阵只有对角线上有值,其他位置上都是 0,所以,我们可以用稀疏的方式存储。a = mt.eye(1000, sparse=True) # 指定创建稀疏矩阵(a + 1).sum(axis=1).execute()系统设计接下来介绍 Mars 的系统设计,让大家了解 Mars 是如何让科学计算任务自动并行化并拥有强大的性能。分而治之—tileMars 通常对科学计算任务采用分而治之的方式。给定一个张量,Mars 会自动将其在各个维度上切分成小的 Chunk 来分别处理。对于 Mars 实现的所有的算子,都支持自动切分任务并行。这个自动切分的过程在Mars里被称为 tile。比如,给定一个 1000 2000 的张量,如果每个维度上的 chunk 大小为 500,那么这个张量就会被 tile 成 2 4 一共 8 个 chunk。对于后续的算子,比如加法(Add)和求和(SUM),也都会自动执行 tile 操作。一个张量的运算的 tile 过程如下图所示。延迟执行和 Fusion 优化目前 Mars 编写的代码需要显式调用 execute 触发,这是基于 Mars 的延迟执行机制。用户在写中间代码时,并不会需要任何的实际数据计算。这样的好处是可以对中间过程做更多优化,让整个任务的执行更优。目前 Mars 里主要用到了 fusion 优化,即把多个操作合并成一个执行。对于前面一个图的例子,在 tile 完成之后,Mars 会对细粒度的 Chunk 级别图进行 fusion 优化,比如8个 RAND+ADD+SUM,每个可以被分别合并成一个节点,一方面可以通过调用如 numexpr 库来生成加速代码,另一方面,减少实际运行节点的数量也可以有效减少调度执行图的开销。多种调度方式Mars 支持多种调度方式:| 多线程模式:Mars 可以使用多线程来在本地调度执行 Chunk 级别的图。对于 Numpy 来说,大部分算子都是使用单线程执行,仅使用这种调度方式,也可以使得 Mars 在单机即可获得 tile 化的执行图的能力,突破 Numpy 的单机内存限制,同时充分利用单机所有 CPU/GPU 资源,获得比 Numpy 快数倍的性能。| 单机集群模式: Mars 可以在单机启动整个分布式运行时,利用多进程来加速任务的执行;这种模式适合模拟面向分布式环境的开发调试。| 分布式 : Mars 可以启动一个或者多个 scheduler,以及多个 worker,scheduler 会调度 Chunk 级别的算子到各个 worker 去执行。下图是 Mars 分布式的执行架构:Mars 分布式执行时会启动多个 scheduler 和 多个 worker,图中是3个 scheduler 和5个 worker,这些 scheduler 组成一致性哈希环。用户在客户端显式或隐式创建一个 session,会根据一致性哈希在其中一个 scheduler 上分配 SessionActor,然后用户通过 execute 提交了一个张量的计算,会创建 GraphActor 来管理这个张量的执行,这个张量会在 GraphActor 中被 tile 成 chunk 级别的图。这里假设有3个 chunk,那么会在 scheduler 上创建3个 OperandActor 分别对应。这些 OperandActor 会根据自己的依赖是否完成、以及集群资源是否足够来提交到各个 worker 上执行。在所有 OperandActor 都完成后会通知 GraphActor 任务完成,然后客户端就可以拉取数据来展示或者绘图。向内和向外伸缩Mars 灵活的 tile 化执行图配合多种调度模式,可以使得相同的 Mars 编写的代码随意向内(scale in)和向外(scale out)伸缩。向内伸缩到单机,可以利用多核来并行执行科学计算任务;向外伸缩到分布式集群,可以支持到上千台 worker 规模来完成单机无论如何都难以完成的任务。Benchmark在一个真实的场景中,我们遇到了巨型矩阵乘法的计算需求,需要完成两个均为千亿元素,大小约为2.25T的矩阵相乘。Mars通过5行代码,使用1600 CU(200个 worker,每 worker 为 8核 32G内存),在2个半小时内完成计算。在此之前,同类计算只能使用 MapReduce 编写千余行代码模拟进行,完成同样的任务需要动用 9000 CU 并耗时10个小时。让我们再看两个对比。下图是对36亿数据矩阵的每个元素加一再乘以二,红色的叉表示 Numpy 的计算时间,绿色的实线是 Mars 的计算时间,蓝色虚线是理论计算时间。可以看到单机 Mars 就比 Numpy 快数倍,随着 Worker 的增加,可以获得几乎线性的加速比。下图是进一步扩大计算规模,把数据扩大到144亿元素,对这些元素加一乘以二以后再求和。这时候输入数据就有 115G,单机的 Numpy 已经无法完成运算,Mars 依然可以完成运算,且随着机器的增多可以获得还不错的加速比。开源地址Mars 已经在 Github 开源:https://github.com/mars-project/mars ,且后续会全部在 Github 上使用标准开源软件的方式来进行开发,欢迎大家使用 Mars,并成为 Mars 的 contributor。Mars科学计算引擎产品发布会发布直播回放>>发布活动页>> 大数据计算服务MaxCompute官网>>MaxCompute试用申请页面>>聚能聊>>本文作者:晋恒阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 17, 2019 · 2 min · jiezi

线性回归--sklearn框架实现

线性回归–原理线性回归–python实现(不使用框架)线性回归–sklearn框架实现这里使用sklearn框架实现线性回归。使用框架更方便,可以少写很多代码。写了三个例子,分别是单变量的、双变量的和多变量的。单变量和双变量的画出了图,多变量的由于高维空间难以实现,所以没有画图。单变量和双变量的使用的自己模拟的一个简单的房价数据集,多变量的使用的boston房价数据集。1.单变量线性回归代码运行结果2.双变量线性回归代码运行结果3.多变量线性回归代码运行结果如果需要代码和数据集,请扫描下面二维码关注公众号【AI developer】,回复【代码】即可免费获取。

January 17, 2019 · 1 min · jiezi

线性回归--python实现(不使用框架)

线性回归–原理线性回归–python实现(不使用框架)线性回归–sklearn框架实现这里使用python实现线性回归,没有使用sklearn等机器学习框架,目的是帮助理解算法的原理。写了三个例子,分别是单变量的、双变量的和多变量的。单变量和双变量的画出了图,多变量的由于高维空间难以实现,所以没有画图。单变量和双变量的使用的自己模拟的一个简单的房价数据集,多变量的使用的boston房价数据集。1.单变量线性回归代码运行结果2.双变量线性回归代码运行结果3.多变量线性回归代码运行结果如果需要代码和数据集,请扫描下面二维码关注公众号【AI developer】,回复【代码】即可免费获取。

January 17, 2019 · 1 min · jiezi

最强NLP模型BERT可视化学习

摘要: 最强NLP模型谷歌BERT狂破11项纪录,全面超越人类,本文通过可视化带你直观了解它。2018年是自然语言处理(Natural Language Processing, NLP)领域的转折点,一系列深度学习模型在智能问答及情感分类等NLP任务中均取得了最先进的成果。近期,谷歌提出了BERT模型,在各种任务上表现卓越,有人称其为“一个解决所有问题的模型”。BERT模型的核心思想有两点,对推动NLP的发展有着重要的作用:(1)Transformer结构;(2)无监督的预训练。Transformer是一个只基于注意力(Attention)机制的序列模型,《Attention is all you need》一文中指出,它摒弃了固有的定式,没有采用RNN的结构。BERT模型同时需要预训练,从两个无监督任务中获取权重:语言建模(给定左右上下文,预测丢失的单词)以及下一个句子预测(预测一个句子是否跟在另一个句子后面)。BERT是个“多头怪”BERT与传统的注意力模型有所不同,它并非在RNN的隐藏状态上直接连接注意力机制。BERT拥有多层注意力结构(12层或24层,取决于模型),并且在每个层(12层或16层)中都包含有多个“头”。由于模型的权重不在层与层之间共享,一个BERT模型相当于拥有24×16=384种不同的注意力机制。BERT可视化BERT模型较为复杂,难以直接理解它学习的权重的含义。深度学习模型的可解释性通常不强,但我们可以通过一些可视化工具对其进行理解。Tensor2Tensor提供了出色的工具对注意力进行可视化,我结合PyTorch对BERT进行了可视化。点击查看详情。该工具将注意力可视化为连接被更新位置(左)和被关注位置(右)之间的连线。不同的颜色对应不同的“注意力头”,线段宽度反映注意力值的大小。在该工具的顶部,用户可以选择模型层,以及一个或者多个“注意力头”(通过点击顶部颜色切换,一共包含12个不同的“头”)BERT到底学习什么?该工具能用于探索预先训练的BERT模型的各个层以及头部的注意模式。以下列输入值为例进行详解:句子A:I went to the store.句子B:At the store, I bought fresh strawberries.BERT采用WordPiece tokenization对原始句子进行解析,并使用[CLS]对token进行分类以及[SEP]对token进行分隔,则输入的句子变为:[CLS] i went to the store. [SEP] at the store, i bought fresh straw ##berries. [SEP]接下来我将确定6个关键模式,并展示每个模式特定层/头的可视化效果。模式1:下一个单词的注意力(Attention to next word)在该模式下,特定单词的大部分注意力都集中在序列中该单词的下一个token处。如下图所示,我们以第二层的head 0为例(所选头部由顶部颜色栏中突出显示的正方形表示)。左边图中展示了所有token的注意力,右边则显示了特定token(“i”)的注意力。“i”几乎所有的注意力都集中在它的下一个token,即“went”处。左图中,[SEP]指向了[CLS],而非“at”,也就是说,指向下一个单词的这种模式只在句子中起作用,而在句子间的效果较弱。该模式类似于RNN中的backward,状态从右往左依次更新。模式2:前一个单词的注意力(Attention to previous word)在该模式下,特定单词的大部分注意力都集中在序列中该单词的前一个token处。本例中,“went”的大部分注意力集中于它的前一个单词“i”。模式2不如模式1明显,特定的单词注意力有所分散。该过程与RNN中的forward类似。模式3:相同/相关单词的注意力(Attention to identical/related words)在该模式下,特定单词的大部分注意力集中于与其相同或者相关的单词,包括该单词本身。下图中,“store”的大部分注意力集中在它本身。由于注意力有所分散,该模式也不明显。模式4:其它句子中相同/相关单词的注意力(Attention to identical/related words in other sentence)在该模式中,注意力集中在其它句子中与指定单词相同或者相似的单词。如下图,第二个句子中的“store”与第一个句子中的“store”关联最强。这对于下一个句子预测任务非常有帮助,它能够帮助识别句子之间的关系。模式5:预测单词的注意力(Attention)在该模式下,注意力集中于其它可以预测源单词的单词上,且不包括源单词本身。如下图,“straw”的注意力主要集中于“##berries”,而“##berries”的注意力主要集中于“straw”。模式6:分隔符标记的注意力(Attention to delimiter tokens)在该模式下,特定单词的注意力主要集中于分隔符,[CLS]或[SEP]中。如下图,大多数的注意力都集中在两个[SEP]中,这或许是模型将语句级别状态传递到各个token中的一种方法。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(下)

摘要: 回顾2018,展望2019,计算机科学技术继续前进!4、工具和库工具和库是数据科学家的基础。我参与了大量关于哪种工具最好的辩论,哪个框架会取代另一个,哪个库是经济计算的缩影等等。但有一点共识–我们需要掌握该领域的最新工具,否则就有被淘汰的风险。 Python取代其他所有事物并将自己打造成行业领导者的步伐就是这样的例子。 当然,其中很多都归结为主观选择,但如果你不考虑最先进的技术,我建议你现在开始,否则后果可能将不可预测。那么成为今年头条新闻的是什么?我们来看看吧!PyTorch 1.0什么是PyTorch?我已经多次在本文中提到它了,你可以在Faizan Shaikh的文章中熟悉这个框架。这是我最喜欢的关于深度学习文章之一!当时TensorFlow很缓慢,这为PyTorch打开了大门快速获得深度学习市场。我在GitHub上看到的大部分代码都是PyTorch实现的。这并非因为PyTorch非常灵活,而是最新版本(v1.0)已经大规模应用到许多Facebook产品和服务,包括每天执行60亿次文本翻译。PyTorch的使用率在2019年上升,所以现在是加入的好时机。AutoML—自动机器学习AutoML在过去几年中逐渐取得进展。RapidMiner、KNIME、DataRobot和H2O.ai等公司都发布了非常不错的产品,展示了这项服务的巨大潜力。你能想象在ML项目上工作,只需要使用拖放界面而无需编码吗?这种现象在未来并不太遥远。但除了这些公司之外,ML / DL领域还有一个重要的发布-Auto Keras!它是一个用于执行AutoML任务的开源库。其背后的目的是让没有ML背景的领域专家进行深度学习。请务必在此处查看,它准备在未来几年内大规模运行。TensorFlow.js-浏览器中的深度学习我们一直都喜欢在最喜欢的IDE和编辑器中构建和设计机器学习和深度学习模型。如何迈出一步,尝试不同的东西?我将要介绍如何在你的网络浏览器中进行深度学习!由于TensorFlow.js的发布,已成为现实。TensorFlow.js主要有三个优点/功能:1.使用JavaScript开发和创建机器学习模型;2.在浏览器中运行预先存在的TensorFlow模型;3.重新创建已有的模型;2019年的AutoML趋势我个人特别关注AutoML,为什么?因为我认为未来几年它将成为数据科学领域真正的游戏规则改变者。跟我有同样想法的人是H2O.ai的Marios Michailidis、Kaggle Grandmaster,他们都对AutoML有很高期望:机器学习继续成为未来最重要的趋势之一,鉴于其增长速度,自动化是最大化其价值的关键,是充分利用数据科学资源的关键。它可以应用到的领域是无限的:信用、保险、欺诈、计算机视觉、声学、传感器、推荐、预测、NLP等等,能够在这个领域工作是一种荣幸。AutoML趋势:提供智能可视化和解释,以帮助描述和理解数据;查找/构建/提取给定数据集的更好特征;快速建立更强大/更智能的预测模型;通过机器学习可解释性弥补这些模型的黑匣子建模和生产之间的差距;促进这些模型落地生产;5、强化学习如果我不得不选择一个我看到的渗透更多领域的技术,那就是强化学习。除了不定期看到的头条新闻之外,我还在社区中了解到,它太注重数学,并且没有真正的行业应用程序可供专一展示。虽然这在某种程度上是正确的,但我希望看到的是明年更多来自RL的实际用例。我在每月GitHub和Reddit排序系列中,我倾向于至少保留一个关于RL的存储库或讨论,至少围绕该主题的讨论。OpenAI已经发布了一个非常有用的工具包,可以让初学者从这个领域开始。OpenAI在深度强化学习中的应用如果RL的研究进展缓慢,那么围绕它的教育材料将会很少。但事实上,OpenAI已经开放了一些关于这个主题的精彩材料。他们称这个项目为“Spinning Up in Deep RL”,你可以在这里阅读所有相关内容。它实际上是非常全面RL的资源列表,这里有很多材料包括RL术语、如何成为RL研究者、重要论文列表、一个记录完备的代码存储库、甚至还有一些练习来帮助你入门。如果你打算开始使用RL,那么现在开始!Google Dopamine为了加速研究并让社区更多的参与强化学习,Google AI团队开源了Dopamine,这是一个TensorFlow框架,旨在通过它来使更灵活和可重复性来构建RL模型。你可以在此GitHub存储库中找到整个训练数据以及TensorFlow代码(仅15个Python notebooks!)。这是在受控且灵活的环境中进行简单实验的完美平台,听起来像数据科学家的梦想。2019年强化学习趋势Xander Steenbrugge是DataHack Summit的代表,也是ArxivInsights频道的创始人,他非常擅长强化学习。以下是他对RL当前状态的看法以及2019年的预期:我目前看到RL领域的三个主要问题:样本复杂性(代理需要查看/收集以获得的经验数量);泛化和转移学习(训练任务A,测试相关任务B);分层RL(自动子目标分解);我相信前两个问题可以通过与无监督表示学习相关的类似技术来解决。目前在RL中,我们正在使用稀疏奖励信号训练深度神经网络,从原始输入空间(例如像素)映射到端到端方式的动作(例如,使用反向传播)。我认为能够促进强化学习快速发展的道路是利用无监督的表示学习(自动编码器、VAE、GAN)将凌乱的高维输入空间(例如像素)转换为低维“概念”空间。人工智能:符合伦理才更重要想象一下由算法统治的世界,算法决定了人类采取的每一个行动。这不是一个美好的场景,对吗?AI中的伦理规范是Analytics Vidhya一直热衷于讨论的话题。今年有相当多的组织因为Facebook的剑桥分析公司丑闻和谷歌内部普遍关于设计武器新闻丑闻而遭受危机。没有一个开箱即用的解决方案或一个适合所有解决方案来处理AI的伦理方面。它需要一种细致入微的方法,并结合领导层提出的结构化路径。让我们看看今年出现的重大政策:GDPR。GDPR如何改变游戏规则GDPR或通用数据保护法规肯定会对用于构建AI应用程序的数据收集方式产生影响。GDPR的作用是以确保用户可以更好地控制他们的数据。那么这对AI有何影响?我们可以想象一下,如果数据科学家没有数据(或足够数据),那么构建任何模型都会还没开始就失败。2019年的AI伦理趋势预期这是一个灰色的领域。就像我提到的那样,没有一个解决方案可以解决这个问题。我们必须聚集在一起,将伦理问题整合到AI项目中。那么我们怎样才能实现这一目标呢?正如Analytics Vidhya的创始人兼首席执行官Kunal Jain在2018年DataHack峰会上的演讲中所强调的那样:我们需要确定一个其他人可以遵循的框架。结束语有影响力!这是2018年来描述AI最佳的词汇。今年我成为ULMFiT的狂热用户,我也很期待BERT。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

计算机如何在图像识别领域取得惊人突破

原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译者 李平海图片如无标示亦出自原文文末附有专业词汇对照表囿于专业知识水平,译文如有不达之处,望留言斧正。如今,我可以在GooglePhotos里输入“沙滩”,就可以看到过去一段时间里我去过的各个沙滩。我并没有管理过我的照片,给它们打标签。实际上是Google根据照片内容识别出沙滩。这个看似普通的功能基于深度卷积神经网络技术,此技术允许软件以一种复杂的方式理解图像,这是以前的技术做不到的。这些年来研究人员发现,随着他们建立更深层的网络,积累更大的数据集来训练它们,软件的准确性越来越高。这导致了对算力的需求几乎无法满足,让英伟达(Nvidia)和AMD等GPU制造商大赚一笔。Google几年前开发了自己定制的神经网络芯片,其他公司争相效仿。例如在特斯拉,深度学习专家Andrej Karpathy被任命为负责自动驾驶项目。这家汽车制造商在开发定制的芯片,以加速未来的自动驾驶版本中的神经网络操作。又例如苹果公司,最近几款的iPhone中的A11/A12芯片就包含“神经引擎”,可以加速神经网络运行,以提供更好的图像识别/语音识别应用。那些我为了写本文而采访的专家们认为,如今深度学习的热潮可以追溯到一篇专业论文——AlexNet(以该文首要作者Alex Krizhevsky的昵称命名)。“在我看来,AlexNet论文发表的2012年可谓里程碑。”机器学习专家、《智能机器如何思考》(How Smart Machines Think)作者Sean Gerrish如是说。2012年之前,深度神经网络只是机器学习领域中的死水泥潭。但随即Krizhevsky和他的多伦多大学团队向一个备受瞩目的图像识别竞赛提交了作品,准确率突破性地超越了以往任何技术。一夜之间,深度神经网络成为了图像识别的领衔技术。其他研究人员很快地利用这项技术使图像识别精度飞跃发展。在这篇文章中,我们将深入探讨深度学习。我会解释神经网络究竟是什么,它如何被训练,以及它为什么需要那么大的算力。然后我将解释一种特殊神经网络——深层卷积网络——为什么它特别擅长理解图像。别担心,我们会有很多配图。简单的单神经元的例子“神经网络”这个词可能比较含糊,让我们从一个简单例子开始吧。假设你想要一个根据红绿黄交通灯决定车子是否能走的神经网络。此神经网络可以用一个神经元来完成这项任务。这个神经元接收每个输入(1代表打开,0代表关闭),乘以各自权重(weight),并且把加权值(weighted value)相加。然后此神经元会加上偏置(bias),这决定了神经元“激活(activate)”的阈值。此情况下如果输出值为正,我们认为此神经元“激活”了,否则没“激活”。这个神经元相当于不等式“green - red - 0.5 > 0”。如果计算结果为true,就意味着绿灯亮了,红灯灭了,车子可以通过。在真正的神经网络中,虚拟神经元会有额外的一步。在加权值加上偏置求和后,神经元会调用非线性激活函数(Non-linear activation function)。一种流行的做法是sigmoid函数,一个S型函数,它总是产生一个0~1间的值。在我们简单的交通灯模型中,使用激活函数并不会改变结果(但不能用0,例子中我们用0.5)。但激活函数的非线性是让神经网络模拟更复杂函数的关键。没有了激活函数,无论多复杂的神经网络都可以简化为它的输入的线性组合。而且线性函数不可能模拟复杂的真实现象。非线性激活函数可以让神经网络更接近任何数学函数。一个神经网络样例当然,有很多办法可以近似函数。神经网络之所以特别,是因为我们知道如何用一些算式,一堆数据,以及海量算力来“训练”它们。我们可以建造一个合适的通用神经网络来替代用人类程序员专门写来执行特定任务的神经网络。刷过一堆打过标签的数据后,它会修改神经网络本身,让自己能尽可能打出正确的标签。我们希望得出的神经网络具有通用性,能为不在训练数据中的样本也正确地打标签。在AlexNet发表之前,这个努力已经开始了。1986年,三位研究人员发表了一篇关于反向传播(backpropagation)的里程碑式论文。该技术是一种有助于训练复杂神经网络的数学方法。为了直观地了解反向传播如何工作,让我们来看看Michael Nielsen在他杰出的在线深度学习教程中描述的一个简单神经网络。目标是让神经网络从28X28像素的图片上正确地识别一个手写的数字(例如0,1,2)。每个图片有28x28=784个输入值,每个都用0或1代表这个像素是深色还是浅色。Nielsen 构建了一个这样的神经网络:插图里中层和右层每个圆圈代表我们上一段说的那种神经元。每个神经元为输入值加权求平均,然后加上偏置,然后调用一个激活函数。值得注意的是左层的圆圈不是神经元,它们代表的是输入值。虽然只画了8个输入圈,但实际上有784个输入——每个代表一个像素。右层的10个神经元代表“亮灯”猜测不同的数字:假如是0,首个神经元应该被激活(其他神经元不激活),假如是1则是第二个神经元被激活(其余的不激活),如此类推。每个神经元接收上一层所有神经元的输入。所以中层的15个神经元都是收784个输入值。它们每个都为784个输入值设置权重。这意味着在此层有15X784=11760个权重参数。同理,输出层有10个神经元,每个都从中层的15个神经元接收输入值,所以又多了1510个权重参数。与此同时,整个网络25个神经元共有25个偏置。训练神经网络我们目标是调整这11935个参数,尽可能正确地得让代表对应手写数字的输出神经元亮灯。我们可以用一个叫MNIST的著名数据集来训练,它提供了60000个已经正确标注的28X28像素图像:此图是 MNIST 数据集里60000个图像种的160个Nielsen 示范了如何不依赖任何机器学习库,仅用74行正常Python代码来训练这个神经网络。训练从选取11935个随机的权重/偏置参数开始。软件将遍历每张图片样本,完成两步过程:根据输入图像和网络的当前参数,前馈步骤计算网络的输出值。反向传播步骤将计算结果与正确输出值的偏差,然后修改网络种的参数,以略微提高其在特定输入图像上的性能。下例中,假设网络收到了这张图片:如果网络经过良好调校,网络中“7”的输出值应该接近1,其他9个输出值应该都接近0。但假如收到此图时“0”值是0.8。那就太离谱了!训练算法会改变输入“0”输出神经元的各个权重,好让下次输入这张图片时,输出值会更接近0。为此,反向传播算法会为各个权重参数算出一个误差梯度。这是一个衡量输出错误有多大程度被输入权重所被改变的维度。算法会依照这个梯度决定多大程度改变每个输入值的权重——梯度越大,这个参数修改越多。换句话说,这个训练过程“教会”输出神经元更少地注意导向错误的输入方(即中层的神经元),更多地注意正确方向的输入方。算法一直为每个输出神经元重复此步骤。它将降低 “1,” “2,” “3,” “4,” “5,” “6," “8,” 和 “9” 神经元(除了神经元“7”)的输入方的权重,使输出神经元的值降低。输入值越大,反映此输入值的权重参数的误差梯度就越大,因此这个权重会减少越多。同理,训练算法会增加输出神经元“7”的输入值的权重。令下次遇到这个图像时,此神经元会产生更大的输出值。同样的,输入值越大,加权后的增加值也越大,这使得输出神经元“7”在以后的几轮学习中更加关注这些输入。接下来,算法需要对中层执行相同的计算:改变每个输入值的权重以减少网络的错误——同样,使“7”输出更接近1,其他输出更接近0。但每个中层神经元都会对向全部10个输出层神经元进行输出,这会导致两个方向的矛盾。首先,中层的误差梯度,不仅仅取决于输入值,也同时取决于下一层的误差梯度。这个算法之所以被称为反向传播,是因为网络里后层的误差梯度会反向传到前面层级(沿着算式中的关系链)并用来计算梯度。同时,每个中层神经元也是全部10个输出层神经元的输入源。因此,训练算法计算的误差梯度,必须反映输入权重的变化如何影响所有输出的平均误差。反向传播是一种爬坡算法:该算法的每一轮都会使输出结果更接近训练图像的正确结果,但只会更接近一点。随着算法经历越来越多的样本,它会“爬坡”到一个最优参数集,该参数集能够正确地分类尽可能多的训练样本。要获得较高的准确率,需要成千上万的训练样本,算法可能需要对训练集中的每个图像进行数十次循环,才能达到最优。Nielsen展示了如何用74行Python代码实现上述所言。值得注意的是,使用这个简单程序训练的神经网络能够识别MNIST数据库中95%以上的手写数字。通过一些额外的改进,像这样一个简单的两层神经网络能够识别98%以上的数字。AlexNet的突破你可能以为,上世纪80年代反向传播的发展会开启一段基于神经网络的机器学习的快速发展时期,但事实并非如此。在90年代和21世纪初,有一些人在研究这项技术。但对神经网络的热潮直到2010年代初才真正兴起。我们可以在由斯坦福大学计算机科学家李飞飞组织的年度机器学习竞赛《ImageNet》的结果中看到这一点。在每年的比赛中,参赛者都会得到一组由100多万张训练图片组成的通用图片,每张图片上都手工标注着1000种可能的分类,比如“消防车”、“蘑菇”或“猎豹”。参赛者的软件根据其对未被纳入训练集的其他图像进行分类的能力进行评判。程序可以进行多次猜测,如果前五次对图像的猜测中有一次与人类选择的标签相匹配,则该软件被认为是成功的。比赛从2010年开始举办,在前两届比赛中,深度神经网络并没有发挥主要作用。顶级团队使用了各种其他机器学习技术,但结果平平无奇。2010年获胜的那支球队,top5错误率(即五轮皆猜错)为28%。2011年度则是25%。然后就到了2012年。这个来自多伦多大学的团队提交了一份参赛作品,不啻于将选手们从死水泥潭中拖出。该参赛作品即后来以主要作者Alex krizhevsky名字命名的AlexNet。通过使用深度神经网络,该研究小组获得了16%的top5错误率。当年最接近的竞对手错误率达到26%。前文所说的手写识别网络有两层,25个神经元,以及将近12000个参数。AlexNet更大更复杂:8个可训练的层、65万个神经元和6000万个参数。训练这样规模的网络需要大量的算力,而AlexNet的设计就是利用现代GPU提供的大量并行算力。研究人员想出了如何在两个GPU之间分配网络训练的工作,从而使他们的算力提高了一倍。尽管进行了积极的优化,使用2012年水平的硬件(两个Nvidia GTX 580 GPU,每个有3GB内存)对网络训练依然耗费了5到6天。看看AlexNet结果的一些例子,对我们理解这是一个多么引人瞩目的突破很有帮助。以下是那篇论文的插图,展示了一些图片样本和AlexNet对应的top5分类猜测:AlexNet能够识别出第一张图片中包含了一只螨虫,尽管这只螨虫只是图片边缘的一小块。该软件不仅能正确识别美洲豹,它的其他先行猜测——美洲虎、猎豹、雪豹和埃及猫——都长得很像。AlexNet将蘑菇的图片标注为“伞菌”——蘑菇的一种。官方正确的标签“蘑菇”是AlexNet的第二选择。AlexNet的“错误结果”同样令人惊讶。照片上,一只斑点狗站在樱桃后面,旁边写着“斑点狗”,而官方的标签是“樱桃”。AlexNet意识到这张照片上有某种水果——“葡萄”和“接骨木果”是它的前五种选择——但它没有完全意识到它们是樱桃。给AlexNet展示一张马达加斯加猫在树上的照片,它会猜一系列的小型爬树哺乳动物。很多人(包括我)都会同样地猜错。这确实是一个引人瞩目的表现,表明软件可以识别各种方向和排布中的常见对象。深度神经网络迅速成为图像识别任务中最受欢迎的技术,机器学习的世界从此迈上快车道不回头。ImageNet的发起人写道:“随着基于深度学习的方法在2012年取得成功,2013年的绝大多数参赛作品都使用了深度卷积神经网络。”这种模式持续了好几年,后来的优胜者都是建立在AlexNet团队开创的基本技术之上。到2017年,使用深度神经网络的参赛者将top5错误率降至3%以下。考虑到这项任务的复杂度,可以说这使得计算机比许多人更擅长这项任务。这张来自ImageNet团队的条形图显示了每年top-5分类比赛中获胜团队的错误率。从2010年到2017年,错误率稳步下降。卷积网络的概念从技术上讲,AlexNet是一个卷积神经网络。在本节中,我将解释卷积网络的作用,以及为什么这项技术对现代图像识别算法至关重要。我们之前研究的简单手写识别网络是全连接的:第一层的每个神经元都是第二层神经元的输入源。此结构比较适合相对简单的任务,例如识别28×28像素图像中数字。但进一步扩展就很难了。在MNIST手写数字数据集中,字符总是居中的。这大大简化了训练,因为这意味7在图像的顶部和右侧总是有一些黑色像素,而左下方总是白色的。0总是中间白块,四周的像素则较暗。一个简单的、全连接的网络可以相当容易地检测这些类型的模式。但是假如你想建立一个神经网络来识别可能位于大图中的任何位置的数字。一个全连接的网络不擅长于此,因为它没有一种有效的方法来识别位于图像不同部分的形状之间的相似性。如果你的训练集的左上角恰好有大部分的7,那么你会得到一个网络,它比图像中其他地方更善于识别左上角的7。从理论上讲,你可以通过确保你的训练集在每个可能的像素位置上都有很多数字的样本来解决这个问题。但在实践中,这将是巨大的浪费。随着图像的大小和网络的深度的增加,连接的数量——也就是输入权重参数的数量——将会激增。你需要更多的训练图像和算力来达到足够的准确性。当神经网络学习识别图像中某个位置的形状时,它应该能够将这种学习应用于识别图像中其他位置的类似形状。卷积神经网络为这个问题提供了一个优雅的解决方案。“这就像拿一个模板或模式,然后将其与图像上的每一个点进行匹配,”人工智能研究员唐杰(音)说。“你有一个狗的模板轮廓,然后发现右上角和你的模板基本匹配——那里有条狗吧?”如果没有,可以稍微移动一下模板,遍历整张图片。狗出现在在图像哪个位置并不重要。模板会匹配到它。你不会想让网络的每个子部分都学习自己单独的狗识别器。试想一下,如果我们把一幅大图像分成2828像素的小块。然后,我们可以将每个小块输入到之前所述的全连接的手写识别网络中。如果这些小块中的“7”输出至少有一个被点亮,就意味着整个大图中可能有7的存在。这就是卷积网络的本质。卷积网络在AlexNet中如何工作?在卷积网络中,这些“模板”被称为特征检测器(feature detector),它们所观察的区域被称为接受域(receptive field)。真正的特征检测器的接受域往往比边长28像素小得多。在AlexNet中,第一个卷积层具有接受域为11×11像素的特征检测器。它随后的卷积层有3到5个单位宽的接受域。当特征检测器扫过输入图像时,它会生成一个特征图(feature map):一个二维网格,表示该检测器被图像的不同部分激活的强度。卷积层通常有多个特征检测器,每个检测器扫描输入图像以寻找不同的模式。在AlexNet中,第一层有96个特征检测器,生成了96个特征图。为了更具体地说明这一点,以下是经过网络训练的AlexNet第一层中的96个特征检测器所学习的视觉模式的可视化表示。特征检测器可以寻找水平或垂直的线条、从亮到暗的渐变、棋盘图形和其他形状。彩色图像用像素分布格式表示,每个像素有三个值:红值、绿值和蓝值。AlexNet的第一层会将红绿蓝三位表示的像素归纳为96个类型值之一。图像中的每个“像素”(指第一层分割的单元)有96种可能的值,对应96种特征检测器。在本例中,这96个值中的第一个值指示图像中的某个特定点是否与此模式匹配:第二个值指示某个特定点是否与此模式匹配:第三个值表示某个特定点是否与此模式匹配:如此类推,在AlexNet的第一层中,其他93个特征检测器也是如此。第一层将图像的每个“像素”用一种新表现形式输出——表示为96个值(类似96进制?)的向量(我稍后将解释,这个新表示形式也被按比例缩小四倍)。这是AlexNet的第一层。接下来是另外四个卷积层,每个层的输入都是前一层的输出。正如我们所看到的,第一层检测基本的模式,如水平和垂直的线,光到暗的变化,以及曲线。然后,第二层使用第一层的结果作为构建块来检测稍微复杂一些的形状。例如,第二层可能有一个特征检测器,它通过组合第一层特征检测器的输出来查找曲线,从而查找圆。第三层通过结合第二层的特征找到更复杂的形状。第4层和第5层可以找到更复杂的模式。研究人员Matthew Zeiler和Rob Fergus在2014年发表了一篇出色的论文,为可视化类似ImageNet的五层神经网络所识别的模式提供了一些有用的方法。在下列插图中,每张图片(第一张除外)都有两个部分。在右边,你将看到一些缩略图图像,它们高度匹配了特定的特征检测器。它们9个分为一组,每组对应一个不同的特征检测器。在左边是一个地图,它显示了缩略图图像中的哪些特定像素产生了高度匹配。你可以在第5层中最显著地看到这一点,因为有一些特性检测器可以高度匹配为狗、企业标识、独轮车轮子等。浏览这些图像,你可以看到每一层都能够识别比前一层更复杂的模式。第一层识别简单的像素模式,看起来也并不十分相像。第二层识别纹理和简单的形状。在第三层,我们可以看到可识别的形状,如汽车轮子和红橙色的球体(可能是西红柿、瓢虫或其他东西)。第一层的感受域为11X11单位大小,而后面的层的感受域大小则为3X3单位到5X5单位不等。但是请记住,后面的这些层接收的是前面的层生成的特征图,这些特征图中的每个“像素”表示原始图像中的n个像素。所以每一层的感受域都包含了原始图像中比前一层更大的部分。这就是为什么后期图层的缩略图看起来比早期图层更复杂的原因之一。感受域示意图,from深度神经网络中的感受野网络的第五层也是最后一层能够识别这些图像中最显眼的大尺度元素。例如这张图片,我从上面第5层图片的右上角截取的:右边的9张图片看起来可能不太相似。但是如果你看一下左边的9张热图,你会发现这个特定的特征检测器并没有聚焦于每张图像前景中的物体。相反,它关注的是每个图像背景中的绿色部分!显然,如果你要识别的类别之一是“草”,那么用“草检测器”就合适了,但是它同时也可能检测其他东西。在五个卷积层之后,AlexNet有三个层是全连接的,就像我们手写识别网络中的层一样。这些层会利用第五卷积层生成的每个特征图,尝试将图像分类为1000个类别中的一个。所以如果一幅画的背景是草,那么它更有可能是野生动物。另一方面,如果这幅画的背景是草,那么它不太可能是一幅室内家具的画。其他位于第五层的特征探测器提供了丰富的信息可用于猜测照片内容。网络的最后几层将这些信息综合起来,对整个图片所描绘的内容进行有理据的猜测。卷积层的独到之处:共享输入权重我们已经看到卷积层中的特征检测器执行了牛逼的模式识别,但是到目前为止,我还没有解释卷积网络实际上是如何工作的。卷积层是一层神经元。像任何神经元一样,这些神经元取其输入的加权平均值,然后应用一个激活函数。用我们讨论过的反向传播技术来训练当中的参数。但与上面的神经网络不同,卷积层没有全连接。每个神经元只接受前一层神经元的一小部分输入。更重要的是,卷积网络中的神经元共享输入权重。让我们放大AlexNet的第一个卷积层中的第一个神经元。这一层的接受域大小是11×11像素,所以第一个神经元接收某角落的11×11像素。这个神经元接受这121个像素的输入,每个像素有三个值——红、绿、蓝。神经元总共有363个输入。和任何神经元一样,这个神经元取363个输入值的加权平均值,然后应用一个激活函数。因为它有363个输入值,它也需要363个输入权重参数。AlexNet第一层中的第二个神经元与第一个神经元非常相似。它同样接收11×11像素,但它的接受域是从第一个神经元的接受域平移4个像素开始。这就在两个接受域之间产生了7个像素的重叠,这就避免了遗漏两个神经元之间的有趣模式。第二个神经元同样接收描述11×11像素的363个值,每个值乘以权重参数,求和,并调用一个激活函数。特殊的是,第二个神经元没有自己的一组363个输入权重,而是使用与第一个神经元相同的输入权重。第一个神经元的左上角像素使用与第二个神经元的左上角像素相同的输入权重。所以这两个神经元在寻找完全相同的模式。它们的接受域之间有4个像素的偏移。当然实际远不止两个神经元——图片分为55×55格共3025个神经元。这3025个神经元中的每一个都使用与开始两个神经元相同的363个输入权重。所有这些神经元共同“扫描”图像中可能存在的特定模式,组成一个特征检测器。请记住,AlexNet的第一层有96个特性检测器。我刚才提到的3025个神经元组成了96个特征探测器中的一个。其他95个特征探测器则是由各自的一组3025个神经元组成。每组3025个神经元与组内其他神经元共享其363个输入权重,但不是和其他95个特征检测器的神经元共享。卷积网络的训练使用与训练全连接网络相同的基础反向传播算法,但是卷积结构使得训练过程更加高效。“使用卷积非常有用,因为可以重用参数,”机器学习专家和作家Sean Gerrish告诉Ars(本文原作者机构)。这大大减少了网络需要学习的输入权重的数量,这使得网络可以用更少的训练样本产生更好的结果。从图像的一个部分学到的识别模式,可以转化用于识别其他图像的其他位置的相同模式。这使得网络可以通过更少的训练实例来实现高性能。深度卷积网络威名远扬AlexNet的论文在学术机器学习社区引起了轰动,它的重要性也很快得到了业界的认可。谷歌对这项技术特别感兴趣。2013年,谷歌收购了AlexNet论文作者创办的一家初创公司。他们利用这项技术为谷歌照片添加了一个新的图像搜索功能。谷歌的Chuck Rosenberg写道:“我们直接从一个学术研究实验室进行了前沿研究,并在短短6个多月的时间里启动了它。”与此同时,谷歌2013年的一篇论文描述了它如何使用深度卷积网络从谷歌街景(Google Street View )的照片中读取地址码。“我们的系统帮助我们从街景图像中提取了近1亿个实体街道编号,”作者写道。研究人员发现,随着神经网络的发展,其性能不断提高。谷歌街景团队写道:“我们发现这种方法的性能随着卷积网络的深度而提高,在我们训练层级最多的架构中,性能最好。我们的实验表明,更深层次的架构可能获得更好的准确性,但效率会逐渐降低。”所以在AlexNet之后,神经网络变得越来越深。一个谷歌的团队在2014年ImageNet竞赛中提交的作品获得了优胜——就在2012年AlexNet获胜的两年后。和AlexNet一样,它也是基于一个深度卷积神经网络,但是谷歌使用了一个更深层的22层网络,从而获得了6.7 %的top5错误率——这比AlexNet的16%错误率有了很大的提高。不过,更深层的网络只对大型训练集有用。基于这个原因,Gerrish认为ImageNet数据集和竞争对深度卷积网络的成功起到了关键作用。大家还记得吗?ImageNet竞赛给了参赛者一百万张图片,要求他们从1000个不同的类别中选择一个。Gerrish说:“拥有100万张图片来训练你的神经网络,意味着每个类别有1000张图片(1m/1000 = 1000)。”他说,如果没有这么大的数据集,“你训练网络的参数就多得多。”近年来,人们聚焦于收集更大的数据,以便训练更深入、更准确的网络。这是自动驾驶汽车公司如此专注于在公共道路上积累里程的一大原因——来自测试的图像和视频被送回总部,用于培训公司的图像识别网络。深度学习计算的繁荣更深层次的网络和更大的训练集可以提供更好的性能,这一发现对更多的算力产生了无法满足的需求。AlexNet成功的一个重要原因是意识到,神经网络训练涉及矩阵运算,可以使用显卡高度并行的算力高效地执行这些运算。“神经网络是可并行的,”机器学习研究员唐杰说。显卡本来是为视频游戏提供大规模并行算力的,结果非常适合神经网络使用。“GPU的核心运算是极快的矩阵乘法,最终成为神经网络的核心运算,”唐说。这为英伟达(Nvidia)和AMD这两家行业领先的GPU制造商带来了滚滚财源。这两家公司都致力于开发适应机器学习应用程序独特需求的新芯片,而人工智能应用程序目前在这些公司的GPU销售中占据了相当大的比例。2016年,谷歌公开了一个定制芯片,称为张量处理单元(TPU),专门用于神经网络操作。谷歌2017年写道,虽然他们早在2006年就考虑过为神经网络构建专用集成电路(ASIC),但2013年这种情况变得紧迫起来。“就在那时,我们意识到神经网络快速增长的计算需求可能要求我们将运营的数据中心数量增加一倍。”最初,TPU仅允许谷歌自己的专有服务使用,但后来,谷歌开始允许任何人通过它的云计算平台使用这项技术。当然,谷歌并不是唯一一家致力于人工智能芯片的公司。一个小例子是,iPhone最新版本的芯片就包括一个为神经网络操作优化的“神经引擎”。英特尔正在开发自己的针对深度学习的优化芯片系列。特斯拉最近宣布放弃英伟达的芯片,转而采用自制神经网络芯片。亚马逊据说也在开发自己的AI芯片。为何深层神经网络难以理解我已经解释了深度神经网络是如何工作的,但我还没有真正解释它们的工作何以那么出色。大量的矩阵运算可以让计算机区分美洲虎和猎豹,接骨木和醋栗,这真令人惊讶。但也许神经网络最值得注意的地方是它们做不到的事。卷积使神经网络能够理解平移——它们可以判断一幅图像的右上角的模式是否与另一幅图像的左上角的模式相似。但除此之外,卷积网络并没有真正的理解几何图形。如果图像旋转45度或放大2倍,他们就无法识别出这两幅图像是否相似。卷积网络并没有尝试去理解三维物体的结构,而且它们也不能识别不同的光照条件。然而,深度神经网络能够识别狗的图片,无论它们是正面还是侧面拍摄的,无论它们是占据了图片的一小部分还是很大一部分。神经网络是怎么做到的?事实证明,有了足够的数据,暴力统计方法就足以完成这项工作。卷积网络的设计初衷并不是“想象”如果从不同的角度或在不同的环境下,一张特定的图像会是什么样子,但是有了足够多的标记样本,它可以通过纯粹的重复来学习所有可能的排列。有证据表明,人类的视觉系统实际上是以类似的方式工作的。我们来看这两张图片(在看第二张图片之前,确保你仔细看了第一幅图片):显然,这张照片的创作者把人像的眼睛和嘴巴颠倒过来,再把整张照片翻过来。当你把图像倒过来看时,它看起来相对正常,因为人类的视觉系统已经习惯了在这个方向上看眼睛和嘴。但是当你看后者时,就会发现人像面容变得畸形。这表明人类视觉系统依赖于一些与神经网络相同的粗糙模式匹配技术。如果我们看到的东西几乎都是同一个方向的——就如人类的眼睛——我们就能更好地识别出它们通常的方向。神经网络善于利用图片中的所有环境来理解它所显示的内容。例如,汽车通常出现在道路上。裙子通常要么出现在女性的身体上,要么挂在衣橱里。飞机要么在蓝天的衬托下出现,要么在跑道上滑行。没有人明确地教神经网络这些相关性,但有足够多的标记样本,网络可以自动学习它们。2015年,谷歌的一些研究人员试图通过“反向操作”来更好地理解神经网络。他们不是用图像来训练神经网络,而是用训练过的神经网络来修改图像。比如,他们从一幅包含随机噪声的图像开始,然后逐渐修改它,使其强烈地“点亮”神经网络的输出之一——要求神经网络高效地“绘制”一个它被训练识别的类别。在一个有趣的例子中,他们用一个被训练用来识别哑铃的神经网络来画图。研究人员在研究报告中写道:“这些是哑铃没错,但似乎都画出了肌肉发达的举重运动员来举哑铃。”乍一看,这似乎很奇怪,但实际上这与人类的行为并没有太大的不同。如果我们在一幅图像中看到一个小的或模糊的物体,我们就会观察周围的环境,寻找图片中可能发生的事情的线索。很明显,人类通过不同的方式对图像进行推理,利用我们对周围世界复杂的概念理解。总而言之,深层神经网络擅长于图像识别,是因为它们充分利用了图片中显示的所有环境,这与人类的识别方式并没有太大的不同。(完)专业词汇对照表neural network 神经网络computing power 算力convolutional network 卷积网络neuron 神经元weight 权重bias 偏置activation function 激活函数Non-linear activation function 非线性激活函数light up 亮灯(即匹配)layer 层receptive field 感受域backpropagation 反向传播top-five error rate top5错误率error gradient 误差梯度matrix 矩阵fully connected layer 全连接层pattern 模式feature detector 特征检测器brute-force statistical 暴力统计 ...

January 16, 2019 · 1 min · jiezi

深度学习为图片人物换装【python代码教程】

在观看本文之前,请答应我要善良。昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子。授人以鱼不如授人以渔,请这些同学好自为之~01.效果演示本文案例使用的是开源项目instagan,是一种比较新的gan模型建模原理,来自2019年ICLR的论文,下面看下效果对照:(出于人道主义,会把人物的长裤脱掉然后换上短裙)02.环境配置首先玩这个模型需要两个前提条件:有梯子python3.6版本有GPU环境(因为源代码是要求必须在GPU的Cuda环境下运行,如果没有GPU的同学推荐用PAI里面的DSWhttps://data.aliyun.com/product/learn ,比较便宜 )(1)下载实验代码:https://github.com/sangwoomo/instagan(2)下载pre-trained model,如果只是实验就直接用训练好的模型即可:https://drive.google.com/drive/folders/1xb9rR21MhMVselc6HTmOr73WOkOviFmO(如果只玩换裤子这个实验,下载pants2skirt_mhp_instagan这个模型即可)(3)安装代码中的requirement.txt中的依赖包最后把下载的model文件放到代码文件的根目录下,目录结构如下(蓝色部分为模型文件夹,里面是200_net_G_A.pth和200_net_G_B.pth):完成以上步骤,整个环境就搭建好了。03.使用模型做图片转换注:这个项目的代码有很多hard code的逻辑,需要严格按照下面的做法执行才有可能跑通,包括所有文件的命名。(1)先设置需要转换的图片在datasets目录下新增一个test文件夹,构建如下的文件格式testA和testB存放需要转换的原图,类似于“效果演示中”穿着长裤的图片,testA_seg和testB_seg需要存放mask图片。mask文件是转换图片中的裤子样式,如下图对应实例图片左边的女生裤子(如果想转换其它部位,就不用我举例子了吧):mask图片还需要与被转换图片命名一致,详细规则参见源代码中的datasets,如果不一致会出现以下错误:https://github.com/sangwoomo/instagan/issues/5(2)执行图片转换逻辑在工程的根目录下执行以下代码,使用工程下的test.py这个测试代码: python test.py –dataroot ./datasets/test –model instagan –name pants2skirt_mhp_instagan –loadSizeH 240 –loadSizeW 160 –fineSizeH 240 –fineSizeW 160 –ins_per 2 –ins_max 20如果没有报错的话在GPU环境下1分钟就可以执行完毕,代码执行完毕后在工程的results文件夹下就能看到转换好的图片了。04.总结整个项目的效果还是不错的,不过可能代码还没来得及优化,可能在实验的过程中有很多坑,大家需要一定的debug能力才能把工程跑起来,小白不太建议使用哈。本文作者:傲海阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 16, 2019 · 1 min · jiezi

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(上)

摘要: 回顾2018,展望2019,计算机科学技术继续前进!1、简介:过去几年一直是人工智能爱好者和机器学习专业人士最幸福的时光。因为这些技术已经发展成为主流,并且正在影响着数百万人的生活。各国现在都有专门的人工智能规划和预算,以确保在这场比赛中保持优势。数据科学从业人员也是如此,这个领域正在发生很多事情,你必须要跑的足够的快才能跟上时代步伐。回顾历史,展望未来一直是我们寻找方向的最佳方法。这也是我为什么想从数据科学从业者的角度退一步看一下人工智能的一些关键领域的发展,它们突破了什么?2018年发生了什么?2019年会发生什么?我将在本文中介绍自然语言处理(NLP)、计算机视觉、工具库、强化学习、走向合乎正道的人工智能2、自然语言处理(NLP)让机器分析单词和句子似乎是一个梦想,就算我们人类有时候也很难掌握语言的细微差别,但2018年确实是NLP的分水岭。我们看到了一个又一个显著的突破:ULMFiT、ELMO、OpenAI的Transformer和Google的BERT等等。迁移学习(能够将预训练模型应用于数据的艺术)成功应用于NLP任务,为无限可能的应用打开了大门。让我们更详细地看一下这些关键技术的发展。ULMFiTULMFiT由Sebastian Ruder和fast.ai的Jeremy Howard设计,它是第一个在今年启动的NLP迁移学习框架。对于没有经验的人来说,它代表通用语言的微调模型。Jeremy和Sebastian让ULMFiT真正配得上Universal这个词,该框架几乎可以应用于任何NLP任务!想知道对于ULMFiT的最佳部分以及即将看到的后续框架吗?事实上你不需要从头开始训练模型!研究人员在这方面做了很多努力,以至于你可以学习并将其应用到自己的项目中。ULMFiT可以应用六个文本分类任务中,而且结果要比现在最先进的方法要好。你可以阅读Prateek Joshi关于如何开始使用ULMFiT以解决任何文本分类问题的优秀教程。ELMO猜一下ELMo代表着什么吗?它是语言模型嵌入的简称,是不是很有创意? ELMo一发布就引起了ML社区的关注。ELMo使用语言模型来获取每个单词的嵌入,同时还考虑其中单词是否适合句子或段落的上下文。上下文是NLP的一个重要领域,大多数人以前对上下文都没有很好的处理方法。ELMo使用双向LSTM来创建嵌入,如果你听不懂-请参考这篇文章,它可以让你很要的了解LSTM是什么以及它们是如何工作的。与ULMFiT一样,ELMo显着提高了各种NLP任务的性能,如情绪分析和问答,在这里了解更多相关信息。BERT不少专家声称BERT的发布标志着NLP的新时代。继ULMFiT和ELMo之后,BERT凭借其性能真正击败了竞争对手。正如原论文所述,“BERT在概念上更简单且更强大”。BERT在11个NLP任务中获得了最先进的结果,在SQuAD基准测试中查看他们的结果:有兴趣入门吗?你可以使用PyTorch实现或Google的TensorFlow代码尝试在自己的计算机上得出结果。我很确定你想知道BERT代表什么,它实际上是Transformers的双向编码器表示,如果你能够领悟到这些,那很不错了。PyTextFacebook开源了深度学习NLP框架PyText,它在不久之前发布,但我仍然要测试它,但就早期的评论来说非常有希望。根据FB发表的研究,PyText使会话模型的准确性提高了10%,并且缩短了训练时间。PyText实际上落后于Facebook其他一些产品,如FB Messenger。如果你对此有兴趣。你可以通过GitHub下载代码来自行尝试。2019年NLP趋势:塞巴斯蒂安·罗德讲述了NLP在2019年的发展方向,以下是他的想法:预训练的语言模型嵌入将无处不在,不使用它们的模型将是罕见的。我们将看到可以编码专门信息的预训练模型,这些信息是对语言模型嵌入的补充。我们将看到有关多语言应用程序和跨语言模型的成果。特别是,在跨语言嵌入的基础上,我们将看到深度预训练的跨语言表示的出现。3、计算机视觉这是现在深度学习中最受欢迎的领域,我觉得我们已经完全获取了计算机视觉中容易实现的目标。无论是图像还是视频,我们都看到了大量的框架和库,这使得计算机视觉任务变得轻而易举。我们今年在Analytics Vidhya花了很多时间研究这些概念的普通化。你可以在这里查看我们的计算机视觉特定文章,涵盖从视频和图像中的对象检测到预训练模型列表的相关文章,以开始你的深度学习之旅。以下是我今年在CV中看到的最佳开发项目:如果你对这个美妙的领域感到好奇,那么请继续使用我们的“使用深度学习的计算机视觉”课程开始你的旅程。BigGAN的发布在2014年,Ian Goodfellow设计了GAN,这个概念产生了多种多样的应用程序。年复一年,我们看到原始概念为了适应实际用例正在慢慢调整,直到今年,仍然存在一个共识:机器生成的图像相当容易被发现。但最近几个月,这个现象已经开始改变。或许随着BigGAN的创建,该现象或许可以彻底消失,以下是用此方法生成的图像:除非你拿显微镜看,否则你将看不出来上面的图片有任何问题。毫无疑问GAN正在改变我们对数字图像(和视频)的感知方式。Fast.ai的模型18分钟内在ImageNet上被训练这是一个非常酷的方向:大家普遍认为需要大量数据以及大量计算资源来执行适当的深度学习任务,包括在ImageNet数据集上从头开始训练模型。我理解这种看法,大多数人都认为在之前也是如此,但我想我们之前都可能理解错了。Fast.ai的模型在18分钟内达到了93%的准确率,他们使用的硬件48个NVIDIA V100 GPU,他们使用fastai和PyTorch库构建了算法。所有的这些放在一起的总成本仅为40美元! 杰里米在这里更详细地描述了他们的方法,包括技术。这是属于每个人的胜利!NVIDIA的vid2vid技术在过去的4-5年里,图像处理已经实现了跨越式发展,但视频呢?事实证明,将方法从静态框架转换为动态框架比大多数人想象的要困难一些。你能拍摄视频序列并预测下一帧会发生什么吗?答案是不能!NVIDIA决定在今年之前开源他们的方法,他们的vid2vid方法的目标是从给定的输入视频学习映射函数,以产生输出视频,该视频以令人难以置信的精度预测输入视频的内容。你可以在这里的GitHub上试用他们的PyTorch实现。2019年计算机视觉的趋势:就像我之前提到的那样,在2019年可能看到是改进而不是发明。例如自动驾驶汽车、面部识别算法、虚拟现实算法优化等。就个人而言,我希望看到很多研究在实际场景中实施,像CVPR和ICML这样的会议描绘的这个领域的最新成果,但这些项目在现实中的使用有多接近?视觉问答和视觉对话系统最终可能很快就会如他们期盼的那样首次亮相。虽然这些系统缺乏概括的能力,但希望我们很快就会看到一种综合的多模式方法。自监督学习是今年最重要的创新,我可以打赌明年它将会用于更多的研究。这是一个非常酷的学习线:标签可以直接根据我们输入的数据确定,而不是浪费时间手动标记图像。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 16, 2019 · 1 min · jiezi

被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变

摘要: 自从阿法狗战胜人类顶级棋手之后,深度学习、人工智能变得再一次火热起来,但有一个基本的误解是更大的数据会产生更好的机器学习结果。然而,更大的数据池/仓库并不一定有助于模型学习到更深刻的见解。正确的答案是? 自从阿法狗战胜人类顶级棋手之后,深度学习、人工智能变得再一次火热起来。有些人认为,深度学习的再一次兴起是源于硬件的提升、数据量的增多以及高效算法的研究。这并不完全精确,有一个基本的误解是更大的数据会产生更好的机器学习结果。然而,更大的数据池/仓库并不一定有助于模型学习到更深刻的见解。正确的答案是,要把重心专注于数据的质量、价值以及多样性,而不仅仅是数据的规模——“深度数据”(deep data)比大数据(big data)好。随着研究的进行,人们对大数据的炒作逐渐在减弱。云计算、Hadoop及其变种已经能够解决一些大数据的问题。但是“大数据”是指许多人仍在花费大量资金建设更大的基础设施来处理、保存和管理的庞大数据库。这种盲目追求“大”的做法,在基础设施和人力资源方面产生了巨大的、且本可避免的成本。目前,越来越多的声音讨论是否从“大数据”转向为“深度数据”了,我们现在需要更加的明智和思考全面,而不是收集所有可能的数据来实现“大数据”。我们现在需要让一些数据落实到位,并寻求数量和质量的多样性,这将给我们带来许多长期的收益。被神话的大数据 要理解从“大”到“深”的这种转变,让我们首先看一下我们对大数据的一些错误观念:可以并且应该捕获和存储所有数据;更多数据总是有助于构建更准确的预测模型;存储更多的数据,其存储成本几乎为零;更多数据的计算成本几乎为零;以下是现实:来自物联网和网络流量的数据仍然超过了我们目前具备的捕获所有数据的能力。有些数据必须在摄取时被丢弃。我们需要变得聪明,这就需要我们根据价值对数据进行分类;重复一千次的相同数据示例并不会提高预测模型的准确性;存储更多数据的成本不仅仅是网络服务向用户收取的费用(比如云盘),这也是查找和管理多个数据源的额外复杂性以及员工移动和使用该数据的隐藏代价,这些成本通常高于存储和计算费用。人工智能算法对计算资源的需求甚至可以快速超越弹性云基础设施。虽然计算资源可以线性增长,但计算需求可以超线性增长,甚至指数级增长。 相信这些神话的问题在于,我们将以一种在纸上或长期看来都很好的方式构建信息系统,但在即时时间框架内过于繁琐,无法发挥作用。大数据的四个问题以下是在数据方面盲目相信“越多越好”时存在的四个问题:更多相同的数据是没有作用的。为人工智能构建机器学习模型时,训练示例的多样性至关重要,原因是模型是根据数据来试图确定概念边界。例如,如果模型试图通过使用年龄和职业来定义“退休工人”的概念,那么32岁的注册会计师的重复示例对该模型并没有什么好处,因为它们表示的含义都是没有退休。在65岁的概念边界获得示例并了解退休如何随职业而变化对模型会更有帮助;嘈杂的数据可能会伤害模型。如果新数据中存在错误或者不精确,那么它只会混淆模型试图学习的两个概念之间的界限。在这种情况下,更多的数据将无济于事,实际上可能会降低现有模型的准确性;大数据让一切都变慢了。在数TB的数据上构建模型可能比在数GB的数据上构建模型花费一千倍的时间,或者它可能需要一万倍的时间,这都取决于学习算法。数据科学就是快速实验,快速实验,快速更新以获得较为合适的模型;大数据可实现的模型。任何预测模型的最终目标都是创建一个可以为业务部署的高度准确的模型。有时使用来自数据池深处更加模糊的数据可能会导致更高的准确性,但所使用的数据对于实际部署可能是不可靠的。最好有一个不太准确的模型,它可以快速运行并可供企业使用。能做得更好的四件事以下是我们可以采取的一些措施来对抗大数据的“黑暗面”,并将大数据思维转向深度数据思维:了解准确性/执行权衡。数据科学家常常认为目标是获得更准确的模型。而是要根据准确性和部署速度,以明确的ROI预期启动项目;使用随机样本构建每个模型。如果你的数据集足够大,那么你就没有理由一次性全部使用整个数据集。如果数据集具有良好的随机抽样功能,那么我们就可以使用来自大数据集中的小样本构建模型,并进行准确预测。小样本使得模型迭代更新更加快速,然后使用整个数据库构建最终模型。丢弃一些数据。如果对来自物联网设备和其他来源的数据流感到不知所措,那么就可以聪明地随意丢弃一些数据。这个方法适合于构建模型的早期阶段,如果到后期的话,这样操作会使得后期工作一团糟。寻找更多的数据源。人工智能最近的许多突破并非来自更大的数据集,而是源于机器学习算法利用到了以前无法获得数据的能力。例如,二十年前,现在普遍存在的大型文本、图像、视频和音频数据集在那个时代并不存在,因此,我们应该不断寻找产生这些新的数据的机会。变得更好的四件事如果我们转换思路,专注于深度数据而不仅仅是大数据,这样将享受到以下这些好处:一切都会变得更快。使用较小的数据,对数据进行移动、实验、训练和模型评估都会快得多;需要更少的存储和计算资源。专注于深度数据意味着我们将更加智能地使用更小的磁盘并通过云计算,这样会直接降低基础设施的成本,节省下来的资金就可以聘请更多数据科学家和人工智能专家;减轻研究人员的压力并变得更加快乐。在有了深度数据思维后,团队将发现自己不太可能只是做一些打杂工作,比如制作数据集或者杀死那些占用所有云资源的错误程序等。同样,数据科学家也会花更多的时间在构建和测试模型上,而不是被数据移动或等待长时间的训练过程,这样也会使其变得更快乐。可以解决更难的问题。构建一个人工智能模型并不是一个只有像巫师一样的研究人员才能完成的神奇体验。与其说人工智能是魔法,不如说是一种逻辑。这类似于一个艺术老师告诉他班上一半的学生,他们的分数将基于他们制作的艺术作品的数量,另一半的学生将根据他们最好的作品的质量来评分。毫不奇怪,学生创作的艺术品数量会大大增加。令人震惊的是,在产量增多的同时,高品质的产品也会出现——数量有时会产生质量。在我们的例子中,在相同资源约束下尝试的更多模型可能意味着更好的最佳模型。大数据和支持它的技术突破极大地促进了许多公司在决策过程中成为数据驱动的动力。随着人工智能的兴起以及处理这些强大资源的能力,现在需要更加精确地根据我们的数据需求建立一种理解深度数据的思维,而不仅仅是大数据。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 14, 2019 · 1 min · jiezi

揭秘人工智能(系列):深度学习是否过分夸大?

摘要: 深度学习可能不是过分夸大,也许它只是没有很好地被理解!2012年左右,多伦多大学的研究人员首次使用深度学习来赢下了ImageNet,它是一项非常受欢迎的计算机图像识别竞赛。对于那些参与AI行业的人来说,这是一个大问题,因为计算机视觉是使计算机能够理解图像背景的学科,也是人工智能中最具挑战性的领域之一。当然,与任何其他产生巨大影响的技术一样,深度学习成为炒作的焦点。不同的公司和组织开始应用它来解决不同的问题(或假装应用它)。许多公司开始使用深度学习和先进的人工智能技术重塑其产品和服务。与此同时,媒体也经常撰写有关人工智能和深度学习的故事,这些故事充满误导性,并且大多是由那些对技术运作方式没有正确理解的人撰写。他们大多使用关于人工智能的耸人听闻的头条来博眼球,这些也促成了围绕深度学习的炒作。经过媒体的炒作后,许多专家认为深度学习被夸大了,它最终会消退并可能导致另一个人工智能冬季,从而使人们对人工智能的兴趣和资金投入大幅下降。其中一些著名专家也承认,深度学习已经触底,其中包括一些深入学习的先驱者。但根据著名数据科学家和深度学习研究员杰里米·霍华德的说法,“深度学习过度夸大”的论点有点夸张。霍华德是fast.ai的创始人,<u style=“box-sizing: border-box;">fast.ai</u>是一个非营利性的在线深度学习课程。今年,霍华德在USENIX Enigma会议上发表的演讲中发表了许多反对深度学习的论点。整个视频非常清楚地说明了深度学习究竟做了什么和不做什么,这个演讲可以帮助你清楚地了解该领域。以下是霍华德演讲主要反驳的几个论点:深度学习只是一种时尚-明年它将是另一回事(NO!)许多人认为深度学习是突然冒出来,最终也会突然消失。霍华德反驳解释到:“你今天在深度学习中实际看到的是几十年研究的结果,而这几十年的研究终于达到了实际上给出最先进成果的程度。”人工神经网络的概念是深度学习算法的主要组成部分,它已存在数十年,第一个神经网络可以追溯到20世纪50年代。但是,由于数十年的研究以及数据和计算资源的可用性,深度学习的概念已经从实验室走出并进入实际领域。霍华德说:“利用深度学习,人们可以减少很多复杂的繁琐的事务,我们应该期待看到[深度学习]继续发展下去而不是消失。”深度学习和机器学习是一回事(NO!)滥用人工智能词汇很容易导致了从业人员对行业的混淆和怀疑。有人说深度学习只是机器学习的另一个别称,而其他人则认为它与其他AI技术(如支持向量机(SVM),随机森林和逻辑回归)属于同一水平。但深度学习和机器学习并不相同,深度学习是机器学习的一个子集。通常,机器学习适用于基于训练数据的数学模型和行为规则的所有技术。ML技术已经投入生产使用了很长时间。在深度学习之前,科学家们必须在编写“功能”或模块方面投入大量精力,这些功能可以执行模型想要执行的任务的一小部分。例如,如果你想创建一个可以检测猫的图像的AI模型,你将不得不编写较小的程序来检测猫的特征,如耳朵、尾巴、鼻子、皮毛。而且你必须使这些程序足够强大,以便从不同角度和不同光照条件下检测这些特征,并告诉不同猫种之间的差异。最后你才能在这些功能之上进行机器学习。如果你想解决更复杂的问题,如通过MRI扫描检测乳腺癌,那么创建特征将变得更具挑战性。霍华德说:“你将需要数十名领域专家与数十名计算机程序员和数学家合作,提出这些功能概念并对其进行编程。最后使用一个经典的机器学习模型,如逻辑回归。”这项工作大概需要数年的工作。![经典的机器学习方法涉及许多复杂的步骤,需要数十名领域专家、数学家和程序员的合作](https://upload-images.jianshu…深度学习用神经网络取代了艰苦的经典机器学习过程。霍华德将神经网络描述为“无限灵活的函数”。这意味着神经网络可以应用于机器学习解决的大多数问题,而无需通过以前必须执行的所有特定于域的特征工程。要想神经网络解决特定问题,你需要调整其参数。为此,深度学习使用“梯度下降”,这是一种通用优化算法,可以将神经网络的参数与其想要解决的问题相匹配。最后,深度学习利用了近年来可用的GPU和专用硬件的强大功能,以合理快速和可扩展的方式执行这些任务。霍华德说:“只有在过去的几年里,这三件事情才能让我们真正使用神经网络来获得最先进的结果。”因此,深度学习不是通过以前机器学习方法所涉及的专业知识密集型和容易出错的过程,而是提供样本数据(例如标记为猫图片,标记为癌症或非癌症的MRI扫描…)并训练神经元使用梯度下降的网络。神经网络比较并找到这些数据样本中的常见模式,并学习应用相同的知识来分类以前从未见过的新数据样本。这种方法在过去几年中深入学习了最流行的人工智能技术,并引发了使用深度学习的应用程序的爆炸式增长。深度学习只对图像识别有益(NO!)很多人都承认深度学习是一种非常有用的人工智能技术,但很多批评者都抱怨它的使用仅限于解决涉及图像分类的问题!“图像识别非常重要!”霍华德说。几年前,霍华德和一组研究人员在肺部CT扫描上训练了一个深度神经网络,并创建了一种算法,可以检测恶性癌症肿瘤,这个算法的结果诊断的结果与四名人类放射科医师相比,假阳性和阴性率更低。霍华德还指出,许多问题可以重新理解为图像识别问题。例如,在中国古代游戏围棋中击败世界冠军的深度学习算法AlphaGo实际上是一个图像识别的卷积神经网络(CNN)。“具体来说,AlphaGo所做的是看了很多在真人玩过的围棋的例子”霍华德解释道。“基本上,他们最终做了一个图像识别神经网络,他们试图学习的东西不是这张照片是猫还是狗,而是这是一张白子赢或黑赢的围棋照片。”这种方法一直是AlphaGo和许多掌握不同棋盘和视频游戏的AI算法成功的关键因素。关键是,许多问题可以转化为图像识别问题,并通过深度学习解决。例如,霍华德深度学习课程的学生创建了一个神经网络,该网络在鼠标移动和点击的图像行为上进行训练。在这种情况下,他创建了一个卷积神经网络,试图根据这些图片预测欺诈行为。也就是说,深度学习也证明了其超越计算机视觉和图像识别领域的价值。霍华德指出,深度学习现在也适用于大多数自然语言处理(NLP)问题,这包括机器翻译和文本摘要等领域。NLP是一个关键组件,它可以使Siri,Alexa和Cortana等AI助手理解你的命令。(有一点要知道:深度学习对人类语言的掌握有限)深度学习还可以解决涉及结构化数据的问题,例如电子表格中的行和列。例如,你可以为神经网络提供一组代表金融交易及结果(欺诈或正常)的行,并对其进行训练以预测欺诈性交易。霍华德指出,深度学习也可以应用于时间序列和信号问题,例如连接到网络的不同IP地址的事件顺序或随时间收集的传感器数据。深度学习的痛点霍华德还指出了一些深度学习成效有限的领域,这些领域包括强化学习,对抗模型和异常检测。一些专家认为强化学习是当前人工智能的圣杯。强化学习涉及开发AI模型而不向他们提供大量标记数据。在强化学习中,你为模型提供问题域的约束,并让它开发自己的行为规则。AlphaGo的高级版AlphaGo Zero就是使用强化学习从头开始训练自己,然后超过了AlphaGo。虽然深度强化学习是人工智能研究中比较有趣的领域之一,但它在解决现实问题方面没有明显的进展。Google Brain AI研究员Alex Irpan在深度强化学习的极限上有一篇引人深思的文章。对抗模型是霍华德提及的另一个深度学习痛点。对抗性示例是操纵输入可能导致神经网络以非理性方式运行的实例。有很多研究人员展示了对抗性<u style=“box-sizing: border-box;">示例</u>如何能够成为对AI模型的攻击<u style=“box-sizing: border-box;">者</u>。虽然已经做了一些努力来加强深层学习模式以对抗对抗性攻击,但到目前为止,成功有限。部分挑战源于神经网络非常复杂且难以解释的事实。异常检测,霍华德谈到的第三个深度学习痛点也非常具有挑战性。一般概念是在基线数据上训练神经网络,并让它确定偏离基线的行为。这是在网络安全中使用AI的主要方法之一,一些公司正在探索这一概念。但是,它仍然无法将自己确立为对抗安全威胁的非常可靠的方法。深度学习是一个黑盒子这是一个真正令人担忧的问题,尤其是在人工智能模型被赋予关键决策的领域,例如医疗保健、自动驾驶汽车和刑事司法。那些愿意让深度学习代表他们做出决定的人需要知道推动这些决策的因素是什么?不幸的是,当你在训练神经网络时获得的性能优势会降低你在决策过程中获得的可见性。这就是深度学习通常被称为“黑匣子”的原因。但是,现在已经有了很多有趣的研究来解释AI决策,并帮助工程师和最终用户理解影响神经网络输出的元素。深度学习需要大量数据一般认为,要创建一个新的深度学习模型,需要访问数百万和数十亿个带标签的示例,这就是为什么只有大型科技公司才能创建它。“需要大量数据的说法通常不正确,因为大多数人在实践中使用迁移学习”霍华德说。迁移学习是机器学习中的一门学科,其中一个模型获得的知识被转移到执行类似任务的另一个模型。与人类如何将知识从一个领域转移到另一个领域相比,它非常原始。但是,迁移学习在深度学习领域是一个非常有用的工具,因为它使开发人员能够用更少的数据创建新模型。霍华德解释说:“你从一个预先训练好的[神经]网络开始,然后为你的特定任务微调权重。一般来说,如果你有大约1,000个示例,你应该能够建立一个良好的神经网络。”你需要博士学位才能进行核心深度学习深度学习是一个非常复杂的计算机科学领域,它涉及许多高级数学概念。但是在过去几年中,学术界已经创建了大量的工具和库来抽象出潜在的复杂性,并使你能够无须解决过多的数学问题来开发深度学习模型。Fast.ai和Keras就是两个现成的库,可用于快速开发深度学习应用程序。还有很多在线课程,包括霍华德的fast.ai,Coursera和其他课程,使你能够开始深入学习编程,只需要很少的编程知识。许多具有计算机科学以外背景的人已经能够将这些课程应用于现实世界的问题。需要明确的是,深度学习研究仍然是一个非常先进和复杂的领域,人才既稀缺又昂贵。开发新的深度学习技术的人是一些最令人垂涎和收入极高的研究人员。但这并不意味着其他人需要拥有相同水平的知识才能在他们的应用程序中使用这些研究项目的结果。深度学习需要大量的计算能力“你可能会担心你需要一个充满GPU的大房间,总的来说这并不是真的,我现在看到的绝大部分成功结果都是用一个GPU完成的。” 霍华德说大型公司和组织进行的大型研究项目需要大量的GPU,例如一款机器人手用6144 CPU和8个GPU进行训练出来的。另一个例子是OpenAI Five,一个训练有素的AI模型,可以玩著名的Dota 2在线战斗竞技游戏,OpenAI Five是用了128,000个CPU内核和256个GPU的训练的结果。但是,大多数实际问题都可以通过单个GPU解决。例如,你可以通过一个GPU来完成霍华德的Fast.ai课程。总结:我建议你观看整个视频,其中,霍华德深入研究了一些更专业的主题,例如你是否可以将深度学习应用于信息安全。重要的是我们要了解深度学习的范围和限制以及机会和优势,因为它是我们这个时代最有影响力的技术之一。深度学习不是过分夸大,也许它只是没有很好地被理解。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 14, 2019 · 1 min · jiezi

tensorflow keras 查找中间tensor并构建局部子图

在Mask_RCNN项目的示例项目nucleus中,stepbystep步骤里面,需要对网络模型的中间变量进行提取和可视化,常见方式有两种:通过 get_layer方法:outputs = [ (“rpn_class”, model.keras_model.get_layer(“rpn_class”).output), (“proposals”, model.keras_model.get_layer(“ROI”).output) ]此方法可以读取层的输出,对于输出多于1个tensor的,可以指定get_layer(“rpn_class”).output[0:2]等确定。但是对于自定义层的中间变量,就没办法获得了,因此需要使用方法二。通过 tensor.op.inputs 逐层向上查找定义一个迭代函数,不断查找def find_in_tensor(tensor,name,index=0): index += 1 if index >20: return tensor_parent = tensor.op.inputs for each_ptensor in tensor_parent: #print(each_ptensor.name) if bool(re.fullmatch(name, each_ptensor.name)): print(‘find it!’) return each_ptensor result = find_in_tensor(each_ptensor,name,index) if result is not None: return result接着获得某层的输出,调用迭代函数,找到该tensorpillar = model.keras_model.get_layer(“ROI”).outputnms_rois = find_in_tensor(pillar,‘ROI_3/rpn_non_max_suppression/NonMaxSuppressionV2:0’)outputs.append((‘NonMaxSuppression’,nms_rois))最后,调用kf.fuction构建局部图,并运行:submodel = model.keras_modeloutputs = OrderedDict(outputs)if submodel.uses_learning_phase and not isinstance(K.learning_phase(), int): inputs += [K.learning_phase()]kf = K.function(submodel.inputs, list(outputs.values()))in_p,ou_p = next(train_generator)output_all = kf(in_p)此时打印outputs可以看到类似如下:OrderedDict([(‘rpn_class’,<tf.Tensor ‘rpn_class_3/concat:0’ shape=(?, ?, 2) dtype=float32>), (‘proposals’,<tf.Tensor ‘ROI_3/packed_2:0’ shape=(1, ?, ?) dtype=float32>), (‘fpn_p2’,<tf.Tensor ‘fpn_p2_3/BiasAdd:0’ shape=(?, 192, 192, 256) dtype=float32>), (‘fpn_p3’,<tf.Tensor ‘fpn_p3_3/BiasAdd:0’ shape=(?, 96, 96, 256) dtype=float32>), (‘fpn_p4’,<tf.Tensor ‘fpn_p4_3/BiasAdd:0’ shape=(?, 48, 48, 256) dtype=float32>), (‘fpn_p6’,<tf.Tensor ‘fpn_p6_3/MaxPool:0’ shape=(?, 12, 12, 256) dtype=float32>), (‘NonMaxSuppression’,<tf.Tensor ‘ROI_3/rpn_non_max_suppression/NonMaxSuppressionV2:0’ shape=(?,) dtype=int32>)])大功告成~ ...

January 14, 2019 · 1 min · jiezi

机器学习 面试常见问题&答案 ②

欠拟合(通常代表高偏差)精度如前所述如果模型具有足够的数据,但因不够复杂而无法捕捉基本关系,则会出现偏差。这样一来,模型一直会系统地错误表示数据,从而导致预测精度低。这种现象叫做欠拟合(underfitting)。简单来说,如果模型不适当,就会出现偏差。举个例子:如果对象是按颜色和形状分类的,但模型只能按颜色来区分对象和将对象分类(模型过度简化),因而一直会错误地分类对象。或者,我们可能有本质上是多项式的连续数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据并不重要,因为模型根本无法表示其中的基本关系,我们需要更复杂的模型。过拟合(通常代表高方差)过拟合又可以称之为维度灾难。机器学习中的维度灾难 - 红色石头的专栏 - CSDN博客 https://blog.csdn.net/red_stone1/article/details/71692444过少的数据样本与有效特征,过高的维度,会导致模型学到噪声和不必要的无效特征,这个概念叫做过拟合,是维度灾难的一个直接后果。在训练模型时,通常使用来自较大母体(训练集)的有限数量样本。如果利用选择的数据子集反复训练模型,可以预料它的预测结果会因提供给它的具体样本而异。在这里,方差(variance)用来测量预测结果对于任何给定的测试样本会出现多大的变化。出现方差是正常的,但方差过高表明模型无法将其预测结果泛化到从中抽取训练样本的较大母体。对训练集高度敏感也称为过拟合(overfitting),而且通常出现在模型过于复杂或我们没有足够的数据支持它时。通常,可以利用更多数据进行训练,以降低模型预测结果的方差并提高精度。如何改进模型的有效性我们可以看到,在给定一组固定数据时,模型不能过于简单或复杂。如果过于简单,模型无法了解数据并会错误地表示数据。但是,如果建立非常复杂的模型,则需要更多数据才能了解基本关系,否则十分常见的是,模型会推断出在数据中实际上并不存在的关系。关键在于,通过找出正确的模型复杂度来找到最大限度降低偏差和方差的最有效点。当然,数据越多,模型随着时间推移会变得越好。 要详细了解偏差和方差,建议阅读 Scott Fortmann-Roe撰写的这篇文章。http://scott.fortmann-roe.com…除了选定用来训练模型的数据子集外,您使用的哪些来自给定数据集的特征也会显著影响模型的偏差和方差。聊一下模型训练过程中的学习曲线我们根据模型通过可视化图形从数据中学习的能力来探讨偏差与方差之间的关系。机器学习中的学习曲线是一种可视化图形,能根据一系列训练实例中的训练和测试数据比较模型的指标性能。在查看数据与误差之间的关系时,我们通常会看到,随着训练点数量的增加,误差会趋于下降。由于我们尝试构建从经验中学习的模型,因此这很有意义。我们将训练集和测试集分隔开,以便更好地了解能否将模型泛化到未见过的数据而不是拟合到刚见过的数据。在学习曲线中,当训练曲线和测试曲线均达到稳定阶段,并且两者之间的差距不再变化时,则可以确认模型已尽其所能地了解数据。偏差在训练误差和测试误差收敛并且相当高时,这实质上表示模型具有偏差。无论我们向其提供多少数据,模型都无法表示基本关系,因而出现系统性的高误差。方差如果训练误差与测试误差之间的差距很大,这实质上表示模型具有高方差。与偏差模型不同的是,如果有更多可供学习的数据,或者能简化表示数据的最重要特征的模型,则通常可以改进具有方差的模型。理想的学习曲线模型的最终目标是,误差小并能很好地泛化到未见过的数据(测试数据)。如果测试曲线和训练曲线均收敛,并且误差极低,就能看到这种模型。这种模型能根据未见过的数据非常准确地进行预测。说一下你理解的信息增益(Information gain)熵:表示变量的不确定性。条件熵:在一个条件下,变量的不确定性。信息增益:熵 - 条件熵在一个条件下,信息不确定性减少的程度!例子:原来明天下雨例如信息熵是2,条件熵是0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为1.99,在获得阴天这个信息后,下雨信息不确定性减少了1.99!是很多的!所以信息增益大!也就是说,阴天这个信息对下雨来说是很重要的!所以在特征选择的时候常常用信息增益,如果IG(信息增益大)的话那么这个特征对于分类来说很关键~~决策树就是这样来找特征的。说一下分类和回归的区别?两者追到本质是一样。分类模型和回归模型本质一样,分类模型可将回归模型的输出离散化,回归模型也可将分类模型的输出连续化,举几个例子:Logistic Regression 和 Linear Regression:Linear Regression: 输出一个标量wx+b,这个值是连续值,所以可以用来处理回归问题Logistic Regression:把上面的 wx+b 通过 sigmoid函数映射到(0,1)上,并划分一个阈值,大于阈值的分为一类,小于等于分为另一类,可以用来处理二分类问题更进一步:对于N分类问题,则是先得到N组w值不同的wx+b,然后归一化,比如用 softmax函数,最后变成N个类上的概率,可以处理多分类问题Support Vector Regression 和 Support Vector Machine:SVR:输出wx+b,即某个样本点到分类面的距离,是连续值,所以是回归模型SVM:把这个距离用 sign(·)函数作用,距离为正(在超平面一侧)的样本点是一类,为负的是另一类,所以是分类模型Naive Bayes 用于分类 和 回归:用于分类:y是离散的类别,所以得到离散的 p(y|x),给定 x,输出每个类上的概率用于回归:对上面离散的 p(y|x)求期望yP(y|x),就得到连续值。但因为此时y本身是连续的值,所以最地道的做法是,得到连续的概率密度函数p(y|x),然后再对y求期望。参考 http://www.cs.waikato.ac.nz/~eibe/pubs/nbr.pdf前馈神经网络(如 CNN 系列) 用于 分类 和 回归:用于回归:最后一层有m个神经元,每个神经元输出一个标量,m个神经元的输出可以看做向量v,现全部连到一个神经元上,则这个神经元输出wv+b,是一个连续值,可以处理回归问题,跟上面 Linear Regression思想一样用于N分类:现在这m个神经元最后连接到 N 个神经元,就有 N组w值不同的 wv+b,同理可以归一化(比如用 softmax )变成N个类上的概率(补充一下,如果不用 softmax,而是每个 wx+b用一个sigmoid,就变成多标签问题,跟多分类的区别在于,样本可以被打上多个标签)循环神经网络(如 RNN 系列) 用于分类 和 回归:用于回归 和 分类: 跟 CNN 类似,输出层的值 y =wv+b,可做分类可做回归,只不过区别在于,RNN的输出跟时间有关,即输出的是 {y(t),y(t+1),…}序列(关于时间序列,见下面的更新)上面的例子其实都是从 prediction 的角度举例的,如果从 training 角度来看,分类模型和回归模型的目标函数不同,分类常见的是 log loss,hinge loss, 而回归是 square loss 如文章你已看懂,点个「喜欢」即可。如若错误以及不清晰的地方,随时提出。欢迎扫一扫上面二维码加入我的个人微信号进行技术交流。 ...

January 11, 2019 · 1 min · jiezi

揭秘人工智能(系列):人工智能带来的网络安全威胁

摘要: 人工智能给网络安全带来了哪些挑战?了解下!历史表明,网络安全威胁随着新的技术进步而增加。关系数据库带来了SQL注入攻击,Web脚本编程语言助长了跨站点脚本攻击,物联网设备开辟了创建僵尸网络的新方法。而互联网打开了潘多拉盒子的数字安全弊病,社交媒体创造了通过微目标内容分发来操纵人们的新方法,并且更容易收到网络钓鱼攻击的信息,比特币使得加密ransowmare攻击成为可能。类似的威胁网络安全的方法还在不断产生。关键是,每项新技术都会带来以前难以想象的新安全威胁。最近,深度学习和神经网络在支持各种行业的技术方面变得非常突出。从内容推荐到疾病诊断和治疗以及自动驾驶,深度学习在做出关键决策方面发挥着非常重要的作用。现在我们所面临的问题是,知道神经网络和深度学习算法所特有的安全威胁是什么?在过去几年中,我们已经看到了恶意行为者开始使用深度学习算法的特征和功能来进行网络攻击的示例。虽然我们仍然不知道何时会出现大规模的深度学习攻击,但这些例子可以说成是将要发生事情的序幕。你应该知道深度学习和神经网络可用于放大或增强已存在的某些类型的网络攻击。例如,你可以使用神经网络在网络钓鱼诈骗中复制目标的写作风格。正如DARPA网络大挑战在2016年所展示的那样,神经网络也可能有助于自动发现和利用系统漏洞。但是,如上所述,我们专注于深度学习所特有的网络安全威胁,这意味着在深度学习算法进入我们的软件之前,它们不可能存在。我们也不会涵盖算法偏见和神经网络的其他社会和政治含义,如操纵选举。要研究深度学习算法的独特安全威胁,首先必须了解神经网络的独特特征。什么使深度学习算法独一无二?深度学习是机器学习的一个子集,机器学习是一个人工智能领域,其中软件通过检查和比较大量数据来创建自己的逻辑。机器学习已存在很长时间,但深度学习在过去几年才开始流行。人工神经网络是深度学习算法的基础结构,大致模仿人类大脑的物理结构。与传统的软件开发方法相反,传统的程序员精心编写定义应用程序行为的规则,而神经网络通过阅读大量示例创建自己的行为规则。当你为神经网络提供训练样例时,它会通过人工神经元层运行它,然后调整它们的内部参数,以便能够对具有相似属性的未来数据进行分类。这对于手动编码软件来说是非常困难的,但神经网络却非常有用。例如,如果你使用猫和狗的样本图像训练神经网络,它将能够告诉你新图像是否包含猫或狗。使用经典机器学习或较旧的AI技术执行此类任务非常困难,一般很缓慢且容易出错。计算机视觉、语音识别、语音转文本和面部识别都是由于深度学习而取得巨大进步的。但神经网络在保证准确性的同时,失去的却是透明度和控制力。神经网络可以很好地执行特定任务,但很难理解数十亿的神经元和参数是如何进行网络决策的。这被称为“AI黑匣子”问题。在许多情况下,即使是创建深度学习算法的人也很难解释他们的内部工作原理。总结深度学习算法和神经网络两个与网络安全相关的特征:他们过分依赖数据,这意味着他们与他们训练的数据一样好(或坏)。它们是不透明的,这意味着我们不知道它们如何起作用。接下来,我们看看恶意行为者如何利用深度学习算法的独特特征来进行网络攻击。对抗性攻击神经网络经常会犯错,这对人类来说似乎是完全不合逻辑甚至是愚蠢的。例如,去年,英国大都会警察局用来检测和标记虐待儿童图片的人工智能软件错误地将沙丘图片标记为裸体。在另一个案例中,麻省理工学院的学生表示,对玩具龟进行微小改动会导致神经网络将其归类为步枪。这些错误一直伴随着神经网络而存在。虽然神经网络通常会输出与人类产生的结果非常相似的结果,但它们并不一定经历相同的决策过程。例如,如果你只用白猫和黑狗的图像训练一个神经网络,它可能会优化其参数,根据动物的颜色而不是它们的物理特征对动物进行分类。对抗性的例子,导致神经网络产生非理性错误的输入,强调了AI算法和人类思维的功能之间的差异。在大多数情况下,可以通过提供更多训练数据并允许神经网络重新调整其内部参数来修复对抗性示例。但由于神经网络的不透明性,找到并修复深度学习算法的对抗性示例可能非常困难。恶意行为者可以利用这些错误对依赖深度学习算法的系统进行对抗性攻击。例如,在2017年,密歇根州华盛顿大学以及加州大学伯克利分校的研究人员表示,通过进行小幅调整来停止标志,他们可以使自动驾驶汽车的计算机视觉算法不可见。这意味着黑客可以强迫自动驾驶汽车以危险的方式行事并可能导致事故。如下面的例子所示,没有人类驾驶员不会注意到“被黑”的停车标志,但神经网络可能完全失明。在另一个例子中,卡内基梅隆大学的研究人员表示,他们可以欺骗面部识别系统背后的神经网络,通过佩戴一副特殊的眼镜将一个人误认为另一个人。这意味着攻击者可以使用对抗攻击来绕过面部识别身份验证系统。对抗性攻击不仅限于计算机视觉,它们还可以应用于依赖神经网络和深度学习的语音识别系统。加州大学伯克利分校的研究人员涉及了一种概念验证,在这种概念验证中,他们操纵音频文件的方式会让人耳不被注意,但会导致AI转录系统产生不同的输出。例如,这种对抗性攻击可用于以在播放时向智能扬声器发送命令的方式来改变音乐文件,播放文件的人不会注意到文件包含的隐藏命令。目前,只在实验室和研究中心探索对抗性攻击。暂时还没有证据表明发生过对抗性攻击的真实案例。发展对抗性攻击与发现和修复它们一样困难,因为对抗性攻击也非常不稳定,它们只能在特定情况下工作。例如,视角或照明条件的微小变化可以破坏对计算机视觉系统的对抗性攻击。但它们仍然是一个真正的威胁,对抗性攻击将变得商业化只是时间问题,正如我们在深度学习的其他不良用途中看到的那样。但我们也看到人工智能行业也正在努力帮助减轻对抗深度学习算法的对抗性攻击的威胁。在这方面可以提供帮助的方法之一是使用生成对抗网络(GAN)。GAN是一种深度学习技术,它使两个神经网络相互对抗以产生新数据。第一个网络即生成器创建输入数据,第二个网络,即分类器,评估由生成器创建的数据,并确定它是否可以作为特定类别传递。如果它没有通过测试,则生成器修改其数据并再次将其提交给分类器。两个神经网络重复该过程,直到生成器可以欺骗分类器认为它创建的数据是真实的。GAN可以帮助自动化查找和修补对抗性示例的过程。另一个可以帮助强化神经网络抵御对抗性攻击的趋势是创建可解释的人工智能。可解释的AI技术有助于揭示神经网络的决策过程,并有助于调查和发现对抗性攻击的可能漏洞。一个例子是RISE,一种由波士顿大学研究人员开发的可解释的人工智能技术。RISE生成热图,表示输入的哪些部分对神经网络产生的输出有贡献。诸如RISE之类的技术可以帮助在神经网络中找到可能存在问题的参数,这些参数可能使它们容易受到对抗性攻击。数据中毒(Data poisoning)虽然对抗性攻击在神经网络中可以发现并解决相关问题,但数据中毒通过利用其过度依赖数据在深度学习算法中产生问题行为。深度学习算法没有道德、常识和人类思维所具有的歧视的概念。它们只反映了他们训练的数据隐藏的偏见和趋势。2016年,推特用户向微软部署的人工智能聊天机器人提供仇恨言论和种族主义言论,在24小时内,聊天机器人变成了纳粹支持者和大屠杀否认者,然后毫不犹豫地发出了恶意评论。由于深度学习算法仅与其数据质量保持一致,因此为神经网络提供精心定制的训练数据的恶意行为者可能会导致其表现出有害行为。这种数据中毒攻击对于深度学习算法特别有效,这些算法从公开可用或由外部参与者生成的数据中提取训练。已经有几个例子说明刑事司法、面部识别和招募中的自动化系统由于其训练数据中的偏差或缺点而犯了错误。虽然这些例子中的大多数是由于困扰我们社会的其他问题而在我们的公共数据中已经存在的无意错误,但没有什么能阻止恶意行为者故意毒害训练神经网络的数据。例如,考虑一种深度学习算法,该算法监视网络流量并对安全和恶意活动进行分类。这是一个无监督学习的系统。与依赖于人类标记的示例来训练其网络的计算机视觉应用相反,无监督的机器学习系统通过未标记的数据来仔细查找共同的模式,而无需接收关于数据所代表的具体指令。例如,AI网络安全系统将使用机器学习为每个用户建立基线网络活动模式。如果用户突然开始下载比正常基线显示的数据多得多的数据,系统会将其归类为潜在的恶意意图人员。但,具有恶意意图的用户可以通过以小增量增加他们的下载习惯来欺骗系统以慢慢地“训练”神经网络以认为这是他们的正常行为。数据中毒的其他示例可能包括训练面部识别认证系统以验证未授权人员的身份。去年,在Apple推出新的基于神经网络的Face ID身份验证技术之后,许多用户开始测试其功能范围。正如苹果已经警告的那样,在某些情况下,该技术未能说出同卵双胞胎之间的区别。但其中一个有趣的失败是两兄弟的情况,他们不是双胞胎,看起来不一样,年龄相差多年。这对兄弟最初发布了一段视频,展示了如何用Face ID解锁iPhone X.但后来他们发布了一个更新,其中他们表明他们实际上通过用他们的面部训练其神经网络来欺骗Face ID。其实这是一个无害的例子,但很容易看出同一模式如何为恶意目的服务。由于神经网络不透明且开发人员不创建规则,因此很难调查并发现用户可能故意对深度学习算法造成的有害行为。基于深度学习的恶意软件今年早些时候,IBM的研究人员引入了一种新的恶意软件,它利用神经网络的特性针对特定用户隐藏恶意负载,有针对性的攻击以前是拥有大量计算和情报资源的国家和组织。但是,由IBM开发的概念验证恶意软件DeepLocker表明,此类攻击可能很快成为恶意黑客的正常操作方式。DeepLocker已将其恶意行为和有效负载嵌入到神经网络中,以将其隐藏在端点安全工具之外,后者通常会在应用程序的二进制文件中查找签名和预定义模式。DeepLocker的另一个特点是使用神经网络为其有效载荷指定特定目标。为了显示基于深度学习的恶意软件的破坏性功能,IBM研究人员为DeepLocker提供了勒索软件病毒,并将其嵌入到视频会议应用程序中。同时,恶意软件的开发人员在通过网络摄像头看到特定用户的面部时,可以训练神经网络来激活有效负载。由于恶意软件嵌入在视频会议应用程序中,因此它可以合法访问网络摄像头的视频源,并能够监控应用程序的用户。一旦目标在摄像机前显示他们的脸,DeepLocker就会释放勒索软件并开始加密用户计算机上的所有文件。黑客将能够使用DeepLocker等恶意软件根据他们的性别和种族,用特定深度学习算法来定位特定用户或群体。我们尚未了解深度学习算法和神经网络的网络安全威胁的规模。创建DeepLocker的研究人员表示,他们并不确定此类恶意软件是否已经在黑客放弃。未来在神经网络领域面临的网络安全问题,还存在诸多不确定性!本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 11, 2019 · 1 min · jiezi

深度学习在搜索业务中的探索与实践

本文根据美团高级技术专家翟艺涛在2018 QCon全球软件开发大会上的演讲内容整理而成,内容有修改。引言2018年12月31日,美团酒店单日入住间夜突破200万,再次创下行业的新纪录,而酒店搜索在其中起到了非常重要的作用。本文会首先介绍一下酒店搜索的业务特点,作为O2O搜索的一种,酒店搜索和传统的搜索排序相比存在很大的不同。第二部分介绍深度学习在酒店搜索NLP中的应用。第三部分会介绍深度排序模型在酒店搜索的演进路线,因为酒店业务的特点和历史原因,美团酒店搜索的模型演进路线可能跟大部分公司都不太一样。最后一部分是总结。酒店搜索的业务特点美团的使命是帮大家“Eat Better,Live Better”,所做的事情就是连接人与服务。用户在美团平台可以找到他们所需要的服务,商家在美团可以售卖自己提供的服务,而搜索在其中扮演的角色就是“连接器”。大部分用户通过美团App找酒店是从搜索开始的,搜索贡献了大部分的订单,是最大的流量入口。在美团首页点击 “酒店住宿”图标,就会进入上图右侧的搜索入口,用户可以选择城市和入住时间并发起搜索。酒店搜索技术团队的工作不仅有搜索排序,还有查询引导、推荐等工作,查询引导如搜索智能提示、查询纠错等。之所以还有推荐的工作,是因为很多用户在发起搜索时不带查询词,本质上属于推荐,此外还有特定场景下针对少无结果的推荐等。本文主要介绍搜索排序这方面的工作。不同搜索对比现在,大家对搜索都很熟悉,常见的有网页搜索,比如Google、百度、搜狗等;商品搜索,像天猫、淘宝、京东等;还有就是O2O(Online To Offline)的搜索,典型的就是酒店的搜索。虽然都是搜索,但是用户使用搜索的目的并不相同,包括找信息、找商品、找服务等等,不同搜索之间也存在很大的差别。上图对不同搜索进行了简单对比,可以从5个维度展开。首先是目标维度。因为用户是来找信息,网页搜索重点是保证查询结果和用户意图的相关性,而在商品搜索和酒店搜索中,用户的主要目的是查找商品或服务,最终达成交易,目标上有较大区别。用户使用不同搜索的目的不同,从而导致不同搜索对个性化程度的要求不同。交易属性的搜索,包括商品搜索和酒店搜索,对个性化程度的要求都比较高,因为不同用户的消费水平不同,偏好也不一样。在技术层面上,也存在很多不同点。网页搜索会索引全网的数据,这些数据不是它自己生产,数据来源非常多样,包括新闻、下载页、视频页、音乐页等各种不同的形态,所以整个数据是非结构化的,差异也很大。这意味着网页搜索需要拥有两种技术能力,数据抓取能力和数据解析能力,它们需要抓取网页并解析形成结构化数据。在这个层面上,酒店搜索和商品搜索相对就“幸福”一些,因为数据都是商家提交的结构化数据,相对来说更加规范。此外,酒店作为一种O2O的服务,用户在线上(Online)下单,最终需要到线下(Offline)去消费,所以就有一个位置上的约束,而位置的约束也就导致出现供给侧的约束,供给只能在某个特定位置附近。比如北京大学方圆几公里之内的酒店。这两点约束在网页搜索和商品搜索中就不用考虑,网页可以无限次的进行阅读。商品搜索得益于快递业的快速发展,在北京也可以买到来自浙江的商品,供给侧的约束比较小。介绍完不同搜索产品的特点,接下来看不同搜索产品的优化目标。通用搜索的优化目标是相关性,评价指标是DCG、NDCG、MAP等这些指标,要求查询结果和用户意图相关。对商品搜索来说,不同电商平台的优化目标不太一样,有的目标是最大化GMV,有的目标是最大化点击率,这些在技术上都可以实现。而对酒店搜索而言,因为它属于O2O的业务形态,线上下单,线下消费,这就要求搜索结果必须和用户的查询意图“强相关”。这个“强相关”包括两层含义,显性相关和隐性相关。举个例子,用户搜索“北京大学”,那么他的诉求很明确,就是要找“北京大学”附近的酒店,这种属于用户明确告诉平台自己的位置诉求。但是,如果用户在本地搜索“七天”,即使用户没有明确说明酒店的具体位置,我们也知道,用户可能想找的是距离自己比较近的“七天酒店”,这时候就需要建模用户的隐性位置诉求。美团是一个交易平台,大部分用户使用美团是为了达成交易,所以要优化用户的购买体验。刻画用户购买体验的核心业务指标是访购率,用来描述用户在美团是否顺畅的完成了购买,需要优化访购率这个指标。总结一下,酒店搜索不仅要解决相关性,尽量优化用户购买体验、优化访购率等指标,同时还要照顾到业务诉求。根据上面的分析,酒店搜索的整个搜索框架就可以拆分成三大模块:检索、排序以及业务规则。检索层包括查询理解和召回两部分,主要解决相关性问题。查询理解做的事情就是理解用户意图,召回根据用户意图来召回相关的酒店,两者强耦合,需要放在一起。检索的核心是语义理解,比如用户搜索“北京大学”,平台就知道用户想找的是“北京大学附近的酒店”,所以这个模块的优化方式是问题驱动,不断地发现问题、解决问题来进行迭代。接下来,从检索模块检索出来的酒店都已经是满足用户需求的酒店了。还是上面“北京大学”的那个例子,检索模块已经检索出来几百家“北京大学”附近的酒店,这些都是和用户的查询词“北京大学”相关的,怎么把用户最有可能购买的酒店排到前面呢?这就是排序模块要做的事情。排序模块使用机器学习和深度学习的技术提供“千人千面”的排序结果,如果是经常预定经济连锁型酒店的用户,排序模块就把经济连锁型酒店排到前面。针对消费水平比较高,对酒店要求比较高的用户,排序模块就把高档酒店排到前面,对每个用户都可以做到个性化定制。排序属于典型的技术驱动模块,优化目标是访购率,用这个技术指标驱动技术团队不断进行迭代和优化。最后是业务层面,比如有些商家会在美团上刷单作弊,针对这些商家需要做降权处理。整体框架上图是搜索的整体框架,这里详细描述下调用过程:搜索API负责接收用户的查询词并发送给搜索控制中心。控制中心把接收到的查询请求发送到检索与意图模块,搜索词会先经过查询分析模块做用户的查询意图分析,分析完之后,会把用户的查询意图分析结果传回去给业务检索模块,业务检索模块根据意图识别结果形成查询条件,然后去基础检索端查询结果。基础检索访问索引得到查询结果后,再把结果返回给上层。业务检索模块获取基础的检索结果后,会调用一些外部服务如房态服务过滤一些满房的酒店,再把结果返回给控制中心。此时,控制中心得到的都是和用户查询意图强相关的结果,这时就需要利用机器学习技术做排序。通过预测模块对每个酒店做访购率预测,控制中心获取预测模块的排序结果后,再根据业务逻辑做一些调整,最终返回结果给搜索API。可以看到,模块划分和前文描述的思想一致,检索模块主要解决用户意图识别和召回问题,也就是解决相关性。预测模块做访购率预测,业务逻辑放在搜索控制中心实现。接下来会介绍一下意图理解和排序模块中涉及的一些深度学习技术。先来看下查询理解的问题,这个模块通过数据分析和Case分析,不断的发现问题、解决问题来迭代优化。之前的评测发现少无结果的原因,主要包括以下几种:地标词:比如用户搜索“望京国际研发园”,但是后台没有一家酒店包含“望京国际研发园”这几个字,其实用户想找的是望京国际研发园附近的酒店。结构化查询:比如芍药居附近7天,酒店描述信息中没有“附近”这个词,搜索体验就比较差。这种需要对查询词做成分识别,丢掉不重要的词,并且对不用类别的Term走不同的检索域。异地查询:用户在北京搜索“大雁塔”没有结果,其实用户的真实意图是西安大雁塔附近的酒店,这种需要做异地需求识别并进行异地跳转。同义词:在北京搜索“一中”和搜索“北京第一中学”,其实都是同一个意思,需要挖掘同义词。针对这几类问题,我们分别作了以下工作:针对地标词问题,提供地标意图识别和地标策略,把地标类别的查询词改成按经纬度进行画圈检索。针对结构化查询的问题,我们对查询词做了成分识别,设计了少无结果时的多级检索架构。针对异地查询的问题,做异地意图识别和异地的跳转引导。针对语义查询的问题,做同义词和查询改写。这里的每一个模块都用到了机器学习和深度学习的技术,本文挑选两个酒店搜索中比较特殊的问题进行介绍。地标问题是O2O搜索的一个典型问题,在网页搜索和商品搜索中都较少出现此类问题。当用户搜索类似“望京国际研发园”这种查询词的时候,因为搜索的相关性是根据文本计算的,需要酒店描述中有相关文字,如果酒店的描述信息中没有这个词,那就检索不出来。比如昆泰酒店,虽然就在望京国际研发园旁边,但是它的描述信息中并没有出现“望京国际研发园”,所以就无法检索出来,这会导致用户体验较差。经过分析,我们发现有一类查询词是针对特定地点的搜索,用户的诉求是找特定地点附近的酒店,这种情况下走文本匹配大概率是没有结果的。这个问题的解法是针对这种类型的查询词,从“文本匹配”改成“坐标匹配”,首先分析查询词是不是有地标意图,如果是的话就不走文本匹配了,改走坐标匹配,检索出来这个坐标附近的酒店就可以了。这时就产生了两个问题:第一,怎么确定哪些查询词有地标意图;第二,怎么获取经纬度信息。针对这个问题,我们做了地标策略,步骤如下:多渠道获取可能包含地标词的候选集,这些候选集包括用户少无结果的查询词,以及一些酒店提供的描述信息。对候选集合进行命名实体识别(NER,Named Entity Recognition),可以得到各个命名实体的类型,标识为“地标”类型的就是疑似地标词。把疑似地标词放到美团地图服务中获取经纬度,经过人工校验无误后,存入线上数据库中;线上来查询请求时,先会去匹配精准地标库,如果匹配成功,说明这个查询词是地标意图,这时就不走文本检索了,直接在意图服务层走经纬度检索。经过人工校验的精准地标库补充到NER模型的训练数据中,持续优化NER模型。这里提到了NER模型,下面对它做一下详细的介绍。NER是命名实体识别,是机器学习中的序列标注问题,比如输入“北大附近的七天”,就会标注出来每个词的成分,这里“北大”是地标,“七天”是酒店品牌。这里的类别是根据业务特点自己定义的,酒店业务中有地标、品牌、商圈等不同的类别。与分类问题相比,序列标注问题中当前的预测标签不仅与当前的输入特征相关,还与前后的预测标签相关,即预测标签序列之间有强相互依赖关系。 解决序列标注问题的经典模型是CRF(Conditional Random Field,条件随机场),也是我们刚开始尝试的模型。条件随机场可以看做是逻辑回归的序列化版本,逻辑回归是用于分类的对数线性模型,条件随机场是用于序列化标注的对数线性模型,可以看做是考虑了上下文的分类模型。机器学习问题的求解就是“数据+模型+特征”,数据方面先根据业务特点定义了几种实体类别,然后通过“人工+规则”的方法标注了一批数据。特征方面提取了包括词性、Term文本特征等,还定义了一些特征模板,特征模板是CRF中人工定义的一些二值函数,通过这些二值函数,可以挖掘命名实体内部以及上下文的构成特点。标注数据、模型、特征都有了,就可以训练CRF模型,这是线上NER问题的第一版模型。随着深度学习的发展,用Word Embedding词向量作为输入,叠加神经网络单元的方法渐渐成为NLP领域新的研究方向。基于双向LSTM(Long Short-Term Memory)+CRF的方法成为NER的主流方法,这种方法采用双向LSTM单元作为特征提取器替代原有的人工特征,不需要专门的领域知识,框架也通用。Embedding输入也有多种形式,可以是词向量,可以是字向量,也可以是字向量和词向量的拼接。我们尝试了双向LSTM+CRF,并在实际应用中做了些改动:由于在CRF阶段已经积累了一批人工特征,实验发现把这些特征加上效果更好。加了人工特征的双向LSTM+CRF是酒店搜索NER问题的主模型。当然,针对LSTM+CRF的方法已经有了很多的改进,比如还有一种NER的方法是融合CNN+LSTM+CRF,主要改进点是多了一个CNN模块来提取字级别的特征。CNN的输入是字级别的Embedding,通过卷积和池化等操作来提取字级别的特征,然后和词的Embedding拼接起来放入LSTM。这种方法在两个公开数据集上面取得了最好的结果,也是未来尝试的方向之一。为了解决少无结果的问题,我们设计了多级检索架构,如上图所示,主要分4个层次:基本检索、二次检索、核心词检索和异地检索。基本检索会根据查询词的意图选择特定的检索策略,比如地标意图走经纬度检索,品牌意图只检索品牌域和商家名。基本检索少无结果会进行二次检索,二次检索也是分意图的,不同意图类型会有不同的检索策略,地标意图是经纬度检索的,二次检索的时候就需要扩大检索半径;品牌意图的查询词,因为很多品牌在一些城市没有开店,比如香格里拉在很多小城市并没有开店,这时比较好的做法,是推荐给用户该城市最好的酒店。如果还是少无结果,会走核心词检索,只保留核心词检索一遍。丢掉非核心词有多种方式,一种是删除一些运营定义的无意义词,一种是保留NER模型识别出来的主要实体类型。此外还有一个TermWeight的模型,对每个词都有一个重要性的权重,可以把一些不重要的词丢掉。在还没有结果的情况下,会选择”异地+全国“检索,即更换城市或者在全国范围内进行检索。多级检索架构上线后,线上的无结果率就大幅度降低了。排序排序其实是一个典型的技术问题,业界应用比较广泛的有广告排序和推荐排序,广告排序比如Google和百度的关键字广告排序,今日头条、腾讯的展示广告排序。推荐排序比如快手、抖音这些短视频平台,以及各大App、浏览器的信息流。广告排序和推荐排序优化的目标都是点击率,技术栈也比较相似,包括LR/FTRL、FM/FFM、GBDT、DNN等模型。跟以上两种排序应用相比,酒店排序有自己的业务特点,因为美团酒店具有LBS属性和交易属性,天生自带很多连续特征,如酒店价格、酒店评分、酒店离用户的距离等,这些连续特征是决定用户购买行为的最重要因素。优化目标也不一样,大部分场景下酒店搜索的优化目标是访购率,部分场景下优化目标是点击率。在技术层面,酒店排序整体的技术栈和广告、推荐比较相似,都可以使用LR/FTRL、FM/FFM、GBDT、DNN等模型。面临的挑战具体到酒店排序工作,我们面临一些不一样的挑战,主要包括以下4点:数据稀疏。住酒店本身是一种低频行为,大部分用户一年也就住一两次,导致很多特征的覆盖率比较低。业务众多。美团酒店包括国内酒店业务、境外酒店业务,以及长租、钟点房等业务,同时有美团和点评两个不同的App。场景复杂。按照用户的位置可以分成本地和异地,按照用户的诉求可以分成商务、旅游、本地休闲等几大类,这些用户之间差异很明显。比如商务用户会有大量复购行为,典型例子是美团员工的出差场景,美团在上海和北京各有一个总部,如果美团的同学去上海出差,大概率会在公司差旅标准内选一家离公司近的酒店,从而会在同一家酒店产生大量的复购行为;但是如果是一个旅游用户,他就很少反复去同一个地方。供给约束。酒店行业供给的变化很快,一个酒店只有那么多房间,一天能提供的间夜量是固定的,全部订出的话,用户提价也不会提供新的房间,这种情况在劳动节、国庆这种节假日特别明显。上图右侧是排序的整体架构图,分为线下、线上和近线上三个部分。在线下部分,主要做离线的模型调优和评估,线上部分做预测。这里比较特别的是近线上部分,我们在实时层面做了大量的工作,包括用户的实时行为、酒店实时价格、实时库存等等,以应对供给变化快的特点。这里介绍一个业务特点导致的比较独特的问题:模型切分。美团酒店有很多业务场景,包括国内酒店、境外酒店、长租、钟点房等;还有两个App,美团App和大众点评App;还有搜索和筛选两种场景,搜索带查询词,筛选没有查询词,两种场景差异较大;从地理位置维度,还可以分成本地和异地两种场景。面对这么多的业务场景,第一个问题就是模型怎么设计,是用统一的大模型,还是分成很多不同的小模型?我们可以用一个大模型Cover所有的场景,用特征来区分不同场景的差异,好处是统一模型维护和优化成本低。也可以划分很多小模型,这里有一个比较好的比喻,多个专科专家会诊,胜过一个全科医生。切分模型后,可以避免差异较大的业务之间互相影响,也方便对特殊场景进行专门的优化。在模型切分上,主要考虑三个因素:第一,业务之间的差异性。比如长租和境外差异很大,国内酒店和境外业务差异也很大,这种需要拆分。第二,细分后的数据量。场景分的越细,数据量就越小,会导致两个问题,一是特征的覆盖率进一步降低;二是数据量变小后,不利于后续的模型迭代,一些复杂模型对数据量有很高的要求。我们做过尝试,国内酒店场景下,美团和大众点评两个App数据量都很大,而且用户也很不一样,所以做了模型拆分;但是境外酒店,因为本身是新业务数据量较小,就没有再进行细分。第三,一切以线上指标为准。我们会做大量的实验,看当前数据量下怎么拆分效果更好,比如美团App的国内酒店,我们发现把搜索和筛选拆开后,效果更好;筛选因为数据量特别大,拆分成本、异地效果也更好,但是如果搜索场景拆分成本地、异地模型就没有额外收益了。最终,一切都要以线上的实际表现为准。模型演进接下来介绍一下排序模型的演进过程,因为业务特点及历史原因,酒店搜索的排序模型走了一条不一样的演进路线。大家可以看业界其他公司点击率模型的演进,很多都是从LR/FTRL开始,然后进化到FM/FFM,或者用GBDT+LR搞定特征组合,然后开始Wide&Deep。酒店搜索的演进就不太一样。酒店业务天生自带大量连续特征,如酒店价格、酒店和用户的距离、酒店评分等,因此初始阶段使用了对连续特征比较友好的树模型。在探索深度排序模型的时候,因为已经有了大量优化过的连续特征,导致我们的整个思路也不太一样,主要是借鉴一些模型的思想,结合业务特点做尝试,下面逐一进行介绍。初始阶段线上使用的模型是XGB(XGBoost, eXtreme Gradient Boosting)。作为GBDT的改进,XGB实现了非线性和自动的特征组合。树节点的分裂其实就实现了非线性,树的层次结构实现了不同特征的自动组合,而且树模型对特征的包容性非常好,树的分裂通过判断相对大小来实现,不需要对特征做特殊处理,适合连续特征。树模型的这些特点确实很适合酒店这种连续特征多的场景,至今为止,XGB都是数据量较小场景下的主模型。但是树模型优化到后期遇到了瓶颈,比如特征工程收益变小、增大数据量没有额外收益等,此外树模型不适合做在线学习的问题愈发严重。酒店用户在劳动节、国庆节等节假日行为有较大不同,这时需要快速更新模型,我们尝试过只更新最后几棵树的做法,效果不佳。考虑到未来进一步的业务发展,有必要做模型升级。模型探索的原则是从简单到复杂,逐步积累经验,所以首先尝试了结构比较简单的MLP(Multiple-Layer Perception)多层感知机,也就是全连接神经网络。神经网络是一种比树模型“天花板”更高的模型,“天花板”更高两层意思:第一层意思,可以优化提升的空间更大,比如可以进行在线学习,可以做多目标学习;第二层意思,模型的容量更大,“胃口”更大,可以“吃下”更多数据。此外它的表达能力也更强,可以拟合任何函数,网络结构和参数可以调整的空间也更大。但是它的优点同时也是它的缺点,因为它的网络结构、参数等可以调整的空间更大,神经网需要做很多的参数和网络结构层面的调整。上图是MLP的网络结构图,包含输入层、若干个隐藏层、输出层。在很长一段时间内,在特征相同的情况下,MLP效果不如XGB,所以有段时间线上使用的是XGB和MLP的融合模型。后来经过大量的网络结构调整和参数调整,调参经验越来越丰富,MLP才逐步超越XGB。这里额外说明一下,酒店搜索中有少量的ID类特征,在第一版MLP里ID类特征是直接当做连续特征处理的。比如城市ID,ID的序关系有一定的物理意义,大城市ID普遍较小,小城市开城晚一些,ID较大。在MLP阶段我们对网络结构做了大量实验,尝试过三种网络结构:平行结构、菱形结构、金字塔结构。在很多论文中提到三者相比平行结构效果最好,但是因为酒店搜索的数据不太一样,实验发现金字塔结构效果最好,即上图最右边的“1024-512-256”的网络结构。同时还实验了不同网络层数对效果的影响,实验发现3-6层的网络效果较好,更深的网络没有额外收益而且线上响应时间会变慢,后面各种模型探索都是基于3到6层的金字塔网络结构进行尝试。MLP上线之后,我们开始思考接下来的探索方向。在树模型阶段,酒店搜索组就在连续特征上做了很多探索,连续特征方面很难有比较大的提升空间;同时业界的研究重点也放在离散特征方面,所以离散特征应该是下一步的重点方向。深度排序模型对离散特征的处理有两大类方法,一类是对离散特征做Embedding,这样离散特征就可以表示成连续的向量放到神经网络中去,另一类是Wide&Deep,把离散特征直接加到Wide侧。我们先尝试了第一种,即对离散特征做Embedding的方法,借鉴的是FNN的思想。其实离散特征做Embedding的想法很早就出现了,FM就是把离散特征表示成K维向量,通过把高维离散特征表示成低维向量增加模型泛化能力。实际使用中,我们稍微做了一些改动,实验中发现使用FM预训练的效率不高,所以尝试了不做预训练直接把Embedding随机初始化,然后让Embedding跟随网络一起学习,实验结果发现比FM预训练效果还要好一点。最后的做法是没有用FM做预训练,让Embedding随机初始化并随网络学习,上图是线上的V3模型。FNN的成功上线证明离散特征Embedding这个方向值得深挖,所以我们接着实验了DeepFM。DeepFM相对于Wide&Deep的改进,非常类似于FM相对LR的改进,都认为LR部分的人工组合特征是个耗时耗力的事情,而FM模块可以通过向量内积的方式直接求出二阶组合特征。DeepFM使用FM替换了Wide&Deep中的LR,离散特征的Embedding同时“喂”给神经网和FM,这部分Embedding是共享的,Embedding在网络的优化过程中自动学习,不需要做预训练,同时FM Layer包含了一阶特征和二阶的组合特征,表达能力更强。我们尝试了DeepFM,线下有提升线上波动提升,并没有达到上线的标准,最终没有全量。尽管DeepFM没有成功上线,但这并没有动摇我们对Embedding的信心,接下来尝试了PNN。PNN的网络重点在Product上面,在点击率预估中,认为特征之间的关系更多是一种And“且”的关系, 而非Add“加”的关系,例如性别为男且用华为手机的人,他定酒店时属于商务出行场景的概率更高。PNN使用了Product Layer进行显式的二阶特征组合。上图右边是PNN的网络结构图,依然对离散特征做Embedding,Embedding向量同时送往隐层和Product层,Product通过内积或者外积的方式,对特征做显式的二阶交叉,之后再送入神经网的隐层,这样可以做到显式的二阶组合和隐式的高阶特征组合。特征交叉基于乘法的运算实现,有两种方式:内积和外积。我们尝试了内积的方式,线下略有提升线上也是波动提升,没有达到上线标准,所以最终也没有全量上线。PNN之后我们认为Embedding还可以再尝试一下,于是又尝试了DCN(Deep&Cross Network)。DCN引入了一个Cross Network进行显式的高阶特征交叉。上图右边是论文中的图,可以看到Deep&Cross中用了两种网络,Deep网络和Cross网络,两种网络并行,输入都一样,在最后一层再Stack到一起。Deep网络和前面几种网络一样,包括连续特征和离散特征的Embedding,Cross网络是DCN的特色,在Cross网络里面,通过巧妙的设计实现了特征之间的显式高阶交叉。看上图左下角的Cross结构示意,这里的x是每一层的输入,也就是上一层的输出。Feature Crossing部分包括了原始输入x0、本层输入x的转置、权重w三项,三项相乘其实就做了本层输入和原始输入的特征交叉,x1就包含了二阶的交叉信息,x2就包含了三阶的交叉信息,就可以通过控制Cross的层数显式控制交叉的阶数。不得不说,DCN在理论上很漂亮,我们也尝试了一下。但是很可惜,线下有提升线上波动提升,依然未能达到上线的标准,最终未能全量上线。经过DeepFM、PNN、DCN的洗礼,促使我们开始反思,为什么在学术上特别有效的模型,反而在酒店搜索场景下不能全量上线呢?它们在线下都有提升,在线上也有提升,但是线上提升较小且有波动。经过认真分析我们发现可能有两个原因:第一,连续特征的影响,XGB时代尝试了600多种连续特征,实际线上使用的连续特征接近400种,这部分特征太强了; 第二,离散特征太少,离散特征只有百万级别,但是Embedding特别适合离散特征多的情况。接下来方向就很明确了:补离散特征的课。最终,我们还是把目光转回Wide&Deep。Wide&Deep同时训练一个Wide侧的线性模型和一个Deep侧的神经网络,Wide部分提供了记忆能力,关注用户有过的历史行为,Deep部分提供了泛化能力,关注一些没有历史行为的Item。之前的工作主要集中在Deep测,对低阶特征的表达存在缺失,所以我们添加了LR模块以增加对低阶特征的表达,Deep部分和之前的V3一样。刚开始只用了少量的ID类特征,效果一般,后来加了大量人工的交叉特征,特征维度达到了亿级别后效果才得到很好的提升。下图是我们的V4模型:接下来介绍一下优化目标的迭代过程(后面讲MTL会涉及这部分内容)。酒店搜索的业务目标是优化用户的购买体验,模型的优化指标是用户的真实消费率,怎么优化这个目标呢? 通过分析用户的行为路径可以把用户的行为拆解成“展示->点击->下单->支付->消费”等5个环节,这其中每个环节都可能存在用户流失,比如有些用户支付完成后,因为部分商家确认比较慢,用户等不及就取消了。刚开始我们采用了方案1,对每一个环节建模(真实消费率=用户点击率×下单率×支付率×消费率)。优点是非常简单直接且符合逻辑,每个模块分工明确,容易确认问题出在哪里。缺点也很明显,首先是特征重复,4个模型在用户维度和商家维度的特征全部一样,其次模型之间是相乘关系且层数过多,容易导致误差逐层传递,此外4个模型也增加了运维成本。后来慢慢进化到了方案2的“End to End”方式,直接预测用户的真实消费率,这时只需要把正样本设定为实际消费的样本,一个模型就够了,开发和运维成本较小,模型间特征也可以复用,缺点就是链路比较长,上线时经常遇到AB测抖动问题。模型切换到神经网络后就可以做多任务学习了,之前树模型时代只预测“End to End”真实访购率,神经网络则可以通过多任务学习同时预测CTR展示点击率和CVR点击消费率。多任务学习通过硬共享的方式同时训练两个网络,特征、Embedding层、隐层参数都是共享的,只在输出层区分不同的任务。上图是酒店搜索当前线上的模型,基于Wide&Deep做的多任务学习。网络结构演进路线上图是酒店搜索排序的深度排序模型演进路线,从MLP开始,通过对离散特征做Embedding进化到FNN,中间尝试过DeepFM、PNN、DCN等模型,后来加入了Wide层进化到Wide&Deep,现在的版本是一个MTL版的Wide&Deep,每个模块都是累加上去的。除了上面提到的模型,我们还探索过这个:这是我们自己设计的混合网络,它融合了FNN、DeepFM、PNN、DCN、Wide&Deep等不同网络的优点,同时实现了一阶特征、显式二阶特征组合、显式高阶特征组合、隐式高阶特征组合等,有兴趣的同学可以尝试一下。不同模型实验结果上图是不同模型的实验结果,这里的BP是基点(Basis Point),1BP=0.01%。XGB是Baseline,MLP经过很长时间的调试才超过XGB,MLP和XGB融合模型的效果也很好,不过为了方便维护,最终还是用FNN替换了融合模型。Wide&Deep在开始阶段,提升并没有特别多,后来加了组合特征后效果才好起来。我们Embedding上面的尝试,包括DeepFM、Deep&Cross等,线下都有提升,线上波动有提升,但是未能达到上线的标准,最终未能全量。在特征预处理方面对连续特征尝试了累计分布归一化、标准化,以及手工变换如根号变换、对数变换等;累积分布归一化其实就是做特征分桶,因为连续特征多且分布范围很广,累积分布归一化对酒店搜索的场景比较有效。离散特征方面尝试了特征Embedding及离散特征交叉组合,分别对应FNN和 Wide&Deep。这里特别提一下缺失值参数化,因为酒店业务是一种低频业务,特征覆盖率低,大量样本存在特征缺失的情况,如果对缺失特征学一个权重,非缺失值学一个权重效果较好。参数调优方面分别尝试了激活函数、优化器等。激活函数尝试过Sigmoid、ReLU、Leaky_ReLU、ELU等;优化器也实验过Adagrad、Rmsprop、Adam等;从实验效果看,激活函数ReLU+Adam效果最好。刚开始时,加了Batch Normalization层和Dropout层,后来发现去掉后效果更好,可能和酒店搜索的数据量及数据特点有关。网络结构和隐层数方面用的是3到6层的金字塔网络。学习率方面的经验是学习率小点比较好,但是会导致训练变慢,需要找到一个平衡点。下面介绍深度排序模型线上Serving架构的演化过程,初始阶段组内同学各自探索,用过各种开源工具如Keras、TensorFlow等,线上分别自己实现,预测代码和其他代码都放一起,维护困难且无法复用。后来组内决定一起探索,大家统一使用TensorFlow,线上用TF-Serving,线上线下可以做到无缝衔接,预测代码和特征模块也解耦了。现在则全面转向MLX平台,MLX是美团自研的超大规模机器学习平台,专为搜索、推荐、广告等排序问题定制,支持百亿级特征和流式更新,有完善的线上Serving架构,极大地解放了算法同学的生产力。最后介绍一下我们对搜索排序技术节奏的一些理解,简单来说就是在不同阶段做不同的事情。 在上图中,横轴表示技术深度,越往右技术难度越大,人力投入越大,对人的要求也越高。纵轴是业务阶段。业务阶段对技术的影响包括两方面,数据量和业务价值。数据量的大小,可以决定该做什么事情,因为有些技术在数据量小的时候意义不大;业务价值就更不用说了,业务价值越大越值得“重兵投入”。起步阶段:起步阶段,还没有数据,这时候做简单排序就好,比如纯按价格排序或者距离排序,目的是让整个流程快速地跑起来,能提供最基本的服务。比如2017年,美团的长租业务当时就处于起步阶段。业务初期:随着业务的发展,就进入了业务发展初期,订单数慢慢增长,也有了一些数据,这时候可以增加一些启发式规则或者简单的线性模型,检索模型也可以加上。但是由于数据量还比较小,没必要部署很复杂的模型。稳定成长期:业务进一步发展后,就进入了稳定成长期,这时候订单量已经很大了,数据量也非常大了,这段时间是“补课”的时候,可以把意图理解的模块加上,排序模型也会进化到非线性模型比如XGB,会做大量的特征工程,实时特征以及实时模型,在这个阶段特征工程收益巨大。技术瓶颈期:这个阶段的特点是基本的东西都已经做完了,在原有的技术框架下效果提升变的困难。这时需要做升级,比如将传统语义模型升级成深度语义模型,开始尝试深度排序模型,并且开始探索强化学习、多模型融合、多目标学习等。中国有句俗话叫“杀鸡焉用牛刀”,比喻办小事情,何必花费大力气,也就是不要小题大做。其实做技术也一样,不同业务阶段不同数据量适合用不同的技术方案,没有必要过度追求先进的技术和高大上的模型,根据业务特点和业务阶段选择最匹配的技术方案才是最好的。我们认为,没有最好的模型,只有合适的场景。总结酒店搜索作为O2O搜索的一种,和传统的搜索排序相比有很多不同之处,既要解决搜索的相关性问题,又要提供“千人千面”的排序结果,优化用户购买体验,还要满足业务需求。通过合理的模块划分可以把这三大类问题解耦,检索、排序、业务三个技术模块各司其职。在检索和意图理解层面,我们做了地标策略、NER模型和多级检索架构来保证查询结果的相关性;排序模型上结合酒店搜索的业务特点,借鉴业界先进思想,尝试了多种不同的深度排序模型,走出了一条不一样的模型演进路线。同时通过控制技术节奏,整体把握不同业务的技术选型和迭代节奏,对不同阶段的业务匹配不同的技术方案,只选对的,不选贵的。参考文献[1] John Lafferty et al. Conditional random fields: Probabilistic models for segmenting and labeling sequence data.ICML2001.[2] Guillaume Lample et al Neural architectures for named entity recognition. NAACL2016.[3] Zhiheng Huang, Wei Xu, and Kai Yu. 2015.[4] Bidirectional LSTM-CRF models for sequence tagging. arXiv preprint arXiv:1508.01991.[5] Xuezhe Ma et al.End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF.ACL2016.[6] T Chen, C Guestrin. XGBoost: A scalable tree boosting system. KDD2016.[7] Weinan Zhang et al. Deep Learning over Multi-Field Categorical Data: A Case Study on User Response Prediction. ECIR 2016.[8] Huifeng Guo et al. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction. IJCAI2017.[9] Yanru Qu et al. Product-based neural networks for user response prediction. ICDM2016.[10] Heng-Tze Cheng et al. 2016. Wide & deep learning for recommender systems. 2016.In Proceedings of the 1st Workshop on Deep Learning for Recommender Systems.[11] Ruoxi Wang et al. Deep & Cross Network for Ad Click Predictions. ADKDD2017.作者简介艺涛,美团高级技术专家,2016年加入美团,现负责美团酒店业务搜索排序技术。2010年毕业于中科院计算所,曾在网易有道等公司工作,先后从事网页搜索、购物搜索、计算广告等方向的研发工作。曾荣获“Kaggle卫星图像分类大赛”亚军,QCon明星讲师。 ...

January 11, 2019 · 1 min · jiezi

论文<Learning to Promote Saliency Detectors>阅读

Learning to Promote Saliency Detectorshttps://github.com/lartpang/M…缩写标注:SD: Saliency DetectionZSL: Zero-Shot Learning关键内容:没有训练直接将图像映射到标签中的DNN。相反,将DNN拟合为一个嵌入函数,以将像素和显著/背景区域的属性映射到度量空间。显着/背景区域的属性被映射为度量空间中的锚点。然后,在该空间中构造最近邻(NN)分类器,将最近的锚点的标签分配给对应的像素.保持分辨率的手段:移除了最后两个卷积块的池化层, 使用扩张卷积来维持卷积滤波器的感受野添加亚像素卷积层到每个VGG特征提取器的卷积块后, 来上采样每个卷积块的特征图到输入图像大小.使用了迭代训练/测试的策略.这里没有提到训练迭代次数如何确定测试的迭代次数是人工给定的一些想法:类似于R3Net, 最后的添加的结构都是反复迭代测试后才确定使用多少次, 而且按照相关的测试可以看出来, 一定次数后, 提升的效果就趋于饱和了, 只能说这里的提到的方法对于现有网络的提升具有一定的助益.对于这里提到的, 这是类似于一种ZSL的方法, 也就是利用现有的SD算法产生的结果(“过去的知识”), 添加的新结构, 不断利用过去的知识迭代, 实现对于最终"后处理"后结果的一个促进(“来对现有的SD算法进行推广”).一些疑惑:如何将这个方法应用到现有的架构呢? 如何改造现有架构?改造后的结构, 训练的时候也要按照文中那样, 随机翻转真值中的像素标签么?这里的第6层是哪里来的?是前面的5C通道的特征输出汇总来的?AbstractThe categories and appearance of salient objects varyfrom image to image, therefore, saliency detection is animage-specific task. Due to lack of large-scale saliency training data, using deep neural networks (DNNs) with pre-training is difficult to precisely capture the image-specific saliency cues. To solve this issue, we formulate a zero-shot learning problem to promote existing saliency detectors.Concretely, a DNN is trained as an embedding function to map pixels and the attributes of the salient/background regions of an image into the same metric space, in which an image-specific classifier is learned to classify the pixels.Since the image-specific task is performed by the classifier, the DNN embedding effectively plays the role of a general feature extractor.Compared with transferring the learning to a new recognition task using limited data, this formulation makes the DNN learn more effectively from small data.Extensive experiments on five data sets showthat our method significantly improves accuracy of existing methods and compares favorably against state-of-the-art approaches.显着对象的类别和外观因图像而异,因此,显着性检测是特定于图像的任务。由于缺乏大规模显着性训练数据,使用具有预训练的深度神经网络(DNN)难以精确捕获图像特定显着性线索。为了解决这个问题,我们制定了一个零次学习问题来推广现有的显着性检测器。具体地,DNN被训练为一个嵌入函数,以将像素和图像的显着/背景区域的属性映射到相同的度量空间,其中, 图像特定的分类器被学习来对像素进行分类。由于图像特定任务由分类器执行,因此DNN嵌入有效地扮演一般特征提取器的角色。与使用有限数据将学习转移到新的识别任务相比,该设定使DNN从小数据中更有效地学习。对五个数据集进行的大量实验表明,我们的方法显着提高了现有方法的准确性,并且与最先进的方法相比具有优势。这里提到了一点, 使用 ZSL 问题来推广现有的SD器. 怎么推广?补充内容 ZSL[零次学习(Zero-Shot Learning)]假设小暗(纯粹因为不想用小明)和爸爸,到了动物园,看到了马,然后爸爸告诉他,这就是马;之后,又看到了老虎,告诉他:“看,这种身上有条纹的动物就是老虎。”;最后,又带他去看了熊猫,对他说:“你看这熊猫是黑白色的。”然后,爸爸给小暗安排了一个任务,让他在动物园里找一种他从没见过的动物,叫斑马,并告诉了小暗有关于斑马的信息:“斑马有着马的轮廓,身上有像老虎一样的条纹,而且它像熊猫一样是黑白色的。”最后,小暗根据爸爸的提示,在动物园里找到了斑马(意料之中的结局。。。)。上述例子中包含了一个人类的推理过程,就是利用过去的知识(马,老虎,熊猫和斑马的描述),在脑海中推理出新对象的具体形态,从而能对新对象进行辨认。ZSL就是希望能够模仿人类的这个推理过程,使得计算机具有识别新事物的能力。结合起来看, 也就是说可以利用过去的知识, 来对现有的SD器进行推广.这个过程是什么样的呢?Introduction传统的显着性检测方法通常是利用低级别的特征和启发式先验,它们不能在复杂的场景中发现显着的对象,也就不能够捕获语义对象。随着DNN的流行, 可以学习来自训练样本的更为高层的语义特征, 因此对于定位语义显著性区域更为有效, 在复杂场景下也会更为有效.使用DNN就要考虑一个问题, 数据. DNN通常在大量数据的基础上来训练, 而SD的数据是比较有限的, 这个问题通常用在其他任务的大数据集(如分类任务)上预训练的手段来解决, 然而这很容易导致其他问题:从图上可以看出来, 分类任务训练出来的模型, 最后的特征图中关注的重点对于SD任务而言, 在两列的特征图中不加区分地突出显示符号和人的区域。哪个图"不加区分地突出显示符号和人的区域"?预训练任务与SD的差异: 由预先训练的特征提取器产生的特征假定用于所有图像。例如,标志和人是图1第一列中的显着对象,而它们属于第二列中的背景。然而,在两列的特征图中不加区分地突出了标志和人的区域。使用这种特征提取器,可以强制预测模型学习将相似特征映射到相反标签,这对于小训练数据集来说是困难的。显着对象的类别和外观因图像而异,而小的训练数据不足以捕捉多样性. 例如,图1中所示的六个显着对象来自六个不同的类别,并且它们的外观差别很大。因此,可能很难学习统一的检测器来处理各种显着对象。考虑到显着对象的多样性,我们没有训练直接将图像映射到标签中的深度神经网络(DNN)。相反,我们将DNN训练为一个嵌入函数,以将像素和显著/背景区域的属性映射到度量空间。显着/背景区域的属性被映射为度量空间中的锚点。然后,在该空间中构造最近邻(NN)分类器,将最近的锚点的标签分配给对应的像素。作为非参数模型,NN分类器可以很好地适应新数据并处理显着对象的多样性。另外,由于分类任务是由NN分类器执行的,因此DNN的目标转向学习从显着/背景区域的属性到嵌入空间中的锚点的一般映射。与直接学习检测不同的显着对象相比,网络更容易学习有限的数据.补充内容: 嵌入(Embedding)嵌入意味着将数据转换为特征表示,其中某些属性可以用距离的概念表示。例如,针对用于说话者识别的语音信号训练的模型可以允许您将语音片段转换为数字向量,使得来自相同说话者的另一片段与原始向量具有小的距离(例如,欧几里德距离)。或者,不同的嵌入函数可能允许您根据信号中所说的单词转换语音信号。因此,如果在这些片段中使用相同的单词,则在两个语音信号的编码表示之间将获得小的欧几里德距离。另外, 你可能只想学习一种嵌入,它代表语音信号的“情绪”,例如:“快乐”与“悲伤”与“愤怒”等。两个语音信号的编码表示之间的小距离将意味着相似的情绪,反之亦然。或者例如,word2vec embeddings, 在一个空间中“映射”一个单词,其中这些单词之间的欧几里德距离代表语义相似性(同样, embedding ~ 为您提供给定单词的数字向量)。因此,如果你使用“德国”的word2vec表示,从中减去“柏林”,并将结果添加到“法国”,你会得到一个矢量, 在欧几里德空间非常接近“巴黎”的嵌入(the embedding for “Paris”)!同样,在需要分类成数十万或数百万个类的应用程序中,例如面部识别,一种常见的方法是使用“度量学习”技术(通常是具有所谓的对比或三重丢失的连体CNN(Siamese CNNs with so-called contrastive or triplet loss)),这在测试时允许您在面部的矢量表示上使用最近邻技术!另一个介绍:Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。具体地说,我们在图2中显示了我们提出的方法的流程。在训练期间,DNN具有真实的显着区域和背景区域,其中几个随机选择的像素的标签被翻转,以产生锚点。NN分类器的输出构成了saliency map。DNN可以通过此显着性图和真值之间的损失进行端到端的监督训练。当在图像上进行测试时,每个图像的显着性图像按照训练的流程来获得,使用的是现有方法来检测的近似的显著性/背景区域。尽管近似显着/背景区域不完全正确,但是它通常与真实的显著性/背景区域有着相似的属性。因此,对应的嵌入向量(即锚点)将接近真实的显着/背景区域的向量。此外,为了产生更好的结果,我们提出了一个迭代测试的方案。NN分类器的结果用于修改锚点,从而产生越来越精确的结果。迭代测试的想法, 如何实现? 在测试的时候, 你的迭代只能使用测试集的图片数据和你预测出来的结果, 不可以在真实值上进行迭代, 那这里的迭代如何片定效果, 如何学习? 这里的进一步迭代测试的操作就是一种后处理手段, 但是如何迭代那? 何时终止迭代?这里的方法可以看作是一个ZSL问题,其中由现有方法检测到的近似显着/背景区域为未看到的显著性对象提供属性,并且模型从训练数据中学习去从属性中学习一个特定于图像的分类器来分类此图像的像素。对五个数据集的大量实验表明,该方法可以显着提高现有方法的准确性,并且与现有技术方法相比具有优势。Related worksGenerally, saliency detection methods can be categorized into two streams: top-down and bottom-up saliency. Since our work addresses bottom-up saliency, here we mainly review recent works on bottom-up saliency, meanwhile shortly mention top-down saliency. We also explore the relation between our proposed method and top-down saliency.BUBottom-up (BU) saliency is stimuli-driven(刺激驱动), where saliency is derived from contrast among visual stimuli(视觉刺激).Conventional bottom-up saliency detection methods often utilize low-level features and heuristic priors(启发式).Jiang et al. [12] formulate saliency detection via an absorbing Markov chain(吸收马尔可夫链http://www.vartang.com/2013/0…) on an image graph model, where saliency of each region is defined as its absorbed time from boundary nodes.Yang et al. [32] rank the similarity of the image regions with foreground cues or background cues via graph-based manifold ranking(通过基于图的流形排序对图像区域与前景线索或背景线索的相似性进行排序).Since the conventional methods are not robust in complex scenes neither capable of capturing semantic objects, deep neural networks (DNNs) are introduced to overcome these drawbacks.Li et al. [16] train CNNs with fully connected layers to predict saliency value of each superpixel, and to enhance the spatial coherence(空间连贯性) of their saliency results using a refinement method.Li et al. [18] propose a FCN trained under the multi-task learning framework for saliency detection.Zhang et al. [34] present a generic framework to aggregate multi-level convolutional features for saliency detection.Although the proposed method is also based on DNNs, the main difference between ours and these methods is that they learn a general model that directly maps images to labels, while our method learns a general embedding function as well as an image-specific NN classifier.TDTop-down (TD) saliency aims at finding salient regions specified by a task, and is usually formulated as a supervised learning problem.Yang and Yang [33] propose a supervised top-down saliency model that jointly learns a Conditional Random Field (CRF) and a discriminative dictionary.Gao et al. [9] introduced a top-down saliency algorithm by selecting discriminant features from a pre-defined filter bank(预定义的过滤器库).TD+BUIntegration of TD and BU saliency has been exploited by some methods.Borji [3] combines low-level features and saliency maps of previous bottom-up models with top-down cognitive visual features to predict fixations.Tong et al. [26] proposed a top-down learning approach where the algorithm is bootstrapped with training samples generated using a bottom-up model(该算法使用自下而上模型生成的训练样本进行引导) to exploit the strengths of both bottom-up contrast-based saliency models and top-down learning methods.Our method also can be viewed as an integration of TD and BU saliency. Although both our method and the method of Tonget al. [26] formulate the problem as top-down saliency detection specified by initial saliency maps, there are certain difference between the two.First, Tong’s method trains a strong model via boostrap learning(引导学习) with training samples generated by a weak model. In contrast, our method maps pixels and the approximate salient/background regions into a learned metric space, which is related to zero-shot learning.Second, thanks to deep learning, our method is capable of capturing semantically salient regions and does well on complex scenes, while Tong’s method uses hand-crafted features and heuristic priors, which are less robust.Third, our method produces pixel-level results, while Tong’s method computes saliency value of each image region to assemble a saliency map, which tends to be coarser.The Proposed MethodOur method consists of three components:a DNN as an embedding function i.e. the anchor network, that maps pixels and regions of the input image into a learned metric spacea nearest neighbor (NN) classifier in the embedding space learned specifically for this image to classify its pixelsan iterative testing scheme that utilizes the result of the NN classifier to revise anchors(修改锚点), yielding increasingly more accurate results.The anchor network这部分主要是进行了一个映射的操作. 一个是映射图像中的像素点, 一个是映射图像中的显著性/背景区域.像素点通过一个DNN建模的嵌入函数, 来映射到一个D维度量空间的向量上.图像中的显著性/背景区域也同样被DNN映射到了D维度量空间中的向量上, 也就是这里提到的锚点(anchors).We assume that in the embedding space, all pixels of an image cluster around the corresponding anchors of this image. Then a nearest neighbor classifier can be built specifically for this image by classifying each pixel according to its nearest anchor.我们假设在嵌入空间中,图像的所有像素都聚集在这个图像的相应锚点周围。然后,通过根据最近的锚对每个像素进行分类,可以为该图像特定地构建最近邻分类器.感觉可以这样理解: 因为并不知道哪个维度上可以看作是所谓的"embedding space", 所以目的就是去近似逼近这样一个空间的表示. 这也算是深度网络的一个拟合作用的体现, 告诉他应该存在这样一个维度的空间, 是可以满足这样的要求, 给它限制, 让它训练学习, 逐步逼近拟合到这样一个结果上.为了做出这样的约束, 给定一个概率, 也就是对应的像素x属于显著性/背景区域C的条件概率, 由该测度空间上两个向量的距离d对应的softmax函数表示得到:这里的目的是要不断的提升属于对应区域的像素被判定归属于该区域的概率, 这里使用梯度上升法:这里的t是一个指示变量, 类似与指示函数的作用, 等于1的时候, 表示该像素属于实际属于区域1, 也就是显著性区域, 等于0表示属于区域2, 也就是背景区域.但是这里要注意, 对于锚点而言, 是使用真实标注来转化生成的, 所以在测试的时候, 就得考虑如何处理了. 这里使用的是利用生成的显著性图来进行生成anchors, 这是不准确的.为了匹配训练和测试条件, 但是又不能改动测试的真值, 只能对训练的流程进行改进. 在训练期间, 当生成anchors时, 以概率p随机翻转每一个像素的标签. 这种处理额外带来的一个好处是, 一定程度上增加了训练样本的多样性, 有一定的抗过拟合的作用.下面是算法的流程训练需要迭代, 迭代的过程, 就是不断的随机翻转标签, 计算像素和区域锚点的映射向量, 最大化对数似然, 更新参数. 注意上图中真值使用的方法.Iterative testing scheme测试期间生成锚点是个需要注意的问题, 因为真值认为是未知的, 这里就尝试根据 现有方法生成的显著性图(先验) 选择的近似的显著性/背景区域来生成锚点(要注意, 本文提出的实际上是一个后处理的方法, 目标是对于现有架构的进一步提升). 这里使用了一个迭代的测试方案使用NN分类器, 来逐渐调整锚点,.在这个迭代的过程中, 会使用到一个随之不断迭代的先验显著性图(初始的先验显著性图$Y^{(0)}_m$是由现有的方法生成的), 流程中使用的先验显著性图, 是通过这个公式迭代计算的:这里的Y就是迭代中使用的先验显著性图, 被用来选择下一次迭代中的显著性和背景区域. 而且随着迭代不断地开始, 新的结果所占的比例越来越低, 这将确保迭代过程的稳定性.上图展示了提出的方法对于显著性图的不断的优化提升的过程.这个过程实际上就是先对像素映射向量, 然后开始迭代, 最开始的先验使用的是现有方法生成的显著性图, 也就是$Y^{0}$, 利用先验图选择前景背景, 也就是下图中的位置, 进而生成近似的锚点(利用先验图作为类似训练时的真值, 与从网络中提取出来的特征层相乘(实际上是选择了前景与背景区域之后)在送入区域嵌入结构生成锚点).根据公式3, 对每个像素计算其显著性值(也就是属于显著性区域的概率值), 来构建另一个新的显著性图, 利用迭代公式进行迭代计算(相当于是d位置与i位置显著图的合并). 之后按照上图那样送入结构中.要注意, 这里的迭代次数T是给定的.(这就有点不智能了)尽管初始的显著性图没能准确的区分出来前景和背景, 但是它通常能部分的区分它们, 因此可以提供关于图像中显著性目标的类别和外观的信息.例如,在图3的第一张图片中,尽管只有一小部分前景被突出显示,但初始显著性图可以告诉我们前景可能是一只大猩猩,而背景则包含一片绿色。(这应该算是合理推测)然后,其选定的前景/背景区域应该与真实的前景/背景区域相似,从而导致相应的锚点与学习到的度量空间中的真实区域相关联。因此,方程3给出的最近邻分类可以产生良好的结果。随着迭代的进展,近似锚点逐渐接近真实锚点,这将导致更好的结果。这反过来可以提供对锚点的越来越精确的近似,并且产生更准确的结果。如图3所示,初始显著性图并不吸引人,而迭代修改后的图看起来要好得多。对于数据较为有限的SD任务, 选择在尝试调整在分类数据集预训练的模型(这里使用ImageNet上预训练过的VGG16), 来拟合为像素嵌入函数和区域嵌入函数, 以实现数据的映射. 由于不再是分类器, 去掉全连接, 只保留特征提取组件, 包含五个卷积块. 并且实际中也使用了BN和ReLU操作.Pixel embedding由于VGG特征提取器本身会导致特征图不断地缩小, 这并不是想要的结果, 因为这里提出的方法是要实现对于输入图像的每个像素来映射一个向量, 需要这个嵌入CNN产生一个具有与输入图像相同分辨率的特征图.这里采用了两个策略来获取更大的特征图.移除了最后两个卷积块的池化层, 使用扩张卷积来维持卷积滤波器的感受野添加亚像素卷积层到每个VGG特征提取器的卷积块后, 来上采样每个卷积块的特征图到输入图像大小.要注意, 这里实际上最后剩下来的只有两个最大池化, 可见代码:self.proc_feats_list = nn.ModuleList([ # convtranspose2d=>out_size=(in_size-1)xstride-2xpadding+kernel_size nn.Sequential( # x4 512卷积块对应的输出 nn.ConvTranspose2d(dims[0], dims[0], 8, 4, 2), nn.Conv2d(dims[0], odims[0], kernel_size=3, padding=1)), nn.Sequential( # x4 512对应的输出 nn.ConvTranspose2d(dims[1], dims[1], 8, 4, 2), nn.Conv2d(dims[1], odims[1], kernel_size=3, padding=1)), nn.Sequential( # x4 256对应的输出 nn.ConvTranspose2d(dims[2], dims[2], 8, 4, 2), nn.Conv2d(dims[2], odims[2], kernel_size=3, padding=1)), nn.Sequential( # x2 128对应的输出 nn.ConvTranspose2d(dims[3], dims[3], 4, 2, 1), nn.Conv2d(dims[3], odims[3], kernel_size=3, padding=1)), # 使用亚像素卷积实现上采样 ############################################# # 不清楚这里为什么放弃了使用亚像素卷积的手段 # 这里的nn.PixelShuffle(up_scale)便是可以用来实现亚像素卷积的一个类 # nn.Sequential( # nn.Conv2d(dims[0], odims[0], kernel_size=3, padding=1), # nn.PixelShuffle(4)), # nn.Sequential( # nn.Conv2d(dims[1], odims[1], kernel_size=3, padding=1), # nn.PixelShuffle(4)), # nn.Sequential( # nn.Conv2d(dims[2], odims[2], kernel_size=3, padding=1), # nn.PixelShuffle(4)), # nn.Sequential( # nn.Conv2d(dims[3], odims[3], kernel_size=3, padding=1), # nn.PixelShuffle(2)), # x1 64 对应的输出 nn.Conv2d(dims[4], dims[4], kernel_size=3, padding=1),])Subpixel convolution is an upsampling strategy originally proposed in [Real-time single im-age and video super-resolution using an efficient sub-pixelconvolutional neural network] for image super-resolution.这里也提示了一点, 对于深度学习实现的显著性检测手段, 里面会涉及到分辨率的恢复操作, 也就是所谓的上采样, 由于网络的深层事实上需要更大的感受野, 所以说, 对于往常的池化层不能轻易去除, 而要找到合适的替代, 这里提供了几个思路, 一个是使用扩张卷积替代池化操作, 一个是使用超分辨率重建(本质都是低分辨率重建为高分辨率)的思想.为了生成C通道的N倍输入大小的tensor, 亚像素卷积首先通过一般的卷积得到一个 $N^2 \times C$ 通道的与原输入一致大小的tensor. 然后这个tensor被重新调整为C通道的N倍于输入大小的tensor.本小节补充内容:超分辨率技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像,在监控设备、卫星图像和医学影像等领域都有重要的应用价值。SR可分为两类:从多张低分辨率图像重建出高分辨率图像和从单张低分辨率图像重建出高分辨率图像。基于深度学习的SR,主要是基于单张低分辨率的重建方法,即Single Image Super-Resolution (SISR)。如果做SR(超分辨率)的话,需要将一张低分辨率图像转换成一张高分辨率图像。如果直接用deconvolution作为upscale手段的话,通常会带入过多人工因素进来(有不少论文提到这个)。而sub-pixel conv会大大降低这个风险。Subpixel convolution是一种巧妙的图像及特征图upscale的方法,又叫做pixel shuffle(像素洗牌), 亚像素卷积操作就是通过生成更多的特征层, 然后利用它们数据的周期性组合, 来实现分辨率的提升.上图很直观得表达了sub-pixel convolution的做法,前面就是一个普通的CNN网络,到后面彩色部分就是sub-pixel conv的操作了。首先,如果我想对原图放大3倍,那么我需要生成出3^2=9个same size的特征图。将九个same size的特征图拼成一个X3的大图,这就是sub-pixel convolution的操作了。这是一种抽样的反思想,如果把一张x3的大图,每隔三个点抽样一个,那就会得到9张低分辨率的图像。于是,如果我们可以通过CNN来获得9张符合分布的低分辨率图像,那么就可以组成一张高分辨率的大图。通过在五个卷积块后添加一个亚像素卷积层, 这里会获取5个C通道的特征图, 5个特征图级联, 想成一个5C通道的特征图. 但是直接使用和这个级联的特征图不是最好的选择, 因为不同的卷积块之间有着不同的感受野(区域不同), 为了解决这个问题, 额外添加了两个卷积层来转化这个级联特征图为一个D通道的特征图(特征融合), 其中的每个D维向量就被认为是每个像素所对应的的D维表示.文中的实现里, 设定C为64, D为512.Region embedding为了简单, 对于两个嵌入操作(像素和区域), 共享相同的特征提取器和亚像素上采样层.新的层被添加在亚像素卷积层后, 来匹配图片区域的5C通道特征图到一个D维向量.这里考虑了两种结构:基于卷积的区域嵌入结构: 5C-channel->Convs->D-channel->channel-wise-average->D-vector基于全连接的区域嵌入结构 5C-channel->channel-wise-average->5C-vevtor->FC->D-vectorExperiments评价标准PR曲线F测度曲线F测度得分MAE得分The precision of a binary map is defined as the ratio of the number of salient pixels it correctly labels, to all salient pixels in this binary map. 预测的二值图像中的预测的显著性目标区域标注正确的比例. 就是预测为真值(预测为显著性区域)中的实际真值(实际的显著性区域)的比例.The recall value is the ratio ofthe number of correctly labeled salient pixels to all salient pixels in the ground-truth map. 实际真值中被正确标出的比例.in which TS denotes true salient pixels, DS denotes detected salient pixels by the binary map, and $|·|$ denotes cardinality of a set.F测度使用下式计算.曲线的计算按照动态阈值来计算.Given a saliency map whose intensities are in the rangeof 0 and 1, a series of binary maps can be produced by thresholding the saliency map with different values in [0,1].Precision and recall values of these binary maps can becomputed according to Eqn. 6. F-measure can be computed according to Eqn. 7.Plotting the (precision, recall) pairs of all the binary maps results in the precision-recall curve, and plotting the (F-measure, threshold) pairs results in theF-measure curve.Also as suggested in [1], we use twice the mean valueof the saliency maps as the threshold to generate binary maps for computing the F-measure.Notice that some works have reported slightly different F-measures using different thresholds. But as far as we know, twice the mean value isthe most commonly used threshold.As complementary to PR curves, mean absolute error(MAE) is used to quantitatively measure the average difference between the saliency map S and the ground truth map G.MAE indicates how similar a saliency map is compared to the ground truth. It is widely used in different pixel-level prediction tasks such as semantic segmentation and image cropping [22].Implementation detailsWe train our model on the training set of DUTS dataset.As in [20], we augment the training data by horizontal flipping and cropping the images to reduce overfitting.The probability $p$ of randomly flipping ground truth when producing anchors during training is set to 0.05.We comparetwo type of region embedding in Sec.4.4, and adopt theConv-based one in other experiments.Adam [14] optimization method is used for training our model.Learning rateis set to 1e-3.We do not use a validation set, and train our model until its training loss converges.The training process takes almost 16 hours and converges after around 300 kiterations with mini-batch of size 1.From this comparison we can see that the performance of FC-based and Conv-based region embedding is comparable.The FC-based region embedding yields relatively larger F-measureConv-based region embedding is more superior in terms of MAEWe show the effect of the proposed iterative approximation scheme in Figure 5. As shown in Figure 5, the first iteration improve the F-measure and decrease MAE most significantly. The improvement slows down with iterations, and saturates(饱和) gradually.PerformanceWe apply our method to promote the performance of each baseline method, by using its predicted saliency maps to generate initial anchors in Eqn.3.Figure 6 shows the PR curves of the baseline methods and the one promoted by our method.Table 2 shows the F-measure and MAE scores of 8 deep learning based methods and the corresponding promoted results.The quantified improvements in F-measure and MAE of applying our method to conventional methods are shown in Table 3.As shown in Figure 6, Table 2, and Table 3, our method drastically(大幅) promotes all the baseline methods.观察数据可知论文提出的方法, 对于已有的深度方法和传统的方法都有提升.Notice that the results shown here are obtained by iterating Alg. 2 only once for fast testing speed.As shown in Sec.4.4, better results can be achieved through iterating Alg. 2 more times.Figure 7 shows a visual comparison of saliency maps produced by some state-of-the-art methods and the promoted ones by our method.It can be seen that the saliency maps produced by our methods highlight salient regions that are missed by the baselines.Further, our method can suppress the background regions that are wrongly labeled as salient by the baseline methods(我们的方法可以抑制基线方法错误标记为显着的背景区域。).总结In this paper, we propose a novel learning method to promote existing salient object detection methods. Extensive experiments on five benchmark datasets show that our method can significantly improve accuracy of existing methods and compares favorably against state-of-the-arts(我们的方法可以显着提高现有方法的准确性,并且与现有最优技术相比具有优势).参考链接零次学习入门: https://zhuanlan.zhihu.com/p/...What is embedding | embedded space | feature embedding in deep neural architectures?: https://www.quora.com/What-is…有谁可以解释下word embedding? - 寒蝉鸣泣的回答 - 知乎: https://www.zhihu.com/questio...Sub-pixel Convolution(子像素卷积): https://blog.csdn.net/leviopk… ...

January 10, 2019 · 9 min · jiezi

2018年,自然语言处理最全的应用与合作

摘要: 机器翻译、语音交互、汽车、医疗、法律、金融、广告、电商,全年案例大合集。2018年见证了 NLP 许多新的应用发展。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他在一份报告中总结出,NLP 不仅在聊天机器人和机器学习中有所突破,也在医疗健康、金融、法律和广告等行业中有崭新的表现。点击文章中的链接,可查看详细信息。聊天机器人聊天机器人是一项非常重要的研究领域,因为包括了 NLP 所覆盖的几大目标。这篇 Wired 文章,解释语音情感识别如何帮助机器与人类建立更加健康的关系。梅赛德斯奔驰发布了聊天机器人 MBUX,据称能为顾客创造“最会聊天的汽车”,让人与汽车可以通过自然的对话进行聊天。NLP 创业公司 Hugging Face 获得400万美元融资,打造情感智能聊天机器人。Wired 还发布了一篇文章讨论 Facebook 的虚拟助理 M ,以及为何公司计划将其关闭。此前就有许多人认为,也许聊天机器人只是一个泡沫,因为目前的 NLP 和 AI 的技术水准还无法达到顾客的预期。这篇文章讨论 Passage AI 如何使用 NLP 和深度学习技术来训练顶尖的聊天机器人,用英语、西班牙语和中文进行聊天。谷歌研究人员开发了一系列技术,深化聊天中的语意文本相似度。Mastercard 称,聊天银行也许已经成为主流。艾伦 AI 研究院通过 Alexandria 项目开发具有常识的AI。AskArvi 使用 NLP 和深度学习,理解顾客的需要,从而推荐合适的保险项目。亚马逊的新技术和 API 将提供能够离线使用的机器学习工具。Facebook 提交了一个电商聊天机器人的专利申请,以 NLP 为其核心技术。谷歌发布 Google Duplex,用于进行自然聊天,通过电话实现“真实世界”任务。这项技术在谷歌2018 IO 大会发布。医疗健康Jessica Kent 探讨如何将 NLP 应用于电子医疗记录,精确分析并改善心脏衰竭的病人护理。Anthem 与 doc.ai 合作,分析和预测病人的过敏模式。MIT 研究人员打造了一个基于 AI 的众筹平台,打造一个可以分析药物与蛋白质的系统。据一份新报告称,NLP 和 AI 将把医疗从线下服务,改变为不受医生地理位置限制的高质量服务。DeepMind 称其开发了一项新技术,能自动探测和治疗视网膜疾病。一种基于 NLP 的新文本挖掘技术,可以通过病人的生物标记来决定癌症治疗方案。创业公司 Proven Beauty 使用 NLP 为顾客提供个人化的护肤产品线。看 NLP 如何帮助改善医疗文档。BrightSign 是一款智能手套,使得具有语言残疾的人能够更好地沟通。一家医疗机构使用深度学习和计算机视觉技术在 CT 扫描中检测疾病,比人类肿瘤学家的速度快150倍。看谷歌如何通过技术,提升人们的健康水平。自动化心理治疗机器人 Woebot 获得A轮800万美元融资。Stitch CEO 讨论如何通过数据来销售个人化时尚。Linguamatics 提供基于文字药物发现和研究的工具库。机器学习工具谷歌发布 Cloud AutoML,目标是为大企业提供云端 AI 服务,这是谷歌普及 AI 使命的一部分。谷歌 AI 发布 BigQuery ML,能让数据科学家在大规模结构化和半结构化数据库上使用机器学习模型。Fast.ai 与 AWS Open Datasets 合作,标准化并发布开放数据库。Facebook 通过多语言嵌入,提供更快速的翻译服务。PyTorch Geometric 通过 PyTorch 进行几何深度学习。简单的几项测试看出,最优秀的谷歌翻译也很肤浅。Linguistics Agents Ltd. 发布了一个 NLP 平台,训练深度增强学习代理。这里有一个简化电子游戏代码编写的 AI 工具。谷歌 Brain 发布 Magenta.js,一个利用 TensorFlow.js 生成音乐和艺术内容的API。谷歌发布谷歌文字语音转换,其基础是 DeepMind 开发的 WaveNet。TensorFlow 1.9 和 TensorFlow 1.10.0 相继发布,TensorFlow 2.0 将于2019年初发布,在这个论坛可以看到新版本的预期特征。PyTorch 主持了第一场开发者大会,讨论最新发布的 PyTorch 1.0 的研究和生产能力。Intel 开源了名为 NLP Architect 的 Python 库。Semantris 是一款基于 NLP 和机器学习的文字联想游戏。金融、广告和法律澳大利亚证券与投资委员会(ASIC)希望利用 NLP 加强管理公司和金融服务法律。Tumi 使用 AI 和 NLP 进行目标营销。华尔街和大型创业公司现在都下血本投资 NLP 和机器学习,用于为客户进行更好的投资,类似于一种自动化投资管理。小型和大型律师事务所正在通过 AI 一决高下。金融行业在使用机器学习和 NLP 来重新定义服务,开发新市场。通过“数据转移项目”,谷歌希望实现数据移动化,包括给予用户完全的数据掌控。更多的NLP故事据称,DARPA 将在 AI Next Initiative 投资高达20亿美元,实现语境推理和问题解决能力。著名教授及研究员 Pedro Domingos 计划成为纽约投资公司 D.E. Shaw 集团的管理总监,领导公司的机器学习工作。微软最新的专利目标通过 NLP 将来电 ID 功能提升一个水准,系统将能够识别来电者的目标和行动。使用 AI 改善呼叫中心服务的创业公司 Observe.ai 筹集800万美元资金,使用机器学习和 NLP 技术将呼叫中心体验自动化。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 10, 2019 · 1 min · jiezi

卷积神经网络

卷积神经网络已经断断续续的学了大半年了,却发现自己还是一头雾水,连基本的概念都没搞清楚。这两天在网上查了一些资料,看了一些教程。将卷积神经网络的基本概念和原理理了一下,并整理出来,以供大家参考。注:本文中有些结论是本人对卷积神经网络的理解和总结,如有不正,还请各位大虾指正!1.卷积神经网络的概念 卷积神经网络是(Convolutional Neural Networks,CNN)是一类包含卷积计算且有深度结构的前馈型神经网络,是深度学习的代表算法之一。卷积神经网络是模仿生物神经网络的行为特征,他从信息处理的角度对人脑神经元网络进行抽象,建立某种简单数学模型,按不同的连接方式组成不同的网络。 卷积神经网络的构成:数据输入/input-> 卷积层(卷积/CONV->激励/RELU->池化/POOL … n)->全连接/fullconnection->softmax/分类/归一化->输出2 数据输入层 数据输入时,需要对原始数据图像进行预处理,包括以下3各步骤: 1.去均值;即将样本的均值转化为0. 2.归一化;即将样本在各个维度上进行归一化处理 3.PCA/白化; PCA(principal components analysis),是一种降维和去除相关性的方法,它通过方差来评价特征的价值,认为方差大的特征包含信息多,应予以保留。白化是将PCA去相关性之后将每一特征的方差归一化到13 卷积层/隐藏层3.1 卷积层相关的一些概念 在学习卷积层之前,先来了解一下卷积层相关的一些概念。感受野(Receptive Field): 卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。通俗点讲就是特征图上一个点对应输入图上的区域。卷积核: 卷积核就是图像处理时,给定输入图像,在输出图像中每一个像素时输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核,也就是下面说到的filter、滤波器卷积深度: 卷积层卷积的次数卷积核大小: 卷积核/滤波器做卷积时每次采样的感受野的大小。卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂。步长/stride: 定义了卷积核相邻两次扫过特征图时位置的距离,卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素。填充/padding: 对图像做卷积时,nn的图像每次卷积之后会生成(n-f+1)(n-f+1)特征,随着卷积层数的增多,最终的卷积结果会一直缩小下去,最后变成0。这是因为在做卷积的时候边缘像素使用的次数相对其它像素较少,导致卷积后边缘特征的不断弱化。为了解决这个问题,我们可以在图片边缘进行加0填充。称为zero-padding。这样padding操作就可以保证卷积前后宽高不变化。填充可以分为以下四种: 1.有效填充(valid padding):即完全不使用填充,卷积核只允许访问特征图中包含完整感受野的位置。输出的所有像素都是输入中相同数量像素的函数。使用有效填充的卷积被称为“窄卷积(narrow convolution)”,窄卷积输出的特征图尺寸为(L-f+1)/s。 2.相同填充/半填充(same/half padding):只进行足够的填充来保持输出和输入的特征图尺寸相同。相同填充下特征图的尺寸不会缩减但输入像素中靠近边界的部分相比于中间部分对于特征图的影响更小,即存在边界像素的欠表达。使用相同填充的卷积被称为“等长卷积(equal-width convolution)”。 3.全填充(full padding):进行足够多的填充使得每个像素在每个方向上被访问的次数相同。步长为1时,全填充输出的特征图尺寸为L+f-1,大于输入值。使用全填充的卷积被称为“宽卷积(wide convolution)” 4.任意填充(arbitrary padding):介于有效填充和全填充之间,人为设定的填充,较少使用。 卷积层参数包括卷积核大小、步长和填充,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络重要的超参数(注:超参数是在开始学习过程之前设置值的参数)。3.2 卷积 1. 卷积的数学概念: 卷积/convolution是通过两个函数f和g生成第三个函数的一种数学方法,表征函数f与g经过翻转和和平移后重叠部分的面积,因此,卷积也就是具备了翻转和平移不变性。 2.卷积的作用 通过指定大小的卷积核/滤波器(感受野大小通常为奇数1,3,5,7,…), 按一定步长对逐个扫描图像做卷积,用来提取图像特征。 3.卷积操作 做卷积时,使用卷积核ffNC的矩阵,NC为输入图像的channel数,按固定步长s扫描输入图像进行卷积操作。如下图所示,卷积核/滤波器将矩阵中的数据与扫描区域对应的数据相乘,并累加得到的结果作为卷积输出结果(栗子中输入图像和滤波器channel为1)。扫描完整个输入图像之后可以得到该图像的卷积矩阵RW*RH。 RW=[(NW+2p-f)/s + 1]; RH=[(NH+2p-f)/s + 1]; 对一幅图像进行特征提取的结果: 从上图可知,同样的图片,使用不同的卷积核,不同的卷积核/滤波器,会导致提取的特征点不一样。3.3 池化 1.池化的原理和作用 在图像中,相邻位置的图像像素具有很大的相关性。图像在卷积之后图像/特征的尺寸变化不大,由于图像的相关性,导致卷积之后提取的图像特征会有很大的相关性而导致产生很多冗余的特征。而池化则能够对特征图像进行压缩,一方面可以简化网络复杂度,另一方面可以保留图像的主要特征。 2.池化主要有两种类型: 最大池化 池化时取区域像素的最大值作为该区域的池化结果,是目前比较通用的池化方法。 平均池化 池化时取区域像素的平均值作为该区域的池化结果,目前使用不多。 3.池化的过程 池化时,使用滤波器对输入图像进行扫描,在扫描区域内取最大值(如果是平均池化则取区域内的平均值)作为池化的结果,这样不仅能压缩特征图像的大小,还能保留图像的主要特征。滤波器使用给定的跨度对输入图像/特征进行扫描,并输出结果区域内的最大值作/平均值作为池化结果。如下图所示: 假设输入图像的宽是NW,高是NH,滤波器尺寸是ff,步长是s,池化输出结果是RWRH。填充为P。那么RW=[(NW-2p-f)/s+1];RH=[(NH-2p-f)/s+1]; 如上图所示,池化后图像的特征数减少,可以有效的降低网络的复杂度,同时保留图像的主特征。有些类似于图像的缩放,但有所不同的是,图像缩放时所有的图像特征都有有损失,但是最大池化会优先保留图像的主特征(最大值),从而到达更好的特征提取效果。4 激励函数 激励函数在神经网络的作用通俗上讲就是将多个线性输入转换为非线性的关系。不使用激励函数的话,神经网络每层都只做线性变换,多层输入叠加后还是线性变化。因为线性模型的表达力不够,激励函数可以引入非线性因素。 常见的激励函数: 1.sigmoid 如上图所示,sigmoid函数将一个实数压缩至0-1之间。当x非常大时,该函数无限接近1,当x为非常大的负数时,该函数无限接近0。sigmoid函数很好地解释了神经元受到刺激后是否会激活和向后传递的场景(0,没有被激活,1,被完全激活),故在早期的神经网络中用得比较多。但是sigmoid函数容易出现梯度弥散(靠近输出层的梯度大,参数更新快,靠近输入层的梯度小,参数更新慢)或者梯度饱和(靠近输出层的梯度小,参数更新慢,几乎不再变化)。 2.tanh 如上图所示,tanh(tanh(x)=sinh(x)/cosh(x))函数将输入值压缩至-1到1之间。tanh函数在特征相差明显时会有很好的效果,在循环过程中会不断扩大特征效果。该函数与sigmoid类似,也存在着梯度弥散或梯度饱和的缺点,它们的区别是,tanh函数是0均值的,因此在实际应用中会比sigmoid更好。 3.ReLU ReLU(Rectified Linear Unit),线性整流函数,又叫修正线性单元。该函数被认为有一定的生物学原理,并且由于在实践中通常有着比其他常用激活函数更好的效果,而被如今的深度神经网络广泛使用于诸如图像识别等计算机视觉人工智能领域。对于进入神经元的输入x,使用线性整流激活函数的神经元会输出max(0, wTx+b)。ReLU的缺点是比较脆弱,当一个非常大的梯度经过ReLU神经元时,更新参数后,这个神经元再也不会被激活,导致所有流过这个神经元的梯度都将变成0,造成ReLu神经元的死亡。故在训练中学习率不宜设置得太高。 4. LReLU LReLU(Leaky ReLU),带泄漏线性整流函数,是为了尝试解决ReLU死亡问题而产生的一个变种。如上图所示,其中ai是一个很小的常数,i表示不同通道对于不同的ai。ReLU中,当x<0时,函数值为0,而Leaky ReLU则是给出了一个很小的负数梯度值。这样保留了一些负轴的值,使得负轴的信息不会全部丢失。 5.ELUemsp; ELU(The exponential Linear unit),指数线性单元。如上图所示,ELU融合了sigmoid和RELU,左侧具有软饱和性,让ELU对输入变化或噪音更鲁棒。右侧无饱和性,能够缓解ELU梯队消失。 6.Maxout Maxout时ReLU的一个泛化版本,如上图所示,当w1、b1设置为0时,便转换为ReLU公式。因此Maxout继承了ReLU的优点,有没有“一不小心就死掉”的担忧。该函数相当于在网络中加入一个激活函数层,该函数层与其它激活函数的不同之处在于,该函数层增加了k个&神经元,并输出k个神经元中最大的激活值。常见的隐含层输出: hi(x)=sigmoid(xTW…i+bi) 而Maxout网络中输出 hi(x)=max(Zi1,Zi2,…, Zik); 其中Zij=XTWij + bij,其中j取值范围为[1,k] 因此,Maxout是一个可学习的分段线性函数。实验证明,Maxout可以拟合任何凸函数,是一个通用的函数你拟合器。如下图所示:;优点: 1)、拟合能力非常强,可以拟合任意凸函数 2)、具有ReLU的所有优点,线性,不饱和性。 3)、不会导致神经元死亡 缺点: 每个神经元有两组(W,b)参数,那么参数量就增加一倍,这就导致了整体参数的数量和运算量激增。5. 全连接层 全连接(Full Connection)层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。它在整个卷积神经网络中起到分类器的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。全连接的核心操作就是矩阵向量乘积y=Wx 本质就是由一个特征空间线性变换到另一个特征空间。如下图所示: 在CNN网络中,经过多个卷积层和池化层后,连接着1个或1个以上的全连接层。全连接层的每个神经元与其前一层的所有神经元进行全连接。全连接层可以整合卷积层或者池化层中具有类别区分的局部信息。为了提升CNN网络性能,全连接层每个神经元激励函数一般采用ReLU函数,最后一层全连接层的输出值被传递给一个输出,可以采用softmax逻辑回归(softmax regression)进行分类,该层可以称为softmax层。对于一个具体的分类任务,选择一个合适的损失函数是十分重要的,CNN网络中几种常用的损失函数并分析了它们各自的特点。 ...

January 10, 2019 · 1 min · jiezi

2018年自然语言处理最值得关注的研究、论文和代码

摘要: NLP 与情感分析、增强学习、深度学习的交叉领域,全年干货大合集。2018年对于自然语言处理(NPL)是很有意义的一年,见证了许多新的研究方向和尖端成果。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他总结了2018年 NLP 的重要进展,包括增强学习、情感分析和深度学习等领域。点击文章中的链接,可获得每一项研究的详细信息、论文或者代码。综合领域Facebook 研究员们发明了一种机器翻译的新方法,只需要使用单一语言语料库,这对于缺乏资料的语言非常有用。Young 和同事更新了他们近期发表的论文《基于深度学习的自然语言处理的最新趋势》,增加了 NLP 文献中最新的 SQuAD 结果。Bloomberg 研究员 Yi Yang 发表了 RNN 卷积筛选建模的最新论文及代码,称体现了语言中的长期依存性和组合性。百度发布了 Deep Voice 3,是一项基于注意、完全卷积的文字语音转换神经系统,比目前的循环系统在神经语音合成方面快几个量级。Pair2vec 是一种学习文字嵌入对的新方法,能体现隐含关系的背景知识。百度发布了名为同声翻译与预测及可控延迟(STACL)的机器翻译算法,能够同时进行多个翻译。在同声传译时,这项技术不需要等发言者暂停发言,而可以预测发言者的下一个词语。Deep INFOMAX 是一种学习无监督表征的方法,将输入和高层特征矢量之间的共同信息最大化。蒙特利尔大学的 AI 研究团队 MILA 发表了多个超赞的研究成果,记录了自然语言生成(NLG)任务中 GAN 的限制。聊天机器人是 NLP 的一个重要研究领域,创业公司 lang.ai 如何使用无监督 AI 来解决打造聊天机器人的重要挑战之一:理解用户到底想要什么。这个模型提供了一种新方法进行文字生成,可以实现更强的解读性和控制性。谷歌 AI 发表了论文,探索语言建模的极限。亚马逊研究员提出了一种语言建模方法,这种新的训练策略的重要性在于,在现实中,要获得大量的训练数据来建立一种新能力经常是不现实的。增强学习许多研究员认为增强学习是机器学习的最前端。 我们来看看这个领域内,2018年都有哪些重大进展。David Ha 的“世界模型”,目标是研究个体能否在其自身的梦境中学习,需要利用增强学习来学习一项规则,依靠世界模型中抽取的特征来解决制定的任务。OpenAI 开发了一个类似人类的机器人手,通过增强学习算法获得操纵物体的灵活性。DeepMind 在《自然》杂志发布了一篇论文,讨论虚拟环境中,人工个体的网格表征怎样通过矢量导航找到解决。TextWorld 是以文字游戏为灵感的学习环境,用于训练增强学习代理。Google研究员开发了一项名为 MnasNet 的技术,是一种自动化神经网络架构搜索方法,用于通过增强学习设计移动化机器学习模型。OpenAI Five 利用增强学习,能在复杂游戏 Dota 2 中打败业余水准的人类选手。DeepMind 开发了名为 PopArt 的技术,利用增强学习在多任务环境中具有高精确度。三星的 CozNet 是一种增强学习算法,在两项知名的NPL比赛中展现了顶尖表现。Arel 使用对抗奖励学习来讲故事,解决故事评估维度的局限。Metacar 是为无人驾驶汽车而设计的增强学习环境,在以 Tensorflow.js 打造的浏览器上使用。OpenAI 发布的 Gym Retro 平台提供 1000多个游戏,进行增强学习研究。情感分析机器学习系统需要更深的理解能力,才能与人类在情感层面互动。这篇新论文提出了“层级化CVAE用于精准的仇恨言论分类”,能够理解40多个群体和13中不同类别的仇恨言论。这篇论文讨论如何使用简单的支持向量机变量获得最佳结果,并指出模型方面需要注意的几点。目前大部分情感分析都是基于神经方法,研究时需要注意模型和特征的选择。这篇论文定量分析了推特表情肤色修改器的使用效果。这篇论文讨论如何使用深度卷积神经网络检测讽刺。另外,这项新研究使用眼动追踪、NLP和深度学习算法检测讽刺。研究员开发了一项成为“情感聊天机器”的方法,这个聊天机器人不仅能给出符合事实与逻辑的答案,还能在聊天中加入悲伤、厌烦等情绪。Lei Zhang 等研究员发表了一篇论文,综合概括了深度学习方法如何用于情感分析。这个双向异步框架可以在聊天中生成有意义的情感回复。这项研究使用计算机视觉方法,研究语境中的情感识别。这篇在2018 NAACL 大会上发表的论文,提出了一种方法可以使用简单的递归神经网络模拟情感流。深度学习DeepMind 与哈佛大学教师 Wouter Kool 合作发表了论文,研究人类如何使用大脑来做决定,以及这些研究结果能如何启发人工智能的研究。这篇论文引入了“群组归一化”的概念,可以有效替代批归一化,被认为是深度学习的一项重要技术。Sperichal CNN 是一种打造卷积神经网络的新方法。BAIR 发布了一篇文章,讨论目前循环神经网络和前馈神经网络在解决各种问题时的优缺点。Facebook 的 AI 研究小组开发了一项新技术,能将 AI 模型运行效率提升16%。这能提高 AI 模型的训练速度,并简化模型的量化和运行。这篇《自然》杂志论文,介绍了一种可以预测地震后余震位置的深度学习方法。DeepMind 研究员开发了一种新方法,利用神经算数逻辑单元(NALU)改善神经网络,追踪时间、用数字图片运行算数、数图片中的物体个数等等。DARTS 是一种架构搜索算法,可以设计高性能的图像分类卷积架构。这篇论文《实证验证序列建模中的通用卷积网络和神经网络》,讨论了序列建模中 CNN 和 RNN 的区别。图形神经网络如何帮助推断潜在关系结构、模拟多代理和物理动态。谷歌 AI 研究团队发布了一篇论文,提出了一种改进版的 RNN,能够提高自动数据解读的精确度。Distill 发布了新研究,可以在一个数据源的语境下分析另一个数据。如果没有任何数据、也没有任何人类知识工程,有可能习得精准的认知模型吗?这项研究会告诉你答案。这篇论文详细描述了针对深度神经网络的批归一化研究。这篇论文回顾了神经网络中,如何更好地进行批训练。这篇论文讨论如何正确评估深度半监督学习算法。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 9, 2019 · 1 min · jiezi

Mars——基于矩阵的统一分布式计算框架

很高兴在这里宣布我们的新项目:Mars,一个基于矩阵的统一分布式计算框架。我们已经在 Github 开源:https://github.com/mars-project/mars 。背景PythonPython 是一门相当古老的语言了,如今,在数据科学计算、机器学习、以及深度学习领域,Python 越来越受欢迎。大数据领域,由于 hadoop 和 spark 等,Java 等还是占据着比较核心的位置,但是在 spark 上也可以看到,pyspark 的用户占据很大一部分。深度学习领域,绝大部分的库(tensorflow、pytorch、mxnet、chainer)都支持 Python 语言,且 Python 语言也是这些库上使用最广泛的语言。对 MaxCompute 来说,Python 用户也是一股重要力量。PyData(numpy、scipy、pandas、scikit-learn、matplotlib)Python 在数据科学领域,有非常丰富的包可以选择,下图展示了整个 Python 数据科学技术栈。可以看到 numpy 作为基础,在其上,有 scipy 面向科学家,pandas 面向数据分析,scikit-learn 则是最著名的机器学习库,matplotlib 专注于可视化。对 numpy 来说,其中最核心的概念就是 ndarray——多维数组,pandas、scikit-learn 等库都构建于这个数据结构基础之上。问题虽然 Python 在这些领域越来越流行,PyData 技术栈给数据科学家们提供了多维矩阵、DataFrame 上的分析和计算能力、基于二维矩阵的机器学习算法,但这些库都仅仅受限于单机运算,在大数据时代,数据量一大,这些库的处理能力都显得捉襟见肘。虽然大数据时代,有各种各样基于 SQL 的计算引擎,但对科学计算领域,这些引擎都不太适合用来进行大规模的多维矩阵的运算操作。而且,相当一部分用户,尤其是数据科学家们,习惯于使用各种成熟的单机库,他们不希望改变自己的使用习惯,去学习一些新的库和语法。此外,在深度学习领域,ndarray/tensor 也是最基本的数据结构,但它们仅仅限制在深度学习上,也不适合大规模的多维矩阵运算。基于这些考量,我们开发了 Mars,一个基于 tensor 的统一分布式计算框架,前期我们关注怎么将 tensor 这层做到极致。我们的工作Mars 的核心用 python 实现,这样做的好处是能利用到现有的 Python 社区的工作,我们能充分利用 numpy、cupy、pandas 等来作为我们小的计算单元,我们能快速稳定构建我们整个系统;其次,Python 本身能轻松和 c/c++ 做继承,我们也不必担心 Python 语言本身的性能问题,我们可以对性能热点模块轻松用 c/cython 重写。接下来,主要集中介绍 Mars tensor,即多维矩阵计算的部分。Numpy APINumpy 成功的一个原因,就是其简单易用的 API。Mars tensor 在这块可以直接利用其作为我们的接口。所以在 numpy API 的基础上,用户可以写出灵活的代码,进行数据处理,甚至是实现各种算法。下面是两段代码,分别是用 numpy 和 Mars tensor 来实现一个功能。import numpy as npa = np.random.rand(1000, 2000)(a + 1).sum(axis=1)import mars.tensor as mta = mt.random.rand(1000, 2000)(a + 1).sum(axis=1).execute()这里,创建了一个 1000x2000 的随机数矩阵,对其中每个元素加1,并在 axis=1(行)上求和。目前,Mars 实现了大约 70% 的 Numpy 常用接口。可以看到,除了 import 做了替换,用户只需要通过调用 execute 来显式触发计算。通过 execute 显式触发计算的好处是,我们能对中间过程做更多的优化,来更高效地执行计算。不过,静态图的坏处是牺牲了灵活性,增加了 debug 的难度。下个版本,我们会提供 instant/eager mode,来对每一步操作触发计算,这样,用户能更有效地进行 debug,且能利用到 Python 语言来做循环,当然性能也会有所损失。使用 GPU 计算Mars tensor 也支持使用 GPU 计算。对于某些矩阵创建的接口,我们提供了 gpu=True 的选项,来指定分配到 GPU,后续这个矩阵上的计算将会在 GPU 上进行。import mars.tensor as mta = mt.random.rand(1000, 2000, gpu=True)(a + 1).sum(axis=1).execute()这里 a 是分配在 GPU 上,因此后续的计算在 GPU 上进行。稀疏矩阵Mars tensor 支持创建稀疏矩阵,不过目前 Mars tensor 还只支持二维稀疏矩阵。比如,我们可以创建一个稀疏的单位矩阵,通过指定 sparse=True 即可。import mars.tensor as mta = mt.eye(1000, sparse=True, gpu=True)b = (a + 1).sum(axis=1)这里看到,gpu 和 sparse 选项可以同时指定。基于 Mars tensor 的上层建筑这部分在 Mars 里尚未实现,这里提下我们希望在 Mars 上构建的各个组件。DataFrame相信有部分同学也知道 PyODPS DataFrame,这个库是我们之前的一个项目,它能让用户写出类似 pandas 类似的语法,让运算在 ODPS 上进行。但 PyODPS DataFrame 由于 ODPS 本身的限制,并不能完全实现 pandas 的全部功能(如 index 等),而且语法也有不同。基于 Mars tensor,我们提供 100% 兼容 pandas 语法的 DataFrame。使用 mars DataFrame,不会受限于单个机器的内存。这个是我们下个版本的最主要工作之一。机器学习scikit-learn 的一些算法的输入就是二维的 numpy ndarray。我们也会在 Mars 上提供分布式的机器学习算法。我们大致有以下三条路:scikit-learn 有些算法支持 partial_fit,因此,我们直接在每个 worker 上调用 sklearn 的算法。提供基于 Mars 的 joblib 后端。由于 sklearn 使用 joblib 来做并行,因此,我们可以通过实现 joblib 的 backend,来让 scikit-learn 直接跑在 Mars 的分布式环境。但是,这个方法的输入仍然是 numpy ndarray,因此,总的输入数据还是受限于内存。在 Mars tensor 的基础上实现机器学习算法,这个方法需要的工作量是最高的,但是,好处是,这些算法就能利用 Mars tensor 的能力,比如 GPU 计算。以后,我们需要更多的同学来帮我们贡献代码,共建 Mars 生态。细粒度的函数和类Mars 的核心,其实是一个基于 Actor 的细粒度的调度引擎。因此,实际上,用户可以写一些并行的 Python 函数和类,来进行细粒度的控制。我们可能会提供以下几种接口。函数用户能写普通的 Python 函数,通过 mars.remote.spawn 来将函数调度到 Mars 上来分布式运行import mars.remote as mrdef add(x, y): return x + ydata = [ (1, 2), (3, 4)]for item in data: mr.spawn(add, item[0], item[1])利用 mr.spawn,用户能轻松构建分布式程序。在函数里,用户也可以使用 mr.spawn,这样,用户可以写出非常精细的分布式执行程序。类有时候,用户需要一些有状态的类,来进行更新状态等操作,这些类在 Mars 上被称为 RemoteClass。import mars.remote as mrclass Counter(mr.RemoteClass): def init(self): self.value = 0 def inc(self, n=1): self.value += ncounter = mr.spawn(Counter)counter.inc()目前,这些函数和类的部分尚未实现,只是在构想中,所以届时接口可能会做调整。内部实现这里,我简单介绍下 Mars tensor 的内部原理。客户端在客户端,我们不会做任何真正的运算操作,用户写下代码,我们只会在内存里用图记录用户的操作。对于 Mars tensor 来说,我们有两个重要的概念,operand 和 tensor,分别如下图的蓝色圆和粉色方块所示。Operand 表示算子,tensor 表示生成的多维数组。比如,下图,用户写下这些代码,我们会依次在图上生成对应的 operand 和 tensor。当用户显式调用 execute 的时候,我们会将这个图提交到 Mars 的分布式执行环境。我们客户端部分,并不会对语言有任何依赖,只需要有相同的 tensor graph 序列化,因此可以用任何语言实现。下个版本我们要不要提供 Java 版本的 Mars tensor,我们还要看是不是有用户需要。分布式执行环境Mars 本质上是一个对细粒度图的执行调度系统。对于 Mars tensor 来说,我们接收到了客户端的 tensor 级别的图(粗粒度),我们要尝试将其转化成 chunk 级别的图(细粒度)。每个 chunk 以及其输入,在执行时,都应当能被内存放下。我们称这个过程叫做 tile。在拿到细粒度的 chunk 级别的图后,我们会将这个图上的 Operand 分配到各个 worker 上去执行。总结Mars 在九月份的云栖大会发布,目前我们已经在 Github 开源:https://github.com/mars-project/mars。我们项目完全以开源的方式运作,而不是简单把代码放出来。期待有更多的同学能参与 Mars,共建 Mars。努力了很久,我们不会甘于做一个平庸的项目,我们期待对世界做出一点微小的贡献——我们的征途是星辰大海!本文作者:继盛阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 9, 2019 · 2 min · jiezi

机器学习 面试常见问题&答案 ①

给定卷积神经网络输入,卷积核大小,padding,步长,求输出的shape?各个激活函数的优缺点Sigmod优点输出值0-1(很重大的优点)其余的和其他众多激活函数比起来,感觉没有什么优点,方便入门理解缺点容易梯度消失x的可变值区域太小,极其容易陷入级值的状况(-0.9~0.9)指数exp计算复杂Tanh优点和sigmod比起来,是零均值化处理。(零均值化可以加快模型的收敛)缺点和sigmod一样的缺点Relu优点计算复杂度低(只有一个if>0判断,大于0则激活值为1),部分区域线性递增,没有幂运算与指数运算缺点x小于0时无法产生激活值训练到后期可能权重参数更新太大Leakly ReLu优点相对于relu来说,激活值必然可以产生缺点Relu的其他缺点一概继承下来了ELU优点相对于Leaky relu来说,激活值更平滑缺点其他的Leaky relu的缺点一并继承下来了。如何选择激活函数?Relu-小心设置learningrate(因为x>0的情况下,导数均为1),最好是设置一个比较小的值。不要使用sigmod(缺点太多,计算复杂)如何初始化CNN?(理论)不要全部把超参数设置为0(单层网络可以)容易梯度消失如何初始化CNN?(实践)Xavier-tanh(不太适合relu)fan_in输出通道数Fan_out输出通道数代码Np.randon.rand(fan_in,fan_out)/np.sqrt(fan_in/2)如何分析初始化参数结果好坏?查看初始化后各层的激活值分布是否在固定的,稳定的,同一个区间的均匀分布比较好的初始化结果均值为0,方差为0.02如tanh,relu函数什么叫梯度消失,梯度爆炸当网络层数过多时,前面层由于求导过程乘积运算,出现weight与bias变得异常大与异常小的情况左下角的内容清楚的说明了梯度爆炸和梯度消失的场景BN是什么,为什么能提高收敛速度批归一化是什么?标准化处理,特征缩放的一个方式,将数据规整到一定范围内。如上图所示,BN步骤主要分为4步:求每一个训练批次数据的均值求每一个训练批次数据的方差使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中是为了避免除数为0时所使用的微小正数。尺度变换和偏移:将xixi乘以调整数值大小,再加上增加偏移后得到yiyi,这里的是尺度因子,是平移因子。这一步是BN的精髓,由于归一化后的xixi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:,。 和是在训练时网络自己学习得到的。为什么能提高收敛速度?解决internal covariate shift问题。特征没有消失,而是归一到一定范围内,加快学习速度因为最终都是映射到归一化范围内,所以前一层的权重调整对后一层的影响程度都会降低,不用重新适应新的分布,从而让模型学的更快,避免完全从头学习TipsBN不用于输入层和输出层(经验论)BN(实践)每次batch传入时都做BN各个优化器的优缺点优化器分两种固定学习率的优化算法SGD随机梯度下降优点只随机采样一个样本来计算梯度,加快学习效率,并且避免了普通GD一次性参数更新的坏处(导致模型无法收敛)缺点选择合适的学习率较为困难Momentum动量优点动量梯度下降,动力火车,惯性火车,这一次梯度下降的值,会影响下一次梯度下降的值,相对于简单的梯度下降来说,Momentum动量带有延续性相对于简单的梯度下降来说,减少梯度震荡缺点和SGD一样,选择合适的学习率较为困难自适应学习率的优化算法Adagrad优点更新参数时,会针对原梯度值乘上一个变量,即其所有梯度历史平均值总和的平方根(如上图)这样在训练初期,分母较小,学习率较大,学习比较快,后期时,学习会逐渐减慢缺点从训练开始就积累梯度方差会导致有效学习率过早和过量的减小只能解决凸问题,当应用于非凸函数训练神经网络时,学习可能会到达一个局部是凸碗的区域RMSProp优点能够解决凸问题由累计平方梯度变成和平均梯度缺点缺少Momentum动量元素Adam(结合了动量和RMSProp,通用方案)结合了Momentum和RMSProp的优点手画一下LSTM梯度裁剪介绍一下残差网络ResNet 基于VGG没解决深层网络下出现性能[梯度消失,导致学不到东西]与效率下降[反向传播运算成本大]的问题,优化出来的一个新的神经网络结构,如图所示,两条路一起走,最终线性激活输入值f(x)+x,然后将f(x)+x传递给激活函数[假设为relu]。那么在反向传播的时候,后面层的梯度更加“无损”的直接传递到前面层,前面层的参数因此也能继续更新。为什么残差网络会有效果?□ 先验证明《深层网络效果会比浅层网络好》只要有理想的训练方式,更深的网络肯定会比较浅的网络效果要好。证明过程也很简单:假设在一种网络A的后面添加几层形成新的网络B,如果增加的层级只是对A的输出做了个恒等映射(identity mapping),即A的输出经过新增的层级变成B的输出后没有发生变化,这样网络A和网络B的错误率就是相等的,也就证明了加深后的网络不会比加深前的网络效果差。当层数比较多时,容易导致模型学不到东西,甚至出现反效果,然而deep layers又确实是能使模型效果变好的,所以出现残差网络。效率不影响,层数增加,可以低成本高效率的学到更多非线性的特征。解决梯度弥漫问题如上所说,关键点在于反向传播的时候,梯度可以沿着shortcut无损进行回传,避免梯度弥漫问题。解决模型退化问题避免了过渡训练后,导致模型准确率反而降低的情况。paper中称为degration。经过实验后发现确实能解决这个问题。本人对于这个问题的确切原因并不清楚,但是猜测这个原因很可能是由于梯度消失以及众多其他原因所造成的。Q:既然说中间层是不必要的,那么为什么不直接把这些层去掉呢?可事实上,ResNet的结果比浅层网络的结果好的多,这应该怎么解释呢?加入中间层主要是为了说明会产生退化的效果。 ResNet效果好是因为解决了退化问题,,梯度爆炸/梯度弥散,调节了网络结构,简化了反向传播求导运算的流程。这和砍掉深一点的层是不一样的思想风格转换的原理图像风格转换由风格特征与内容特征共同计算得出风格特征风格的抽象度(越往后层,加入了越多内容的元素,更加具像)内容特征内容的相似度(越往后层,加入了越多风格的元素,和原图越不像)## 怎么解决过拟合简化模型正则化(包含dropout)数据增强集成学习早停减少特征数或使用较少的特征组合## 怎么解决欠拟合增加特征数或者使用较多的特征组合减小正则权重增加模型复杂度使用boosting集成学习如何提高学习算法性能的指导方针->低可拟合偏差更大的模型,更深的层更好的优化器方案探索更合适的超参数->低方差找寻更多的数据正则化,dropout对抗神经网络探索更合适的超参数->清晰的正交化方案……思路逻辑清晰的调试数据预处理一般步骤有哪些?指定原始数据的文件列表 -> 创建文件列表队列 ->从文件中读取数据 -> 数据预处理 -> 整理成batch作为神经网络输入如何用指标和方案去评判一个优秀的模型?train/Validation/Test 准确率/召回率方差偏差CNN模型加速与压缩汇总1. 合理设计模型2. 权值剪枝(编程稀疏矩阵)3. 权值量化(聚类)4. 二值化(BWN,XNorNet)5. 霍夫曼编码6. 奇异值分解(projection层)7. 1x1卷积的恰当使用减少通道量8. 卷积分解为deepwise Conv和pointwiseConv可大幅度减小计算量和参数量1/(Dk^2)9. Group Conv(可节省1/g计算量)10. Channel Shuffle11. 蒸馏法12. 低秩分解13. 模型裁剪# 怎么选择超参数神经网路中的超参数主要包括1. 学习率 ,2. 正则化参数 ,3. 神经网络的层数 L4. 每一个隐层中神经元的个数 j5. 学习的回合数Epoch6. 小批量数据 minibatch 的大小由神经网络的机理进行选择7. 输出神经元的编码方式8. 代价函数的选择9. 权重初始化的方法10. 神经元激活函数的种类11 . 宽泛策略的核心在于简化和监控12. 参加训练模型数据的规模如文章你已看懂,点个「喜欢」即可。如若错误以及不清晰的地方,随时提出。欢迎扫一扫上面二维码加入我的个人微信号进行技术交流。

January 8, 2019 · 1 min · jiezi

菜鸟数据科学家五大误区

你准备好要成为一名数据科学家,积极的参加Kaggle比赛和Coursera的讲座。虽然这一切都准备好了,但是一名数据科学家的实际工作与你所期望的却是大相径庭的。本文研究了作为数据科学家新手的5个常见错误。这是由我在塞巴斯蒂安·福卡德(<u style=“box-sizing: border-box;">Dr. Sébastien Foucaud</u>)博士的帮助下一起完成的,他在指导和领导学术界与行业领域的年轻数据科学家方面拥有20多年的经验。本文旨在帮助你更好地为今后的实际工作做准备。1、Kaggle成才论你通过参加Kaggle比赛,练习了数据科学领域的各项技能。如果你能把决策树和神经网络结合起来那就再好不过了。说实话,作为一个数据科学家,你不需要做那么多的模型融合。请记住,通常情况下,你将花80%的时间进行数据预处理,剩下的20%的时间用于构建模型。作为Kaggle的一份子对你在很多方面都有帮助。所用到的数据一般都是彻底处理过的,因此你可以花更多的时间来调整模型。但在实际工作中,则很少会出现这种情况。一旦出现这种情况,你必须用不同的格式和命名规则来收集组装不同来源的数据。做数据预处理这项艰苦的工作以及练习相关的技能,你将会花费80%的时间。抓取图像或从API中收集图像,收集Genius上的歌词,准备解决特定问题所需的数据,然后将其提供给笔记本电脑并执行机器学习生命周期的过程。精通数据预处理无疑会使你成为一名数据科学家,并对你的公司产生立竿见影的影响。2、神经网络(Neural Networks)无所不能在计算机视觉或自然语言处理的领域,深度学习模型优于其它机器学习模型,但它们也有很明显的不足。神经网络需要依赖大量的数据。如果样本很少,那么使用决策树或逻辑回归模型的效果会更好。神经网络也是一个黑匣子,众所周知,它们很难被解释和说明。如果产品负责人或主管经理对模型的输出产生了质疑,那么你必须能够对模型进行解释。这对于传统模型来说要容易得多。正如詹姆斯·勒(James Le)在一个伟大的邮件中所阐述的那样,有许多优秀的统计学习模型,自己可以学习一下,了解一些它们的优缺点,并根据用例的约束来进行模型的实际应用。除非你正在计算机视觉或自然语言识别的专业领域工作,否则最成功的模型很可能就是传统的机器学习算法。你很快就会发现,最简单的模型,如逻辑回归,通常是最好的模型。3、机器学习是产品在过去的十年里,机器学习既受到了极大的吹捧,也受到了很大的冲击。大多数的初创公司都宣称机器学习可以解决现实中遇到的任何问题。机器学习永远都不应该是产品。它是一个强大的工具,用于生产满足用户需求的产品。机器学习可以用于让用户收到精准的商品推荐,也可以帮助用户准确地识别图像中的对象,还可以帮助企业向用户展示有价值的广告。作为一名数据科学家,你需要以客户作为目标来制定项目计划。只有这样,才能充分地评估机器学习是否对你有帮助。4、混淆因果和相关有90%的数据大约是在过去的几年中形成的。随着大数据的出现,数据对机器学习从业者来说已经变得越来越重要。由于有非常多的数据需要评估,学习模型也更容易发现随机的相关性。上图显示的是美国小姐的年龄和被蒸汽、热气和发热物体导致的命案总人数。考虑到这些数据,一个学习算法会学习美国小姐的年龄影响特定对象命案数量的模式。然而,这两个数据点实际上是不相关的,并且这两个变量对其它的变量没有任何的预测能力。当发现数据中的关系模式时,就要应用你的领域知识。这可能是一种相关性还是因果关系呢?回答这些问题是要从数据中得出分析结果的关键点。5、优化错误的指标机器学习模型通常遵循敏捷的生命周期。首先,定义思想和关键指标。之后,要原型化一个结果。下一步,不断进行迭代改进,直到得到让你满意的关键指标。构建一个机器学习模型时,请记住一定要进行手动错误分析。虽然这个过程很繁琐并且比较费时费力,但是它可以帮助你在接下来的迭代中有效地改进模型。参考下面的文章,可以从Andrew Ng的Deep Learning Specialization一文中获得更多关于改进模型的技巧。注意以下几个关键点:实践数据处理研究不同模型的优缺点尽可能简化模型根据因果关系和相关性检查你的结论优化最有希望的指标本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 8, 2019 · 1 min · jiezi

是时候给你的产品配一个AI问答助手了!

本文由云+社区发表| 导语 问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库、知识图谱或问答知识库返回简洁、准确的匹配答案。相较于搜索引擎,问答系统能更好地理解用户提问的真实意图, 进一步能更有效地满足用户的信息需求。问答系统是目前人工智能和自然语言处理领域中一个倍受关注并具有广泛发展前景的研究方向。一、引言 问答系统处理的对象主要包括用户的问题以及答案。根据问题所属的知识领域,问答系统可分为面向限定域的问答系统、面向开放域的问答系统、以及面向常用问题集(Frequently Asked Questions, FAQ)的问答系统。依据答案来源,问答系统可分为基于结构化数据的问答系统如KBQA、基于文本的问答系统如机器阅读理解、以及基于问答对的问答系统如FAQ问答。此外,按照答案的反馈机制划分,问答系统还可以分为基于检索式的问答系统和基于生成式的问答系统。 本文主要阐述FAQBot检索型问答系统的相关研究和处理框架,以及深度学习在其中的应用。FAQ检索型问答是根据用户的新Query去FAQ知识库找到最合适的答案并反馈给用户。如图所示:其中,Qi是知识库里的标准问,Ai是标准问对应的答案。具体处理流程为:候选集离线建好索引。采用Lucene引擎,为数万个相似问集合建立字级别倒排索引。Lucene引擎的性能能够将召回时间控制在毫秒级别,大大减轻后续模块的计算压力;线上收到用户 query 后,初步召回一批候选集作为粗排结果传入下一模块进行进一步精确排序;利用matching模型计算用户query和FAQ知识库中问题或答案的匹配程度;利用ranking 模型对候选集做 rerank 并返回 topk个候选答案。 可以看出,FAQ问答系统的核心任务可以抽象为文本匹配任务。传统文本匹配方法如信息检索中的BM25,向量空间模型VSM等方法,主要解决字面相似度问题。然而由于中文含义的丰富性,通常很难直接根据关键字匹配或者基于机器学习的浅层模型来确定两个句子之间的语义相似度。近几年,利用神经网络,尤其是深度学习模型学习文本中深层的语义特征,对文本做语义表示后进行语义匹配的方法开始被提出并应用于检索式问答系统。基于深度学习的模型一方面能够节省人工提取特征的大量人力物力。此外,相比于传统方法,深度文本匹配模型能够从大量的样本中自动提取出词语之间的关系,并能结合短语匹配中的结构信息和文本匹配的层次化特性,发掘传统模型很难发掘的隐含在大量数据中含义不明显的特征,更精细地描述文本匹配问题。二、深度学习文本匹配 FAQ问答系统一般有两种解决思路,一种是相似问题匹配,即对比用户问题与现有FAQ知识库中问题的相似度,返回用户问题对应的最准确的答案,这种思路类似于text paraphrase;另一种是问题答案对匹配,即对比用户问题与FAQ知识库中答案的匹配度,返回用户问题对应的最准确的答案,这种思路为答案选择,即QA匹配。这两个类型相通的地方在于都可以看作文本语义匹配,很多模型能同时在两个任务上都得到很好的效果,区别在于QA匹配存在问题与答案不同质的问题。 下面总结一些基于深度学习的文本匹配工作,希望能够抛砖引玉,如有遗漏或错误,欢迎补充或指出。2.1 模型框架 概括来讲,深度语义匹配模型可以分为两大类,分别是representation-based method 和 interaction-based method。1) Represention-based Method框架图如下:这类算法首先将待匹配的两个对象通过深度学习模型进行表示,之后计算这两个表示之间的相似度便可输出两个对象的匹配度。这种方式下,更加侧重对表示层的构建,使其尽可能充分地将待匹配的两个对象都转换成等长的语义表示向量。然后在两个对象对应的两个语义表示向量基础上,进行匹配度的计算。针对匹配度函数f(x,y)的计算,通常有两种方法,如下图所示:一种是通过相似度度量函数进行计算,实际使用过程中最常用的就是 cosine 函数,这种方式简单高效,并且得分区间可控意义明确;另一种方法是将两个向量再接一个多层感知器网络(MLP),通过数据去训练拟合出一个匹配度得分,更加灵活拟合能力更强,但对训练的要求也更高。Represention-based Extended上述的representation-based method存在的问题是直接基于句子的表示太粗糙,无法准确进行文本匹配任务。受信息检索领域的启发,结合主题级别和单词级别的匹配信息通常可以获得更好的表现。于是进一步对句子表示进行扩展,加入细粒度匹配信息。框架图如下:2) Interaction-based Method框架图如下:基于交互的方法是通过Interaction来对文本相似性建模。该方式更强调待匹配的两个句子得到更充分的交互,以及交互后的匹配。在表示层不会将句子转换成一个整体表示向量,一般情况下会保留和词位置相对应的一组表示向量。首先基于表示层采用DNN或直接由word embedding得到的句子表示,和词位置对应的每个向量体现了以本词语为核心的一定的全局信息;然后对两个句子按词对应交互,由此构建两段文本之间的 matching pattern,这里面包括了更细致更局部的文本交互信息;基于该匹配矩阵,可以进一步使用DNN等来提取更高层次的匹配特征,最后计算得到最终匹配得分。Interaction-based 方法匹配建模更加细致、充分,一般来说效果更好,但计算成本增加,更加适合一些效果精度要求高但对计算性能要求不高的场景。 下面总结了不同类型的深度学习文本匹配模型。可以看出,深度文本匹配现有工作很多,本文将对近几年的部分工作进行详细介绍,其他可参考对应文献进行深入阅读。representation-based:DSSM[1]; CDSSM[2]; ARC I[3]; CNTN[4]; LSTM-RNN[5]representation-based extension:MultiGranCNN[6]; MV-LSTM[7]interaction-based:ARC II[8]; MatchPyramid[9]; Match-SRNN[10]; DeepMatch[11]; ABCNN[12]; QA-LSTM/CNN-attention[13,14]; AP[15]; AICNN[16]; MVFNN[17]; BiMPM[18]; DQI[22]; DIIN[23]2.2 模型介绍2.2.1 ABCNN[12]首先介绍BCNN,它是ABCNN模型的基础,即未添加Attention的模型。模型结构如图所示:输入层:将输入句子进行padding后转化成词向量即可; 卷积层:对句子表示进行卷积,使用wide conv的方式; pooling层:论文中使用了两种pooling方式,一种是最后一个pooling层为all-ap,还有一种是中间pooling层为w-ap。区别就是池化时的窗口大小不同; 输出层:接logistic 回归层做2分类。ABCNN是在BCNN的基础上加了两种attention机制。模型结果如下图:(1)在输入层加入attention 其原理为将输入拓展成双通道。新添加的通道是attention feature map,即上图中的蓝色部分。首先计算attention matrix A,其每个元素Aij代表句子1中第i个单词对句子二中第j个单词的match_score,这里使用了Euclidean距离计算。然后再分别计算两个句子的attention feature map。使用两个矩阵W0,W1分别和A还有 A的转置相乘,得到与原本feature尺寸相同的feature map。W0和W1都是模型参数,可以使用相同的W,即共享两个矩阵。这样我们就将原始的输入拓展成了两个通道。(2)在pooling层加入attentionAttention matrix A的计算方法与上述相同,得到A后需要为两个句子分别计算attention权重向量,如上图中的两个虚线部分col-wise sum和row-wise sum。这两个向量中的每个元素分别代表了相应单词在做Average Pooling时的权重。相当于pooling不再是简单的Average Pooling,而是根据计算出的Attention权重向量得到的pooling。2.2.2LSTM/CNN,attention[13,14]给定一个(q,a)pair,q是问题,a是候选答案。首先得到它们的词向量,再使用biLSTM进行encoder,生成问题和答案的分布式表示,然后利用余弦相似度来衡量它们的距离。训练目标是hinge loss。在biLSTM表示输出的基础上进一步使用CNN,CNN可以获取biLSTM输出的向量之间的局部信息。从而给出问题和答案的更多复合表示。当biLSTM模型在问题和答案上长距离传播依赖关系时,隐藏向量的固定宽度成为瓶颈。通过动态调整问题答案的更多信息部分,可以使用注意力机制来缓解这种弱点。在max/mean pooling前,每个biLSTM输出向量将乘以softmax权重,该权重由biLSTM的问题嵌入得到。2.2.3 Attentive Pooling Networks[15] QA_LSTM with attention中attention的设计是通过问题对答案的影响进行特征加权,但是它忽略了答案对问题的影响。Attentive pooling networks同时将attention应用到问题和答案,提高算法的准确率。通过同时学习两种输入的表示以及它们之间的相似性测量,其创新点在于将Q和A这两个输入通过参数矩阵U投射到一个共同的表示空间,用Q和A的representation构造了一个矩阵G,分别对G的row和column做max pooling, 这样就能分别能得到Q和A的attention vector。AP_BILSTM模型框架图如下:AP_BILSTM模型的设计首先将问题和答案经过BILSTM抽取特征,然后通过两者的特征计算soft alignment,得到的G矩阵表示了问题和答案相互作用的结果。对该矩阵的列取最大,即为答案对问题的重要性得分,同理对该矩阵行取最大即为问题对答案的重要性得分。这两个向量再作为attention向量分别和问题和答案表示相乘后得到问题和答案新的表示,最后再做匹配。2.2.4 AICNN[16]之前关于答案选择的研究通常忽略了数据中普遍存在的冗余和噪声问题。 在本文中,设计一种新颖的注意力交互式神经网络(AI-NN),以专注于那些有助于回答选择的文本片段。 问题答案的表示首先通过卷积神经网络(CNN)或其他神经网络架构来学习。然后AI-NN学习两个文本的每个配对片段的相互作用。 之后使用逐行和逐列池化来收集交互信息。之后采用注意机制来衡量每个细分的重要性,并结合相互作用来获得问答的固定长度表示。 模型框架图如下:2.2.5 MVFNN[17] 上述基于神经网络的方法通过计算注意力来考虑信息的几个不同方面。 这些不同类型的注意力总是简单地总结并且可以被视为“单一视图”,不能从多个方面来审视问题和候选答案,导致严重的信息丢失。 要克服这个问题,此模型提出了一种多视图融合神经网络,其中每个关注组件生成QA对的不同“视图”,并且融合QA本身的特征表示以形成更整体的表示。模型框架图如下:对于一个问题,可能会有一堆视图来模拟其相应的答案。 在此模型中,根据直觉构建了四个视图。 这四个视图被命名为查询类型视图,查询主动词视图,查询语义视图和co-attention视图。最后使用fusion RNN模型来对这些视图进行融合。通过不同视图的融合,能对两个对象进行更准确的建模。2.2.6 BiMPM[18]针对基于交互这一类方法,一般是先对两个句子的单元相互匹配,之后再聚集为一个向量后做匹配。这种方式可以捕捉到两个句子之间的交互特征,但是之前的方式只是基于词级别的匹配但是忽略了其他层级的信息。此外,匹配只是基于一个方向忽略了相反的方向。一种双向的多角度匹配模型bilateral multi-perspective matching(BiMPM)解决了这方面的不足。模型框架如下图:模型自下而上一共包含五层,分别为单词表示层、上下文表示层、匹配层、聚合层和预测层,其中匹配层为模型的核心,共提出了四种匹配策略,这里的匹配可以看成是attention机制。单词表示层:使用GloVe模型训练向量,对字符embedding进行随机初始化,单词中的字符组成单词的向量表示作为LSTM网络的输入。上下文表示层:使用BiLSTM对p和q进行表示。匹配层:模型的核心层,包含四种匹配策略,分别是:Full-Matching、Maxpooling-Matching、Attentive-Matching和 Max-Attentive-Matching。四种匹配策略如下图:聚合层:利用BiLSTM对匹配层的输出向量进行处理,取得p、q前向和后向最后一个time step的输出进行连接后输入到预测层。预测层:softmax层,softmax函数分类。 上述是对近几年部分深度文本匹配模型的总结,接下来则介绍基于深度模型的FAQBot。三、基于深度学习的FAQBot实现3.1 模型化流程3.2 数据获取及构造3.2.1 数据获取 对于有大量问答记录的场景例如智能客服,这些记录里面有很多高频的知识点(知识点包括问题和答案)。这些高频的知识点对应的问法通常并不唯一。即知识库的结构为一个问题集合对应同一个答案。针对FAQ数据有以下三种数据类型:标准问q:FAQ中问题的标准用户query答案A: FAQ中标准问对应的的标准回答相似问q1,q2…: 跟标准问语义相似可用同一答案回答的query其中,标准问q、对应答案A以及该标准问q对应的所有相似问q1,q2,…,一起组成一个知识点。一个知识点的样例见下图:3.2.2 数据构造数据构造包含了两个方面:(1)训练集测试集构造测试集:将相似问中的第一条相似问q1作为query,从FAQ知识库的所有知识点中通过Lucene召回30个知识点作为候选集训练集:包含两部分,一部分是正例的构造,另一部分是负例的构造,这两部分数据的构造方式将直接影响到最终的效果。在正例的构造中,因为每个知识点的第一个相似问是作为测试集中出现的,所以在构造训练集的时候排除掉所有知识点中的第一条相似问q1。这样的话,有多于2个相似问的知识点还有多于的其他相似问可以用来构造训练集。将这些识点中的标准问和从相似问的第二条开始(即[q2,q3,…,qn])可以按照不同方式构造出正例和负例。训练集正例的构造:去除所有知识点中的第一条相似问q1,其他相似问及标准问两两组合成正例pair对;对于相似问多的知识点进行剪切。训练集负例的构造的方式包括:按Jaccard距离召回;按Lucene召回;从其他知识点中随机选择;按照正例中各问题出现的比例从其他知识点中采样选择;每个句子和句子中的名词/动词构成pair对;针对知识点分布不均衡的问题,对相似问很多的知识点进行相似问剪切。(2)数据增强策略由于深度学习需要较多的数据,为了增强数据,我们采用了以下策略:交换两个句子之间的顺序;对句子进行分词,重新组合生成新的句子;打乱句子的顺序,随机抽取句子。3.3 模型建立3.3.1 模型框架 基本框架一般都是将待匹配的两个句子分别使用两个encoder来获取对应context信息,然后将二者的context信息进行匹配,得到匹配后的特征信息。也可以在匹配之后的特征后面加上一些其他的传统文本特征,将所有这些特征进行concat。最后接上softmax层,做最终的分类。模型的框架如下图所示:3.3.2 模型建立及迭代优化Embedding层:使用word2vec和fasttext训练词向量和字符向量。Encoder层:卷积具有局部特征提取的功能, 所以可用 CNN 来提取句子中类似 n-gram 的关键信息,考虑文本的上下文信息。于是我们采用textCNN[19]来对句子进行编码表示,encoder过程见下图:Matching层:在得到两个句子的表示后,要针对两个句子的表示进行matching操作。可以根据需要构造出很多种类型的matching方式如下图[20],我们采用相对比较简单的element-wise相加和相乘的方式来进行matching。join层:在matching层之后得到的两个句子的共同表示之后,进一步引入额外的传统特征进行join操作,类似于下图[21]。 引入interaction:上述步骤对两个句子encoder时没有考虑两个句子之间的关联。于是进一步引入更细致更局部的句子交互信息,从而能捕捉到两个句子之间的交互特征,根据交互得到的矩阵获取两个句子新的表示。如图: 引入attention机制:采用注意机制使用权重向量来衡量句子不同部分重要性的不同。attention的计算主要思想沿用了AICNN和ABCNN中的几种attention,分别是feature的attention,interaction后新的表示和句子原表示之间的attention。四、总结与展望4.1 数据层面建立更加合理的知识库:每个知识点只包含一个意图,且知识点之间没有交叉,歧义,冗余等容易造成混淆的因素标注:为每个FAQ积累一定数量的有代表性的相似问后期的持续维护:包括新FAQ发现,原FAQ的合并、拆分、纠正等4.2 模型层面进一步捕捉syntactic level和semantic level的知识如语义角色标注(SRL, semantic role labelling)和词性标注(POS, part of speech tagging)等,引入到文本的表示之中,提高文本语义匹配的效果目前大部分检索行问答的工作做的是问题和问题匹配,或是问题和答案匹配。后续可以同时引入问题和答案的信息进行建模,如图:参考文献[1] Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]// ACM International Conference on Conference on Information & Knowledge Management. ACM, 2013:2333-2338.[2] Shen Y, He X, Gao J, et al. A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval[C]// Acm International Conference on Conference on Information & Knowledge Management. ACM, 2014:101-110.[3] Hu B, Lu Z, Li H, et al. Convolutional Neural Network Architectures for Matching Natural Language Sentences[J]. Advances in Neural Information Processing Systems, 2015, 3:2042-2050.[4] Qiu X, Huang X. Convolutional neural tensor network architecture for community-based question answering[C]// International Conference on Artificial Intelligence. AAAI Press, 2015:1305-1311.[5] Palangi H, Deng L, Shen Y, et al. Deep Sentence Embedding Using Long Short-Term Memory Networks: Analysis and Application to Information Retrieval[J]. IEEE/ACM Transactions on Audio Speech & Language Processing, 2016, 24(4):694-707.[6] Yin W, Schütze H. MultiGranCNN: An Architecture for General Matching of Text Chunks on Multiple Levels of Granularity[C]// Meeting of the Association for Computational Linguistics and the, International Joint Conference on Natural Language Processing. 2015:63-73.[7] Wan S, Lan Y, Guo J, et al. A Deep Architecture for Semantic Matching with Multiple Positional Sentence Representations[J]. 2015:2835-2841.[8] Hu B, Lu Z, Li H, et al. Convolutional Neural Network Architectures for Matching Natural Language Sentences[J]. Advances in Neural Information Processing Systems, 2015, 3:2042-2050.[9] Pang L, Lan Y, Guo J, et al. Text Matching as Image Recognition[J]. 2016.[10] Wan S, Lan Y, Xu J, et al. Match-SRNN: Modeling the Recursive Matching Structure with Spatial RNN[J]. Computers & Graphics, 2016, 28(5):731-745.[11] Lu Z, Li H. A deep architecture for matching short texts[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2013:1367-1375.[12] Yin W, Schütze H, Xiang B, et al. ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs[J]. Computer Science, 2015.[13] Tan M, Santos C D, Xiang B, et al. LSTM-based Deep Learning Models for Non-factoid Answer Selection[J]. Computer Science, 2015.[14] Tan M, Santos C D, Xiang B, et al. Improved Representation Learning for Question Answer Matching[C]// Meeting of the Association for Computational Linguistics. 2016:464-473.[15] Santos C D, Tan M, Xiang B, et al. Attentive Pooling Networks[J]. 2016.[16] X Zhang , S Li , L Sha , H Wang. Attentive Interactive Neural Networks for Answer Selection in Community Question Answering[C]// International Conference on Artificial Intelligence.[17] L Sha , X Zhang , F Qian , B Chang , Z Sui. A Multi-View Fusion Neural Network for Answer Selection[C]// International Conference on Artificial Intelligence.[18] Wang Z, Hamza W, Florian R. Bilateral Multi-Perspective Matching for Natural Language Sentences[C]// Twenty-Sixth International Joint Conference on Artificial Intelligence. 2017:4144-4150.[19] Kim Y. Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.[20] Wang S, Jiang J. A Compare-Aggregate Model for Matching Text Sequences[J]. 2016.[21] Severyn A, Moschitti A. Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks[C]// The International ACM SIGIR Conference. ACM, 2015:373-382.[22] Xiaodong Zhang, Xu Sun, Houfeng Wang. Duplicate Question Identification by Integrating FrameNet with Neural Networks[C]//In the Thirty-Second AAAI Conference on Artificial Intelligence (AAAI-18)[23] Gong Y, Luo H, Zhang J. Natural Language Inference over Interaction Space[J]. 2018.此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

January 7, 2019 · 4 min · jiezi

到底什么成就了今天的人工智能?(上)

摘要: 人工智能发展迅速,可是到底什么成就了今天的人工智能呢?跟随我们一起来探索吧。维基百科对智能有如下定义:智能是一种能够感知或推断信息,并将其作为知识留存下来,自适应地用于某种环境或上下文的能力。*人工智能(Artificial Intelligence)虽然我们很难对人工智能做一个确切的解释,但可以从查尔斯巴贝奇的分析机讲起。它虽然没有任何特殊的“自适应”能力,但却非常灵活。遗憾的是,理论上虽然完美,但却没有得以实现。巴贝奇分析机早图灵机50年左右出现。从理论上讲,它能够将任何可计算的函数作为输入,并在完全机械的情况下产生输出。复杂性理论(complexity theory)由此得以发展,同时人们也意识到构建通用计算机其实相对简单。此外,算法的实现也越发多样。尽管还存在一些技术上的挑战,但在过去的70年中,相同价格可购买到的计算量大约每两年翻一番。也就是说,构建计算力强大的人工智能系统越发容易。然而,这受到了所提供或输入的数据,以及处理时间的限制。可以做如下思考:如果每台计算机的能力都受到数据和时间的限制,我们还能称之为智能计算机么?下面我们简单回顾一下人工智能的发展史。人类的智能主要包括归纳总结和逻辑演绎,对应着人工智能中的联结主义(如人工神经网络)和符号主义(如吴文俊方法)。符号主义认为智能是基于逻辑规则的符号操作;联结主义认为智能是由神经元构成的信息处理系统。其发展轨迹如下图所示:联结主义,即“橙色阵营”在一开始处于领先地位,得益于其与神经科学和人类大脑之间的关系。人类大脑被视为“强AI(Strong Artificial Intelligence)”和“通用人工智能(Artificial General Intelligence,AGI)”唯一的成功应用。然而,第一代神经网络在处理实际问题时屡屡受挫。因为神经网络多数是线性的,并且能力十分有限,深受外界质疑。与此同时,符号主义,即“蓝色阵营”利用严谨的数学理论创造出了更多有用的东西。随着手工知识的积累,输入或输出数据量急速增长,系统的性能无法适应需求,联结主义逐渐衰败。就好比法律,专家制定出再完备的规则都有可能相互冲突,此时便需要越来越多的“法官”来解决这些问题。这减缓了联结主义的发展。后来,“橙色阵营”获取了足够的标签数据和计算资源,能够在可接受的时间内对网络进行“训练”,世界各地的研究学者开始进行大量试验。尽管如此,联结主义仍花费了大量的时间使大众重新信任神经网络,开发人员也花了较长才适应了模糊逻辑和统计的概念。在对人工神经网络进行详细讨论前,本文将先介绍一些其它方法:决策树、概率模型、进化算法。决策树(Decision Tree)是最简单有效的算法之一。其“学习”是通过顺序地遍历数据的每个属性并找到对特定输出具有最大预测能力的属性来执行的。像随机森林这样的高级变体使用了更复杂的学习技术,并在同一个模型中组合多个树,它们的输出是通过“投票”得到的,这与人类的“直觉”类似。概率模型(Probabilistic models)是统计方法的代表。概率模型与神经网络常共享架构、学习/优化过程甚至符号。但是概率模型大多受概率逻辑(通常是贝叶斯)的约束,而神经网络则无此约束。进化算法(Evolutionary computation)最初是受到生物进化的启发,且以随机突变和适应度为主。由于修改通常是随机的,其限制噪声的效果突出。进化算法是一种引导式搜索,许多方面与退火过程类似。上述方法有一个共同点:它们从较差的策略开始,逐渐对其改善,以期在某种性能评估方法中取得更好的分数。如今,机器学习技术,尤其是深度学习正在主导人工智能的发展。与大多数使用1到2个中间抽象层(所谓的浅模型)机器学习方法不同,深度学习可能包含数百甚至数千个堆叠的可训练层。研究学者认为对这样的深度网络进行训练,需要全新的优化程序。事实证明,使用梯度下降的逆向传播(即链式法则)即可很好的进行训练,也可使用Adam或RMSProp。神经网络训练流程如下:1、 获取输入2、 计算输出3、 评估性能4、 调节参数5、 重复训练,至性能最优梯度下降法只需调整参数使误差最小。但该方法容易使网络陷入局部最优,而没有获得最优性能。然而,最新研究表明许多神经网络已经能够获取全局最优解。深度学习实现了训练的并行化,即分布式学习。能在同一时间跨多台机器训练相同的体系结构,同时实现梯度交换,加速超过1000倍。此外,经过训练的网络可以处理相似的任务,即迁移学习,这也是人工神经网络广泛流行的重要原因。例如,经过图像分类训练的网络可以用于其他计算机视觉任务,自然语言处理和其他领域。更重要的是,同一个网络还可以用来解决不同模式的问题。强化学习(Reinforcement Learning,RL)则将它们结合在了一起。RL的最初想法来自行为心理学,科研人员探究了在行为心理学中奖励如何影响学习和塑造动物的行为。RL并不需要出现正确的输入/输出对,也不需要精确校正次优化的行为。举个例子,我们并不需要教会机器人如何精确移动,只需根据它走多远或多快对其进行奖励,它会自己找出正确的路线。然而,这种训练模式在实践中也是最具挑战性的,即使是相对简单的任务,通常也需要付出大量的努力才能正确设置。在实际问题中,通常很难在环境中指定奖励,研究人员目前更多地关注内部奖励模型。与RL并行的是逆向强化学习(Inverse Reinforcement Learning):当完成复杂的任务时,强化学习的回报函数很难指定,我们希望有一种方法能够找到高效且可靠的回报函数,这种方法就是逆向强化学习。通用人工智能中一些框架来自于严格的数学理论,一些受神经元回路的启发,还有一些基于心理模型。本文将以HTM、AIXI、ACT-R和SOAR为例进行介绍。层级实时记忆算法 (Hierarchical Temporal Memory,HTM),HTM算法旨在模拟新大脑皮层的工作原理,将复杂的问题转化为模式匹配与预测。它强调对“神经元”进行分层级,以及信息模式的空间特性与时间特性。稀疏分布表示(Sparse Distributed Representation, SDR)是HTM算法中的一个重要概念。实际上,它只是拥有几千个元素的位数组。就像大脑中的信息总是通过亿万神经细胞中的小部分活跃细胞来表示一样,HTM使用稀疏分布表示语义相关的输入。HTM算法中的抑制(Inhibition)类似于批规范化和其他一些正则化技术,提升(Boosting)在机器学习中已经是一个相对较老的概念,层次结构(Hierarchical Structure)并没有真正的大脑皮层的结构灵活。HTM对物体间关系的重视程度低,甚至连稀疏分布表示也可以用普通神经网络构建。总体来说,HTM需要进行大量调整才能获取与其它机器学习算法相当的性能。接下来介绍AIXI,它是一个对通用人工智能的理论上的数学形式化表示。然而,它有一个显著的缺点——无法计算。事实上,许多机器学习算法均不能精确计算,只能做近似处理。AIXI表示如下:AIXI的核心是一个强化学习智能体,在诸多方面与Schmidhuber开发的Godel Machine类似。然而,它们都是AGI的描述性模型,复杂程度高,无法执行,但不可否认,它们都是人工智能研究人员的灵感源泉。相反,ACT-R,即理性思维的自适应控制系统 (AdaptiveControl of Thought—Rational),它不仅是一种理论,而且是一种用LISP编写的软件框架。ACT-R主要关注不同类型的内存,较少关注其中数据的转换。该理论试图理解人类如何获得和组织知识以及如何产生智力活动,其研究进展基于神经生物学研究成果并从中得以验证,且已成功地为许多不同认知现象建立起合理的模型。然而,它在实际应用中并未取得成功,最终只作为研究人员的工具。SOAR与ACT-R有着相似的根源和基本假设,但它更关注于实现AGI,而不是建立人类认知的模型。ACT-R和SOAR是人工智能符号主义的经典代表,在认知科学的发展中起到了重要作用,但是应用它们相比现代联结主义需要更多的配置和先验知识。此外,神经影像和其他用于心智研究的工具越发详细和准确,而且ACT-R和SOAR在某一定程度上过于僵化,无法保持相关性。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 7, 2019 · 1 min · jiezi

2018最有用的六个机器学习项目

摘要: 用了这六个机器学习开源项目,你的项目一定进行的666!2018年又是人工智能和机器学习快速发展的一年。许多新的机器学习的项目正在以非常高的影响力影响着诸多领域,特别是医疗保健、金融、语音识别、增强现实和更复杂3D视频渲染。这一年,我们看到了更多的应用驱动研究,而不是理论研究。虽然这可能有其缺点,但它在短时间内产生了一些巨大的积极影响,产生了可以迅速转化为业务和客户创造价值的新研发,这一趋势在ML开源项目中得到了强烈反映。让我们来看看过去一年中最实用的6个ML项目。这些项目都公开发布了代码和数据集,允许个别开发人员和小型团队学习并创造价值。它们可能不是理论上最具开创性的作品,但它们很实用!Fast.aiFast.ai库的编写是为了使用现代最佳实践方法以简化且快速准确进行神经网络训练,它抽象了在实践中实施深度神经网络可能带来的所有细节工作。而且它非常易于使用,并且设计它的人有应用程序构建思维。它最初是为Fast.ai课程的学生创建的,该库以简洁易懂的方式编写在易于使用的Pytorch库之上。DetectronDetectron是Facebook AI用于物体检测和实例分割研究的研究平台,系统是用Caffe2编写。它包含各种对象检测算法的实现,包括:Mask R-CNN:使用更快的R-CNN结构的对象检测和实例分割;RetinaNet:一个基于(Feature Pyramid Network)算法的网络,具有独特的Focal Loss来处理难题;Faster R-CNN:对象检测网络最常见的结构;所有网络都可以使用以下几种可选的分类主干之一:ResNeXt {50101152};RESNET {50101152};Feature Pyramid Network(使用ResNet/ResNeXt);VGG16;更重要的是,所有上述这些模型都是带有COCO数据集上的预训练模型,因此你可以立即使用它们!他们已经在Detectron模型动物园中使用标准评估指标进行了测试。FastText这是另一个来自Facebook的研究,fastText库专为文本表示和分类而设计。它配备了预先训练的150多种语言的词向量模型,这些单词向量可用于许多任务,包括文本分类,摘要和翻译等。Auto-KerasAuto-Keras是一个用于自动机器学习(AutoML)的开源软件库。它由Texas A&M大学的DATA实验室和社区贡献者开发。AutoML的最终目标是为具有有限数据科学或机器学习背景的开发工程师提供易于访问的深度学习工具。Auto-Keras提供自动搜索深度学习模型的最佳架构和超参数的功能。DopamineDopamine是由Google基于强化学习创建的快速原型设计的研究框架,它旨在灵活且易于使用,实现标准RL算法,指标和基准。根据Dopamine的文档,他们的设计原则是:简单的测试:帮助新用户运行基准测试;灵活的开发:为新用户提供新的创新想法;可靠:为一些较旧和更流行的算法提供实现;可重复性:确保结果是可重复;vid2vidvid2vid项目是在Pytorch上实现的Nvidia最先进的视频到视频合成的模型。视频到视频合成的目标是学习从输入源视频(例如,一系列语义分割掩模)到精确描绘源视频内容的输出照片拟真视频的映射函数。这个库的好处在于它的选择:它提供了几种不同的vid2vid应用程序,包括自动驾驶/城市场景,人脸和人体姿势。它还附带了丰富的指令和功能,包括数据集加载、任务评估、训练功能和多GPU!其他一些有价值的项目:ChatterBot:用于对话引擎和创建聊天机器人的机器学习模型;Kubeflow:Kubernetes的机器学习工具包;imgaug:用于深度学习的图像增强;imbalanced-learn:scikit下的python包,专门用于修复不平衡数据集;mlflow:用于管理ML生命周期的开源平台:包括测试,可重复性和部署;AirSim:基于虚幻引擎/Unity的自动驾驶汽车模拟器,来自Microsoft AI和Research;本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 7, 2019 · 1 min · jiezi

GIF动画解析RNN,LSTM,GRU

摘要: 本文主要研究了维尼拉循环神经(RNN)、长短期记忆(LSTM)和门控循环单元(GRU)这三个网络,介绍的比较简短,适用于已经了解过这几个网络的读者阅读。循环神经网络是一类常用在序列数据上的人工神经网络。三种最常见的循环神经网络分别是:1.维尼拉循环神经网络(vanilla RNN)2.长短期记忆网络(LSTM),由Hochreiter和Schmidhuber于1997年提出3.门控循环单元网络(GRU),由Cho等人于2014年提出现在可以查到许多解释循环神经网络这一概念的图示。不过我个人比较推荐的是Michael Nguyen在《迈向数据科学》上发表的这篇文章,因为这篇文章撰写了关于这些模型的很多知识,而且提供了清楚易懂的插图,易于读者理解。这篇文章目的是启发大家思考如何更好地可视化这些单元中发生的情况,节点是如何共享的,以及它们怎么转换为输出节点这些问题。Michael 的精彩动画也给了我很大的启发,从中受益匪浅。本文主要研究了维尼拉循环神经(RNN)、长短期记忆(LSTM)和门控循环单元(GRU)这三个网络,介绍的比较简短,适用于已经了解过这几个网络的读者(并且建议在阅读本文之前阅读Michael的文章)。请读者注意,下面的动画是按顺序排列的,读者请依序查看。如下图所示,是我用来做插图的图例。在所演示的动画中,我使用了3(绿色)和2个隐藏单元(红色)的输入大小,批处理大小为1。演示如下:Vanilla RNN* t — time step 时间步长* X — input 输入* h — hidden state 隐藏状态* length of X — size/dimension of input X的长度表示输入的大小,尺寸* length of h — no. of hidden units. h的长度表示不属于隐蔽的单位注意,不同的库可以用不同的方式调用它们,但它们的含义都是相同的。Keras — state_size ,unitsPyTorch — hidden_sizeTensorFlow — num_unitsLSTM* C — cell state注意,单元格状态的维度与隐藏状态的维度相同。GRU希望这些动画片对你有所帮助!以下是静态图像中的单元格的概述:非常感谢德里克和任杰对本文的想法、建议和纠正。如果您想继续了解人工智能和深度学习,可以在Twitter@remykarem上阅读我写的关于这些的摘要文章和演示。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 7, 2019 · 1 min · jiezi

即将取代RNN结构的Transformer

Transformer之前上图是经典的双向RNN模型,我们知道该模型是通过递归的方式运行,虽然适合对序列数据建模,但是缺点也很明显“它无法并行执行”也就无法利用GPU强大的并行能力(这里插句题外话,正因为GPU强大的并行能力,所以batch_size等于1和等于200运算时间基本差不多),再加上各种门控机制,运行速度很慢。一般而言,编码器输出编码向量C作为解码器输入,但是由于编码向量C中所有的编码器输入值贡献相同,导致序列数据越长信息丢失越多。CNN网络相比RNN网络,它虽然可以并行执行,但是无法一次捕获全局信息,通过上图可得我们需要多次遍历,多个卷积层叠加增大感受野。谷歌的做法是Attention is All You Need !Transformer如图所示是Transformer的整体结构,我们将详细介绍每一部分,先从左边的编码器开始。A: 这一步,我想大家已经非常熟悉了,将词汇表转为embedding维度的向量(onehot和embedding区别)。B: 仅仅使用attention有一个致命短板,它对序列数据的顺序免疫,即:无法捕获序列的顺序。比如对翻译任务,我们知道顺序非常重要,单词顺序变动甚至会产生完全不同的意思。因此增加Position Embedding给每个位置编号,每个编号对应一个向量,这样每个词向量都会有一个位置向量,以此来定位。如图所示,Position Embedding计算公式,将id为p的位置映射为一个dpos维的位置向量,这个向量的第i个元素的数值就是PEi(p),位置编码算法当然不止一种,但是不同算法必须要解决的的问题就是能够处理未知长度的序列。假设位置向量有4维,实际位置向量可能如下所示:结合位置向量和词向量我们有两种方式,一种是将两者拼接成一个新向量,另一种是使两者维度相同然后相加得到新向量。C:残差连接,随后是D: layer-normalization。随着网络层数的加深,会带来梯度消失,梯度爆炸以及过拟合问题。针对此问题,我们一般采用权重正则化,批标准化,更换激活函数等等措施,但是当网络层数进一步增加,会出现网络退化问题,即:训练集精度开始下降。使用残差可以解决此问题,目前使用残差的网络可以达到几百层。E:Multi-head注意力机制上图是attention计算过程,我们分解步骤,依次来看。生成“q”,“k”,“v”向量,由输入embedding向量与图示右侧对应权重矩阵相乘。需要注意的是,此处的三个权重矩阵为所有输入共享。如果每个词独享一个权重矩阵,个人认为并不会提升性能,有可能还会降低。计算attention score,计算方式如图所示:使用softmax归一化数值,softmax上面的相除操作主要是调解内积不要太大。将softmax归一化后的值与“v”向量矩阵相乘,将所有加权向量加和,产生该位置的self-attention的输出结果。multi-headed attention:就是有多组上面那样的attention,最后将结果拼接起来,其中,每组attention权重不共享。计算公式如下:整体计算过程如下图所示:F:全连接网络,两个线性函数,一个非线性函数(Relu):解码器:A:解码器attention计算的内部向量和编码器的输出向量,计算源句和目标句之间的关系,在Transformer之前,attention机制就应用在这里。B:线性层是一个全连接层,神经元数量和词表长度相等,然后添加softmax层,将概率最高值对应的词作为输出。总结Transformer现在大有取代RNN之势,但依然存在一些缺点。首先,Transformer虽然使用到了位置向量,但是对序列位置要求很高的项目做的并不好。Transformer可以一步到位获取全局信息,但如果你的项目只是需要局部信息呢?虽然也可以做到,但是增加了多余计算量。本文内容部分参考The Illustrated Transformer

January 5, 2019 · 1 min · jiezi

深度学习入门实战(一):像Prisma一样算法生成梵高风格画像

本文由云+社区发表作者:董超导语:现在人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~ 既然是实战而且本文是入门级别的我们就不讲那么多大家都听不懂的数学公式啦~0x00 深度学习简介虽然吧,我们不讲哪些深奥的数学原理,但是基本的原理还是要掌握下的~在介绍深度学习之前我们要先了解两个概念,机器学习和神经网络。机器学习:在介绍深度学习之前,我们先简单介绍下机器学习,我们引用下维基百科上机器学习的定义:机器学习是人工智能的一个分支。人工智能的研究是从以“推理”为重点到以“知识”为重点,再到以“学习”为重点,一条自然、清晰的脉络。显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。机器学习在近30多年已发展为一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。很多推论问题属于无程序可循难度,所以部分的机器学习研究是开发容易处理的近似算法。简单的说机器学习就是让机器去分析数据找规律,并通过找到的规律对新的数据进行处理。神经网络:神经元:以图像为例子,每个数据或者输入就是一张图片,而里面的每个x可以是图片中的每个像素。对于每个像素我们都赋予一个权重,然后经过转换函数(Transfer Function, 这里是线性叠加)得到一个数值。简单来说,我们对所有像素做个线性加权叠加。得到的数值会经过激活函数得到新的数值。这个激活函数(Activation Function)往往是那几个符合某些特性的非线性函数。为什么需要非线性的转换呢?举个简单的例子,在同一个平面你和你的影子是重叠是分不开的,在立体的空间你们却能分开了。非线性的转换有类似的作用。常用的激活函数有relu, softmax, tanh。简单的说一个神经元是一个简单的分类器,你输入一个比如我们有一大堆猫、狗照片,把每一张照片送进一个机器里,机器需要判断这幅照片里的东西是猫还是狗。我们把猫狗图片处理一下,左边是狗的特征向量,右边是猫的大家想想,最简单地把这两组特征向量分开的方法是啥?当然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。以后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不同的两类,这种分类器就叫做神经元。当然,上面那幅图我们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,我们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:先随机选一条直线/平面/超平面,然后把样本一个个拿过来,如果这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;如果直线分对了,它就暂时停下不动。因此训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。神经网络:神经网络简单点将就是由好多个神经元组成的系统。神经元一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。我们可以在中间横着砍一刀,竖着砍一刀,然后把左上和右下的部分合在一起,与右上的左下部分分开;也可以围着左上角的边沿砍10刀把这一部分先挖出来,然后和右下角合并。每砍一刀,其实就是使用了一个神经元,把不同砍下的半平面做交、并等运算,就是把这些神经元的输出当作输入,后面再连接一个神经元。这个例子中特征的形状称为异或,这种情况一个神经元搞不定,但是两层神经元就能正确对其进行分类。只要你能砍足够多刀,把结果拼在一起,什么奇怪形状的边界神经网络都能够表示,所以说神经网络在理论上可以表示很复杂的函数/空间分布。但是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。深度学习:那什么是深度学习呢?深度学习简单点说就是一种为了让层数较多的多层神经网络可以训练,能够运行起来而演化出来的一系列的新的结构和新的方法。就像下图普通的神经网络可能只有几层,深度学习可以达到十几层。深度学习中的深度二字也代表了神经网络的层数。现在流行的深度学习网络结构有"CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的等。当然我们是以实战为主,可以直接使用现在市面上的一些现有深度学习框架,现在流行的深度学习框架有MXnet,tensorflow,caffe等,本文主要介绍MXnet这个开源的优秀深度学习框架。0x01 安装MXnet这里我们安装的是CPU版的MXnet,为什么不安装GPU版?因为偶的Macbook是AMD的卡啊,MXnet只支持CUDA1.下载源码新建一个目录,到那个目录下执行git clone –recursive https://github.com/dmlc/mxnet2.编译安装运行setup-utils目录下的install-mxnet-osx.sh脚本,中间要编译些东西,要多等会,再输入个密码,就自动编译安装完成啦。注意一下:1.因为要读取make目录下的文件,所以这里要在MXnet源码的根目录执行安装脚本~比如在mxnet的源码根目录执行sh ./setup-utils/install-mxnet-osx.sh2.以后运行脚本可能需要一些python模块,建议安装下pipmac下安装的方法也很简单: sudo easy_install pip0x02 样例运行我们可以试着运行下MXnet自带的一些样例,这里我们试下Neural art这个样例Neural art是个让机器模仿已有画作的绘画风格来把一张照片重新绘画的算法。比如我们输入 和最终生成 1.首先打开example/neural-style目录,大部分样例都是有README的,大家在运行之前可以先看看这个样例的README有说First use download.shto download pre-trained model and sample inputs Then run python nstyle.py, use-h to see more options那我们就要运行这个目录下的download.sh脚本会自动下载训练模型vgg19.params到Model目录,输入的素材到input目录2.运行Demo因为我们运行的是CPU版,所以要这么输入python nstyle.py –gpu -1 –max-num-epochs 150 –output_dir /Desktop/–gpu:使用哪个一个GPU,-1代表使用CPU–max-num-epochs:最大迭代次数,这里我们迭代150次–output_dir:结果输出路径可能大家一次运行不起来,会出现No module named for xxx的提示,一般是相应的python模块没有安装,在google搜下No module named for xxx一般都能找到安装方法,大部分都能通过pip安装运行结果我们看下不同迭代次数时的结果是什么样的10次: 50次: 100次: 150次: 可以看出迭代次数越多效果越好~当然由于深度学习是有很多层神经网络组成,需要的运算量巨大,使用CPU即使是i7,150次迭代也需要好几十分钟了,有条件的看官可以尝试使用GPU版,可以将时间缩短到几分钟,甚至在云平台上跑。样例的具体原理可以参考参考附录的第二个链接。参考附录:http://www.leiphone.com/news/…此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

January 4, 2019 · 1 min · jiezi

十余位权威专家深度解读,达摩院2019十大科技趋势点燃科技热情

2019年的第一个工作日,阿里巴巴达摩院重磅发布了2019十大科技趋势,引发社会各界对未来科技的讨论和向往。这一发布同样引来科学界的普遍关注。来自包括中科院、清华大学、佛罗里达大学、杜克大学等权威学术机构的十余位专家就此发表评论,深度点评达摩院提出的观点,充分肯定达摩院在基础科研领域持续深耕的专注精神。专家普遍认为,达摩院发布的科技趋势虽然有十个方向,但都是围绕着当前科学发展的几个关键潮流,即以芯片为代表的算力、以图计算为代表的算法以及以5G为代表的连接能力。一、计算是变革的源头传统时代的计算始终在冯诺伊曼架构约束下发展,但人工智能的到来正在挑战冯诺依曼架构,而摩尔定律也接近失效,新型芯片以及新的计算机架构已经成为整个行业研究重心。达摩院认为,计算体系结构正在被重构,基于FPGA、ASIC等计算芯片的异构计算架构正在对以CPU为核心的通用计算发起冲击。“通过推高通用芯片的性能来征服一切的方式已经失效。” 中国科学院计算技术研究所研究员陈天石对此评论说,“学术界和工业界都把目光投向了更加专用的处理器架构,并且一直在期待新器件引发的新的架构演进。”杜克大学副教授、IEEE Fellow陈怡然也表示,目前学术界的研究重心在一些更为革命性的架构研究,例如内存计算、非冯诺依曼架构、神经形态计算等。而佛罗里达大学杰出教授、IEEE Fellow李涛则指出,计算体系结构的变革将主导和引领ICT领域的持续创新和发展,这将是未来产业界的核心竞争力。在人工智能领域,GPU无疑是最受企业以及开发者追捧的芯片。但达摩院认为,数据中心的AI训练场景下,计算和存储之间数据搬移已成为瓶颈,AI专用芯片将挑战GPU的绝对统治地位。“对于训练场景来说,计算量要求非常高,需要存储和处理的数据量远远大于之前常见的应用,AI专用计算架构是最佳选择。” 清华大学微纳电子系副系主任尹首一对达摩院的这一观点表示认可。根据达摩院的判断,AI专用芯片的应用将成为趋势。在2018年的杭州云栖大会上,阿里巴巴曾宣布首款AI芯片AliNPU将于2019年应用于城市大脑和自动驾驶等云端数据场景中。陈天石指出,“AI芯片可以灵活高效地支持视觉、语音和自然语言处理,甚至传统的机器学习应用,将在数据中心场景发挥重要作用。”二、算法的创新让AI更加智能1950年,人工智能之父图灵提出著名的图灵测试用以检验人工智能能力,即如果有超过30%的测试者不能确定被测试者是人还是机器人,则认为是通过测试。图灵提出的猜想可能将会很快实现。达摩院认为,在未来,人类可能无法辨别人工智能生成的语音和真人语音,具备语音交互能力的公共设施将会越来越多,甚至在一些特定对话测试中机器可以通过图灵测试。西北工业大学计算机学院教授谢磊对此表示,“声音合成技术在某些方面已经可以媲美人声,并将会拉动‘耳朵经济’的爆发,各种‘AI声优’ 将上岗,为大家提供听觉盛宴。”人工智能行业的迅速发展与深度学习带来的突破高度相关,但仅靠深度学习要实现通用人工智能仍然困难重重。达摩院认为,结合深度学习的图神经网络将让机器成为具备常识、具有理解、认知能力的AI。杜克大学统计学院终身教授David Dunson对此评论说,“结合了深度学习的图计算方法将实现推荐系统的变革性改进,为用户提供更有趣和更合适的产品,同时改善整体用户体验。”过去两年,城市大脑成为社会热词。达摩院认为,2019年,人工智能将在城市大脑技术和应用的研发中发挥更大作用,未来越来越多的城市将拥有大脑。中国城市规划设计院院长杨保军认为,“城市大脑将不再是单一领域或是单项要素的智慧,而是全局联动、多源交融的智慧。”同济大学智能交通运输系统研究中心主任杨晓光则表示,“新一代城市智能管理、智能服务与智能决策将帮助人类最大程度地预防和综合治理城市病。”三、连接万物的5G催生更多应用场景过去几年,5G的热度并不逊于人工智能。5G构建的不仅是一张人联网,它将会成为连接万物的纽带。达摩院在此次十大科技趋势中提到,5G将催生超高清视频、AR/VR等场景的成熟。中国信通院副总工、工信部信息通信经济专家委员会秘书长陈金桥对此评论说,“5G将掀开数据资源作为生产力的大幕,一个基于泛在高速连接的智能社会必将形成。” 车路协同将会是5G与人工智能两大技术交融的典型场景。达摩院认为,车路协同技术路线会加快无人驾驶的到来,并且将在固定线路公交、无人配送、园区微循环等商用场景将快速落地。单纯依靠“单车智能”的方式革新汽车存在诸多限制,例如传感器部署的成本高,感知系统以及决策系统的可靠性低等。“车路协同的优势在于,可降低单车系统在定位方案部署上的成本,并且可以实现更好的感知与决策。” 中科院自动化研究所研究员赵冬斌如此表示。本文作者:阿里云头条阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 3, 2019 · 1 min · jiezi

各类监督方法流行趋势分析

摘要: 想知道目前最流行的监督学习方法是哪一类吗?本文统计每种类型的出版物数量的历史数据回答了该问题,一睹为快吧!又到一年的年末了,到了进行总结并展望来年的时候了,在这里预祝各位新的一年顺利。闲话少叙,本文将对有监督学习方法进行总结。机器学习领域在过去几十年中经历了巨大的变化,不可否认的是,虽然有些方法已经存在了很长时间,但仍然是该领域的主要内容。例如,最小二乘法( least squares)的概念在19世纪早期由勒让德和高斯提出,最基本的形式的神经网络( neural networks)早在1958年就引入的,并在过去的几十年中大幅提升、支持向量机(SVM)等方法则更是较新的方法,这些方法仍然占据了机器学习领域应用中的半壁江山。 随着科研的进行,有大量可用的监督学习方法被发明。使用者通常会提出以下问题:什么是最好的模型?众所周知,这个问题没有标准答案,因为模型的有用性取决于手头的数据以及具体处理的问题,合适的就是最好的。那么,可以转换下思路,换成这个问题:最受欢迎的模型是什么?这将是本文的关注点。衡量机器学习模型的流行程度出于本文的目的,使用频率论方法定义流行度。更确切地说,将使用提及个人监督学习模型的科学出版物的数量表示受欢迎的程度。当然,这种方法有一些限制:可能有比出版物数量更准确的表示方法;分析受所使用的搜索术语的影响;文献数据库并不完美;因此,对于这篇文章进行了两次分析。第一个分析是对出版频率的纵向分析,而第二个分析则比较了不同领域与机器学习模型相关的出版物总数。在第一次分析中,通过从谷歌学术搜索中搜索数据来确定出版物的数量,该数据考虑出版物的标题和摘要。为了确定与个人监督学习方法相关的出版物数量,统计1950年至2017年期间谷歌学术搜索的点击次数。由于抓取谷歌学术的数据非常困难,所以本文参考ScrapeHero提供的有用建议来收集数据。在分析中包含了13种监督方法:神经网络、深度学习、SVM、随机森林、决策树、线性回归、逻辑回归、泊松回归、岭回归、套索回归( lasso regression)、k-最近邻、线性判别分析、以及对数线性模型。其中,对于套索回归,搜索时考虑了 lasso regression和套lasso model ;对于最近邻方法,搜索时术语有k-nearest neighbor和k-nearest neighbour,得到的数据集表示从1950年到现在,每个监督模型相关的出版物的数量。从1950年到现在使用的监督模型为了分析纵向数据,将时间段划分为两个时期:机器学习的早期阶段(1950年至1980年),几乎没有可用模型;以及形成时期(1980年至今),开发了许多新模型。早期:线性回归占优势从图1中可以看出,线性回归是1950年至1980年间的主导方法。相比之下,科学文献中极少提及其他机器学习模型。然而,从20世纪60年代开始,可以看到神经网络和决策树的普及开始增长。此外,还可以看到逻辑回归尚未广泛应用,在20世纪70年代末的数量仅略有增加。形成年代:神经网络的多样化和兴起图2表明,从20世纪80年代后期开始,出版物中提到的监督模型变得更加多样化。重要的是,文献中提到的机器学习模型的比率一直稳步增加,直到2013年。该图具体显示了线性回归、逻辑回归和神经网络的普及。正如之前所见,线性回归在1980年之前已经流行。然而,从1980年开始,神经网络和逻辑回归的普及开始迅速增长。虽然逻辑回归的流行度在2010年达到顶峰,该方法几乎变得像线性回归一样受欢迎,但近年来,神经网络和深度学习的流行程度甚至超过了2015年线性回归的流行程度。神经网络已经变得非常受欢迎,因为它们已经在机器学习应用方面取得了突破,例如图像识别(ImageNet,2012)、人脸识别(DeepFace,2014)和游戏(AlphaGo,2016)等。来自谷歌学术的数据表明,文章中提到神经网络的频率在过去几年中略有下降(图2中未显示)。这可能是因为术语深度学习(多层神经网络)在某种程度上取代了术语神经网络的使用。另外可以看到,稍微不那么受欢迎的监督方法是决策树和SVM。与前三种方法相比,提到这些方法的频率明显较小。另一方面,文献中提到这些方法的频率似乎也有较小的波动。值得注意的是,决策树和SVM的流行度都没有下降。在决策树和SVM之间,SVM似乎表现出更有利的增长趋势,因为SVM在发明后仅仅15年就成功超越了决策树。不同领域的监督学习模型的受欢迎程度在第二个分析中,想调查不同的领域是否依赖于不同的机器学习技术。为此,查询了三个科学出版物库:谷歌学术出版物、计算机科学出版物的dblp和生物医学科学出版物的PubMed。在三个库中统计了13个机器学习模型的命中频率。结果如图3所示。图3表明,许多方法对各个领域都非常具体,下面分析每个领域中最流行的模型。整体使用监督学习模型根据谷歌学术搜索表明,最常用的五种监督模型如下所示:线性回归: 3,580,000(34.3%)篇论文;逻辑回归:2,330,000(22.3%)篇论文;神经网络: 1,750,000(16.8%)篇论文;决策树: 875,000(8.4%)份论文;支持向量机:684,000(6.6%)篇论文;总体而言,线性模型显然占主导地位,占监督模型的统计率的50%以上。单非线性方法并不落后:神经网络占所有论文的16.8%,其次是决策树(8.4%的论文)和SVM(6.6%的论文)。在生物医学科学中使用模型根据PubMed,在生物医学科学中,最受欢迎的五种机器学习模型如下所示:逻辑回归: 229,956(54.5%)篇论文;线性回归: 84,850(20.1%)篇论文;Cox回归: 38,801(9.2%)篇论文;神经网络: 23,883(5.7%)篇论文;泊松回归: 12,978(3.1%)篇论文;在生物医学科学中,可以看到与线性模型相关的提及次数偏多:五种最流行的方法中有四种是线性的,这可能是由于两个原因造成的。首先,在医疗环境中,样本数量通常太小,无法拟合复杂的非线性模型。其次,模型解释结果的能力对医疗应用至关重要。由于非线性方法通常难以解释,因此它们不太适合医疗应用。逻辑回归在PubMed数据库中的流行可能是由于大量出版物的临床研究。在这些研究中,通常使用逻辑回归分析分类结果(即治疗成功),因为它非常适合于解释特征对结果的影响。Cox回归在PubMed数据库中也非常流行,因为它常用于分析Kaplan-Meier生存数据。在计算机科学中使用的模型从dblp中检索到,计算机科学书目中最受欢迎的五个模型是:神经网络: 63,695(68.3%)篇论文;深度学习: 10,157(10.9%)篇论文;支持向量机: 7,750(8.1%)篇论文;决策树: 4,074(4.4%)篇论文;最近邻居: 3,839(2.1%)篇论文;计算机科学出版物中提到的机器学习模型的分布是截然不同的:大多数出版物似乎都涉及最近的非线性方法(例如神经网络、深度学习和支持向量机),如果将深度学习算作神经网络的一种,则超过四分之三的检索计算机科学出版物都涉及神经网络。行业之间的差别图4总结了文献中提到的参数和非参数模型的百分比。柱形图表明,在机器学习研究中调查的模型(计算机科学出版物)和应用的模型类型(生物医学和整体出版物)之间存在很大差异。虽然超过90%的计算机科学出版物涉及非参数模型,但大约90%的生物医学出版物涉及参数模型,这表明机器学习研究主要集中在最先进的方法,如深度神经网络,而机器学习的用户往往依赖于更多可解释的参数模型,如逻辑回归等。总结对科学文献中有监督学习模型的流行度分析表明了人工神经网络的受欢迎程度。但是,也看到不同的领域使用不同类型的机器学习模型。特别是生物医学科学的研究人员仍然严重依赖参数模型,但这种情况逐渐在发生改变,随着可解释模型的研究更加深入,更复杂的模型一定会在生物医学领域得到广泛应用。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 2, 2019 · 1 min · jiezi

2018年深度学习的主要进步

摘要: 一文了解2018深度学习取得了哪些突破性进展!在过去几年中,深度学习改变了整个人工智能的发展。深度学习技术已经开始在医疗保健,金融,人力资源,零售,地震检测和自动驾驶汽车等领域的应用程序中出现。至于现有的成果表现也一直在稳步提高。在学术层面,机器学习领域已经变得非常重要了,以至于每20分钟就会出现一篇新的科学文章。在本文中,我将介绍2018年深度学习的一些主要进展,与2017年深度学习进展版本一样,我没有办法进行详尽的审查。我只想分享一些给我留下最深刻印象的领域成就。语言模型:Google的BERT在自然语言处理(NLP)中,语言模型是可以估计一组语言单元(通常是单词序列)的概率分布的模型。在该领域有很多有趣的模型,因为它们可以以很低的成本构建,并且显着改进了几个NLP任务,例如机器翻译,语音识别和内容解析。历史上,最著名的方法之一是基于马尔可夫模型和n-gram。随着深度学习的出现,出现了基于长短期记忆网络(LSTM)更强大的模型。虽然高效,但现有模型通常是单向的,这意味着只有单词的上下文才会被考虑。去年10月,Google AI语言团队发表了一篇引起社区轰动的论文。BERT是一种新的双向语言模型,它已经实现了11项复杂NLP任务的最新结果,包括情感分析、问答和复述检测#Paraphrase_recognition)。预训练BERT的策略不同于传统的从左到右或从右到左的选项。新颖性包括:随机屏蔽一定比例的输入词,然后预测那些被屏蔽的词;这可以在多层次的背景下保持间接“看到自己”的词语。构建二元分类任务以预测句子B之后是否紧跟句子A,这允许模型确定句子之间的关系,这种现象不是由经典语言建模直接捕获的。至于实施,Google AI开源了他们的论文代码,该代码基于TensorFlow。其中一些在PyTorch也能实现,例如Thomas Wolf和Junseong Kim的实现。BERT对业务应用程序的影响很大,因为这种改进会影响NLP的各个方面。这可以在机器翻译,聊天机器人行为,自动电子邮件响应和客户审查分析中获得更准确的结果。视频到视频合成我们通常习惯由图形引擎创建的模拟器和视频游戏进行环境交互。虽然令人印象深刻,但经典方法的成本很高,因为必须精心指定场景几何、材料、照明和其他参数。一个很好的问题是:是否可以使用例如深度学习技术自动构建这些环境。在他们的视频到视频合成论文中,NVIDIA的研究人员解决了这个问题。他们的目标是在源视频和输出视频之间提供映射功能,精确描绘输入内容。作者将其建模为分布匹配问题,其目标是使自动创建视频的条件分布尽可能接近实际视频的条件分布。为实现这一目标,他们建立了一个基于生成对抗网络(GAN)的模型。在GAN框架内的关键思想是,生成器试图产生真实的合成数据,使得鉴别器无法区分真实数据和合成数据。他们定义了一个时空学习目标,旨在实现暂时连贯的视频。结果非常惊人,如下面的图片所示:输入视频位于左上象限,它是来自Cityscapes数据集的街道场景视频的分段图。作者将他们的结果(右下)与两个基线进行比较:pix2pixHD(右上)和COVST(左下)。这种方法甚至可以用于执行未来的视频预测。由于NVIDIA开源vid2vid代码(基于PyTorch),你可以尝试执行它。改进词嵌入去年,我写了关于字嵌入在NLP中的重要性,并且相信这是一个在不久的将来会得到更多关注的研究课题。任何使用过词嵌入的人都知道,一旦通过组合性检查的兴奋(即King-Man+Woman=Queen)已经过去,因为在实践中仍有一些限制。也许最重要的是对多义不敏感,无法表征词之间确切建立的关系。到底同义词Hyperonyms?另一个限制涉及形态关系:词嵌入模型通常无法确定诸如驾驶员和驾驶之类的单词在形态上是相关的。在题为“深度语境化词语表示”(被认为是NAACL 2018年的优秀论文)的论文中,来自艾伦人工智能研究所和Paul G. Allen计算机科学与工程学院的研究人员提出了一种新的深层语境化词汇表示方法。同时模拟单词使用的复杂特征(例如语法和语义)以及这些用途如何在语言环境(即多义词)中变化。他们的提议的中心主题,称为语言模型嵌入(ELMo),是使用它的整个上下文或整个句子来对每个单词进行矢量化。为了实现这一目标,作者使用了深度双向语言模型(biLM),该模型在大量文本上进行了预训练。另外,由于表示基于字符,因此可以捕获单词之间的形态句法关系。因此,当处理训练中未见的单词(即词汇外单词)时,该模型表现得相当好。作者表明,通过简单地将ELMo添加到现有的最先进解决方案中,结果可以显著改善难以处理的NLK任务,例如文本解释,共指解析和问答,与Google的BERT表示一样,ELMo是该领域的重要贡献,也有望对业务应用程序产生重大影响。视觉任务空间结构的建模视觉任务是否相关?这是斯坦福大学和加州大学伯克利分校的研究人员在题为“Taskonomy:Disentangling Task Transfer Learning”的论文中提出的问题,该论文获得了2018年CVPR的最佳论文奖。可以合理地认为某些视觉任务之间存在某种联系。例如,知道表面法线可以帮助估计图像的深度。在这种情况下,迁移学习技术-或重用监督学习结果的可能性将极大的提高。作者提出了一种计算方法,通过在26个常见的视觉任务中找到转移学习依赖关系来对该结构进行建模,包括对象识别、边缘检测和深度估计。输出是用于任务转移学习的计算分类图。上图显示了计算分类法任务发现的示例任务结构。在该示例中,该方法告知我们如果组合了表面法线估计器和遮挡边缘检测器的学习特征,则可以用很少的标记数据快速训练用于重新整形和点匹配的模型。减少对标签数据的需求是这项工作的主要关注点之一。作者表明,可以通过粗略地减小求解一组10个任务所需的标记的数据点的总数2/3(具有独立训练相比),同时保持几乎相同的性能。这是对实际用例的重要发现,因此有望对业务应用程序产生重大影响。微调通用语言模型以进行文本分类深度学习模型为NLP领域做出了重大贡献,为一些常见任务提供了最先进的结果。但是,模型通常从头开始训练,这需要大量数据并且需要相当长的时间。Howard和Ruder提出了一种归纳迁移学习方法,称为通用语言模型微调(ULMFiT)。主要思想是微调预训练的语言模型,以使其适应特定的NLP任务。这是一种精明的方法,使我们能够处理我们没有大量数据的特定任务。他们的方法优于六个文本分类任务的最新结果,将错误率降低了18-24%。关于训练数据的数量,结果也非常惊人:只有100个标记样本和50K未标记样本,该方法实现了与10K标记样本从头开始训练的模型相同的性能。同样,这些结果证明迁移学习是该领域的关键概念。你可以在这里查看他们的代码和预训练模型。最后的想法与去年的情况一样,2018年深度学习技术的使用持续增加。特别是,今年的特点是迁移学习技术越来越受到关注。从战略角度来看,这可能是我认为今年最好的结果,我希望这种趋势在将来可以继续下去。我在这篇文章中没有探讨的其他一些进展同样引人注目。例如,强化学习的进步,例如能够击败Dota 2的职业玩家的惊人的OpenAI Five机器人。另外,我认为现在球CNN,特别有效的分析球面图像,以及PatternNet和PatternAttribution,这两种技术所面临的神经网络的一个主要缺点:解释深层网络的能力。上述所有技术发展对业务应用程序的影响是巨大的,因为它们影响了NLP和计算机视觉的许多领域。我们可能会在机器翻译、医疗诊断、聊天机器人、仓库库存管理、自动电子邮件响应、面部识别和客户审查分析等方面观察到改进的结果。从科学的角度来看,我喜欢Gary Marcus撰写的深度学习评论。他清楚地指出了当前深度学习方法的局限性,并表明如果深度学习方法得到其他学科和技术的见解(如认知和发展心理学、符号操作和混合建模)的补充,人工智能领域将获得相当大的收益。无论你是否同意他,我认为值得阅读他的论文。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 2, 2019 · 1 min · jiezi

2019年人工智能硬件与应用大趋势

摘要: 机器学习能真正发展为人工智能吗?硬件对人工智能到底有多重要?有哪些应用会在2019年成为现实?2019年即将到来,人工智能将往什么方向发展?机器学习将如何演变为人工智能?在神经网络领域具有20年的技术经验Eugenio Culerciello,在硬件和软件两方面都有经验积累。他预测,在硬件和应用两方面,2019年的人工智能都值得我们期待。目标一句话概括,人工智能领域的目标就是制造超越人类能力的机器:自动驾驶汽车、智能家居、人工助理和安防摄像头是首要的目标,接下来是智能厨房、清洁机器人以及安防无人机和机器人。其他应用包括永远在线的个人助理,和能够看见、听见用户生活经历的生活伴侣。人工智能的终极目标则是完全自动的人工个体,能在日常任务中达到、甚至超越人类的工作表现。软件通常,软件是指在最佳化算法训练之下,能够解决某一具体任务的神经网络架构。不过,这并不能等同于人工智能。人工智能必须能够在真实环境中进行无监督学习,从新的经验中学习,结合在各种环境中学到的知识、解决当下的问题。那么,目前的神经网络,如何能演变为人工智能呢?神经网络架构神经网络的优势在于从数据中自动学习,但我们忘记了一点:训练的基础是手动设计的神经网络架构,这无法从数据中习得。这是目前这个领域的重大限制因素。问题在于,从数据中学习神经网络架构目前必须从零训练多个架构,然后选择一个最佳架构,这需要太长时间。目前神经网络的限制无法预测、基于内容推理和暂时性不稳定都是目前的限制。我们需要一种新的神经网络。神经网络正在演变为编码器和解码器的结合。编码器将数据编码为一种代码表征,解码器则扩展表征,生成一系列更大的表征,例如图像生成、心理模拟、图像标亮等。无监督学习人类无法永远守在机器旁,一步步指导它们的“人生经历”。我们可忙得很!可是目前,对于监督学习我们还得给机器反馈,改正它们的错误。而人类只需要学习几个例子,就能自动改正,并持续学会更多、更复杂的数据。预测型神经网络目前神经网络的主要限制之一是,它们无法像人类大脑一样进行预测。预测听起来很玄乎,但其实我们每天都在预测。如果桌子上有一小团棉花,你自然会预测棉花团会很轻,不需要花很大力气就能拿动。通过预测,我们的大脑能理解我们的身体和环境,还能知道我们是否需要学习新信息。如果你拿起桌上的棉花团,发现由于里面藏着铅块其实很重,大脑的认知能力能让你学会判断,第二次拿起棉花团的时候就不会惊讶了。预测性神经网络是与复杂的外在世界互动的核心。持续性学习“终生学习”对于神经网络来说是一件大事。目前的神经网络要想学习新数据,必须每次都从头开始重新训练。它们必须能意识到自己的“无知”,并自动评估是否需要进行新的训练。同时,在真实世界中,我们希望机器可以学会新技能,同时不忘记原本的知识。持续性学习也与迁移学习有关,这需要用到所有上述提到的技能,对增强型学习也很重要。增强型学习增强型学习可谓是深度神经网络的领域的圣杯。这需要自动学习、持续学习、预测能力和很多我们还未知的能力。目前,解决增强型学习的问题,我们使用标准的神经网络,例如可以处理视频或音频等大容量数据输入的深度神经网络,并将其压缩为表征,或者RNN等序列学习神经网络。它们可以从零开始、甚至一夜之间学会下围棋,但是与人类在真实世界中的能力相比,还相差很远。循环神经网络(RNN)Out了RNN很难进行并行化训练,由于使用超高的容量带宽,即便在特殊的定制机器上也运行很慢。基于注意力机制的神经网络—尤其是卷积神经网络—训练和配置起来更快、更高效,并且更容易规模化。它们已经逐渐补充语音识别,并在增强学习架构和AI的广阔天地间寻找更多的应用。硬件由于硬件的支持,深度学习在2008至2012年间实现了突飞猛进式的进展:每一部手机上都配有便宜的图像传感器,能够收集大量的数据库,同时GPU加速了深度学习的训练。在最近两年,机器学习硬件飞速发展。许多公司都在这个领域:NVIDIA、Intel、Nervana、Movidius、Bitmain、Huawei、ARM、Wave等等,所有公司都在开发定制的高性能芯片,用来训练和运行深度神经网络。这场开发竞赛的关键是, 在处理最近的神经网络运作时,提供最低的能力和最高的可测量性能。不过,只有少数人知道硬件对机器学习、神经网络和人工智能的影响,或者微型芯片的重要性以及如何开发微型芯片。例如:架构:很多人觉得计算机架构不过是加法器和乘法器,但是有一些架构能够最小化记忆带宽,一直同时使用所有单元。编译器:很多人觉得硬件不重要,神经网络编译器才是关键。但是在自己设计架构的时候,编译器只不过是通过机器代码,解读神经网络的计算图像。开源编译器的作用有限,因为最难的一步得依靠未知的架构。开源编译器可以作为前端,在硬件架构和神经网络图像之间还有很多值得探讨的领域。微型芯片:对于重要的算法,优化性能的最佳办法就是定制微型芯片,或者ASIC或SoC。FPGA现在已经含有深度神经网络加速器,预计将在2019至2020年实现,但是微型芯片总是更好的。进步:即便微型芯片的规模化还未被使用,还有一些技术进步能让深度神经网络加速器轻松获得10至20倍的提升。值得关注的的进展包括系统级封装和升级记忆等。应用现在,我们来详细讨论在哪些应用领域,AI和神经网络将改变我们的生活:分类图像和视频:云服务已经包含了这项应用,接下来也会来到智能视频传送中。神经网络硬件不通过云端,在本地处理越来越多的数据,不仅保护了隐私,也节省了互联网带宽使用。语音助理:语音助理已经进入我们的生活,在智能家居中起到重要作用。不过,我们经常忽视聊天的难度,对人类来说是一项基本活动,而对机器来说则是一项伟大的革新。语音助理正在进步,但还是不能完全移动化。Alexa、Cortana和Siri会永远在线,手机将很快成为未来的智能家居。这是智能手机的又一次进步。除了手机,语音助理也需要进入汽车,随着用户移动。我们需要更多的本地语音处理、更强的隐私保护和更少的带宽要求。随着硬件的进步,1至2年之内这些都能实现。人工助理:语音挺好,但是未来我们真正想要的人工助理还能见我们所见,跟随着我们移动的脚步分析周围的环境。神经网络硬件会帮助我们实现这个美梦,但是分析视频传输要求很高的计算能力,已达到了目前硬件能力的理论边缘,比语音助理要困难得多。AiPoly等创业公司已经提出了解决方案,但是缺乏强大的硬件,使其能在手机上运行。另外值得关注的还有,如果把手机屏幕换成类似眼镜的可穿戴设备,我们的助理将成为我们的一部分。家务机器人:另一项重要应用是可以做饭和清洁的家务机器人。我们也许很快就能实现硬件,但是还缺乏软件。我们需要迁移学习、持续学习和增强型学习。每一个食谱都不一样,食谱里的每一种食材都不一样。我们无法把这部分写死,必须开发一个善于学习和总结的机器人。这还是一个遥远的理想。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 28, 2018 · 1 min · jiezi

Facebook开源语音识别系统wav2letter++简介

语音识别系统是深度学习生态中发展最成熟的领域之一。当前这一代的语音识别模型基本都是基于递归神经网络(Recurrent Neural Network)对声学和语言模型进行建模,以及用于知识构建的计算密集的特征提取流水线。虽然基于RNN的技术已经在语音识别任务中得到验证,但训练RNN网络所需要的大量数据和计算能力已经超出了大多数机构的能力范围。最近,Facebook的AI研究中心(FAIR)发表的一个研究论文,提出了一种新的单纯基于卷积神经网络(Convolutional Neural Network)的语音识别技术,而且提供了开源的实现wav2letter++,一个完全基于卷积模型的高性能的语音识别工具箱。在深度学习领域,在语音识别系统中使用CNN并不新鲜,但是大部分应用都局限于特定的任务,而且通常与RNN结合起来构成完整的系统。但是当前CNN领域的研究表明只使用卷积神经网络也有潜力在语音识别的所有领域达到最高水平,例如机器翻译、存在长程依赖的语言模型的语音合成等。CNN模型与其他技术的最大优势在于它不需要额外而且昂贵的特征提取计算就可以天然地对诸如MFCC之类的标准特征计算进行建模。因此长久以来,深度学习社区一直都期待着在语音识别工作流中完全使用CNN,因为这要比目前的基于RNN的模型更高效也更富有竞争力。全卷积语音识别架构经过很多次实验,FAIR团队决定依赖于一个整合多个不同CNN层的架构来实现端对端的语音识别流水线,从音频波形处理到语言转录。该架构基于下图所示的散射模型:模型的第一层CNN用来处理原始音频并提取一些关键特征;接下来的卷积声学模型是一个具有门限单元的CNN,可通过训练从音频流中预测字母;卷积语言模型层则根据来自声学模型的输入生成候选转录文本;最后环节的集束搜索(Beam-Search)编码器则完成最终的转录单词序列。FAIR团队将其全卷积语音识别模型与最先进的模型进行了对比,它可以用少的多的训练数据达到基本一致的性能,测试结果令人满意因此FAIR团队决定开源该算法的初始实现。Wav2letter++虽然深度学习技术近期的进步促进了自动语音识别(Automatic Speech Recognition)框架和工具箱的增加。然而,全卷机语音识别模型的进步,激励了FAIR团队创建wav2letter++,一个完全使用C++实现的深度语音识别工具箱。wav2letter++的核心设计基于以下三个关键原则:实现在包含成千上万小时语音数据集上的高效模型训练简单可扩展模型,可以接入新的网络架构、损失函数以及其他语音识别系统中的核心操作平滑语音识别模型从研究到生产部署的过渡基于以上原则,wav2letter++实现了如下图所示的非常直白的架构:为了更好地理解wav2letter++的架构,有以下几点值得着重指出:ArrayFire张量库:wav2letter++使用ArrayFire作为张量操作的基础库。ArrayFire支持硬件无关的高性能并行建模,可以运行在多种后端上,例如CUDA GPU后端或CPU后端数据预备和特征提取:wav2letter++支持多种音频格式的特征提取。框架可以在每次网络评估之前即时计算特征,并且通过异步并行计算来实现模型训练的效率最大化模型:wav2letter++包含一组丰富的端对端序列模型,也包含众多网络架构以及激活函数。可扩展的训练:wav2letter++支持三种主要的训练模式:train :从零开始训练continue :从检查点状态继续训练(continuing with a checkpoint state),fork :可用于迁移学习。训练流水线使用并行数据、同步随机梯度下降以及基于NVIDIA的集群通信库,可以无缝伸缩。解码:wav2letter++解码器是基于前面提到的全卷积架构中的集束搜索解码器,它负责输出最终的音频转录文本Wav2letter++实战FAIR团队将wav2letter++与其他语音识别进行了对比测试,例如ESPNet、Kaldi和OpenSeq2Seq。实验基于著名的华尔街日报CSR数据集。初始结果表明wav2letter++在训练周期中的任一方面都完胜其他方案。完全基于CNN的语音识别系统当然是一个有意思的实现途径,它可以优化对计算能力和训练数据的需求。Facebook的wav2letter++实现已经被视为当前最快的语音识别框架之一。我们将在不久的未来看到该领域越来越多的进步。汇智网翻译整理,转载请标明出处:Introducing Wav2letter++

December 27, 2018 · 1 min · jiezi

YOLO目标检测模型原理介绍

YOLO-v1介绍YOLO是一个端到端的目标检测算法,不需要预先提取region proposal(RCNN目标检测系列),通过一个网络就可以输出:类别,置信度,坐标位置,检测速度很快,不过,定位精度相对低些,特别是密集型小目标。YOLO将图像resize到448x448作为输入,输出7x7x30,即:将图片划分为7x7,每个单元格独立检测。这里需要注意,不是那种滑动窗口将每个单元格都输入到网络中进行预测,这里的划分只是物体中心点位置的划分之用(划分越多越准确),物体的中心落在哪个单元格,就由那个单元格负责预测。说完7x7我们再说下另一个维度30,30=(2*5=20),其中“2:每个单元格预测数量(box数量)”,“5:(x,y,w,h,score)”,“20:模型可以预测20个种类”。YOLO-v1训练模型首先会将ImageNet作为训练集预训练模型,最终达到88%精度,然后使用迁移学习将预训练的模型应用到当前标注的训练集进行训练。模型输出5维信息(x,y,w,h,score),使用Leaky Relu作为激活函数,全连接层后添加Dropout层防止过拟合。在得到输出值之后,我们需要计算每个box与ground true的Iou值,然后通过非极大值抑制筛选box。YOLO-v1损失函数损失函数包含三部分分别是:坐标损失,置信度损失(7x7x2),类别损失(7x7x20)。坐标损失:我们使用SSE损失函数(就是MSE损失函数的累加版本),如图所示我们在“w,h”中加了根号,加根号的原因是,“w,h”的损失在大框和小框之间“权重”应该不同。因为,对应图像中较大的物体而言,box有些偏移一般并不会影响预测结果。但是对应小物体而言,同样的偏移可能会脱离预测目标。置信度损失:如图所示,损失函数分为两部分:有物体,没有物体,其中没有物体损失部分还增加了权重系数。添加权重系数的原因是,对于一幅图像,一般而言大部分内容是不包含待检测物体的,这样会导致没有物体的计算部分贡献会大于有物体的计算部分,这会导致网络倾向于预测单元格不含有物体。因此,我们要减少没有物体计算部分的贡献权重,比如取值为:0.5。类别损失:当有物体的中心点落在单元格中,此单元格就负责预测该物体。YOLO-v2改进使用批标准化:随着神经网络的训练,网络层的输入分布会发生变动,逐渐向激活函数取值两端靠拢,如:sigmoid激活函数,此时会进入饱和状态,梯度更新缓慢,对输入变动不敏感,甚至梯度消失导致模型难以训练。BN,在网络层输入激活函数输入值之前加入,可以将分布拉到均值为0,标准差为1的正态分布,从而使激活函数处于对输入值敏感的区域,从而加快模型训练。此外,BN还能起到类似dropout的正则化作用,由于我们会有‘强拉’操作,所以对初始化要求没有那么高,可以使用较大的学习率。High Resolution Classifier:在介绍YOLO-v1的时候我们说到,模型需要先在ImageNet上预训练模型,因此,此时图像输入为224x224,使用迁移学习训练后我们的图像输入是448x448,因此模型需要适应图像分辨率的改变。在YOLO-v2中,我们在预训练模型中先224x224训练160个epoch,然后将输入调整到448x448,再跑10个epoch,也就是在ImageNet数据集中两种分辨率跑两次。YOLO大神作者实现表明,这样操作可以提高4%的map。Convolutional With Anchor Boxes: 1,加入anchor boxes,提高box数量。 2,删除全连接层和最后一个池化层,保留更高分辨率特征。 3,用416x416代替448x448输入大小,使特征图有奇数大小的高和宽。Dimension Clusters:使用k-means的方式对训练集的bounding boxes做聚类,但是该方法存在不同尺寸的box误差权重不同,我们希望误差与尺寸没有关系,因此通过IOU定义如下函数:Multi-Scale Training:训练阶段,采用32的倍数作为图像尺寸动态输入,如【320,352。。。608】。这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。使用Darknet-19作为后端网络:YOLO-v3YOLO-v3结构图以来自木盏,表示感谢,也欢迎关注他的博客。DBL:指Darknetconv2d_BN_Leaky。resn:指:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit,使用残差结构可以让网络更深。concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。后端网络使用darknet-53:我们发现,在YOLO-v3网络中没有池化层和全连接层,那么张量尺寸的变化是通过改变卷积核步长来实现。同YOLO-v2一样,输出尺寸为输入尺寸的1/32,即:一般要求输入图像尺寸是32的倍数。类别预测由softmax改为logistic(使用sigmoid):用于处理预测物体之间存在包含关系问题,解决多标签对象支持。比如woman和person,softmax输出:person,logistic输出两者。使用多尺度特征预测物体:上图是YOLO-v3在COCO数据集上使用聚类得到的9种先验框,一个代表宽度一个代表高度。在不同的感受野中使用不同的先验框。如果先验框不是最佳的,即使超过预设定的阈值,也不会进行预测。logistic回归用来从9个先验框中找到最佳的那个。补充:Iou计算总结YOLO好不好,我们就以一张图作为总结吧:祝大家2018年圣诞节快乐!

December 25, 2018 · 1 min · jiezi

阿里开源首个深度学习框架 X-Deep Learning!

刚刚,阿里妈妈正式对外发布了X-Deep Learning(下文简称XDL)的开源代码地址,开发者们可以在Github上自主下载。此前,在11月底,阿里妈妈就公布了这项开源计划,引来了业界的广泛关注。XDL突破了现有深度学习开源框架大都面向图像、语音等低维稠密数据而设计的现状,面向高维稀疏数据场景进行了深度优化,并已大规模应用于阿里妈妈的业务及生产场景。本文将为大家详细介绍XDL的设计理念及关键技术。概述以深度学习为核心的人工智能技术,过去的几年在语音识别、计算机视觉、自然语言处理等领域获得了巨大的成功,其中以GPU为代表的硬件计算力,以及优秀的开源深度学习框架起到了巨大的推动作用。尽管以TensorFlow、PyTorch、MxNet等为代表的开源框架已经取得了巨大的成功,但是当我们把深度学习技术应用在广告、推荐、搜索等大规模工业级场景时,发现这些框架并不能很好的满足我们的需求。矛盾点在于开源框架大都面向图像、语音等低维连续数据设计,而互联网的众多核心应用场景(如广告/推荐/搜索)往往面对的是高维稀疏离散的异构数据,参数的规模动辄百亿甚至千亿。进一步的,不少产品应用需要大规模深度模型的实时训练与更新,现有开源框架在分布式性能、计算效率、水平扩展能力以及实时系统适配性的等方面往往难以满足工业级生产应用的需求。X-DeepLearning正是面向这样的场景设计与优化的工业级深度学习框架,经过阿里巴巴广告业务的锤炼,XDL在训练规模和性能、水平扩展能力上都表现出色,同时内置了大量的面向广告/推荐/搜索领域的工业级算法解决方案。系统核心能力1) 为高维稀疏数据场景而生。支持千亿参数的超大规模深度模型训练,支持批学习、在线学习等模式。2) 工业级分布式训练能力。支持CPU/GPU的混合调度,具备完整的分布式容灾语义,系统的水平扩展能力优秀,可以轻松做到上千并发的训练。3) 高效的结构化压缩训练。针对互联网样本的数据特点,提出了结构化计算模式。典型场景下,相比传统的平铺样本训练方式,样本存储空间、样本IO效率、训练绝对计算量等方面都大幅下降,推荐等场景下整体训练效率最大可提升10倍以上。4) 成熟多后端支持。单机内部的稠密网络计算复用了成熟开源框架的能力,只需要少量的分布式驱动代码修改,就可以把TensorFlow/MxNet等的单机代码运行在XDL上,获得XDL分布式训练与高性能稀疏计算的能力。内置工业级算法解决方案1)点击率预估领域的最新算法,包括深度兴趣网络(Deep Interest Network, DIN),用户兴趣演化模型(Deep Interest Evolution Network, DIEN),跨媒介网络(Cross Media Network,CMN)。2)点击率&转化率联合建模的全空间多任务模型(Entire Space Multi-task Model, ESMM)。3)匹配召回领域的最新算法——深度树匹配模型(Tree-based Deep Match,TDM)。4)轻量级通用模型压缩算法(Rocket Training)系统设计与优化XDL-Flow:数据流与分布式运行时XDL-Flow驱动整个深度学习计算图的生成与执行,包括样本流水线、稀疏表征学习、稠密网络学习。同时,XDL-Flow也负责分布式模型的存储与交换控制逻辑,分布式容灾与恢复控制等全局一致性协调的工作。在搜索、推荐、广告等场景下的样本量巨大,通常达到几十TB至数百TB,如果不能很好的优化样本流水线,样本IO系统很容易成为整个系统的瓶颈,从而导致计算硬件的利用率低下。在大规模稀疏场景下,样本读取的特点是IO密集,稀疏表征计算的特点是参数交换网络通信密集,稠密深度计算是计算密集型。XDL-Flow通过把三个主要环节异步流水线并行,较好的适配了3种不同类型任务的性能。最好的情况下,前两个阶段的延时都被隐藏了。同时,我们也正在尝试自动化的Tunning异步流水线的各个参数,包括各个Step的并行度、Buffer大小等,尽可能让用户不需要关心整个异步流水线并行的细节。AMS:高效模型服务器AMS是面向稀疏场景专门设计与优化的分布式模型存储与交换子系统。我们综合小包网络通信、参数存储结构、参数分布式策略等进行了大量的软硬件优化,使得AMS在吞吐力和水平扩展力上都大幅优于传统的Parameter Server,AMS也支持内置的深度网络计算,使得你可以使用AMS进行表征子网络的二阶计算。1)AMS通过软硬件结合在网络通信层做了大量优化,包括使用Seastar,DPDK,CPUBind,ZeroCopy等技术,充分压榨硬件性能,经过我们实际测试,大规模并发训练下,参数交换导致的小包吞吐能力是传统RPC框架的5倍以上。2)通过内置的参数动态均衡策略,可以在运行过程中找到最优的稀疏参数分布策略,有效解决传统参数服务器由于参数分布式不均匀带来的热点问题,大幅提高了系统在高并发情况下的水平扩展能力。3)AMS同样支持通过GPU加速大Batch Size场景下的Sparse Embedding计算,针对超大Batch的场景,可以起到很好的加速作用。4)AMS支持内部定义子网络。例如我们的算法解决方案中提供的Cross-Media建模,图像部分的表征子网络就是以AMS内运行的方式定义的,大幅减少了重复计算和网络吞吐。Backend Engine:桥接技术复用成熟框架的单机能力为了充分利用现有开源深度学习框架在稠密深度网络上的能力,XDL使用桥接技术(Bridging),把开源深度学习框架(本期开源版XDL支持了TensorFlow、MxNet)作为我们的单机稠密网络的计算引擎后端。用户可以在保留TensorFlow或MxNet网络开发习惯的同时,通过少量的驱动代码修改,就直接获得XDL在大规模稀疏计算上的分布式训练能力。换句话说,使用XDL时无需再学习一门新的框架语言,这带来另一个好处是XDL可以跟现有成熟的开源社区无缝对接——用户可以很轻松地将tensorflow社区的某个开源模型通过XDL拓展到工业级场景。Compact Computation:结构化计算模式大幅提升训练效率工业界稀疏场景下的样本表征,往往呈现很强的结构化特点,例如用户特征、商品特征、场景特征。这种构建方式决定了某些特征会大量出现在重复的样本中——隶属于同一个用户的多条样本中,用户特征很大一部分是相同的。结构化样本压缩正是利用海量样本中,大量局部特征重复这一特点,在存储和计算两个维度上对特征进行压缩,节省了存储、计算和通信带宽资源。样本预处理阶段,对需要聚合的特征进行排序(例如按用户ID排序,聚合用户特征);batching阶段,在tensor层面进行压缩;计算阶段,压缩特征只有在最后一层才会展开,极大节省深层网络的计算开销。 推荐场景下的效果验证表示,在典型的生产数据上,使用聚合排序的样本和完全shuffle的样本评估AUC指标一致,整体性能提升10倍以上。Online-Learning:大规模在线学习在线学习近年来在工业界开始被大规模应用,它是工程与算法的深入结合,赋予模型实时捕捉线上流量变化的能力,在一些对时效性要求很高的场景,有十分大的价值。例如在电商大促等场景下,在线学习可以更加实时的捕捉用户行为的变化,显著的提升模型的实时效果。XDL提供了一套完整的在线学习的解决方案,支持基于全量模型,读取实时消息队列里的样本进行实时持续学习,我们内置支持了Kafka等作为Message Source,并允许按照用户设置控制模型写出的周期。另外,为了避免无限制的新特征流入导致的实时模型爆炸问题,XDL内置了实时特征自动选择与过期特征淘汰等功能,保证用户使用XDL进行在线学习的简便性。1)去ID化的稀疏特征学习:传统的机器学习框架一般要求对稀疏特征进行ID化表征(从0开始紧凑编码),以此来保证训练的高效性。XDL则允许直接以原始的特征进行训练,大幅简化了特征工程的复杂度,极大地增加了全链路数据处理效率,这一特性在实时在线学习场景下显得更加有意义。2)实时特征频控:用户可以设置一个特征过滤的阈值,例如出现次数大于N次的特征才纳入模型训练,系统会自动的采用自动概率丢弃的算法进行特征选择,这样可以大幅降低无效超低频特征在模型中的空间占用。3)过期特征淘汰:长周期的在线学习时,用户也可以通过打开过期特征淘汰功能,系统会自动的对影响力弱且长周期没有碰触到的特征参数进行自动淘汰。X-DeepLearning算法解决方案典型的点击率(Click-Through Rate)预估模型DIN(Deep Interest Network)传统的Embedding&MLP类的模型并未对用户的表达做过多的工作。往往通过embedding的机制将用户的历史行为投影到一个定长的向量空间,再经过一个sum/avg pooling操作得到一个定长的用户向量表达。但是用户的兴趣是多种多样的,用一个固定的向量去表达用户不同的兴趣是非常难的。事实上用户在面对不同商品的时候,其兴趣表现也不一样,仅仅和这个商品相关的兴趣会影响用户的决策。因此我们在预估用户对一个具体商品的点击率的时候只需要表达其与此商品相关的兴趣。在DIN中我们提出了一个兴趣激活机制,通过被预估的商品去激活用户历史行为中相关的部分,从而获取用户在这个具体商品上的兴趣。论文地址:https://arxiv.org/abs/1706.06978DIEN(Deep Interest Evolution Network)DIEN主要解决两个问题:兴趣提取和兴趣演化。在兴趣提取这部分,传统的算法直接将用户的历史行为当做用户的兴趣。同时整个建模过程中的监督信息全部集中于广告点击样本上。而单纯的广告点击样本只能体现用户在决策是否点击广告时的兴趣,很难建模好用户历史每个行为时刻的兴趣。本文中我们提出了auxiliary loss 用于兴趣提取模块,约束模型在对用户每一个历史行为时刻的隐层表达能够推测出后续的行为,我们希望这样的隐层表达能更好的体现用户在每一个行为时刻的兴趣。在兴趣提取模块后我们提出了兴趣演化模块,传统的RNN类似的方法只能建模一个单一的序列,然而在电商场景 用户不同的兴趣其实有不同的演化过程。在本文中我们提出AUGRU(Activation Unit GRU),让GRU的update门和预估的商品相关。在建模用户的兴趣演化过程中,AUGRU会根据不同的预估目标商品构建不同的兴趣演化路径,推断出用户和此商品相关的兴趣。论文地址:https://arxiv.org/abs/1809.03672CMN(Cross Media Network)CMN旨在CTR预估模型中引入更多的模态数据,如图像信息。在原有ID类特征基础上,增加了图像视觉特征,共同加入广告CTR预估模型,在阿里妈妈大规模数据上取得了显著的效果提升。CMN包括多项技术特色:第一,图像内容特征抽取模型与主模型共同训练,联合优化; 第二,同时使用图像信息表达广告和用户,其中用户表达采用用户历史行为对应的图片; 第三,为处理训练涉及到的海量图像数据,提出了“高级模型服务”的计算范式,有效减少训练过程中的计算、通信、存储负载。CMN除用于图像特征引入外,对于文本、视频等内容特征也可以以合适的特征提取网络、用同样的模型处理。论文地址:https://arxiv.org/abs/1711.06505典型的转化率(Conversion Rate)预估模型ESMM(Entire Space Multi-task Model)Entire Space Multi-task Model (ESMM) 是阿里妈妈研发的新型多任务联合训练算法范式。ESMM模型首次提出了利用学习CTR和CTCVR的辅助任务迂回学习CVR的思路,利用用户行为序列数据在完整样本空间建模,避免了传统CVR模型经常遭遇的样本选择偏差和训练数据稀疏的问题,取得了显著的效果。ESMM 可以很容易地推广到具有序列依赖性的用户行为(浏览、点击、加购、购买等)预估中,构建全链路多目标预估模型。ESMM模型中的BASE子网络可以替换为任意的学习模型,因此ESMM的框架可以非常容易地和其他学习模型集成,从而吸收其他学习模型的优势,进一步提升学习效果,想象空间巨大。论文地址:https://arxiv.org/abs/1804.07931典型的匹配召回模型TDM(Tree-based Deep Match)TDM自主创新提出了一套完整的基于树的复杂深度学习推荐匹配算法框架,它通过建立用户兴趣层次树结构实现了高效的全库检索,并以此为基础赋能深度模型引入Attention等更先进的计算结构,达到了在精度、召回率以及新颖性等指标上相对于传统推荐方法的显著效果提升。进一步的,TDM设计实现了一套完整的 初始树-模型训练-树重建-模型再训练 的联合训练迭代框架,更加促进了效果的提升。联合训练赋予了TDM算法框架较好的通用性,为TDM向新场景、新领域的迁移扩展提供了良好的理论基础和极大的工程可行性。论文地址:https://arxiv.org/abs/1801.02294典型的模型压缩算法Rocket Training工业上在线模型的实时推理对响应时间提出非常严苛的要求,从而一定程度上限制了模型的复杂程度。模型复杂程度的受限可能会导致模型学习能力的降低从而带来效果的下降。目前有2种思路来解决这个问题:一方面,可以在固定模型结构和参数的情况下,用计算数值压缩来降低inference时间,同时也有设计更精简的模型以及更改模型计算方式的工作,如Mobile Net和ShuffleNet等工作。另一方面,利用复杂的模型来辅助一个精简模型的训练,测试阶段,利用学习好的小模型来进行推理。这两种方案并不冲突,在大多数情况下第二种方案可以通过第一种方案进一步降低inference时间,同时,考虑到相对于严苛的在线响应时间,我们有更自由的训练时间,有能力训练一个复杂的模型。Rocket Training属于第二种思路,它比较的轻巧优雅,方法具有很强的通用性,可以根据系统能力来定制模型复杂度,提供了一种"无极调速"手段。在阿里妈妈的生产实践中,Rocket Training可以极大地节省在线计算资源,显著提升系统应对双十一大促等流量洪峰的能力。论文地址:https://arxiv.org/abs/1708.04106BenchMark我们提供几组Benchmark数据供大家参考,重点看一下XDL在大batch、小batch等场景下的训练性能以及水平可扩展能力,以及结构化压缩训练带来的提速。基于CPU训练的深度CTR模型我们选取模型结构为Sparse Embedding DNN结构,N路Sparse特征分别做Embedding,再通过BiInteraction得到若干路NFM特征。选择两个特征规模的场景,Sparse特征总规模分别约为10亿(对应百亿参数)/100亿(对应千亿参数),dense维度为数百维,单条样本Sparse特征id数量约100+/300+个。训练模式:BatchSize=100,异步SGD训练。从bechmark结果可以看到,在高维稀疏场景下,XDL有明显的优势,在相当大并发的情况下,保持了良好的线性可扩展能力。基于GPU训练的深度CTR模型本文作者:XDL阅读原文本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。

December 25, 2018 · 1 min · jiezi

2018年的AI/ML惊喜及预测19年的走势(二)

摘要: 2019技术发展趋势早知道,你值得拥有!年度回顾:2018年的AI/ML惊喜及预测19年的走势(一)Unravel Data首席执行官Kunal Agarwal人工智能和机器学习的日益重视将会推动TensorFlow和H2O实现技术突破成为可能。此外,Spark和Kafka将继续呈现引人注目的受欢迎程度。随着云业务模式快速成熟,企业并购交易将继续加速。巨头将对人工智能领先的创业公司进行大规模收购,以便在AI和ML中提供高度需求的知识产权和人才。谷歌和阿里巴巴在收购萌芽的人工智能技术方面处于领先地位,而其他一些科技巨头将尝试通过自主研发来模仿他们的成功。Grammarly研究总监Joel最近几年,人工智能推动了理解和生成语言的界限(最值得注意的是新闻翻译)。由于以下因素,我预计2019年更多自然语言处理(NLP)里程碑成果将会减少:语言解释依赖于语境,意味着真正理解一个人的写作或语言需要参与者的知识,还有他们先前的交流。大多数NLP模型工作是在没有这些因素的情况下进行的语言解释或生成,但我希望通过结合更多受众认知的知识,使得NLP性能提高并变得更加个性化。关于AI的一个小秘密:许多系统都是在数千人(或更多)人类评估者创建和标记的数据集上进行训练的。随着我们需要解决更复杂的人工智能问题,对大量高质量人工标注数据的需求将会增加,但在利用机器学习技术来收集这些数据时会有更多时间和成本效益的突破。同时,使用最少甚至没有标记数据(也称为无监督技术)的方法将减少我们对大量标记数据的依赖,使深度学习模型能够在新的和不同类型的问题上更加健壮。模型架构和基础架构的进步使丰富的深度学习模型能够在资源较低的环境中工作,例如在移动电话和Web浏览器中。在未来,我们希望看到更复杂的模型,即使没有互联网连接,也能在所有设置中为用户提供反馈。Univa总裁兼首席执行官GaryTyreman混合云和专用云将推动机器学习(ML)项目的大规模增长。根据最近对超过344名技术和IT专业人士的调查显示:在2020年,越来越多的项目将投入生产,ML将在未来两年内实现爆炸式增长。超过80%的受访者表示,他们计划将混合云用于ML项目,这样可以降低成本。Univa客户已经在寻求指导,将他们的HPC和机器学习工作负载迁移到云或混合环境,因为他们希望将他们的ML项目推进生产。AI/ML将进入企业应用程序。我们一直在谈论人工智能是过去两年中最热门的趋势之一。我们开始看到AI和机器学习稳步进入企业应用程序,用于客户支持,欺诈分析和商业智能等任务。我们完全有理由相信这些创新将继续在云中发生,2019年将是企业中人工智能的重要一年。HPC和GPU将在推进机器学习项目中发挥关键作用。GPU在HPC中将发挥很高的价值,其中许多任务,如模拟,财务建模和3D渲染也能在并行环境中运行良好。根据HPC市场的市场研究公司Intersect 360研究表明:50种最受欢迎的HPC应用程序包中有34种提供GPU支持,包括所有前15种HPC应用程序。因此,GPU在HPC中变得至关重要。科学家,企业研究人员,大学和研究机构都知道,加速应用程序对商业和研究来说都是有益的。Sutherland首席分析官Puti Nagarjuna打破障碍; 人工智能与人类恐惧之间的平衡:无论我们是否意识到,我们对人工智能的依赖比以往任何时候都更加活跃,2019年公司将齐心协力进一步了解人工智能的局限性,同时发现AI应对更细微的人类行为的方法。越来越多人接受人工智能作为客户体验的第一线:消费者将更多地接受人工智能聊天机器人作为客户体验的第一线,更多公司将采用它们来创造超个性化和便捷的体验。AI将把以客户为中心的营销推向新的高度:随着各种规模的公司转向人工智能技术,通过人工智能增强趋势分析将达到前所未有的价值水平,帮助企业评估如何优化营销工作,作为数据驱动的一部分CMO将崛起。机器学习追求最大价值:数据呈指数级增长,但访问该数据的能力对于良好的ML算法并不实用。在未来一年,一个主要的挑战将是不断发展的算法,以产生适用于你的数据的最大值具体需要。汇流数据架构师Gwen Shapira:随着越来越多的公司试图将AI从实验室转移到生产中,我们将看到越来越多的工具用于管理开发生命周期。AI具有独特的双阶段开发模型,目前的CI/CD工具链无法解决训练,可重复性和数据管理方面的独特挑战。许多公司意识到他们可以通过更简单的工具获得许多AI / ML优势,例如规则引擎和简单的推荐系统。我希望看到越来越多的人采用这些,既可以作为进入完全自治世界的垫脚石,也可以作为许多行业的良好解决方案。我们将看到许多数据工程工具被重新命名为AI/ML数据管道工具。它们与通常的数据工程工具大致相同,但预算较多。我期望一个真正的以人为本的数据管道来处理训练和生产之间的数据和模型流,特别是处理反馈循环和模型改进。Kinetica的首席技术官兼联合创始人:Nima Negahban数据工程师的崛起使AI成为企业的最前沿。去年是数据科学家的一年,企业重点关注招聘数据科学家创建高级分析和ML模型。2019年将是数据工程师的一年。数据工程师将专注于将数据科学家的工作转化为业务的强化数据驱动软件解决方案。这涉及创建深入的AI开发,测试,DevOps和审计流程,使公司能够在整个企业范围内大规模整合AI和数据管道。人与ML形成共生关系,以推动实时业务决策。2019年人工智能和分析的世界需要融合,以推动更有意义的业务决策。这将需要一种通用方法,将历史批量分析、流分析、位置智能、图形分析和人工智能结合在一个平台中进行复杂分析。最终结果是一种新的模型,用于结合临时分析和机器学习,比以往更快的速度提供更好的洞察力。Oqton首席技术官兼联合创始人:Ben Schrauwen2018年最大的惊喜是在解决大型训练数据集需求方面取得的进展。AlphaZero击败了所有以前的版本,达到了超人的水平。生成对抗网络(GAN)正在成功应用于产生更强大的模型。此外,我们现在看到AI可以在非常具体的任务中变得如此擅长,人类无法再说出差异,例如Google Duplex在语音合成中有效地越过了神奇的山谷,为特定的狭窄领域产生了自然的声音对话。我预计我们会很快看到AlphaZero的方法适用于大型搜索空间的难题,甚至超越人类的专业知识。视觉和3D深度学习的进步将导致越来越多的解决方案,以帮助提高人类在特定任务中的生产力,甚至完全自动化。MemSQL首席执行官:NikitaShamgunov预测#1:现代工作负载需求将命令从NoSQL转移到NewSQL数据库。由于ML,AI和边缘计算工作负载不断激增数据,传统的NoSQL数据库不再足以满足市场对更高性能和可扩展性的需求,而不会给现有数据库增加新的复杂性。关系数据库已发展成更具可扩展性和快速运行的NewSQL数据库,通过将事务和分析处理功能集成到单个数据库中,这些数据库能够满足这些需要更高数据处理能力的现代工作负载的需求。预测#2:人工智能和机器学习计划将要求CEO更好地了解它的基础架构。人工智能和ML的竞争正变得比以往任何时候都更加激烈。为了使企业能够成功部署AI和ML以实现最大化价值并降低风险,CEO和其他C级领导者需要了解其数据基础架构的成熟度,包括如何存储和处理数据,以确定哪些技术和人才需要推动转型。预测#3:AI将使员工能够最大限度地减少劳动密集型任务。人工智能的采用有望推动新的角色和工作机会的引入,以符合公司战略,从而变得更加以数据为导向。人工智能将帮助员工专注于更有意义的职责,例如分析洞察力和应用快速数据驱动的决策制定技能,而不是替换人来执行工作,而是帮助执行通常耗时且劳动密集的任务。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 25, 2018 · 1 min · jiezi

2018年的AI/ML惊喜及预测19年的走势(一)

摘要: 2019技术发展趋势早知道,你值得拥有!考虑到技术变革的速度,我认为让专业IT人士分享他们对2018年最大惊喜及2019年预测的看法会很有趣。以下是他们对人工智能(AI),机器学习( ML)和其他数据科学迭代的看法:CLARA分析公司首席执行官兼创始人:Chiara Lakshmikanthan2018年的惊喜:我对AI已经应用于InsureTech行业的快速步伐感到惊讶。但更重要的是,商业保险公司在其工作流程的某些部分(如承保,理赔业务和客户服务)开始使用AI以保持竞争优势。2019年的预测:在B2B 的AI领域,人们越来越关注硬实力的储蓄和价值。AI的理论价值主张被广泛接受,但是,大多数公司在未来几年对AI技术提供商的期望也将更高。Sinequa产品营销总监Scott Parker:虽然围绕ML和AI进行了大量宣传,但具有变革性的AI还有很多仍在实验室中进行测试。对于2019年,ML和AI最终会以某种方式从实验室和现有应用程序中找到出路。在大多数情况下,人们甚至不知道它在那里,因为它将以无缝的方式嵌入。数据科学家Minkyung Kang:惊喜:端到端机器学习服务使ML工作流程变得更加简单。数据科学家和开发人员可以在一个地方构建,训练和管理ML模型,并将模型大规模转移到生产环境,而无需过多担心管道和架构。预测:在ML工作流程中连接和集成不同的步骤和流程将得到进一步改进和简化,并允许许多初创公司和企业使用更少资源的ML应用程序快速移动。这将进一步扩展到ML的整个生命周期的管理,包括数据收集和管理。Anaconda的联合创始人兼首席技术官:Peter Wang惊喜:Github和Red Hat的收购,Cloudera和Hortonworks的合并也令人惊讶,它标志着Hadoop“大数据”炒作周期的终结,并清楚地表明分析和ML的未来增长必须针对异构存储架构。预测:“数据科学”作为一个领域将分成几个子专业,包括数据工程,高级统计推断和解释器,我们需要为它制定标准和最佳实践。随着我们更多地了解国家发展人工智能的力度和用传感器来完善监控状态,这将为更多的数据隐私立法提供动力。SIOS Technology总裁兼首席执行官:Jerry Melnick数据分析和人工智能将无处不在:数据分析和人工智能将继续变得更加专注,专门针对特定问题而构建,这些功能将越来越多地嵌入到云平台和管理工具中。例如,用人工智能驱动的基础设施工具现在被用于分析来自无数监测和管理工具的输入,许多这些人工智能工具都致力于解决整个IT领域的广泛问题。在2019年这些快速发展,更加专注IT人员遇到的最关键的问题及常规和复杂问题。这种备受期待的功能将简化IT运营,提高基础架构和应用程序的稳健性,并降低总体成本。随着这一趋势,人工智能和数据分析将自然地嵌入到HA和DR解决方案以及CSP产品中,以增强其运营的稳健性。通过快速,自动和准确地了解问题并诊断复杂配置中的问题,从云提供的关键应用程序服务的可靠性和可用性将大大提高。BISim高级总监:OISkar Nieder机器学习和深度学习(DL)形成的AI革命在软件开发行业中继续受到越来越多的关注。随着图形处理单元(GPU)加速的引入,以前存在的时间和计算限制被消除,新的易于使用的框架和数据中心将使这些技术在2019年向所有人提供。Python,C ++和Javascript将在2019年继续作为主要编码语言。然而,对于开发人员来说,体验TensorFlow或Caffe for AI和Angular或React等Web语言开发的语言框架将变得更加重要。Micro Focus战略总监:Mark Levy在2019年,AI和ML将与自动化融合,并将彻底改变DevOps。在过去的几年中,自动化在DevOps中的作用继续成为更大实践的一个重要方面。目前,主要的重点是自动化过程或事件驱动的手动可重复任务,但AI/ML显示变化的新进展即将出现。通过AI和ML的融合,自动化有可能展示前所未有的智能,因为新系统将关注趋势,以及分析和关联整个价值流以预测和预防问题。随着DevOps实践专注于提高运营效率,ML,AI和自动化即将融合将为使用DevOps的公司带来显着优势。Micro FocusVertica产品营销副总裁Joy King在2019年,ML项目将从科学项目和创新实验室转向由行业颠覆者领导的全面生产。事实上,每家公司都有ML项目,但其中大多数都依赖于无法访问跟业务目标相关的所有数据的专业平台。所有数据都存储在各种数据仓库和数据库中,其中没有一个能够运行端到端ML,迫使数据移动到专业平台。然而,仅使用一部分数据来训练和评分ML模型,从而导致精度有限。在2019年,当前的行业颠覆者和智能传统公司将把ML带到其所有数据,而不是将其数据转移到ML平台上。这些公司将更准确地预测结果,包括医疗设备的预测性维护,基于个性化客户行为分析的预测收入,主动检测欺诈等非服务。Portworx的联合创始人兼首席执行官Murli Thirumale人工智能和自动化将改变IT的经济方向。即使基础设施本身变得可编程,大多数DevOps仍然由人驱动。但是数据量增长如此之快,应用程序发展如此之快,这就要求基础架构必须足够灵活,这样才不会成为瓶颈。在2019年,基础设施将变得越来越可编程,基于AI的机器将预测存储和计算需求,并根据网络状况,工作负载和历史模式自动分配资源。NICE解决方案营销人员Karen Inbar机器人自动化将创造新的就业机会。随着机器人过程自动化(RPA)的出现,组织内部正在衍生出新的角色。2019年,更多公司将招聘新的专业职位和角色,如RPA工程师、RPA架构师和RPA顾问,以帮助员工了解RPA最佳实践以及RPA如何强化工作流程。随着RPA技术在工作场所变得更受欢迎和更具吸引力,“首席机器人官”等新职位也将开始出现。公司需要选择自动化哪些流程。2018年的许多自动化项目都失败了,因为它们选择了对错误的流程进行自动化。在2019年,公司需要更密切地评估任务的时间分配和复杂性,这种自动化任务的战略性重新确定优先级将确保组织在数字化转型工作中推动投资回报率和成功。一旦组织掌握了更简单的任务的自动化,他们就可以引入更先进的技术,例如光学字符识别(OCR),使无人值守的机器人能够解释更多的数据元素。WekaIO首席技术官Andy Watson到目前为止,我们知道用于ML的数据集每年都在变大,不仅是累积量,还因为信号源(相机、物联网传感器、软件日志等)的数量越来越多。我们“预测”ML研究人员将利用越来越多的功能强大的GPU来处理前所未有的大量数据。但这仅仅是对当前趋势的观察,而不是预测。相反,让我们来看看如何使用这些更大的数据体。我可以通过ML训练来预测松弛参数,以允许软件减少训练错误,对支持ML计算环境的存储基础设施将产生影响。ML的领导者DeepMind最近发表了一篇重要论文:“关系归纳偏见,深度学习和图形网络。”一个关键点是ML训练可能会发展出一种更为徒手的方法,允许其软件影响其学习途径的选择标准(通过推理模式),这将影响数据存储基础架构。在今天的任何大型数据集中,我们都有一个“工作集” - 最活跃的数据子集,最常见的是最新数据。例如,在一组ML研究人员可能累积用于培训的所有许多PB中,他们数据中心的通常情况是,从较慢的“冷”存储中只能提升几百TB的总数据库,因此他们的GPU可以在“热”快速存储层中访问它。然而,随着这种大变化,将难以确定哪个数据应该是任何给定工作集的成员。相反,将整个事物视为可能必要的可能是适当的。正在进行的各种ML事件中的每一个将从所有那些PB中选择不同,并且这将指示所有数据被放置在热层中。McAfee的首席技术战略师Candace Worley首席分析官(CAO)和首席数据官(CDO)将需要监督AI。当公司扩展AI的使用时,必须做出无数的决定。隐私监管存在影响,但也存在法律,道德和文化方面的影响,我们需要在2019年创建一个专门的角色,并对AI的使用进行执行监督。在某些情况下,AI已经表现出不利的行为,例如种族貌相,不公平地拒绝个人贷款以及错误地识别用户的基本信息。CAO和CDO将需要监督AI培训,以确保AI决策避免伤害。此外,人工智能必须接受培训,以处理真正的人类困境,优先考虑司法,问责制,透明度,同时还要检测黑客攻击和数据滥用。可解释的AI将成为一项要求,特别是对于金融/银行和医疗行业。如果AI为个人的健康或治疗提出医疗建议,医生必须能够解释用于得出该结论的逻辑和数据。我们尚未与人工智能的关系处于某种程度,许多人因为人工智能的推荐而愿意接受药物治疗或手术,特别是如果涉及的医疗专业人员无法解释其建议的“原因”。在金融行业,我们将看到使用自动分析和认知消息,根据客户需求提供有关股票,债券,房地产和其他资产的财务指导和投资建议。在这里,消费者也需要对基于AI的决策进行解释。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 24, 2018 · 1 min · jiezi

YOLO目标检测模型重新训练

介绍YOLO目标检测快速上手这篇文章我们通过简短的代码就实现了一个视频目标检测功能。本文将介绍如何使用其他数据集重新训练YOLO模型,文章将会详细介绍每一步。下载数据集我们将使用Pascal VOC数据集训练我们的模型,该数据集可以用来做图像分类、目标检测、图像分割。下载并解压文件后,我们介绍下相关文件的作用。“Annotations”文件夹:用于存放图片描述,文件格式为.xml,具体内容如下图所示:如图所示,文件保存了图片文件名,尺寸,标注,坐标,是否分割等信息。“ImageSets”文件夹:保存了不同用途的图片名字列表,文件格式是.txt。“layout”文件夹:保存具有人体部位的图片名字列表。“main”文件夹:保存用于图像物体识别的图片名字列表。“segmenttions”文件夹:保存用于图像分割的图片名字列表。因为本次项目使用“main”文件夹,所以我们再详细看下:文件夹一共有20个分类的文件,通过文件名字我想大家肯定也知道作用了。这里介绍下文件里的正负数代表正负样本,如:“JPEGImages”文件夹:保存全部图片源文件。这里我们要留意的是图片名字,以后我们在自己创建数据集的时候,最好也参考此命名方式。“SegmentationClass”,“SegmentationObject”保存用于图像分割的源图片,两者区别如图所示:创建标签标签的结构是四维分别是(“类别”,“中心点x坐标”,“中心点y”坐标,“图片宽度”,“图片高度”),其实就是上面所说的图片xml文件中的内容。我们可以通过官方提供的python文件来执行此操作。# 获取py文件wget https://pjreddie.com/media/files/voc_label.py执行此文件之前留意下相关路径是否正确import xml.etree.ElementTree as ETimport pickleimport osfrom os import listdir, getcwdfrom os.path import joinsets=[(‘2007’, ’train’), (‘2007’, ‘val’), (‘2007’, ’test’)]classes = [“aeroplane”, “bicycle”, “bird”, “boat”, “bottle”, “bus”, “car”, “cat”, “chair”, “cow”, “diningtable”, “dog”, “horse”, “motorbike”, “person”, “pottedplant”, “sheep”, “sofa”, “train”, “tvmonitor”]def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = xdw w = wdw y = ydh h = hdh return (x,y,w,h)def convert_annotation(year, image_id): in_file = open(‘VOCdevkit/VOC%s/Annotations/%s.xml’%(year, image_id)) out_file = open(‘VOCdevkit/VOC%s/labels/%s.txt’%(year, image_id), ‘w’) tree=ET.parse(in_file) root = tree.getroot() size = root.find(‘size’) w = int(size.find(‘width’).text) h = int(size.find(‘height’).text) for obj in root.iter(‘object’): difficult = obj.find(‘difficult’).text cls = obj.find(’name’).text if cls not in classes or int(difficult) == 1: continue cls_id = classes.index(cls) xmlbox = obj.find(‘bndbox’) b = (float(xmlbox.find(‘xmin’).text), float(xmlbox.find(‘xmax’).text), float(xmlbox.find(‘ymin’).text), float(xmlbox.find(‘ymax’).text)) bb = convert((w,h), b) out_file.write(str(cls_id) + " " + " “.join([str(a) for a in bb]) + ‘\n’)wd = getcwd()for year, image_set in sets: if not os.path.exists(‘VOCdevkit/VOC%s/labels/’%(year)): os.makedirs(‘VOCdevkit/VOC%s/labels/’%(year)) image_ids = open(‘VOCdevkit/VOC%s/ImageSets/Main/%s.txt’%(year, image_set)).read().strip().split() list_file = open(’%s_%s.txt’%(year, image_set), ‘w’) for image_id in image_ids: list_file.write(’%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n’%(wd, year, image_id)) convert_annotation(year, image_id) list_file.close()执行py文件:python voc_label.py执行成功后会生成一个label文件夹和三个txt文件,分别是“2007_train.txt”,“2007_test.txt”,“2007_val.txt”(我只下载了2007的数据集),文件保存的是对应功能的全部图片路径:label文件夹内文件格式:分别是:(“类别”,“中心点x坐标”,“中心点y”坐标,“图片宽度”,“图片高度”)修改配置文件打开darknet/cfg/voc.data,修改“train”,“valid”文件路径。“classes”:数据集中图片分类数量。“train”:用于训练的图片数据集绝对路径。“valid”:用于验证的图片数据集绝对路径。“names”:数据集中图片分类名字,如:“dog”,“person”等。“backup”:模型训练完成后,权重文件保存路径。模型训练首先下载YOLOv3模型:wget https://pjreddie.com/media/files/darknet53.conv.74训练之前,我们先看下yolov3-voc.cfg文件里都是什么:[net]# Testing# batch=1# subdivisions=1 # 模型训练模式Training # batch_sizebatch=64# 用于进一步分割batch_size,分割后的batch_size大小为:batch_size/subdivisionssubdivisions=16# 模型输入图像宽width=416# 模型输入图像高height=416# 图像通道数channels=3# 使用带动量优化函数的动量参数momentum=0.9# 权重衰减率,用于防止过拟合decay=0.0005# 以下4项是通过改变图像角度,饱和度,曝光量,色调来生成更多样本,可用于防止过拟合angle=0saturation = 1.5exposure = 1.5hue=.1# 初始学习率learning_rate=0.001burn_in=1000# 迭代次数max_batches = 50200# 当迭代到40000,45000时更改学习率policy=stepssteps=40000,45000scales=.1,.1[convolutional]# BN标准化处理,可以通过改变数据分布,处理梯度过小问题,加快模型收敛batch_normalize=1# 输出特征大小filters=32# 卷积核大小3x3size=3# 卷积步长为1stride=1# pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/2pad=1# 激活函数,和relu的区别是当输入值小于0时,输出不为0activation=leaky**。。。。。省略。。。。。。**[yolo]mask = 0,1,2# 预选框,可手动指定也可通过聚类学习得到anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326# 识别种类classes=20# 每个cell预测box数量,yolov1时只有一个num=9# 增加噪声jitter=.3ignore_thresh = .5truth_thresh = 1random=1执行训练:./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74训练完成后,权重文件保存在backup文件夹内。总结如果训练我们自己的数据,数据准备工作参考VOC数据集,在模型训练之前还要更改cfg/yolov3-voc.cfg文件,修改classes类别数量和filter数量,其中filter计算方式:3*(classes+1+4),然后训练即可。 ...

December 23, 2018 · 2 min · jiezi

YOLO目标检测快速上手

介绍YOLO是基于深度学习端到端的实时目标检测系统,YOLO将目标区域预测和目标类别预测整合于单个神经网络模型中,实现在准确率较高的情况下快速目标检测与识别,更加适合现场应用环境。本案例,我们快速实现一个视频目标检测功能,实现的具体原理我们将在单独的文章中详细介绍。下载编译我们首先下载Darknet开发框架,Darknet开发框架是YOLO大神级作者自己用C语言编写的开发框架,支持GPU加速,有两种下载方式:下载Darknet压缩包git clone https://github.com/pjreddie/darknet下载后,完整的文件内容,如下图所示:编译:cd darknet# 编译make编译后的文件内容,如下图所示:下载权重文件我们这里下载的是“yolov3”版本,大小是200多M,“yolov3-tiny”比较小,30多M。wget https://pjreddie.com/media/files/yolov3.weights下载权重文件后,文件内容如下图所示:上图中的“yolov3-tiny.weights”,“yolov2-tiny.weights"是我单独另下载的。C语言预测./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg如图所示,我们已经预测出三种类别以及对应的概率值。模型输出的照片位于darknet根目录,名字是“predictions.jpg”,如下图所示:让我们打开模型输出照片看下:Python语言预测我们首先需要将“darknet”文件夹内的“libdarknet.so”文件移动到“darknet/python”内,完成后如下图所示:我们将使用Darknet内置的“darknet.py”,进行预测。预测之前,我们需要对文件进行修改:默认py文件基于python2.0,所以对于python3.0及以上需要修改print由于涉及到python和C之间的传值,所以字符串内容需要转码使用绝对路径修改完成后,如下图所示:打开“darknet/cfg/coco.data”文件,将“names”也改为绝对路径(截图内没有修改,读者根据自己的实际路径修改):我们可以开始预测了,首先进入“darknet/python”然后执行“darknet.py”文件即可:结果如下图所示:对模型输出的结果做个简单的说明,如:# 分别是:类别,识别概率,识别物体的X坐标,识别物体的Y坐标,识别物体的长度,识别物体的高度(b’dog’, 0.999338686466217, (224.18377685546875, 378.4237060546875, 178.60214233398438, 328.1665954589844)视频检测from ctypes import import randomimport cv2import numpy as npdef sample(probs): s = sum(probs) probs = [a/s for a in probs] r = random.uniform(0, 1) for i in range(len(probs)): r = r - probs[i] if r <= 0: return i return len(probs)-1def c_array(ctype, values): arr = (ctypelen(values))() arr[:] = values return arrclass BOX(Structure): fields = [(“x”, c_float), (“y”, c_float), (“w”, c_float), (“h”, c_float)]class DETECTION(Structure): fields = [(“bbox”, BOX), (“classes”, c_int), (“prob”, POINTER(c_float)), (“mask”, POINTER(c_float)), (“objectness”, c_float), (“sort_class”, c_int)]class IMAGE(Structure): fields = [(“w”, c_int), (“h”, c_int), (“c”, c_int), (“data”, POINTER(c_float))]class METADATA(Structure): fields = [(“classes”, c_int), (“names”, POINTER(c_char_p))]lib = CDLL(”../python/libdarknet.so", RTLD_GLOBAL)lib.network_width.argtypes = [c_void_p]lib.network_width.restype = c_intlib.network_height.argtypes = [c_void_p]lib.network_height.restype = c_intpredict = lib.network_predictpredict.argtypes = [c_void_p, POINTER(c_float)]predict.restype = POINTER(c_float)set_gpu = lib.cuda_set_deviceset_gpu.argtypes = [c_int]make_image = lib.make_imagemake_image.argtypes = [c_int, c_int, c_int]make_image.restype = IMAGEget_network_boxes = lib.get_network_boxesget_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)]get_network_boxes.restype = POINTER(DETECTION)make_network_boxes = lib.make_network_boxesmake_network_boxes.argtypes = [c_void_p]make_network_boxes.restype = POINTER(DETECTION)free_detections = lib.free_detectionsfree_detections.argtypes = [POINTER(DETECTION), c_int]free_ptrs = lib.free_ptrsfree_ptrs.argtypes = [POINTER(c_void_p), c_int]network_predict = lib.network_predictnetwork_predict.argtypes = [c_void_p, POINTER(c_float)]reset_rnn = lib.reset_rnnreset_rnn.argtypes = [c_void_p]load_net = lib.load_networkload_net.argtypes = [c_char_p, c_char_p, c_int]load_net.restype = c_void_pdo_nms_obj = lib.do_nms_objdo_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]do_nms_sort = lib.do_nms_sortdo_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]free_image = lib.free_imagefree_image.argtypes = [IMAGE]letterbox_image = lib.letterbox_imageletterbox_image.argtypes = [IMAGE, c_int, c_int]letterbox_image.restype = IMAGEload_meta = lib.get_metadatalib.get_metadata.argtypes = [c_char_p]lib.get_metadata.restype = METADATAload_image = lib.load_image_colorload_image.argtypes = [c_char_p, c_int, c_int]load_image.restype = IMAGErgbgr_image = lib.rgbgr_imagergbgr_image.argtypes = [IMAGE]predict_image = lib.network_predict_imagepredict_image.argtypes = [c_void_p, IMAGE]predict_image.restype = POINTER(c_float)def convertBack(x, y, w, h): xmin = int(round(x - (w / 2))) xmax = int(round(x + (w / 2))) ymin = int(round(y - (h / 2))) ymax = int(round(y + (h / 2))) return xmin, ymin, xmax, ymaxdef array_to_image(arr): # need to return old values to avoid python freeing memory arr = arr.transpose(2,0,1) c, h, w = arr.shape[0:3] arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0 data = arr.ctypes.data_as(POINTER(c_float)) im = IMAGE(w,h,c,data) return im, arrdef detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): im, image = array_to_image(image) rgbgr_image(im) num = c_int(0) pnum = pointer(num) predict_image(net, im) dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum) num = pnum[0] if nms: do_nms_obj(dets, num, meta.classes, nms) res = [] for j in range(num): a = dets[j].prob[0:meta.classes] if any(a): ai = np.array(a).nonzero()[0] for i in ai: b = dets[j].bbox res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h))) res = sorted(res, key=lambda x: -x[1]) if isinstance(image, bytes): free_image(im) free_detections(dets, num) return resif name == “main”: cap = cv2.VideoCapture(0) ret, img = cap.read() fps = cap.get(cv2.CAP_PROP_FPS) net = load_net(b"/Users/xiaomingtai/darknet/cfg/yolov2-tiny.cfg", b"/Users/xiaomingtai/darknet/yolov2-tiny.weights", 0) meta = load_meta(b"/Users/xiaomingtai/darknet/cfg/coco.data") cv2.namedWindow(“img”, cv2.WINDOW_NORMAL) while(True): ret, img = cap.read() if ret: r = detect(net, meta, img) for i in r: x, y, w, h = i[2][0], i[2][17], i[2][18], i[2][19] xmin, ymin, xmax, ymax = convertBack(float(x), float(y), float(w), float(h)) pt1 = (xmin, ymin) pt2 = (xmax, ymax) cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2) cv2.putText(img, i[0].decode() + " [" + str(round(i[1] * 100, 2)) + “]”, (pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 255, 0], 4) cv2.imshow(“img”, img) if cv2.waitKey(1) & 0xFF == ord(‘q’): break模型输出结果:模型视频检测结果:没有GPU的条件下还是不要选择yolov3了,很慢。总结本篇文章主要是YOLO快速上手,我们通过很少的代码就能实现不错的目标检测。当然,想熟练掌握YOLO,理解背后的原理是十分必要的,下篇文章将会重点介绍YOLO原理。 ...

December 19, 2018 · 3 min · jiezi

深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

摘要: 本文是目标检测系列文章——YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣。在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法——RCNN系列算法原理,以及Faster RCNN的实现。这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起来比较复杂,本文将介绍另外一个端到端的方法——YOLO算法,该方法操作简便且仿真速度快,效果也不差。YOLO算法是什么?YOLO框架(You Only Look Once)与RCNN系列算法不一样,是以不同的方式处理对象检测。它将整个图像放在一个实例中,并预测这些框的边界框坐标和及所属类别概率。使用YOLO算法最大优的点是速度极快,每秒可处理45帧,也能够理解一般的对象表示。YOLO框架如何运作?在本节中,将介绍YOLO用于检测给定图像中的对象的处理步骤。首先,输入图像:然后,YOLO将输入图像划分为网格形式(例如3 X 3):最后,对每个网格应用图像分类和定位处理,获得预测对象的边界框及其对应的类概率。整个过程是不是很清晰,下面逐一详细介绍。首先需要将标记数据传递给模型以进行训练。假设已将图像划分为大小为3 X 3的网格,且总共只有3个类别,分别是行人(c1)、汽车(c2)和摩托车(c3)。因此,对于每个单元格,标签y将是一个八维向量:其中:pc定义对象是否存在于网格中(存在的概率);bx、by、bh、bw指定边界框;c1、c2、c3代表类别。如果检测对象是汽车,则c2位置处的值将为1,c1和c3处的值将为0;假设从上面的例子中选择第一个网格:由于此网格中没有对象,因此pc将为零,此网格的y标签将为:?意味着其它值是什么并不重要,因为网格中没有对象。下面举例另一个有车的网格(c2=1):在为此网格编写y标签之前,首先要了解YOLO如何确定网格中是否存在实际对象。大图中有两个物体(两辆车),因此YOLO将取这两个物体的中心点,物体将被分配到包含这些物体中心的网格中。中心点左侧网格的y标签会是这样的:由于此网格中存在对象,因此pc将等于1,bx、by、bh、bw将相对于正在处理的特定网格单元计算。由于检测出的对象是汽车,所以c2=1,c1和c3均为0。对于9个网格中的每一个单元格,都具有八维输出向量。最终的输出形状为3X3X8。使用上面的例子(输入图像:100X100X3,输出:3X3X8),模型将按如下方式进行训练:使用经典的CNN网络构建模型,并进行模型训练。在测试阶段,将图像传递给模型,经过一次前向传播就得到输出y。为了简单起见,使用3X3网格解释这一点,但通常在实际场景中会采用更大的网格(比如19X19)。即使一个对象跨越多个网格,它也只会被分配到其中点所在的单个网格。可以通过增加更多网格来减少多个对象出现在同一网格单元中的几率。如何编码边界框?如前所述,bx、by、bh和bw是相对于正在处理的网格单元计算而言的。下面通过一个例子来说明这一点。以包含汽车的右边网格为例:由于bx、by、bh和bw将仅相对于该网格计算。此网格的y标签将为:由于这个网格中有一个对象汽车,所以pc=1、c2=1。现在,看看如何决定bx、by、bh和bw的取值。在YOLO中,分配给所有网格的坐标都如下图所示:bx、by是对象相对于该网格的中心点的x和y坐标。在例子中,近似bx=0.4和by=0.3:bh是边界框的高度与相应单元网格的高度之比,在例子中约为0.9:bh=0.9,bw是边界框的宽度与网格单元的宽度之比,bw=0.5。此网格的y标签将为:请注意,bx和by将始终介于0和1之间,因为中心点始终位于网格内,而在边界框的尺寸大于网格尺寸的情况下,bh和bw可以大于1。非极大值抑制|Non-Max Suppression这里有一些思考的问题——如何判断预测的边界框是否是一个好结果(或一个坏结果)?单元格之间的交叉点,计算实际边界框和预测的边界框的并集交集。假设汽车的实际和预测边界框如下所示:其中,红色框是实际的边界框,蓝色框是预测的边界框。如何判断它是否是一个好的预测呢?IoU将计算这两个框的并集交叉区域:IoU =交叉面积/联合的面积;在本例中:IoU =黄色面积/绿色面积;如果IoU大于0.5,就可以说预测足够好。0.5是在这里采取的任意阈值,也可以根据具体问题进行更改。阈值越大,预测就越准确。还有一种技术可以显着提高YOLO的效果——非极大值抑制。对象检测算法最常见的问题之一是,它不是一次仅检测出一次对象,而可能获得多次检测结果。假设:上图中,汽车不止一次被识别,那么如何判定边界框呢。非极大值抑可以解决这个问题,使得每个对象只能进行一次检测。下面了解该方法的工作原理。1.它首先查看与每次检测相关的概率并取最大的概率。在上图中,0.9是最高概率,因此首先选择概率为0.9的方框:2.现在,它会查看图像中的所有其他框。与当前边界框较高的IoU的边界框将被抑制。因此,在示例中,0.6和0.7概率的边界框将被抑制:3.在部分边界框被抑制后,它会从概率最高的所有边界框中选择下一个,在例子中为0.8的边界框:4.再次计算与该边界框相连边界框的IoU,去掉较高IoU值的边界框:5.重复这些步骤,得到最后的边界框:以上就是非极大值抑制的全部内容,总结一下关于非极大值抑制算法的要点:丢弃概率小于或等于预定阈值(例如0.5)的所有方框;对于剩余的边界框:选择具有最高概率的边界框并将其作为输出预测;计算相关联的边界框的IoU值,舍去IoU大于阈值的边界框;重复步骤2,直到所有边界框都被视为输出预测或被舍弃;Anchor Boxes在上述内容中,每个网格只能识别一个对象。但是如果单个网格中有多个对象呢?这就行需要了解 Anchor Boxes的概念。假设将下图按照3X3网格划分:获取对象的中心点,并根据其位置将对象分配给相应的网格。在上面的示例中,两个对象的中心点位于同一网格中:上述方法只会获得两个边界框其中的一个,但是如果使用Anchor Boxes,可能会输出两个边界框!我们该怎么做呢?首先,预先定义两种不同的形状,称为Anchor Boxes。对于每个网格将有两个输出。这里为了易于理解,这里选取两个Anchor Boxes,也可以根据实际情况增加Anchor Boxes的数量:没有Anchor Boxes的YOLO输出标签如下所示:有Anchor Boxes的YOLO输出标签如下所示:前8行属于Anchor Boxes1,其余8行属于Anchor Boxes2。基于边界框和框形状的相似性将对象分配给Anchor Boxes。由于Anchor Boxes1的形状类似于人的边界框,后者将被分配给Anchor Boxes1,并且车将被分配给Anchor Boxes2.在这种情况下的输出,将是3X3X16大小。 因此,对于每个网格,可以根据Anchor Boxes的数量检测两个或更多个对象。结合思想在本节中,首先介绍如何训练YOLO模型,然后是新的图像进行预测。训练训练模型时,输入数据是由图像及其相应的y标签构成。样例如下:假设每个网格有两个Anchor Boxes,并划分为3X3网格,并且有3个不同的类别。因此,相应的y标签具有3X3X16的形状。训练过程的完成方式就是将特定形状的图像映射到对应3X3X16大小的目标。测试对于每个网格,模型将预测·3X3X16·大小的输出。该预测中的16个值将与训练标签的格式相同。前8个值将对应于Anchor Boxes1,其中第一个值将是该网络中对象的概率,2-5的值将是该对象的边界框坐标,最后三个值表明对象属于哪个类。以此类推。最后,非极大值抑制方法将应用于预测框以获得每个对象的单个预测结果。以下是YOLO算法遵循的确切维度和步骤:准备对应的图像(608,608,3);将图像传递给卷积神经网络(CNN),该网络返回(19,19,5,85)维输出;输出的最后两个维度被展平以获得(19,19,425)的输出量:19×19网格的每个单元返回425个数字;425=5 * 85,其中5是每个网格的Anchor Boxes数量;85= 5+80,其中5表示(pc、bx、by、bh、bw),80是检测的类别数;最后,使用IoU和非极大值抑制去除重叠框;YOLO算法实现本节中用于实现YOLO的代码来自Andrew NG的GitHub存储库,需要下载此zip文件,其中包含运行此代码所需的预训练权重。首先定义一些函数,这些函数将用来选择高于某个阈值的边界框,并对其应用非极大值抑制。首先,导入所需的库:import osimport matplotlib.pyplot as pltfrom matplotlib.pyplot import imshowimport scipy.ioimport scipy.miscimport numpy as npimport pandas as pdimport PILimport tensorflow as tffrom skimage.transform import resizefrom keras import backend as Kfrom keras.layers import Input, Lambda, Conv2Dfrom keras.models import load_model, Modelfrom yolo_utils import read_classes, read_anchors, generate_colors, preprocess_image, draw_boxes, scale_boxesfrom yad2k.models.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body%matplotlib inline然后,实现基于概率和阈值过滤边界框的函数:def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6): box_scores = box_confidencebox_class_probs box_classes = K.argmax(box_scores,-1) box_class_scores = K.max(box_scores,-1) filtering_mask = box_class_scores>threshold scores = tf.boolean_mask(box_class_scores,filtering_mask) boxes = tf.boolean_mask(boxes,filtering_mask) classes = tf.boolean_mask(box_classes,filtering_mask) return scores, boxes, classes之后,实现计算IoU的函数:def iou(box1, box2): xi1 = max(box1[0],box2[0]) yi1 = max(box1[1],box2[1]) xi2 = min(box1[2],box2[2]) yi2 = min(box1[3],box2[3]) inter_area = (yi2-yi1)(xi2-xi1) box1_area = (box1[3]-box1[1])(box1[2]-box1[0]) box2_area = (box2[3]-box2[1])(box2[2]-box2[0]) union_area = box1_area+box2_area-inter_area iou = inter_area/union_area return iou然后,实现非极大值抑制的函数:def yolo_non_max_suppression(scores, boxes, classes, max_boxes = 10, iou_threshold = 0.5): max_boxes_tensor = K.variable(max_boxes, dtype=‘int32’) K.get_session().run(tf.variables_initializer([max_boxes_tensor])) nms_indices = tf.image.non_max_suppression(boxes,scores,max_boxes,iou_threshold) scores = K.gather(scores,nms_indices) boxes = K.gather(boxes,nms_indices) classes = K.gather(classes,nms_indices) return scores, boxes, classes随机初始化下大小为(19,19,5,85)的输出向量:yolo_outputs = (tf.random_normal([19, 19, 5, 1], mean=1, stddev=4, seed = 1), tf.random_normal([19, 19, 5, 2], mean=1, stddev=4, seed = 1), tf.random_normal([19, 19, 5, 2], mean=1, stddev=4, seed = 1), tf.random_normal([19, 19, 5, 80], mean=1, stddev=4, seed = 1))最后,实现一个将CNN的输出作为输入并返回被抑制的边界框的函数:def yolo_eval(yolo_outputs, image_shape = (720., 1280.), max_boxes=10, score_threshold=.6, iou_threshold=.5): box_confidence, box_xy, box_wh, box_class_probs = yolo_outputs boxes = yolo_boxes_to_corners(box_xy, box_wh) scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = score_threshold) boxes = scale_boxes(boxes, image_shape) scores, boxes, classes = yolo_non_max_suppression(scores, boxes, classes, max_boxes, iou_threshold) return scores, boxes, classes使用yolo_eval函数对之前创建的随机输出向量进行预测:scores, boxes, classes = yolo_eval(yolo_outputs)with tf.Session() as test_b: print(“scores[2] = " + str(scores[2].eval())) print(“boxes[2] = " + str(boxes[2].eval())) print(“classes[2] = " + str(classes[2].eval()))score表示对象在图像中的可能性,boxes返回检测到的对象的(x1,y1,x2,y2)坐标,classes表示识别对象所属的类。现在,在新的图像上使用预训练的YOLO算法,看看其工作效果:sess = K.get_session()class_names = read_classes(“model_data/coco_classes.txt”)anchors = read_anchors(“model_data/yolo_anchors.txt”)yolo_model = load_model(“model_data/yolo.h5”)在加载类别信息和预训练模型之后,使用上面定义的函数来获取·yolo_outputs·。yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))之后,定义一个函数来预测边界框并在图像上标记边界框:def predict(sess, image_file): image, image_data = preprocess_image(“images/” + image_file, model_image_size = (608, 608)) out_scores, out_boxes, out_classes = sess.run([scores, boxes, classes], feed_dict={yolo_model.input: image_data, K.learning_phase(): 0}) print(‘Found {} boxes for {}’.format(len(out_boxes), image_file)) # Generate colors for drawing bounding boxes. colors = generate_colors(class_names) # Draw bounding boxes on the image file draw_boxes(image, out_scores, out_boxes, out_classes, class_names, colors) # Save the predicted bounding box on the image image.save(os.path.join(“out”, image_file), quality=90) # Display the results in the notebook output_image = scipy.misc.imread(os.path.join(“out”, image_file)) plt.figure(figsize=(12,12)) imshow(output_image) return out_scores, out_boxes, out_classes接下来,将使用预测函数读取图像并进行预测:img = plt.imread(‘images/img.jpg’)image_shape = float(img.shape[0]), float(img.shape[1])scores, boxes, classes = yolo_eval(yolo_outputs, image_shape)最后,输出预测结果:out_scores, out_boxes, out_classes = predict(sess, “img.jpg”)以上就是YOLO算法的全部内容,更多详细内容可以关注darknet的官网。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 18, 2018 · 2 min · jiezi

Andrew Ng教你如何引领公司进入AI时代

摘要: 人工智能时代,企业转型遇到困难?看看Andrew Ng的建议吧!AI(人工智能)技术就像100年前的电力一样,正准备改变每个行业。从现在到2030年,它将创造约13万亿美元的GDP增长。虽然它已经在谷歌,阿里巴巴,微软等领先的科技公司中创造了巨大的价值,但其他许多价值创造浪潮将超越软件领域。这个人工智能转型手册借鉴了我领导谷歌大脑团队和百度AI团队的感悟,AI在使谷歌和百度成为优秀的科技公司。任何企业都可以关注此Playbook并成为一家强大的AI公司,尽管这些建议主要针对市值/估值从5亿美元到500亿美元的大型企业。下面是我建议用AI转换企业的步骤,我将在本文中解释:a) 执行试点项目以获得动力;b) 建立一个内部AI团队;c) 提供广泛的AI培训;d) 制定人工智能战略;e) 鼓励内部和外部沟通。1、执行试点项目以获得动力对于你的前几个AI项目而言,更重要的是成功而不是成为最有价值的AI项目。它们应该足够有意义,以便早期的成功将有助于你的公司熟悉AI,并说服公司其他人投资下一个的AI项目;另外这个项目不应该很小,以至于别人会认为它是微不足道的。重要的是让项目成功实施,这会让你的AI团队获得动力。前几个AI项目的建议特征:a) 理想情况下,新的或外部AI团队(可能对你的业务没有深入的领域知识)可以与你的内部团队(具有深厚的领域知识)合作,构建AI解决方案,在6-12个月内开始显示项目的价值。b) 该项目在技术上应该是可行的。太多的公司仍在使用当今的AI技术开展不可能的项目,所以在启动前,对项目进行尽职调查将增加你对其可行性的信心。c) 有明确定义和可衡量的目标,创造商业价值。当我领导谷歌大脑团队时,谷歌(更广泛地说,世界各地)的深度学习技术受到了极大的怀疑。为了帮助团队获得动力,我选择Google Speech团队作为我的第一个内部客户,我们与他们密切合作,使Google语音识别更加准确。语音识别在Google中是一个有意义的项目,但不是最重要的项目。例如,对公司的底线而言,将其应用于网络搜索或广告并不重要。但是通过使用深度学习僵尸做演讲内容的团队更加成功,而其他团队开始对我们充满信心,这使得Google Brain团队获得了动力。一旦其他团队开始看到Google Speech与Google Brain合作的成功,我们就能够获得更多的内部客户。谷歌大脑的第二个主要内部客户是谷歌地图,它使用深度学习来提高地图数据的质量。通过这两次合作成功,我开始与广告团队进行讨论。此过程是你可以在公司中使用的可重复模型。2、建立一个内部AI团队虽然拥有深厚技术专业AI的外包合作伙伴可以帮助你更快地获得初始动力,但从长远来看,构建一只内部AI团队执行某些项目会更有效率。另外,在公司内部保留一些项目,也可以建立更独特的竞争优势。首先是要从高级管理层获得支持来建立这个内部团队。类似的,在互联网兴起时,许多公司是聘请CIO进行互联网转型的。在人工智能时代,许多公司将形成一个可以帮助整个公司的转型的AI团队。如果他们拥有合适的技能,那么这个AI团队的管理者可以担任CTO,CIO或CDO(首席数据官)职务。它也可以由专门的CAIO(首席AI官员)领导复杂,AI部门的主要职责是:a) 建立AI系统以支持整个公司;b) 推动一系列跨职能项目,以支持与AI项目在不同的部门/业务部门运行,完成初始项目后,删除重复流程以持续提供一系列有价值的AI项目;c) 制定一致的标准;d) 开发对多个部门/业务部门有用的平台,该平台不太可能由个别部门开发。可以考虑与CTO/CIO/CDO合作开发统一的数据仓库标准。一般公司都是有多个业务部门向CEO报告。通过新的AI团队的组织架构,你可以将AI人才分散在不同的部门,以推动跨职能项目。这将会出现新的职位描述和新的团队组织。我现在以机器学习工程师,数据工程师,数据科学家和AI产品经理等角色组织我的团队,这与AI之前的时代不同。目前有AI正在经历人才战争,大多数公司都很难雇用斯坦福大学博士生。由于人才战在短期内基本上是零和,因此可以帮助你建立AI团队的合作伙伴将给你一个非凡的优势。但是,为现有团队提供培训也是在内部培养大量新人才的好方法。3、提供广泛的AI培训今天没有一家公司拥有足够的AI人才。虽然媒体关于高AI工资的报道被过度炒作,但AI人才也很难找到。幸运的是,随着数字内容的兴起,包括课程、电子书和YouTube视频等MOOC,培养员工使用AI等新技能比以往任何时候都更具成本效益。聪明的CLO(首席学习官)的工作应该是策划,而不是创建内容,然后建立流程以确保员工完成学习体验。十年前,内部员工培训意味着聘请顾问来办公室进行讲座,这种方式效率低下且投资回报率尚不清楚。相比之下,数字内容更实惠,也可为员工提供更个性化的体验。如果你有预算聘请顾问,那么在现场内容的基础上应该补充在线内容。事实上,聘请一些AI专家来提供现场讲座也可以激励员工学习AI技术。AI将改变许多工作内容,你应该给团队每个人提供他们在AI时代适应新角色所需的知识。咨询专家将为你的团队开发定制课程,教育计划可能如下所示:1、高级管理人员和业务负责人:(4小时培训)目标:让管理人员了解人工智能可以为企业做些什么,开始制定人工智能战略,做出适当的资源分配决策,并与支持有价值的人工智能项目的人工智能团队顺利协作。课程:a) 对AI的基本理解包括基本技术、数据以及AI可以做什么和不能做什么。b) 了解AI对公司战略的影响。c) 关于人工智能应用到相关行业或特定行业的案例研究。2、执行人工智能项目的部门领导:(12小时培训)目标:部门负责人应能够为人工智能项目设定方向,分配资源,监控和跟踪进度,并根据需要进行更正,以确保项目成功交付。课程:a) 对AI的基本业务理解包括基本技术,数据以及AI可以做什么和不能做什么。b) 对AI的基本技术理解,包括主要的算法类及其要求。c) 基本了解AI项目的工作流程和流程,AI团队中的角色和职责,以及AI团队的管理。3、AI工程师培训生:(⩾100小时培训) 目标:新培训的AI工程师应该能够收集数据,培训AI模型,并完成特定的AI项目。课程:a)深入了解机器学习和深度学习,基本了解AI工具。b)了解用于构建AI和数据系统的可用(开源和其他第三方)工具。c)能够实施AI团队的工作流程。d)此外:跟上不断发展的人工智能技术。4、制定人工智能战略人工智能战略将指导你的公司创造价值,同时建立护城河。一旦团队开始看到初始AI项目的成功并形成对AI的深入理解,你将能够确定AI可以创造最大价值的地方并将资源集中在这些区域上。一些高管认为制定人工智能战略应该是第一步。根据我的经验,大多数公司在获得人工智能的基本经验之前,无法写出完美的人工智能战略,这需要上述步骤1-3的支持。建立护城河的方式也随着人工智能而发展,以下是需要考虑的点:构建几个与基本战略大致相符的具有挑战性性的AI项目:AI使公司能够以新的方式建立独特的竞争优势。迈克尔关于商业战略的开创性著作表明,开展防御性业务的一种方法是建立几个与基本战略基本一致的挑战性的项目。因此,竞争对手难以同时复制所有这些项目。利用人工智能创造特定于你的行业领域的优势:我不建议在“通用”人工智能领域与谷歌、阿里等领先的科技公司竞争,反而我建议你成为某个行业领域的领先AI公司,开发独特的AI功能将允许你获得竞争优势。AI如何影响你公司的战略将视行业和具体情况。战略设计与“人性化的良性循环”正反馈循环一致:在许多行业中,我们将看到数据积累带来的垄断业务:例如,Google,百度,阿里等领先的网络搜索引擎拥有巨大的数据资产,可以显示用户在不同搜索查询后点击的链接。这些数据有助于公司构建更准确的搜索引擎产品(A),从而帮助他们获得更多用户(B),从而使他们拥有更多的用户数据(C),这种积极的反馈循环很难让竞争对手进入。数据是AI系统的关键。因此,许多伟大的AI公司也有一个复杂的数据战略。你的数据战略的关键要素可能包括:战略数据采集:可以使用从100个数据点到100000000个数据点(“大数据”)的任何地方构建有用的AI系统。但拥有更多数据一定不是坏事。AI团队正在竭尽全力的获取数据,具体的数据采集策略是针对特定行业和特定情况的。例如,谷歌和百度都有许多免费产品,这些产品没有盈利模式,但他们可以获取在其他地方产生价值的数据。统一数据仓库:如果你有50个不同的VP或部门控制下的50个不同的数据库,工程师或AI软件几乎不可能都可以访问这些数据。相反,请考虑集中化你的数据分为一个或少数数据仓库。数据价值的判断:自动拥有数TB的数据并不意味着AI团队就能够从该数据中获取价值。期待AI团队从大型数据集中神奇地创造价值是一个很有可能失败的事件,我看到过很多CEO过度投资或收购收集低价值数据的公司。通过在数据采集过程中尽早引入AI团队来避免这种错误,并让他们帮助你确定要获取和保存的数据类型的优先级。创建网络效应和平台优势:最后,AI也可被用于构建更传统的护城河。例如,具有网络效应的平台是高度防御性的业务。他们通常拥有一种自然的“赢家通吃”能力。如果人工智能允许你以比竞争对手更快的速度获得用户,那么它可以用于构建通过平台动态防御的护城河。更广泛地说,你还可以将AI用作低成本战略,高价值或其他业务战略的关键组成部分。5、鼓励内部和外部沟通AI会显著影响你的业务。如果它影响你的关键利益相关者,你应该运行通信程序以确保一致。以下是你应该为相关者考虑的内容:投资者关系:谷歌和阿里等领先的人工智能公司现在是更有价值的公司,部分原因在于他们的人工智能能力以及人工智能对其底线的影响。为贵公司的人工智能解释一份明确的价值创造论文,描述你不断增长的人工智能能力,最后有一个深思熟虑的人工智能战略,将有助于投资者适当地重视你的公司。政府关系:受强监管的行业(自动驾驶汽车,医疗保健),公司面临着保持合规的独特挑战。通过一个可信的,引人注目的人工智能故事,解释你的项目可以为行业或社会带来的价值和利益,是建立信任的重要一步。在你推出项目时,这应该与直接沟通和与监管机构的持续对话相结合。客户/用户教育:AI可能会为你的客户带来重大利益,因此请确保传播适当的营销和产品路线图消息。人才/招聘:由于人才的缺乏,强大的雇主品牌将对你吸引和留住这些人才的能力产生重大影响。AI工程师希望开展令人兴奋且有意义的项目,适度展示你最初成功的项目大有帮助。内部沟通:很多人对人工智能仍然知之甚少,因为被过度炒作,所以存在恐惧、不确定和怀疑。许多员工也担心他们的工作由人工智能取代,尽管这种差异因文化而异。清晰的内部沟通既可以解释人工智能,也可以解决员工的担忧,这将减少内部不愿意采用人工智能。历史对你的成功至关重要了解互联网如何改变行业对于驾驭人工智能的兴起是有用的。有许多企业在互联网崛起的过程中出现了一个错误,我希望在人工智能的兴起中可以避免这种错误。我们在互联网时代了解到:购物中心+网站≠互联网公司即使一个购物中心建立了一个网站并在网站上出售东西,这本身并没有将购物中心变成真正的互联网公司。真正的互联网公司的定义是:你公司原有的业务是否放在互联网上效率更高?(Have you organized your company to do the things that the internet lets you do really well?)例如,互联网公司普遍使用的A/B测试,我们定期推出两个版本的网站,并检测哪个更好。互联网公司甚至可能同时运行数百个实验,这对于实体购物中心来说很难。互联网公司也可以每周发布一种新产品,而购物中心每季度只能更新一次设计。互联网公司对产品经理和软件工程师等角色有独特的职位描述,这些职位具有独特的工作流程和流程,且可以协同工作。深度学习是人工智能发展最快的领域之一,它与互联网的兴起呈现出相似之处。今天,我们发现:互联网的公司+深度学习技术≠AI公司为了让你的公司在人工智能方面做得很好,你必须找到AI使你的公司变得更好的出路。(you will have to organize your company to do the things that AI lets you do really well.)为了让你的公司在人工智能方面表现出色,你必须:a) 系统地执行多个有价值的AI项目的资源:AI公司可以拥有外包或内部技术和人才,可以系统地执行多个AI项目,为业务带来直接价值。b) 对人工智能的充分理解:应该对人工智能有一般的了解,并采用适当的流程来系统地识别和选择有价值的人工智能项目。c) 战略方向:公司的战略大体上与人工智能未来的成功保持一致。AI转型计划可能需要2-3年,但你应该在6-12个月内看到初步的具体结果。通过投资人工智能转型,你将保持领先于竞争对手!本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 17, 2018 · 1 min · jiezi

深度学习常见激活函数介绍及代码实现

作用深度神经网络引入非线性单元,使训练问题不再是一个凸优化问题,虽然我们很难得到最优解,但是可以通过梯度下降去寻找局部最小值。增强模型的拟合能力,理论上只要有足够的神经元,一层隐藏层就可以表达任意函数。性质可微(多元函数):函数可微保证使用梯度下降优化的可计算性。单调性:保证梯度方向相对稳定。输出值范围:当输出有限,由于特征表示受有限权值影响,基于梯度的优化方法会更加稳定;当输出无限,特征表示不受影响,但由于高梯度需要小学习率。非饱和性:当激活函数满足如下要求,称为右饱和:当激活函数满足如下要求,称为左饱和:激活函数饱和会造成梯度值接近0,导致梯度消失使模型无法收敛。sigmoidsigmoid函数,导函数图像:sigmoid激活函数具有“连续可微”,“单调性”,“输出值有限”。通过查看导函数图像,sigmoid激活函数最大的问题就是两端饱和,造成梯度消失(解决办法:使用relu激活函数,BN等),此外输出不以0中心(以0中心的好处是可以加快模型收敛)。目前sigmoid激活函数多使用在二分类问题(对于大于二分类问题,如果类别之间存在相互关系使用sigmoid,反之使用softmax),门控机制的判断等。import tensorflow as tftf.enable_eager_execution()sigmoid_test=tf.nn.sigmoid([-3.,-2.,-1.,0.0,1.,2.,3.],name=‘sigmoid_op’)print(sigmoid_test)输出:tf.Tensor([0.04742587 0.11920292 0.26894143 0.5 0.7310586 0.880797 0.95257413], shape=(7,), dtype=float32)tanh tanh函数,导函数图像:tanh激活函数输出区间[-1,1],输出值以0为中心,与sigmoid激活函数相比具有更大的梯度值,再加上输出值以0为中心,模型收敛更快。不过它依然存在两端饱和,梯度消失问题还是存在,tanh激活函数在RNN模型中应用较多。import tensorflow as tftf.enable_eager_execution()tanh_test=tf.nn.tanh([-3.,-2.,-1.,0.0,1.,2.,3.],name=‘tanh_op’)print(tanh_test)输出:tf.Tensor([-0.9950547 -0.9640276 -0.7615942 0. 0.7615942 0.9640276 0.9950547], shape=(7,), dtype=float32)relurelu函数,导函数图像:relu与线性单元的区别是在其一半的定义域上输出为0,这使得它易于优化,计算。通过图像可得,relu激活函数的梯度不仅大,而且一致,更重要的是它没有sigmoid,tanh激活函数的饱和性,有效缓解了梯度消失问题。目前,relu激活函数是神经网络隐藏层的首选。但是,它最大的问题是当输入小于0时,输出值为0,此时神经元将无法学习。import tensorflow as tftf.enable_eager_execution()relu_test=tf.nn.relu([-3.,-2.,-1.,0.0,1.,2.,3.],name=‘relu_op’)tf.nn.reluprint(relu_test)输出:tf.Tensor([0. 0. 0. 0. 1. 2. 3.], shape=(7,), dtype=float32)leakyreluleakyrelu函数,导函数图像:leakyrelu激活函数是relu的衍变版本,主要就是为了解决relu输出为0的问题。如图所示,在输入小于0时,虽然输出值很小但是值不为0。leakyrelu激活函数一个缺点就是它有些近似线性,导致在复杂分类中效果不好。import tensorflow as tftf.enable_eager_execution()# alpha: Slope of the activation function at x < 0leaky_relu_test=tf.nn.leaky_relu([-3.,-2.,-1.,0.0,1.,2.,3.],alpha=0.2,name=‘leaky_relu_op’)print(leaky_relu_test)输出:tf.Tensor([-0.6 -0.4 -0.2 0. 1. 2. 3. ], shape=(7,), dtype=float32)eluelu函数,导函数图像:elu和relu的区别在负区间,relu输出为0,而elu输出会逐渐接近-,更具鲁棒性。elu激活函数另一优点是它将输出值的均值控制为0(这一点确实和BN很像,BN将分布控制到均值为0,标准差为1)。import tensorflow as tftf.enable_eager_execution()elu_relu_test=tf.nn.elu([-10000,-100.,-3.,-2.,-1.,0.0,1.,2.,3.],name=‘elu_relu_op’)print(elu_relu_test)输出:tf.Tensor([-1. -1. -0.95021296 -0.86466473 -0.63212055 0. 1. 2. 3. ], shape=(9,), dtype=float32)softmaxsoftmax单元常作为网络的输出层,它很自然地表示了具有 k 个可能值的离散型随机变量的概率分布。softmax将向量等比例压缩到[0,1]之间,且保证所有元素之和为1。import tensorflow as tftf.enable_eager_execution()softmax_test=tf.nn.softmax([-3.,-2.,-1.,0.0,1.,2.,3.],name=‘softmax_op’)print(softmax_test)softmax_test_sum=tf.reduce_sum(softmax_test)print(softmax_test_sum)输出:tf.Tensor([0.0015683 0.00426308 0.01158826 0.03150015 0.0856263 0.23275642 0.6326975 ], shape=(7,), dtype=float32)tf.Tensor(1.0, shape=(), dtype=float32)总结激活函数的选择还要根据项目实际情况,考虑不同激活函数的优缺点。 ...

December 17, 2018 · 1 min · jiezi

Frost & Sullivan权威报告:阿里云再次领跑云WAF大中华区市场

近日,国际权威分析机构Frost & Sullivan 针对Web应用防火墙(简称“WAF”)领域发布了《2017年亚太区Web应用防火墙市场报告》,阿里云以市场占有率45.8%的绝对优势连续两年领跑大中华区云WAF市场,这不仅佐证了阿里云Web应用防火墙的产品能力与独特优势,更是客户对阿里云WAF的认可。2017年云WAF大中华区市场份额分布分析师在报告中指出,作为云WAF领域的领导者,阿里云在2017年的市场表现中依然占据了绝对优势,其高增长来源于金融和保险行业以及电子商务均选择云WAF对其业务进行防护。与此同时,借助强大的大数据智能分析能力,阿里云WAF将业务从中国进一步拓展到南亚和东南亚国家,这更进一步强化和巩固了其领导者地位。缘何连续领跑市场?目前,阿里云WAF已经在全球建成16个分布式部署的数据中心,内置近千条针对各类应用的防护策略,建立起了一套多层次多维度的漏斗防御模型,可以为遍布全球的客户提供云端一体化的Web应用安全解决方案,有效保障客户在网络威胁攻击下的业务数据安全。阿里云WAF具备多重优势:I 大容量集群支撑海量业务高峰,多地容灾提供服务高可用性;II 专家策略 + 深度学习 双核心引擎,提升恶意流量识别率;III 云上攻击、信誉情报共享,针对高危Web 0DAY漏洞自动化更新防护策略;IV 可视化大屏、秒级实时在线检索千万业务请求,助力评估当前网站业务安全状况。此外,阿里云WAF接入简单,可以快速与阿里云的DDoS缓解防护方案、AntiBot爬虫风险管理方案以及CDN等服务形成组合拳,为企业提供高效、快捷的综合性解决方案,保障客户业务安全。目前,阿里云WAF已广泛应用在金融、新零售、电商、政府、能源、航空、传媒、教育、医疗、互联网服务等多个领域,服务亚洲航空、12306、新华社、飞利浦等多个企业客户。基于阿里云全球全行业的恶意攻击流量分析情报,阿里云WAF借助自身产品的多维度、深层次检测防护体系可以为全球客户提供技术领先的Web安全解决方案,为业务安全保驾护航。

December 17, 2018 · 1 min · jiezi

深度学习目标检测系列:faster RCNN实现|附python源码

摘要: 本文在讲述RCNN系列算法基本原理基础上,使用keras实现faster RCNN算法,在细胞检测任务上表现优异,可动手操作一下。目标检测一直是计算机视觉中比较热门的研究领域,有一些常用且成熟的算法得到业内公认水平,比如RCNN系列算法、SSD以及YOLO等。如果你是从事这一行业的话,你会使用哪种算法进行目标检测任务呢?在我寻求在最短的时间内构建最精确的模型时,我尝试了其中的R-CNN系列算法,如果读者们对这方面的算法还不太了解的话,建议阅读《目标检测算法图解:一文看懂RCNN系列算法》。在掌握基本原理后,下面进入实战部分。本文将使用一个非常酷且有用的数据集来实现faster R-CNN,这些数据集具有潜在的真实应用场景。问题陈述数据来源于医疗相关数据集,目的是解决血细胞检测问题。任务是通过显微图像读数来检测每张图像中的所有红细胞(RBC)、白细胞(WBC)以及血小板。最终预测效果应如下所示:选择该数据集的原因是我们血液中RBC、WBC和血小板的密度提供了大量关于免疫系统和血红蛋白的信息,这些信息可以帮助我们初步地识别一个人是否健康,如果在其血液中发现了任何差异,我们就可以迅速采取行动来进行下一步的诊断。通过显微镜手动查看样品是一个繁琐的过程,这也是深度学习模式能够发挥重要作用的地方,一些算法可以从显微图像中分类和检测血细胞,并且达到很高的精确度。本文采用的血细胞检测数据集可以从这里下载,本文稍微修改了一些数据:边界框已从给定的.xml格式转换为.csv格式;随机划分数据集,得到训练集和测试集;这里使用流行的Keras框架构建本文模型。系统设置在真正进入模型构建阶段之前,需要确保系统已安装正确的库和相应的框架。运行此项目需要以下库:pandasmatplotlibtensorflowkeras – 2.0.3numpyopencv-pythonsklearnh5py对于已经安装了Anaconda和Jupyter的电脑而言,上述这些库大多数已经安装好了。建议从此链接下载requirements.txt文件,并使用它来安装剩余的库。在终端中键入以下命令来执行此操作:pip install -r requirement.txt系统设置好后,下一步是进行数据处理。数据探索首先探索所拥有的数据总是一个好开始(坦率地说,这是一个强制性的步骤)。对数据熟悉有助于挖掘隐藏的模式,还可以获得对整体的洞察力。本文从整个数据集中创建了三个文件,分别是:train_images:用于训练模型的图像,包含每个图像的类别和实际边界框;test_images:用于模型预测的图像,该集合缺少对应的标签;train.csv:包含每个图像的名称、类别和边界框坐标。一张图像可以有多行数据,因为单张图像可能包含多个对象;读取.csv文件并打印出前几行:# importing required librariesimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inlinefrom matplotlib import patches# read the csv file using read_csv function of pandastrain = pd.read_csv(‘train.csv’)train.head()训练文件中总共有6列,其中每列代表的内容如下:image_names:图像的名称;cell_type:表示单元的类型;xmin:图像左下角的x坐标;xmax:图像右上角的x坐标;ymin:图像左下角的y坐标;ymax:图像右上角的y坐标;下面打印出一张图片来展示正在处理的图像:# reading single image using imread function of matplotlibimage = plt.imread(‘images/1.jpg’)plt.imshow(image)上图就是血细胞图像的样子,其中,蓝色部分代表WBC,略带红色的部分代表RBC。下面看看整个训练集中总共有多少张图像和不同类型的数量。# Number of classestrain[‘cell_type’].value_counts()结果显示训练集有254张图像。# Number of classestrain[‘cell_type’].value_counts()结果显示有三种不同类型的细胞,即RBC,WBC和血小板。最后,看一下检测到的对象的图像是怎样的:fig = plt.figure()#add axes to the imageax = fig.add_axes([0,0,1,1])# read and plot the imageimage = plt.imread(‘images/1.jpg’)plt.imshow(image)# iterating over the image for different objectsfor _,row in train[train.image_names == “1.jpg”].iterrows(): xmin = row.xmin xmax = row.xmax ymin = row.ymin ymax = row.ymax width = xmax - xmin height = ymax - ymin # assign different color to different classes of objects if row.cell_type == ‘RBC’: edgecolor = ‘r’ ax.annotate(‘RBC’, xy=(xmax-40,ymin+20)) elif row.cell_type == ‘WBC’: edgecolor = ‘b’ ax.annotate(‘WBC’, xy=(xmax-40,ymin+20)) elif row.cell_type == ‘Platelets’: edgecolor = ‘g’ ax.annotate(‘Platelets’, xy=(xmax-40,ymin+20)) # add bounding boxes to the image rect = patches.Rectangle((xmin,ymin), width, height, edgecolor = edgecolor, facecolor = ’none’) ax.add_patch(rect)上图就是训练样本示例,从中可以看到,细胞有不同的类及其相应的边界框。下面进行模型训练,本文使用keras_frcnn库来训练搭建的模型以及对测试图像进行预测。faster R-CNN实现为了实现 faster R-CNN算法,本文遵循此Github存储库中提到的步骤。因此,首先请确保克隆好此存储库。打开一个新的终端窗口并键入以下内容以执行此操作:git clone https://github.com/kbardool/keras-frcnn.git并将train_images和test_images文件夹以及train.csv文件移动到该存储库目录下。为了在新数据集上训练模型,输入的格式应为:filepath,x1,y1,x2,y2,class_name其中:filepath是训练图像的路径;x1是边界框的xmin坐标;y1是边界框的ymin坐标;x2是边界框的xmax坐标;y2是边界框的ymax坐标;class_name是该边界框中类的名称;这里需要将.csv格式转换为.txt文件,该文件具有与上述相同的格式。创建一个新的数据帧,按照格式将所有值填入该数据帧,然后将其另存为.txt文件。data = pd.DataFrame()data[‘format’] = train[‘image_names’]# as the images are in train_images folder, add train_images before the image namefor i in range(data.shape[0]): data[‘format’][i] = ’train_images/’ + data[‘format’][i]# add xmin, ymin, xmax, ymax and class as per the format requiredfor i in range(data.shape[0]): data[‘format’][i] = data[‘format’][i] + ‘,’ + str(train[‘xmin’][i]) + ‘,’ + str(train[‘ymin’][i]) + ‘,’ + str(train[‘xmax’][i]) + ‘,’ + str(train[‘ymax’][i]) + ‘,’ + train[‘cell_type’][i]data.to_csv(‘annotate.txt’, header=None, index=None, sep=’ ‘)下一步进行模型训练,使用train_frcnn.py文件来训练模型。cd keras-frcnnpython train_frcnn.py -o simple -p annotate.txt由于数据集较大,需要一段时间来训练模型。如果条件满足的话,可以使用GPU来加快训练过程。同样也可以尝试减少num_epochs参数来加快训练过程。模型每训练好一次(有改进时),该特定时刻的权重将保存在与“model_frcnn.hdf5”相同的目录中。当对测试集进行预测时,将使用到这些权重。根据机器的配置,可能需要花费大量时间来训练模型并获得权重。建议使用本文训练大约500个时期的权重作为初始化。可以从这里下载这些权重,并设置好相应的路径。因此,当模型训练好并保存好权重后,下面进行预测。Keras_frcnn对新图像进行预测并将其保存在新文件夹中,这里只需在test_frcnn.py文件中进行两处更改即可保存图像:从该文件的最后一行删除注释:cv2.imwrite(’./ results_imgs / {}。png’.format(idx),img);在此文件的倒数第二行和第三行添加注释:#cv2.imshow(‘img’,img) ;#cv2.waitKey(0); 使用下面的代码进行图像预测:python test_frcnn.py -p test_images最后,检测到对象的图像将保存在“results_imgs”文件夹中。以下是本文实现faster R-CNN后预测几个样本获得的结果:总结R-CNN算法确实是用于对象检测任务的变革者,改变了传统的做法,并开创了深度学习算法。近年来,计算机视觉应用的数量突然出现飙升,而R-CNN系列算法仍然是其中大多数应用的核心。Keras_frcnn也被证明是一个很好的对象检测工具库,在本系列的下一篇文章中,将专注于更先进的技术,如YOLO,SSD等。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 17, 2018 · 2 min · jiezi

基于深度学习模型Wide&Deep的推荐

本实验选用数据为UCI开源数据集,仅用于学习,请勿商用)Wide&Deep推荐算法出自一篇论文《Wide&Deep Learning for RecommenderSystems》,Wide&Deep由两部分组成,分别是Wide和Deep。先来说wide,表示的是generalized的推荐系统,传统的推荐系统都是通过线性算法基于离散特征来做推荐的。Wide推荐通常是这样的:系统通过获得用户的购物日志数据,包括用户点击哪些商品,购买过哪些商品,然后通过one-hot编码的方式构成离散特征或者通过对业务的理解衍生出一些特征,并进行计算,类似于本系列文章第二篇。这种wide推荐方式有非常多的好处,比如对于大规模的稀疏数据有很好的效果,而且模型的解释性很强。什么叫模型的解释性呢?以逻辑回归为例,每个特征都对应模型中的一个权重值,每个特征的权重值的大小跟这个特征对结果的影响是有关的。那么wide方式同样有很多缺点,比如我们一直强调的,特征衍生需要很多人为操作,需要专家经验,另外这种推荐只对用户操作过的商品有效。接着讲下deep,这里的deep表示的是通过深度学习学习出来的一些向量,这些向量是隐性特征,往往是没有明确可解释性的。这些向量也可以作为特征的一部分参与到训练中。通过deep方式产生的特征会有以下好处,其一可以拟补人为提取特征造成的人力思考维度的限制,试想下一个人可以轻易的思考出二阶乘法的结果,如果是五阶呢?其二这部分特征是深度学习框架自动生成的,无需人力干预。既然Wide和Deep算法各有千秋,那如果可以将两种算法作为组合,那么一定可以生成更有效的推荐场景的模型,本文就介绍如何在PAI-DSW上实现基于Wide&Deep的预测。一、业务场景描述本节使用的是PAI-DSW云端深度学习训练平台和PAI-EAS模型服务平台,使用的是一份开源的基于人的各种背景的统计数据,解决的问题是基于人的各种基础数据预测每个人收入是否会超过50K。本实验的全部代码和数据已经内置于PAI-DSW,只要打开DSW就可以安装下方的教程运行实验。二、数据集介绍数据源:引用UCI开源数据源,https://archive.ics.uci.edu/ml/datasets/Census+Income具体特征字段如下:字段名含义类型描述age对象年龄double对象的年龄大小workclass工作性质string自由职业者、私企、企业人员、政府工作者、无业游民等fnlwgt连续数据double-education学历string学士、说是、博士、11th、10th、1s-4th等等education-num教育年限double教育年限marital-status婚姻状况string单身、未婚、离异等等occupation职业string工程师、农民、销售等等relatonship家庭角色string妻子、父亲、没家庭等等race人种string亚裔、白人、黑人等等sex性别string女性、男性capital-gain连续数据double-capital-loss连续数据double-hours-per-week连续数据double-native-country祖籍国家string美国、哥伦比亚、英格兰、加拿大等等目标字段:income是否超过50k三、数据探索流程首先进入PAI-DSW,找到左侧的Demo文件夹,下载Wide&Deep数据集及代码包。(1)工程描述首先看下整个工程,包含一个census_data文件夹,里面包含一个训练数据和一个测试数据official文件夹是一个工具包census_main.py为训练脚本(2)训练模型打开一个terminal环境,执行python census_main.py –export_dir wide_deep_saved_modelwide_deep_saved_model为输出模型所在的文件夹,训练完在文件目录下会找到相应文件,打开后可以看到checkpoint:把这个checkpoint的号记住。(3)模型预测现在已经生成了模型的checkpoint输出,接下来进入terminal,运行以下脚本:saved_model_cli run –dir wide_deep_saved_model/${模型checkpoint号码}/ –tag_set serve –signature_def=“predict” –input_examples=’${预测数据}‘根据本文的案例可以执行以下脚本拿到预测结果:saved_model_cli run –dir wide_deep_saved_model/1542168326/ –tag_set serve –signature_def=“predict” –input_examples=‘examples=[{“age”:[46.], “education_num”:[10.], “capital_gain”:[7688.], “capital_loss”:[0.], “hours_per_week”:[38.]}, {“age”:[24.], “education_num”:[13.], “capital_gain”:[0.], “capital_loss”:[0.], “hours_per_week”:[50.]}]‘输入了两条预测数据,最终拿到预测结果:输入了两条预测数据,可以得到预测输出,第一条预测结果为1,第二条结果为0,可以通过output key probabilities判断(注:矩阵第一行对应第一个预测结果,第二列0.9599956>第一列0.04000434,所以第一个预测结果是1。同理第二个预测结果是0)。可以通过代码official/wide_deep/census_dataset.py来看具体的特征工程的特征和目标值的构建,目标列>50k时目标值为1,目标列<50k时目标值为0。于是预测结果第一条的人的预测收入为>50k,预测结果第二条的人的预测收入<50k。(4)模型在线部署生成的模型是Tensorflow的标准模型格式,可以通过PAI-EAS将模型部署成Http服务供调用。后续流程可以参考在线预测文档:https://help.aliyun.com/document_detail/92917.html部署成在线服务之后,这样就可以做到模型跟用户自身的业务结合,完成PAI模型训练和业务应用的打通。本文作者:傲海阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 14, 2018 · 1 min · jiezi

目标检测算法图解:一文看懂RCNN系列算法

摘要: 本文简要介绍图像检测中常用的深度学习方法——RCNN家族系列算法,以图像讲解形式,便于理解。在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥匙、手机或者手表等。这个时候一般在房间翻一遍各个角落来寻找不见的物品,最后突然一拍大脑,想到在某一个地方,在整个过程中有时候是很着急的,并且越着急越找不到,真是令人沮丧。但是,如果一个简单的计算机算法可以在几毫秒内就找到你要找的物品,你的感受如何?是不是很惊奇!这就是对象检测算法(object detection)的力量。虽然上述举的生活例子只是一个很简单的例子,但对象检测的应用范围很广,跨越多个不同的行业,从全天候监控到智能城市的实时车辆检测等。简而言之,物体检测是强大的深度学习算法中的一个分支。在本文中,我们将深入探讨可以用于对象检测的各种算法。首先从属于RCNN系列算法开始,即RCNN、 Fast RCNN和 Faster RCNN。在之后的文章中,将介绍更多高级算法,如YOLO、SSD等。1.解决对象检测任务的简单方法(使用深度学习)下图说明了对象检测算法是如何工作。图像中的每个对象,从人到风筝都以一定的精度进行了定位和识别。下面从最简单的深度学习方法开始,一种广泛用于检测图像中的方法——卷积神经网络(CNN)。如果读者对CNN算法有点生疏,建议阅读此文。这里仅简要总结一下CNN的内部运作方式:首先将图像作为输入传递到网络,然后通过各种卷积和池化层处理,最后以对象类别的形式获得输出。对于每个输入图像,会得到一个相应的类别作为输出。因此可以使用这种技术来检测图像中的各种对象。1.首先,将图像作为输入;2.然后,将图像分成不同的区域;3.然后,将每个区域视为单独的图像;4.将所有这些区域传递给CNN并将它们分类为各种类别;5.一旦将每个区域划分为相应的类后,就可以组合所有这些区域来获取具有检测到的对象的原始图像:使用这种方法会面临的问题在于,图像中的对象可以具有不同的宽高比和空间位置。例如,在某些情况下,对象可能覆盖了大部分图像,而在其他情况下,对象可能只覆盖图像的一小部分,并且对象的形状也可能不同。基于此,需要划分大量的区域,这会花费大量的计算时间。因此,为了解决这个问题并减少区域数量,可以使用基于区域的CNN,它使用提议方法选择区域。2.基于区域的卷积神经网络2.1 RCNN的思想RCNN算法不是在大量区域上工作,而是在图像中提出了一堆方框,并检查这些方框中是否包含任何对象。RCNN 使用选择性搜索从图像中提取这些框。下面介绍选择性搜索以及它如何识别不同的区域。基本上四个区域形成一个对象:不同的比例、颜色、纹理和形状。选择性搜索在图像中识别这些模式,并基于此提出各种区域。以下是选择性搜索如何工作的简要概述:首先, 将图像作为输入:然后,它生成初始子分段,以便获得多个区域:之后,该技术组合相似区域以形成更大的区域(基于颜色相似性、纹理相似性、尺寸相似性和形状兼容性):最后,这些区域产生最终的对象位置(感兴趣的区域);下面是RCNN检测对象所遵循的步骤的简要总结:1.首先采用预先训练的卷积神经网络;2.重新训练该模型模型——根据需要检测的类别数量来训练网络的最后一层(迁移学习);3.第三步是获取每个图像的感兴趣区域。然后,对这些区域调整尺寸,以便其可以匹配CNN输入大小;4.获取区域后,使用SVM算法对对象和背景进行分类。对于每个类,都训练一个二分类SVM;最后,训练线性回归模型,为图像中每个识别出的对象生成更严格的边界框;[对上述步骤进行图解分析](http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf):首先,将图像作为输入:然后,使用一些提议方法获得感兴趣区域(ROI)(例如,选择性搜索):之后,对所有这些区域调整尺寸,并将每个区域传递给卷积神经网络:然后,CNN为每个区域提取特征,SVM用于将这些区域划分为不同的类别:最后,边界框回归(Bbox reg)用于预测每个已识别区域的边界框:以上就是RCNN检测物体的全部流程。2.2 RCNN的问题从上节内容可以了解到RCNN是如何进行对象检测的,但这种技术有其自身的局限性。以下原因使得训练RCNN模型既昂贵又缓慢:基于选择性搜索算法为每个图像提取2,000个候选区域;使用CNN为每个图像区域提取特征;RCNN整个物体检测过程用到三种模型:CNN模型用于特征提取;线性svm分类器用于识别对象的的类别;回归模型用于收紧边界框;这些过程相结合使得RCNN非常慢,对每个新图像进行预测需要大约40-50秒,这实际上使得模型在面对巨大的数据集时变得复杂且几乎不可能应用。好消息是存在另一种物体检测技术,它解决了RCNN中大部分问题。3.了解Fast RCNN3.1Fast RCNN的思想RCNN的提出者Ross Girshick提出了这样的想法,即每个图像只运行一次CNN,然后找到一种在2,000个区域内共享该计算的方法。在Fast RCNN中,将输入图像馈送到CNN,CNN生成卷积特征映射。使用这些特征图提取候选区域。然后,使用RoI池化层将所有建议的区域重新整形为固定大小,以便将其馈送到全连接网络中。下面将其分解为简化概念的步骤:1.首先将图像作为输入;2.将图像传递给卷积神经网络,生成感兴趣的区域;3.在所有的感兴趣的区域上应用RoI池化层,并调整区域的尺寸。然后,每个区域被传递到全连接层的网络中;4.softmax层用于全连接网以输出类别。与softmax层一起,也并行使用线性回归层,以输出预测类的边界框坐标。因此,Fast RCNN算法中没有使用三个不同的模型,而使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回所标识类的边界框。对上述过程进行可视化讲解:将图像作为输入:将图像传递给卷积神经网络t,后者相应地返回感兴趣的区域:然后,在提取的感兴趣区域上应用RoI池层,以确保所有区域具有相同的大小:最后,这些区域被传递到一个全连接网络,对其进行分类,并同时使用softmax和线性回归层返回边界框:上述过程说明了Fast RCNN是如何解决RCNN的两个主要问题,即将每个图像中的1个而不是2,000个区域传递给卷积神经网络,并使用一个模型来实现提取特征、分类和生成边界框。3.2Fast RCNN的问题Fast RCNN也存在一定的问题,它仍然使用选择性搜索作为查找感兴趣区域的提议方法,这是一个缓慢且耗时的过程,每个图像检测对象大约需要2秒钟。因此,又开发了另一种物体检测算法——Faster RCNN。4.了解Faster RCNN4.1. Faster RCNN的思想Faster RCNN是Fast RCNN的修改版本,二者之间的主要区别在于,Fast RCNN使用选择性搜索来生成感兴趣区域,而Faster RCNN使用“区域提议网络”,即RPN。RPN将图像特征映射作为输入,并生成一组提议对象,每个对象提议都以对象分数作为输出。以下步骤通常采用Faster RCNN方法:1.将图像作为输入并将其传递给卷积神经网络,后者返回该图像的特征图;2.在这些特征图上应用RPN,返回提议对象及其分数;3.在这些提议对象上应用RoI池层,以将所有提案降低到相同的大小;4.最后,将提议传递到全连接层,该层在其顶部具有softmax层和线性回归层,以对对象的边界框进行分类和输出;这里简要解释一下RPN是如何运作的:首先,Faster RCNN从CNN获取特征图并将它们传递到区域提议网络。RPN在这些特征图上使用滑动窗口,每个窗口生成不同形状和大小的k个方框( Anchor boxe):方框是固定尺寸的边界箱,具有不同的形状和尺寸。对于每个方框,RPN预测两件事:预测锚是对象的概率;用于边界框回归器调整锚点以更好地适合物体的形状;在有了不同形状和大小的边界框后,将其传递到RoI池层。对每个提案并对其进行裁剪,以便每个提案都包含一个对象。这就是RoI池层所做的事情,它为每个方框提取固定大小的特征图:然后将这些特征图传递到全连接层,该层具有softmax和线性回归层,最终对对象进行分类并预测已识别对象的边界框。4.2Faster RCNN的问题上述讨论过的所有对象检测算法都使用区域来识别对象,且网络不会一次查看完整图像,而是按顺序关注图像的某些部分,这样会带来两个复杂性的问题:该算法需要多次通过单个图像来提取到所有对象;由于不是端到端的算法,不同的系统一个接一个地工作,整体系统的性能进一步取决于先前系统的表现效果。5.总结下表是总结了本文中介绍的所有算法算法特征预测时间限制CNN将图像分成多个区域,将每个区域分类为不同的类别-需要很多区域来准确预测,因此计算时间长RCNN使用选择性搜索生成区域,从每个图像中提取大约2000个区域40-50秒每个区域分别传递给CNN的计算时间也很长,且使用三种不同的模型进行预测Fast RCNN每个图像只传递一次到CNN,并提取特征图。在这些地图上使用选择性搜索来生成预测。将RCNN中使用的所有三种模型组合在一起2秒选择性搜索很慢,因此计算时间仍然很长Faster RCNN用区域提议网络替换选择性搜索方法,使算法更快0.2秒对象提议需要时间,并且由于不同的系统一个接一个地工作,系统的性能取决于先前系统的表现效果本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 14, 2018 · 1 min · jiezi

迁移学习NLP:BERT、ELMo等直观图解

摘要: 图解,2018年自然语言处理领域最成功的方向!2018年是自然语言处理的转折点,能捕捉潜在意义和关系的方式表达单词和句子的概念性理解正在迅速发展。此外,NLP社区已经出现了非常强大的组件,你可以在自己的模型和管道中自由下载和使用(它被称为NLP的ImageNet时刻)。在这个时刻中,最新里程碑是发布的BERT,它被描述NLP一个新时代的开始。BERT是一个模型,它打破了前几个模型处理基于语言的任务的记录。该模型的论文发布后不久,团队还开放了该模型的代码,并提供了已经在大量数据集上预先训练过的模型的下载版本。这是一个重大的发展,因为它使任何人都可以构建一个涉及语言处理的机器学习模型,他们成功的将这个强大的工具变成了一个易于使用的组件,从而节省了训练NLP模型所需的时间,精力和资源。BERT是建立在最近NLP社区中涌现的一些聪明的想法之上,包括但不限于半监督序列学习(Andrew Dai和Quoc Le)、<u style=“box-sizing: border-box;">ELMo</u>(由Matthew Peters和来自AI2的研究人员和UW CSE),ULMFiT(由fast.ai创始人Jeremy Howard和Sebastian Ruder提供)和OpenAI转换器(由OpenAI研究人员Radford,Narasimhan,Salimans和Sutskever提供)和Transformer(Vaswani等人)。需要注意的一些概念才能完全了解BERT的内容。因此,让我们首先看一下在查看模型本身所涉及的概念之前可以使用BERT的场景。示例:句子分类BERT最擅长的是分类单个文本,这个模型看起来像这样:为了训练这样的模型,你必须训练分类器,在训练阶段BERT模型发生的变化很小。该过程称为微调,并且整个过程是源于半监督序列学习和ULMFiT。既然我们在讨论分类器,那么我们就处于机器学习的监督学习领域。这意味着我们需要一个标记的数据集来训练这样的模型。以垃圾邮件分类器示例,标记的数据集将是电子邮件和标签的列表(“垃圾邮件”或“非垃圾邮件”)。这种用例的其他示例包括:1、情绪分析输入:电影/产品评论。输出:评论是正面还是负面?示例数据集:SST2、事实查证输入:句子。输出:“索赔”或“不索赔”更夸张/前沿的例子:输入:是否进行索赔。输出:“真”或“假”Full Fact是一个为公众利益建立自动事实检查工具的组织。他们的部分管道其实是一个分类器,它可以读取新闻文章并检测声明(将文本分类为“声明”或“不声明”),以此进行事实验证。模型架构现在你已经了解了如何使用BERT的用例,接下来让我们仔细看看它是如何工作的。首先介绍BERT的两种型号:l BERT BASE:与OpenAI Transformer的尺寸相当,性价比很高;l BERT LARGE:一个非常庞大的模型,它的性能最好;BERT基本上是训练有素的转换器(Transformer)编码器堆栈。现在是你阅读The Illustrated Transformer的好时机,该文章解释了Transformer模型-BERT的基本概念以及我们接下来要讨论的概念。两种BERT模型都有大量的编码器层(本文称之为Transformer Blocks),其中Base版本为12个,Large版本为24个。它们还具有更大的前馈网络(分别为768和1024个隐藏单元)以及比初始论文中的转换器更多attention heads(分别为12和16)(初始论文的转换器中有6个编码器层,512个隐藏单元,和8个attention heads)。模型输入第一个接口输入提供了一个特殊的接口[CLS],原因将在后面变得明显,CLS在这里代表分类。就像转换器的香草编码器一样,BERT采用一系列字作为输入。每一层都应用自我关注,并通过前馈网络传递其结果,然后将其交给下一个编码器。在架构方面,到目前为止,这与转换器完全相同。模型输出每个位置输出大小为hidden_size的矢量(BERT Base中的768)。对于我们上面看过的句子分类示例,我们只关注第一个位置的输出(我们将特殊的接口[CLS]标记传递到)。该向量现在可以用作我们选择的分类器的输入,通过使用单层神经网络作为分类器,这样效果就能达到我们想要的。如果你有更多标签(例如,如果你是使用“垃圾邮件”,“非垃圾邮件”,“社交”和“促销”标记电子邮件),你只需调整分类器网络以获得更多输出神经元即可,然后通过softmax。卷积网相似操作对于那些具有计算机视觉背景的人来说,这个矢量切换应该让人联想到VGGNet等网络的卷积部分与网络末端的完全连接的分类部分之间发生的事情。嵌入(Embedding)的新时代到目前为止,词嵌入一直是影响NLP模型处理语言的主要力量。Word2Vec和Glove等方法已被广泛用于此类任务。让我们回顾一下之前是如何使用它们的。Word嵌入是个啥?对于要由机器学习模型处理的词,它们需要以某种形式的数字表示,这样模型才可以在计算中使用。Word2Vec让我们可以使用一个向量(一个数字列表)以一种捕获语义相关关系的方式正确表示单词(例如,判断单词是相似的,判断还是在它们之间具有的关系,如“开罗”和“埃及”之间的关系)以及句法或基于语法的关系(例如“was”和“is”之间的关系)。该领域的研究者很快意识到,使用经过大量文本数据预训练的嵌入技术,而不将模型与经常是小型数据集的模型一起训练,这是一个好主意。因此,你可以下载Word2Vec或GloVe预训练生成的单词列表及其嵌入。ELMo:语境问题如果我们使用GloVe,那么“stick”这个词将由一个向量表示,无论上下文是什么。但是,许多NLP研究人员(Peters等人,2017年,McCann等人,2017年及Peters等人,2018年在ELMo论文中)发现“stick”有多个含义,这取决于它的使用位置。为什么不根据它所使用的上下文给它一个嵌入呢?这样既捕获该上下文中的单词含义以及其他上下文信息。因此,语境化嵌入词诞生了!语境化词嵌入可以根据它们在句子的上下文中携带的含义给出单词不同的嵌入ELMo不是对每个单词使用固定嵌入,而是在为其中的每个单词分配嵌入之前查看整个句子,它使用在特定任务上训练的双向LSTM来创建这些嵌入。ELMo在NLP背景下向预训练迈出了重要一步。ELMo LSTM将使用我们数据集语言中的大量数据集进行训练,然后我们可以将其用作需要处理语言的其他模型中的组件。ELMo的秘密是什么?ELMo通过训练来预测单词序列中的下一个单词,这是一项称为获得语言理解语言建模的任务。这很方便,因为我们拥有大量的文本数据,这样的模型可以在不需要标签的情况下学习。我们可以看到每个展开的LSTM步骤的隐藏状态都是从ELMo的头部后面突出。在完成预训练之后,这些在嵌入式proecss可以派上用场。ELMo实际上更进一步,因为双向LSTM,这意味着它的语言模型不仅具有下一个词的感觉,而且还有前一个词。ELMo通过以某种方式将隐藏状态(和初始嵌入)组合在一起来提出情境化嵌入(连接后加权求和)。ULM-FiT:在NLP中使用迁移学习ULM-FiT引入了有效利用模型在预训练期间学到的内容的方法,这不仅仅是嵌入,而且是上下文嵌入。ULM-FiT引入了语言模型和流程,从而有效地微调该语言模型以执行各种任务。NLP可能与计算机视觉一样,有了一种方法来进行转移学习。The Transformer:超越LSTMsTransformer论文和代码的发布,以及它在机器翻译等任务上取得的成果开始让一些人认为它们是LSTM的替代品。事实上Transformer比LSTM更好地处理长期依赖性。Transformer的编码器-解码器结构使其非常适合机器翻译。但是你如何将它用于句子分类?你如何使用它来预训练可以针对其他任务进行微调的语言模型(这些任务就是被该领域称为使用预训练模型或组件的监督学习任务)。OpenAI Transformer:预训练用于语言建模的Transformer解码器事实证明,我们不需要整个Transformer来为NLP任务采用转移学习和精细可调语言模型,我们可以只使用Transformer的解码器。解码器是一个很好的选择,因为它是语言建模(预测下一个单词)的必备选择,它是为掩盖未来的接口而构建的。该模型堆叠了十二个解码器层。由于在该设置中没有编码器,因此这些解码器层将不具有香草Transformer解码器层具有的编码器。然而,它仍然会有自我关注层。通过这种结构,我们可以继续在同一语言建模任务上训练模型:使用大量(未标记)数据集预测下一个单词。只是使用7000本书的文字,让它学习!书籍非常适合这类任务,因为它允许模型学习关联相关信息,即使它们被大量文本分开。例如,当你使用推文或文章进行训练时,你无法获得这些信息。现在,OpenAI Transformer已经准备好接受训练,预测由7,000本书组成的数据集上的下一个单词。将学习能力转移到下游任务既然OpenAI Transformer已经过预先训练,并且其层也经过调整以合理地处理语言,我们就可以开始将它用于下游任务。让我们首先看一下句子分类(将电子邮件分类为“垃圾邮件”或“非垃圾邮件”):OpenAI论文概述了许多输入转换,以处理不同类型任务的输入。下图显示了模型的结构和输入转换,以执行不同的任务。BERT:从解码器到编码器openAI的Transformer为我们提供了基于Transformer的可调预训练模型。但是从LSTM到Transformer的过渡中缺少了一些东西,因为ELMo的语言模型是双向的,但openAI的Transformer只训练向前语言模型。我们能否建立一个基于Transformer的模型,其语言模型同时向前和向后?蒙面语言模型(NLM:Masked Language Model)“我们将使用Transformer编码器”,BERT说。“这很疯狂”,Ernie回答说,“每个人都知道双向调节会让每个词在多层次的背景下间接地审视自己。”“我们将使用蒙面工具”,BERT自信地说。找到正确的任务来训练Transformer堆栈的编码器是一个复杂的障碍,BERT通过采用早期文献中的“蒙面语言模型”概念(称为完成任务)来解决。除了掩盖15%的输入之外,BERT还混合了一些东西,以改善模型后来如何微调。有时它会随机用另一个单词替换一个单词,并要求模型预测该位置的正确单词。两个句子的任务(Two-sentence Tasks)如果你回顾一下OpenAI的Transformer处理不同任务的输入变换,你会注意到一些任务要求模型具有说出两个句子的能力(例如,它们是否只是对方的复述?给出一个维基百科条目作为输入,以及关于该条目作为另一个输入的问题。)。为了使BERT更好地处理多个句子之间的关系,预训练过程包括一个额外的任务:给定两个句子(A和B),B可能是跟随A的句子,或不是?特定任务-模型BERT论文展示了将BERT用于不同任务的多种方法。BERT用于特征提取微调不是使用BERT的唯一方法。就像ELMo一样,你可以使用预先训练的BERT来创建语境化词嵌入。然后,你可以将这些嵌入提供给现有模型-该过程论文已经证实可以产生结果,在命名实体识别等任务上应用微调BERT并不远。哪个向量最适合作为上下文嵌入?我认为这取决于任务。我们考察了六种选择(与微调模型相比,得分为96.4):BERT延伸使用BERT的最佳方式是通过BERT FineTuning与Google Colab托管的Cloud TPU笔记本。如果你之前从未使用过云TPU,那么这也是尝试它们的良好起点,以及BERT代码也适用于TPU,CPU和GPU。下一步是查看BERT仓库中的代码:l 该模型在modeling.py(class BertModel)中构建,与vanilla Transformer编码器完全相同。l run_classifier.py是微调过程的一个示例。它还构建了监督模型的分类层,如果要构建自己的分类器,请查看create_model()该文件中的方法。l 可以下载几种预先训练的模型,它们跨越了BERT Base和BERT Large,以及英语,中文等语言,以及涵盖102种语言的多语言模型,这些语言在维基百科上进行了训练。l BERT不会将单词视为标记,相反,它注意者WordPieces。tokenization.py是将你的单词转换为适合BERT的wordPieces的标记器。l 你还可以查看BERT的PyTorch实现。该AllenNLP库使用此实现允许使用的嵌入BERT与任何模型。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 13, 2018 · 1 min · jiezi

对象检测(object detection)算法图解

摘要: 本文简要介绍图像检测中常用的深度学习方法——RCNN家族系列算法,以图像讲解形式,便于理解。在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥匙、手机或者手表等。这个时候一般在房间翻一遍各个角落来寻找不见的物品,最后突然一拍大脑,想到在某一个地方,在整个过程中有时候是很着急的,并且越着急越找不到,真是令人沮丧。但是,如果一个简单的计算机算法可以在几毫秒内就找到你要找的物品,你的感受如何?是不是很惊奇!这就是对象检测算法(object detection)的力量。虽然上述举的生活例子只是一个很简单的例子,但对象检测的应用范围很广,跨越多个不同的行业,从全天候监控到智能城市的实时车辆检测等。简而言之,物体检测是强大的深度学习算法中的一个分支。在本文中,我们将深入探讨可以用于对象检测的各种算法。首先从属于RCNN系列算法开始,即RCNN、 Fast RCNN和 Faster RCNN。在之后的文章中,将介绍更多高级算法,如YOLO、SSD等。1.解决对象检测任务的简单方法(使用深度学习)下图说明了对象检测算法是如何工作。图像中的每个对象,从人到风筝都以一定的精度进行了定位和识别。下面从最简单的深度学习方法开始,一种广泛用于检测图像中的方法——卷积神经网络(CNN)。如果读者对CNN算法有点生疏,建议阅读此文。这里仅简要总结一下CNN的内部运作方式:首先将图像作为输入传递到网络,然后通过各种卷积和池化层处理,最后以对象类别的形式获得输出。对于每个输入图像,会得到一个相应的类别作为输出。因此可以使用这种技术来检测图像中的各种对象。1.首先,将图像作为输入;2.然后,将图像分成不同的区域;3.然后,将每个区域视为单独的图像;4.将所有这些区域传递给CNN并将它们分类为各种类别;5.一旦将每个区域划分为相应的类后,就可以组合所有这些区域来获取具有检测到的对象的原始图像:使用这种方法会面临的问题在于,图像中的对象可以具有不同的宽高比和空间位置。例如,在某些情况下,对象可能覆盖了大部分图像,而在其他情况下,对象可能只覆盖图像的一小部分,并且对象的形状也可能不同。基于此,需要划分大量的区域,这会花费大量的计算时间。因此,为了解决这个问题并减少区域数量,可以使用基于区域的CNN,它使用提议方法选择区域。2.基于区域的卷积神经网络2.1 RCNN的思想RCNN算法不是在大量区域上工作,而是在图像中提出了一堆方框,并检查这些方框中是否包含任何对象。RCNN 使用选择性搜索从图像中提取这些框。下面介绍选择性搜索以及它如何识别不同的区域。基本上四个区域形成一个对象:不同的比例、颜色、纹理和形状。选择性搜索在图像中识别这些模式,并基于此提出各种区域。以下是选择性搜索如何工作的简要概述:首先, 将图像作为输入:然后,它生成初始子分段,以便获得多个区域:之后,该技术组合相似区域以形成更大的区域(基于颜色相似性、纹理相似性、尺寸相似性和形状兼容性):最后,这些区域产生最终的对象位置(感兴趣的区域);下面是RCNN检测对象所遵循的步骤的简要总结:1.首先采用预先训练的卷积神经网络;2.重新训练该模型模型——根据需要检测的类别数量来训练网络的最后一层(迁移学习);3.第三步是获取每个图像的感兴趣区域。然后,对这些区域调整尺寸,以便其可以匹配CNN输入大小;4.获取区域后,使用SVM算法对对象和背景进行分类。对于每个类,都训练一个二分类SVM;最后,训练线性回归模型,为图像中每个识别出的对象生成更严格的边界框;[对上述步骤进行图解分析](http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf):首先,将图像作为输入:然后,使用一些提议方法获得感兴趣区域(ROI)(例如,选择性搜索):之后,对所有这些区域调整尺寸,并将每个区域传递给卷积神经网络:然后,CNN为每个区域提取特征,SVM用于将这些区域划分为不同的类别:最后,边界框回归(Bbox reg)用于预测每个已识别区域的边界框:以上就是RCNN检测物体的全部流程。2.2 RCNN的问题从上节内容可以了解到RCNN是如何进行对象检测的,但这种技术有其自身的局限性。以下原因使得训练RCNN模型既昂贵又缓慢:基于选择性搜索算法为每个图像提取2,000个候选区域;使用CNN为每个图像区域提取特征;RCNN整个物体检测过程用到三种模型:CNN模型用于特征提取;线性svm分类器用于识别对象的的类别;回归模型用于收紧边界框;这些过程相结合使得RCNN非常慢,对每个新图像进行预测需要大约40-50秒,这实际上使得模型在面对巨大的数据集时变得复杂且几乎不可能应用。好消息是存在另一种物体检测技术,它解决了RCNN中大部分问题。3.了解Fast RCNN3.1Fast RCNN的思想RCNN的提出者Ross Girshick提出了这样的想法,即每个图像只运行一次CNN,然后找到一种在2,000个区域内共享该计算的方法。在Fast RCNN中,将输入图像馈送到CNN,CNN生成卷积特征映射。使用这些特征图提取候选区域。然后,使用RoI池化层将所有建议的区域重新整形为固定大小,以便将其馈送到全连接网络中。下面将其分解为简化概念的步骤:1.首先将图像作为输入;2.将图像传递给卷积神经网络,生成感兴趣的区域;3.在所有的感兴趣的区域上应用RoI池化层,并调整区域的尺寸。然后,每个区域被传递到全连接层的网络中;4.softmax层用于全连接网以输出类别。与softmax层一起,也并行使用线性回归层,以输出预测类的边界框坐标。因此,Fast RCNN算法中没有使用三个不同的模型,而使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回所标识类的边界框。对上述过程进行可视化讲解:将图像作为输入:将图像传递给卷积神经网络t,后者相应地返回感兴趣的区域:然后,在提取的感兴趣区域上应用RoI池层,以确保所有区域具有相同的大小:最后,这些区域被传递到一个全连接网络,对其进行分类,并同时使用softmax和线性回归层返回边界框:上述过程说明了Fast RCNN是如何解决RCNN的两个主要问题,即将每个图像中的1个而不是2,000个区域传递给卷积神经网络,并使用一个模型来实现提取特征、分类和生成边界框。3.2Fast RCNN的问题Fast RCNN也存在一定的问题,它仍然使用选择性搜索作为查找感兴趣区域的提议方法,这是一个缓慢且耗时的过程,每个图像检测对象大约需要2秒钟。因此,又开发了另一种物体检测算法——Faster RCNN。4.了解Faster RCNN4.1. Faster RCNN的思想Faster RCNN是Fast RCNN的修改版本,二者之间的主要区别在于,Fast RCNN使用选择性搜索来生成感兴趣区域,而Faster RCNN使用“区域提议网络”,即RPN。RPN将图像特征映射作为输入,并生成一组提议对象,每个对象提议都以对象分数作为输出。以下步骤通常采用Faster RCNN方法:1.将图像作为输入并将其传递给卷积神经网络,后者返回该图像的特征图;2.在这些特征图上应用RPN,返回提议对象及其分数;3.在这些提议对象上应用RoI池层,以将所有提案降低到相同的大小;4.最后,将提议传递到全连接层,该层在其顶部具有softmax层和线性回归层,以对对象的边界框进行分类和输出;这里简要解释一下RPN是如何运作的:首先,Faster RCNN从CNN获取特征图并将它们传递到区域提议网络。RPN在这些特征图上使用滑动窗口,每个窗口生成不同形状和大小的k个方框( Anchor boxe):方框是固定尺寸的边界箱,具有不同的形状和尺寸。对于每个方框,RPN预测两件事:预测锚是对象的概率;用于边界框回归器调整锚点以更好地适合物体的形状;在有了不同形状和大小的边界框后,将其传递到RoI池层。对每个提案并对其进行裁剪,以便每个提案都包含一个对象。这就是RoI池层所做的事情,它为每个方框提取固定大小的特征图:然后将这些特征图传递到全连接层,该层具有softmax和线性回归层,最终对对象进行分类并预测已识别对象的边界框。4.2Faster RCNN的问题上述讨论过的所有对象检测算法都使用区域来识别对象,且网络不会一次查看完整图像,而是按顺序关注图像的某些部分,这样会带来两个复杂性的问题:该算法需要多次通过单个图像来提取到所有对象;由于不是端到端的算法,不同的系统一个接一个地工作,整体系统的性能进一步取决于先前系统的表现效果。5.总结下表是总结了本文中介绍的所有算法算法特征预测时间限制CNN将图像分成多个区域,将每个区域分类为不同的类别-需要很多区域来准确预测,因此计算时间长RCNN使用选择性搜索生成区域,从每个图像中提取大约2000个区域40-50秒每个区域分别传递给CNN的计算时间也很长,且使用三种不同的模型进行预测Fast RCNN每个图像只传递一次到CNN,并提取特征图。在这些地图上使用选择性搜索来生成预测。将RCNN中使用的所有三种模型组合在一起2秒选择性搜索很慢,因此计算时间仍然很长Faster RCNN用区域提议网络替换选择性搜索方法,使算法更快0.2秒对象提议需要时间,并且由于不同的系统一个接一个地工作,系统的性能取决于先前系统的表现效果本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 12, 2018 · 1 min · jiezi

深度学习实现自动生成图片字幕

介绍本次项目使用深度学习自动生成图像字幕。如上图,模型自动生成“The person is riding a surfboard in the ocean”字幕。我们具体该如何实现呢?如图所示,我们需要分别使用CNN和RNN模型来实现。CNN模型:利用卷积网络对图像特征提取的强大能力,来提取特征信息。我们的CNN模型需要有强大的识别能力,因此该模型需要使用过大量,多类别的训练集进行训练,并且识别准确率较高。本次,我们利用迁移学习使用Inception模型实现此功能。通过迁移学习实现OCT图像识别 文章中有迁移学习的相关介绍。RNN模型:对于文本序列数据,目前我们最好的选择依然是RNN模型。为了提升模型预测能力,我们使用注意力机制实现文本预测。注意力机制实现机器翻译 文章中有注意力机制的相关介绍。对模型的细节要求我们将在对应代码实现里进行介绍。数据集介绍我们使用MS-COCO数据集进行训练,为方便理解,简单介绍下数据格式。COCO数据有5种类型,分别是: object detection, keypoint detection, stuff segmentation, panoptic segmentation,image captioning。基础数据结构如下图所示:具体样例(部分):本次项目使用的是Image Captioning其中,每张照片不少于5个字幕:数据下载处理import tensorflow as tf# 开启eager模式tf.enable_eager_execution()import matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.utils import shuffleimport reimport numpy as npimport osimport timeimport jsonfrom glob import globfrom PIL import Imageimport pickleannotation_zip=tf.keras.utils.get_file( # cache_dir(默认值): ~/.keras # cache_subdir: datasets, # /.keras/datasets/captions.zip fname=‘captions.zip’, cache_subdir=os.path.abspath(’.’), origin=‘http://images.cocodataset.org/annotations/annotations_trainval2014.zip', # 解压 extract=True)# 返回文件夹名,实现:split(file)[0]annotation_file = os.path.dirname(annotation_zip)+’/annotations/captions_train2014.json’name_of_zip=‘train2014.zip’if not os.path.exists(os.path.abspath(’.’)+"/"+name_of_zip): image_zip=tf.keras.utils.get_file( fname=name_of_zip, cache_subdir=os.path.abspath(’.’), origin=‘http://images.cocodataset.org/zips/train2014.zip', extract=True ) PATH=os.path.dirname(image_zip)+‘train2014/’else: PATH=os.path.abspath(’.’)+’/train2014/‘读取字幕和图片:# 读取注释json文件with open(annotation_file,‘r’) as f: annotations=json.load(f)# 保存全部字幕all_captions=[]# 保存全部图片all_img_name_vecotr=[]# json格式参考COCO数据集官网for annot in annotations[‘annotations’]: # 添加开始和结束标记 caption=’<start>’+annot[‘caption’]+’<end>’ # 获取图片名字 image_id=annot[‘image_id’] # 参考文章开始给出的“具体样例” full_coco_image_path=PATH+‘COCO_train2014_’+’%012d.jpg’%(image_id) all_img_name_vecotr.append(full_coco_image_path) all_captions.append(caption)# random_state 随机种子,确保每次数据一致train_captions,img_name_vector=shuffle( all_captions, all_img_name_vecotr, random_state=1 ) # 使用训练集前30000样本 num_examples=30000 train_captions=train_captions[:num_examples] img_name_vector=img_name_vector[:num_examples]重训练InceptionV3:简单介绍下InceptionV3模型:Inception模型结构中最重要的思想就是卷积核分解。通过上图可知,5x5的卷积可由2个3x3的卷积代替,3x3卷积可由一个3x1卷积和一个1x3卷积代替,代替的好处是减少了权重参数量,增加了网络非线性(层增多)。比如,一个5x5卷积的权重参数量和2个3x3卷积的权重参数量分别是(5x5):(3x3)x2。InceptionV3中就将7x7的卷积分解成7x1卷积和1x7卷积。批标准化(BN)正式提出是在InceptionV2,BN通过将输入分布转变成均值为0,标准差为1的正态分布,将值域处于激活函数敏感范围从而防止梯度消失问题。正因为梯度消失问题的解决,我们可以使用更大的学习率进行训练从而加快模型收敛。由于BN有类似Dropout的正则化作用,因此在训练的时候不使用或少使用Dropout,并减轻L2正则。使用非对称卷积,如:1x3卷积,3x1卷积(论文作者指出在feature map的大小12x1220x20之间效果最好)。使用Label Smoothing对损失修正。下图是新损失函数:网络各层信息如下图所示:# 使用inception V3 要求图片分辨率:299,299# 输入值范围[-1,1]def load_image(image_path): img=tf.image.decode_jpeg(tf.read_file(image_path)) img_reshape=tf.image.resize_images(img,(299,299)) # 像素范围[-1,1] # (-255)/255 img_range=tf.keras.applications.inception_v3.preprocess_input(img_reshape) return img_range,image_path使用迁移学习构建新模型:# 最后一层卷积输入shape(882048),并将结果向量保存为dictimage_model=tf.keras.applications.InceptionV3( # 不使用最后全连接层 include_top=False, # inception模型的训练集是imagenet weigths=‘imagenet’)# shape:(batch_size,299,299,3)new_input=image_model.input# hidden_layer shape:(batch_size,8,8,2048)hidden_layer=image_model.layers[-1].output# 创建新模型image_features_extract_model=tf.keras.Model( new_input, hidden_layer)保存通过使用InceptionV3获得的特征:encode_train=sorted(set(img_name_vector))# map:可以并行处理数据,默认读取的文件具有确定性顺序# 取消顺序可以加快数据读取# 通过设置参数num_parallel_calls实现image_dataset=tf.data.Dataset.from_tensor_slices(encode_train).map(load_image).batch(16)for img,path in image_dataset: # inception v3得到的feature batch_features=image_features_extract_model(img) batch_features=tf.reshape( # shape:(batch_size,8,8,2048) reshape:(batch_size,64,2048) batch_features,shape=(batch_features.shape[0],-1,batch_features[3]) )# 保存for bf,p in zip(batch_features,path): path_of_feature=p.numpy().decode(‘utf-8’) # 文件后缀.npy np.save(path_of_feature,bf.numpy())文本处理文本处理方式还是老规矩,先将文本转成字典表示然后创建字符转ID,ID转字符,最后补长到预设长度。# 计算最大长度def calc_max_length(tensor): return max(len(t)for t in tensor)top_k=5000tokenizer=tf.keras.preprocessing.text.Tokenizer( num_words=top_k, # 字典中没有的字符用<unk>代替 oov_token=’<unk>’, # 需要过滤掉的特殊字符 filters=’!"#$%&()+.,-/:;=?@[]^_`{|}~’)# 要用以训练的文本列表tokenizer.fit_on_texts(train_captions)# 转为序列列表向量train_seqs=tokenizer.texts_to_sequences((train_captions))tokenizer.word_index[’<pad>’]=0# 如果没有指定最大长度,pad_sequences会自动计算最大长度cap_vector=tf.keras.preprocessing.sequence.pad_sequences( sequences=train_seqs, # 后置补长 padding=‘post’)max_length=calc_max_length(train_seqs)模型训练参数拆分训练集,验证集:img_name_train,img_name_val,cap_trian,cap_val=train_test_split( img_name_vector, cap_vector, # 验证数据集占20% test_size=0.2, # 确保每次数据一致 random_state=0# 最好是2的次幂,更适合GPU运算(加快二进制运算)BATCH_SIZE=64# shuffle 缓冲区大小BUFFER_SIZE=1000# 词嵌入维度embedding_dim=256units=512vocab_size=len(tokenizer.word_index)# 后面会将(8,8,2048)转为(64,2048)# 维度一定要一致feature_shape=2048attention_features_shape=64# 加载保存的之前feature文件def map_func(img_name,cap): img_tensor=np.load(img_name.decode(‘utf-8’)+’.npy’) return img_tensor,capdataset=tf.data.Dataset.from_tensor_slices((img_name_train,cap_trian))# num_parallel_calls 根据自己的CPU而定dataset=dataset.map(lambda item1,item2:tf.py_func( map_func,[item1,item2],[tf.float32,tf.int32]),num_parallel_calls=4)# prefetch 可以合理利用CPU准备数据,GPU计算数据之间的空闲时间,加快数据读取dataset=dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(1)创建模型编码器模型:# 一层使用relu的全连接层class CNN_Encoder(tf.keras.Model): def init(self,embedding_dim): super(CNN_Encoder, self).init() # fc shape:(batch_size,64,embedding_dim) self.fc=tf.keras.layers.Dense(embedding_dim) def call(self,x): x=self.fc(x) x=tf.nn.relu(x) return x注意力层:详细介绍可以查看文章开始给出的链接,这里给出计算方程式:class BahdanauAttention(tf.keras.Model): def init(self,units): super(BahdanauAttention, self).init() self.W1=tf.keras.layers.Dense(units) self.W2=tf.keras.layers.Dense(units) self.V=tf.keras.layers.Dense(1) def call(self, features,hidden): # 参考注意力机制计算的方程 # feature shape:(batch_size,64,embedding_dim) # hidden_state shape:(batch_size,hidden_size) hidden_with_time_axis=tf.expand_dims(hidden,1) # score shape:(batch_size,64,hidden_size) score=tf.nn.tanh(self.W1(features)+self.W2(hidden_with_time_axis)) # attention_weights shape:(batch_size,64,1) attention_weights=tf.nn.softmax(self.V(score),axis=1) context_vector=tf.reduce_sum(attention_weightsfeatures,axis=1) return context_vector,attention_weights解码器中的GRU:# 相比LSTM因为减少了一个门,参数少,收敛快def gru(units): if tf.test.is_gpu_available(): # 使用GPU加速计算 return tf.keras.layers.CuDNNGRU( units=units, return_state=True, return_sequences=True, # 循环核的初始化方法 # glorot_uniform是sqrt(2 / (fan_in + fan_out))的正态分布产生 # 其中fan_in和fan_out是权重张量的扇入扇出(即输入和输出单元数目) recurrent_initializer=‘glorot_uniform’ ) else: return tf.keras.layers.GRU( return_sequences=True, return_state=True, # 默认:hard_sigmoid <= -1 输出0,>=1 输出1 ,中间为线性 recurrent_activation=‘sigmoid’, recurrent_initializer=‘glorot_uniform’ )解码器模型:# 使用注意力模型class RNN_Decoder(tf.keras.Model): def init(self,embedding_dim,units,vocab_size): super(RNN_Decoder, self).init() self.units=units # 词嵌入将高维离散数据转为低维连续数据,并表现出数据之间的相似性(向量空间) self.embedding=tf.keras.layers.Embedding(input_shape=vocab_size,output_dim=embedding_dim) self.gru=gru(units) self.fc1=tf.keras.layers.Dense(self.units) self.fc2=tf.keras.layers.Dense(vocab_size) self.attention=BahdanauAttention(self.units) def call(self,x,features,hidden): # 获取注意力模型输出 context_vector,attention_weights=self.attention(features,hidden) # x shape:(batch_size,1,embedding_dim) x=self.embedding(x) # 注意力,当前输入合并 # 注意力shape:(batch_size,1,hidden) x shape:(batch_size,1,embedding_size) # x shape:(batch_size, 1, embedding_dim + hidden_size) x=tf.concat([tf.expand_dims(context_vector,1),x],axis=-1) output,state=self.gru(x) # x shape:(batch_size,max_length,hidden_size) x=self.fc1(output) # x shape:(batch_sizemax_length,hidden_size) x=tf.reshape(x,shape=(-1,x.shape[2])) # x shape:(batch_sizemax_length,vocab_size) x=self.fc2(x) return x,state,attention_weights def reset_state(self, batch_size): return tf.zeros((batch_size, self.units))模型训练实例化模型:encoder = CNN_Encoder(embedding_dim)decoder = RNN_Decoder(embedding_dim, units, vocab_size)损失函数,优化器设置:# InceptionV3模型使用的不是Adam优化器# 各种优化器以后放到一篇单独的文章详细介绍optimizer=tf.train.AdamOptimizer(learning_rate=0.0001)def loss_function(real,pred): mask=1-np.equal(real,0) # 带mask的交叉熵损失 loss_=tf.nn.sparse_softmax_cross_entropy_with_logits( labels=real, logits=pred )*mask return tf.reduce_mean(loss_)训练:将使用InceptionV3模型提取的特征作为编码器输入编码器输出,hidden_state,字幕文本作为解码器输入解码器hidden_state作为下一次输入,预测值用于计算模型损失使用标签文本作为解码器输入(teacher-forcing模式)梯度计算及应用loss_plot=[]EPOCHS=20for epoch in range(EPOCHS): start=time.time() total_loss=0 for (batch,(img_tensor,target)) in enumerate(dataset): loss=0 # 每迭代一次batch后重置 hidden_state hidden=decoder.reset_states(batch_size=target.shape[0]) # input维度是3维 dec_input=tf.expand_dims([tokenizer.word_index[’<start>’]*BATCH_SIZE],1) # eager模式下记录梯度 with tf.GradientTape() as tape: # inception模式提取的特征 features=encoder(img_tensor) # 每张照片不止一个captions for i in range(1,target.shape[1]): # attention_weights此处暂不需要 predictions,hidden,_=decoder(dec_input,features,hidden) loss+=loss_function(target[:,i],predictions) # teacher forcing 使用标签数据作为输入替代hidden-output dec_input=tf.expand_dims(target[:,i],1) total_loss+=(loss/int(target.shape[1])) # 总训练参数 variables=encoder.variables+decoder.variables # 梯度计算及应用 gradients=tape.gradient(loss,variables) optimizer.apply_gradients(zip(gradients,variables)) if batch%100 == 0: print(’epoch{},batch{},loss{:.4}’.format( epoch+1, batch, loss.numpy()/int(target.shape[1]) )) loss_plot.append(total_loss/len(cap_vector))plt.plot(loss_plot)plt.xlabel(’epochs’)plt.ylabel(’loss’)plt.show()模型预测模型预测不使用Teacher forcing模式,当遇到预设的结束标记“<end>”时模型结束训练。def evaluate(image): attention_plot = np.zeros((max_length, attention_features_shape)) # 初始化hidden-state hidden = decoder.reset_state(batch_size=1) # shape:(1,299,299,3) temp_input = tf.expand_dims(load_image(image)[0], 0) # 特征提取 img_tensor_val = image_features_extract_model(temp_input) # shape:(1,8,8,2048) reshape:(1,64,2048) img_tensor_val = tf.reshape(img_tensor_val, (img_tensor_val.shape[0], -1, img_tensor_val.shape[3])) # shape:(1,64,256) features = encoder(img_tensor_val) # 增加batchsize维度 dec_input = tf.expand_dims([tokenizer.word_index[’<start>’]], 0) result = [] for i in range(max_length): predictions, hidden, attention_weights = decoder(dec_input, features, hidden) attention_plot[i] = tf.reshape(attention_weights, (-1, )).numpy() # 我们使用softmax归一化结果,使用argmax查询最大值 # 对于分类数量大于2,softmax和sigmoid的区别是 # 类别之间有相互关系的使用sigmoid,反之使用softmax predicted_id = tf.argmax(predictions[0]).numpy() # ID转字符,获取文本结果 result.append(tokenizer.index_word[predicted_id]) # 判断是否是预设的结束标记 if tokenizer.index_word[predicted_id] == ‘<end>’: return result, attention_plot # 将预测值作为输入,预测下一个结果(teacher-forcing在这里使用数据标签作为输入) dec_input = tf.expand_dims([predicted_id], 0) attention_plot = attention_plot[:len(result), :] return result, attention_plot以下用于可视化注意力机制训练过程:此处代码主要是图像展示就不做过多介绍了。def plot_attention(image, result, attention_plot): temp_image = np.array(Image.open(image)) fig = plt.figure(figsize=(10, 10)) len_result = len(result) for l in range(len_result): temp_att = np.resize(attention_plot[l], (8, 8)) ax = fig.add_subplot(len_result//2, len_result//2, l+1) ax.set_title(result[l]) img = ax.imshow(temp_image) ax.imshow(temp_att, cmap=‘gray’, alpha=0.6, extent=img.get_extent()) plt.tight_layout() plt.show()rid = np.random.randint(0, len(img_name_val))image = img_name_val[rid]real_caption = ’ ‘.join([tokenizer.index_word[i] for i in cap_val[rid] if i not in [0]])result, attention_plot = evaluate(image)print (‘Real Caption:’, real_caption)print (‘Prediction Caption:’, ’ ‘.join(result))plot_attention(image, result, attention_plot)Image.open(img_name_val[rid])总结想要对图像生成字幕,首先需要提取图像特征,本文我们利用迁移学习使用Inception模型来提取特征,对于Inception模型,我们重点理解卷积核分解。至于文本预测部分与使用注意力机制实现机器翻译大体一致。有一点想说的是,类似这样的项目维度转换会比较多,也是很容易出错的地方,这一点需要格外留意。本文代码内容来自 Yash Katariya在此表示感谢。 ...

December 11, 2018 · 3 min · jiezi

将神经网络训练成一个“放大镜”

摘要: 想不想将神经网络训练成一个“放大镜”?我们就训练了一个这样炫酷的神经网络,点击文章一起看下吧!当我们网购时,我们肯定希望有一个贴近现实的购物体验,也就是说能够全方位的看清楚产品的细节。而分辨率高的大图像能够对商品进行更加详细的介绍,这真的可以改变顾客的购物体验,让顾客有个特别棒的购物之旅。idealo.de是欧洲领先的比价网站,也是德国电子商务市场最大的门户网站之一,在此基础上,我们希望能够在此基础上为用户提供一个用户友好、有吸引力的购物平台。在这里,我们利用深度学习来评估数百万酒店图像的美学层次和技术质量,另外,那些没有任何信息的、特别难看的小的产品图像对我们来说是无效的,因此需要想办法解决。购物网站上并不是所有的商店都能为顾客提供高质量的图像,相反,商家提供的图像特别小、分辨率特别低、质量也很低。为了向用户展示高质量的高分辨率图像,我们基于2018年的论文《图像超分辨率的RDN网络》,训练了一个特别先进的卷积神经网络。我们的目标很简单:拍摄一些特别小的图像,然后就像使用放大镜一样,对图像进行放大,并且还要保持高分辨率。本文对实现这一目标做了详细介绍,另外,具体实现的细节,请查看GitHub。总概与大多数深度学习项目一样,我们的深度学习项目主要有四个步骤:1.回顾前人对该项目所做的贡献。2.实施一个或多个解决方案,然后比较预先训练的版本。3.获取数据,训练并测试模型。4.针对训练和验证结果对模型进行改进和优化。具体来说,本文主要有以下几方面的内容:1.介绍模型训练的配置,如何评估模型的性能2. 查看早期训练和测试结果,了解从哪方面进行改进。3.指出后续需要探索的方向。训练与以往“标准”的监督深度学习任务不同,我们这个“放大镜”深度学习模型输出的不仅仅是类标签或一个分数,而是一整幅图像。这就意味着训练过程以及评估会跟以往略有不同,我们要输出的是原始高分辨率图像,为了更好的对模型进行评估,我们需要一种测量缩放输出图像“质量”的方法,该方法更详细的优缺点将在后面进一步做详细阐释。损失函数损失函数是用来评估神经网络的性能究竟如何,这个有很多方法可以评估。这个问题的本质为大家留下了创造力空间,如有些聪明的人会用高级特征和对抗网络。对于第一次迭代,我们使用标准方法:网络的超分辨率(SR)输出和高分辨率输出(HR)之间的像素均方差(MSE)。评估我们用峰值信噪比(PSNR)来评估输出图像的质量,峰值信噪比是基于两个图像之间的像素均方差(MSE)。由于峰值信噪比是最常用的评估输出图像质量的方法,因此我们也使用这一评估标准,以便将本文模型与其他模型作比较。开始我们在p2.xlarge AWS EC2实例上进行训练,直到验证损失函数收敛,训练结束,这大概需要90个周期(一个周期24小时),然后使用Tensorboard跟踪训练数据集及验证数据集的损失函数和PSNR值。如上图所示,左上角为在每个周期结束时,反向传播到神经网络上的训练损失函数。右上角为跟踪泛化性能的非训练数据及的损失。左下角为训练数据集的PSNR值。右下角为验证数据集的PSNR值。结果输出的结果如下所示,我们先看看模型的输出结果,再考虑如何对该模型进行改进。左侧是验证数据集中的整个图像,中间是卷积神经网络的输出提取图像块,右侧是使用标准过程将中间输出提取图像块按比例放大后的输出,这里使用了GIMP的图像缩放功能![LR图像(左),重建SR(中),GIMP基线缩放(右)。](https://upload-images.jianshu…这个结果肯定不是特别完美:蝴蝶的天线周围有些没必要的噪声,蝴蝶的颈部和背部的毛发及翅膀上有些斑点轮廓,神经网络的输出图像(中)看起来要比GIMP基线输出图像(右)更加清晰。结果分析为了进一步理解模型有哪些优缺点,我们需要从验证数据集中提取具有高PSNR值的图像块和具有低能量度值的图像块。不出所料,性能最佳的图像块是具有较多平坦区域的图像块,而较为复杂的图像块难以准确再现。因此,我们重点关注这些较复杂的图像块,以便对结果进行训练和评估。同样的,我们也可以使用热图(heatmap)突出显示原始HR图像和神经网络输出SR图像之间的误差,颜色较暗的部分对应于较高的像素均方误差(较差的结果),颜色较浅的部分对应于较低的像素均方误差(或较好的结果)我们可以看到,具有多种模式的区域的误差会更大,但是看起来“更简单”的过渡区域则是相当黑暗的(例如云、天空),这是可以改进的,因为它与idealo的目录用例相关。浅谈深度学习任务中的非真实数据与常见的分类问题或输出为一个分值的监督式深度学习任务不同,我们用于评估神经网络输出的真实数据是原始HR图像。这既有好处,也有坏处。坏处:像Keras这样的当前较为流行的深度学习框架没有预先制定训练解决方案,比如生成器。实际上,它们通常依赖于从一维数组中获取训练和验证标签或文件,或者是直接从文件结构中派生出来的,这会涉及到一些额外的编码算法。好处:没有必要花太多时间来获得标签,给出一个HR图像池,我们可以对其进行简单的缩小,获得我们所需要的LR训练数据,并使用原始HR图像来评估损失函数通常来说,使用图像数据对神经网络进行训练时,需要从训练数据集中随机的选择多个图像来创建训练批次。然后将这些尺寸重新缩小到一个较小的尺寸,一般来说,大小约为100×100像素。我们随时使用随机变换对图像进行增强,并反馈到神经网络中。在这种情况下,没有必要向神经网络反馈整张图像,并且这也非常不可取。这是因为,我们不能将图像重新缩放到100×100的小像素点。毕竟,我们想要对图像进行放大。同时,我们也无法用较大尺寸的图像进行训练,比如大小为500×600像素的图像,因为处理这种大图像需要很长的时间。相反,我们可以从整个图像中提取一个非常小的随机色块,比如大小为16×16像素块,这样一来,我们就有了更多的数据点,因为每个图像都可以提供数百个不同的色块。我们之所以能够处理这种小色块,是因为我们不需要将一堆图像进行分类,比如:腿+尾巴+胡须+死老鼠=猫。因此,模型的末端就没有全连接层。我们只需要使用神经网络来构建这些模式的抽象表示,然后学习如何对其进行放大,除此以外,还要对块进行重新组合,使组合后的图像变得有意义。这种抽象表示由卷积层和放大层来完成,其中,卷积层是该网络中唯一的一种层类型。我们还要说明的是,全卷积结构使该网络的输入大小相互独立。也就是说,这意味着它与普通的分类卷积神经网络有所不同,你可以向完全卷积神经网络中输入任何大小的图像:无论输入图像原始大小是什么,网络都会输入一个输入图像大小2倍的图像。有关图像超分辨率的RDN网络更加详细的介绍,请查看文末链接。另一方面,我们还需要思考如何从图像中提取这些块。思路如下:从数据集中提取出n个随机图像,然后从每个图像中提取p个随机快。我们尝试了几种方法,如下图所示:首先,从一个均匀的网格中提出块,并创建一个完整的块数据集。在训练的时候,我们随机的提取其batch_size,并对其进行放大,反馈给网络。这种方法的缺点是需要静态的存储非常大的数据集,如果要用云服务器进行训练,这种方法其实并不理想:移动和提取数据集是一项相当耗时的操作,并且具有确定性定义的数据集可能并不是最佳数据集。另一种方法是随机选择batch_size大小的图像,并从中提取单个块。这种方法需要从磁盘中读取数据,这就大大降低了训练时间(我们设置的每个训练时间为15min-1h)。最后,我们将原始数据集中随机提取的单个图像块进行融合,并从中提取动态的batch_size块,这不仅能存储原始数据集,同时,也能保持较快的训练速度。拓展这是放大idealo网站产品目录的第一步,我们已经完成了。下面是我们将产品图像中低质量、低分辨率的图像进行放大,并输出。从上图中,我们可以看到,图像中较为平坦的地方会产生较为明显的噪声,文本也会略有失真。这就是我们计划要改进的地方。在下一步的探索中,我们将在自己的产品图像数据集上对神经网络进行训练。相关链接Github: Image Super ResolutionPaper: Residual Dense Network for Image Super-Resolution (Zhang et al. 2018)Dataset: DIVerse 2K resolution high quality images本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 10, 2018 · 1 min · jiezi

【Keras】减少过拟合的秘诀——Dropout正则化

摘要: Dropout正则化是最简单的神经网络正则化方法。阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里。 Dropout正则化是最简单的神经网络正则化方法。其原理非常简单粗暴:任意丢弃神经网络层中的输入,该层可以是数据样本中的输入变量或来自先前层的激活。它能够模拟具有大量不同网络结构的神经网络,并且反过来使网络中的节点更具有鲁棒性。阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里,具体内容如下:如何使用Keras API创建Dropout层;如何使用Keras API将Dropout正则化添加到MLP、CNN和RNN层;在现有模型中,如何使用Dropout正则化减少过拟合。Keras中的Dopout正则化在Keras深度学习框架中,我们可以使用Dopout正则化,其最简单的Dopout形式是Dropout核心层。在创建Dopout正则化时,可以将 dropout rate的设为某一固定值,当dropout rate=0.8时,实际上,保留概率为0.2。下面的例子中,dropout rate=0.5。layer = Dropout(0.5)Dropout层将Dropout层添加到模型的现有层和之前的输出层之间,神经网络将这些输出反馈到后续层中。用dense()方法指定两个全连接网络层:…model.append(Dense(32))model.append(Dense(32))…在这两层中间插入一个dropout层,这样一来,第一层的输出将对第二层实现Dropout正则化,后续层与此类似。现在,我们对第二层实现了Dropout正则化。…model.append(Dense(32))model.append(Dropout(0.5))model.append(Dense(32))…Dropout也可用于可见层,如神经网络的输入。在这种情况下,就要把Dropout层作为网络的第一层,并将input_shape参数添加到层中,来制定预期输入。…model.add(Dropout(0.5, input_shape=(2,)))…下面,我们来看看Dropout正则化如何与常见的网络类型一起使用。MLP Dropout正则化在两个全连接层之间添加Dropout正则化,代码如下所示:# example of dropout between fully connected layersfrom keras.layers import Densefrom keras.layers import Dropout…model.add(Dense(32))model.add(Dropout(0.5))model.add(Dense(1))…CNN Dropout正则化我们可以在卷积层和池化层后使用Dropout正则化。一般来说,Dropout仅在池化层后使用。# example of dropout for a CNNfrom keras.layers import Densefrom keras.layers import Conv2Dfrom keras.layers import MaxPooling2Dfrom keras.layers import Dropout…model.add(Conv2D(32, (3,3)))model.add(Conv2D(32, (3,3)))model.add(MaxPooling2D())model.add(Dropout(0.5))model.add(Dense(1))…在这种情况下,我们要将Dropout应用于特征图的每个单元中。在卷积神经网络中使用Dropout正则化的另一个方法是,将卷积层中的整个特征图都丢弃,然后在池化期间也不再使用。这种方法称为空间丢弃,即Spatial Dropout。“我们创建了一个新的Dropout正则化方法,我们将其称为Spatial Dropout。在这个方法中,我们将Dropout值扩展到整个特征映射中。”——《使用卷积神经网络有效的进行对象本地化,2015》在Keras中,通过SpatialDropout2D层提供Spatial Dropout正则化。# example of spatial dropout for a CNNfrom keras.layers import Densefrom keras.layers import Conv2Dfrom keras.layers import MaxPooling2Dfrom keras.layers import SpatialDropout2D…model.add(Conv2D(32, (3,3)))model.add(Conv2D(32, (3,3)))model.add(SpatialDropout2D(0.5))model.add(MaxPooling2D())model.add(Dense(1))…RNN Dropout正则化我们在LSTM循环层和全连接层之间使用Dropout正则化,代码如下所示:# example of dropout between LSTM and fully connected layersfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers import Dropout…model.add(LSTM(32))model.add(Dropout(0.5))model.add(Dense(1))…在这里,将Dropout应用于LSTM层的32个输出中,这样,LSTM层就作为全连接层的输入。还有一种方法可以将Dropout与LSTM之类的循环层一起使用。LSTM可以将相同的Dropout掩码用于所有的输入中。这个方法也可用于跨样本时间步长的循环输入连接。这种使用递归模型进行Dropout正则化则称为变分循环神经网络(Variational RNN)。“变分循环神经网络在每个时间步长使用相同的Dropout掩码,包括循环层。这与在RNN中实现Dropout正则化一样,在每个时间步长丢弃相同的神经网络单元,并且随意的丢弃输入、输出和循环连接。这和现有的技术形成对比,在现有的技术中,不同的神经网络单元将在不同的时间步长被丢弃,并且不会对全连接层进行丢弃。”——《循环神经网络中Dropout的基础应用,2016》Keras通过循环层上的两个参数来支持变分神经网络(输入和循环输入样本时间步长的一致性丢弃),这称为 输入“Dropout”和循环输入的“recurrent_dropout”。# example of dropout between LSTM and fully connected layersfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers import Dropout…model.add(LSTM(32))model.add(Dropout(0.5))model.add(Dense(1))…Dropout正则化案例在本节中,我们将演示如何使用Dropout正则化来减少MLP在简单二元分类问题上的过拟合。在这里,我们提供了一个在神经网络上应用Dropout正则化的模板,你也可以将其用于分类和回归问题。二元分类问题在这里,我们使用一个标准的二元分类问题,即定义两个二维同心圆,每个类为一个圆。每个观测值都有两个输入变量,它们具有相同的比例,类输出值为0或1。这个数据集就是 “圆”数据集。我们可以使用make_circles()方法生成观测结果。我们为数据添加噪声和随机数生成器,以防每次运行代码时使用相同的样本。# generate 2d classification datasetX, y = make_circles(n_samples=100, noise=0.1, random_state=1)我们可以用x和y坐标绘制一个数据集,并将观察到的颜色定义为类值。生成和绘制数据集的代码如下:# generate two circles datasetfrom sklearn.datasets import make_circlesfrom matplotlib import pyplotfrom pandas import DataFrame# generate 2d classification datasetX, y = make_circles(n_samples=100, noise=0.1, random_state=1)# scatter plot, dots colored by class valuedf = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))colors = {0:‘red’, 1:‘blue’}fig, ax = pyplot.subplots()grouped = df.groupby(’label’)for key, group in grouped: group.plot(ax=ax, kind=‘scatter’, x=‘x’, y=‘y’, label=key, color=colors[key])pyplot.show()运行以上代码,会创建一个散点图,散点图展示每个类中观察到的同心圆形状。我们可以看到,因为噪声,圆圈并不明显。这是一个特别好的测试问题,因为类不可能用一条直线表示,比如它不是线性可微分的,在这种情况下,就需要使用非线性方法来解决,比如神经网络。在这里,我们只生成了100个样本,这对于神经网络来说,样本是相当少了。但是它提供了训练数据集的过拟合现象,并且在测试数据及上的误差更大:这是使用正则化的一个特别好的例子。除此之外,这个样本集中有噪声,这就使神经网络模型有机会学习不一致样本的各个方面。多层感知器的过拟合我们可以创建一个MLP模型来解决这个二元分类问题。该模型将具有一个隐藏层,它的节点比解决该问题所需节点要多得多,从而产生过拟合。另外,我们训练模型的时间也大大超过正常训练模型所需要的时间。在定义模型之前,我们将数据集拆分为训练集和测试集:30个训练数据来训练模型和70个测试数据来评估拟合模型性能。# generate 2d classification datasetX, y = make_circles(n_samples=100, noise=0.1, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]接下来,我们可以定义模型。在隐藏层中使用500个节点和矫正过得线性激活函数;在输出层中使用S型激活函数预测类的值(0或1)。该模型使用二元交叉熵损失函数进行优化,这个函数适用于二元分类问题和梯度下降到有效Adam问题。# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])将训练数据训练4000次,默认每次训练次数为32。 然后用测试数据集验证该模型性能,代码如下。# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)测试的方法如下。# evaluate the model_, train_acc = model.evaluate(trainX, trainy, verbose=0), test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))最后,在每次训练的时候绘制模型的性能。如果模型在训练数据集时的确是过拟合,那么我们训练集上的准确度线图更加准确,并且准确度随着模型学习训练数据集中的统计噪声而再次下降。# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()将以上所有代码组合起来,如下所示。# mlp overfit on the two circles datasetfrom sklearn.datasets import make_circlesfrom keras.layers import Densefrom keras.models import Sequentialfrom matplotlib import pyplot# generate 2d classification datasetX, y = make_circles(n_samples=100, noise=0.1, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)# evaluate the model, train_acc = model.evaluate(trainX, trainy, verbose=0), test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()运行以上代码,我们可以看到模型在训练和测试数据集上的性能:模型在训练数据集上的性能优于测试数据集,这是过度拟合的一个可能标志。鉴于神经网络和训练算法的随机性,模型的测试结果可能会有所不同。由于该模型严重过拟合,该模型在同一数据集上运行的结果差异并不会很大。Train: 1.000, Test: 0.757下图为模型在训练和测试集上的精度图,我们可以看到过拟合模型的预期性能,其中测试精度增加到一定值以后,再次开始减小。使用Dropout正则化减少MLP过拟合我们使用Dropout正则化更新这个示例,即在隐藏层和输出层之间插入一个新的Dropout层来实现。在这里,指定Dropout rate=0.4。# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dropout(0.4))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])下面列出了隐藏层后添加了dropout层的完整更新示例。# mlp with dropout on the two circles datasetfrom sklearn.datasets import make_circlesfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom matplotlib import pyplot# generate 2d classification datasetX, y = make_circles(n_samples=100, noise=0.1, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dropout(0.4))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)# evaluate the model, train_acc = model.evaluate(trainX, trainy, verbose=0)_, test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()运行以上代码,查看模型在训练和测试集上的性能。你所得到的结果可能会有所不同,在这种情况下,该模型具有较高的方差。在这里,我们可以看到,Dropout导致训练集的准确度有所下降,从100%降至96%,而测试集的准确度从75%提高到81%。Train: 0.967, Test: 0.814从这里我们可以看出,该模型已经不再适合训练数据集了。尽管使用Dropout正则化时会产生很多噪音,训练数据集和测试数据集的模型精度持续增加。在后续学习中,你可以进一步探索以下这些问题:1.输入Dropout。在输入变量上使用Dropout正则化,更新示例,并比较结果。2.权重约束。在隐藏层添加max-norm权重约束,更新示例,并比较结果。3.反复评估。更新示例,重复评估过拟合和Dropout模型,总结并比较平均结果。4.网格搜索率。创建Dropout概率的网格搜索,并报告Dropout rate和测试数据集准确度二者之间的关系。拓展阅读论文1.《使用卷积神经网络进行高效的对象本地化,2015》2.《递归神经网络中的理论Dropout应用,2016》博文1.基于Keras深度学习模型中的Dropout正则化2.如何使用LSTM网络的Dropout进行时间序列预测API1.Keras Regularizers API2.Keras Core Layers API3.Keras Convolutional Layers API4.Keras Recurrent Layers API5.sklearn.datasets.make_circles API总结阅读完本文,你已经了解了如何将深度学习正则化添加到深度学习神经网络模型的API中。具体来说,有以下几个内容:1.如何使用Keras API创建Dropout层。2.如何使用Keras API将Dropout正则化添加到MLP、CNN和RNN层。3.如何向现有模型中添加Dropout正则化,以此减少过拟合。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 10, 2018 · 3 min · jiezi

注意力机制实现机器翻译

介绍Attention模型形象的比喻就是“图像对焦”。上图是Encoder-Decoder模型,Decoder中每个单词生成过程如下:其中C是“语义编码C”,f是Decoder的非线性变换函数。由此,我们可以看出生成目标句子的每个单词都使用同一个语义编码C,即:源句子中的每个单词的影响力都是一样的,这如同图像没有对焦的情况,现实项目中也存在明显的不合理。比如一个机器翻译模型,输入是“Tom chase Jerry”,模型输出:“汤姆”,“追逐”,“杰瑞”。在翻译“杰瑞”的时候显然“Jerry”的贡献值最大,如果每个单词的贡献值相同明显不合理。这个问题在输入句子长度较短时问题不大,但是当输入句子较长时会丢失很多细节信息(个人觉得此处类似平均池化和最大值池化)。正因为如此,我们引入了Attention思想。Soft Attention模型使用Attention模型翻译“杰瑞”的时候,我们可以得到输入句子中的每个单词对输出当前单词的贡献值大小如:(Tom,0.3)(Chase,0.2) (Jerry,0.5)。这意味着生成每个单词yi时不再使用同一个语义编码C,而是根据yi使用不同的Ci。在引入Attention模型后yi的计算过程改变如下所示:每个Ci对应源句子中每个单词的注意力分配概率,示例如下:f2是Encoder对每个单词的变换函数,g函数代表整个源句子的中间语义表示的变换函数,一般形式是加权求和:aji代表注意力分配系数,hj代表源句子中某个单词的语义编码,Lx代表源句子中单词数量。g函数的计算过程如下图所示:Attention模型概率计算如果所示,当我们要生成yi单词,此时我们用i-1时刻的隐藏节点输出值Hi-1去和源句子中的每个单词对应RNN隐藏节点状态hj依次进行对比,即:通过函数F(hj,Hi-1)来获得yi对源句子中每个单词对应的对齐可能性,函数F常见方法如下图所示:然后使用Softmax函数进行数值归一化处理。如对“对齐概率”不理解的朋友,可以查看下图英语-德语翻译系统中加入Attention机制后,Encoder和Decoder两个句子中每个单词对应注意力分配概率分布。Self Attention模型在Soft Attention模型中,Attention机制发生在Decoder中Yi和Encoder中的所有元素之间。Self Attention模型不是在两者之间,而是Decoder内部元素之间或者Encoder内部元素之间发生的Attention机制,计算方法和Soft Attention模型一致。那么Self Attention模型有什么好处?我们依然以机器翻译为例:如图所示,Self Attention模型在内部可以捕获一些句法特征或语义特征。Self Attention模型相比传统RNN模型需要依次序序列计算,它的感受野更大,可以直接将句子中的任意两个单词的联系通过一个计算步骤联系起来,可以捕获远距离的相互依赖特征(就像列表和数组的区别)。此外,Self Attention模型对于增加计算的并行性也有帮助。案例我们使用的语言数据集是“英语-西班牙语”,数据集样本如下图所示:数据导入# 数据下载path_to_zip=tf.keras.utils.get_file( fname=‘spa-eng.zip’, origin=‘http://download.tensorflow.org/data/spa-eng.zip', # 解压tar zip文件 extract=True)path_to_file=os.path.dirname(path_to_zip)+’/spa-eng/spa.txt’转码:def unicode_to_ascii(sen): return ‘’.join( char for char in unicodedata.normalize(‘NFD’,sen) if unicodedata.category(char) != ‘Mn’ )数据预处理每条训练语句添加开始和结束标记移除句子中的特殊字符字符转ID,ID转字符并排序将句子补长到预设的最大长度def preprocess_sentence(w): w = unicode_to_ascii(w.lower().strip()) # 在单词和标点之间创建空格 # 如: “he is a boy.” => “he is a boy .” w = re.sub(r"([?.!,¿])", r" \1 “, w) w = re.sub(r’[” “]+’, " “, w) # 特殊字符以空格代替 w = re.sub(r”[^a-zA-Z?.!,¿]+”, " “, w) w = w.rstrip().strip() # 添加开始和结束标记 w = ‘<start> ’ + w + ’ <end>’ return w创建数据集:def create_dataset(path, num_examples): lines = open(path, encoding=‘UTF-8’).read().strip().split(’\n’) word_pairs = [[preprocess_sentence(w) for w in l.split(’\t’)] for l in lines[:num_examples]] # 返回格式:[ENGLISH, SPANISH] return word_pairs字符转ID,ID转字符,并排序:class LanguageIndex(): def init(self,lang): self.lang=lang self.wrod2idx={} self.id2word={} self.vacab=set() self.create_index() def create_index(self): for phrase in self.lang: # 添加到集合中,重复内容不添加 self.vacab.update(phrase.split(’ ‘)) self.vacab=sorted(self.vacab) self.wrod2idx[’<pad>’]=0 #字符-ID转换 for index,word in enumerate(self.vacab): self.wrod2idx[word]=index+1 for word,index in self.wrod2idx.items(): self.id2word[index]=word加载数据集:# 计算最大长度def max_length(tensor): return max(len(t) for t in tensor)def load_dataset(path,num_example): #get inputs outputs pairs=create_dataset(path,num_example) # 获取ID表示 inp_lang=LanguageIndex(sp for en,sp in pairs) targ_lang=LanguageIndex(en for en,sp in pairs) # LanguageIndex 不包含重复值,以下包含重复值 input_tensor=[[inp_lang.wrod2idx[s]for s in sp.split(’ ‘)]for en,sp in pairs] target_tensor=[[targ_lang.wrod2idx[s]for s in en.split(’ ‘)]for en,sp in pairs] max_length_inp,max_length_tar=max_length(input_tensor),max_length(target_tensor) # 将句子补长到预设的最大长度 # padding: post:后补长,pre:前补长 input_tensor=tf.keras.preprocessing.sequence.pad_sequences( sequences=input_tensor, maxlen=max_length_inp, padding=‘post’ ) target_tensor=tf.keras.preprocessing.sequence.pad_sequences( sequences=target_tensor, maxlen=max_length_tar, padding=‘post’ ) return input_tensor,target_tensor,inp_lang,targ_lang,max_length_inp,max_length_tar创建训练集验证集:# 本次项目只使用前30000条数据num_examples = 30000input_tensor, target_tensor, inp_lang, targ_lang, max_length_inp, max_length_targ = load_dataset(path_to_file, num_examples)# 训练集80%,验证集20%input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)模型训练配置# 打乱数据集BUFFER_SIZE=len(input_tensor_train)BATCH_SIZE=64# 每个epoch迭代次数N_BATCH=BUFFER_SIZE // BATCH_SIZE# 词嵌入维度embedding_dim=256# 隐藏神经元数量units=1024vocab_inp_size=len(inp_lang.wrod2idx)vocab_tar_size=len(targ_lang.wrod2idx)dataset=tf.data.Dataset.from_tensor_slices((input_tensor_train,target_tensor_train)).shuffle(BUFFER_SIZE)# drop_remainder 当剩余数据量小于batch_size时候,是否丢弃dataset=dataset.batch(BATCH_SIZE,drop_remainder=‘True’)案例Attention模型计算文章开始我们介绍了Attention模型的计算过程,相信你会很容易理解上图的内容。对每个节点具体方程实现如下:FC=全连接层,EO=编码器输出,H=隐藏层状态,X=解码器输入,模型计算过程如下表示:score = FC(tanh(FC(EO) + FC(H)))attention weights = softmax(score, axis = 1)context vector = sum(attention weights * EO, axis = 1)embedding output=解码器输入X,输入词嵌入层merged vector=concat(embedding output, context vector)将merged vector输入到GRU创建模型GRU配置:def gru(units): # 使用GPU加速运算 if tf.test.is_gpu_available(): return tf.keras.layers.CuDNNGRU(units, return_sequences=True, return_state=True, # 循环核的初始化方法 # glorot_uniform是sqrt(2 / (fan_in + fan_out))的正态分布产生 # 其中fan_in和fan_out是权重张量的扇入扇出(即输入和输出单元数目) recurrent_initializer=‘glorot_uniform’) else: return tf.keras.layers.GRU(units, return_sequences=True, return_state=True, # hard_sigmoid <= -1 输出0,>=1 输出1 ,中间为线性 recurrent_activation=‘sigmoid’, recurrent_initializer=‘glorot_uniform’)编码器:class Encoder(tf.keras.Model): def init(self, vocab_size, embedding_dim, enc_units, batch_sz): super(Encoder, self).init() self.batch_sz = batch_sz self.enc_units = enc_units self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim) self.gru = gru(self.enc_units) def call(self, x, hidden): x = self.embedding(x) output, state = self.gru(x, initial_state = hidden) return output, state def initialize_hidden_state(self): return tf.zeros((self.batch_sz, self.enc_units))解码器:class Decoder(tf.keras.Model): def init(self,vocab_size,embedding_dim,dec_units,batch_sz): super(Decoder, self).init() self.batch_sz=batch_sz self.dec_units=dec_units self.embedding=tf.keras.layers.Embedding( input_shape=vocab_size, output_dim=embedding_dim ) self.gru=gru(self.dec_units) self.fc=tf.keras.layers.Dense(units=vocab_size) # 用于计算score,即:注意力权重系数 self.W1=tf.keras.layers.Dense(self.dec_units) self.W2=tf.keras.layers.Dense(self.dec_units) self.V=tf.keras.layers.Dense(units=1) def call(self,x,hidden,ec_output): # tf.expand_dims:在指定索引出增加一维度,值为1,从索引0开始 # axis: 取值范围是[-阶数,阶数],二维的时候0指的是列,1指的是行, # 更高维度的时候,数值是由外向里增加,如:3维向量,外向内依次是:0,1,2 # 通过计算score公式可得,需要将hidden维度扩展至:[batch_size,1,hidden_size] hidden_with_time_axis=tf.expand_dims(hidden,axis=1) # score=[batch_size, max_length, 1] score=self.V(tf.nn.tanh(self.W1(ec_output)+self.W2(hidden_with_time_axis))) # 数值归一化和为1的概率分布值 attention_weight=tf.nn.softmax(score,axis=1) context_vetor=attention_weightec_output # 求和平均 context_vetor=tf.reduce_sum(context_vetor,axis=1) X=self.embedding(x) # 合并解码器embedding输出和context vector x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1) # output shape=(batch_size,time_step,hidden_size) # state shape=(batch_size,hidden_size) output,state=self.gru(x) # output[batch_size1,hidden_size] output=tf.reshape(output,shape=(-1,output.shape[2])) x-self.fc(output) return x,state,attention_weight def initilize_hidden_size(self): return tf.zeros((self.batch_sz,self.dec_units))实例化模型:encoder = Encoder(vocab_inp_size, embedding_dim, units, BATCH_SIZE)decoder = Decoder(vocab_tar_size, embedding_dim, units, BATCH_SIZE)损失函数,优化器:optimizer = tf.train.AdamOptimizer()def loss_function(real, pred): mask = 1 - np.equal(real, 0) loss_ = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=real, logits=pred) * mask return tf.reduce_mean(loss_)模型保存:checkpoint_dir = ‘./training_checkpoints’checkpoint_prefix = os.path.join(checkpoint_dir, “ckpt”)checkpoint = tf.train.Checkpoint(optimizer=optimizer, encoder=encoder, decoder=decoder)训练由于我们使用Teacher Forcing进行训练,所以我们简单介绍下。如图所示Teacher Forcing与Free-running不同,在训练过程中不再是前一时刻的hidden-state作为当前输入,而是在Ground Truth中找到对应的上一项作为当前输入。早期的RNN很弱,如果生成了非常差的结果Free-running的运行方式会导致后面的hidden-state都受到影响。Teacher Forcing运行方式就可以避免这种问题,缺点也很明显它严重依赖标签数据。# 迭代10次训练集EPOCHS = 10for epoch in range(EPOCHS): start = time.time() hidden = encoder.initialize_hidden_state() total_loss = 0 for (batch, (inp, targ)) in enumerate(dataset): loss = 0 # 先记录梯度 with tf.GradientTape() as tape: # 编码器输出 enc_output, enc_hidden = encoder(inp, hidden) dec_hidden = enc_hidden dec_input = tf.expand_dims([targ_lang.word2idx[’<start>’]] * BATCH_SIZE, 1) # 使用Teacher forcing运行方式 for t in range(1, targ.shape[1]): # 解码器输出 predictions, dec_hidden, _ = decoder(dec_input, dec_hidden, enc_output) loss += loss_function(targ[:, t], predictions) # 样本标签作为输入 dec_input = tf.expand_dims(targ[:, t], 1) batch_loss = (loss / int(targ.shape[1])) # one_loss++;batch_loss++ total_loss += batch_loss variables = encoder.variables + decoder.variables gradients = tape.gradient(loss, variables) optimizer.apply_gradients(zip(gradients, variables)) if batch % 100 == 0: print(‘Epoch {} Batch {} Loss {:.4f}’.format(epoch + 1, batch, batch_loss.numpy())) # 每迭代2次训练集保存一次模型 if (epoch + 1) % 2 == 0: checkpoint.save(file_prefix = checkpoint_prefix)翻译评估函数我们不使用teacher-forcing模式,解码器的每步输入是它前一时刻的hidden-state和编码器输出,当模型遇到 <end>标记停止运行。# 和训练模型函数代码基本一致def evaluate(sentence, encoder, decoder, inp_lang, targ_lang, max_length_inp, max_length_targ): attention_plot = np.zeros((max_length_targ, max_length_inp)) # 数据预处理 sentence = preprocess_sentence(sentence) # 向量化表示输入数据 inputs = [inp_lang.word2idx[i] for i in sentence.split(’ ‘)] # 后置补长 inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs], maxlen=max_length_inp, padding=‘post’) inputs = tf.convert_to_tensor(inputs) result = ’’ hidden = [tf.zeros((1, units))] enc_out, enc_hidden = encoder(inputs, hidden) dec_hidden = enc_hidden # 维度扩展batch_size dec_input = tf.expand_dims([targ_lang.word2idx[’<start>’]], 0) for t in range(max_length_targ): predictions, dec_hidden, attention_weights = decoder(dec_input, dec_hidden, enc_out) # 保存权重用于稍后可视化展示 attention_weights = tf.reshape(attention_weights, (-1, )) attention_plot[t] = attention_weights.numpy() predicted_id = tf.argmax(predictions[0]).numpy() # 获取文本翻译结果 result += targ_lang.idx2word[predicted_id] + ’ ’ # 预设的结束标记 if targ_lang.idx2word[predicted_id] == ‘<end>’: return result, sentence, attention_plot # 预测值作为输入,以此输出下一时刻单词 dec_input = tf.expand_dims([predicted_id], 0) return result, sentence, attention_plot可视化权重值: fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(1, 1, 1) ax.matshow(attention, cmap=‘viridis’) fontdict = {‘fontsize’: 14} ax.set_xticklabels([’’] + sentence, fontdict=fontdict, rotation=90) ax.set_yticklabels([’’] + predicted_sentence, fontdict=fontdict) plt.show()总结本篇文章篇幅较多,不过项目的重点是Attention思想的理解,Self Attention模型具有更长的感受野,更容易捕获长距离的相互依赖特征,目前Google机器翻译模型就大量使用到Self Attention。Attention模型目前在机器翻译,图片描述任务,语音识别都有大量应用,熟练使用Attention对于解决实际问题会有很大的帮助。文章部分内容参考 Yash Katariya 和 张俊林,在此表示感谢。 ...

December 8, 2018 · 4 min · jiezi

转型为一名数据科学家的正确打开方式

摘要: 如果你是一名初级入门者,或者是一名软件工程师,亦或者是一名数学物理系毕业生,想要转型为一名数据科学家,按照我的建议一步一个脚印的去做,你会事半功倍。维基百科是你在数据科学领域解惑最佳的方式之一,但它所提供的信息要么就是特别简单,要么就是特别复杂。同样的,在数据科学职业建议这方面也一样:有些帖子针对的是初学者,有些则针对的是软件工程师,亦或者是针对入门后希望有所提升的入门级群体。因此,对于那些想要进入该领域的数据科学家来说,真的不知道去哪里寻找建议。没有完美的建议可以适合所有人,在这里我就初级入门者、软件工程师以及数学物理系毕业生分别提出一些正确进入数据科学领域的建议,按照我所说的去做,你会事半功倍。一、假如你是一名初级入门者……如果你是一个初级入门人员,那么请你一定要牢记:这个领域的发展速度令人咋舌,我在给你的任何建议基本上都是过时的。2017年的数据科学工作者在今天就不一定能在这个领域工作下去,同样的,今天的数据科学招聘标准在两年以后同样派不上多少用场。但假如你现在还没有编码或STEM背景,下面这些建议或许对你有所裨益:1、一定要有一个相对开阔的思路。如果你什么都不会,那么你可能并不了解什么是数据科学,所以数据科学这一领域并不一定是你特别想要接触的领域。你可以在LinkedIn上关注一些数据科学家,或者关注一些相关的博客。了解这个领域的人究竟都在做什么。成为一个真正的数据科学家需要你付出大量的时间和精力,因此,纯粹因为无人驾驶看起来很酷并不是你想成为数据科学家的理由。你要了解的是,数据科学并不是表面上那么光鲜,枯燥繁琐的数据整理、构建数据通道等占据了数据科学家们大部分时间和精力。2、了解到这些以后,如果你依然决定进入数据科学领域,那么你即将进入数据科学领域的学习!首先,学习Python和慕课网上的课程,然后尽快创建一个基础性的项目。在你熟悉Python的基本技能后,还得学习如何使用Jupyter笔记本。3、作为一个初学者,将目标一步定位到数据科学家并不明智。相反,适当的降低目标会更加有助于你成功,比如数据可视化或数据分析。这些专业的技术人员需求量很大,并且很容易找到工作,在这些领域工作后,你就会有机会经常和数据科学家一起工作。在积累了一定的经验后,你就可以在数据科学的各个领域横向发展了!二、假如你是一名软件工程师……以我的应验来看,20%的数据科学家可能都是软件工程师。一方面来说,作为一名软件工程师,将代码部署到生产环境中,他们有着相当丰富的经验,除此以外,他们还有强大的团队合作能力,这很重要。另一方面,全栈工程师的需求量很大,因此很多公司都会向倾向于招聘软件工程师,即便是他们在招聘时写的是“招聘数据科学家”,这也是虚的。因此,你要避免成为一名软件工程师!另外,我还有一些建议:1.如果你是一名软件工程师,你可以先熟悉数据管道,这能够帮助你学习核心的数据操作技巧。2.机器学习工程可能是最接近数据科学家的一个角色,如果你能成为一名机器学习工程师,那么再进阶为一名数据科学家对你来说就很容易了。机器学习重点在于部署模型或者是将现有的模型部署到应用程序中,可以有效的利用你所学到的技能。3.你可以创建机器学习或者数据科学项目来打动招聘主管,利用你所学的软件工程技能,向招聘人员展示你的应用程序,证明你是一个全栈数据科学家的潜力股。4.你要知道,在转型期间,你的薪水肯定会有所降低。即便是高级软件工程师,在转型到数据科学领域的时候,也是一个初级角色,也会面临薪水降级。很多人没有意识到这点,以至于面对薪资降低会感到特别失望。三、假如你是一名数学或物理系毕业生……如果你是数学或物理系的本科、硕士或博士毕业生,那么你一定已经在统计学和数学方面打下了坚实的基础。但是遗憾的是,你并没有工作经验,而且也不知道如何准备面试。即便是你在读书期间一直在学习编程,也不可能写出一个简洁、结构完整的代码。下面是我的一些建议供你参考:1.你在学校所学到的R语言、MATLAB或Mathematica远远不够,建议你学习下Python语言。除此之外,你还要学习协作版本控制(即如何与其他人一起使用GitHub)、容器化(即如何使用Docker)、Devops(即如何部署模型)和SQL。2.学习Python中的测试开发,并了解如何使用docstrings。除此之外,了解下如何将代码模块化。如果你还没准备好学习这些,那么你可以先学习如何使用Jupyter笔记本。3.如果你是一个数学系毕业生,那么深度学习可能是比较适合你的方向。如果想进入深度学习领域,可以从传统的““Scikit-Learn”开始,然后就可以很轻松的进入深度学习领域。最重要的是,你要进入这个行业,然后尽可能快的开始写代码。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 5, 2018 · 1 min · jiezi

卷积神经网络导览

摘要: 关于卷积神经网络最重要的概念都在这里!介绍这篇文章旨在以全面和简洁的方式介绍卷积神经网络(CNN),目标是建立对这些算法的内部工作的直观理解。因此,这项工作对于刚从这个主题开始的非数学、非计算机科学背景的读者来说意味着特别有价值。我写这篇文章的灵感来自于我正在参加的Fast.ai课程’Code Deeprs For Coders v3’,导师Jeremy Howard鼓励我们在博客上讲述我们学到的东西。我在这里分享的知识来自于阅读各种材料和参加不同的课程的成果,目的是在以医学影像的学生研究项目。这些帖子的主要部分取自我最近完成的这篇论文。在旅程开始之前,必须采取一些预防措施来对卷积神经网络进行透视。机器学习(ML)是计算机科学的子领域,通过具有学习能力的算法解决问题。“学习”通过内部组件的自动优化一个称为参数的权重。适用于ML的问题是两种形式的预测:回归-连续值的预测以及分类-通过类成员预测将对象细分为不同的组。深度学习(DL)又是ML的子域,通过将具有特定架构的算法(称为神经网络)应用于机器学习问题来区分。这种架构的灵感来自于自然界中的神经网络,并且包括-稍微简化-表示连接不同神经元的计算单元和边缘以及确保信息流动的神经元。其中存在多种不同类型的神经网络:人工神经网络(ANN),专门用于处理表格数据;用于时间序列数据的递归神经网络(RNN),如语音和卷积神经网络(CNN),特别适用于图像数据。有了这些基础知识,我们就可以开始研究后一种类型了。“解剖”CNN图1是网络的循环示例图,它的灵感来自LeNet(LeCun等,1998)第一个CNN架构。虽然CNN之间的特定架构不同,但它们的特征在于都有该示例网络所涵盖的规定元素。该算法旨在解决二元分类问题,例如猫与狗之间的区别。在这一点上,重要的是该图和紧接着的用于为演练创建框架。因此,不需要完全理解和熟悉所有术语。这些更深入的理解在即将到来的部分中逐渐形成,图1将作为便于读者大致的参考。从图1中可以看出,网络被细分为前向和后向传递。在前向传递期间,数据通过不同的层(图1:彩色箭头)。由二维阵列表示的输入图像(图1:左空矩形)被提供给给出名称的卷积层。该层识别输入数据上的轮廓和形状,并输出一组特征图(图1:垂直条纹矩形)。最大池层成为卷积层的成功之处,它成功的消除了无关紧要的部分,从而缩小了数据。此后,数据通过平均池化操作,将图像数据转换为矢量,进入完全连接的层(图1:水平条纹矩形)。这些图层在此向量中标识特定于类的模式,并在此基础上预测输入数据的类成员资格。到目前为止,还没有学习过,因为这是在向后传递中完成的。首先,通过损失函数量化分类误差,基于损失函数的结果,通过反向传播和梯度下降来优化前述层中的参数。很明显更高的迭代次数,即输入更多训练样本图像,是实现正确分类结果所必需的。完整训练数据集通过模型的点称为epoch。卷积,线性整流函数和最大池化术语“卷积”描述了特定类型的矩阵计算,其中称为滤波器的特殊目的矩阵应用于输入图像,如图2所示。滤波器(3x3矩阵)通常是较小的矩阵,在卷积运算中,它被放置在图像的子部分上:(图2中的3x3青色图像子集)。每对相应值的元素乘法和随后对所有乘积的进行求和,产生单个输出值。换句话说,图像子集的左上角值与滤波器的左上角值相乘,顶部中间值与相应的顶部中间值相乘,最后所有乘积都相加。之后,滤波器以滑动窗口的方式在输入图像的每个拟合子集上执行上述计算的图像上移动。得到的输出值被收集在称为特征图的输出矩阵中,其中特征图中的输出值的位置(图2:青色顶部中间值)对应于计算中涉及的输入图像子集的位置。过滤器在图像上的移动方式取决于步幅和填充。一个步骤描述了每个卷积运算将滤波器移动一个像素,从而产生更小的特征图(图2:步幅s=1)。通过向图像的外边界添加零像素来抵消特征图的尺寸减小,称为填充(图2:填充=0)。在卷积操作期间,大多数单独的滤波器应用于输入图像,从而产生每个滤波器的特征图(图2:滤波器和特征图后面的多个silhouttes)。换句话说,卷积层输出与其滤波器计数对应的一叠特征映射。可以将滤波器视为专用轮廓检测器,并且得到的特征图报告检测位置。如果过滤器放置在包含边缘的图像子部件上,它会将其转换为特征图中的高值。换句话说,高特征映射值表示特定位置处的输入图像中的轮廓检测。该过程如图3所示:如果过滤器到达由黄色和绿色框标记的子部分,则识别基础轮廓。因此,特征图也可以被视为图像并相应地可视化。图4显示出了对输入图像应用滤波器(图4:底行)以进行垂直或水平边缘检测的结果。过滤器值是权重、是学习的参数。它们在后向传递期间不断优化,同时更多的数据通过网络。通过这种方式,实现了调整过程:过滤器学习识别输入图像中可用的特定元素,并且可以将其可视化为图片本身。而早期图层中的过滤器(图5:左)将学习基本像素,如轮廓,后期图层中的过滤器(图5:右)将连接上游特征,并学习更复杂的构造,例如眼睛甚至脸部( Zeiler和Fergus,2014)。因此,可以小心地将滤波器与视觉皮层神经元的感受野进行比较。这个被称为线性整流单元(ReLU)的函数应用于输出特征图(图6)。在令人生畏的名称下隐藏了一个简单的阈值步骤:零以下的所有值都归零。阈值化的特征图被移交给最大池化层(图7)。这里,虽然类似于卷积,但实际上发生了更简单的矩阵计算。过滤器再次以滑动窗口方式放置在要素图子集上,并提取子集的最高值,将它们保留在精简输出要素图中。目的是丢弃多余的数据:没有表示任何轮廓检测的值被划掉,而空间信息大致保留,这导致较低的计算成本。灵感和参考Jeremy Howard和Fast.ai深入学习编码器;Andrew Ng和deeplearning.ai的神经网络和深度学习;LeCun,Y.,Bottou,L.,Bengio,Y.,Haffner,P.,1998。基于梯度的学习应用于文档识别;Zeiler,MD,Fergus,R.,2014。可视化和理解卷积网络;本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 5, 2018 · 1 min · jiezi

全图化引擎(AI·OS)中的编译技术

全图化引擎又称算子执行引擎,它的介绍可以参考从HA3到AI OS - 全图化引擎破茧之路。本文从算子化的视角介绍了编译技术在全图化引擎中的运用主要内容有:1.通过脚本语言扩展通用算子上的用户订制能力,目前这些通用算子包括得分算子,过滤算子等。这一方面侧重于编译前端,我们开发了一种嵌入引擎的脚本语言cava ,解决了用户扩展引擎功能的一些痛点,包括插件的开发测试效率,兼容性,引擎版本升级效率等。2.通过代码技术优化全图化引擎性能,由于全图化引擎是基于tensorflow开发,它天生具备tensorflow xla编译能力,利用内核的熔丝提升性能,这部分内容可以参考XLA概述 .xla主要面向tensorflow内置的内核,能发挥的场景是在线预测模型算分。但是对于用户自己开发的算子,XLA很难发挥作用。本文第二部分主要介绍对于自定义算子我们是如何做的代码生成优化的。通用算子上的脚本语言静脉由于算子开发和组图逻辑对普通用户来说成本较高,全图化引擎内置了一些通用算子,比如说射手算子,过滤器算子。这些通用算子能加载C ++插件,也支持用静脉脚本写的插件。关于静脉参考可以这篇文章了解一下。和C ++插件相比,静脉插件有如下特点:1.类java的语法。扩大了插件开发的受众,让熟悉java的同学能快速上手使用引擎。2.性能高.cava是强类型,编译型语言,它能和c ++无损交互。这保证了cava插件的执行性能,在单值场景使用cava写的插件和c ++的插件性能相当。3.使用池管理内存.cava的内存管理可定制,服务端应用每个请求一个池是最高效的内存使用策略。4.安全。对数组越界,对象访问,除零异常做了保护。5.支持jit,编译快。支持upc时编译代码,插件的上线就和上线普通配置一样,极大的提升迭代效率6.兼容性:由于cava的编译过程和引擎版本是强绑定的,只要引擎提供的cava类库接口不变,cava的插件的兼容性很容易得到保证。而c ++插件兼容性很难保证,任何引擎内部对象内存布局的变动就可能带来兼容性问题。射手算子中的静脉插件cava scorer目前有如下场景在使用1.主搜海选场景,算法逻辑可以快速上线验证2.赛马引擎2.0的算分逻辑,赛马引擎重构后引入cava算分替代原先的战马算分样例如下:package test;import ha3.;/ * 将多值字段值累加,并乘以query里面传递的ratio,作为最后的分数 * /class DefaultScorer { MInt32Ref mref; double ratio; boolean init(IApiProvider provider) { IRefManager refManger = provider.getRefManager(); mref = refManger.requireMInt32(“ids”); KVMapApi kv = provider.getKVMapApi(); ratio = kv.getDoubleValue(“ratio”);//获取kvpair内参数 return true; } double process(MatchDoc doc) { int score = 0; MInt32 mint = mref.get(doc); for (int i = 0; i < mint.size(); i++) { score = score + mint.get(i); } return score * ratio; }}其中cava scorer的算分逻辑(process函数)调用次数是doc级别的,它的执行性能和c ++相比唯一的差距是多了安全保护(数组越界,对象访问,除零异常)。可以说cava是目前能嵌入C ++系统执行的性能最好的脚本语言。过滤算子中静脉插件filter算子中主要是表达式逻辑,例如filter =(0.5 * a + b)> 10.以前表达式的能力较弱,只能使用算术,逻辑和关系运算符。使用cava插件可进一步扩展表达式的能力,它支持类的Java语法,可以定义变量,使用分支循环等。计算 filter = (0.5 * a + b) > 10,用cava可定义如下:class MyFunc { public boolean init(FunctionProvider provider) { return true; } public boolean process(MatchDoc doc, double a, double b) { return (0.5 * a + b) > 10; }}filter = MyFunc(a, b)另外由于静脉是编译执行的,和原生的解释执行的表达式相比有天然的性能优势。关于静脉前端的展望静脉是全图化引擎上面向用户需求的语言,有用户定制扩展逻辑的需求都可以考虑用通用算子+静脉插件配合的模式来支持,例如全图化SQL上的UDF,规则引擎的匹配需求等等。后续静脉会进一步完善语言前端功能,完善类库,尽可能兼容的Java。依托苏伊士和全图化引擎支持更多的业务需求。自定义算子的代码生成优化过去几年,在OLAP领域codegen一直是一个比较热门的话题。原因在于大多数数据库系统采用的是Volcano Model模式。其中的下一个()通常为虚函数调用,开销较大。全图化引擎中也有类似的代码生成场景,例如统计算子,过滤算子等。此外,和XLA类似,全图化引擎中也有一些场景可以通过算子融合优化性能。目前我们的代码生成工作主要集中在CPU上对局部算子做优化,未来期望能在SQL场景做全图编译,并且在异构计算的编译器领域有所发展。单算子的代码生成优化统计算子例如统计语句:group_key:键,agg_fun:总和(VAL)#COUNT(),按键分组统计键出现的次数和缬氨酸的和在统计算子的实现中,键的取值有一次虚函数调用, sum和count的计算是两次虚函数调用,sum count计算出来的值和需要通过matchdoc存取,而matchdoc的访问有额外的开销:一次是定位到matchdoc storage,一次是通过偏移定位到存取位置。那么统计代码生成是怎么去除虚函数调用和matchdoc访问的呢?在运行时,我们可以根据用户的查询获取字段的类型,需要统计的功能等信息,根据这些信息我们可以把通用的统计实现特化成专用的统计实现。例如统计sum和count只需定义包含sum count字段的AggItem结构体,而不需要matchdoc;统计函数sum和count变成了结构体成员的+ =操作。假设键和VAL字段的类型都是整型,那么上面的统计语句最终的代码生成成的静脉代码如下:class AggItem { long sum0; long count1; int groupKey;}class JitAggregator { public AttributeExpression groupKeyExpr; public IntAggItemMap itemMap; public AggItemAllocator allocator; public AttributeExpression sumExpr0; … static public JitAggregator create(Aggregator aggregator) { …. } public void batch(MatchDocs docs, uint size) { for (uint i = 0; i < size; ++i) { MatchDoc doc = docs.get(i); //由c++实现,可被inline int key = groupKeyExpr.getInt32(doc); AggItem item = (AggItem)itemMap.get(key); if (item == null) { item = (AggItem)allocator.alloc(); item.sum0 = 0; item.count1 = 0; item.groupKey = key; itemMap.add(key, (Any)item); } int sum0 = sumExpr0.getInt32(doc); item.sum0 += sum0; item.count1 += 1; } }}这里总计数的虚函数被替换成和+ +和计数+ =,matchdoc的存取变成结构体成员的读写item.sum0和item.count0。经过llvm jit编译优化之后生成的ir如下:define void @_ZN3ha313JitAggregator5batchEP7CavaCtxPN6unsafe9MatchDocsEj(%“class.ha3::JitAggregator”* %this, %class.CavaCtx* %"@cavaCtx@", %“class.unsafe::MatchDocs”* %docs, i32 %size){entry: %lt39 = icmp eq i32 %size, 0 br i1 %lt39, label %for.end, label %for.body.lr.phfor.body.lr.ph: ; preds = %entry %wide.trip.count = zext i32 %size to i64 br label %for.bodyfor.body: ; preds = %for.inc, %for.body.lr.ph %lsr.iv42 = phi i64 [ %lsr.iv.next, %for.inc ], [ %wide.trip.count, %for.body.lr.ph ] %lsr.iv = phi %“class.unsafe::MatchDocs”* [ %scevgep, %for.inc ], [ %docs, %for.body.lr.ph ] %lsr.iv41 = bitcast %“class.unsafe::MatchDocs”* %lsr.iv to i64* // … prepare call for groupKeyExpr.getInt32 %7 = tail call i32 %5(%“class.suez::turing::AttributeExpressionTyped.64”* %1, i64 %6) // … prepare call for itemMap.get %9 = tail call i8* @_ZN6unsafe13IntAggItemMap3getEP7CavaCtxi(%“class.unsafe::IntAggItemMap”* %8, %class.CavaCtx* %"@cavaCtx@", i32 %7) %eq = icmp eq i8* %9, null br i1 %eq, label %if.then, label %if.end10// if (item == null) {if.then: ; preds = %for.body // … prepare call for allocator.alloc %15 = tail call i8* @_ZN6unsafe16AggItemAllocator5allocEP7CavaCtx(%“class.unsafe::AggItemAllocator”* %14, %class.CavaCtx* %"@cavaCtx@") // item.groupKey = key; %groupKey = getelementptr inbounds i8, i8* %15, i64 16 %16 = bitcast i8* %groupKey to i32* store i32 %7, i32* %16, align 4 // item.sum0 = 0; item.count1 = 0; call void @llvm.memset.p0i8.i64(i8* %15, i8 0, i64 16, i32 8, i1 false) // … prepare call for itemMap.add tail call void @_ZN6unsafe13IntAggItemMap3addEP7CavaCtxiPNS_3AnyE(%“class.unsafe::IntAggItemMap”* %17, %class.CavaCtx* %"@cavaCtx@", i32 %7, i8* %15) br label %if.end10if.end10: ; preds = %if.end, %for.body %item.0.in = phi i8* [ %15, %if.end ], [ %9, %for.body ] %18 = bitcast %“class.unsafe::MatchDocs”* %lsr.iv to i64* // … prepare call for sumExpr0.getInt32 %26 = tail call i32 %24(%“class.suez::turing::AttributeExpressionTyped.64”* %20, i64 %25) // item.sum0 += sum0; item.count1 += 1; %27 = sext i32 %26 to i64 %28 = bitcast i8* %item.0.in to <2 x i64>* %29 = load <2 x i64>, <2 x i64>* %28, align 8 %30 = insertelement <2 x i64> undef, i64 %27, i32 0 %31 = insertelement <2 x i64> %30, i64 1, i32 1 %32 = add <2 x i64> %29, %31 %33 = bitcast i8* %item.0.in to <2 x i64>* store <2 x i64> %32, <2 x i64>* %33, align 8 br label %for.incfor.inc: ; preds = %if.then, %if.end10 %scevgep = getelementptr %“class.unsafe::MatchDocs”, %“class.unsafe::MatchDocs”* %lsr.iv, i64 8 %lsr.iv.next = add nsw i64 %lsr.iv42, -1 %exitcond = icmp eq i64 %lsr.iv.next, 0 br i1 %exitcond, label %for.end, label %for.bodyfor.end: ; preds = %for.inc, %entry ret void}代码生成的代码中有不少函数是通过C ++实现的,如docs.get(i)中,itemMap.get(键)等。但是优化后的IR中并没有docs.get(I)的函数调用,这是由于经常调用的c ++中实现的函数会被提前编译成bc,由cava编译器加载,经过llvm inline优化pass后被消除。可以认为cava代码和llvm ir基本能做到无损映射(cava中不容易实现逻辑可由c ++实现,预编译成bc加载后被内联),有了cava这一层我们可以用常规面向对象的编码习惯来做codegen,不用关心llvm api细节,让codegen门槛进一步降低。这个例子中,统计规模是100瓦特文档1瓦特个键时,线下测试初步结论是延迟大约能降1倍左右(54ms-> 27ms),有待表达式计算进一步优化。2.过滤算子在通用过滤算子中,表达式计算是典型的可被codegen优化的场景。例如ha3的过滤语句:filter =(a + 2 * b - c)> 0:表达式计算是通过AttributeExpression实现的,AttributeExpression的评价是虚函数。对于单文档接口我们可以用和统计类似的方式,使用静脉对表达式计算做代码生成。对于批量接口,和统计不同的是,表达式的批量计算更容易运用向量化优化,利用CPU的SIMD指令,使计算效率有成倍的提升。但是并不是所有的表达式都能使用一致的向量化优化方法,比如filter = a> 0 AND b <0这类表达式,有短路逻辑,向量化会带来不必要的计算。因此表达式的编译优化需要有更好的codegen 抽象,我们发现Halide能比较好的满足我们的需求.Halide的核心思想:算法描述(做什么ir)和性能优化(怎么做schedule)解耦。种解耦能让我们更灵活的定制优化策略,比如某些场景走向量化,某些场景走普通的代码生成;更进一步,不同计算平台上使用不同的优化策略也成为可能。3.倒排召回算子在寻求算子中,倒排召回是通过QueryExecutor实现的,QueryExecutor的seek是虚函数。例如query = a AND b OR c。QueryExecutor的和或ANDNOT有比较复杂的逻辑,虚函数的开销相对占比没有表达式计算那么大,之前用VTUNE做过预估,求虚函数调用开销占比约10%(数字不一定准确,内联效果没法评估)和精确统计,表达式计算相比,查询的组合空间巨大,寻求的代码生成得更多的考虑对高性价比的查询做编译优化。海选与排序算子在HA3引擎中海选和精排逻辑中有大量比较操作例如排序= + RANK; ID字句,对应的比较函数是秩Compartor和标识Compartor的联合比较.compare的函数调用可被代码生成掉,并且还可和STL算法联合inline.std ::排序使用非在线的补偿函数带来的开销可以参考如下例子:bool myfunction (int i,int j) { return (i<j); }int docCount = 200000;std::random_device rd;std::mt19937_64 mt(rd());std::uniform_int_distribution<int> keyDist(0, 200000);std::vector<int> myvector1;for (int i = 0 ; i < docCount; i++) { myvector1.push_back(keyDist(mt));}std::vector<int> myvector2 = myvector1;std::sort (myvector1.begin(), myvector1.end()); // cost 15.475msstd::sort (myvector2.begin(), myvector2.end(), myfunction); // cost 19.757ms对20瓦特随机数排序,简单的比较直列带来30%的提升。当然在引擎场景,由于比较逻辑复杂,这部分收益可能不会太多。算子的保险丝和代码生成算子的fuse是tensorflow xla编译的核心思想,在全图化场景我们有一些自定义算子也可以运用这个思想,例如特征生成器。FG生成特征的英文模型训练中很重要的一个环节。在线FG是以子图+配置形式描述计算,这部分的代码生成能使数据从索引直接计算到张量上,省去了很多环节中间数据的拷贝。目前这部分的代码生成可以工作参考这篇文章关于编译优化的展望SQL场景全图的编译执行数据库领域全阶段代码生成早被提出并应用,例如Apache的火花作为编译器 ;还有现在比较火的GPU数据库MAPD,把整个执行计划编译成架构无关的中间表示(LLVM IR),借助LLVM编译到不同的目标执行。从实现上看,SQL场景的全图编译执行对全图化引擎还有更多意义,比如可以省去tensorflow算子执行带来的线程切换的开销,可以去除算子间matchdoc传递(matchdoc作为通用的数据布局性能较差)带来的性能损耗。面向异构计算的编译器随着摩尔定律触及天花板,未来异构计算一定是一个热门的领域.SQL大规模数据分析和在线预测就是异构计算可以发挥作用的典型场景,比如分析场景大数据量统计,在线预测场景深度模型大规模并行计算.cpu驱动其他计算平台如gpu fpga,相互配合各自做自己擅长的事情,在未来有可能是常态。这需要为开发人员提供更好的编程接口。全图化引擎已经领先了一步,集成了tensorflow计算框架,天生具备了异构计算的能力。但在编译领域,通用的异构计算编程接口还远未到成熟的地步。工业界和学术界有不少尝试,比如tensorflow的xla编译框架,TVM,Weld等等。借用焊接的概念图表达一下异构计算编译器设计的愿景:让数据分析,深度学习,图像算法等能用统一易用的编程接口充分发挥异构计算平台的算力。总结编译技术已经开始在引擎的用户体验,迭代效率,性能优化中发挥作用,后续会跟着全图化引擎的演进不断发展。能做的事情很多,挑战很大,感兴趣有同学的可以联系我们探讨交流。参考使用带宽优化存储平衡向量化查询执行,第3章有效地编译现代硬件的高效查询计划TensorFlow编译优化策略 - XLAWeld:重新思考数据密集型库之间的接口TVM:用于深度学习的自动化端到端优化编译器本文作者:sance阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 3, 2018 · 4 min · jiezi

在数据采集器中用TensorFlow进行实时机器学习

摘要: 本文学习如何通过发布的最新TensorFlow Evaluator版本使用TensorFlow(TF)模型进行预测和分类。最新DataOps平台的真正价值,只有在业务用户和应用程序能够从各种数据源来访问原始数据和聚合数据,并且及时地产生数据驱动的认识时,才能够实现。利用机器学习(Machine Learning),分析师和数据科学家可以利用历史数据,以及实时地使用类似TensorFlow(TF)这样的技术,以做出更好的数据驱动业务的线下决策。在本文中,你将学习如何利用TensorFlow模型在StreamSets Data Collector3.5.0和StreamSets Data Collector Edge中最新发布的TensorFlow Evaluator进行预测和分类。在深入讨论细节之前,我们来看一些基本概念。机器学习(Machine Learning)亚瑟·塞缪尔把它描述为:“不需要明确地编写程序而使计算机有能力学习的研究领域。”随着机器学习领域的最新发展,计算机现在有能力做出预测,甚至比人类做的还要好,并且感觉可以解决任何问题。让我们先回顾一下机器学习都解决了什么样的问题吧。通常来说,机器学习被分为两大类:监督学习(Supervised Learning)“监督学习是学习一个函数的机器学习任务,该函数基于输入-输出的实例,将输入映射到输出。”—维基百科(Wikipedia)。它涉及到构建一个精准的模型,当历史数据被标记为一些结果的时候,模型就可以预测出结果了。用监督学习解决的常见业务问题:二元分类(学习预测一个分类值)顾客会购买一个特定产品吗?癌症是恶性的还是良性的?多级分类(学习预测一个分类值)给定的一段文本是否带有病毒、恐吓或淫秽内容?这是山鸢尾、蓝旗鸢尾还是北美鸢尾的物种?回归(学习预测一个连续值)一个代售房子的预测价格是多少?明天旧金山的气温是多少?无监督学习无监督学习允许我们在知道很少,或是完全不知道输出应该是什么样子的情况下处理问题。它涉及在之前数据上的标签是不可用的情况下创建模型。在这类的问题中,通过对基于数据中变量之间的关系进行数据聚类来导出结构。无监督学习的两种常见方法是K-均值聚类(K-means clustering)和DBSCAN。注意:Data Collector和Data Collector Edge中的TensorFlow Evaluator目前仅支持监督学习模型。神经网络与深度学习神经网络是机器学习算法的一种,可以学习和使用受人脑结构启发而来的计算模型。与其它机器学习算法,如决策树、逻辑回归等相比,神经网络具有较高的准确性。Andrew Ng在传统人工神经网络的背景下对深度学习进行了描述。在题为“深度学习、自我学习与无监督特征学习”的演讲中,他把深度学习的思想描述为:“利用了大脑结构的模仿, 希望:让学习算法更好地、更容易地使用;在机器学习和人工智能领域取得革命性的进展;我相信这是我们朝着真正的人工智能前进的最好办法。”常见的神经网络和深度学习应用包括:计算机视觉/图像识别/目标检测语言识别/自然语言处理(NLP)推荐系统(产品、婚介等)异常检测(网络安全等)TensorFlowTensorFlow是为深度神经网络设计的开源机器学习框架,由Google Brain Team开发的。TensorFlow支持在Windows和Mac操作系统上的可伸缩和便携式的训练,包括CPU、GPU和TPU。迄今为止,它是GitHub上最流行的和最活跃的机器学习项目。Data Collector中的TensorFlow随着TensorFlow Evaluator的引入,你现在能够创建管道(pipelines),以获取数据或特征,并在一个可控的环境中生成预测结果或分类,而不必发起对作为Web服务而提供和公布的机器学习模型的HTTP或REST API的调用。例如,Data Collector管道现在可以实时地检测欺诈交易或在文本上执行自然语言处理,因为数据在被存储到最终目的地之前,为了进一步的处理或做决策,正在经过各个阶段。另外,使用Data Collector Edge,你可以在Raspberry Pi和其它运行在所支持的平台上的设备上运行已经启用了的TensorFlow机器学习管道。例如,在高风险地区检测洪水等自然灾害发生的概率,以防止对人们财产的破坏。乳腺癌分类让我们考虑将乳腺癌肿瘤分类成恶性还是良性的例子。乳腺癌是一个经典的数据集,可以作为scikit-learn的一部分。要了解如何在Python中使用该数据集训练和导出一个简单的TensorFlow模型,请查看我在GitHub上的代码。正如你将要看到的那样,模型创建和训练被保持在最小范围,并且非常简单,只有几个隐藏层。最需要注意的重要方面是如何使用TensorFlow SavedModelBuilder来导出和保存模型。注意:要在Data Collector或Data Collector Edge中使用TensorFlow模型,首先应该在你选择支持的开发语言里,如Python,和交互式环境中,如Jupiter Notebook,使用TensorFlow的SavedModelBuilder导出和保存模型。一旦使用TensorFlow的SavedModelBuilder训练并导出了模型,那么在数据流管道中使用它进行预测或分类就非常简单了 — 只要模型保存在Data Collector或Data Collector Edge可访问的位置上即可。管道概述在深入了解细节之前,可以看下管道是什么样的:管道细节目录源:这将从.csv文件中加载乳腺癌的记录数据(注意:这个输入数据源可以非常简单地替换为其它的来源,包括Kafka、AWS S3、MySQL等等);字段转换器:这个处理器将转换供模型所使用的所有输入的乳腺癌记录特征数据,从String类型转换到Float类型(mean_radius,mean_texture,mean_perimeter,mean_area,mean_smoothness,mean_compactness,mean_concavity,mean_concave_points,mean_symmetry,mean_fractal_dimension,radius_error,texture_error,perimeter_error,area_error,smoothness_error,compactness_error,concavity_error,concave_points_error,symmetry_error,fractal_dimension_error,worst_radius,worst_texture,worst_perimeter,worst_area,worst_smoothness,worst_compactness,worst_concavity,worst_concave_points,worst_symmetry,worst_fractal_dimension) ;TensorFlow Evaluator:模型的保存路径:指定要使用的预训练的TensorFlow模型的位置;模型标签:设置为“serve”,因为元图(在我们导出的模型中)要用于服务中。有关详细信息,请参见tag_constants.py和相关的TensorFlow API documentation;输入配置:指定在训练和导出模型期间配置的输入张量信息(请见Train model and save/export it using TensorFlow SavedModelBuilder部分);输出配置:指定在训练和导出模型期间配置的输出张量信息(请见Train model and save/export it using TensorFlow SavedModelBuilder部分);输出字段:我们想保存分类值的输出记录字段;Expression Evaluator:-该处理器评估模型输出或分类值为0或1(存储在输出的字段TF_Model_Classification之中) ,并用Benign或Malignantrespectively这两个值创建一个新的记录字段“Condition”;Stream Selector:该处理器评估癌症状况(良性或恶性)并发送记录到各自的Kafka生产者;Kafka Producers:输入记录以及模型的输出或者分类值被有条件地发送给两个Kafka生产者以获得进一步地处理和分析;*TensorFlow Evaluator配置注意:一旦TensorFlow Evaluator产生了模型输出结果,本实例中采用的管道阶段是可选的,并且可以根据用例的需要与其它处理器和目标进行互换。管道执行在预览管道上,乳腺癌数据记录的输入通过了上面所述的数据流管道过程,包括服务于我们的TensorFlow模型。发送给Kafka生产者的最终输出记录数据(如上所示)包括用于分类的模型所使用的乳腺癌特征,在用户定义的字段TF_Model_Classification中模型输出值为0或1,以及由Expression Evaluator创建的Condition字段中表示相应的癌症状况是良性或恶性。总结本文说明了在Data Collector 3.5.0中使用最新发布的TensorFlow Evaluator。一般来说,这个评估器将允许你提供预训练的TensorFlow模型,用于生成预测结果和分类结果,而无需编写任何自己的代码。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 3, 2018 · 1 min · jiezi

深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码

摘要: 深度学习小技巧,约束权重以降低模型过拟合的可能,附keras实现代码。在深度学习中,批量归一化(batch normalization)以及对损失函数加一些正则项这两类方法,一般可以提升模型的性能。这两类方法基本上都属于权重约束,用于减少深度学习神经网络模型对训练数据的过拟合,并改善模型对新数据的性能。目前,存在多种类型的权重约束方法,例如最大化或单位向量归一化,有些方法也必须需要配置超参数。在本教程中,使用Keras API,用于向深度学习神经网络模型添加权重约束以减少过拟合。完成本教程后,您将了解:如何使用Keras API创建向量范数约束;如何使用Keras API为MLP、CNN和RNN层添加权重约束;如何通过向现有模型添加权重约束来减少过度拟合;下面,让我们开始吧。本教程分为三个部分:Keras中的权重约束;图层上的权重约束;权重约束案例研究;Keras中权重约束Keras API支持权重约束,且约束可以按每层指定。使用约束通常涉及在图层上为输入权重设置kernel_constraint参数,偏差权重设置为bias_constraint。通常,权重约束方法不涉及偏差权重。一组不同的向量规范在keras.constraints模块可以用作约束:最大范数(max_norm):强制权重等于或低于给定限制;非负规范(non_neg):强制权重为正数;单位范数(unit_norm):强制权重为1.0;Min-Max范数(min_max_norm):强制权重在一个范围之间;例如,可以导入和实例化约束:# import normfrom keras.constraints import max_norm# instantiate normnorm = max_norm(3.0)图层上的权重约束权重规范可用于Keras的大多数层,下面介绍一些常见的例子:MLP权重约束下面的示例是在全连接层上设置最大范数权重约束:# example of max norm on a dense layerfrom keras.layers import Densefrom keras.constraints import max_norm…model.add(Dense(32, kernel_constraint=max_norm(3), bias_constraint==max_norm(3)))…CNN权重约束下面的示例是在卷积层上设置最大范数权重约束:# example of max norm on a cnn layerfrom keras.layers import Conv2Dfrom keras.constraints import max_norm…model.add(Conv2D(32, (3,3), kernel_constraint=max_norm(3), bias_constraint==max_norm(3)))…RNN权重约束与其他图层类型不同,递归神经网络允许我们对输入权重和偏差以及循环输入权重设置权重约束。通过图层的recurrent_constraint参数设置递归权重的约束。下面的示例是在LSTM图层上设置最大范数权重约束:# example of max norm on an lstm layerfrom keras.layers import LSTMfrom keras.constraints import max_norm…model.add(LSTM(32, kernel_constraint=max_norm(3), recurrent_constraint=max_norm(3), bias_constraint==max_norm(3)))…基于以上的基本知识,下面进行实例实践。权重约束案例研究在本节中,将演示如何使用权重约束来减少MLP对简单二元分类问题的过拟合问题。此示例只是提供了一个模板,读者可以举一反三,将权重约束应用于自己的神经网络以进行分类和回归问题。二分类问题使用标准二进制分类问题来定义两个半圆观察,每个类一个半圆。其中,每个观测值都有两个输入变量,它们具有相同的比例,输出值分别为0或1,该数据集也被称为“ 月亮”数据集,这是由于绘制时,每个类中出现组成的形状类似于月亮。可以使用make_moons()函数生成观察结果,设置参数为添加噪声、随机关闭,以便每次运行代码时生成相同的样本。# generate 2d classification datasetX, y = make_moons(n_samples=100, noise=0.2, random_state=1)可以在图表上绘制两个变量x和y坐标,并将数据点所属的类别的颜色作为观察的颜色。下面列出生成数据集并绘制数据集的完整示例:# generate two moons datasetfrom sklearn.datasets import make_moonsfrom matplotlib import pyplotfrom pandas import DataFrame# generate 2d classification datasetX, y = make_moons(n_samples=100, noise=0.2, random_state=1)# scatter plot, dots colored by class valuedf = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))colors = {0:‘red’, 1:‘blue’}fig, ax = pyplot.subplots()grouped = df.groupby(’label’)for key, group in grouped: group.plot(ax=ax, kind=‘scatter’, x=‘x’, y=‘y’, label=key, color=colors[key])pyplot.show()运行该示例会创建一个散点图,可以从图中看到,对应类别显示的图像类似于半圆形或月亮形状。上图的数据集表明它是一个很好的测试问题,因为不能用直线划分,需要非线性方法,比如神经网络来解决。只生成了100个样本,这对于神经网络而言较小,也提供了过拟合训练数据集的概率,并且在测试数据集上具有更高的误差。因此,也是应用正则化的一个好例子。此外,样本具有噪声,使模型有机会学习不一致的样本的各个方面。多层感知器过拟合在机器学习力,MLP模型可以解决这类二进制分类问题。MLP模型只具有一个隐藏层,但具有比解决该问题所需的节点更多的节点,从而提供过拟合的可能。在定义模型之前,需要将数据集拆分为训练集和测试集,按照3:7的比例将数据集划分为训练集和测试集。# generate 2d classification datasetX, y = make_moons(n_samples=100, noise=0.2, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]接下来,定义模型。隐藏层的节点数设置为500、激活函数为RELU,但在输出层中使用Sigmoid激活函数以预测输出类别为0或1。该模型使用二元交叉熵损失函数进行优化,这类激活函数适用于二元分类问题和Adam版本梯度下降方法。# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])然后,设置迭代次数为4,000次,默认批量训练样本数量为32。# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)这里将测试数据集作为验证数据集验证算法的性能:# evaluate the model_, train_acc = model.evaluate(trainX, trainy, verbose=0), test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))最后,绘制出模型每个时期在训练和测试集上性能。如果模型确实对训练数据集过拟合了,对应绘制的曲线将会看到,模型在训练集上的准确度继续增加,而测试集上的性能是先上升,之后下降。# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()将以上过程组合在一起,列出完整示例:# mlp overfit on the moons datasetfrom sklearn.datasets import make_moonsfrom keras.layers import Densefrom keras.models import Sequentialfrom matplotlib import pyplot# generate 2d classification datasetX, y = make_moons(n_samples=100, noise=0.2, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)# evaluate the model, train_acc = model.evaluate(trainX, trainy, verbose=0), test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()运行该示例,给出模型在训练数据集和测试数据集上的性能。可以看到模型在训练数据集上的性能优于测试数据集,这是发生过拟合的标志。鉴于神经网络和训练算法的随机性,每次仿真的具体结果可能会有所不同。因为模型是过拟合的,所以通常不会期望在相同数据集上能够重复运行得到相同的精度。Train: 1.000, Test: 0.914创建一个图,显示训练和测试集上模型精度的线图。从图中可以看到模型过拟合时的预期形状,其中测试精度达到一个临界点后再次开始减小。具有权重约束的多层感知器过拟合为了和上面做对比,现在对MLP使用权重约束。目前,有一些不同的权重约束方法可供选择。本文选用一个简单且好用的约束——简单地标准化权重,使得其范数等于1.0,此约束具有强制所有传入权重变小的效果。在Keras中可以通过使用unit_norm来实现,并且将此约束添加到第一个隐藏层,如下所示:model.add(Dense(500, input_dim=2, activation=‘relu’, kernel_constraint=unit_norm()))此外,也可以通过使用min_max_norm并将min和maximum设置为1.0 来实现相同的结果,例如:model.add(Dense(500, input_dim=2, activation=‘relu’, kernel_constraint=min_max_norm(min_value=1.0, max_value=1.0)))但是无法通过最大范数约束获得相同的结果,因为它允许规范等于或低于指定的限制; 例如:model.add(Dense(500, input_dim=2, activation=‘relu’, kernel_constraint=max_norm(1.0)))下面列出具有单位规范约束的完整代码:# mlp overfit on the moons dataset with a unit norm constraintfrom sklearn.datasets import make_moonsfrom keras.layers import Densefrom keras.models import Sequentialfrom keras.constraints import unit_normfrom matplotlib import pyplot# generate 2d classification datasetX, y = make_moons(n_samples=100, noise=0.2, random_state=1)# split into train and testn_train = 30trainX, testX = X[:n_train, :], X[n_train:, :]trainy, testy = y[:n_train], y[n_train:]# define modelmodel = Sequential()model.add(Dense(500, input_dim=2, activation=‘relu’, kernel_constraint=unit_norm()))model.add(Dense(1, activation=‘sigmoid’))model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])# fit modelhistory = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)# evaluate the model, train_acc = model.evaluate(trainX, trainy, verbose=0)_, test_acc = model.evaluate(testX, testy, verbose=0)print(‘Train: %.3f, Test: %.3f’ % (train_acc, test_acc))# plot historypyplot.plot(history.history[‘acc’], label=‘train’)pyplot.plot(history.history[‘val_acc’], label=‘test’)pyplot.legend()pyplot.show()运行该示例,给出模型在训练数据集和测试数据集上的性能。从下图可以看到,对权重进行严格约束确实提高了模型在验证集上的性能,并且不会影响训练集的性能。Train: 1.000, Test: 0.943从训练和测试精度曲线图来看,模型已经在训练数据集上不再过拟合了,且模型在训练和测试数据集的精度保持在一个稳定的水平。扩展本节列出了一些读者可能希望探索扩展的教程:报告权重标准:更新示例以计算网络权重的大小,并证明使用约束后,确实使得幅度更小;约束输出层:更新示例以将约束添加到模型的输出层并比较结果;约束偏置:更新示例以向偏差权重添加约束并比较结果;反复评估:更新示例以多次拟合和评估模型,并报告模型性能的均值和标准差;进一步阅读如果想进一步深入了解,下面提供一些有关该主题的其它资源:博客机器学习中矢量规范简介(Gentle Introduction to Vector Norms in Machine Learning)APIKeras Constraints APIKeras constraints.pyKerasCore Layers APIKeras Convolutional Layers APIKeras Recurrent Layers APIsklearn.datasets.make_moons API本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 30, 2018 · 2 min · jiezi

理解五个基本概念,让你更像机器学习专家

摘要: 这篇文章主要讲述了机器学习的相关内容,阐述了机器学习的主要意义和形成过程。区别了机器学习与AI、深度学习、神经网络等专业词汇。大多数人可能对机器学习有点恐惧或困惑。 脑子中会有它到底是什么,它有什么发展方向,我现在可以通过它挣钱吗等等这样的问题。这些问题的提出都是有依据的。事实上,你可能没有意识到自己其实多年来一直在训练机器学习模型。你看过苹果手机或者是Facebook上的照片吧? 你知道它如何向你展示一组面孔并要求你识别它们吗?其实,通过标记这些照片,你正在训练面部识别模型去识别新面孔。恭喜你,现在可以说你有训练机器学习模型的经验了!但在此之前,请阅读这些机器学习基础知识,以便你可以准确回答任何后续问题。1)机器学习可以预测如果你只是在图片中标记朋友的面孔,那就不是在用机器学习模型。如果你上传了一张新照片系统马上告诉你每个人是谁,那你就是应用了机器学习模型。机器学习的主要意义在于根据图案模型和经过训练的其他因素来预测事物。它可以预测任何事物,如要基于地理位置和卧室数量预测房价,基于一年中的时间和天气的变化预测航班是否会延误,依据图片中的人物特点进行人像识别等等。2)机器学习需要训练你必须告诉机器学习模型它试图预测的是什么。想想一个孩子是如何学习的,他们第一次看到香蕉,他们不知道它是什么。然后你告诉他们这是一个香蕉。下次他们看到另一个,他们会把它识别为香蕉,机器学习就是以类似的方式工作。你可以尽可能多地展示香蕉的照片,告诉它这是香蕉,然后用未经训练的香蕉图片进行测试。但这是一个过度的简化的方法,因为整个过程遗漏了告诉它什么不是香蕉的部分,除此之外还要给它展示不同种类不同颜色、不同角度的香蕉图片等等。3)达到80%的准确度就可以认为是成功的我们还没有达到通过机器学习平台识别图片中的香蕉达到100%的准确率技术的地步,但也没关系,事实证明,人类去识别也不是100%准确。业界的潜规则是达到80%准确度的模型就是成功的。大家可以思考一下,在你收藏的图片中正确识别800,000张是非常有用的,虽然可能还有错误的200,000张,但这已经节省了80%的时间。毋庸置疑,这是非常有价值的。假如我可以用它使你的生产力提高如此之多,你肯定会付我很多钱。而事实证明我可以用机器学习提高你的生产力。(2018年更新:80%规则改为90%规则。)4)机器学习不同于AI,深度学习或神经网络人们经常随意抛出以上这些术语,听起来像专家,但其中有很大差异。AI-人工智能是指在完成特定任务时与人类一样好(或优于人类)的计算机。它也可以指一个可以根据大量输入做出决策的机器人,与终结者或C3PO不同。它是一个非常广泛的术语,不是很有特指性。ML-机器学习是实现AI的一种方法。就是通过解析数据集对某事做出预测。ML平台可以通过许多不同的方式运行训练集来预测事物。NL-神经网络是实现机器学习模型预测事物的方式之一。神经网络的工作有点像人的大脑,通过大量的训练来调整自己,以了解香蕉应该是什么样子。这个过程创建了非常深的节点层。5)在AI变得有自我意识之前,我们还有很长的路要走我并不担心机器学习接管地球。主要是因为如果你曾构建过一个机器学习模型,就会明白它需要依赖你来告诉它究竟该做什么。即使你给出明确的指示,它通常也会出错。你必须对这些体系非常清晰明确,让它突然变化的可能性降到最低。即使是一个显示带有单词的框的简单网页,也需要你准确地告诉它该框出现的位置,形状,颜色,如何在不同的浏览器上工作,如何在不同的设备上正确显示等等。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

November 30, 2018 · 1 min · jiezi

用深度学习预测专业棋手走法

摘要: 相信很多朋友都会玩国际象棋,那么有尝试过构建一个国际象棋引擎吗,一起来玩玩看吧!我不擅长国际象棋。我父亲在我年幼的时候教过我,但我猜他是那些一直让他们的孩子获胜的爸爸之一。为了弥补世界上最受欢迎的游戏之一的技能的缺乏,我做了任何数据科学爱好者会做的事情:建立一个人工智能来击败我无法击败的人。遗憾的是,它不如AlphaZero(甚至普通玩家)好。但我想看看国际象棋引擎在没有强化学习的情况下如何做,以及学习如何将深度学习模型部署到网络上。比赛在这里!获取数据FICS拥有一个包含3亿场比赛,个人走法,结果以及所涉玩家评级的数据库。我下载了所有在2012年的比赛,其中至少有一名玩家超过2000 ELO。这总计约97000场比赛,有730万个走子。胜利分配是:43000次白方胜利,40000次黑方胜利和14000次平局。极小极大算法了解如何做一个深度学习象棋AI,我必须首先了解传统象棋AI程序。来自于极小极大算法。Minimax是“最小化最大损失”的缩写,是博弈论中决定零和博弈应如何进行的概念。Minimax通常用于两个玩家,其中一个玩家是最大化者,另一个玩家是最小化者。机器人或使用此算法获胜的人假设他们是最大化者,而对手是最小化者。该算法还要求有一个棋盘评估函数,来衡量谁赢谁输。该数字介于-∞和∞之间。最大化者希望最大化此值,而最小化者希望最小化此值。这意味着当你,最大化者,有两个走法可以选择的时候,你将选择一个给你更高评估的那个,而最小化者将做相反的选择。这个游戏假设两个玩家都发挥最佳状态并且没有人犯任何错误。以上面的GIF为例。你,最大化者(圆圈)有三个你可以选择的走法(从顶部开始)。你直接选择的走法取决于你的对手(方块)在走子后将选择的走法。但是你的对手直接选择的走法取决于你走子后选择的走法,依此类推,直到游戏结束。玩到游戏结束会占用大量的计算资源和时间,所以在上面的例子中,选择一个深度,2。如果最小化者(最左边的方块)选择左移,你有1和-1可供选择。你选择1,因为它会给你最高分。如果最小化者选择正确的走法,则选择0,因为它更高。现在是最小化者的回合,他们选择0因为这更低。这个游戏继续进行,一直进行到所有的走子都完成或你的思维时间耗尽。对于我的国际象棋引擎来说,假设白方是最大化者,而黑方是最小化者。如果引擎是白方,则算法决定哪个分支将给出最高的最低分数,假设人们在每次走子时选择最低分数,反之亦然。为了获得更好的性能,该算法还可以与另一种算法结合使用:alpha-beta剪枝。 Alpha-beta剪枝截止系统适用于决定是否应该搜索下一个分支。深度学习架构我的研究始于Erik Bernhardsson关于国际象棋深度学习的优秀文章。他讲述了他如何采用传统方法制作AI下棋并将其转换为使用神经网络作为引擎。第一步是将棋盘转换为输入层的数字形式。我借用了Erik Bernhardsson的编码策略,其中棋盘是一个热编码,每一个方块中都有一个棋子。这总计为768个元素数组(8 x 8 x 12,因为有12种棋子)。Bernhardsson选择将输出图层设为1表示白方胜利,-1表示黑方胜利,0表示平局。他认为游戏中的每个板位置都与结果有关。如果黑方赢了,每个棋的位置都被训练成“支持黑方”,如果白方赢了,则“支持白方棋”。这允许网络返回介于-1和1之间的值,这将告诉你该位置是否更有可能导致白赢或黑赢。我想用稍微不同的评估函数来解决这个问题。网络是否能够看到不是白方还是黑方获胜,而是能够看到哪个走子将导致胜利?首先,我尝试将768元素的棋盘表示放入输出,其中一个位置是输入,下一个位置是输出。当然,这没有用,因为这把它变成了一个多分类问题。这导致引擎适当地选择合法走子时出现太多的错误,因为输出层中的所有768个元素可以是1或0。因此,我查阅了Barak Oshri和Nishith Khandwala的斯坦福大学论文《利用卷积神经网络预测国际象棋中的运动》,了解他们如何解决这个问题。他们训练了7个神经网络,其中1个网络是棋子选择器网络。这个网络决定哪一个方格最有可能被移动。其他六个网络专门针对每一个棋子类型,并决定将一个特定的棋子移动到哪里。如果棋子选择器选择了一个带有兵的方格,那么只有棋子神经网络会响应最有可能移动到的方格。我从他们的想法中借鉴了两个卷积神经网络。第一个,从网络移动,将被训练成采用768元素数组表示并输出专业棋手移动的方格(在方块0和方块63之间)。 第二个网络:移动到网络,将做同样的事情,除了输出层将是专业棋手移动到的地方。我没有考虑谁赢了,因为我认为训练数据中的所有移动都是相对最优的,无论最终结果如何。我选择的架构是两个128卷积层,带有2x2滤波器,后面是两个1024神经元完全连接层。我没有应用任何池,因为池提供位置不变性。图片左上角的猫就像图片右下角的猫一样。然而,对于国际象棋,,棋子国王的值是完全不同于车兵。隐藏图层的激活功能是RELU,而我将softmax应用到最后一层,因此我基本上得到一个概率分布,其中所有方格的概率总和加起来达到100%。我的训练数据是训练集的600万个位置,其余130万个位置用于验证集。在训练结束时,我从网络上获得了34.8%的验证准确率,并且在转移到网络时获得了27.7%的验证准确率。这并不意味着70%的时间它没有学习合法的走子,这只意味着AI没有像验证数据中的专业玩家那样做出相同的举动。相比之下,Oshri和Khandwala的网络平均验证准确率为37%。将深度学习与Minimax结合起来因为现在这是一个分类问题,其中输出可以是64个类之一,这就留下了很大的错误空间。关于训练数据(来自高级别玩家的比赛)的一个警告是,优秀的棋手很少会玩到“将军”。他们知道什么时候输了,通常没有必要跟进整场比赛。这种缺乏平衡的数据使得网络在最终游戏结束时非常混乱。它会选择车来移动,并试图沿对角线移动。如果失败,网络甚至会试图指挥对手的棋子(厚颜无耻!)。为了解决这个问题,我命令输出的概率。然后,我使用python-chess库获取给定位置的所有合法走子的列表,并选择具有最高结果概率的合法走子。最后,我应用了一个带有惩罚的预测分数方程式,用于选择较不可能的走子:400(选择的走子指数之和)。名单上的合法走子越远,其预测得分就越低。例如,如果从网络移动的第一个索引(索引0)与移动到网络的第一个索引相结合是合法的,那么预测分数是400(0 + 0),这是最高可能分数:400。在与材料分数结合使用数字后,我选择了400作为最大预测分数。材料分数是一个数字,可以判断所做的走子是否会捕获一个棋子。根据捕获的棋子,走子的整体得分将得到提升。我选择的材料价值如下:兵:10,马:500,象:500,车:900,后:5000,王:50000。这特别有助于残局。在将杀走子将是第二个最可能的合法行动且预测得分较低的情况下,国王的物质价值将超过它。兵的分数如此之低,因为网络在早期比赛中考虑得足够充分,所以如果它是战略举措,它将会采用兵。然后我将这些分数结合起来,以返回给定任何潜在走子的棋盘的评估。我通过深度为3的minimax算法(使用alpha-beta修剪)提供了这个,并得到了一个可以将杀的可运行国际象棋引擎!使用Flask和Heroku进行部署我在Youtube上使用了Bluefever Software的指南,展示了如何通过向flask服务器发出AJAX请求来制作javascript国际象棋UI并通过它来路由我的引擎。 我使用Heroku将python脚本部署到Web并将其连接到我的自定义域:Sayonb.com。结论虽然引擎的性能没有我希望的那么好,但是我学到了很多关于AI的基础知识,将机器学习模型部署到web上,以及为什么AlphaZero不使用卷积神经网络来玩游戏!可以通过以下方式进行改进:通过使用bigram模型LSTM将从网络移动和移动到网络中的时间序列组合在一起。 这可能有助于将移出和移动到决策中,因为每个目前都是独立接近的。通过添加夺取的棋子的位置来改进棋子的赋值(夺取棋盘中心的兵比它在边缘时夺取更有利)。在使用神经网络预测分数和子力分值之间切换,而不是在每个节点使用两者。这可以允许更高的极小极大算法搜索深度。考虑边缘情况,例如:减少孤立自己的兵的可能性,增加马靠近棋盘中心的可能性。查看代码,或者在GitHub repo用自己的训练数据自己训练一个新网络!本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

November 26, 2018 · 1 min · jiezi

10分钟学会使用YOLO及Opencv实现目标检测(下)|附源码

摘要: 本文介绍使用opencv和yolo完成视频流目标检测,代码解释详细,附源码,上手快。在上一节内容中,介绍了如何将YOLO应用于图像目标检测中,那么在学会检测单张图像后,我们也可以利用YOLO算法实现视频流中的目标检测。将YOLO应用于视频流对象检测首先打开 yolo_video.py文件并插入以下代码:# import the necessary packagesimport numpy as npimport argparseimport imutilsimport timeimport cv2import os# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i", “–input”, required=True, help=“path to input video”)ap.add_argument("-o", “–output”, required=True, help=“path to output video”)ap.add_argument("-y", “–yolo”, required=True, help=“base path to YOLO directory”)ap.add_argument("-c", “–confidence”, type=float, default=0.5, help=“minimum probability to filter weak detections”)ap.add_argument("-t", “–threshold”, type=float, default=0.3, help=“threshold when applyong non-maxima suppression”)args = vars(ap.parse_args())同样,首先从导入相关数据包和命令行参数开始。与之前不同的是,此脚本没有– image参数,取而代之的是量个视频路径:– input :输入视频文件的路径;– output :输出视频文件的路径;视频的输入可以是手机拍摄的短视频或者是网上搜索到的视频。另外,也可以通过将多张照片合成为一个短视频也可以。本博客使用的是在PyImageSearch上找到来自imutils的VideoStream类的 示例。下面的代码与处理图形时候相同:# load the COCO class labels our YOLO model was trained onlabelsPath = os.path.sep.join([args[“yolo”], “coco.names”])LABELS = open(labelsPath).read().strip().split("\n")# initialize a list of colors to represent each possible class labelnp.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype=“uint8”)# derive the paths to the YOLO weights and model configurationweightsPath = os.path.sep.join([args[“yolo”], “yolov3.weights”])configPath = os.path.sep.join([args[“yolo”], “yolov3.cfg”])# load our YOLO object detector trained on COCO dataset (80 classes)# and determine only the output layer names that we need from YOLOprint("[INFO] loading YOLO from disk…")net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)ln = net.getLayerNames()ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]在这里,加载标签并生成相应的颜色,然后加载YOLO模型并确定输出层名称。接下来,将处理一些特定于视频的任务:# initialize the video stream, pointer to output video file, and# frame dimensionsvs = cv2.VideoCapture(args[“input”])writer = None(W, H) = (None, None)# try to determine the total number of frames in the video filetry: prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \ else cv2.CAP_PROP_FRAME_COUNT total = int(vs.get(prop)) print("[INFO] {} total frames in video".format(total))# an error occurred while trying to determine the total# number of frames in the video fileexcept: print("[INFO] could not determine # of frames in video") print("[INFO] no approx. completion time can be provided") total = -1在上述代码块中:打开一个指向视频文件的文件指针,循环读取帧;初始化视频编写器 (writer)和帧尺寸;尝试确定视频文件中的总帧数(total),以便估计整个视频的处理时间;之后逐个处理帧:# loop over frames from the video file streamwhile True: # read the next frame from the file (grabbed, frame) = vs.read() # if the frame was not grabbed, then we have reached the end # of the stream if not grabbed: break # if the frame dimensions are empty, grab them if W is None or H is None: (H, W) = frame.shape[:2]上述定义了一个 while循环, 然后从第一帧开始进行处理,并且会检查它是否是视频的最后一帧。接下来,如果尚未知道帧的尺寸,就会获取一下对应的尺寸。接下来,使用当前帧作为输入执行YOLO的前向传递 :ect Detection with OpenCVPython # construct a blob from the input frame and then perform a forward # pass of the YOLO object detector, giving us our bounding boxes # and associated probabilities blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False) net.setInput(blob) start = time.time() layerOutputs = net.forward(ln) end = time.time() # initialize our lists of detected bounding boxes, confidences, # and class IDs, respectively boxes = [] confidences = [] classIDs = []在这里,构建一个 blob 并将其传递通过网络,从而获得预测。然后继续初始化之前在图像目标检测中使用过的三个列表: boxes 、 confidences、classIDs : # loop over each of the layer outputs for output in layerOutputs: # loop over each of the detections for detection in output: # extract the class ID and confidence (i.e., probability) # of the current object detection scores = detection[5:] classID = np.argmax(scores) confidence = scores[classID] # filter out weak predictions by ensuring the detected # probability is greater than the minimum probability if confidence > args[“confidence”]: # scale the bounding box coordinates back relative to # the size of the image, keeping in mind that YOLO # actually returns the center (x, y)-coordinates of # the bounding box followed by the boxes’ width and # height box = detection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype(“int”) # use the center (x, y)-coordinates to derive the top # and and left corner of the bounding box x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) # update our list of bounding box coordinates, # confidences, and class IDs boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID)在上述代码中,与图像目标检测相同的有:循环输出层和检测;提取 classID并过滤掉弱预测;计算边界框坐标;更新各自的列表;接下来,将应用非最大值抑制: # apply non-maxima suppression to suppress weak, overlapping # bounding boxes idxs = cv2.dnn.NMSBoxes(boxes, confidences, args[“confidence”], args[“threshold”]) # ensure at least one detection exists if len(idxs) > 0: # loop over the indexes we are keeping for i in idxs.flatten(): # extract the bounding box coordinates (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) # draw a bounding box rectangle and label on the frame color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) text = “{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i]) cv2.putText(frame, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)同样的,在上述代码中与图像目标检测相同的有:使用cv2.dnn.NMSBoxes函数用于抑制弱的重叠边界框,可以在此处阅读有关非最大值抑制的更多信息;循环遍历由NMS计算的idx,并绘制相应的边界框+标签;最终的部分代码如下: # check if the video writer is None if writer is None: # initialize our video writer fourcc = cv2.VideoWriter_fourcc(*“MJPG”) writer = cv2.VideoWriter(args[“output”], fourcc, 30, (frame.shape[1], frame.shape[0]), True) # some information on processing single frame if total > 0: elap = (end - start) print("[INFO] single frame took {:.4f} seconds”.format(elap)) print("[INFO] estimated total time to finish: {:.4f}".format( elap * total)) # write the output frame to disk writer.write(frame)# release the file pointersprint("[INFO] cleaning up…")writer.release()vs.release()总结一下:初始化视频编写器(writer),一般在循环的第一次迭代被初始化;打印出对处理视频所需时间的估计;将帧(frame)写入输出视频文件;清理和释放指针;现在,打开一个终端并执行以下命令:$ python yolo_video.py –input videos/car_chase_01.mp4 \ –output output/car_chase_01.avi –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] 583 total frames in video[INFO] single frame took 0.3500 seconds[INFO] estimated total time to finish: 204.0238[INFO] cleaning up…在视频/ GIF中,你不仅可以看到被检测到的车辆,还可以检测到人员以及交通信号灯!YOLO目标检测器在该视频中表现相当不错。让现在尝试同一车追逐视频中的不同视频:$ python yolo_video.py –input videos/car_chase_02.mp4 \ –output output/car_chase_02.avi –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] 3132 total frames in video[INFO] single frame took 0.3455 seconds[INFO] estimated total time to finish: 1082.0806[INFO] cleaning up…YOLO再一次能够检测到行人!或者嫌疑人回到他们的车中并继续追逐:$ python yolo_video.py –input videos/car_chase_03.mp4 \ –output output/car_chase_03.avi –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] 749 total frames in video[INFO] single frame took 0.3442 seconds[INFO] estimated total time to finish: 257.8418[INFO] cleaning up…最后一个例子,让我们看看如何使用YOLO作为构建流量计数器:$ python yolo_video.py –input videos/overpass.mp4 \ –output output/overpass.avi –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] 812 total frames in video[INFO] single frame took 0.3534 seconds[INFO] estimated total time to finish: 286.9583[INFO] cleaning up…下面汇总YOLO视频对象检测完整视频:Quaker Oats汽车追逐视频;Vlad Kiraly立交桥视频;“White Crow”音频;YOLO目标检测器的局限和缺点YOLO目标检测器的最大限制和缺点是:它并不总能很好地处理小物体;它尤其不适合处理密集的对象;限制的原因是由于YOLO算法其本身:YOLO对象检测器将输入图像划分为SxS网格,其中网格中的每个单元格仅预测单个对象;如果单个单元格中存在多个小对象,则YOLO将无法检测到它们,最终导致错过对象检测;因此,如果你的数据集是由许多靠近在一起的小对象组成时,那么就不应该使用YOLO算法。就小物体而言,更快的R-CNN往往效果最好,但是其速度也最慢。在这里也可以使用SSD算法, SSD通常在速度和准确性方面也有很好的权衡。值得注意的是,在本教程中,YOLO比SSD运行速度慢,大约慢一个数量级。因此,如果你正在使用预先训练的深度学习对象检测器供OpenCV使用,可能需要考虑使用SSD算法而不是YOLO算法。因此,在针对给定问题选择对象检测器时,我倾向于使用以下准则:如果知道需要检测的是小物体并且速度方面不作求,我倾向于使用faster R-CNN算法;如果速度是最重要的,我倾向于使用YOLO算法;如果需要一个平衡的表现,我倾向于使用SSD算法;想要训练自己的深度学习目标检测器?在本教程中,使用的YOLO模型是在COCO数据集上预先训练的.。但是,如果想在自己的数据集上训练深度学习对象检测器,该如何操作呢?大体思路是自己标注数据集,按照darknet网站上的指示及网上博客自己更改相应的参数训练即可。或者在我的书“ 深度学习计算机视觉与Python”中,详细讲述了如何将faster R-CNN、SSD和RetinaNet应用于:检测图像中的徽标;检测交通标志;检测车辆的前视图和后视图(用于构建自动驾驶汽车应用);检测图像和视频流中武器;书中的所有目标检测章节都包含对算法和代码的详细说明,确保你能够成功训练自己的对象检测器。在这里可以了解有关我的书的更多信息(并获取免费的示例章节和目录)。总结在本教程中,我们学习了如何使用Deep Learning、OpenCV和Python完成YOLO对象检测。然后,我们简要讨论了YOLO架构,并用Python实现:将YOLO对象检测应用于单个图像;将YOLO对象检测应用于视频流;在配备的3GHz Intel Xeon W处理器的机器上,YOLO的单次前向传输耗时约0.3秒; 但是,使用单次检测器(SSD),检测耗时只需0.03秒,速度提升了一个数量级。对于使用OpenCV和Python在CPU上进行基于实时深度学习的对象检测,你可能需要考虑使用SSD算法。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 22, 2018 · 5 min · jiezi

ui2code中的深度学习+传统算法应用

背景在之前的文章中,我们已经提到过团队在UI自动化这方面的尝试,我们的目标是实现基于 单一图片到代码 的转换,在这个过程不可避免会遇到一个问题,就是为了从单一图片中提取出足够的有意义的结构信息,我们必须要拥有从图片中切割出想要区块(文字、按钮、商品图片等)的能力,而传统切割算法遇到复杂背景图片往往就捉襟见肘了(见下图),这个时候,我们就需要有能力把复杂前后景的图片划分为各个层级图层,再交给切割算法去处理,拿到我们期望的结构信息。经过传统切割算法处理,会无法获取图片结构信息,最终只会当成一张图片处理。在业界,图片前后景分离一直是个很麻烦的命题,业界目前比较普遍采用的解决方案是计算机视觉算法提取,或是引入人工智能来解决,但直到现在,都没有百分百完美的解决方案。那是否能引入AI来解决这个问题呢,我们来看一下,目前使用AI并拿到比较不错结果的解法是fcn+crf,基本上能够把目标物体的前景轮廓框出来,但缺点也很明显:准确率只有80%左右边缘切割无法达到像素级别打标成本非常大难以训练AI是个黑盒,结果不可控在考虑到使用AI伴随的问题之外,咱们也一起来思考下,难道AI真的是解决前后景分离的最佳解法吗?其实不是的,我们知道,一个页面,或者说设计稿,一个有意义的前景,是具有比较明显特征的,比如说:规则的形状:线段、矩形、圆形、圆角、是否对称等形状上是否有文字,或者说是类似于文字的信息是否闭合让我们一起来验证下这个思路的可行性。实践结果在尝试了非常的多计算机视觉算法之后,你会发现,没有一种算法是能够解决掉这个问题的,基本上是可能一种算法,在某种场景下是有效的,到了另外一个场景,就又失效了,而且就算是有效的场景,不同颜色复杂度下,所需要的最佳算法参数又是不相同的。如果case by case来解决的话,可以预期未来的工程会变得越来越冗杂且不好维护。那是不是可以这样呢,找到尽可能多的前景区域,加一层过滤器过滤掉前景可能性低的,再加一层层级分配器,对搜索到的全部前景进行前后层级划分,最后对图像进行修复,填补空白后景。咱们先来看看效果,以下查找前景的过程:为了避免有的前景被忽略(图片大部分是有多层的,前景里面还会嵌套前景),所以一个前景被检测到之后不会去隐藏它,导致会出现一个前景被多次检测到的情况,不过这块加一层层级分配算法就能解决了,最终得到出来的分离结果如下:逻辑概要文字处理OCR获取文字粗略位置来看看例子,以下左图是闲鱼首页,右图是基于OCR给出的文字位置信息对文字区域进行标记(图中白色部分),可以看到,大致上位置是准确的 但比较粗糙 无法精确到每个文字本身 而且同一行的不同文字片段 OCR会当成一行去处理。同时,也会有部分非文字的部分 也被当成文字,比如图中的banner文案:切割、CNN鉴别器对以上结果标注的位置进行切割,切割出尽可能小的单个文字区域,交给CNN判断,该文字是否是可编辑的文字,还是属于图片文案,后者将当作图片进行处理,以下是CNN代码:""" ui基础元素识别"""# TODO 加载模型with ui_sess.as_default(): with g2.as_default(): tf.global_variables_initializer().run() # Loads label file, strips off carriage return ui_label_lines = [line.rstrip() for line in tf.gfile.GFile(“AI_models/CNN/ui-elements-NN/tf_files/retrained_labels.txt”)] # Unpersists graph from file with tf.gfile.FastGFile(“AI_models/CNN/ui-elements-NN/tf_files/retrained_graph.pb”, ‘rb’) as f: ui_graph_def = tf.GraphDef() ui_graph_def.ParseFromString(f.read()) tf.import_graph_def(ui_graph_def, name=’’) # Feed the image_data as input to the graph and get first prediction ui_softmax_tensor = ui_sess.graph.get_tensor_by_name(‘final_result:0’)# TODO 调用模型with ui_sess.as_default(): with ui_sess.graph.as_default(): # UI原子级元素识别 def ui_classify(image_path): # Read the image_data image_data = tf.gfile.FastGFile(image_path, ‘rb’).read() predictions = ui_sess.run(ui_softmax_tensor, {‘DecodeJpeg/contents:0’: image_data}) # Sort to show labels of first prediction in order of confidence top_k = predictions[0].argsort()[-len(predictions[0]):][::-1] for node_id in top_k: human_string = ui_label_lines[node_id] score = predictions[0][node_id] print(’%s (score = %s)’ % (human_string, score)) return human_string, score文字抽离如果是纯色背景,文字区域很好抽离,但如果是复杂背景就比较麻烦了。举个例子:基于以上,我们能拿到准确的文本信息,我们逐一对各个文本信息做处理,文本的特征还是比较明显的,比如说含有多个角点,在尝试了多种算法:Harris角点检测、Canny边缘检测、SWT算法,KNN算法(把区域色块分成两部分)之后,发现KNN的效果是最好的。代码如下:Z = gray_region.reshape((-1,1)) Z = np.float32(Z)criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)center = np.uint8(center) res = center[label.flatten()]res2 = res.reshape((gray_region.shape))抽离后结果如下:查找前景强化图片边缘,弱化非边缘区域使用卷积核对原图进行卷积,该卷积核可以强化边缘,图像平滑区域会被隐藏。conv_kernel = [ [-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]卷积后,位与操作隐藏文字区域,结果如下:降噪对卷积后的图,加一层降噪处理,首先把图像转为灰度图,接着二值化,小于10像素值的噪点将被隐藏,最后使用cv2.connectedComponentsWithStats()算法消除小的噪点连通区域。基于文字位置,开始查找轮廓我们基于前面拿到的文字信息,选中文字左上角坐标,以这个点为种子点执行漫水填充算法,之后我们会得到一个区域,我们用cv2.findContours()来获取这个区域的外部轮廓,对轮廓进行鉴别,是否符合有效前景的特征,之后对区域取反,重新执行cv2.findContours()获取轮廓,并鉴别。判断内外部轮廓如果文字在轮廓内部,那拿到的区域将不会包含该区域的border边框,如果文字在轮廓外部,就能拿到包含边框的一整个有效区域(边框应该隶属于前景),所以咱们要判断文字和轮廓的位置关系(cv2.pointPolygonTest),如果在内部,会使轮廓往外扩散,知道拿到该轮廓的边框信息为止。前景鉴别器基于前面的步骤,我们会拿到非常多非常多的轮廓,其实绝大部分是无效轮廓以及重复检测到的轮廓,咱们需要加一层鉴别器来对这些轮廓进行过滤,来判断它是否是有效前景。定义有效shape我们会预先定义我们认为有意义的形状shape,比如说矩形、正方形、圆形,只要检测到的轮廓与这三个的相似度达到了设定的阀值要求,并且轮廓中还包含了文字信息,我们就认为这是一个有意义的前景,见代码:# TODO circlecircle = cv2.imread(os.getcwd()+’/fgbgIsolation/utils/shapes/circle.png’, 0), contours, _ = cv2.findContours(circle, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)self.circle = contours[0]# TODO squaresquare = cv2.imread(os.getcwd()+’/fgbgIsolation/utils/shapes/square.png’, 0), contours, _ = cv2.findContours(square, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)self.square = contours[0]# TODO rectrect = cv2.imread(os.getcwd()+’/fgbgIsolation/utils/shapes/rect.png’, 0), contours, _ = cv2.findContours(rect, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)self.rect = contours[0]匹配shape相似度多次尝试之后 发现score设置为3的效果是最好的。代码如下:# TODO 检测图形相似度def detect(self, cnt): shape = “unidentified” types = [self.square, self.rect, self.circle] names = [‘square’, ‘rect’, ‘circle’] for i in range(len(types)): type = types[i] score = cv2.matchShapes(type, cnt, 1, 0.0) # score越小越相似 # TODO 一般小于3是有意义的 if score<3: shape = names[i] break return shape, score单一匹配shape相似度的鲁棒性还是不够健壮,所以还引入了其他过滤逻辑,这里不展开。图像修复可以预见的,我们传入的图片只有一张,但我们划分图层之后,底层的图层肯定会出现“空白”区域,我们需要对这些区域进行修复。计算重叠区域需要修复的区域只在于重叠(重叠可以是多层的)的部分,其他部分我们不应该去修复。计算重叠区域的解决方案沿用了mask遮罩的思路,我们只需要计算当前层有效区域和当前层之上层有效区域的交集即可,使用cv2.bitwise_and# mask是当前层的mask layers_merge是集合了所有前景的集合 i代表当前层的层级数 # inpaint_mask 是要修复的区域遮罩# TODO 寻找重叠关系UPPER_level_mask = np.zeros(mask.shape, np.uint8) # 顶层的前景UPPER_level_mask = np.where(layers_merge>i, 255, 0)UPPER_level_mask = UPPER_level_mask.astype(np.uint8), contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 查找当前层的每个前景外轮廓overlaps_mask = np.zeros(mask.shape, np.uint8) # 当前层的所有前景的重叠区域for cnt in contours: cnt_mask = np.zeros(mask.shape, np.uint8) cv2.drawContours(cnt_mask, [cnt], 0, (255, 255, 255), cv2.FILLED, cv2.LINE_AA) overlap_mask = cv2.bitwise_and(inpaint_mask, cnt_mask, mask=UPPER_level_mask) overlaps_mask = cv2.bitwise_or(overlaps_mask, overlap_mask)# TODO 将当前层重叠区域的mask赋值给修复maskinpaint_mask = overlaps_mask修复使用修复算法cv2.INPAINT_TELEA,算法思路是:先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点。# img是要修复的图像 inpaint_mask是上面提到的遮罩 dst是修复好的图像dst = cv2.inpaint(img, inpaint_mask, 3, cv2.INPAINT_TELEA)延展本文大概介绍了通过计算机视觉为主,深度学习为辅的图片复杂前后景分离的解决方案,除了文中提到的部分,还有几层轮廓捕获的逻辑因为篇幅原因,未加展开,针对比较复杂的case,本方案已经能够很好的实现图层分离,但对于更加复杂的场景,比如边缘颜色复杂度高,噪点多,边缘轮廓不明显等更复杂的case,分离的精确度还有很大的提升空间。本文作者:闲鱼技术-云听阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 21, 2018 · 2 min · jiezi

强化学习在美团“猜你喜欢”的实践

1 概述“猜你喜欢”是美团流量最大的推荐展位,位于首页最下方,产品形态为信息流,承担了帮助用户完成意图转化、发现兴趣、并向美团点评各个业务方导流的责任。经过多年迭代,目前“猜你喜欢”基线策略的排序模型是业界领先的流式更新的Wide&Deep模型[1]。考虑Point-Wise模型缺少对候选集Item之间的相关性刻画,产品体验中也存在对用户意图捕捉不充分的问题,从模型、特征入手,更深入地理解时间,仍有推荐体验和效果的提升空间。近年来,强化学习在游戏、控制等领域取得了令人瞩目的成果,我们尝试利用强化学习针对以上问题进行优化,优化目标是在推荐系统与用户的多轮交互过程中的长期收益。在过去的工作中,我们从基本的Q-Learning着手,沿着状态从低维到高维,动作从离散到连续,更新方式从离线到实时的路径进行了一些技术尝试。本文将介绍美团“猜你喜欢”展位应用强化学习的算法和工程经验。第2节介绍基于多轮交互的MDP建模,这部分和业务场景强相关,我们在用户意图建模的部分做了较多工作,初步奠定了强化学习取得正向收益的基础。第3节介绍网络结构上的优化,针对强化学习训练不稳定、难以收敛、学习效率低、要求海量训练数据的问题,我们结合线上A/B Test的线上场景改进了DDPG模型,取得了稳定的正向收益。第4节介绍轻量级实时DRL框架的工作,其中针对TensorFlow对Online Learning支持不够好和TF serving更新模型时平响骤升的问题做了一些优化。图1 美团首页“猜你喜欢”场景2 MDP建模在“猜你喜欢“展位中,用户可以通过翻页来实现与推荐系统的多轮交互,此过程中推荐系统能够感知用户的实时行为,从而更加理解用户,在接下来的交互中提供更好的体验。“猜你喜欢”用户-翻页次数的分布是一个长尾的分布,在图2中我们把用户数取了对数。可知多轮交互确实天然存在于推荐场景中。图2 “猜你喜欢”展位用户翻页情况统计在这样的多轮交互中,我们把推荐系统看作智能体(Agent),用户看作环境(Environment),推荐系统与用户的多轮交互过程可以建模为MDP<S,A,R,P>:State:Agent对Environment的观测,即用户的意图和所处场景。Action:以List-Wise粒度对推荐列表做调整,考虑长期收益对当前决策的影响。Reward:根据用户反馈给予Agent相应的奖励,为业务目标直接负责。P(s,a):Agent在当前State s下采取Action a的状态转移概率。图3 推荐系统与用户交互示意图我们的优化目标是使Agent在多轮交互中获得的收益最大化:具体而言,我们把交互过程中的MDP<A,S,R,P>建模如下:2.1 状态建模状态来自于Agent对Environment的观察,在推荐场景下即用户的意图和所处场景,我们设计了如图4所示的网络结构来提取状态的表达。网络主要分为两个部分:把用户实时行为序列的Item Embedding作为输入,使用一维CNN学习用户实时意图的表达;推荐场景其实仍然相当依赖传统特征工程,因此我们使用Dense和Embedding特征表达用户所处的时间、地点、场景,以及更长时间周期内用户行为习惯的挖掘。图4 状态建模网络结构这里我们介绍一下使用Embedding特征表达用户行为习惯挖掘的Binary Sequence[2] 方法。我们通过特征工程对用户行为序列做各种维度的抽象,做成一些列离散的N进制编码,表示每一位有N种状态。例如统计用户在1H/6H/1D/3D/1W不同时间窗口内是否有点击行为编码成5位2进制数,把这些数字作为离散特征学习Embedding表达,作为一类特征处理方法。除此之外,还有点击品类是否发生转移、点击间隔的gap等等,在“猜你喜欢”场景的排序模型和强化学习状态建模中都取得了很不错的效果。原因是在行为数据非常丰富的情况下,序列模型受限于复杂度和效率,不足以充分利用这些信息,Binary Sequence可以作为一个很好的补充。图5 序列模型和特征工程效果对照图5左侧是序列模型的部分,分别使用不同的Pooling方式和一维CNN离线效果的对比,右侧是Dense和Embedding特征的部分,分别加入用户高频行为、距离、行为时间间隔、行为次数、意图转移等特征,以及加入所有显著正向特征的离线效果。2.2 动作设计“猜你喜欢”目前使用的排序模型由两个同构的Wide&Deep模型组成,分别以点击和支付作为目标训练,最后把两个模型的输出做融合。融合方法如下图所示:图6 排序模型示意图超参数 的物理意义是调整全量数据集中点击和下单模型的Trade Off,通过综合考虑点击和下单两个任务的AUC确定,没有个性化的因素。我们以此为切入点,使用Agent的动作调整融合超参数,令:a是由Agent的策略生成Action,这样做有两个好处:其一,我们知道一个较优解是a=1,这种情况下强化学习策略和基线的排序策略保持一致,由于强化学习是个不断试错的过程,我们可以很方便地初始化Agent的策略为a=1,从而避免在实验初期伤害线上效果。其二,允许我们根据物理意义对Action做Clip,从而减轻强化学习更新过程不稳定造成的实际影响。2.3 奖励塑形“猜你喜欢”展位的优化核心指标是点击率和下单率,在每个实验分桶中分母是基本相同的,因此业务目标可以看成优化点击次数和下单次数,我们尝试将奖励塑形如下:相对于关注每个Item转化效率的Point Wise粒度的排序模型,强化学习的目标是最大化多轮交互中的奖励收益,为业务目标直接负责。图7 加入惩罚项前后的相对效果变化在实验过程中我们发现,强化学习的策略可能上线初期效果很好,在点击和下单指标上都取得了一定的提升,但在后续会逐渐下降,如图7前半段所示。在逐层转化效率的分析中,我们发现强化学习分桶的设备曝光率和UV维度点击率有所降低,而用户停留时长和浏览深度稳定提升,这说明Agent学习到了让用户与推荐系统更多交互,从而获取更多曝光和转化机会的策略,但这种策略对于部分强烈下单意图用户的体验是有伤害的,因为这部分用户意图转化的代价变高了,因而对展位的期望变低。针对这种情况,我们在奖励塑形中加入两个惩罚项:惩罚没有发生任何转化(点击/下单)行为的中间交互页面(penalty1),从而让模型学习用户意图转化的最短路;惩罚没有发生任何转化且用户离开的页面(penalty2),从而保护用户体验。修正后的奖励为:由于用户体验是时间连续的,UV维度的效果在报表上有一定的滞后性,约一周后点击率和万订单恢复到正向水平,同时用户停留时长和浏览深度有进一步提升,说明Agent确实学到了在避免伤害用户的前提下,从多轮交互中获取更多转化的策略,如图7后半段所示。这一节我们介绍了MDP建模相关的工作。MDP跟业务场景是强相关的,经验不是很容易迁移。就本文的场景而言,我们花了较多精力做状态表达的特征,这部分工作使强化学习得到了在自己的目标上取得正向收益的能力,因此对这部分介绍比较细致。动作设计是针对多目标模型融合的场景,是个业界普遍存在并且监督学习不太适用的场景,也能体现强化学习的能力。奖励塑形是为了缩小强化学习的目标和业务目标之间的Gap,需要在数据洞察和业务理解上做一些工作。完成上述工作后强化学习在自己的目标和业务指标上已经能取得了一些正向效果,但不够稳定。另外由于策略迭代是个Online Learning的过程,实验上线后需要实时训练一周才能收敛并观察效果,这也严重影响了我们的迭代效率。针对这些情况我们针对模型做了一些改进。3 改进的DDPG模型在模型方面,我们在不断改进MDP建模的过程中先后尝试了Q-Learning、DQN[3]和DDPG[4]模型,也面临着强化学习中普遍存在更新不够稳定、训练过程容易不收敛、学习效率较低(这里指样本利用效率低,因此需要海量样本)的问题。具体到推荐场景中,由于List-Wise维度的样本比Point-Wise少得多,以及需要真实的动作和反馈作为训练样本,因此我们只能用实验组的小流量做实时训练。这样一来训练数据量相对就比较少,每天仅有几十万,迭代效率较低。为此我们对网络结构做了一些改进,包括引入具体的Advantage函数、State权值共享、On-Policy策略的优化,结合线上A/B Test框架做了十数倍的数据增强,以及对预训练的支持。接下来我们以DDPG为基石,介绍模型改进的工作。图8 DDPG模型如图8所示,基本的DDPG是Actor-Critic架构。线上使用Actor网络,预测当前State下最好的动作a,并通过Ornstein-Uhlenbeck过程对预测的Action加一个随机噪声得到a’,从而达到在最优策略附近探索的目的。将a’ 作用于线上,并从用户(Environment)获得相应的收益。训练过程中,Critic学习估计当前状态s下采取动作a获得的收益,使用MSE作为Loss Function:对参数求导:Actor使用Critic反向传播的策略梯度,使用梯度上升的方法最大化Q估计,从而不断优化策略:在确定性策略梯度的公式中,是策略的参数,Agent将使用策略(s)在状态s 生成动作a,(指数关系)表示该策略下的状态转移概率。在整个学习过程中,我们不需要真的估计策略的价值,只需要根据Critic返回的策略梯度最大化Q估计。Critic不断优化自己对Q(s,a)的估计,Actor通过Critic的判断的梯度,求解更好的策略函数。如此往复,直到Actor收敛到最优策略的同时,Critic收敛到最准确的Q(s,a)估计。接下来基于这些我们介绍的DDPG模型改进的工作。3.1 Advantage函数借鉴DDQN[5]的优势函数Advantage的思路,我们把critic估计的Q(s,a)拆分成两个部分:只与状态相关的V(s),与状态、动作都相关的Advantage函数A(s,a),有Q(s,a) = V(s) + A(s,a),这样能够缓解critic对Q过高估计的问题。具体到推荐环境中,我们的策略只是对排序模型的融合参数做调整,收益主要是由状态决定的。图9 实验组与基线的Q值对比如图9所示,在实际实验中观察V(s)和A(s,a)均值的比值大约为97:3,可以验证我们的这一判断。在实际训练过程中,我们先根据状态和收益训练V(s),再使用Q(s,a)-V(s)的残差训练A(s,a),很大程度上提升了训练稳定性,并且我们可以通过残差较为直观地观测到到当前策略是否优于基线。图8中A(s,a)稳定大于0,可以认为强化学习在自己的目标上取得了稳定的正向收益。3.2 State权值共享受A3C[6]网络的启发,我们观察到DDPG的网络中Actor和Critic网络中都有State的表达,而在我们的场景中大部分参数都集中在State的部分,在十万量级,其他参数只有数千,因此我们尝试把State部分的权重做共享,这样可以减少约一半的训练参数。图10 使用advantage函数并做state权值共享改进后的网络结构如图10所示。对于这个网络结构,我们注意到有V(s)的分支和动作不相关,意即我们不需要具体的Action也可以学习该State下Q的期望,这就允许我们在线下使用基线策略千万级的数据量做预训练,线上也同时使用基线和实验流量做实时更新,从而提升训练的效果和稳定性。又因为这条更新路径包含了所有State的参数,模型的大部分参数都可以得到充分的预训练,只有Action相关的参数必须依赖Online Learning的部分,这就大幅提高了我们的实验迭代效率。原来我们需要上线后等待一周训练再观察效果,改进后上线第二天就可以开始观察效果。3.3 On-policy在A2C[7]的论文里作者论述了他们的见解:同步A2C实现比异步实现的A3C表现要好。目前尚未看到任何证据证明异步引入的噪声能够提供任何性能收益,因此为了提升训练效率,我们采取了这个做法,使用同一套参数估计Q_{t+1}和更新Q_t,从而使模型参数再次减半。3.4 扩展到多组并行策略考虑多组强化学习实验同时在线的情况,结合A/B Test环境特点,我们把以上网络框架扩展到多Agent的情况。图11 支持多组线上实验DDPG模型如图11所示,线上多组实验共享State表达和V(s)的估计,每个策略训练自己的A(s,a)网络且能快速收敛,这样的结构一方面使训练过程更加稳定,另一方面为强化学习策略全量提供了可能性。图12 点击率分天实验效果在DDPG的改造工作中,我们使用Advantage函数获得更稳定的训练过程和策略梯度。State权值共享和On-Policy方法使我们的模型参数减少75%。Advantage函数和State权值共享结合,允许我们使用基线策略样本做数据增强,使每天的训练样本从十万量级扩展到百万量级,同时充分的预训练保证策略上线后能迅速收敛。经过这些努力,强化学习线上实验取得了稳定的正向效果,在下单率效果持平的情况下,周效果点击率相对提升0.5%,平均停留时长相对提升0.3%,浏览深度相对提升0.3%。修改过的模型与A2C的主要区别是我们仍然使用确定性策略梯度,这样我们可以少估计一个动作的分布,即随机策略方差降至0的特例。图12表明强化实习的效果是稳定的,由于“猜你喜欢”的排序模型已经是业界领先的流式DNN模型,我们认为这个提升是较为显著的。4 基于TF的轻量级实时DRL系统强化学习通常是在一次次试错(Trial-and-Error)中学习,实时地改进策略并获得反馈能大幅提升学习效率,尤其在连续策略中。这一点在游戏场景下很容易理解,相应地,我们也在推荐系统中构建了实时深度学习系统,让策略更新更加高效。为了支持实时更新的DRL模型和高效实验,我们针对Online Learning的需求,基于TensorFlow及TF Serving做了一些改进和优化,设计并实现了一套特征配置化的实时更新的DRL框架,在实验迭代过程中沉淀了DQN、DDQN、DDPG、A3C、A2C、PPO[8]等模型。系统架构如图13所示:图13 实时更新的强化学习框架训练部分工作流如下:Online Joiner从Kafka中实时收集特征和用户反馈,拼接成Point-Wise粒度的Label-Feature样本,并把样本输出到Kafka和HDFS,分别支持在线和离线更新。Experience Collector收集上述样本,合并为List-Wise的请求粒度,并根据请求时间戳拼接成[<State, Action, Reward>]列表形式的MC Episode,再经过状态转移计算拆分成 <s_t, a_t, r_t, s_{t+1}> 形式的TD Instance,输出MC或TD格式的样本支持RL训练。Trainer做输入特征的预处理,使用TensorFlow训练DRL模型。Version Controller负责调度任务保证实效性和质量,并把训练完成且指标符合预期模型推送到TF Serving和Tair中,这部分只需要Actor相关的参数。Tair作为弥补TF在Online Learning短板辅助的PS,后面会具体介绍。Monitor监控和记录整个训练流程中的数据量和训练指标,对不符合预期的情况发出线上告警。新模型上线前会先做离线的Pre-Train,使用基线策略的数据学习State的表达和Value net。上线后实时同时更新Actor,Advantage和Value的参数。线上预测部分,推荐系统的Agent从Tair获取预处理参数,并将处理后的特征喂给TF Serving做前向传播,得到Action并对展现给用户的排序结果做相应的干预。针对TensorFLow对Online Learning支持比较弱,Serving对千万级Embedding处理效率不高的问题,我们做了一些改进:在线上特征的分布会随时间而改变,针对Dense特征我们自己维护增量的Z-Score算法对特征做预处理。Embedding特征的输入维度也经常发生变化,而TF不支持变长的Input Dimention,为此我们维护了全量的ID-Embedding映射,每次训练让模型加载当前样本集合中的高频Embedding。千万级Item Embedding会大幅降低训练和预测的效率,为此我们把这部分映射在预处理中,把映射后的矩阵直接作为CNN的输入。为了提升特征工程的实验效率,支持特征配置化生成模型结构。此外,TF serving在更新模型一两分钟内响应时间会骤然升高,导致很多请求超时,原因有二,其一,serving的模型加载和请求共用一个线程池,导致切换模型使阻塞处理请求;其二,计算图初始化是lazy的,这样新模型后的第一次请求需要等待计算图初始化。这个问题在更新模型频Low对online learning支持比较弱繁的Online Learning场景影响较大,我们采用切分线程池和warm up初始化的方式解决。更具体的方案和效果可以参考美团另一篇技术博客[9]。5 总结和展望强化学习是目前深度学习领域发展最快的方向之一,其与推荐系统和排序模型的结合也有更多价值等待发掘。本文介绍了强化学习在美团“猜你喜欢”排序场景落地的工作,包括根据业务场景不断调整的MDP建模,使强化学习能够取得一定的正向收益;通过改进DDPG做数据增强,提升模型的鲁棒性和实验效率,从而取得稳定的正向收益;以及基于TensorFlow的实时DRL框架,为高效并行策略迭代提供了基础。经过一段时间的迭代优化,我们在强化学习方面也积累了一些经验,与传统的监督学习相比,强化学习的价值主要体现在:灵活的奖励塑形,能支持各种业务目标建模,包括不限于点击率、转化率、GMV、停留时长、浏览深度等,支持多目标融合,为业务目标直接负责。充满想象空间的动作设计,不需要直接的Label,而是通过网络来生成和评价策略,适合作为监督学习的补充。这点和GAN有相通之处。考虑优化长期收益对当前决策造成的影响,Agent与Environment交互频繁的场景更加能体现强化学习的价值。同时强化学习作为机器学习的一个分支,很多机器学习的经验仍然适用于此。比如数据和特征决定效果的上限,模型和算法只是不断逼近它。对于强化学习而言特征空间主要包含在状态的建模中,我们强烈建议在状态建模上多做一些尝试,并信任模型有能力从中做出判断。再如,使用更多的训练数据降低经验风险,更少的参数降低结构风险的思路对强化学习仍然适用,因此我们认为DDPG的改进工作能够推广到不同业务的线上A/B Test场景中。此外,我们在训练过程中也遇到了强化学习对随机性敏感的问题[10],为此我们线上使用了多组随机种子同时训练,选择表现最好的一组参数用于实际参数更新。在目前的方案中,我们尝试的Action是调整模型融合参数,主要考虑这是个排序问题中比较通用的场景,也适合体现强化学习的能力,而实际上对排序结果的干预能力是比较有限的。未来我们会探索不同品类、位置、价格区间等跟用户意图场景强相关属性的召回个数,调整排序模型隐层参数等方向。另外在解决学习效率低下的问题上,还将尝试Priority Sampling 提高样本利用效率,Curious Networks提升探索效率等方法。也欢迎对强化学习感兴趣的朋友们与我们联系,一起交流探索强化学习在工业界的应用与发展,同时对文章的错漏之处也欢迎大家批评指正。参考文献[1] Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson, Greg Corrado, Wei Chai, Mustafa Ispir, Rohan Anil, Zakaria Haque, Lichan Hong, Vihan Jain, Xiaobing Liu, and Hemal Shah. Wide & deep learning for recommender systems. CoRR, 2016.[2] Yan, P., Zhou, X., Duan, Y. E-commerce item recommendation based on field-aware FactorizationMachine. In: Proceedings of the 2015 International ACM Recommender Systems Challenge, 2015.[3] Mnih, Volodymyr, Kavukcuoglu, Koray, Silver, David, Rusu, Andrei A, Veness, Joel, Bellemare,Marc G, Graves, Alex, Riedmiller, Martin, Fidjeland, Andreas K, Ostrovski, Georg, et al. Humanlevelcontrol through deep reinforcement learning. Nature, 2015.[4] Lillicrap, T., Hunt, J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., Silver, D., and Wierstra, D. Continuous control with deep reinforcement learning. In International Conference, 2015on Learning Representations, 2016.[5] Wang, Z., de Freitas, N., and Lanctot, M. Dueling network architectures for deep reinforcementlearning. Technical report, 2015.[6] Volodymyr Mnih, Adria Puigdomenech Badia, Mehdi Mirza, Alex Graves, Tim-othy P. Lillicrap, Tim Harley, David Silver, and Koray Kavukcuoglu. Asyn-chronous methods for deep reinforcement learning. ICML, 2016[7] Y. Wu, E. Mansimov, S. Liao, R. Grosse, and J. Ba. Scalable trust-region method for deep reinforcementlearning using kronecker-factored approximation. arXiv preprint arXiv:1708.05144, 2017.[8] Schulman, J.; Wolski, F.; Dhariwal, P.; Radford, A.; and Klimov,O. Proximal policy optimization algorithms. arXiv preprintarXiv:1707.06347, 2017[9] 仲达, 鸿杰, 廷稳. 基于TensorFlow Serving的深度学习在线预估. MT Bolg, 2018[10] P. Henderson, R. Islam, P. Bachman, J. Pineau, D. Precup, and D. Meger. Deep reinforcement learningthat matters. arXiv:1709.06560, 2017.作者简介段瑾,2015年加入美团点评,目前负责强化学习在推荐场景的落地工作。 ...

November 16, 2018 · 2 min · jiezi

用“活着的”CNN进行验证码识别

1 验证码验证码( CAPTCHA )是一种区分用户是计算机或人的公共全自动程序。在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答 CAPTCHA 的问题,所以回答出问题的用户就可以被认为是人类。2 CNN 验证码识别传统的方法是通过两个不相关的步骤来进行文字识别:1)将图片中的文字的位置进行定位,然后通过“小框”来切分,将图片中的文字剪切下来 2)再进行识别。但是在现今的验证码识别中,当要识别的图片中的文字变成手写体互相重叠,这种“切分”法就难以排上用场。因此卷积神经网络(CNN)就被用来识别这些无从下手的手写体。这种CNN 是通过一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成来对图像识别。CNN 训练模型需要大量的人工标注的图片来训练,但是本文方法就是自主产生随机的字符并产生相应的图片来在运行过程中调整参数。本文关注具有 4 个字符的的验证码图片。每个字符在输出层被表现为 62 个神经元。我们可以假设一个映射函数即:将前 62 个神经元分配给序列中的第一个字符,第二批 62 个神经元分配给序列中的第二个字符。因此,对于字符xi所对应的神经元的索引为输出层一共有 462=128 个。如果第一个预测字符的索引为 c0=52,因此可以反推预测的字符为3 实现步骤1 验证码生成1 验证码中的字符number = [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]ALPHABET = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’]alphabet = [‘a’, ‘b’, ‘c’, ’d’, ’e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ’l’, ’m’, ’n’, ‘o’, ‘p’, ‘q’, ‘r’, ’s’, ’t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’]gen_char_set = number + ALPHABET # 用于生成验证码的数据集2 生成验证码的字符 # char_set=number + alphabet + ALPHABET, char_set=gen_char_set, # char_set=number, captcha_size=4): """ 生成随机字符串,4位 :param char_set: :param captcha_size: :return: """ captcha_text = [] for i in range(captcha_size): c = random.choice(char_set) captcha_text.append(c) return captcha_text3 按照字符生成对应的验证码def gen_captcha_text_and_image(): """ 生成字符对应的验证码 :return: """ image = ImageCaptcha() captcha_text = random_captcha_text() captcha_text = ‘’.join(captcha_text) captcha = image.generate(captcha_text) captcha_image = Image.open(captcha) captcha_image = np.array(captcha_image) return captcha_text, captcha_image4 训练def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1): “““1 定义CNN cnn在图像大小是2的倍数时性能最高, 如果你用的图像大小不是2的倍数,可以在图像边缘补无用像素。 np.pad(image,((2,3),(2,2)), ‘constant’, constant_values=(255,)) # 在图像上补2行,下补3行,左补2行,右补2行 "”” x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1]) # w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHTIMAGE_WIDTH)) # # w_c2_alpha = np.sqrt(2.0/(3332)) # w_c3_alpha = np.sqrt(2.0/(3364)) # w_d1_alpha = np.sqrt(2.0/(83264)) # out_alpha = np.sqrt(2.0/1024) # 3 conv layer w_c1 = tf.Variable(w_alpha * tf.random_normal([3, 3, 1, 32])) b_c1 = tf.Variable(b_alpha * tf.random_normal([32])) conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding=‘SAME’), b_c1)) conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME’) conv1 = tf.nn.dropout(conv1, keep_prob) w_c2 = tf.Variable(w_alpha * tf.random_normal([3, 3, 32, 64])) b_c2 = tf.Variable(b_alpha * tf.random_normal([64])) conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding=‘SAME’), b_c2)) conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME’) conv2 = tf.nn.dropout(conv2, keep_prob) w_c3 = tf.Variable(w_alpha * tf.random_normal([3, 3, 64, 64])) b_c3 = tf.Variable(b_alpha * tf.random_normal([64])) conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding=‘SAME’), b_c3)) conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME’) conv3 = tf.nn.dropout(conv3, keep_prob) # Fully connected layer w_d = tf.Variable(w_alpha * tf.random_normal([8 * 20 * 64, 1024])) b_d = tf.Variable(b_alpha * tf.random_normal([1024])) dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]]) dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d)) dense = tf.nn.dropout(dense, keep_prob) w_out = tf.Variable(w_alpha * tf.random_normal([1024, MAX_CAPTCHA * CHAR_SET_LEN])) b_out = tf.Variable(b_alpha * tf.random_normal([MAX_CAPTCHA * CHAR_SET_LEN])) out = tf.add(tf.matmul(dense, w_out), b_out) # 36*4 # out = tf.reshape(out, (CHAR_SET_LEN, MAX_CAPTCHA)) # 重新变成4,36的形状 # out = tf.nn.softmax(out) return out由于时间和设备的限制,我在验证码生成字符串中删去了英文字母只剩下了数字进行训练。要不然可以算到地老天荒也还是3%的准确率。下图是gen_char_set = number + ALPHABET的训练1万多步的结果的训练截图5 总结本文采用了“活着的 CNN”进行验证码识别,可以免去大量进行人工标注的步骤,对工作效率有不小的提升。文 / JoeCDC数学爱好者编 / 荧声本文已由作者授权发布,版权属于创宇前端。欢迎注明出处转载本文。本文链接:https://knownsec-fed.com/2018…想要订阅更多来自知道创宇开发一线的分享,请搜索关注我们的微信公众号:乐趣区。欢迎留言讨论,我们会尽可能回复。欢迎点赞、收藏、留言评论、转发分享和打赏支持我们。打赏将被完全转交给文章作者。感谢您的阅读。 ...

November 1, 2018 · 2 min · jiezi

当深度学习遇见自动文本摘要

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由columneditor发表于云+社区专栏作者:姚均霖导语 :随着近几年文本信息的爆发式增长,人们每天能接触到海量的文本信息,如新闻、博客、聊天、报告、论文、微博等。从大量文本信息中提取重要的内容,已成为我们的一个迫切需求,而自动文本摘要(automatic text summarization)则提供了一个高效的解决方案。介绍随着近几年文本信息的爆发式增长,人们每天能接触到海量的文本信息,如新闻、博客、聊天、报告、论文、微博等。从大量文本信息中提取重要的内容,已成为我们的一个迫切需求,而自动文本摘要(automatic text summarization)则提供了一个高效的解决方案。根据Radev的定义[3],摘要是“一段从一份或多份文本中提取出来的文字,它包含了原文本中的重要信息,其长度不超过或远少于原文本的一半”。自动文本摘要旨在通过机器自动输出简洁、流畅、保留关键信息的摘要。自动文本摘要有非常多的应用场景,如自动报告生成、新闻标题生成、搜索结果预览等。此外,自动文本摘要也可以为下游任务提供支持。尽管对自动文本摘要有庞大的需求,这个领域的发展却比较缓慢。对计算机而言,生成摘要是一件很有挑战性的任务。从一份或多份文本生成一份合格摘要,要求计算机在阅读原文本后理解其内容,并根据轻重缓急对内容进行取舍,裁剪和拼接内容,最后生成流畅的短文本。因此,自动文本摘要需要依靠自然语言处理/理解的相关理论,是近几年来的重要研究方向之一。自动文本摘要通常可分为两类,分别是抽取式(extractive)和生成式(abstractive)。抽取式摘要判断原文本中重要的句子,抽取这些句子成为一篇摘要。而生成式方法则应用先进的自然语言处理的算法,通过转述、同义替换、句子缩写等技术,生成更凝练简洁的摘要。比起抽取式,生成式更接近人进行摘要的过程。历史上,抽取式的效果通常优于生成式。伴随深度神经网络的兴起和研究,基于神经网络的生成式文本摘要得到快速发展,并取得了不错的成绩。本文主要介绍基于深度神经网络的生成式自动文本摘要,着重讨论典型的摘要模型,并介绍如何评价自动生成的摘要。对抽取式和不基于深度神经网络的生成式自动文本摘要感兴趣的同学可以参考1。生成式文本摘要生成式文本摘要以一种更接近于人的方式生成摘要,这就要求生成式模型有更强的表征、理解、生成文本的能力。传统方法很难实现这些能力,而近几年来快速发展的深度神经网络因其强大的表征(representation)能力,提供了更多的可能性,在图像分类、机器翻译等领域不断推进机器智能的极限。借助深度神经网络,生成式自动文本摘要也有了令人瞩目的发展,不少生成式神经网络模型(neural-network-based abstractive summarization model)在DUC-2004测试集上已经超越了最好的抽取式模型[4]。这部分文章主要介绍生成式神经网络模型的基本结构及最新成果。基本模型结构生成式神经网络模型的基本结构主要由编码器(encoder)和解码器(decoder)组成,编码和解码都由神经网络实现。编码器负责将输入的原文本编码成一个向量(context),该向量是原文本的一个表征,包含了文本背景。而解码器负责从这个向量提取重要信息、加工剪辑,生成文本摘要。这套架构被称作Sequence-to-Sequence(以下简称Seq2Seq),被广泛应用于存在输入序列和输出序列的场景,比如机器翻译(一种语言序列到另一种语言序列)、image captioning(图片像素序列到语言序列)、对话机器人(如问题到回答)等。Seq2Seq架构中的编码器和解码器通常由递归神经网络(RNN)或卷积神经网络(CNN)实现。基于递归神经网络的模型RNN被称为递归神经网络,是因为它的输出不仅依赖于输入,还依赖上一时刻输出。如上图所示,t时刻的输出h不仅依赖t时刻的输入x,还依赖t-1时刻的输出,而t-1的输出又依赖t-1的输入和t-2输出,如此递归,时序上的依赖使RNN在理论上能在某时刻输出时,考虑到所有过去时刻的输入信息,特别适合时序数据,如文本、语音、金融数据等。因此,基于RNN实现Seq2Seq架构处理文本任务是一个自然的想法。典型的基于RNN的Seq2Seq架构如下图所示:图中展示的是一个用于自动回复邮件的模型,它的编码器和解码器分别由四层RNN的变种LSTM[5]组成。图中的向量thought vector编码了输入文本信息(Are you free tomorrow?),解码器获得这个向量依次解码生成目标文本(Yes, what’s up?)。上述模型也可以自然地用于自动文本摘要任务,这时的输入为原文本(如新闻),输出为摘要(如新闻标题)。目前最好的基于RNN的Seq2Seq生成式文本摘要模型之一来自Salesforce,在基本的模型架构上,使用了注意力机制(attention mechanism)和强化学习(reinforcement learning)。这个模型将在下文中详细介绍。基于卷积神经网络的模型 Seq2Seq同样也可以通过CNN实现。不同于递归神经网络可以直观地应用到时序数据,CNN最初只被用于图像任务[6]。CNN通过卷积核(上图的A和B)从图像中提取特征(features),间隔地对特征作用max pooling,得到不同阶层的、由简单到复杂的特征,如线、面、复杂图形模式等,如下图所示。CNN的优势是能提取出hierarchical的特征,并且能并行高效地进行卷积操作,那么是否能将CNN应用到文本任务中呢?原生的字符串文本并不能提供这种可能性,然而,一旦将文本表现成分布式向量(distributed representation/word embedding)[7],我们就可以用一个实数矩阵/向量表示一句话/一个词。这样的分布式向量使我们能够在文本任务中应用CNN。如上图所示,原文本(wait for the video and do n’t rent it)由一个实数矩阵表示,这个矩阵可以类比成一张图像的像素矩阵,CNN可以像“阅读”图像一样“阅读”文本,学习并提取特征。虽然CNN提取的文本特征并不像图像特征有显然的可解释性并能够被可视化,CNN抽取的文本特征可以类比自然语言处理中的分析树(syntactic parsing tree),代表一句话的语法层级结构。基于卷积神经网络的自动文本摘要模型中最具代表性的是由Facebook提出的ConvS2S模型[9],它的编码器和解码器都由CNN实现,同时也加入了注意力机制,下文将详细介绍。当然,我们不仅可以用同一种神经网络实现编码器和解码器,也可以用不同的网络,如编码器基于CNN,解码器基于RNN。前沿A Deep Reinforced Model for Abstractive Summarization这是由Salesforce研究发表的基于RNN的生成式自动文本摘要模型,通过架构创新和若干tricks提升模型概括长文本的能力,在CNN/Daily Mail、New York Times数据集上达到了新的state-of-the-art(最佳性能)。针对长文本生成摘要在文本摘要领域是一项比较困难的任务,即使是过去最好的深度神经网络模型,在处理这项任务时,也会出现生成不通顺、重复词句等问题。为了解决上述问题,模型作者提出了内注意力机制(intra-attention mechanism)和新的训练方法,有效地提升了文本摘要的生成质量。模型里应用了两套注意力机制,分别是1)经典的解码器-编码器注意力机制,和2)解码器内部的注意力机制。前者使解码器在生成结果时,能动态地、按需求地获得输入端的信息,后者则使模型能关注到已生成的词,帮助解决生成长句子时容易重复同一词句的问题。模型的另一创新,是提出了混合式学习目标,融合了监督式学习(teacher forcing)和强化学习(reinforcement learning)。首先,该学习目标包含了传统的最大似然。最大似然(MLE)在语言建模等任务中是一个经典的训练目标,旨在最大化句子中单词的联合概率分布,从而使模型学习到语言的概率分布。但对于文本摘要,仅仅考虑最大似然并不够。主要有两个原因,一是监督式训练有参考“答案”,但投入应用、生成摘要时却没有。比如t时刻生成的词是"tech",而参考摘要中是"science",那么在监督式训练中生成t+1时刻的词时,输入是"science",因此错误并没有积累。但在实际应用中,由于没有ground truth,t+1时刻的输入是错误的"tech"。这样引起的后果是因为没有纠正,错误会积累,这个问题被称为exposure bias。另一个原因是,往往在监督式训练中,对一篇文本一般只提供一个参考摘要,基于MLE的监督式训练只鼓励模型生成一模一样的摘要,然而正如在介绍中提到的,对于一篇文本,往往可以有不同的摘要,因此监督式学习的要求太过绝对。与此相反,用于评价生成摘要的ROUGE指标却能考虑到这一灵活性,通过比较参考摘要和生成的摘要,给出摘要的评价(见下文评估摘要部分)。所以希望在训练时引入ROUGE指标。但由于ROUGE并不可导的,传统的求梯度+backpropagation并不能直接应用到ROUGE。因此,一个很自然的想法是,利用强化学习将ROUGE指标加入训练目标。那么我们是怎么通过强化学习使模型针对ROUGE进行优化呢?简单说来,模型先以前向模式(inference)生成摘要样本,用ROUGE指标测评打分,得到了对这个样本的评价/回报(reward)后,再根据回报更新模型参数:如果模型生成的样本reward较高,那么鼓励模型;如果生成的样本评价较低,那么抑制模型输出此类样本。最终的训练目标是最大似然和基于ROUGE指标的函数的加权平均,这两个子目标各司其职:最大似然承担了建立好的语言模型的责任,使模型生成语法正确、文字流畅的文本;而ROUGE指标则降低exposure bias,允许摘要拥有更多的灵活性,同时针对ROUGE的优化也直接提升了模型的ROUGE评分。构建一个好的模型,除了在架构上需要有创新,也需要一些小技巧,这个模型也不例外。在论文中,作者使用了下列技巧:使用指针处理未知词(OOV)问题;共享解码器权重,加快训练时模型的收敛;人工规则,规定不能重复出现连续的三个词。综上所述,深度学习+强化学习是一个很好的思路,这个模型第一次将强化学习应用到文本摘要任务中,取得了不错的表现。相信同样的思路还可以用在其他任务中。Convolutional Sequence to Sequence LearningConvS2S模型由Facebook的AI实验室提出,它的编码器和解码器都是基于卷积神经网络搭建的。这个模型主要用于机器翻译任务,在论文发表的时候,在英-德、英-法两个翻译任务上都达到了state-of-the-art。同时,作者也尝试将该模型用于自动文本摘要,实验结果显示,基于CNN的Seq2Seq模型也能在文本摘要任务中达到接近state-of-the-art的表现。模型架构如下图所示。乍看之下,模型很复杂,但实际上,它的每个部分都比较直观,下面通过分解成子模块,详细介绍ConvS2S。首先来看embedding部分。这个模型的embedding比较新颖,除了传统的semantic embedding/word embedding,还加入了position embedding,将词序表示成分布式向量,使模型获得词序和位置信息,模拟RNN对词序的感知。最后的embedding是语义和词序embedding的简单求和。之后,词语的embedding作为输入进入到模型的卷积模块。这个卷积模块可以视作是经典的卷积加上非线性变换。虽然图中只画出一层的情况,实际上可以像经典的卷积层一样,层层叠加。这里着重介绍非线性变换。该非线性变换被称为Gated Linear Unit (GLU)[10]。它将卷积后的结果分成两部分,对其中一部分作用sigmoid变换,即映射到0到1的区间之后,和另一部分向量进行element-wise乘积。这个设计让人联想到LSTM中的门结构。GLU从某种程度上说,是在模仿LSTM和GRU中的门结构,使网络有能力控制信息流的传递,GLU在language modeling被证明是非常有效的[10]。除了将门架构和卷积层结合,作者还使用了残差连接(residual connection)[11]。residual connection能帮助构建更深的网络,缓解梯度消失/爆炸等问题。除了使用加强版的卷积网络,模型还引入了带多跳结构的注意力机制(multi-step attention)。不同于以往的注意力机制,多跳式注意力不仅要求解码器的最后一层卷积块关注输入和输出信息,而且还要求每一层卷积块都执行同样的注意力机制。如此复杂的注意力机制使模型能获得更多的历史信息,如哪些输入已经被关注过。像A Deep Reinforced Model for Abstractive Summarization一样,ConvS2S的成功之处不仅在于创新的结构,还在于细致入微的小技巧。在ConvS2S中,作者对参数使用了非常仔细的初始化和规范化(normalization),稳定了方差和训练过程。这个模型的成功证明了CNN同样能应用到文本任务中,通过层级表征长程依赖(long-range dependency)。同时,由于CNN具有可高度并行化的特点,所以CNN的训练比RNN更高效。比起RNN,CNN的不足是有更多的参数需要调节。评估摘要评估一篇摘要的质量是一件比较困难的任务。对于一篇摘要而言,很难说有标准答案。不同于很多拥有客观评判标准的任务,摘要的评判一定程度上依赖主观判断。即使在摘要任务中,有关于语法正确性、语言流畅性、关键信息完整度等标准,摘要的评价还是如同”一千个人眼里有一千个哈姆雷特“一样,每个人对摘要的优劣都有自己的准绳。自上世纪九十年代末开始,一些会议或组织开始致力于制定摘要评价的标准,他们也会参与评价一些自动文本摘要。比较著名的会议或组织包括SUMMAC,DUC(Document Understanding Conference),TAC(Text Analysis Conference)等。其中DUC的摘要任务被广泛研究,大多数abstractive摘要模型在DUC-2004数据集上进行测试。目前,评估自动文本摘要质量主要有两种方法:人工评价方法和自动评价方法。这两类评价方法都需要完成以下三点:决定原始文本最重要的、需要保留的部分;在自动文本摘要中识别出1中的部分;基于语法和连贯性(coherence)评价摘要的可读性(readability)。人工评价方法评估一篇摘要的好坏,最简单的方法就是邀请若干专家根据标准进行人工评定。这种方法比较接近人的阅读感受,但是耗时耗力,无法用于对大规模自动文本摘要数据的评价,和自动文本摘要的应用场景并不符合。因此,文本摘要研究团队积极地研究自动评价方法。自动评价方法为了更高效地评估自动文本摘要,可以选定一个或若干指标(metrics),基于这些指标比较生成的摘要和参考摘要(人工撰写,被认为是正确的摘要)进行自动评价。目前最常用、也最受到认可的指标是ROUGE(Recall-Oriented Understudy for Gisting Evaluation)。ROUGE是Lin提出的一个指标集合,包括一些衍生的指标,最常用的有ROUGE-n,ROUGE-L,ROUGE-SU:ROUGE-n:该指标旨在通过比较生成的摘要和参考摘要的n-grams(连续的n个词)评价摘要的质量。常用的有ROUGE-1,ROUGE-2,ROUGE-3。ROUGE-L:不同于ROUGE-n,该指标基于最长公共子序列(LCS)评价摘要。如果生成的摘要和参考摘要的LCS越长,那么认为生成的摘要质量越高。该指标的不足之处在于,它要求n-grams一定是连续的。ROUGE-SU:该指标综合考虑uni-grams(n = 1)和bi-grams(n = 2),允许bi-grams的第一个字和第二个字之间插入其他词,因此比ROUGE-L更灵活。 作为自动评价指标,ROUGE和人工评定的相关度较高,在自动评价摘要中能给出有效的参考。但另一方面,从以上对ROUGE指标的描述可以看出,ROUGE基于字的对应而非语义的对应,生成的摘要在字词上与参考摘要越接近,那么它的ROUGE值将越高。但是,如果字词有区别,即使语义上类似,得到的ROUGE值就会变低。换句话说,如果一篇生成的摘要恰好是在参考摘要的基础上进行同义词替换,改写成字词完全不同的摘要,虽然这仍是一篇质量较高的摘要,但ROUGE值会呈现相反的结论。从这个极端但可能发生的例子可以看出,自动评价方法所需的指标仍然存在一些不足。目前,为了避免上述情况的发生,在evaluation时,通常会使用几篇摘要作为参考和基准,这有效地增加了ROUGE的可信度,也考虑到了摘要的不唯一性。对自动评价摘要方法的研究和探索也是目前自动文本摘要领域一个热门的研究方向。总结本文主要介绍了基于深度神经网络的生成式文本摘要,包括基本模型和最新进展,同时也介绍了如何评价自动生成的摘要。自动文本摘要是目前NLP的热门研究方向之一,从研究落地到实际业务,还有一段路要走,未来可能的发展方向有:1)模仿人撰写摘要的模式,融合抽取式和生成式模型;2)研究更好的摘要评估指标。希望本文能帮助大家更好地了解深度神经网络在自动文本摘要任务中的应用。Reference[1] Text Summarization Techniques: A Brief Survey[2] A Survey on Automatic Text Summarization[3] Introduction to the Special Issue on Summarization[4] A Deep Reinforced Model for Abstractive Summarization[5] Understanding LSTM Networks[6] LeNet5, convolutional neural networks[7] What is word embedding in deep learning[8] A Deep Reinforced Model for Abstractive Summarization[9] Convolutional Sequence to Sequence Learning[10] Language Modeling with Gated Convolutional Networks[11]Deep Residual Learning for Image Recognition问答深度学习的原理和具体实现是什么?相关阅读深度学习角度 | 图像识别将何去何从?基于深度学习的文本分类?10分钟上手,OpenCV自然场景文本检测(Python代码+实现) 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 30, 2018 · 1 min · jiezi

基于Opencv&Tensorflow实现实时查找停车位置

摘要: 一个小例子带你玩转Opencv+tensorflow~介绍你是不是经常在停车场周围转来转去寻找停车位。如果你的手机能准确地告诉你最近的停车位在哪里,那是不是很爽?事实证明,基于深度学习和OpenCV解决这个问题相对容易,只需获取停车场的实时视频即可。下面的GIF图片突出显示洛杉矶机场停车场上所有可用的停车位,并显示可用停车位的数量,关键是这一过程是实时的!你可以在Github repo找到我曾用过的代码。步骤概述构建这个停车检测模型主要有两个步骤:1.检测所有可用的停车位;2.确定停车位是空的还是被占用的;因为安装了摄像头视图,我们可以使用OpenCV对每个停车位进行一次映射。一旦你知道了每个停车位的位置,你就可以用深度学习来预测它是否空着。我已经在我的博客上分享了所涉及的一个高层次步骤的概述。如果你对详细代码感兴趣,请看看我的博客。检测所有可用停车位的位置检测停车位的基本思路是,所有的停车点的分隔线都是处于水平线,而一列中的停车点之间的间隔大致相等。首先使用Canny边缘检测来获得边缘图像。我还把没有停车的地方遮了起来。如下所示:然后我在边缘图像上做了霍夫变换,画出了它能识别的所有线。我只选择斜率接近于零的直线来隔离水平线。霍夫变换的输出如下:正如你所看到的那样,霍夫变换在识别停车线方面做得相当好,但是输出有噪声——几个停车线被多次检测到,而有些被遗漏了。那么我们如何解决这个问题呢?然后我用观察和直觉开始,通过使用霍夫变换返回的坐标,聚集x坐标来确定主要的停车道。利用聚类逻辑来识别车道线x坐标的间隔。这样就能识别出这里的12个车道。如下:如果所有这些看起来都很复杂,别担心5——我已经在github的jupyter notebook上一步一步地记录了代码。现在我已经知道了所有的停车道都在哪里,通过合理地假设所有的停车点大小都一样来识别每个单独的停车位。我仔细观察了结果,以确保尽可能准确地捕捉到点之间的边界。我终于能够标出每个停车位。如下:当完成了每个车位的定位之后,我们可以为每个点分配一个ID,并将其坐标保存在字典中并将它pickled了一下,以便以后能取回。这是可以实现的,因为安装了摄像头,我们不需要一次又一次地计算每个点在视图中的位置。更多详情请登录我的博客。识别该车位是否有标记现在我们有了每个停车位的映射,可以通过以下几种方式来确定这个停车位是否被占用:1.使用OpenCV检查视频图像中停车位的像素颜色是否与空停车位的颜色一致。这是一种简单的方法,但容易出错。例如,灯光的变化将会改变一个空停车位的颜色,在一天的光照变化中,这种方法将无法正确工作。如果有可能的话,这种逻辑会把灰色的汽车当成空停车位;2.使用目标检测来识别所有的汽车,然后检查汽车的位置是否与停车位重叠。我做了尝试,发现实时检测模型真的很难检测小尺寸的对象,检测到的车辆不超过30%;3.使用CNN检测每个停车位,并预测是否有人停车,这种方法最终效果最好。要构建一个CNN,我们需要停车位有车以及无车这两种情况的图像。我提取了每个停车位的图像,并将其保存在文件夹中,然后将这些图像分组。我还在Github上分享了这个训练文件夹。因为在1280x720像素的图像中有近550个车位,所以每个车位的大小只有15x60像素左右。下面是空车位和被占用车位的图像:然而,由于被占用车位和空车位看起来有很大的不同,这对CNN来说应该不是一个具有挑战性的问题。然而,我只有大约550张关于这两个类的图片,所以决定利用VGG的前10层,并在VGG模型的输出添加一个单一的softmax图层来进行迁移学习。你可以在这里找到这个迁移学习模型的代码,准确率达到94%。见下文:现在,我将停车位检测和CNN预测器结合起来,构建了一个停车位检测器,准确率非常高。我还在notebook记录了在视频流上运行这个的代码。结论对于联合不同的工具和使用深度学习来构建实际应用程序这么容易我感到很惊奇,我在两个下午完成了这项工作。准备进一步探索的其他几个想法:1.如果可以将车位检测逻辑扩展到任何可能使用深度学习的车位地图上,那就太好了,OpenCV对每个用例进行调优有限制;2.CNN使用的VGG模型是一个重量化模型,想要尝试更轻量化的模型。云服务器99元拼团购!拉新还可赢现金红包!300万等你瓜分!马上一键开团赢红包: http://click.aliyun.com/m/1000019899/本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

October 30, 2018 · 1 min · jiezi

数据科学家应当了解的五个统计基本概念

摘要: 本文讲述了数据科学家应当了解的五个统计基本概念:统计特征、概率分布、降维、过采样/欠采样、贝叶斯统计从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视化形式,会给你更加全面的信息。但是,通过统计学我们可以以更富有信息驱动力和针对性的方式对数据进行操作。所涉及的数学理论帮助我们形成数据的具体结论,而不仅仅是猜测。利用统计学,我们可以更深入、更细致地观察数据是如何进行精确组织的,并且基于这种组织结构,如何能够以最佳的形式来应用其它相关的技术以获取更多的信息。今天,我们来看看数据科学家需要掌握的5个基本的统计学概念,以及如何有效地进行应用。特征统计特征统计可能是数据科学中最常用的统计学概念。它是你在研究数据集时经常使用的统计技术,包括偏差、方差、平均值、中位数、百分数等等。理解特征统计并且在代码中实现都是非常容易的。请看下图:上图中,中间的直线表示数据的中位数。中位数用在平均值上,因为它对异常值更具有鲁棒性。第一个四分位数本质上是第二十五百分位数,即数据中的25%要低于该值。第三个四分位数是第七十五百分位数,即数据中的75%要低于该值。而最大值和最小值表示该数据范围的上下两端。箱形图很好地说明了基本统计特征的作用:当箱形图很短时,就意味着很多数据点是相似的,因为很多值是在一个很小的范围内分布;当箱形图较高时,就意味着大部分的数据点之间的差异很大,因为这些值分布的很广;如果中位数接近了底部,那么大部分的数据具有较低的值。如果中位数比较接近顶部,那么大多数的数据具有更高的值。基本上,如果中位线不在框的中间,那么就表明了是偏斜数据;如果框上下两边的线很长表示数据具有很高的标准偏差和方差,意味着这些值被分散了,并且变化非常大。如果在框的一边有长线,另一边的不长,那么数据可能只在一个方向上变化很大;概率分布我们可以将概率定义为一些事件将要发生的可能性大小,以百分数来表示。在数据科学领域中,这通常被量化到0到1的区间范围内,其中0表示事件确定不会发生,而1表示事件确定会发生。那么,概率分布就是表示所有可能值出现的几率的函数。请看下图:常见的概率分布,均匀分布(上)、正态分布(中间)、泊松分布(下):均匀分布是其中最基本的概率分布方式。它有一个只出现在一定范围内的值,而在该范围之外的都是0。我们也可以把它考虑为是一个具有两个分类的变量:0或另一个值。分类变量可能具有除0之外的多个值,但我们仍然可以将其可视化为多个均匀分布的分段函数;正态分布,通常也称为高斯分布,具体是由它的平均值和标准偏差来定义的。平均值是在空间上来回变化位置进行分布的,而标准偏差控制着它的分布扩散范围。与其它的分布方式的主要区别在于,在所有方向上标准偏差是相同的。因此,通过高斯分布,我们知道数据集的平均值以及数据的扩散分布,即它在比较广的范围上扩展,还是主要围绕在少数几个值附近集中分布。泊松分布与正态分布相似,但存在偏斜率。象正态分布一样,在偏斜度值较低的情况下,泊松分布在各个方向上具有相对均匀的扩散。但是,当偏斜度值非常大的时候,我们的数据在不同方向上的扩散将会是不同的。在一个方向上,数据的扩散程度非常高,而在另一个方向上,扩散的程度则非常低。如果遇到一个高斯分布,那么我们知道有很多算法,在默认情况下高思分布将会被执行地很好,因此首先应该找到那些算法。如果是泊松分布,我们必须要特别谨慎,选择一个在空间扩展上对变化要有很好鲁棒性的算法。降维降维这个术语可以很直观的理解,意思是降低一个数据集的维数。在数据科学中,这是特征变量的数量。请看下图:上图中的立方体表示我们的数据集,它有3个维度,总共1000个点。以现在的计算能力,计算1000个点很容易,但如果更大的规模,就会遇到麻烦了。然而,仅仅从二维的角度来看我们的数据,比如从立方体一侧的角度,可以看到划分所有的颜色是很容易的。通过降维,我们将3D数据展现到2D平面上,这有效地把我们需要计算的点的数量减少到100个,大大节省了计算量。另一种方式是我们可以通过特征剪枝来减少维数。利用这种方法,我们删除任何所看到的特征对分析都不重要。例如,在研究数据集之后,我们可能会发现,在10个特征中,有7个特征与输出具有很高的相关性,而其它3个则具有非常低的相关性。那么,这3个低相关性的特征可能不值得计算,我们可能只是能在不影响输出的情况下将它们从分析中去掉。用于降维的最常见的统计技术是PCA,它本质上创建了特征的向量表示,表明了它们对输出的重要性,即相关性。PCA可以用来进行上述两种降维方式的操作。过采样和欠采样过采样和欠采样是用于分类问题的技术。例如,我们有1种分类的2000个样本,但第2种分类只有200个样本。这将抛开我们尝试和使用的许多机器学习技术来给数据建模并进行预测。那么,过采样和欠采样可以应对这种情况。请看下图:在上面图中的左右两侧,蓝色分类比橙色分类有更多的样本。在这种情况下,我们有2个预处理选择,可以帮助机器学习模型进行训练。欠采样意味着我们将只从样本多的分类中选择一些数据,而尽量多的使用样本少的分类样本。这种选择应该是为了保持分类的概率分布。我们只是通过更少的抽样来让数据集更均衡。过采样意味着我们将要创建少数分类的副本,以便具有与多数分类相同的样本数量。副本将被制作成保持少数分类的分布。我们只是在没有获得更多数据的情况下让数据集更加均衡。贝叶斯统计完全理解为什么在我们使用贝叶斯统计的时候,要求首先理解频率统计失败的地方。大多数人在听到“概率”这个词的时候,频率统计是首先想到的统计类型。它涉及应用一些数学理论来分析事件发生的概率,明确地说,我们唯一计算的数据是先验数据(prior data)。假设我给了你一个骰子,问你掷出6点的几率是多少,大多数人都会说是六分之一。但是,如果有人给你个特定的骰子总能掷出6个点呢?因为频率分析仅仅考虑之前的数据,而给你作弊的骰子的因素并没有被考虑进去。贝叶斯统计确实考虑了这一点,我们可以通过贝叶斯法则来进行说明:在方程中的概率P(H)基本上是我们的频率分析,给定之前的关于事件发生概率的数据。方程中的P(E|H)称为可能性,根据频率分析得到的信息,实质上是现象正确的概率。例如,如果你要掷骰子10000次,并且前1000次全部掷出了6个点,那么你会非常自信地认为是骰子作弊了。如果频率分析做的非常好的话,那么我们会非常自信地确定,猜测6个点是正确的。同时,如果骰子作弊是真的,或者不是基于其自身的先验概率和频率分析的,我们也会考虑作弊的因素。正如你从方程式中看到的,贝叶斯统计把一切因素都考虑在内了。当你觉得之前的数据不能很好地代表未来的数据和结果的时候,就应该使用贝叶斯统计方法。云服务器99元拼团购!拉新还可赢现金红包!300万等你瓜分!马上一键开团赢红包: http://click.aliyun.com/m/1000019899/本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

October 30, 2018 · 1 min · jiezi

美团深度学习系统的工程实践

背景深度学习作为AI时代的核心技术,已经被应用于多个场景。在系统设计层面,由于其具有计算密集型的特性,所以与传统的机器学习算法在工程实践过程中存在诸多的不同。本文将介绍美团平台在应用深度学习技术的过程中,相关系统设计的一些经验。本文将首先列举部分深度学习算法所需的计算量,然后再介绍为满足这些计算量,目前业界比较常见的一些解决方案。最后,我们将介绍美团平台在NLU和语音识别两个领域中,设计相关系统的经验。深度学习的计算量ModelInput SizeParam SizeFlopsAlexNet227 x 227233 MB727 MFLOPsCaffeNet224 x 224233 MB724 MFLOPsVGG-VD-16224 x 224528 MB16 GFLOPsVGG-VD-19224 x 224548 MB20 GFLOPsGoogleNet224 x 22451 MB2 GFLOPsResNet-34224 x 22483 MB4 GFLOPsResNet-152224 x 224230 MB11 GFLOPsSENet224 x 224440 MB21 GFLOPs数据来源上表列举了,ImageNet图像识别中常见算法的模型大小以及单张图片一次训练(One Pass)所需要的计算量。自2012年,Hinton的学生Alex Krizhevsky提出AlexNet,一举摘下ILSVRC 2012的桂冠后,ILSVRC比赛冠军的准确率越来越高。与此同时,其中使用到的深度学习算法也越来越复杂,所需要的计算量也越来越大。SENet与AlexNet相比,计算量多了近30倍。我们知道,ImageNet大概有120万张图片,以SENet为例,如果要完成100个epoch的完整训练,将需要2.52 * 10^18的计算量。如此庞大的计算量,已经远远超出传统的机器学习算法的范畴。更别说,Google在论文《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》中提及的、比ImageNet大300倍的数据集。物理计算性能面对如此庞大的计算量,那么,我们业界当前常用的计算单元的计算力是多少呢?CPU 物理核:一般浮点运算能力在10^10 FLOPS量级。一台16 Cores的服务器,大致上有200 GFLOPS的运算能力。实际运行,CPU 大概能用到80%的性能,那就160 GFLOPS的运算能力。完成上述SENet运行,需要182天。NVIDIA GPGPU: 目前的V100,单精度浮点运算的峰值大概为14 TFLOPS, 实际运行中,我们假设能用到50%的峰值性能,那就是7 TFLOPS,需要4天。根据以上数据结果可以看出:在深度学习领域,GPU训练数据集所需要耗费的时间,远远少于CPU,这也是当前深度学习训练都是采用GPU的重要原因。业界的解决方案从前面的计算可知,即使使用GPU来计算,训练一次ImageNet 也需要4天的时间。但对于算法工程师做实验、调参而言,这种耗时数天的等待是难以忍受的。为此,目前业界针对深度学习训练的加速,提出了各种各样的解决方案。异构计算的并行方案数据并行(Data Parallelism)数据并行,即每个计算单元都保留一份完整的模型拷贝,分别训练不同的数据,经过一个Iteration或若干个Iteration后,把各个计算单元的模型做一次同步。这是最常见的深度学习训练方式,好处在于逻辑简单、代码实现方便。模型并行(Model Parallelism)模型并行,即各个计算单元存储同一层模型数据的不同部分,训练相同的数据。相对于数据并行,因为各个运算单元每训练完一层神经网络,就必须要同步一次,频繁的同步通信导致系统不能充分地利用硬件的运算能力,所以更为少见。但是在一些业务场景下,Softmax层需要分类的类别可能会有很多,导致Softmax层太大,单个计算单元无法存储,这个时候,需要把模型切割成若干部分,存储在不同的运算单元。模型并行常见于NLU、推荐、金融等领域。流式并行(Stream Parallelism)流式并行,即每个计算单元都存储不同层的模型数据,训练相同的数据。如上图所示,GPU1只负责第一层神经网络的计算,GPU2只负责25层神经网络的计算,GPU3只负责第6层的计算。流式并行的好处在于每个运算单元之间的通信和计算重叠(overlap),如果配置得当,可以非常充分地利用硬件资源。缺点在于,根据不同的模型,需要平衡好各个计算单元的计算量,如果配置不好,很容易形成“堰塞湖”。如上图所示,很有可能出现GPU1 负责的运算量太少,而GPU2 负责的运算量太多,导致GPU1 和GPU2 之间堵塞住大量的Mini-batch,更常见于线上环境。混合并行(Hybrid Parallelism)混合并行,即上面提到的并行方式的混合。如对于一些图像识别任务来说,可能前几层使用数据并行,最后的Softmax层,使用模型并行。异构计算的硬件解决方案单机单卡:一个主机内安装上一块GPU运算卡。常见于个人计算机。单机多卡:一个主机内安装上多块GPU运算卡。常见的有:1机4卡,1机8卡,甚至有1机10卡。一般公司都采取这种硬件方案。多机多卡:多台主机内安装多块GPU运算卡。常见于公司内部的计算集群,一般多机之间采取Infiniband 来实现网络的快速通信。定制化:即类似于Google的TPU解决方案。常见于“巨无霸”公司内部。异构计算的通信解决方案根据上面的硬件解决方案,我们以ResNet为例:模型的大小为230M,单张图片运算量为11 GFLPOS,Mini-batch假设为128。可以计算出各个硬件模块在深度学习训练中的耗时比较:GPU:对于V100,假设有6 TFLOPS,一次Mini-batch 理论耗时:0.23s。PCI-E:常见PCI-E 3.0 * 16,速度为10 GB/s,传输一个模型的理论耗时为:0.023s。网络:假设为10 GB/s的高速网络,传输一个模型的理论耗时:0.023s。Disk:普通的磁盘,我们假设200M/s的读取速度,读取一次Mini-batch所需要的图片耗时:0.094s。根据上面的数据结果,我们似乎可以得出一个结论:PCI-E和网络的传输耗时,相对于GPU来说,整整少了一个数量级,所以网络通信同步的时间可以忽略不计。然而问题并没有那么简单,上面例子中的耗时只是单个模型的耗时,但是对于8卡的集群来说,如果使用数据并行,每次同步就需要传输8份模型,这就导致数据传输的时间和GPU的计算时间“旗鼓相当”。这样的话,GPU就得每训练完一个Mini-batch,都得等候很久的一段时间(采取同步更新),这会浪费很多计算资源。因此,网络通信也需要制定对应的解决方案。下面我们以Nvidia NCCL中单机多卡的通信解决方案为例介绍,而多机多卡的通信解决方案其实是类似的。上图是单机4卡机器,在硬件上,两种不同的通信体系。左边为普通的PCI-E通信,即4个GPU之间组成一个环状。右边为NVLink通信,即两两之间相互连接。常见的通信类型如下图所示:对于深度学习训练而言,关键的两种通信类型为:Broadcast和Reduce。Broadcast用于Master分发最新的模型给各个GPU。Reduce 用于各个GPU计算完Mini-batch后,把模型更新值汇总到Master上。以Broadcast为例,最简单的通信方式是Master往各个GPU上发送数据,这样的耗时就是4次模型传输的时间,通信时间就会太长,一种简单的优化方法如下图所示:即把所需要传输的数据分成若干块,然后通过接力的方式逐个传递,每个GPU都把自己最新的一块数据发送到下一个GPU卡上。这种传输方式能充分利用硬件层面的通信结构,使得需要的耗时大幅缩减。与此类似的,Reduce的通信优化也可以采取相同的方式进行提速。美团的定制化深度学习系统尽管目前在业界已经推出了很多著名的深度学习训练平台,通用的训练平台如TensorFlow、MxNet等等,还有领域专用的训练平台,如语音识别中的Kaldi,但是我们经过调研后,决定内部自主开发一套深度学习系统,理由如下:通用的训练平台,缺乏了领域特色的功能。如语音识别中的特征提取模块和算法。通用的训练平台,通常是基于Data-flow Graph,来对计算图中的每个operator进行建模,所以颗粒度很小,需要调度的单元多,导任务调度复杂。领域特色的训练平台,如Kaldi,在神经网络训练的时候,性能不足。线上业务存在很多特殊性,如果使用TensorFlow之类作为训练平台,不太适合线上业务的情景。NLU线上系统线上系统的业务特点我们在设计NLU线上系统时,考虑了NLU业务的一些特性。发现其具备如下的一些特点:随着业务和技术的变化,算法流程也经常发生变化。算法流程是多个算法串联组成的,不单纯的只有深度学习算法。如分词等算法就不是DL算法。为了能够快速响应一些紧急问题,需要经常对模型进行热更新。更重要的是,我们希望构建一个能以“数据驱动”的自动迭代闭环。业务多变NLU任务的算法流程是多层级的,并且业务经常发生变化。如下图所示:即随着业务要求的变化,NLU系统一开始的算法流程,只需要把一个Query分为两个类,但是到后面,极有可能会变成需要分为三个类别。热更新根据业务需求,或者为了紧急处理一些特殊问题,NLU线上系统经常需要做出快速响应,热更新算法模型。如最近的热点词“skr”,几乎是一夜之间,突然火爆起来。如下图所示的微博,如果不能正确理解“skr”的正确语义,可能就不能准确理解这条微博想要表达的意思。为了避免影响用户体验,我们可能会对NLU系统,马上进行热更新,把新模型紧急进行上线。数据驱动的自动迭代闭环对于线上系统而言,构建如上图所示的自动迭代闭环,能更好地利用业务数据来提升服务质量。NLU线上系统的核心设计算法流程的抽象为了适应线上系统串联、多变的算法流程,我们把线上系统的算法进行抽象,如下图所示:即每一个算法,都依赖于若干个槽位(Slot)和资源(Resource),一旦槽位和资源就位,就会触发对应的算法执行。算法的执行先通过算法适配器,来适配槽位和资源中的数据,转换成算子的输入格式。然后算子执行算法本身,执行完算子后,再经过算法解析器。算法解析器主要用于解析算法执行的结果,触发对应的槽位。如根据算法的结果,触发Top 3的结果。多个算法串联起来,就构建成如下结果:热更新流程的设计如上图所示,我们把算法的热更新流程设计如上。初试状态为左上角,即多个Query使用同一份模型数据。当遇到模型更新的请求后,系统将会block住新的query(右上角状态)。然后更新模型完后,新的query使用新的模型,旧query依然使用旧模型(右下角状态)。最后,当使用旧模型的query结束后,把旧的模型从内存中删除(左下角),然后系统恢复到初始状态。声学模型训练系统因为TensorFlow等通用深度学习训练平台,缺乏了特征提取等业务相关的领域功能,而Kaldi的声学模型训练过程又太慢。所以美团开发了一个声学模型训练系统——Mimir,其具备如下特性:使用比TensorFlow更粗颗粒度的建模单元,使得任务调度、优化更简单方便易行。使用数据并行的并行方案,单机多卡可达到近线性加速。(采取同步更新策略下,4卡加速比达到3.8)移植了Kaldi的一些特有的训练算法。速度上为Kaldi的67倍。(800个小时的训练数据,单机单卡的条件下,Kaldi需要6~7天, Mimir只需20个小时)业务上,移植了Kaldi的特征提取等领域的相关模块。参考资料NCCL: ACCELERATED MULTI-GPU COLLECTIVE COMMUNICATIONS【深度学习】老师木讲架构:深度学习平台技术演进作者简介剑鹏,美团点评算法专家。2017年加入美团,目前作为语音识别团队的声学模型负责人,负责声学模型相关的算法和系统设计与开发。 ...

October 26, 2018 · 1 min · jiezi

深度学习在CTR预估中的应用

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由鹅厂优文发表于云+社区专栏一、前言二、深度学习模型1. Factorization-machine(FM)FM = LR+ embedding2. Deep Neural Network(DNN)3. Factorisation-machine supported Neural Networks (FNN)4. Product-based Neural Network(PNN)5. Wide & Deep Learning(Wide&Deep)6. Factorization-Machine based Neural Network (deepFM)7. Neural Factorization Machines (NFM)8. Attention Neural Factorization Machines (AFM)9. Deep&CrossNetwork(DCN)10. Deep Interest Network (DIN)三、写在最后四、参考文献作者:辛俊波 | 腾讯 应用研究员一、前言深度学习凭借其强大的表达能力和灵活的网络结构在NLP、图像、语音等众多领域取得了重大突破。在广告领域,预测用户点击率(Click Through Rate,简称CTR)领域近年也有大量关于深度学习方面的研究,仅这两年就出现了不少于二十多种方法。本文就近几年CTR预估领域中学术界的经典方法进行探究, 并比较各自之间模型设计的初衷和各自优缺点。通过十种不同CTR深度模型的比较,不同的模型本质上都可以由基础的底层组件组成。本文中出现的变量定义: • n: 特征个数,所有特征one-hot后 连接起来的整体规模大小 • f: 特征field个数,表示特征类别有多少个 • k: embedding层维度,在FM中是隐向量维度 • H1: 深度网络中第一个隐层节点个数,第二层H2,以此类推。二、深度学习模型1. Factorization-machine(FM) FM模型可以看成是线性部分的LR,还有非线性的特征组合xixj交叉而成,表示如下:其中vi是第i维特征的隐向量,长度k<<n,包含k个描述特征的因子。参数个数为kn。所有包含xi的非零组合特征都可以用来训练vi,缓解数据稀疏问题。图1是从神经网络的角度表示FM, 可以看成底层为特征维度为n的离散输入,经过embedding层后,对embedding层线性部分(LR)和非线性部分(特征交叉部分)累加后输出。图1 FM模型结构FM = LR+ embedding待学习的参数如下:(1)LR部分: 1+n(2)embedding 部分:nkFM下文中将作为各种网络模型的基础组件2. Deep Neural Network(DNN)图2是经典的DNN网络, 结构上看就是传统的多层感知机(MultiLayer Perceptron,简称MLP)。在MLP网络中,输入是原始的特征n维特征空间,假设第一层隐层节点数为H1,第二层为H2,以此类推。在第一层网络中,需要学习的参数就是nH1。对于大多数CTR模型来说,特征体系都极其庞大而且稀疏,典型的特征数量级n从百万级到千万级到亿级甚至更高,这么大规模的n作为网络输入在ctr预估的工业界场景中是不可接受的。下面要讲到的大多数深度学习CTR网络结构,都围绕着如何将DNN的高维离散输入,通过embedding层变成低维稠密的输入工作来展开。图2 DNN模型结构DNN待学习参数: nH1+H1H2+H2H3+H3o(o为输出层大小,在ctr预估中为1)DNN(后文称MLP)也将作为下文各种模型的基础组件之一3. Factorisation-machine supported Neural Networks (FNN)在上述的DNN中,网络的原始输入是全部原始特征,维度为n,通常都是百万级以上。然而特征维度n虽然空间巨大,但如果归属到每个特征所属的field(维度为f),通常f维度会小很多。如果有办法将每个特征用其所属的field来表示,原始输入将大大减少不少。Factorisation-machine supported Neural Networks,简称FNN就是基于这种思想提出来的。图3 FNN模型结构FNN假设每个field有且只有一个值为1,其他均为0。x为原始输入的特征,它是大规模离散稀疏的。它可以分成n个field,每一个field中,只有一个值为1,其余都为0(即one hot)。field i的输入可以表示成 x[start_i: end_i], W0i为field i的embedding矩阵。Zi 为embedding后的向量,是一个k维的向量,它由一次项wi ,二次项vi=(vi1,vi2,…vik) 组成,其中k是FM中二次项的向量的维度。而后面的l1,l2则为神经网络的全连接层的表示。除此之外,FNN还具有以下几个特点:Ø FM参数需要预训练 FM部分的embedding需要预先进行训练,所以FNN不是一个end-to-end模型。在其他论文中,有试过不用FM初始化embedding, 而用随机初始化的方法,要么收敛速度很慢,要么无法收敛。有兴趣的同学可以实验验证下。Ø 无法拟合低阶特征 FM得到的embedding向量直接concat连接之后作为MLP的输入去学习高阶特征表达,最终的DNN输出作为ctr预估值。因此,FNN对低阶信息的表达比较有限。Ø 每个field只有一个非零值的强假设 FNN假设每个fileld只有一个值为非零值,如果是稠密原始输入,则FNN失去意义。对于一个fileld有几个非零值的情况,例如用户标签可能有多个,一般可以做average/sum/max等处理。FNN = LR + DEEP = LR + embedding + MLP(1)LR部分: 1+n(2)embedding部分: nk(3)MLP部分: fkH1+H1H2+H2 可以看到,对比DNN,在进入MLP部分之前,网络的输入由n降到了fk(f为field个数,几十到几百之间,k为隐向量维度,一般0100)4. Product-based Neural Network(PNN)FNN的embedding层直接concat连接后输出到MLP中去学习高阶特征。PNN,全称为Product-based Neural Network,认为在embedding输入到MLP之后学习的交叉特征表达并不充分,提出了一种product layer的思想,既基于乘法的运算来体现体征交叉的DNN网络结构,如图4所示。图3 PNN模型结构 对比FNN网络,PNN的区别在于中间多了一层Product Layer层。Product Layer层由两部分组成,左边z为embedding层的线性部分,右边为embedding层的特征交叉部分。除了Product layer不同,PNN和FNN的MLP结构是一样的。这种product思想来源于,在ctr预估中,认为特征之间的关系更多是一种and“且”的关系,而非add"加”的关系。例如,性别为男且喜欢游戏的人群,比起性别男和喜欢游戏的人群,前者的组合比后者更能体现特征交叉的意义。根据product的方式不同,可以分为inner product(IPNN)和outer product(OPNN),如图5所示。图5 PNN(左图:IPNN;右图:OPNN)Product layer的输出为PNN = FM + product + MLPØ Inner Product-based Neural Network IPNN的叉项使用了内积g(fi, fj) = <fi, fj>。f个filed,两两求内积共计交叉项p部分的参数共f(f-1)/2(f为特征的field个数,原始论文里用的N)个,线性部分z部分参数共fk个。需要学习的参数为: (1)FM部分: 1+ n + nk (2)product部分: (fk + f(f-1)/2)H1 (3)MLP部分:H1H2+H21Ø Outer Product-based Neural Network OPNN用矩阵乘法来表示特征的交叉, g(fi, fj)=fifit。f个field两两求矩阵乘法,交叉项p共f(f-1)/2kk个参数。线性部分z部分参数共fk个。需要学习的参数为: (1)FM部分: 1+ n + nk (2)product部分: (fk + f(f-1)/2kk)H1 (3)MLP部分:H1H2+H215. Wide & Deep Learning(Wide&Deep)前面介绍的两种变体DNN结构FNN和PNN,都在embedding层对输入做处理后输入MLP,让神经网络充分学习特征的高阶表达,deep部分是有了,对高阶的特征学习表达较强,但wide部分的表达是缺失的, 模型对于低阶特征的表达却比较有限。google在2016年提出了大名鼎鼎的wide&Deep的结构正是解决了这样的问题。Wide&deep结合了wide模型的优点和deep模型的优点,网络结构如图6所示,wide部分是LR模型,Deep部分是DNN模型。图6 Wide&Deep 模型结构在这个经典的wide&deep模型中,google提出了两个概念,generalization(泛化性)和memory(记忆性)Ø Memory(记忆性)wide部分长处在于学习样本中的高频部分,优点是模型的记忆性好,对于样本中出现过的高频低阶特征能够用少量参数学习;缺点是模型的泛化能力差,例如对于没有见过的ID类特征,模型学习能力较差。Ø Generalization(泛化性)deep部分长处在于学习样本中的长尾部分,优点是泛化能力强,对于少量出现过的样本甚至没有出现过的样本都能做出预测(非零的embedding向量);缺点是模型对于低阶特征的学习需要用较多参才能等同wide部分效果,而且泛化能力强某种程度上也可能导致过拟合出现bad case.除此之外,wide&deep模型还有如下特点Ø 人工特征工程LR部分的特征,仍然需要人工设计才能保证一个不错的效果。因为LR部分是直接作为最终预测的一部分,如果作为wide部分的LR特征工程做的不够完善,将影响整个wide&deep的模型精度Ø 联合训练模型是end-to-end结构,wide部分和deep部分是联合训练的Ø embedding层deep部分单独占有LR部分直接作为最后输出,因此embedding层是deep部分独有的。wide&deep = LR + embedding + MLP (1)LR部分: 1+n (2)embedding部分:nk (3)MLP部分: fkH1 + H1H2 + H216. Factorization-Machine based Neural Network (deepFM)google提出的wide&deep框架固然强大,但由于wide部分是个LR模型,仍然需要人工特征工程。但wide&deep给整个学术界和工业界提供了一种框架思想。基于这种思想,华为诺亚方舟团队结合FM相比LR的特征交叉的功能,将wide&deep部分的LR部分替换成FM来避免人工特征工程,于是有了deepFM,网络结构如图6所示。图7 DeepFM模型结构比起wide&deep的LR部分,deeFM采用FM作为wide部分的输出,FM部分如图8所示。图8 deepFM模型中的FM部分结构除此之外,deepFM还有如下特点:Ø 低阶特征表达wide部分取代WDL的LR,比FNN和PNN相比能捕捉低阶特征信息Ø embedding层共享wide&deep部分的embedding层得需要针对deep部分单独设计;而在deepFM中,FM和DEEP部分共享embedding层,FM训练得到的参数既作为wide部分的输出,也作为DNN部分的输入。Ø end-end训练embedding和网络权重联合训练,无需预训练和单独训练deepFM = FM + embedding + DNN(1)FM部分: 1+n(2)embedding部分:nk(3)DNN部分: fkH1 + H1H2+H1通过embedding层后,FM部分直接输出没有参数需要学习,进入DNN部分的参数维度从原始n维降到fk维。7. Neural Factorization Machines (NFM) 前面的deepFM在embedding层后把FM部分直接concat起来(fk维,f个field,每个filed是k维向量)作为DNN的输入。Neural Factorization Machines,简称NFM,提出了一种更加简单粗暴的方法,在embedding层后,做了一个叫做BI-interaction的操作,让各个field做element-wise后sum起来去做特征交叉,MLP的输入规模直接压缩到k维,和特征的原始维度n和特征field维度f没有任何关系。网络结构如图9所示。图9 NFM模型结构这里论文只画出了其中的deep部分, wide部分在这里省略没有画出来。Bi-interaction听名字很高大上,其实操作很简单:就是让f个field两两element-wise相乘后,得到f(f-1)/2个向量,然后直接sum起来,最后得到一个k维的向量。所以该层没有任何参数需要学习。NFM = FM + embedding + MLP需要学习的参数有:(1)FM部分: 1+n(2)embedding部分:nk(3)MLP部分: kH1 + H1H2+…+Hl1NFM在embedding做了bi-interaction操作来做特征的交叉处理,优点是网络参数从n直接压缩到k(比FNN和deepFM的fk还少),降低了网络复杂度,能够加速网络的训练得到模型;但同时这种方法也可能带来较大的信息损失。8. Attention Neural Factorization Machines (AFM) 前面提到的各种网络结构中的FM在做特征交叉时,让不同特征的向量直接做交叉,基于的假设是各个特征交叉对ctr结果预估的贡献度是一样的。这种假设其实是不合理的, 不同特征在做交叉时,对ctr预估结果的贡献度是不一样的。Attention Neural Factorization Machines,简称NFM模型,利用了近年来在图像、NLP、语音等领域大获成功的attention机制,在前面讲到的NFM基础上,引入了attention机制来解决这个问题。AFM的网络结构如图10所示。和NFM一样,这里也省略了wide部分,只画出了deep部分结构。图10 AFM模型结构AFM的embedding层后和NFM一样,先让f个field的特征做了element-wise product后,得到f(f-1)/2个交叉项。和NFM直接把这些交叉项sum起来不同,AFM引入了一个Attention Net,认为这些交叉特征项每个对结果的贡献是不同的,例如xi和xj的权重重要度,用aij来表示。从这个角度来看,其实AFM其实就是个加权累加的过程。Attention Net部分的权重aij不是直接学习,而是通过如下公式表示这里t表示attention net中的隐层维度,k和前面一样,为embedding层的维度。所以这里需要学习的参数有3个,W, b, h,参数个数共tk+2t个。得到aij权重后,对各个特征两两点积加权累加后,得到一个k维的向量,引入一个简单的参数向量pT,维度为k进行学习,和wide部分一起得到最终的AFM输出。总结AFM的网络结构来说,有如下特点:Ø Attention NetworkAFM的亮点所在,通过一个attention net生成一个关于特征交叉项的权重,然后将FM原来的二次项直接累加,变成加权累加。本质上是一个加权平均,学习xjxj的交叉特征重要性Ø Deep Network没有deep,卒。Attention net学习得到的交叉项直接学些个pt参数就输出了,少了DNN部分的表达,对高阶特征部分的进一步学习可能存在瓶颈。另外,FFM其实也引入了field的概念去学习filed和featrue之间的权重。没有了deep 部分的AFM,和优化的FFM上限应该比较接近。AFM = FM + embedding + attention + MLP(一层)需要学习的参数有:(1)FM部分参数:1+n(2)Embedding部分参数: nk(3)Attention Network部分参数: kt+t2(4)MLP部分参数:k19. Deep&CrossNetwork(DCN)在ctr预估中,特征交叉是很重要的一步,但目前的网络结构,最多都只学到二级交叉。LR模型采用原始人工交叉特征,FM自动学习xi和xj的二阶交叉特征,而PNN用product方式做二阶交叉,NFM和AFM也都采用了Bi-interaction的方式学习特征的二阶交叉。对于更高阶的特征交叉,只有让deep去学习了。为解决这个问题,google在2017年提出了Deep&Cross Network,简称DCN的模型,可以任意组合特征,而且不增加网络参数。图11为DCN的结构。图10 DCN模型结构整个网络分4部分组成:(1)Embedding and stacking layer之所以不把embedding和stacking分开来看,是因为很多时候,embedding和stacking过程是分不开的。前面讲到的各种 XX-based FM 网络结构,利用FM学到的v向量可以很好的作为embedding。而在很多实际的业务结构,可能已经有了提取到的embedding特征信息,例如图像的特征embedding,text的特征embedding,item的embedding等,还有其他连续值信息,例如年龄,收入水平等,这些embedding向量stack在一起后,一起作为后续网络结构的输入。当然,这部分也可以用前面讲到的FM来做embedding。为了和原始论文保持一致,这里我们假设X0向量维度为d(上文的网络结构中为k),这一层的做法就是简答的把各种embedding向量concat起来。(2)Deep layer netwok在embedding and stacking layer之后,网络分成了两路,一路是传统的DNN结构。表示如下为简化理解,假设每一层网络的参数有m个,一共有Ld层,输入层由于和上一层连接,有dm个参数(d为x0向量维度),后续的Ld-1层,每层需要m(m+1)个参数,所以一共需要学习的参数有 dm+m(m+1)(Ld-1)。最后的输出也是个m维向量Hl2(3)Cross layer network Embedding and stacking layer输入后的另一路就是DCN的重点工作了。假设网络有L1层,每一层和前一层的关系可以用如下关系表示可以看到f是待拟合的函数,xl即为上一层的网络输入。需要学习的参数为wl和bl,因为xl维度为d, 当前层网络输入xl+1也为d维,待学习的参数wl和bl也都是d维度向量。因此,每一层都有2d的参数(w和b)需要学习,网络结构如下。经过Lc层的cross layer network后,在该layer最后一层Lc层的输出为Lc2的d维向量(4)Combination Output Layer经过crossnetwork的输出XL1(d维)和deep network之后的向量输入(m维)直接做concat,变为一个d+m的向量,最后套一个LR模型,需要学习参数为1+d+m。总结起来,DCN引入的crossnetwork理论上可以表达任意高阶组合,同时每一层保留低阶组合,参数的向量化也控制了模型的复杂度。DCN = embedding + cross + deep + LR待学习参数有:(1)embedding部分参数: 根据情况而定(2)cross部分参数:2dLc(Lc为cross网路层数)(3)deep部分参数:d(m+1)+m(m+1)(Ld-1)(Ld为深度网络层数,m为每层网络参数)(4)LR 部分参数:1+d+m10. Deep Interest Network (DIN) 最后介绍阿里在2017年提出的Deep Interest Network,简称DIN模型。与上面的FNN,PNN等引入低阶代数范式不同,DIN的核心是基于数据的内在特点,引入了更高阶的学习范式。用户的兴趣是多种多样的,从数学的角度来看,用户的兴趣在兴趣空间是一个多峰分布。在预测ctr时,用户embedding表示的兴趣维度,很多是和当前item是否点击无关的,只和用户兴趣中的局部信息有关。因此,受attention机制启发,DIN在embedding层后做了一个action unit的操作,对用户的兴趣分布进行学习后再输入到DNN中去,网络结构如图12所示图12 DIN模型结构DIN把用户特征、用户历史行为特征进行embedding操作,视为对用户兴趣的表示,之后通过attention network,对每个兴趣表示赋予不同的权值。• Vu:表示用户最终向量• Vi:表示用户兴趣向量(shop_id, good_id..)• Va:表示广告表示向量• Wi: 对于候选广告,attention机制中该兴趣的权重可以看到,对于用户的每个兴趣向量Vi,都会通过学习该兴趣的权重Vi, 来作为最终的用户表示。三、写在最后前面介绍了10中深度学习模型的网络结构,总结起来可以用如下的所表示各种CTR深度模型看似结构各异,其实大多数可以用如下的通用范式来表达,Ø input->embedding把大规模的稀疏特征ID用embedding操作映射为低维稠密的embedding向量Ø embedding层向量concat, sum, average pooling等操作,大部分CTR模型在该层做改造Ø embedding->output通用的DNN全连接框架,输入规模从n维降为kf维度甚至更低。图3 通用深度学习模型结构其中,embedding vector这层的融合是深度学习模型改造最多的地方,该层是进入深度学习模型的输入层,embedding融合的质量将影响DNN模型学习的好坏。个人总结大体有以下4种操作,当然后续可能会有越来越多其他的变形结构。图14 embedding层融合方式另外,DNN部分,业界也有很多或state-of-art或很tricky的方法,都可以在里面进行尝试,例如dropout,在NFM的Bi-interaction中可以尝试以一定概率dropout掉交叉特征增前模型的泛化能力等。写在最后 ctr预估领域不像图像、语音等领域具有连续、稠密的数据以及空间、时间等的良好局部相关性,ctr预估中的大多数输入都是离散而且高维的,特征也分散在少量不同的field上。要解决这样的一个深度学习模型,面临的第一个问题是怎么把输入向量用一个embedding层降维策划那个稠密连续的向量,如本文介绍的用FM去做预训练,或者和模型一起联合训练,或者其他数据源提取的embedding特征向量去做concat。其次,在宽和深的大战中,在google在提出了wide&deep的模型框架后,这套体系基本已成为业内的基本框架。无论wide部分或者deep怎么改造,其实本质上还是一些常见组件的结合,或者改造wide,或者改造deep,或者在wide和deep的结合过程中进行改造。ctr预估领域方法变化层出不穷,但万变不离其宗,各种模型本质上还是基础组件的组合,如何结合自己的业务、数据、应用场景去挑选合适的模型应用,可能才是真正的难点所在。四、参考文献[1]Factorization Machines[2]Wide & Deep Learning for Recommender Systems[3]Deep Learning over Multi-Field Categorical Data: A Case Study on User Response Prediction[4]Product-based Neural Networks for User Response Prediction[5]DeepFM: A Factorization-Machine based Neural Network for CTR Prediction[6]Neural Factorization Machines for Sparse Predictive Analytics[7] Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks[8]Deep & Cross Network for Ad Click Predictions[9]Deep Interest Network for Click-Through Rate Prediction问答如何把深度学习应用在云中?相关阅读IPv6原理、应用与实践Python 工匠:编写条件分支代码的技巧AI从入门到放弃:CNN的导火索,用MLP做图像分类识别? 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 21, 2018 · 2 min · jiezi