
人工智能(AI)和机器学习(ML)可以做些什么来改善客户体验?自从网上购物开始以来,AI和ML已经密切参与整个网上购物流程。如果没有获得购物建议,你可能无法享受到淘宝或任何其他购物网站的优质服务,这些建议通常是根据供应商对你的特征的理解进行个性化匹配,其中包括你的购买历史记录,浏览历史记录以及更多内容。淘宝和其他在线企业都希望发明一个知道你和你的品味的销售人员的数字版本,并且可以无误地引导你使用你购买的产品。 一切都始于优质的数据 为了实现这一愿景,我们需要从后端的一些繁重工作开始。谁是你的客户?你真的知道他们是谁吗?所有客户都留下了数据路径,但该数据路径是一系列碎片,将这些碎片相互关联起来真的很难。如果一个客户有多个帐户,你能查出来吗?如果客户有单独的帐户用于商业和其他用途,你可以关联它们吗?如果一个组织使用了许多不同的名称,你能发现它们其实就是个单一的组织吗?客户体验始于准确了解客户是谁以及他们如何关联,擦除客户列表以消除重复称为实体解析,它曾经是一些拥有大量数据的公司才能涉足的领域。随着时间的发展,我们可以看到实体解析的解决方案正在民主化:已经出现了大量提供适合中小型组织的实体解析软件和服务的初创公司。一旦你清楚了你的客户是谁,你就必须问你对它们的了解程度到底有多少。全面了解客户的活动对于了解客户的需求至关重要,例如它们有什么数据,以及如何使用它?ML和AI现在被被广泛用作数据收集的工具:处理来自传感器、应用程序和其他来源的数据流。收集客户数据可能具有侵入性,并且在道德上存在问题,所以当你建立对客户的理解时,请确保他们同意并且不会损害他们的隐私。ML与任何其他类型的计算没有根本的区别:“进入垃圾,出来垃圾”规则仍然适用。如果你的训练数据质量很差,那你的结果将会很差。随着数据源数量的增加,潜在数据字段和变量的数量也会增加,并且可能出现错误,例如转录错误,印刷错误等等。在过去,我们可以手动纠正和修复数据,但手动更正数据是一项容易出错且繁琐的任务,而且占用大多数数据科学家的时间。与实体解析一样,数据质量和数据修复已成为最近研究的热点,并且开始出现了一套用于自动化数据清理的新机器学习工具。 应用 机器学习和AI对客户体验的一个常见应用是个性化推荐系统。近年来,混合推荐系统——结合多种推荐策略的应用变得更加普遍。许多混合推荐系统依赖于许多不同来源的数据,并且深度学习模型通常是这种系统的一部分。虽然现有的大量模型大多数训练完后再部署,但高级推荐和个性化系统确是实时的。很多公司开始使用强化学习,在线学习和个性化算法,构建推荐系统不断训练模型对抗实时数据。机器学习和人工智能可以自动执行许多不同的企业任务和工作流程,包括客户交互。目前市面上有“经验丰富”的聊天机器人,可以自动化客户服务的各个方面。到目前为止,聊天机器人还没有达到人类的水平,但如果设计良好,简单的“常见问题”机器人可以带来良好的客户转化率。我们正处于自然语言处理和理解的早期阶段,但在过去的一年时间里,我们已经看到了许多突破。随着我们构建复杂语言模型能力的提高,我们可以看到聊天机器人多个阶段的进展:从提供通知到管理简单的问答场景,再到理解上下文和参与简单的对话,最后是“了解”用户需求的个人助理。随着聊天机器人的改进,我们希望它们可以成为客户服务不可或缺的一部分。为了使聊天机器人达到这种性能水平,他们需要整合实时推荐和个性化,他们需要了解客户以及人性。欺诈检测是另一项正在应用机器学习的技术。欺诈检测涉及好人和坏人之间的持续较量,欺诈专家正在发明更复杂的在线犯罪技术。欺诈不再是人对人:它是自动化的,就像机器人购买演唱会所有门票一样,因为他们可以再次出售。正如我们在最近的许多选举中看到的那样,犯罪分子很容易通过创建一个充斥着自动回复的机器人来渗透社交媒体。发现这些机器人并实时阻止它们真的很困难,只有机器学习才有可能,即使这样,这也是一个难以解决的问题。语音技术和情感检测的进步将进一步减少自动化客户交互中的摩擦。结合不同类型输入(音频、文本、视觉)的多模式模型将使得更容易适当地响应客户; 客户可能能够向你展示他们想要的内容,或者发送他们所面临问题的实时视频。虽然人类和机器人之间的互动经常将用户置于令人毛骨悚然的“神秘山谷”中,但可以肯定的是,未来的客户对机器人的熟悉程度将超过我们现在的水平。但如果我们要让客户通过这个神秘山谷的另一边,我们也必须尊重他们的价值。影响客户的AI和ML应用必须尊重隐私,他们必须是安全的,他们必须公平和公正。这些挑战都不简单,但如果客户最终感到受到虐待,技术将无法改善客户体验。机器学习和人工智能将为客户体验做些什么?它已经做了很多。但它还有更多可以做的事情,而且必须要做的是建立未来更自然的客户体验。本文由阿里云开发者社区组织翻译。文章原标题《how-ai-and-machine-learning-are-improving-customer-experience》作者:Ben LoricaMike译者:虎说八道文章为简译,更为详细的内容,请查看原文
机器学习和数据科学都是广义上的术语,它们涉及超级多的领域以及知识,一位数据科学家所做的事情可能与另一位有很大的不同,机器学习工程师也是如此。通常使用过去(数据)来理解或预测(构建模型)未来。为了将上面刚刚提到的要点融入上下文中,我必须要解释我的角色是什么。曾经我呆在一个小机器学习咨询团队。我们做到了从数据收集到清洗、构建模型再到你能想到的多个行业的服务部署。因为团队很小,所以每个人头上都有很多头衔。 机器学习工程师的日常: 早上9点,我走进办公室,向同事问好,把食物放在冰箱里,倒一杯咖啡,走到我的办公桌前。然后我坐下来,看看前一天的笔记,打开Slack,阅读未读的消息并打开团队共享的论文或博客文章链接,因为这个领域发展很快,所以要多看一些前沿的东西。我通常都是在读完未读消息后,会花一点时间来浏览论文和博客文章,并仔细研究那些理解起来困难的内容。不得不说这其中,有一些内容对我正在做的工作有很大的帮助。一般来说,阅读会花费我大概一个小时甚至更久,这取决于文章本身。有些朋友会问我为什么这么久?在我看来,阅读是一种终极元技能。因为一旦有更好的方式来完成我当前在做的事情,我会立即通过学习使用它,从而节约更多的时间和精力。但也有特殊情况,如果有一个项目的截止日期临近,那么我将把阅读时间缩短来推进该项目。完成阅读之后,我会检查前一天的工作,检查我的记事本,看看我需要从什么地方开始工作,为什么我可以这样做?因为我的记事本是流水账式的日记。例如:「将数据处理为正确格式,现在需要在模型中训练这些数据。」如果我在工作过程中遇到了困难,则会写下类似于:「发生了数据不匹配的情况,接下来我将尝试修复混合匹配,并在尝试新模型之前获得基线。」大约在下午4点的时候我会整理一下我的代码,大概涉及:让混乱代码变得清晰,添加注释,组合。为什么要这样做?因为这个问题我经常会问自己:如果其他人看不懂这个怎么办?如果是我要读这段代码,我最需要什么?有了这样的思考后,我觉得花费一段时间来整理代码变的格外有意义。 大约在下午5点,我的代码应该会被上传到GitHub上。这是理想的一天,但并不是每一天都是如此。有时候你会在下午4点有一个极好的想法,然后跟随它,然后就有可能是通宵。现在你应该已经大致了解了机器学习工程师一天的日常了吧,接下来我会将我在其中获得的心得分享给你。 1.睁眼闭眼全是数据 很多时候,机器学习工程师都会专注于构建更好的模型,而不是改进构建它的数据。尽管可以通过投入足够的计算能力让模型提供令人兴奋的短期结果,但这始终不会是我们想要的目标。首次接触项目时,必须要花费大量时间熟悉数据。因为从长远来看,熟悉这些数据在未来会将节省你更多的时间。这并不意味着你不应该从细节着手,对于任何新数据集,你的目标应该是成为这方面的「专家」。检查分布、找到不同类型的特征、异常值、为什么它们是异常值等等此类问题。如果你无法讲出当前这些数据的故事,那又怎么让模型更好的处理这些数据呢? 探索性数据分析生命周期的示例(每次遇到新数据集时都会执行的操作)。更多关于探索性数据分析的详细介绍。 2.沟通比解决技术问题更难 我遇到的大多数障碍都不是技术性的,而是涉及到沟通问题。当然,这其中也存在技术挑战,但作为工程师解决技术难题是我们的本职工作。但永远不要低估内部和外部沟通的重要性。没有什么比技术选型错误更糟的了,因为这是要解决错误的技术挑战。到底什么情况会出现这样的情况呢?从外部来看,这是因为客户所追求的与我们可以提供的东西之间的不匹配。而在内部,因为很多人都身兼数职,所以很难确保每个人都可以全身贯注于一件事情。碰到这些问题时到底如何解决呢?对于外部问题,我们只能不断的与客户沟通。你的客户是否了解你可以提供的服务?你了解你的客户的需求吗?他们是否了解机器学习可以提供什么以及它不能提供什么?怎么样才能更有效的传达你的想法?对于内部问题,你可以根据我们使用解决问题的软件工具的数量来判断内部通信有多难:Asana,Jira,Trello,Slack,Basecamp,Monday,Microsoft Teams。我找到的最有效的方法之一是在一天结束时在相关项目频道中进行简单的消息更新。它完美吗?不,但似乎有效。它给了我一个机会来反思我做了什么,并告诉大家我接下来的什么工作需要谁的支持,甚至可以从大家那里得到建议。无论你是多么优秀的工程师,你维持和获得新业务的能力都与你沟通的技能能力有关。 3.稳定性>最先进的技术 现在有一个自然语言问题:将文本分类到不同的类别,目标是让用户将一段文本发送到服务并将其自动分类为两个类别之一。如果模型对预测没有信心,请将文本传递给人类分类器,每天的负载约为1000-3000个请求。BERT虽然在最近一年很火。但是,如果没有谷歌那样规模的计算,用BERT训练模型来解决我们想要解决的问题时还是很复杂的,因为在投入生产之前,我们需要修改很多内容。相反,我们使用了另一种方法ULMFiT,尽管它不是最先进的,但仍然可以得到令人满意的结果,并且更容易使用。 4.机器学习初学者最常见的两个坑 将机器学习运用到实际生产中存在两个坑:一是从课程工作到项目工作的差距,二是从笔记本中的模型到生产模型(模型部署)的差距。我在互联网上学习机器学习课程,以此来完成自己的AI硕士学位。但即使在完成了许多最好的课程之后,当我开始担任机器学习工程师时,我发现我的技能是建立在课程的结构化主干上,而项目并没有课程那样井井有条。我缺乏很多在课程中无法学到的具体的知识,例如:如何质疑数据,探索什么数据与利用什么数据。如何弥补这个缺陷呢?我很幸运能够成为澳大利亚最优秀的人才,但我也愿意学习并愿意做错。当然,错误不是目标,但为了正确,你必须弄清楚什么是错的。如果你正在通过一门课程学习机器学习,那么继续学习这门课程,不过你需要通过自己的项目来学习你正在学习的知识,从而弥补课程中的不足。至于如何进行部署?在这点上我仍然做的不是很好。还好我注意到了一种趋势:机器学习工程和软件工程正在融合。通过像Seldon,Kubeflow和Kubernetes这样的服务,很快机器学习将成为堆栈的另一部分。在Jupyter中构建模型是很简单的,但是如何让数千甚至数百万人使用该模型?这才是机器学习工程师应该思考的事情,这也是机器学习创造价值的前提。但是,根据最近在Cloud Native活动上的讨论情况来看,大公司以外的人并不知道如何做到这一点。 5. 20%的时间 20%的时间,这意味着我们20%的时间都花在了学习上。客观意义上,学习是一个松散的术语,只要是关于机器学习的都可以纳入到学习范畴内,相关业务也要不断的学习,作为机器学习工程师,懂业务可以极大的提高你的工作效率。如果你的业务优势在于你现在所做的最好,那么未来的业务取决于你继续做你最擅长的事情,这意味着需要不断学习。 6.十分之一的论文值得阅读,但少用 这是一个粗略的指标。但是,探索任何数据集或者模型时,你很快就会发现这个规律是普遍存在的。换句话说,在每年数以千计的提交中,你可能会得到10篇开创性的论文。在这10篇开创性的论文中,有5篇可能来自于同一所研究所或者个人。你无法跟上每一个新的突破,但可以在基本原则的坚实基础应用它们,这些基本原则经受住了时间的考验。接下来是探索与开发的问题。 7.成为你自己最大的质疑者 探索与开发问题是尝试新事物和已经发挥作用事物之间的两难选择,你可以通过成为自己最大的怀疑者来处理这些问题。不断的向自己提问,选择这些取代旧的可以带来哪些好处?开发一般来说,运行你已经使用过的模型并获得高精度数字很容易,然后可以将其作为新基准报告给团队。但是如果你得到了一个好的结果,记得检查你的工作,并再次让你的团队也这样做。因为你是一名工程师,你应该有这样的意识。探索20%的时间花费在探索上是一个不错的决定,但是如果是70/20/10可能会更好。这意味着你需要在核心产品上花费70%的时间,在核心产品的二次开发上花费20%,在moonshots(未来要用的事情)上花费10%,虽然这些东西可能不会立即起作用。说起来很惭愧,我从来没有在我的角色中练习这个,但这是我正朝着这个方向发展的。 8.“玩具问题”非常有用 玩具问题可以帮你理解很多问题,特别是帮助解决一个复杂的问题。首先先建立一个简单的问题,它可能是关于你的数据或不相关数据集的一小部分。找出这个问题的解决方法,然后把他扩展到整个数据集中。在一个小团队中,处理问题的诀窍是抽象问题,然后理出头绪解决。 9.橡皮鸭 如果你遇到问题,坐下来盯着代码可能会解决问题,可能不会。这时,如果同你的同事探讨一下,假装他们是你的橡皮鸭,那么问题可能很容易就被解决了。“Ron,我正在尝试遍历这个数组,并在循环通过另一个数组并跟踪状态,然后我想将这些状态组合成一个元组列表。”“循环中的循环?你为什么不把它矢量化呢?““我能这样做吗?”“让我们来尝试下吧。” 10.从0开始构建的模型数量正在下降 这与机器学习工程与软件工程正在融合有关。除非你的数据问题非常具体,否则许多问题非常相似,分类、回归、时间序列预测、建议。谷歌和微软的AutoML等服务正在为每个可以上传数据集并选择目标变量的人提供世界一流的机器学习。在面向开发人员方面,有像fast.ai这样的库,它们可以在几行代码中提供最先进的模型,以及各种模型动画(一组预先构建的模型),如PyTorch hub和TensorFlow集线器提供相同的功能。这意味着我们不需要了解数据科学和机器学习的更深层次原理,只需要知道他们的基本原理即可,我们应该更关心如何将它们应用到实际问题中去创造价值。 11.数学还是代码? 对于我所处理的客户问题,我们都是代码优先,而且所有的机器学习和数据科学代码都是Python。有时我会通过阅读论文并复现它来涉足数学,但是现有的框架大都包含了数学。这并不是说数学是不必要的,毕竟机器学习和深度学习都是应用数学的形式。掌握最小矩阵的操作、一些线性代数和微积分,特别是链式法则足以成为一个机器学习从业者。请记住,大多数时候或者大多数从业者的目标不是发明一种新的机器学习算法,而是向客户展示潜在的机器学习对他们的业务有没有帮助。 12.你去年所做的工作明年可能会无效 这是大趋势,因为软件工程和机器学习工程的融合,这种情况正在变得越来越明显。但这也是你进入这个行业的原因,框架将发生变化,各种实用库将发生变化,但基础统计数据、概率学、数学、这些事情都是不变的。最大的挑战仍然是:如何应用它们创造价值。 现在怎么办? 机器学习工程师的成长道路上应该还有很多坑需要去探,如果你是一个新手,先掌握这12条就足够了! 本文由阿里云开发者社区组织翻译。 文章原标题《12-things-i-learned-during-my-first-year-as-a-machine-learning-engineer》作者:Daniel Bourke译者:虎说八道文章为简译,更为详细的内容,请查看原文
本文由阿里云工业大脑首席架构师黄桦在苏州云栖大会分享。 以下为精彩视频内容整理: 近几年,一波新制造的浪潮已经到来,在德国、美国、中国等制造大国,都在提新制造概念。但是每一个国家的提法和侧重点都是不太一样的,例如美国是把它核心的AI、设计、算法这一块的能力进行强化。德国这方面,它注重提升自己的设备,比如说机床。而在中国,我们则是使用“互联网+”的手段。为什么是“互联网+”?互联网一个最大的好处或者是优势:让很多单体通过网络互联互通,数据能够实时在线。它下一步发挥的作用就是,如何通过把这些单体的数据、状态、行为,做到实时在线以后,能够做很多智能的决策。比如:大家用的高德导航,为什么高德导航可以精确预测你从某一个地方到另一个地方你的路径、时间、实时路况,其实,这就是其他在用高德导航的人在给你贡献数据。这个就是互联网最大的优势。 工业界一直在做工业大数据,实际上,新制造就是利用数据来解决工业问题。数据通过互联网、物联网等多种渠道沉淀下来,进而构成了智能化的基础。2011年,阿里云开始服务于一些中小企业,也是帮助中小企业通过数据优化业务流程。经过那么多年的沉淀,阿里云拥有了完整的大数据体系,技术架构也久经考验。 工业大数据的哲学意义: 人在世界上的终极追求是什么?这是个哲学问题,它需要解决三个问题:我从哪来?我是谁?我要去哪里?数据也是一样,数据从哪来,数据是什么,数据能干什么?我们通过很多数据采集工具来获取数据,数据是从场景中来。然后我们有数据计算引擎和数据加工的一些工具、数据分析的产品,它们考验帮助我们解决数据是什么?我们也通过算法和智能化的应用告诉用户,你的数据怎么用。 大数据是IT技术与应用场景的完美结合 谈到产品应用,我们做的产品其实更多的是和业务场景做结合,阿里云更强调数据怎么用,这是我们的工业大脑要解决的核心问题。在解决这个应用场景的前提之下,我们还需要解决一个平台通用性和性价比的问题。因为在未来的社会,数据一定会呈爆发式增长的。但是从一个基础设施提供商的角度来讲的话,我们一定要保证在这个数据膨胀的大环境下,我们的平台能不能以比较好的性价比来保障我们的服务质量。2015年,阿里云参加全球性大赛,拿了第一名,我们用了7分钟排完了100TB的数据,比当时的记录保持者快了三倍。15年比的是速度,16年比的是成本,大概用了是1.44美元,排序1TB的数据。当时的记录保持者是Google,它当时用了是3块多美元。 阿里云今天做的比较多的场景是跟国计民生相关的行业,比如说工业、城市治理、医疗、并且通过在这些行业落实一些大数据的解决方案,我们渐渐的抽象出来大脑概念。为什么要用大脑来代替我们的产品呢?因为我们认为,智能化的产品必须要像大脑那样接受各种不同的数据类型,未来我们希望我们的产品也会有“声觉、视觉、味觉”等等。我们希望我们的工业大脑能够处理不同来源的数据。被称为大脑的第二个原因是,大脑一定会对外界输入产生一个决策,而且这个决策一定是最优的决策。 ET大脑选项目时,需要考虑三点要素:第一点,数据闭环,你的设备、系统、生产、加工过程、企业运营和经营过程当中,一定要有数据;第二点,企业的生产过程、企业经营的过程要相对集中,数据闭环的路径不能太长;第三点,目标明确,企业要有一个明确的目的,解决什么问题。例如提升效率、优化产品等等。有了这三点要素,我们的ET大脑才能够真正的发挥作用。 工业智能化与传统的工业专家有何区别? ET大脑和传统的工业专家有什么区别呢?我个人觉得最大的区别就是从机理推导转向数据分析。这其中有一个观念的转变:以前是讲逻辑,现在是看数据、讲事实,通过计算与挖掘发现问题,很‘野蛮’。而之前的机理是做实验,通过实验调整参数。但是,机理在很多实际的生产当中是不太实用的,因为在复杂的生产当中,它的参数变量太多。我们做工业大脑的出发点就是为了解决机理的局限性。但这不意味着我们会完全替代以前的机理,因为机理对工业大脑的出现非常重要。它让我们少走很多弯路。它可以告诉我们一些比较有用的先验知识,我们通过数据验证机理,并且有时会带来一些新的洞察。 ET大脑应用的场景大多是在“研、产、销、供、能、环”这些环节,因为ET大脑需要输入,而且还需要根据你的行业进行不同的输入。接着要做出决策,做决策一定是跟业务场景相关的,在业务场景这块,我们更多的是在供、研、产、销,其实这跟企业的各个环节都相关了。因为在这些环节上都是有数据积累的,比如说供应链,销售,研发等等。总之,数据是大脑工作的基础。 ET大脑的成果和未来: 阿里云ET大脑已经做出了很多不错的成果,它帮助企业解决了很多问题,提升了企业的运作效率。 成果 1:协鑫光伏——太阳能电池切片良品率提升 痛点:协鑫光伏太阳能电池硅片生产过程的切片次品率过高,导致生产效率降低,生产成本高。 方案:将阿里云ET工业大脑应用于太阳能电池硅片生产制造领域,监控切片生产参数曲线,推荐最优参数,提升良品率。 价值:通过对太阳能电池切片制造流程进行最优参数推荐,提升了1%的切片良品率,从而大大减少了太阳能电池硅片产品次品率。 成果 2:中芯国际——芯片良率提升 痛点:中芯国际28纳米集成电路芯片生产过程的光罩产品次品率(CD偏差)过高,导致生产效率降低,生产成本升高。 方案:将阿里云ET工业大脑应用于中国顶尖紧密制造领域,对工艺参数进行建模分析,构建预测模型。 价值:通过CD预测建模,预测误差可控制在1纳米左右,大大减少光罩产品次品率。 我们的工业大脑还做了其他很多项目,期间ET大脑也得到了打磨。ET大脑从开始萌芽的时候,它只有婴儿一般的智商,这么多项目下来,这个大脑其实也在不断的进化,它可以学习到各行业的知识,去对接更多行业的数据类型、标准、协议,然后产生面向这些行业智能化的模型。 今天的ET大脑的“智商”才刚刚幼儿园毕业,为了发展ET大脑,我们引入了天池大赛的平台,来对接很多社会上更开放、更复杂的问题。 以上由云栖小组虎说八道整理,毛鹤校审,编辑:郭雪梅
本文由阿里云首席智联网科学家柯镇在苏州云栖大会分享,物联网的使命是数字化物理世界,而AI则是依赖数据而生。当物联网碰上AI,它们会碰撞出什么样的火花呢?阿里云将在整个碰撞过程中起到什么样的作用呢?让我们来瞧一瞧柯镇怎么说?以下为精彩视频内容整理: 物联网的使命是什么? 阿里云首席智联网科学家柯镇认为,“互联网+”可以这样理解,互联网技术是什么呢?大数据、云计算、人工智能。那么这“+”是什么呢?就是物联网!物联网把物理世界抽象到模型世界,来更深的认知物理世界。 这个时代需要阿里云做些什么? 今天阿里云要干一件什么样的事情呢?让认知知识的过程平民化、普惠化。如何让工程师们,开发者们能够掌握更先进的技术,利用更优质的资源呢? 我们要用云计算、大数据来帮助他们。在帮之前,我们要把所有的数据数字化。我们既然数字化了整个物理世界,那么就有了一个虚拟世界。我们90年代把整个图书馆数字化以后,我们建立了一个统一的浏览数字世界的工具。 同样的,阿里巴巴未来将利用语音交互、图像识别建立一个统一的交互方式来浏览我们的物理世界,这样就可以让人与机器,机器与机器,机器与环境之间产生一个非常强烈的互动,这是未来物联网十五年要干的事情。未来人跟机器,人跟环境将会无缝的进行联动,就是说,未来时间跟环境建立一个时空关系,在时空关系下,你能把设备的数据,行为的数据利用边缘计算、云计算的能力,利用规则化、机器学习的算法进行感知,从而进行智能决策。这样才能使物联网,人,机器跟环境自然的进行无缝的连接。 我们要干的一件事情:统一协议的标准办法,你的空调,无论是格力的空调还是美的的空调,通过物理世界抽象到数字世界也要有统一的协议标准规范。然后利用云端一体化的计算能力,智能家庭将变得触手可及。比如说,摄像头可以和门锁或者门禁联动起来,一看是主人回来了,门锁或门禁就自动打开了。系统知道主人再过5分钟就要回家了,就自动打开空调。机器检测到家庭的空气有些浑浊,就自动打开净化装置。这才是智能化的场景,能够把整个房间变成一个智能手机一样浑然一体的智能系统。 阿里云将成为一个这样的角色? 阿里云要在物联网时代未来这十五年之间,阿里云要成为智联网时代的引路人,我们要致力于打造智联网时代的操作系统、集成式开发环境、编程语言和人机交互方式。这四个东西,同时也是PC时代最重要的四个要素。在物联网时代,云平台,边缘计算平台构成了物联网时代的操作系统。也就是说,未来计算才是一切。操作系统不再是一个简单的跑在单片机上的10K的软件,而是云与端一体化的操作系统。 既然云与端一体化,我们阿里云也致力于为物联网开发的大师们提供一站式的开发平台。在这个开发工具上,你能开发你的APP,你也可以开发你的服务java、网页、设备,在阿里云的一站式开发平台上,全面开发你的物联网应用。有了阿里巴巴一站式开发平台,你就是全栈的开发工程师。物联网的全栈开发工程师,绝对不是像移动时代 APP开发工程师分为前端和服务端。物联网全栈工程师包含有APP、服务端、前端、设备端、安全、大数据、边缘端。物联网的全栈开发工程师将会是无价之宝。 我们也将重点构建多个场景应用信息,比如说智慧全物的开放平台、智慧园区的开放平台、智慧城市的开放平台,还有智慧工业的开放平台。我们把智慧工业和智慧城市中得到的信息沉淀在我们平台上,让它成为模板以便物联网的开发者们使用。 正在成长的开发平台! 我们正在打造阿里云的智慧城市平台。阿里云的智慧城市,首先,从顶层的规划上开始打造了一个智慧小镇的新城。之前每一个环卫局、环保局、公安局他们都有自己的数据。而我们要干的一件事是什么呢?我们首先把环卫局,环保局,公安局的数据全都连到一起,然后,我们让他们把数据打通。打通数据非常关键,例如今天我们要打通智慧停车和智慧交通,车来了,需要从主要的交通干道下来,需要自动要连到我智慧停车系统上,这两个一旦打通,那你才能真正解决端到端的人机体验。第二个智慧城市要干的一件事,我们生态的应用。我们很多人做硬件设计、应用的开发我们需要将他们整合到一起,这样是提升用户体验的最佳方式。第三,我们要提供一个数字化的方案,一定要把这些呈现出来,让用户知道。 智慧城市任重道远! 我们要把水电煤等多种应用彻底打通。所以,过去阿里云大概进行了一年的工作,彻底的打通了整个智慧小镇。首先从各个方面,收集了该小镇的“痛点”,比如说政府的诉求,市民的诉求,企业的诉求。其次,我们研究我们到底要解决什么样的痛点,我们到底要建设什么样的亮点。到底什么样的方案是实用的。然后,我们生成了非常详尽的调研报告,参考了很多政府文件。然后第二个步骤,我们还做了很详尽的分析汇总。第三阶段,我们还做了明确的编制方案,明确了特色小镇的建设的目标和技术的框架。重点项目,也跟很多专家进行了详细的研讨。 这是我们支撑智慧城市应用的基本框架: 阿里云的智慧城市将利用产业小镇的丰富的数据资源,首先要完成做好社会管理,提升整个政府管理的效率,让小镇的治理智能化,节约化,人性化。为政府,为人民带来更好的幸福的生活体验。 阿里云物联网的使命是数字化整个物理世界,我们要掀起一场新的认知革命,阿里巴巴要做物联网时代的操作系统,人机界面,编程语言,编程框架,那么让我们赋予每一个物以AI的能力,让我们一起来迎接更加伟大的物联网时代,万物苏醒的时代! 以上由云栖小组虎说八道整理,毛鹤校审,编辑:郭雪梅
更多深度文章,请关注:https://yq.aliyun.com/cloud 循环神经网络(RNN) 人脑因为某种机制的存在,从来不会从头开始思考。当你阅读这篇文章时,你会根据你对以前的词意的理解来理解每个单词。你从来不会把所有东西都扔掉,再从头开始思考。由于这种机制的存在,我们的大脑变得无比高效。算法其实就是模拟我们人类思维的一种真实映射。不管是RNN,还是LSTM它们都是基于人类思维的一种数学表现形式。 但传统神经网络不能做到这一点,这似乎是一个很大的缺陷。例如,想象一下你想要分析一个电影中每个点发生什么样的事件。传统的神经网络是不能够利用电影中以前的事件的来推理出以后的事件。但循环神经网络解决了这个问题。它是具有循环的网络,允许信息持续存在。 在上图中,一个神经网络,A,输入Xt并输出Ht。循环允许信息从网络的一个步骤传递到下一个。 这些循环使得循环神经网络看起来很神秘。然而,如果你在深入的思考一下,那就证明它们并不是一般的神经网络。一个循环的神经网络可以被认为是同一个网络的多个副本,它们每一个都会传递给后继者的消息。考虑如果我们展开循环神经网络会发生什么呢?请看下图: 这种链状特征揭示了循环神经网络与序列和列表的关系非常密切。RNN是用于分析此类数据的神经网络的自然结构。 在过去的几年里,RNN应用于语音识别,语言建模,翻译,图像字幕等各种问题上,并且取得了巨大的成功。这些成功的基础是使用“LSTM”,这是一种非常特殊的循环神经网络,对于许多任务来说,它比标准版本要好的多。几乎所有基于循环神经网络的令人兴奋的结果都是通过它实现的。本文就着重探讨LSTM。 长期依赖的问题 RNN的功能之一就是他们可以能够将先前的信息连接到当前任务,例如使用先前的视频帧可以增加对当前帧的理解。如果RNN可以做到这一点,他们将非常有用。 但有时,我们只需要查看最近的信息来执行当前的任务。例如,考虑一种语言模型,尝试基于以前的单词来预测下一个单词。例如我们试图预测“云在天空 ”中的最后一个字,我们就不需要任何其他的语境。在这种情况下,如果相关信息与所需神经元之间的差距很小,则RNN可以使用过去的信息。 但也有需要更多上下文的情况。考虑尝试预测文本中的最后一个单词“我在法国长大…….我说流利的法语”。最近的信息表明,下一个单词可能是一种语言的名称,但是如果我们想缩小范围确定是哪种语言,我们需要法国的背景,从而进一步的来确定。这时,相关信息之间的差距就变得非常大。不幸的是,随着距离的扩大,RNN无法学会使用过去信息。 理论上,RNN绝对有能力处理类似的“长期依赖”。人们可以仔细挑选参数来解决这种形式的玩具问题。不幸的是,在实践中,RNN似乎没有办法做到这些。Hochreiter(1991)[German]和Bengio等人深入探讨了这个问题。他们发现解决这个问题是非常困难的。幸运的是,LSTM成功的解决了这个问题! LSTM网络 Long Short Term Memory(通常称为“LSTM”)是一种特殊的RNN,能够保存长期的依赖关系。在这个模型中,常规的神经元,即一个将S型激活应用于其输入线性组合的单位,被存储单元所代替。每个存储单元是与一个输入门,一个输出门和一个跨越时间步骤无干扰送入自身的内部状态相关联。它是由Hochreiter&Schmidhuber(1997)介绍,并且许多人对它进行了精炼和普及。 所有的循环神经网络都具有神经网络重复模块链。在标准的RNN中,该重复模块具有非常简单的结构,例如单个tanh层。 LSTM也具有这样的链结构,但是重复模块具有不同的结构。没有一个单一的神经网络层,而是有四个,并且以非常特殊的方式进行交互。 不要担心改变了什么细节。接下来我们将逐步介绍LSTM。现在,先熟悉我们将要使用的符号。 在上图中,每一行都含有从一个节点的输出到其他节点的输入的整个向量。粉色圆圈表示点向运算,如向量加法,而黄色框是神经网络层。行合并表示连接,而行交叉表示其内容正在复制,副本将转送到不同的位置。 LSTM的核心思想 LSTM的关键是细胞状态,即水平线穿过图的顶部。 细胞状态类似于输送带。它直接在整个链上运行,只有一些小的线性相互作用。信息很容易的可以通过它并且保持不变。 LSTM确实具有删除或添加信息到细胞状态的能力,这种能力由被称为门的结构调节使用。门是一种可选择地让信息通过的方式。它们由S形的神经网络层和点向乘法运算组成。 SIGMOID函数输出值是0或者1,它描述每个组件应该通过多少数据。值为0表示“如何都不能通过”,而值为1意味着“让一切通过!” LSTM有三个门,用于保护和控制细胞状态。 一步一步“走过”LSTM LSTM的第一步就是决定我们要从单元格中丢弃什么信息。这一决定是由一个sigmoid layer控制的。它主要控制ht−1和xt之间的计算,输出0或者1。1代表“完全保持”,而0 代表“彻底丢弃”。 我们回到一个语言模型的例子,试图根据所有以前的语料来预测下一个单词。在这样的问题中,细胞状态可能包括当前主题(subject)的词性的分析,从这些分析中,我们可以使用正确的代词或者动词。 下一步是决定我们要在单元格状态下存储的新信息。这有两部分,首先,称为“输入门层”的S形层(sigmoid layer)决定了我们将更新哪些值。接下来,tanh层会创建新的候选值的向量。在下一步中,我们将结合这两个来创建对状态的更新。 在我们的语言模型的例子中,我们希望将新主题的词性可以添加到单元格状态,以替换我们忘记的旧词性。 现在是更新旧细胞状态的时候了,我们把旧状态乘以ft,忘记我们之前决定忘记的事情。然后我们加it∗Ct,这是新的候选状态,按照我们决定更新每个状态值的程度来衡量。 在语言模型的情况下,我们实际上已经删除关于旧主题词性的信息,并添加了新信息,正如我们在之前的步骤中所做的。 最后,我们需要决定我们要输出什么。此输出将基于我们的单元格状态,但这将是一个过滤版本。首先,我们运行一个sigmoid层,它决定了我们要输出的单元格状态的哪些部分。然后,我们把细胞状态通过tanh,并将其乘以sigmoid门的输出,以便我们只输出我们需要的部分。 对于语言模型,由于它只是看到一个主题,它可能需要输出与动词相关的信息,以防下一步需要。例如,它可能会输出主题是单数还是复数,以便我们知道动词应该如何组合在一起。 LSTM变异 到目前为止我所描述的是一个很正常的LSTM。但并不是所有的LSTM都与上述相同。事实上,几乎每一篇涉及LSTM的论文都使用了一个略有不同的版本。差异很小,但值得一提的是它们。 Gers&Schmidhuber(2000)介绍的一种受欢迎的LSTM变体添加了“窥视孔连接(peephole connections)”。这意味着我们让门层看着单元格状态。 上面的图就是增加了所有的门的窥视。 另一种变异是使用耦合的忘记(coupled forget)和输入门。而不是单独决定要忘记什么,我们应该添加新信息,然后一起做出这些决定。 LSTM的更显著的变化是由Cho等人(2014)介绍的门控循环单元或GRU 。它将忘记和输入门组合成一个单一的“更新门”,还合并了单元格状态和隐藏状态,并进行了一些其他更改。所得到的模型比标准LSTM模型更简单,并且越来越受欢迎。 这些是最显著的LSTM变体。还有很多其他的,如Yao等人(2015)的 Depth Gated RNNs 。还有一些完全不同的处理长期依赖的方法,例如Koutnik(2014)等人的 Clockwork RNNs。 哪些变体最好?分歧是否重要?Greff等人 (2015)做了一个很好的比较流行的变种,发现这些变异都是一样的。Jozefowicz,et al(2015)测试了一万多个RNN架构,发现在某些任务上它们的表现比LSTM更好。 结论 此前,我说人们通过RNN取得了显著的成果,这些成果基本上都是使用LSTM实现的。这足以表明LSTM的强大。可能写成一组方程式,会让LSTM看起来很吓人。但我希望在这篇文章中你会对它有一个认识,使他们变得更加平易近人。 LSTM是RNN发展的一大步。很自然的想法:还有另一大步吗?研究人员的共同观点是:“是的!还有下一步,值得关注!“这个想法是让RNN的每个步骤从一些较大的信息集合中挑选信息。例如,如果您使用RNN创建描述图像的标题,则可能会选择图像的一部分来查看其输出的每个字。事实上,徐(2015)做到了这一点 ,如果你想要引起注意,这可能是一个有趣的起点! 致谢 我很感谢一些人帮助我更好地了解LSTM, 我非常感谢Google的同事们有用的反馈,特别是Oriol Vinyals,Greg Corrado,Jon Shlens,Luke Vilnis和Ilya Sutskever。我也感谢许多其他朋友和同事花时间帮助我,包括达里奥·阿莫德迪和雅各布·斯坦哈特。 本文由@阿里云云栖社区组织翻译。 文章原标题《Understanding LSTM Networks》 作者:colah 博客:http://colah.github.io 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树是一种基本的分类和回归方法,学习通常包含三个步骤:特征选择、决策树的生成和决策树的剪枝。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。分类树(决策树)是一种十分常用的分类方法。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来做预测。 一个简单的决策树分类模型:红色框出的是特征。 在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。Leo Breiman和Adele Cutler发展出推论出随机森林的算法。随机森林在过去几年一直是新兴的机器学习技术。它是基于非线性的决策树模型,通常能够提供准确的结果。然而,随机森林大多是黑盒子,经常难以解读和充分理解。在这篇博客中,我们将深入介绍随机森林的基本原理,以更好地了解它们。我们首先看看决策树和随机森林的构建块。这项工作是由Ando Saabas(https://github.com/andosa/treeinterpreter)完成。可以在我的GitHub上找到在这个博客中所需的代码。 决策树如何工作? 决策树以迭代地方式将数据分解成不同的子集来工作:对于回归树,选择它们来最小化所有子集中的MSE(均方误差)或MAE(平均绝对误差)是个不错的选择;对于分类树,选择分解数据以便最小化所得到的子集中的熵或基尼杂质。所得到的分类器将特征空间分成不同的子集。根据观察到的子集进行观察的预测: 图为:决策树的迭代 决策树的贡献值 以鲍鱼数据集为例。我们将尝试基于贝壳重量,长度,直径等变量来预测其头数。为了说明的目的,我们拟合一个浅层决策树。我们通过将树的最大深度限制为3级来实现。 图为:用于预测环数的决策树路径 为了预测鲍鱼的头数,决策树将沿着树向下移动,直到达到叶。每个步骤将当前子集分成两部分。对于特定的分割,确定分割的变量的贡献值(contributions)被定义为平均数量的变化。 例如,如果我们拿一个贝壳重量为0.02和长度为0.220的鲍鱼,它将落在最左边的叶子中,预计的头数为4.4731。 壳重的贡献值(contributions)结果是: (7.587 - 9.958) + (5.701 - 7.587) = -4.257 长度的贡献值(contributions)结果: (4.473 - 5.701) = -1.228 这些贡献值(contributions)结果意味着特定的壳体重量和长度值可以预测其鲍鱼的头数。 我们可以通过运行以下代码获得这些贡献值(contributions)结果。 from treeinterpreter import treeinterpreter as ti dt_reg_pred, dt_reg_bias, dt_reg_contrib = ti.predict(dt_reg, X_test) 该变量dt_reg是sklearn分类器对象,X_test是一个Pandas DataFrame或numpy数组,其中包含我们希望得出预测和贡献值的特征。dt_reg_contrib是具有(n_obs,n_features)的2d numpy数组,其中n_obs是观察n_features次数。 我们可以为给定的鲍鱼绘制这些影响元素,以查看哪些特征最能影响其预测头数。从下图可以看出,这个特定的贝壳的体重和长度值对预测的头数有很大的影响。 图为:例子的贡献值图(决策树) 我们可以通过使用小提琴图比较特征对鲍鱼头数预测的影响。这将内核密度估计覆盖到图上。在下图中,我们看到鲍鱼的体重对其头数的影响最大。实际上,壳重量值给它带来了更大的影响。 图为:小提琴贡献值图(决策树) 上述情节虽然有洞察力,但仍不能充分了解具体变量如何影响鲍鱼的头数。相反,我们可以绘制给定特征对其值的影响程度。如果我们绘制壳重量与其影响程度的关系,我们可以获得增加壳重量会增加影响程度的见解。 图为:贡献值与壳重的关系(决策树) 我们可以看到,减轻壳重量与影响程度具有非线性,非单调关系。 扩展到随机森林 确定特征贡献的过程当然可以通过对森林中所有树木的变量进行平均贡献来扩展到随机森林。 图为:小提琴贡献值图(随机森林) 因为随机森林本身是随机的,所以在给定的壳体重量上有贡献的变化。然而,平滑的黑色趋势线显示出增长趋势。与决策树一样,我们看到增加的壳体重量对应于更高的贡献值。 图为:贡献值与壳重的关系(随机森林) 再次,我们可能会看到复杂的,非单调的趋势。直径似乎在约0.45的贡献下降,在0.3和0.6附近的贡献峰值。除此之外,直径和环数之间似乎有越来越大的关系。 图为:贡献值与直径的关系(随机森林) 分类 我们已经表明,回归树的特征贡献值来源于它在连续分裂中的变化。我们可以将其扩展到二项式和多项式中分类,而不是看每个子集中某个类的观察的百分比。特征的贡献值是观察从该特征引起的百分比的总体变化。 这个例子更容易解释。假设我们试图预测性别,即鲍鱼是公还是母,婴幼儿还是成年? 图为:多项式分类的决策树路径 每个节点具有3个值,子集中的雌雄,雄和婴幼儿的百分比。内脏重量为0.1和壳重量为0.1的鲍鱼最终落在最左侧的叶中(概率为0.082,0.171和0.747)。 内脏重量对婴儿鲍鱼的贡献值是: (0.59 - 0.315) = 0.275 壳重量的贡献值是: (0.747 - 0.59) = 0.157 我们可以为每个贡献值类绘制一个贡献图。以下是我们为婴儿类分析的结果。 图为:观察的婴儿小提琴的贡献值图(多类决策树) 和以前一样,我们还可以绘制每个特征类的贡献。随着壳重量的增加,鲍鱼是母的几率就增加,而作为婴儿的几率则下降。对于公的,当壳重超过0.5时,几率最初增加,然后减小。 图为:每个特征类的贡献值与壳体重量(随机森林) 总结: 我们可以在这篇博客中看到,通过查看路径,我们可以更深入地了解决策树和随机森林。这是特别有用的,因为随机森林是一个非常难理解的结构,通常是高性能的机器学习模型。为了满足业务需求,我们不仅需要提供高预测性的模型,而且也是一个可以解释的模型。也就是说,我们不想提供一个黑盒子。这个要求其实很重要,因为我们的模型可以合规性的传递下去,让更多的人使用。 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《interpreting-decision-trees-and-random-forests》 作者:Greg Tam Pivotal工程师 博客地址: http://engineering.pivotal.io/authors/gtam/ 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 看深度学习框架排名第一的TensorFlow如何进行时序预测——第一篇 时间序列分析是一种动态数据处理的统计方法。根据对系统进行观测得到的时间序列数据,用曲线拟合的方法对系统进行客观的描述。 如今,时间序列数据出现在金融,信号处理,语音识别和医学等诸多领域。解决时间序列问题的标准方法通常需要手动提炼数据特征,然后才能将其输入到机器学习算法中。这通常还要求开发设计人员掌握数据所属学科领域的知识特征,以便在算法中加入特征过滤。例如,如果处理信号(即EEG信号的分类),则需要掌握的知识特征涉及各种频带的功率谱及Hjorth参数。对于认真钻研本领域的程序猿来说,这简直就是噩梦。 那么是不是不掌握这些学科领域的知识特征,我们就没有办法进行模型设计了呢? 其实答案不然,在图像分类领域也出现了类似的情况。但是,随着深度学习的出现,卷积神经网络(CNN)的性能已经可以胜过这种人工提取特征的方法。CNN不需要任何手动设置任何的图像特征。在训练过程中,随着层次越来越深,CNN越来越复杂,进而它自己会学习得到许多“过滤器”,并在最终的分类器中使用它们。 在这篇博客文章中,我将讨论使用深度学习的方法对时间序列数据进行分类,而无需手动设计特征。我在本文中将使用到的例子是UCI存储库中经典的人类活动识别(HAR)数据集。该数据集包含原始时间序列数据,以及具有561个预处理数据的工程特征。在博客中我会比较使用工程特征与深度学习这两种方法(卷积和复现神经网络),并表明深度学习可以超越前者的性能。 在本文中我将使用Tensorflow来实现和训练博客中所用到的模型。在下面的讨论中,提供了代码片段来解释实现过程。有关完整的代码,请参阅我的Github资源库。 卷积神经网络(CNN) 第一步是将数据投射到具有一定形状的numpy数组中:(batch_size, seq_len, n_channels),其中batch_size是训练期间批次中的示例数,seq_len是时间序列的长度(在我们的情况下n_channels为128),并且是进行测量的通道的数量。在本文的小例子中,有9个通道,每3个坐标轴包括3个不同的加速度测量。每次观察有6类活动LAYING, STANDING, SITTING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS, WALKING。 首先,我们为输入到计算图的数据创建占位符: graph = tf.Graph() with graph.as_default(): inputs_ = tf.placeholder(tf.float32, [None, seq_len, n_channels],name = 'inputs') labels_ = tf.placeholder(tf.float32, [None, n_classes], name = 'labels') keep_prob_ = tf.placeholder(tf.float32, name = 'keep') learning_rate_ = tf.placeholder(tf.float32, name = 'learning_rate') inputs是将输入的张量馈送到计算图,并将其数组第一个位置设置为None,以便允许可变的批量大小。labels_是要预测的一个热编码的标签,keep_prob的作用是在退出正则化中保持概率来防止过度拟合,并且learning_rate_是Adam优化器中使用的学习率。 我们将通过使用移动序列的一维内核构造卷积层(与使用2d卷积的图像不同)来构造卷积层,这些内核作为在训练过程中的过滤器。像许多CNN架构一样,层越深,过滤器数越多。每个卷积之后是汇集层,以此减少序列长度。下面是可能可以使用的CNN架构的简单图片: 上面描述的卷积层如下实现: with graph.as_default(): # (batch, 128, 9) -> (batch, 32, 18) conv1 = tf.layers.conv1d(inputs=inputs_, filters=18, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu) max_pool_1 = tf.layers.max_pooling1d(inputs=conv1, pool_size=4, strides=4, padding='same') # (batch, 32, 18) -> (batch, 8, 36) conv2 = tf.layers.conv1d(inputs=max_pool_1, filters=36, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu) max_pool_2 = tf.layers.max_pooling1d(inputs=conv2, pool_size=4, strides=4, padding='same') # (batch, 8, 36) -> (batch, 2, 72) conv3 = tf.layers.conv1d(inputs=max_pool_2, filters=72, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu) max_pool_3 = tf.layers.max_pooling1d(inputs=conv3, pool_size=4, strides=4, padding='same') 一旦达到最后一层,我们需要张量平坦化并将其输送到具有正确数量的神经元的分类器中(上图中的144个)。模型功能: 1. 计算softmax交叉熵,这是多类问题中使用的标准损失度量。 2. 从最大概率以及精度预测类标签。 功能实现代码如下: with graph.as_default(): # Flatten and add dropout flat = tf.reshape(max_pool_3, (-1, 2*72)) flat = tf.nn.dropout(flat, keep_prob=keep_prob_) # Predictions logits = tf.layers.dense(flat, n_classes) # Cost function and optimizer cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels_)) optimizer = tf.train.AdamOptimizer(learning_rate_).minimize(cost) # Accuracy correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy') 其余的实施部分涉及向图表馈送批次的训练数据并评估验证集的性能。最后,对测试集进行评估。采用上述架构batch_size=600,learning_rate =0.001(默认值),keep_prob= 0.5,500训练次数,我们得到98%的测试精度。下面的图表显示了训练/验证精度如何通过训练次数演变: 长短期记忆网络(LSTM) LSTM在处理基于文本的数据方面非常受欢迎,在情感分析,语言翻译和文本生成方面也相当成功。今天我们就用LSTM来解决我们今天的问题。 以下是可以在我们的问题中使用的示例架构: 为了将数据传送到网络中,我们需要将数组分成128个,每个的形状我们定义为:(batch_size, n_channels)。然后,单层神经元将把这些输入转换成LSTM细胞,每一个都具有维度lstm_size。该参数的大小选择要大于通道数。这是一种类似于在文本应用程序中嵌入图层的方式。为了实现,占位符与上述相同。以下代码段实现了LSTM层: with graph.as_default(): # Construct the LSTM inputs and LSTM cells lstm_in = tf.transpose(inputs_, [1,0,2]) # reshape into (seq_len, N, channels) lstm_in = tf.reshape(lstm_in, [-1, n_channels]) # Now (seq_len*N, n_channels) # To cells lstm_in = tf.layers.dense(lstm_in, lstm_size, activation=None) # Open up the tensor into a list of seq_len pieces lstm_in = tf.split(lstm_in, seq_len, 0) # Add LSTM layers lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size) drop = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob_) cell = tf.contrib.rnn.MultiRNNCell([drop] * lstm_layers) initial_state = cell.zero_state(batch_size, tf.float32) 上面的代码段中有一个重要的技术细节。我将阵列重新整形(batch_size, seq_len, n_channels)到(seq_len, batch_size, n_channels),这样tf.split就可以在每个步骤中将数据(由第零个索引)正确地分割成数组列表。其余的是LSTM实现的标准,包括构建层(包括正则化的退出),然后是定义初始状态。 下一步是通过网络实现前向传递和成本函数。一个重要的技术方面利用梯度剪辑,因为它通过防止反向传播期间的爆炸梯度来改善训练。 with graph.as_default(): outputs, final_state = tf.contrib.rnn.static_rnn(cell, lstm_in, dtype=tf.float32,initial_state = initial_state) # We only need the last output tensor to pass into a classifier logits = tf.layers.dense(outputs[-1], n_classes, name='logits') # Cost function and optimizer cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels_)) # Grad clipping train_op = tf.train.AdamOptimizer(learning_rate_) gradients = train_op.compute_gradients(cost) capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad,var in gradients] optimizer = train_op.apply_gradients(capped_gradients) # Accuracy correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy') 请注意,仅使用LSTM输出顶部序列的最后一个成员,因为我们正在尝试每个序列预测一个数字。其余的类似CNN,我们只需要将数据提供给图表进行训练。lstm_size=27,lstm_layers=2,batch_size=600,learning_rate=0.0005,和keep_prob=0.5,我获得95%的准确度的测试集。这比CNN的结果还差,但还是不错的。这些超参数的更好选择会改进的结果。 与工程特征进行比较 在此之前,我已经使用561个预先设计的特征测试了一些关于这个问题的机器学习方法。性能最好的模型之一是梯度提升树(gradient booster)(树形或线性),其结果是96%的精确度(您可以从这本笔记本中了解更多信息)。CNN架构优于梯度提升树,但LSTM的性能相较于梯度提升树(gradient booster)就稍差一些。 总结: 在这篇博客文章中,我已经说明了如何使用CNN和LSTM进行时间序列分类,并证明深层架构可以胜过预先设计的功能特征训练的模型。除了达到更好的准确性外,深度学习模式还“培养”了自己的功能。这是非常可取的,因为人们不需要具有来自数据来源的领域专长,能够训练准确的模型。 我们在这篇文章中使用的序列相当小(128步)。人们可能会想,如果步骤数量很多,那么今天我讨论的这些架构的可训练性是否还有?如果有?会发生什么。我认为一种可能的架构将涉及LSTM和CNN的组合,其对于较大的序列(即> 1000,对于LSTM是有问题的)可以更好地工作。因为在这种情况下,具有汇集作用的几个卷积就可以有效地减少前几个层中的步数,并且得到的较短的序列可以被反馈送到LSTM层。这种结构的一个例子最近被用于从移动设备记录的心房颤动检测。如果你有兴趣了解这种长序列的方法可以去研究它。 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《time-series-classification-with-tensorflow》, 作者:burakhimmetoglu 作者博客:https://burakhimmetoglu.com/ 译者:袁虎 审阅:主题曲 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 图片来自知乎 机器学习,是人工智能的一个子领域,主要关注于开发一些让计算机可以自动“学习”的技术。更具体说,机器学习是一种用于创建数据集分析程序的方法。机器学习跟统计学有着重要的关系,因为这两个领域都是研究数据分析,但是机器学习又不像统计学,机器学习关注的是计算实现的算法复杂度。 统计学,是在统计实践的基础上,自17世纪中叶产生并逐步发展起来的一门社会学科。它是研究如何测定、收集、整理、归纳和分析反映客观现象总体数量的数据,以便给出正确认识的方法论科学,被广泛的应用在各门学科之上,从自然科学和社会科学到人文科学,甚至被用来工商业及政府的情报决策之上。 随着机器学习的不断兴起,处理数据的鼻祖统计学认为:模式识别和机器学习里面全都是统计理论。但是机器学习者认为ML更强调algorithm-oriented(面向算法),而统计学的话更偏重于model-oriented(面向模型)。换言之,机器学习更加强调算法的结果要好,所以机器学习很关注损失函数(差不多就是描述预测与实际之间的偏差,跟残差的概念有一点点像)。而统计学要先扔出来一大堆模型假设,然后站在模型上面通过严格的数学推导做出结果。 在整个历史上,机器学习(ML)与统计学的关系一直是很僵硬的,就像一个男的不小心出现在前女友的婚礼招待会上,既不知如何对话,又痛苦地意识到潜在的尴尬。这是因为机器学习采用了许多统计方法,但从来没有意图取代统计学,甚至是维持原本统计学的基础。然而,统计学家和ML从业者往往最终在一起工作或者从事类似的任务,并且想知道每一个问题。问题是“ 机器学习与统计学到底有哪些不同?“这个问题现在已经问了几十年了。 机器学习是一个混合领域,从各种领域获取灵感和技术,这也是ML更加让人难以理解的原因吧。由于统计学能被更好地理解为一个领域,而ML似乎又与之重叠,两者之间的关系问题频繁出现。已经给出了许多答案,从中立或不屑一顾: · “机器学习本质上是一种应用统计的形式” · “机器学习是被美化的统计学” · “机器学习本质就是将统计数据扩大为大数据” · “简短的答案是没有区别” 可疑或贬损的答案: · “机器学习是不能通过统计课程的计算机科学专业的人瞎搞出来的”。 · “机器学习是统计学减去模型和假设的应用,是不科学的。 · “我不知道机器学习在十年内会是什么样子,但无论如何,我相信统计学家们会呜咽。” 关于机器学习和统计学,上面的答案有些口水仗的意思。更糟糕的是,哪些领域“拥有”什么技术问题?逻辑回归是统计学还是机器学习?如果在Spark中实现又如何实现?回归分析真的是机器学习吗?我们已经看到许多答案,我们认为是误导,不相干,混乱,甚至是错误的。 我们(汤姆,机器学习从业人员,德鲁,统计学家)已经合作了好几年,相互观察数据密集型项目的分析和解决问题的方法。我们花了几个小时尝试了解不同学科的思考过程并讨论差异。 正如我们所看到的,差异不仅仅是算法和经验,而是目标和策略。这两个领域都不是其他领域的一个子集,他们就像两对老人坐在公园里玩两个不同的棋盘游戏。这两款游戏都使用相同类型的棋盘和同一组棋子,但是每个棋子都以不同的规则落子,并且具有不同的目标,因为游戏根本不同。 这个博文的目的就是帮助您解开统计学和机器学习的“爱恨情仇”。 统计: 统计学和机器学习都从数据创建模型,但是是为了不同的目的。统计学家主要关注使用一种称为特殊类型的统计量的度量。这些度量最常见的是平均值和标准偏差。统计学家将这些统计数据用于几个不同的目的,划分领域的一种常见方式是描述性和推论性统计领域。 描述性统计数据涉及描述原始数据的结构,这些描述性统计数据提供了一个更简单的方式来了解什么是非常复杂的数据。 推理统计数据处理关于数据的陈述。该领域真正来自卡尔·皮尔逊(Karl Pearson),费雪(RA Fisher)等人的开创性工作。推理统计试图解决如下问题: · 龙卷风庇护所的人的生存率要高于躲在桥下的人吗? · 通过考虑区域人口的样本,总人口的估计数量是多少? · 在未来的某一年,本市有多少人需要接受治疗? · 您的银行账户应该有多少钱,才能够支撑你每月的消费? · 明天有多少人会在当地的杂货店出现? 这些问题就是估计和预测,如果我们有完整的信息,可能会准确计算这些值。但在现实世界中,总是有不确定性,这意味着你所做的任何预测都有错误的机会。 尽管有不确定性,但仍然需要做出决定,统计提供了制定更好决策的框架。为此,统计学家需要评估与各种结果相关的概率。为了做到这一点,统计人员开始使用模型。在统计中,建模的目标是接近数据,然后理解数据的过程,最后通过理解数据的结果来回答你真正关心的问题。 在实践中,统计学家经常进行简单的分析,有些分析结果并不是真相。但基本思想是健全的,因为在分析中做出的每一个选择都必须是可辩护的。 总之,统计学家主要关注模型的有效性、模型参数的准确估计和模型的推论。然而,对于未知的数据的预测,这不是统计学家的关注点。 机器学习: 机器学习的发展非常曲折,原来它是AI的一部分,关注所有人类智慧行为。在过去的几十年中,它已经转向工程/性能的关注。在机器学习中,主要任务是预测:为了预测而建立模型。我们暂时搁置机器学习的其他问题,因为预测分析是主要的子领域,并且这个领域经常被拿来与统计学比较。 在ML的预测分析中,每个示例都有一个标签,根据问题类型,它可以是类的名称(分类)或数值(回归)。它创建一个模型,其目的是预测。具体来说,学习算法分析数据示例,并创建一个程序,给定一个新的未知的示例,这个示例可以准确预测。然后利用数据的另外一部分,验证模型。或者,可以采用诸如引导或交叉验证的方法以原则方式重用数据。 具有良好性能特征的模型可以预测哪些客户是有价值的,哪些交易是欺诈性的,哪些客户是良好的贷款风险,患者是否患有癌症等等。这一切都假定未来将与过去相似,这是假设一定程度的因果关系,当然,这种因果假设必须得到验证。 请注意,与统计相反,这里的目标是产生最佳的预测。ML开发者通常进行一些探索性数据分析,但只能让数据指导功能选择和模型选择,其目的是纯粹的功能。没有ML从业者准备证明模型的“有效性”,这在机器学习中没有任何意义,因为该模型真的只是对功能性能的辅助。机器学习的格言也可以是:模型的证明在测试集中。 这种方法对ML与统计数有一些重要的影响。 1.ML从业人员不用担心模型假设或诊断。如果模型假设造成不良预测,则只是一个问题。当然,从业者经常执行标准的探索性数据分析(EDA)来指导模型类型的选择。但是,由于测试设置的性能是模型质量的最终仲裁者。 2. 也许更重要的是,ML从业人员不用担心假设被违反的情况,因为模型很可能依然有用。这种情况并不罕见。例如,朴素贝叶斯分类器背后的理论假设属性—独立性,但实际上它在包含依赖属性。 3.通常,预测分析的目标是最终部署预测方法,以便决策自动化。因此,数据科学家必须牢记务实的计算问题:如何实现?它有多快?模型在哪里获取数据?最终决定是做什么的?这样的计算问题对于统计学家通常是不必要的。 对统计学家来说,机器学习可能看起来像一个工程学科。实质上,所有的ML技术都采用单一的诊断测试:在一个保留数据集上的预测性能。而且由于机器学习经常涉及大型数据集,所以ML从业者可以选择非参数模型,这通常需要比参数模型更多的数据。 一个典型的例子,随机森林和推动决策树。这些例子的理论都是非参数化技术,需要相对较大数量的数据来训练。诊断测试也不是假设何时可以使用或不能使用,因为两者都是“黑盒子”模型,产生的都是几乎难以理解的分类器。由于这些原因,统计学家不愿选择它们。然而,令人惊讶的是,它们在预测问题上几乎惊人地成功了,他们在Kaggle比赛中获得了高分。 总结: 总而言之,统计与机器学习领域有很大的区别,如聚类,关联规则,特征选择,评价方法等。统计学和机器学习对数据科学都有很大的贡献,但它们有不同的目标。虽然方法和推理可能重叠,但目的却很少一样。调用机器学习“应用统计”是误导性的,对这两个领域都是不利的。 机器学习通常被教授为计算机科学课程的一部分,统计学由专门数学系的一部分教授。在许多情况下,当提及完全相同的事情时,两个领域都使用不同的术语。将两组合在一起成为一个数据科学团队或许可以创造一个非常有趣的团队氛围。 从根本上说,ML和统计数都靠数据解决问题。机器学习可能强调预测,统计可能更多地关注估计和推论。重要的是,两者的对话可以带来两个方面的改善。例如,诸如正则化和重采样等主题与两种类型的问题都是相关的。 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《machine-learning-vs-statistics》, 作者:Tom Fawcett 汤姆在“数学科学”杂志工作,在实际应用中运用20多年的机器学习和数据挖掘经验。 Drew Hardin 在计算机科学和统计学方面拥有广泛的背景,德鲁喜欢探索数据和发现见解。 译者:袁虎 审阅:主题曲 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 2017年ACL的四个NLP深度学习趋势 (一):语言结构和词汇嵌入(Linguistic Structure and Word Embeddings) 趋势3:可解释性(Interpretability) 我最近一直在思考可解释性,然而我并不孤单,在深度学习实践者中,神经网络的可怕的“黑匣子”质量使他们难以控制,难以调试。然而,从非研究者的角度来看,有一个更重要的理由要求可解释性:信任。 公众,媒体和一些研究人员如果不能理解AI是否可以信任,反而表示更加担心,虽然这些焦虑是有根据的(见“Facebook聊天发明自己的语言”故事)。例如,如果AI系统吸收了训练数据中存在的不必要的偏差,但是我们无法检查这些偏差,那么我们就有一个灾难的系统。第二,由于人工智能系统不完善,有时会失败,所以我们必须能够检查自己的决策,特别是对于比较复杂的任务。第三,即使AI系统运行良好,人类也许总是需要解释来说服自己。 那么到底什么是可解释性?在研究人员看来“可解释性”也可以有许多定义,对于这些定义的看法,我强烈推荐Zachary Lipton的“模型解释的神话”。特别是,利普顿确定了两种广泛的解释方式:事后解释和透明度。事后解释采取学习模式,并从中吸取一些有用的见解;通常,这些见解仅提供模型的工作原理部分或间接解释。透明度更直接地提出“模式如何工作”,并寻求提供一些方法来了解模型本身的核心机制。 事后解释 在今年的ACL,我看到许多论文提出了各种创造性的方法,以获得神经系统的事后洞察。 可视化可能是最常见的事后解释类型,特定类型的可视化(如显着图和字预测)成为标准,这些可视化是有用的。在可视化和理解神经机器翻译中,计算相关性分数,量化了特定神经元对另一个神经元的贡献。论文中提供的可视化看起来非常类似于从注意力分布产生的可视化。然而,计算的方法是不同的。相关性分数是直接衡量一个神经元在受训模型中对下游神经元的影响。Ding等人的相关性分数提供了一种有效的替代方法来测量序列到序列模型中的词级相关性。 转移学习是另一种流行的事后解释技术,其中任务A(通常是高级任务)为学习的代表被应用于任务B(通常是较低级别的任务)。任务B的成功程度表明任务A模型已经学到了任务B。 虽然转移学习和注意力可视化可以告诉你“多少”,但他们不会告诉你 “为什么”。为了回答后者,一些研究人员直接研究了表示空间几何的本身。在神经读者的隐藏状态向量中的紧急预测结构中.Wang et al。他提供证据表明,在基于RNN的阅读理解模型中,隐藏的向量空间可以分解为两个正交子空间:一个包含实体的表示,另一个包含关于这些实体的语句(或谓词)的表示。在用于分析连续词嵌入的参数自由分层图形分簇中,Trost和Klakow对字嵌入进行聚类,以获得层次化的树状结构。根据本文提供的示例,层次结构可以提供更可读的方式来探索词嵌入的邻域结构。 直接进行事后解释的另一种方法是将解释本身视为翻译任务。在翻译神经.Andreas et al。他采取训练进行协作任务的两台机器之间传递的向量信息,并将其转化为自然语言语言。 透明度 尽管从无法解释的神经模型中收集了所有的工作数据,但一些研究者认为盯着神经元只会让我们毫无所获。真正的可解释性要求透明度——构建和训练的模型本身可以解释。 根据定义,语言结构化表示比非结构化表示更容易解释。因此趋势1也可以被看作是向更透明的神经网络模型的转变。神经网络是强大的,因为它们可以学习任意连续的表示。但人类发现离散的信息,比如语言本身,更容易理解。 我们可能担心我们对神经模型的强制性限制会降低其表现力。担心解释性会以有效性为代价。但是,稀疏性诱导正则化可以改善在不损害神经模型的前提下,并且稀疏的词嵌入可以比原始密集法更有效。在多语言序列标签的神经词嵌入的稀疏编码中,Gábor Berend展示了稀疏词嵌入对NER和POS标签的有效性,特别是在有少量训练数据的情况下。 对于回答复杂问题的AI系统,如果人类信任答案,透明度尤为重要。这些系统应该理想地产生答案的证明或推导过程。对于解决数学问题的系统,证明应该是一个逐步的自然语言派生的最终答案。这正是Ling等人提供的基于生成原理的程序导入:学习解决和解释代数词问题。他们的系统不是直接和毫无瑕疵地产生最终答案,而是共同学习产生数学转换的基本序列。 期待 我不确定事后可解释性或透明度是正确的道路。事后可解释性倾向于给出有限的解释,虽然迷人,但通常是隐藏的本身。我认为更灵活的解释技术,是基于翻译的方法。虽然他们提出了关于信任的问题。另一方面,透明度是有吸引力的,因为可解释性应该是一个设计选择,而不是事后的想法。虽然我们还没有建立透明的端到端的神经系统,但是使系统的一小部分透明化也非常有用。请注意,注意机制作为一个健全检查和调试工具有助于开发系统。 趋势4:注意力(Attention) 注意机制正在迅速成为最流行的技术,它可以用于绕过信息流中的瓶颈,它能够实现无法通过前馈层实现的键值查找功能,并提供了一些非常需要的解释性。注意力机制在今年的ACL上有所增加,论文一共有十五篇,比上年的九个有所增加。 无处不在的更多注意力机制 注意机制是序列到序列框架中最可操作的一部分。因此,研究人员通过设计越来越复杂的注意力模型来寻求成功,目标是解决特定的特定任务问题。 有三篇论文提出了问题回答的模式,在这些模型(注意注意力,交叉注意力和门控注意力)中,第三种模型引入了多跳注意力,这使得模型在得到答案之前可以迭代地遍历不同的部分。本文的附录包含几个演示了多跳推理的必要性和有效性的例子。 注意力也已经成为衡量和综合来自多个潜在的多模态信息源的标准方法。Libovicky等人 Lin等人考虑同时通过文本和图像来翻译标题。在这些情况下,注意力很方便,因为它提供了从任意数量的源获取固定大小的表示的一般方法。 其他人发现,在多个维度上应用注意力对某些任务很有用。例如,语法错误纠正需要嵌套注意力:字级注意检测字顺序错误,以及字符级注意检测拼写错误。 所以你需要注意吗? 注意力机制的热情似乎可以证实最近大胆的声称:注意力是你需要的。然而,在ACL,我注意到一些研究人员提供关于潜在的陷阱或注意力错误的警告信息。 例如,有些情况下,我们可能希望注意力不起作用·Tan et al。他认为对于抽象文献总结,注意力分布不能有效地模拟源句子的显著性。相反,他们通过使用深度学习的提取摘要算法(基于PageRank的句子排名),从而获得更大的成功。这个结果作为一个重要的提醒:我们不应该丢弃过去几十年的积累的NLP知识,虽然不时尚,但这些技术可能提供改善我们神经系统的关键。 另外可能在一些情况下,注意力是多余的。Bollman等人 发现当他们引入多任务学习的辅助任务时,增加注意力机制就变得有害而不是有用。作为解释,他们提供了证据表明辅助任务中增加注意力机制是多余的。虽然我不完全理解注意力和多任务学习之间的这种互动,但我们应该注意这一现象,因为它对未来系统的发展构成潜在的陷阱。 期待 虽然注意力最初被认为是解决对序列到序列NMT的瓶颈问题,但事实证明它是一个更为基础和通用的技术。通过考虑为什么关注如此受欢迎,我们可能会了解到当前深度学习社区的需求。例如需要解释性,长距离依赖性以及动态结构。我认为注意力机制只是实现这些事情的第一步。 结论 虽然这只是我参加过的第二个ACL,但我对今年的组委会印象深刻,他们通过透明度,听取社群的意见,并且积极处理这些问题。在这个非常依靠经验驱动的时代,我们认为我们应该追求并做好可以复制和重现的假设驱动的科学。 在深度学习高速发展的这几年,NLP社区有理由感到兴奋和焦虑。但我对社区有信心,随着时代的变化而保持其集体智慧。所以,不需要炒作也不要害怕。深度学习既不是NLP的终极解决方案也不是死亡。 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《machine-learning-vs-statistics》, 作者:abigail Chris Manning教授的博士生 个人网站:http://www.abigailsee.com 译者:袁虎 审阅:主题曲哥哥 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 对于初入门的开发人员来说,这可能是非常困难的事情为LSTM模型准备序列数据。通常入门的开发者会在有关如何定义LSTM模型的输入层这件事情上感到困惑。还有关于如何将可能是1D或2D数字矩阵的序列数据转换可以输入到LSTM输入层所需的3D格式的困难。 在本文中,你将了解如何将输入层定义为LSTM模型,以及如何重新构建可以输入到LSTM模型的输入数据。 看完本文后,你将知道: 如何定义LSTM的输入层。 如何重塑LSTM模型的一维序列数据并定义输入层。 如何重塑LSTM模型的多并行系列数据并定义输入层。 教程概述 本文分为4部分: 1.LSTM输入层。 2.具有单输入样本的LSTM示例。 3.具有多个输入特征的LSTM示例。 4.LSTM输入提示。 LSTM输入层 LSTM输入层是由神经网络第一个隐藏层上的“ input_shape ”参数指定的。这可能会让初学者感到困惑。例如,以下是具有一个隐藏的LSTM层和一个密集输出层组成的神经网络示例。 model = Sequential() model.add(LSTM(32)) model.add(Dense(1)) 在这个例子中,我们可以看到LSTM()层必须指定输入的形状。而且每个LSTM层的输入必须是三维的。这输入的三个维度是: 样品。一个序列是一个样本。批次由一个或多个样本组成。 时间步。一个时间步代表样本中的一个观察点。 特征。一个特征是在一个时间步长的观察得到的。 这意味着输入层在拟合模型时以及在做出预测时,对数据的要求必须是3D数组,即使数组的特定维度仅包含单个值。 当定义LSTM网络的输入层时,网络假设你有一个或多个样本,并会给你指定时间步长和特征数量。你可以通过修改“ input_shape ”的参数修改时间步长和特征数量。例如,下面的模型定义了包含一个或多个样本,50个时间步长和2个特征的输入层。 model = Sequential() model.add(LSTM(32, input_shape=(50, 2))) model.add(Dense(1)) 现在我们知道如何定义LSTM输入层,接下来我们来看一些我们如何为LSTM准备数据的例子。 具有单输入样本的LSTM示例 考虑到你可能会有多个时间步骤和一个特征序列的情况,所以我们先从这种情况讲起。例如,这是一个包含10个数字的序列: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 我们可以将这个数字序列定义为NumPy数组。 from numpy import array data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) 然后,我们可以使用NumPy数组中的reshape()函数将这个一维数组重构为三维数组,每个时间步长为1个样本,那么我们需要10个时间步长和1个特征。 在数组上调用的reshape()函数需要一个参数,它是定义数组新形状的元组。我们不能干涉数据的重塑,重塑必须均匀地重组数组中的数据。 data = data.reshape((1, 10, 1)) 一旦重塑,我们可以打印阵列的新形状。 print(data.shape) 完整的例子如下: from numpy import array data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) data = data.reshape((1, 10, 1)) print(data.shape) 运行示例打印单个样本的新3D形状: (1, 10, 1) 该数据现在可以为input_shape(10,1)的LSTM的输入(X)。model = Sequential() model.add(LSTM(32, input_shape=(10, 1))) model.add(Dense(1)) 具有多个输入功能的LSTM示例 你的模型可能有多个并行数据作为输入的情况,接下来我们来看看这种情况。 例如,这可以是两个并行的10个值: series 1: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 series 2: 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1 我们可以将这些数据定义为具有10行的2列的矩阵: from numpy import array data = array([ [0.1, 1.0], [0.2, 0.9], [0.3, 0.8], [0.4, 0.7], [0.5, 0.6], [0.6, 0.5], [0.7, 0.4], [0.8, 0.3], [0.9, 0.2], [1.0, 0.1]]) 该数据可以被设置为1个样本,具有10个时间步长和2个特征。 它可以重新整形为3D阵列,如下所示: data = data.reshape(1, 10, 2) 完整的例子如下: from numpy import array data = array([ [0.1, 1.0], [0.2, 0.9], [0.3, 0.8], [0.4, 0.7], [0.5, 0.6], [0.6, 0.5], [0.7, 0.4], [0.8, 0.3], [0.9, 0.2], [1.0, 0.1]]) data = data.reshape(1, 10, 2) print(data.shape) 运行示例打印单个样本的新3D形状。 (1, 10, 2) 该数据现在可以为input_shape(10,2)作为LSTM的输入(X)使用。 model = Sequential() model.add(LSTM(32, input_shape=(10, 2))) model.add(Dense(1)) LSTM输入提示 接下来我列出了在为LSTM准备输入数据时可以帮助你的一些提示。 1.LSTM输入层必须是3D。 2.3个输入尺寸的含义是:样本,时间步长和特征。 3.LSTM输入层由第一个隐藏层上的input_shape参数定义。 4.所述input_shape参数是限定的时间的步骤和特征数量的两个值的元组。 5.样本数默认假定为大于1。 6.NumPy数组中的reshape()函数可用于将你的1D或2D数据重塑为3D。 7.reshape()函数会将一个元组作为新定义的形状的参数。 进一步阅读 如果你进一步了解,本部分将提供有关该主题的更多资源。 Recurrent Layers Keras API。 Numpy reshape()函数API。 如何将时间序列转换为Python中的监督学习问题。 时间序列预测作为监督学习。 如果你在LSTM上有任何问题,可以去原文作者博客与之交流。 本文由本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《How to Reshape Input Data for Long Short-Term Memory Networks in Keras》 作者:Jason Brownlee 作者博客地址:http://machinelearningmastery.com/blog/ 译者:袁虎 审阅:主题曲哥哥 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 人工智能的上半场快要结束了,从1956年达特茅斯会议的召开,到2016年人工智能产业的全面爆发,人工智能的基础技术发展已经到达了一个瓶颈期。笔者认为人工智能的上半场是技术的创新,不得不承认的是上半场我们花了太长的时间。 在接下来的几年时间里面,人工智能会转入中场休息阶段,最后人工智能的下半场是我们真正的进入智能时代。说是“中场休息”阶段,实质上是产品的厮杀阶段,同时也是商业模式的探索阶段,未来五年内,人工智能的产品将会成泛滥之势。其实,我们今天就能看到这个势头已经出现了:天猫精灵X1 VS 京东叮咚。但是,不得不承认的是总体体验不如手机好使(to be honest)。 猎豹CEO傅盛曾经说过:人工智能的破局点是技术和产品的结合。我个人认为,与其说是破局点不如说是“去泡沫”的过程。今天人工智能的发展多多少少是有一些泡沫,拼产品或许是唯一且最好的去泡沫的方法。那么开发者需要什么样的产品思维,才能让自己的产品在这场厮杀中生存下来呢?或者说公司需要什么样的产品思路才能在竞争中存活下来呢?今天我们就来谈谈2C端的人工智能产品发展趋势。 笔者认为未来人工智能产品的思维有以下五个趋势: 第一个趋势:交互是人工智能产品的核心 人工智能产品交互才是真正的核心,百度总裁称智能时代的核心本质是:“knowledge in every system, intelligence in every interaction”(知识无处不在,任何交互都是智能的)。在特定的领域中,每个人工智能的产品都应该是可以完美的通过图灵测试的。交互让产品有了“温度”,虽然说这种“温度”并不能够与人与人之间的“温度”相提并论。因为,人与人之间还有一种“温度”是无交互的陪伴,这种无交互的陪伴,可能是现阶段人有别于人工智能的重要区别。 但是,我相信,未来的AI产品因为与用户在一起的时间越来,也可以慢慢提供这种无交互的“温度”,只是永远都不可能做到与人类一样的好。那么到底是什么样的产品在未来可以提供这种无交互的“温度”呢?私人定制化的人工智能产品。 第二个趋势:私人定制化是人工智能产品进化的方向 私人定制化的人工智能产品是未来的一大趋势,也是人工智能产品自主进化的基础。用户真正期待的人工智能产品是一个真正懂自己的产品,这个产品对于用户来说就是独一无二的伴侣。私人定制可以帮助产品逐渐进化成用户独一无二的伴侣,产品与用户待得时间越长,用户和产品之间就会出现相互依赖关系。用户需要产品提供相应的服务,产品需要用户数据继续进化。当然对于用户来说,在这层依赖关系中,用户需要掌握最高的主动权。 但是,今天我们看到的天猫精灵X1和京东叮咚这两款智能音箱的连唤醒词都是内置的,更别说一些其他的私人定制功能。其实唤醒词这种服务,产品一开始设计的时候,就应该是交给用户自己设置的。只有这样才能满足私人定制化的要求。那么产品到底应该是谁设计的呢?产品经理应该将产品的设计权利交还给用户。 第三个趋势:用户才是人工智能产品真正的设计者 乔布斯曾经说过:做产品设计,就是要把5000个细节同时做好。这对于人工智能产品或许就是一个错误的引导,5000个细节同时做好这样的思维应该是属于大批量生产时代的产品思维方式,换句话说就是产品经理的思维方式。用全面解决差异化的思想来解决用户对产品的差异化细节需求,但是有一个事实:乔布斯只有一个。所以未来人工智能产品的设计权应该是交到用户手中。人工智能产品不应该是以产品经理的想法主导产生的,而是应该是通过分析用户数据需求主导的。而在今天,我们有条件、有能力完成这个在过去看似不可能完成的任务。 用户数据主导产品,其实分析用户数据也就是产品细节的来源。让数据消灭产品身上产品经理的主观意志,最大化体现用户的主观意志。真正的人工智能产品,一定是技术、内容、设计的跨界复合体,单靠某一块很难做出真正让用户爽的产品。 第四个趋势:人工智能产品将会像“搭积木”一样简单 人工智能的快速发展为我们提供了:自然语言生产、语音识别、专家系统(决策管理)、生物特征识别、机器人流程自动化、文本分析和NLP(自然语言处理)等诸多人工智能技术。这些技术是未来所有人工智能产品的基础,这些技术的不断优化是人工智能产品在技术性能上的保障。 由于这些技术的出现,它使得我们在打造人工智能产品的时候,就像是搭积木一样简单。根据用户需求,将这些技术进行合理的拼凑,在配上合理的场景,为用户提供最符合场景的内容服务。 第五个趋势:内容服务才是人工智能产品的王道 这是人工智能时代和互联网时代产品唯一相通的地方,不管是什么时候,好的内容服务都是用户最真实的诉求,内容服务也是用户体验最基本的要求。内容服务的另一端是场景,人工智能产品出现在什么样的场景,就会提供什么样的服务。这也充分印证了场景对于产品的重要性,这也是马化腾在贵州提到的场景才是最重要的要素的原因。 内容服务作为产品输出,对于用户来说就是购买产品的价值所在。对于用户而言,他压根不会管你用了什么技术,怎么做成这个产品的。他们唯一关心的事情是这个产品的输出是否能够满足他们的需求。值得注意的是,对于人工智能产品来说,交互也是需求之一。 总结: 人工智能经历了半个多世纪的上半场,是时候进行“中场休息”了。我们常说休息不是停下脚步,而是为了更好的前行。对于人工智能来说,也是如此,或许通过这次“中场休息”,人工智能的泡沫化会减少一些,人工智能的发展会更健康一些。只有拥有正确的人工智能产品的思维,才能在这场“中场休息”的决战中取得胜利。 文章作者:袁虎,审校:我是主题曲哥哥
更多深度文章,请关注:https://yq.aliyun.com/cloud 语言模型是自然语言处理领域的基础问题,其在词性标注、句法分析、机器翻译、信息检索等任务中起到了重要作用。简而言之,统计语言模型表示为:在词序列中,给定一个词和上下文中所有词,这个序列出现的概率。例如:你手机上键盘上方正显示的三个字,系统试图预测你要输入的下一个字词就是语言建模的用途之一。在下面所示的情况下,语言模型预测“from”,“on”和“it”在给定句子中具有很高的下一个单词的可能性。其实输入法系统内部,语言模型都会计算词汇中的每个单词的出现的概率,但是用户只能看到前三个最可能的单词。 语言模型是许多系统的基本部分,它试图解决机器翻译和语音识别等自然语言处理任务。目前,所有的最先进的语言模型都是神经网络。 这篇文章的第一部分提供了一个简单的前馈神经网络来解决这个任务。在帖子的第二部分,我们将通过添加一个循序神经网络(RNN)来改进简单的神经网络模型。最后一部分将讨论两种最近提出的改进基于RNN的语言模型的正则化技术。 一个简单的模型 作为开始,我们将建立一个简单的模型,给出一个单词,然后尝试预测其后的单词。 我们使用one-hot向量来表示单词:我们让词汇表中单词任意排序,然后将该n个词表示为词汇量为(N)大小的向量。其中绝大多数标记为0,只有一个标记为 1,代表当前的词。 该模型可以分为两部分: 我们从编码输入字开始。通过取代表输入字的one-hot矢量(c在图中),并将其乘以(N,200),我们称为输入embedding(U)的大小矩阵。通过该乘法产生一个大小为200的向量,这也被称为词嵌入。该嵌入是当前输入字的密集式表征(dense representation)。该表示的大小要小于表示相同单词的单热矢量,而且它还具有一些其他有趣的属性。例如,虽然由one-hot向量表示的每两个词之间的距离总是相同的,但是这些密集式表征却具有这样的属性,即在意义上接近的词具有在嵌入空间中接近密集式表征。 第二个组件可以看作是一个解码器。在编码步骤之后,我们有输入字的表示方式。我们将它乘上一个大小的矩阵(200,N),我们称之为输出embedding(V)。所得到的矢量大小为N,然后通过softmax函数,将其归一化为概率分布(意味着每个值都在0和1之间,并且它们的和1)。 解码器是一个简单的函数,它接受输入单词的表征,并返回一个模型表示对下一个单词的预测的分布:该模型显示每个单词成为序列中下一个单词的概率。 为了训练这个模型,我们需要一对输入和目标输出字。对于(input, target-output),我们使用Penn Treebank数据集,其中包含来自新闻文章的约40K个句子,并且具有10,000个常用词汇。为了生成模型学习的单词对,我们将从文本中获取每对相邻单词,并将第一个作为输入单词,将第二个单词作为目标输出单词。因此,例如,对于句子“The cat is on the mat”:我们将提取下列词对(The, cat),(cat, is),(is, on)等等。 我们使用随机梯度下降来更新训练中的模型,所用的损失是交叉熵损失。这种损失测量了模型预测的输出分布与每次迭代的目标分布之间的差距。每次迭代的目标分布是表示当前目标字的one-hot矢量。 用于表示语言模型性能的度量标准是测试集的困惑度。最佳困惑度为1,而简单模型的困惑度为183。但,我们可以通过更好的办法来提升其性能。 使用RNN来提高性能 简单模型的最大问题是,为了预测句子中的下一个单词,它只使用单个前一个单词。如果我们可以建立一个能够记住前面几句话的模型,那么它的性能应该会有所提高。我们用一个例子来理解我们为什么这样做!想想下面的例子:词语“喝”是什么?你可能会说“咖啡”,“啤酒”和“苏打水”有可能是它后面的词。如果我告诉你这个词序列实际上是“奶牛喝”,那么你就会完全改变你的答案。 我们可以通过使用循环神经网络(RNN)来增加我们模型的记忆,如下所示。 该模型与简单的模型类似,只是在对当前输入字进行编码之后,我们将所得到的大小为200矢量式提供给两层LSTM,然后输出一个也是大小为200的向量(在每个时间步长内LSTM也会接收到一个向量表示其以前的状态,这在图中未表示出)。然后,我们使用解码器将这个输出向量转换成概率值的向量。(LSTM只是一个更好地记住过去爱好的RNN,它的“API”与RNN的“API”相同,每个时间步长内的LSTM接收到一个输入及其以前的状态,并使用这两个输入计算输出向量。) 现在我们有一个模型,在每个时间步骤内不仅获得当前的单词表示,而且还获取了上一个时间步长中LSTM的状态,并使用它来预测下一个单词。LSTM的状态是以前看到的单词的表示(注意,我们最近看到的单词对这个状态的影响比我们以前看到的有更大的影响)。 正如预期的那样,RNN模型的困惑度为114,性能有所提高,Tensorflow中提供了此模型的实现以及详细的说明。 正则化的重要性 利用RNN虽然能够提高模型的性能,但是我们依然可以做得更好。在本节中,我将介绍一些改进RNN语言模型性能的最新进展。 Dropout: 我们可以通过增加嵌入层和LSTM层来改进模型网络,但是随着层数的不断增加,很快就会停止增加性能,因为网络超出了训练数据的需求。通过规范模型来解决这个问题的一个方法是使用Dropout。 Dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。关于Dropout的介绍:深度学习网络大杀器之Dropout——深入解析Dropout。 下图是基于RNN模型的可视化,展示了三个时间步骤。x是输入序列和y是输出序列,灰色框表示LSTM层。垂直箭头表示来自相同时间步长层的输入,水平箭头表示携带先前时间步长信息的连接。 我们可以在垂直(同一时间步)连接上应用Dropout: 着色箭头代表我们应用Dropout的地方。某个层的缺陷掩码表示那个层被激活归零。在这种情况下,我们对不同的层使用不同的Dropout掩码(这由图中的不同颜色表示)。 将Dropout应用于循环连接会损害性能,因此在初始使用Dropout时,我们仅在同一时间段内的连接上使用它。使用两个LSTM层,每层包含1500个LSTM单元,我们实现了一个困惑度为78的模型创建。 最近引入的variational dropout 解决这个问题,并且通过在每个时间步长使用相同的dropout masks来提高模型的性能(模型困惑度75)。 Weight Tying(权重绑定): 输入嵌入和输出嵌入有几个共同的属性。它们共同的第一个属性是它们都是相同的大小(在我们的具有Dropout的RNN模型中,它们的大小都是(10000,1500))。 他们共有的第二个属性有点微妙。在输入嵌入中,具有相似含义的词由相似的向量(与余弦相似度相似)表示。这是因为该模型得知它需要以类似的方式对类似的单词做出反应(“快速”这个词之后的单词与“极速”一词相似)。 这个属性也出现在输出嵌入中。输出嵌入接收关于下一个输出字(RNN的输出),必须将其转换成概率分布。来自给定RNN的表征,解码器判断单词的概率主要取决于其在输出嵌入中的表示。因为模型想要提升RNN输出性能,就会将类似的概率值分配给类似的单词,类似的单词由相似的向量表示。(再者,如果给定一定的RNN输出,单词“快速”的概率相对较高,我们也预计单词“极速”的概率相对较高)。 这两个相似之处使我们最近提出了一个非常简单的方法:weight tying,以降低模型的参数并提高其性能。我们简单地把输入嵌入和输出嵌入联系在一起(即我们设置U = V,这意味着我们现在有一个单独的嵌入矩阵,既用作输入嵌入和有可以用作输出嵌入)。这使得使用Dropout的RNN模型的困惑度降到了73。 为什么weight tying(权重绑定)可以起到作用? 变化的dropout RNN模型在测试集上的困惑度是75。相同的模型在训练集上实现了困惑度24的成绩。这意味着它已经开始记住仅在训练集中的某些模式或序列,并且不会让模型涉及到数据集不可见的数据。应对这种过度配合的一个方法就是通过降低模型的容量(参数数量)来降低模型的“记忆”能力。通过应用权重绑定(weight tying),我们删除了大量的参数。 除了权重绑定(weight tying)的正规化效果之外,我们提出了改进结果的另一个原因。那就是我们发现输出嵌入中的单词表示的质量远远高于无语言模型的输入嵌入中的表示。在一个权重绑定模型中,因为在每个训练迭代中绑定的嵌入参数更新与未解模型的输出嵌入的更新非常相似,所以绑定的嵌入与未解开的模型的输出嵌入相似。所以在绑定的模型中,我们在模型中使用单个高质量的嵌入矩阵。这有助于提高绑定模型性能(tied model)。 总结:这篇文章介绍了如何通过首先添加一个RNN,然后添加可变化的Dropout和权重绑定来改进一个非常简单的前馈神经网络语言模型。 近几个月来,我们已经看到RNN语言建模方面的最新进展。目前最新的结果由Melis等人最近的两篇论文。这些模型利用上面所示的大多数方法,并通过使用更好的优化技术,如新的正则化方法以及通过为现有模型找到更好的参数来扩展它们。这些方法中的一些将在本指南的第二部分中介绍。 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《Neural-Language-Modeling-From-Scratch》 作者:Ofir 目前作者正关注于自然语言处理领域。 博客:http://ofir.io 译者:袁虎 审阅:主题曲哥哥 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 特征学习在无监督学习方式下的趋势:回归到多元学习的随机目标,利用因果关系来表征视觉特征,以及在强化学习中,通过辅助控制任务增加目标,并通过自发进行预训练。从未标记的数据中学到很多东西,似乎我们只用标签撇去了它的表面。 在这篇文章中,我将向你展示,2017年无监督学习领域发生了什么变化。 无监督学习是机器学习中长期存在的挑战,它被认为是人工智能的重要组成部分。在没有标签的数据中有很多信息,我们并没有完全的使用它,而值得注意的是,大脑的学习机理大多是无监督的学习方式。 为了模拟人脑的终极目标,无监督学习成为了很多研究人员的研究热点。接下来我们就介绍一些近期无监督学习的成果。 第一个成果:多元学习的随机目标 Unsupervised learning by predicting the noise[Bojanowski&Joulin ICML17];这篇论文,今年在ICML中排名第一。想法如下:从超球体采样均匀的随机向量,数值为数据点的数量级。这些将成为回归目标的替代者。事实上,通过以最小化损失进行监督式学习,在深层卷积网络中学习视觉特征,可以将图像与随机向量相匹配。大致过程如图所示: 特别地,在训练过程网络参数的梯度下降交替之间,将伪目标重新分配给不同的图像,以便最小化损失函数。这里是ImageNet的视觉特征的结果;他们都是在ImageNet上训练AlexNet的结果,左边是目标,右边是提出无监督的方法。 在论文中探讨的转移学习,似乎是最先进的。但为什么要这样工作呢?因为神经网络正在学习一个新的特征空间,这是一种隐含的多元学习。通过混合分配进行优化可能是至关重要的,因为不良匹配将不允许将类似图像映射给彼此。此外,网络必须作为信息瓶颈(information bottleneck)。否则,在无限容量的情况下,模型将简单地学习一个不知情的1对1图像到噪声图(Noise map)。 第二个成果:因果关系的重要性 Discovering causal signals in images[Lopez-Paz et al。CVPR17]我从同LéonBottou鼓舞人心的谈话中发现了第二个成果:looking for missing signal,接下来要介绍的是他们的WGAN。这里的讨论重点是关于因果关系。但在谈论之前,让我们再回一下,看看因果关系。 如果你站在机器学习视角中去了解因果关系,你会很快得出结论:整个领域在其基础上缺少一些相当重要的东西。我们创造了一个完整的解决行业问题的方法,那就是只考虑相关性,联想和预测只是考虑训练数据中的相关性,但这在许多情况下不会起到真正的作用。如果我们能够在学习决策中考虑上因果关系的模型会不会有所好转?基本上,我们可以避免卷积网络告诉我们,图片中的动物是狮子,因为背景显示了的Savanna(美国东南部的大草原,有狮子)。 许多人正在努力实现这一想法。这篇论文旨在通过实验验证“图像数据集的高阶统计信息可以告知因果关系”。更准确地说,作者猜测,对象特征和反效应特征是密切相关的,反之亦然,上下文特征和因果特征不一定相关。上下文特征给出了背景,而对象特征是通常在图像数据集中的边界框内,分别是大草原和狮子的鬃毛。 “因果特征是导致图像中对象存在的原因,而抗因素特征是由图像中对象的存在产生的”在我们的例子中,一个因果关系确实是Savanna的视觉模式,而一个反作用的特征将是狮子的鬃毛。 他们是如何进行实验的?首先,我们需要训练一个检测器作为因果方向。这个想法是基于以前的许多工作,实验表明“加性因果模型”可能会在关于因果关系方向的观察数据中留下统计学意义,这反过来可以通过研究高阶矩来检测。(如果这些听起来很陌生,我建议你阅读本文的参考资料)。这个想法是学习如何通过神经网络来捕获这个统计轨迹,该神经网络的任务是区分因果/反效应。 训练这种网络的唯一方法就是对关于因果关系的事实进行标注。这些数据集中并不多。但事实是,这些数据可以很容易地合成,通过采样变量原因-效应和指示方向进行人工标注。 第二,两个版本的图像,无论是对象还是背景消隐,都被标准的深度残留网络特征化。一些对象和上下文被设计在这些特征之上,作为图像是否可能是关于对象或其上下文的信号。 最后我们可以将对象和上下文与形象中的因果关系或反作用关联起来。 通过实验证明了上述猜想,这个实验意味着图像中的因果关系实际上与对象及其上下文之间的差异有关。结果有希望开辟新的研究途径,因为更好的因果方向的算法在原则上将有助于学习在数据分布发生变化时更好的学习特征。因果关系应该有助于通过了解数据生成过程来构建更强大的功能。 第三个成果:使用无监督辅助任务的强化学习 Reinforcement learning with unsupervised auxiliary tasks[Jaderberg et al。ICLR17]根据现行的标准,本文显得有点古老,因为在撰写本文时已经有60篇引文。实际上有一些更新的工作已经建立在这个想法上。我选择这一点,正是因为它具有新颖的洞察力,而不是基于它来讨论更复杂的方法。 第三个成果主角是强化学习。强化学习的研究人员的主要困难是稀缺/延迟奖励。那么为什么不通过引入辅助任务来增强训练信号呢?当然,伪奖励必须与真正的目标相关,而不是借助于人类的监督。 这篇论文的建议是:通过辅助任务的性能总和来增加目标函数(最大化的奖励)。实际上,将有一些模型近似于主要策略和其他完成附加任务的策略;那些模型分享他们的一些参数,例如底层可以共同学习来模拟原始的视觉特征。代理函数必须提高其在奖励方面的绩效,从而提高辅助任务的表现。 论文探讨的辅助任务:首先,像素控制。代理学习是一个单独的策略,以最大限度地改变输入图像上的像素网格。理由是“感知流中的变化通常与环境中的重要事件相对应”,因此学习控制变化是有益的。二,功能控制。训练该代理以预测策略/价值网络的某些中间层中的隐藏单元的激活值。这个想法很有意思,因为代理的策略或价值网络会提取与环境相关的高级功能的任务。三,奖励预测。代理学会预测即将来临的回报。这三个辅助任务可以通过从之前的代理经验的缓冲区经验回放学习。缩短其他细节,整个方法称为UNREAL。它被应用在Atari游戏和Labyrint上学习更快更好的策略。 论文中的最终洞察力在于对像素控制的有效性,而不是简单地预测具有重建损耗或像素输入变化的像素。它们都可以被视为视觉自我监督学习的形式。“学习重建只是导致更快的初步学习,实际上会使得最后的成绩更糟。我们的假设是,输入重建会损害最终的表现,因为它将过多的重点放在重建视觉输入的不相关部分而不是视觉线索的奖励。 第四个成果:Self-Play让学习过程更快 Intrinsic motivation and automatic curricula via asymmetric self-play[Sukhbaatar et al。arXiv17].我想强调的最后一个论文与上述强化学习辅助任务的想法有关。但是,至关重要的是,不是明确地调整目标函数,而是在一定程度上对代理进行了训练,以完成自我优化,更简单的自动完成任务。 通过将代理分解为“两个独立的头脑”,Alice 和Bob,建立了Self-Play的初始阶段。论文作者提出Self-Play,假设环境必须可逆或重新设定为初始状态。在这种情况下,Alice执行一个任务,并要求Bob执行相同操作,等到Alice最终达到我们可观察的状态。例如,Alice可以拿起钥匙,打开一扇门,在某个地方关上灯光和停止,Bob必须遵循相同的行动清单并停在同一个地方。最后,你可以想象,这个简单的环境的原始任务是在房间里的一个灯点亮: 这些任务由Alice设计,迫使Bob学习与环境的互动。而且Alice和Bob有其独特的奖励功能:如果Bob在最短的时间内完成,Bob就会得到回报;而当Bob花费更多的时间,同时能够实现目标时,Alice就会得到回报。这些策略之间的相互作用允许他们“自动构建探索课程”。 他们在星际争霸的上测试了这个想法,没有敌人打架。“目标任务是建造海事单位。为此,代理必须遵循具体的操作顺序:(i)矿工与工人;(ii)积累足够的矿物质供应,建造军营。(iii)军营一旦完成后,将海洋单位列入其中。代理可以训练新的工人来进行更快的采矿,或者建造供应仓库以容纳更多的单元。经过200个步骤,代理为每个海军建造+1。 “由于完全匹配游戏状态几乎是不可能的,Bob的成功只是基于游戏状态,包括每种类型(包括建筑物)的单位数量和积累的矿物资源。所以Bob的自我发挥的目的是在尽可能短的时间内与Alice一起制造尽可能多的单位和矿物。在这种情况下,Self-Play真的有助于加速学习过程,并且更好地融合Reinforce +一个更简单的预训练的基准方法: 请注意,情节没有考虑到预训练策略所花费的时间。 总结: 无监督学习虽然很难,但是衡量其表现更加困难。在Yoshua Bengio的话中:“我们不知道什么是好的代表,我们没有一个很好的定义,即什么是正确的目标函数,即使衡量一个系统在无人值守学习方面做得很好。” 事实上,几乎所有在无监督学习的模型中都使用监督或强化学习来衡量这些特征是多么有用。 参考 1.[Bojanowski&Joulin ICML17] Piotr Bojanowski和Armand Joulin,Unsupervised learning by predicting the noise,ICML17。 2.[Bojanowski et al。arXiv17] Piotr Bojanowski,Armand Joulin,David Lopez-Paz和Arthur Szlam,Optimizing the latent space of generative networks,arXiv17。 3.[Jaderberg et al。ICLR17] Max Jaderberg,Volodymyr Mnih,Wojciech Marian Czarnecki,Tom Schaul,Joel Z Leibo,David Silver和Koray Kavukcuoglu,Reinforcement learning with unsupervised auxiliary tasks,ICLR17。 4.[Lopez-Paz et al。CVPR17] David Lopez-Paz,西伯利亚西哈拉,Soumith Chintalah,BernhardSchölkopf和LéonBottou,Discovering causal signals in images,CVPR17。 5.[Louizos et al。NIPS17] Christos Louizos,Uri Shalit,Joris Mooij,David Sontag,Richard Zemel和Max Welling,Causal effect inference with deep latent-variable models,NIPS17。 6.[Matiisen et al。arXiv17] Tambet Matiisen,Avital Oliver,Taco Cohen和John Schulman,teacher-student curriculum learning,arXiv17。 7.[Sukhbaatar et al。arXiv17] Sainbayar Sukhbaatar,Zeming Lin,Ilya Kostrikov,Gabriel Synnaeve和Arthur Szlam,Intrinsic motivation and automatic curricula via asymmetric self-play,arXiv17。 8.[Peters et al。JRSS15] Jonas Peters,PeterBühlmann和Nicolai Meinshausen,Causal inference using invariant prediction: identification and confidence intervals,皇家统计学会杂志17。 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《In search of the missing signals》 作者:Giorgio patrini 任职于UvA-Bosch DELTA实验室(阿姆斯特丹深度学习技术)的博士后研究员 博客:http://giorgiopatrini.org/ 译者:袁虎 审阅:主题曲哥哥 文章为简译,更为详细的内容,请查看原文
前几天收到云栖社区馈赠的王坚博士写的《在线》一书,感触很大。首先,我个人觉得这本书让我们认识到了阿里云的成长历程,也让我们看到了技术执着的阿里人在探索道路上的不折不挠。同时也验证了技术进步背后总会有一群人在默默的付出。也见识了心理学博士王坚对于未来的把握如此准确,准确背后是一种信仰和精神。从发展历程上看,不得不说阿里云是培养CTO的最好的大学,没有之一。 王坚博士在书中提到,大数据这个叫法是有些许错误的。于是,我便带着这个问题:“大数据不叫大数据,那它应该叫什么?”去认真的阅读了此书。下面分享一下,我对这个问题的些许看法。 大数据、云计算是共生体。为什么将它们两个放在一起呢?因为它们两个谁也离不开谁,准确的来说它们两个算得上一对宿命鸳鸯。数据不计算永远产生不了价值,计算没有数据作为基础,算是在做无用功。造词者,当时可能没有想到大数据、云计算会走到一起。但是,幸运的是,命运千转百回,它们终成伴侣。 它们彼此让自己更有价值,同时也让彼此的真实面容展现出来。回到我们一开始的问题:“大数据如果不叫大数据,它应该叫什么?”云数据,我个人觉得这个词更适合取代大数据这个词。如果按照大数据的体量来讲,世界上的数据能称得上大的,恐怕只有欧洲大型电子对撞机产生的数据,而今天我们讲得最多的“大数据”,是来自互联网的数据。王坚博士在书中提到了数据是由沉淀效益的,准确的来说,沉淀的越多,价值也就越大。 这样一个效益规律不禁让我想起,由水蒸气聚集形成的云。水蒸气越聚越多,在自然重力的作用下形成了雨,滋润了万物。水一直被视为人类生命之源,水创造了万物,价值也就不可用数字来衡量。同样,今天数据也被视为商业动力之源,指导生产生活。我相信未来数据创造的价值也不可用数字来衡量。 王坚博士在《在线》一书中,提到过,数据同样是有聚合效应的,事实已经证明,这种聚合效应也正在创造着巨大的价值。数据和水蒸气还有一个共同的特征,就是可重复利用。 云数据的价值因其所在的领域而定,在这一点上真实的云也是如此。在干旱的地方,水的价值相对来说很大。对于云数据来说,行业数据沉淀的越多,行业发展的也就越健康。在相对意义上来说,可增长价值也就越小。但是,对于行业数据匮乏的领域来说,发展相对艰难,整个行业都期待能有一场春雨来欢聚它们生存的压力,过去我们靠什么?外部的投资,国家的政策。但是,我们发现这些并不能长久解决问题,只是解决了燃眉之急。 其实,到最后大家能意识到的是:只有自己才能解决自己的问题。今天是一个自救的良机,因为有互联网、云数据、云计算的存在。互联网成为基础设施,数据成为生产资料,计算成为公共服务。 王坚博士在《在线》一书中说:数据成为资源,对于万事万物来说,是世界文明进步的标志。因为什么?数据相对于其他资源来说,是我们人自产的,不是来源于自然界。这对于人类来说,是一个相当震慑的消息。之前,我们总是希望自然界能为我们提供足够多的资源,但是我们发现这似乎有些天方夜谭,尽管在理论上来说,我们可以获得足够多的资源。 或许因为数据的出现,不管是行业,还是人,“自救”会成为时代的主题。不管是自然界赋予人类的资源,还是国家政策、外部投资赋予行业新的生命,到最后都会落到“自救”上。这或许也验证了:只有自己才能救自己,这句至理名言的准确性。 其实,这也就引起了数据到底有什么价值?让今天那么多人为它痴狂,也让行业和人类愿意将自己的命运交付给它。我认为数据并不能直接创造价值!互联网高度发展的今天,拥有数据并不算是一件难事,所有拥有处理它的能力和思想就变得至关重要了。数据创造价值的核心是不变的,那就是:让资源利用率最大化。 马云先生在贵州的时候,就提到过计划经济可能会重新回归,同时他也表示计划经济或许是世界上最好的经济形式。之所以称其为最好的经济形式,无非是其效率是真的高。当然,这个观点一出,瞬间受到了很多经济学教的批评。这其中的原因也是因为上个世纪,我们吃过计划经济的亏。正所谓“一朝被蛇咬,十年怕井绳”。 但是,在怕的时候,我们应该回想过去计划经济体系失败在哪里?计划经济体系失败的原因在于,当时科学技术的限制,中央集权自上而下式的计划经济。上面的人靠不靠谱的不完整的数据样本,来制定经济发展规则。而今天马云先生提到的计划经济不是上个时代的计划经济,它们两个在本质上是由巨大差异的。最明显的是今天的计划经济是自下而上的。在使用的数据体量上也是有天壤之别的,数据的使用量带来了质的变化。这个质的改变是计划经济的质。 另外一个新时代的计划经济和旧时代的计划经济的区别是,新时代的计划经济是完全依靠客观实在的数据得到的;而旧时代的计划经济是带有人的主观意志的计划经济,准确的来说是不客观的。推动这一区别显现的是今天人工智能的高速发展。由机器取代人去做决策,这是时代发展的趋势。也是体现新时代的计划经济一种优越性的一个重要指标。 我们今天使用的市场经济是一双看不见的手,而今天即将复活的计划经济本质是一双由市场数据演变成的一双看得见的手。
突破边界到底意味着什么?这对于很多人来说都是一个极其陌生的词语。万通的董事长冯仑先生,曾经说过:能够自动知晓去边界的人都是活在未来的人。对于大多数人来说,在人工智能时代,可能做得最多的不是去边界而是突破边界。 来自网络 因为去边界这个能力这个世界上极少数人才有的功能,去边界是一个自动的过程,没有时代的紧迫感,全凭自然进化的力量推动。这或许就是一种自然的力量,我们过去也都知道,人类经历了那么多年,才有了今天这般模样。但是不得不提的是人类总有几个特殊的个体,嫌弃这蜗牛般的速度。于是出现了像伽利略、牛顿、爱因斯坦等等这样的人物。对于这样的人,我们常人常常坦言说,我们没有生活在同一个时空里。 过去我们大多数人想象的事情都是有一个边界的,这个边界就是一种固定的模式,是一个固定的隐形的墙。这堵墙往往是阻碍人类进步的墙,但是上帝总会眷顾人类,总会派下来几个科学的巨人帮我们把这堵墙给推到。但是殊不知,这堵墙被推倒后,还有另外一堵墙。这也倒是应征了一句至理名言:科学是无止境的。 在生活中,我们往往把一件事情基于这堵时代的墙,想的太绝对。人工智能怎么可能取代我呢,我那么的优秀。我们人类的情感不是最神秘的物质吗?难道机器真的能比我做的好?其实当一个人有这样的疑问时,其实也是在变相的问自己,我真的做的足够好了吗?还是说,我今天的工作极其是富有创造性的,以至于未来机器没办法取代? 在想这个问题之前,我们必须要承认,我们每个人都有认知的边界。无论是空间还是时间,这些都是我们认知的边界。而且这个边界不是我们建立的,而是那些科学巨人帮我们建立的。而且这些边界还没有被突破或者说是已经被突破但是不能得到广泛的认可。就像爱因斯坦曾这样评价量子理论:我无法真正相信(量子理论),因为物理学表示的是一种时间和空间上的实在,容不得超距的幽灵行为。 这里的幽灵行为是量子理论提出的,我们常识性的直觉告诉我们,一个对象不可能同时处在分开的两地。而这正是量子理论想要证明的事情。[y1]如果一旦证明,这将会开启一个人类新文明的开始。对于人工智能来说,这个道理也是一样。今天,我们很多人在大肆宣传人工智能,到底能不能实现呢?这其实就是要靠时间来证明这一切。 但有些事情是可以肯定的,关于失业,产业结构调整等等。对于超人工智能的来临或许还真的需要时间来鉴定。对于失业,产业结构调整等话题的讨论或许一直都没有停止过,所以有人就认为没有什么大不了的。甚至,还有人质疑阿里巴巴董事局马云的话,难道未来,我真的可以一天只工作4个小时? 我觉得,这样的话题是非常值得大家去讨论的,因为结局是大多数人向往的。但是这个话题又是大家极其不想讨论的,因为这个结局导致的结局是什么样的,想必很多人都知道。以我们大多数人现在的认知状态来说,那个画面简直不敢想象。很多人站在招聘市场上,面对的是面试官却是一个取而代之的机器人。其实,现在想想这件事也是挺有意思的,你代替了我在公司的位置,而且你还要来面试我。最后的结果也是可想而知的。 曾经有一个北京媒体报道过的例子,我觉得很有意思,这件事可能大家都知道了。一个文艺女青年,打破传统思维边界,干嘛呢?她把她两室的房子卖掉,大家知道在北京四环以内的两室的房子至少值一千多万,她买了一千多万,那这个零头在洱海买了一套别墅,二三百平米,剩下一千万在北京理财,交给机构理财一年有四五十万,然后拿二三十万租一个类似星城国际这样的公寓,每天还有人打扫。最后还有一千多万放在那儿。 这个女文艺青年获得了什么呢?第一:在洱海上呼吸好的空气,第二:在北京住上公寓,第三:她还有一千万现金,有人替她挣钱,她可以优哉游哉,每天做着自己想做的事情。那么她到底做了什么一件事呢?其实,就做了一件事,那就是打破了传统固有的边界。为什么非要买房才能在大城市里面落脚?为什么非要和大家过一样的生活方式? 可能很多人非常向往这样的生活,自己本来可以过这样的生活,但是又出于很多原因。自己不敢去过这样的生活。其实,换个角度来想,现在大城市房价的上涨的原因,其实跟我们今天大城市里面很多人都是有关系的。只是,我们更愿意将这些原因推脱给其他人。或许,这种说法有些强词夺理了。但是,真的当我们静下心来想想这些事情的时候,只要我们参与到这样一个时代,并且时代影响了我们,我们对这个时代多少也是有些影响的。对于人工智能时代,我们也是扮演这样一个角色。这种关系一直维系着整个社会的发展。 突破数字的边界 当一个人在明天遇到困难,当我们个人的事业没办法继续发展的时候。其实,我们要问一下,你内心的边界是否已经被打破了?当你对现实有不满,当你抱怨人工智能取代你的时候,你是不是也要问一下自己,是不是在你思维的空间里面,仍然坚守的是原来习惯的那套理论方法。有的时候,你换一种,挑战一下你的思维边界,或许那个时候就会有柳暗花明又一村的感觉。 AI时代对于更多的小白来说,不是灾难,更像是一种机遇。因为旧的边界在我们人思维里面存在的时间越长,越不容易打破。 AI时代是突破边界的时代!
机器会思考吗?今天可以会有人告诉我:“机器,当然会思考了”,它们已经能够回答我吗很多问题了,例如微软小冰(一款基于语言识别能力,语言合成技术,大语料库的自然语言对话引擎),我们可以在微信公众号上搜索微软小冰,并且进行体验与机器人聊天的过程。在体验的过程中,你会发现,当你问她同一个问题的时候,前几次它还会好好的回答。但到了一定次数之后,她也会像人类一样会用戏谑的语言回复你。这真的是思考后的结果吗?如果站在文科生的角度,这肯定是啊,如果不是,机器它一定会机械的一直回复下来。但如果站在了解原理的理科生,这其实就是调整一下控制语句的事情。即(if····else···)。 当然,这里不是嘲讽文科生,因为思维方式的不同,在本质上理科生与文科生没有孰优孰劣之分,只是了解或者不了解的说法。其实,上述的过程就是一次图灵测试,今天大多数的智能系统都能通过图灵测试,无论是面对文科生或者理科生的挑战,归结起来就是数据积累和计算能力的提升,或者算法的优化。 那么人工智能的定义到底是什么呢? 很多人有不同的说法,百度百科给出的定义是:它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。美国斯坦福大学人工智能研究中心尼尔逊教授对人工智能的定义:人工智能是关于知识的学科——怎样表示知识以及怎样获得知识并使用知识的科学。另外一名MIT的温斯顿教授认为:“人工智能就是研究如何使计算机去做过去只有人才能做的智能工作。” 1956年达特茅斯会议召开,人工智能被正式提上日程。那个时候计算能力跟今天的计算能力相差很多,所以大家对人工智能的热情消退的很快。20世纪80年代在,人工智能又火了一段时间,但是那个时候的人工智能被人们视为能力低下的机器。直到1997年深蓝计算机战胜了人类棋王卡斯帕罗夫,人们对人工智能热情才重新被点燃。但是,因为技术和计算能力的限制,人工智能始终没有达到与商业模式接轨的地步,所以人工智能再一次被人们忘记。 2010年前后,随着深度学习技术的成熟,加上摩尔定律的不断发展,还有互联网时代产生的数据,使得人工智能开启了一段复兴之路。特别是2016年Alpha Go的出现让更多的人知道了人工智能这个巨人正在被慢慢的唤醒。例如:2014年,在代表计算机智能图像识别最前沿发展水平的ImageNet竞赛中,参赛的人工智能算法在识别图片中的人、动物、车辆或者其他常见对象时,基于深度学习的计算机程序就已经超过了普通人类的肉眼识别准确率,而且这一技术被迅速应用到无人驾驶汽车上面。 那么计算机是怎么样识别的呢?例如我们将很多张图片让计算机认识,计算机自动提取特征,通过这些图片,形成一个辨认猫的基本思路。这时,我们再拿一张猫的图片,让它辨认,它就能认出这时一张猫来。这样一个思路,在我们普通人看来,可能过于复杂,在我们看来,不就是识别猫嘛?需要那么复杂?当然,这就是人类跟人工智能最大的区别,我们人类擅长的是小样本学习,而人工智能恰恰和我们相反,必须要大样本学习。 再如,今天很多科技公司已经告别了刷卡签到的时代,改为靠人脸识别签到。其实,我认为这个技术并不能跟AI沾上边,因为从技术角度分析,这里面就是图像抓拍,再到特定图库进行对比,再导出图片信息的过程。就算没有到今天这个时代,这个技术实现也没有什么困难。或许人工智能的出现,只是让整个系统的体验更好了。但它也是有很先进的技术支撑的,可能依次抓拍几十个人的图像,不是什么问题。但是如果一下子抓拍几十个人的图像呢?这里面就涉及到了并行计算的技术了,并行计算是人工智能时代一项非常重要的技术,可以说没有并行计算,就不会有今天的人工智能。 AlphaGo并不能代表人工智能,如果人工智能的定义就是AlphaGo,那么人工智能将永无出头之日。人工智能到底会不会取代人?这个问题自人工智能诞生之时,就有人开始讨论了,特别是2016年之后,这个问题更加火爆。 AI其实就是会学习的计算机程序,它不是像有些人说的那样会像人类一样思考。它只是会按照我们人类固化的思维模式,去输出结果。注意,它的思维模式是固化的。而在今天我们的人工智能是在相关领域固化的计算模型,例如:1+1等于多少,如果是在数学领域它肯定会输出2,但是如果你给他一些商业事件或者案例,它可能会输出1+1大于2,并且会将你告诉它的那些案例拿出来,用来佐证它的输出结果。 那它有没有可能,在不经意间打通我们常说的“任督二脉”或者顿悟,已拥有自己的思考方式?我觉得这是不可能的,因为我们人常常所说的顿悟可能就是我们大脑在思考的过程中,脑信号进入了一个我们从来没有到达过的区域。那种亲切感非常奇妙,毕竟,发现新大陆是一个值得让人兴奋的过程。但是,对于机器来说,没有所谓的未知的新大陆,因为这些东西都是我们自己设计的。
AlphaGo(阿尔法狗)到底是什么? 虽然说人工智能偏好下棋,但是不是说人工智能只能下棋,应该说人工智能岂止于下棋。但为什么每次都是在下棋后,人工智能才会大火呢?因为棋术一直以来都被大多数人认为是人类智慧的结晶,人工智能要想被大多数人认可,必须要在大多数人都承认的领域崭露头角。但是,不幸的是,人工智能在大多数人都承认的领域一不小心就战胜了人类。 来自网络 1997年,IBM研究团队打造的深蓝战胜了卡斯帕罗夫,当时几乎全世界都在讨论深蓝的强大和可怕。其实,在1996年的时候,深蓝就曾经挑战过卡斯帕罗夫。但是深蓝失败了,但是,深蓝的失败不仅仅是技术不佳(算法设计问题),其中很大一部分的原因:当时的计算能力确实有限,如果今天深蓝用它失败的算法加上现在的计算能力,估计深蓝仍然可以战胜卡斯帕罗夫。后来的算法优化,计算能力的提升,让这个事件的热度很快就消失了。 因为每当人类输给计算机的时候,他们总会说,计算机只不过是机械地完成搜索式的穷举罢了。其实,事实即使如此,当前的计算能力和算法已经有能力将象棋所有的情况都穷举出来,换句话说就是,象棋已经被计算机攻克了。 我们人类一直以来认为围棋都是人类智慧的最高代表。其实,我觉得下棋跟智慧没有一点关系,我倒是觉得设计这些棋术才是一种真正的智慧。下棋只是在考验我们的计算能力跟储存能力以及价值判断能力罢了。可能,资深的棋友会很厌恶我的这种说法,但是AlphaGo却无疑是佐证我观点最好的选择。 棋术只是在考验我们的计算能力跟储存能力以及价值判断能力,或者对于我们来说,棋术有不确定性。但对于计算机来说,随着计算能力的提升,这种不确定性发生的概率降低了有的甚至这些不确定性成了确定性。也就是说,当你和计算机下棋的时候,你走了第一步后,你就已经输了。因为他已经找到赢你的办法了,你以后的下棋动作纯属是找虐行为。 难道围棋也是如此?这倒不是,因为发明围棋的这个人的思维太超前了,以至于我们现在的计算能力还没有办法将围棋攻克。但是,除了暴力攻克,我们可以在算法上下点功夫,让计算机有很大的概率赢得人类。AlphaGo输给李世石,其实就是小概率事件。 2017年5月25日,升级后的Alpha Go2.0又迎战了著名围棋选手柯洁。据Alpha Go的工作人员介绍,在第二句的时候,柯洁下的非常积极,在这局中人机双方都展示了强大的水平。AlphaGo后台的计算量急剧增加,如果不及时剪枝,可能就算不过来了。无奈柯洁在最关键的时候,漏出了人类的弱点(疲劳和情绪的波动),最后输掉了比赛。 如果从技术的角度来理解分析Alpha Go,Alpha Go其实就是采用人类自身对围棋的理解来设计的,即罗列搜索+价值判断,这也是它学习棋谱后得到的唯一的核心力量。由于围棋所产生的搜索范围空间非常大,基本上很难找到最优解,所以在算法设计上,就又按照人类的思维方式加入了价值判断,这是AlphaGo的核心算法。Alpha Go用深度学习算法去调整一个价值判断函数,然后再跟蒙特卡洛搜索树结合,争取不下一步臭棋。注意是不下一步臭棋,而人类是争取少下一步臭棋,这也就出现了我们常说的赢几手棋。再加上机器不知疲倦的搜索效率和无情感,所以AlphaGo才能胜出。 棋局人生 值得注意的是,人工智能并没有攻克围棋领域,有人曾预言说AlphaGo2.0如果能下几手臭棋或者说是让几手棋,人类将有很大的机会胜出。但是,不幸的是在AlphaGo的价值判断中只有输赢,没有赢几手的概念。但是,可以肯定的说,在围棋领域内,人类将不会有赢AlphaGo的可能性。但,这也不会丝毫影响人与人之间下围棋的体验,相反,人类或许可以从AlphaGo的对局中学到很多妙棋。 人类下棋下的是经验和感觉,而机器下棋下的是概率,是赢对手的概率。
之前,地平线机器人公司创始人&CEO余凯先生曾说,让智能产品又体温。所谓有体温,就是指在人机关系上要坚持以人为主,做有体温的智能产品。其实就一点:让技术和产品帮助我们生活,而非颠覆我们的生活。这个观点,我非常同意。任何技术和产品出发的本质就是要服务人生活,而非颠覆。 但是,许多专家、教授、学者,而且还包括一些社会科学家,他们都在担心十年后人工智能会给我们带来很大的威胁。例如:大量人口失业、贫富差距越来越大(这些是那些社会科学家担心的),人工智能有了思考意识或者是奇点的来临(这些是科技专家和学者担心的)等等。我觉得,这些担心应该有,但是不能无限扩大。社会科学家担心的事情,我想历史会给予答案。而我们技术工作者大多担心,在《奇点临近》一书中所说的,强人工智能会带来所谓的“奇点时刻”。 “人类由于受到缓慢的生物进化的限制,无法与机器竞争,并会被取代。全人工智能的发展可能导致人类的终结。”这是大部分科学家的警世之言。有趣的是,这些科学家大部分来自西方,西方相信上帝的存在。所以,我个人觉得他们说这样的话,还是有一定的根源的。但是,不能排除他们预言的那种可能,唯物辩证法告诉我们,凡是都有它的两面性。而且,我个人认为,大数据等科技的发展,不是在帮助我们看清未来。相反,未来会变得更加模糊,或者未来本来就是不可视的。 回到“奇点时刻”,如果按照中国的传统思想,寻根问祖。“奇点时刻”的前身应该是我们现在的技术,就是我们创造的技术。我们现在认为技术是通过我们思考产生的,是有目的的,是受我们主观意志控制的。现在科技界新流行一个词“技因,”它是苏珊布莱克莫尔提出的,它有科技传播并发明出各种形式使自己生存,但它还是由人产生的,其根还是人。当然,这个东西可能说起来或者听起来有些科幻的感觉,我想这种感觉是对的。因为不管是基因还是迷因,这些都是已经存在了上万年的东西。对于存在了很长时间的事物,有些科幻色彩也在所难免。而苏珊布莱克莫尔说技因才存在了五千年,然后她有说技因时代快到了,我觉得这有些违背常理了。我倒是认为,如果这个东西真的存在,起码还要五千年这样的时代才会到来。 《技术奇点》一书中提到过,全脑仿真,我觉得这个想法有些脱离现实了。毕竟人类对大脑知之甚少。奇点的提出者说:在2045年的时候,技术奇点会来临,人工智能完全超过人类智能。还好,今天大多数人都有机会见证这个伟大的时刻。回到我们当下或者即将到来的时代,我们觉得今天我们社会能够以如此快的速度高速发展,务实或者说是活在当下应该有很大的贡献。那些疯狂的人就让他们继续疯狂吧,毕竟他们是少数。但,还有一句话,“真理往往掌握在少数人手里。” 那么,未来人工智能会让很多人失业,这难道不是颠覆他们的生活了吗?人工智能的出现,一定会有大量的职业消失,但是同时也会带来大量的工作机会。同时,人工智能降低了很多服务的门槛,从一定意义上来说,人工智能是牺牲小部分人的利益让更多的人能够享受到更好的服务。所以未来人工智能大范围应用于社会生活当中,都会秉承着这一原则——符合大多数人的利益。 或许历史总是惊人相似,任何时代的发展和进步都需要有一部分人或者职业退出历史的舞台。汽车的发明,让马夫这个职业的消失,大量的人失去了之前的饭碗。但与此同时,也创造了更多的职业需求。未来人工智能的发展也应该如此,只是在很短的时间内,我们大多数人很难发现,时代发展到底创造了什么样的新的需求。但是,有一定可以肯定:它一定创造了新需求,否则整个世界就不会良性的运转下去。 如果科技的发展或者出现是为了摧毁整个世界,我想这样的科技应该因为科学家的良知,而被扼杀在摇篮中。甚至,当科技不能造福大多数人的时候,这样的科技就不应该出现。如果不幸的出现,也会有很少的人支持它,那么它存在的价值也就要重新估量了。 每次时代更替,必定是一次思想大爆发的时间段。如果你感觉,这次时代更替,爆发的思想特别的多,感觉自己也要爆炸了,这种感觉也是正确的。因为你正在亲身体验时代交替,对于大多数人来说,跨时代的生活应该是非常痛苦的一件事。因为你需要变化思维去思考,去生存。改变对于大多数来说,往往是最不愿意经历的事情。如果今天有人在你面前,大谈他的改变带来的幸福感、成就,请一定多听听这背后到底发生了什么。 另外,那句话依然适合“时势造英雄”。因为每个人对时代的接受度不一样,所以带来的成就也就不一样。虽然说,未来的人工智能是有温度的,但是,对于大多数人来说,沉浸在过去的美好中,才是最舒适的选择。其实,这也是社会阶层分层的原因之一。
AI时代一个典型的特征是软硬结合。我们整个互联网时代,不管是PC还是移动互联网,大家更多关心的还是软件层面。可能很多IT人士都曾经有过这样一个想法——通过开发一款APP改变世界。而对于用户来说,我们今天所使用的软件大多是免费的,也有少量是要付费的。 智能音箱 硬件在互联网时代虽然发展的很快,变化的也很快,但是大多数时候,互联网公司不太会太在意硬件到底是怎么样的。更多的在意是自己软件产品做得怎么样,只要自己的软件用户体验不错,其他的问题一概不问。如果用户觉得自己用的不爽,大多时候都是硬件的锅,用户会选择更换硬件。在AI时代,这一切将发生改变。因为时代不同,造就的商业模式也是不同的。 AI时代将会出现一个非常明显的商业特征,一荣俱荣、一损俱损。平台内部企业的利益相关性将会呈现出来,其实现在这个利益相关性还不是很明显。因为现在宣传渠道还算丰富,平台内部企业都有额外的宣传渠道。整体的平台利益相关性还不是很强,因为服务的差异化,产品价格的差异化,都还存在,使得用户在选择服务还是有很高的可选择性。但是,一定服务的差异化消失了,产品价格的优势消失了。这将会发生什么样的变化呢? 2017年的Worldwide Develpoers Conference苹果全球开发者大会一改原先的面貌——用软件改变世界,2017年的WWDC比往年“硬”了一点,消费者对于新硬件的期待,远远超过了软件。以至于发布会还没开,新品硬件的各种爆料就已经被穿的八九不离十了。 最值得人们期待的就是HomePod音响,这款全新的硬件也成为了发布会的压轴大戏,而且价格只要349美元,而且要等到12月份才会发售。毕竟这款音箱在技术上还相对落后与已经相对成熟的Google和亚马逊的产品。为什么国外互联网三巨头都在做音箱:Google(Googlehome),亚马逊(Echo),包括苹果(Home Pod)?播放音乐、回答问题和控制智能家居设备,这是智能音箱的标配功能。苹果在推出HomePod时,着重强调了音质的重要性,但是,我们用户想买的真的是一个音质超好的音箱吗? 所有的音箱制造者都有一个终极目标:智能家居控制中心,这才是智能音箱的最终存在的意义。但事实是智能音箱真的能够成为智能家居的入口吗?巨头的思维貌似都有些霸权主义色彩,我的音箱有很多用户,我们把接口开放后,你们就应该把你的家居产品连到我的产品上来。这是我们常说的买断式入口,以后我就是老大,所有的产品厂商都要听我的。不得不说的是,这是上个时代的逻辑。 其实,在国内我们很多互联网公司也试图寻找过智能家居的入口,我们是企图用黑盒子来作为智能家居的入口。但是,结果也是以失败告终。企图想用一款智能硬件来控制智能家居这个想法,本身就是错误的。智能家居的入口只能是整体家居服务提供商,跟大多数的互联网公司没有什么关系。 在中国,智能音箱最大的需求者是平台型公司,例如天猫、京东,因为我们今天可以发现,智能音箱实际上还是一个消费入口,而且从现在国外智能音箱的市场份额来看,亚马逊无疑是巨头领先。不得不承认的是亚马逊的Alexa在技术上做的确实不错,但是,更重要的是在消费场景上,亚马逊有着天然的优势。消费类的服务是其他音箱所不能匹敌的,例如:你对echo说,我的高尔夫球杆坏了,echo就会明白这是一个消费场景,用户想要购买一个新的高尔夫球杆。这个时候,echo就会依托亚马逊平台的优势,为用户提供更好的服务。最后一个简单的对话,就变成了一个附带商业场景的消费过程。当然最近看来,天猫和京东都推出了他们的智能音箱,一场智能音箱大战将会在电商领域首次开战。 亚马逊echo 未来,智能音箱所提供的消费产品一定是电商必须争夺的消费入口,在产品价格、服务都没有差异化的时候,入口无疑是必争之地。而家居型的入口是一个家庭的消费入口,所以,未来电商一定会成为智能音箱最大的玩家。 相对于其他小公司来说,类似于智能音箱类硬件领域,这些公司面向用户端毫无机会可言,任何一家大的电商平台,都不可能将自己的消费入口转交给别人。但是这些小公司有机会服务智能音箱类硬件功能的完善,平台通过小公司的服务的集成,创造出更加贴近消费场景的类智能音箱类硬件。 未来这样的趋势一旦形成,面向家庭的智能音箱类入口硬件一定是一场混战,在服务上想表示出来差异化一定很难,因为未来大平台之间不会有很高的技术壁垒。这场混战的最终落脚点,应该是硬件价格。未来混战的结果,很有可能是这类硬件免费。这并不是一个天方夜谭,入口向来是商家必争之地,不管是什么样的商业模式,只要有了入口才有可能有机会出现盈利模式。 而且,未来的商业模式——平台,一定是组团进攻型的战斗,一旦一个入口被攻破。用户的性质也将发生根本性改变,用户将变成平台型用户。这是未来商业催生出来的一个非常明显的用户特征,因为平台与平台之间所提供的服务差异化很小,选这家平台和选那家平台之间所产生的实际利益差几乎可以忽略不计。这就使得用户一旦被攻破,就会变成平台型用户,在这个平台上,几乎所有的关于商业的服务都可以被满足。其他平台再想挖这批这样的用户,几乎是不可能的,因为这种依赖关系一旦形成,很难改变。 这也就使得,入口型智能硬件免费成为了可能,也是一种商业模式的需求。所以未来入口型智能硬件服务将成为趋势。 天猫精灵X1 个人观点: 在智能音箱领域,中国现在暂时还做不出像亚马逊Echo或者谷歌Home那样的产品。即便是阿里这样的大公司也做不到,因为中国互联网公司做智能音箱的逻辑不对。还是按照互联网时代的逻辑去打仗,认为我掌握了用户,你所有的硬件提供商就必须要跟我有所连接。但是,对于人工智能这次机会,大多数公司是不会妥协的。因为大家起步都一样,一旦相关技术成熟后,他们也能进入该领域。所以,短时间内我们国内的智能音箱不会太火。未来一定会有一个时间点,更多的智能音箱的出现,使得市场进行优胜劣汰。 做智能音箱的前提是:今天做的智能音箱能不能最大程度的帮助到用户?2016年,中国消费者购买力全球65%的智能家居,智能音箱能把这些智能家居连接起来吗?答案显然是不能。与其去顶端设计,不如从低端开始,智能音箱并不是智能时代的入口。 创作不宜,点赞支持!
人脑的认识自始至终都是一个哲学问题,在没有搞清楚这个问题之前,我们之前做的任何结论都是无效的,甚至是误导人类的超级错误。 人工智能时代是个重新认识人脑的时代,有些时候我们用人脑去思考人脑,这件事情本身就是一个错误的做法。得出的结论也可想而知,而AI的出现或许能够帮助我们重新认识人脑。 模拟人脑,一直以来都是一些科学家的梦想。随着人工智能的发展,各大公司也纷纷成立了自己的模拟大脑计划。最出名的可能就是谷歌大脑和百度大脑,它们大部分的结构是:云(云计算)——物理层(大规模集群式芯片)——应用层(来自各行业的数据信息)。 人脑 2017年4月份,斯坦福大学和桑迪亚国家实验室的研究人员们构建除了一种人工突触,这给科学家们制造出高效而精巧的大脑仿生计算机提供了契机。但是,现实却是残酷的,模拟人脑这样的场景一般都会出现在科幻电影里面。 科幻大片《超体》讲述了主人公Lucy的大脑利用率由正常的10%扩大到100%后,最终变身为无所不能的“女超人”。影片向我们传递了一个观念,人类只利用了10%的脑容量。其实,之前就有各种说法,说我们人类的大脑利用效率很低。对于这一说法,很多科学家并不认同,科学作家罗比·博伊德表示:并不是我们只使用了大脑的10%,而是这个大脑如何运作的不解之谜,我们仅仅解开了10%而已。因为我们只了解10%,所以我们认为我们只使用了大脑的10%而已。 我个人非常认同这个观点,我觉得人类对于大脑的认知水平有限。对于大脑的神秘性,过分夸大了而已。即便是今天的物理学发展的足够的好,我们也办法解释所有的事情。就像经典物理学的局限性,它没有办法解释高速运动的物体的规律。这也再次证实了,科学是永无尽头的,我们由于缺少基本的科学认知体系,对一些事物的不可解释性也就变成了可解释的了。 经典物理学的局限性被相对论和量子力学解决了,那么说又来解决“相对论”和“量子力学”的局限性?还是说它们本身就没有局限性?我觉得应该是缺少解决理论,而并非没有局限性。或许,解决了这个问题后,人类对大脑的运作机制会有一个更清晰的认识。或许,在未来,我们解释了光速的局限性,制造时间机器也会变成现实。 人类的大脑有几百亿个脑神经细胞,每个神经细胞有几百条脑神经,每条脑神经有几百个突触,每个突触有几百到几千个蛋白质。一个脑细胞的作用相当于一台大型计算机,一个突触的作用相当于计算机的一个芯片,这样可以推算出人的大脑相当于上百万亿块芯片。量变必定导致质变,这可能也是成为大脑大部分机制不可解释的原因之一。 人脑是一台性能极强的超级计算机,而且功耗极低,即便如此,大脑也是我们身体能量主要的消耗者。此外,凭借连接至记忆区的数十亿神经元,人类还能有条不紊的处理信息。这样的基本结构跟机器有着本质的差异。即便我们在很短的时间里,思考感觉、处理海量的信息,大脑也不会因此而爆炸,只是会感觉到些许的疲惫;机器则不同,越快的信息处理速度意味着更大的负荷,而且能源消耗极高。 AlphaGo就是那个下象棋的怪兽,去年打败李世石版本的AlphaGo,下一场棋需要消耗的电费为3000美元,主要是制冷的成本。有专业人士计算,AlphaGo拥有1202个CPU,176个GPU,一场五小时的比赛,耗能为3000兆焦耳,大约相当于一个成年人300天的能量消耗,而这只是核心处理器的能耗而已。 对于人来说,下一场棋索要消耗的能量,虽然不是很少。但是在AlphaGo面前也不敢程度,或许AlphaGo一分钟消耗的能量就超过了人类。 这就引出了一个问题:如果每个人都要拥有一个这样的功能,那要消耗多少能源?未来的能源结构是否能够满足我们对人工智能的需求? 但是,不得不承认的是今天我们的能源结构进化速度是非常慢的。远远赶不上技术的进化速度。所以,今天我就套用一个当下最流行的词语——“供给侧改革”。能不能从算法的基础上来优化人工智能,如果这样做,就必须重新认识人脑。因为在人类已知的世界或者认知中,人脑是最省能量的机器。 在过去的几百年的时间里面,人类从来没有放弃过寻找人脑的秘密。但是,对于很多寻找秘密的人来说,他们大多源于兴趣和对科学的执着。而今天,人工智能的需求将会让我们投入更多的资源去发现人脑,认识人脑。我个人认为认识人脑,将会成为人工智能时代进步的一个重要标志。 芯片 人工智能时代,人类或许需要新的思想大爆炸来作为新时代大厦建设的理论基础,或者是需要将原有的思想更加深入的理解。曾经有一个著名学者说过:人类为什么不能认清人脑,因为人类永远在人脑的基础上去尝试认识人脑。简单的用一句话概况就是:不识庐山真面目,只缘身在此山中。或许今天,我们应该用人工智能去认识人脑,而不是让人脑去认识人脑! 创作不宜,点赞支持!
人工智能的快速崛起,让我们很多人担心“奇点”的到来,“奇点”认为未来机器将有各种的智能、人类必须做一些事情来保护自己。人工智能的来袭或多或少都会对人带来一些影响。就像互联网来袭,人变得时刻在线一样。但是,人工智能跟互联网最大的区别是:人工智能是一种新的生产要素,而互联网一开始出现的时候是工具,最后互联网演变成了一种基础设施。 窥探你的饭碗 我们今天去看人工智能,很多人习惯性把它当成一种新的生产要素。这主要是因为人工智能一出现就能创造不菲的价值。但是,随着技术的不断发展,人工智能越来越深入人心,被更多的人接受。人工智能或许会成为一种新的生物,而指导它生存的可能是技因。技因是一种新的类似基因的东西,之所以称它为东西是因为现在并不知道它是什么物质组成的。它是由苏珊布莱克莫尔提出的一种新的指导世界进化的东西。具体的有感兴趣的可以去TED观看她的演讲。 我个人并不认为人工智能能够取代人类,这应该是一件非常遥远的事情。因为人类本身就已经陷入了一个认识自我的谜团中,我们对自己是不可知的。但是我觉得人工智能能极大程度的帮助人类去解决一些问题,取代重复性的工作,这可能是对人类带来的最直观的影响。 可能看到这个消息,大家开始担心自己会不会被人工智能取代。但是不得不承认是人工智能确确实实有这样的破坏力。眼下人工智能可能使很多工作将会消失,其中不止快递员,还包括那些思维模式可以被理性推算的工作岗位。比如说:翻译,记者,中介,文案等等。另外还有一些我们现在看来是一些非常好的职位:银行收银员、股票交易员,医生、律师,这些行业也会受到冲击。 对于医生和律师我个人认为并不是完全取代,而是部分取代,人工智能可以让医生和律师工作的更加轻松,基本上还是以辅助为主。但在一定程度上,更加轻松的前提是缩减大量的从业人员。因为医生和律师在提供服务的时候,提供的不只是专业技能方面的服务,其中也有对人性温馨的服务。 人工智能对人类另外一个影响可能就是生活方式的再次升级。互联网时代人类的物质生活得到了极大的满足,而且伴随互联网发展出现了很多种新型的服务模式:电商、O2O、在线娱乐等等。而这些新型的服务模式会在人工智能的帮助下,变得更加智能、更有人情味儿。对于我们人来说,在这方面,我们只需要等待人工智能的发展就好。 进步之光 其实,在人工智能提升这些服务模型的同时,我们人将面临一个新的问题。那就是个人隐私问题。可能这个问题在过去大家不是很关注,但是随着社会的不断发展和进步,大家一定会越来越注重保护自己的隐私。这是社会发展的必然。 但是这个必然和人工智能的发展是相悖的,因为人工智能的发展最重要的力量就是依靠数据。而我们是数据的主要来源,要想获得更好的服务,我们就必须要提供我们的隐私数据。什么时候吃饭、什么时候睡觉、什么时候上班、什么时候干羞羞的事什么时候逛超市、喜欢什么温度等等。其实在人工智能时代,我们人在人工智能面前应该是透明的。另外一个可怕的问题是人工智能是人设计的。细细思考这件事,或许正是印了那句老话:NOpain, NO gain. 大家最最关心的事情可能就是人工智能取代自己工作之后,自己应该何去何从。其实,人工智能取代人类这件事还是一个伪命题。为什么是一个伪命题?一是因为我们的政府不可能让那么多人同时失业,这对社会带来的影响几乎是具有毁灭性质的。二是因为教育水平会在人工智能的推动下,不断地得到提升,顺应时代的教育体制会慢慢成型。三是:科技或许永远都模拟不了人性的关怀,这个表述可能不太准确,大致就是类似于亲情和友情等人类的人性情感。 但是,从社会发展史上来看,每逢时代交替一定是天赐良机。换个角度来看,人工智能对人的影响或许是带来了一个巨大的机会。当然机会和危机并存。吴军博士认为,如果很多人不进行改变,人工智能时代可能会出现史上最大的贫富差距。当然,破局点是改变自我,让自身变得更强大。所以,人工智能是在推动人类不断完善自身的一种技术。道理很简单:如果你不进步,不是别人干掉你,而是人工智能干掉你。而且,人工智能进化的速度回远远超过你成长的速度。 人工智能下棋那么厉害!是不是我没有丝毫的胜算了?其实不然,因为就现在人工智能的核心技术:深度学习而言,深度学习只能在一个领域发挥巨大价值。暂时不能实现多领域工作。而人类的特点就是喜欢联想,喜欢借助其他领域的知识来解决不同领域的问题。所以未来跨领域教育一定会成为重中之重,这对于现在的专业教育是一个非常大的冲击。 对于那些已经脱离教育体系的人来说,知识付费时代的到来算是对自己所处时代的弥补。所以,未来知识付费发展的一定很不错,越来越多的人会开始加入其中。以此来弥补自身发展的不足。 人工智能的浪潮正在滚滚而来,一些传统的思想可以已经不再使用于时代的发展。“以不变应万变”,这句古人的话将失去它的正确性。未来只有改变才能够使用人工智能的冲击,至于为什么改变?因为我们没有办法脱身于人工智能时代,就像今天我们没有办法脱身于互联网时代一样。
更多深度文章,请关注:https://yq.aliyun.com/cloud 我曾经演示过如何使用TensorFlow创建卷积神经网络(CNN)来对MNIST手写数字数据集进行分类。TensorFlow是一款精湛的工具,具有强大的功能和灵活性。然而,对于快速原型制作工作,可能显得有些麻烦。Keras是一个运行在TensorFlow或者Theano的更高级别的库,旨在流线化构建深度学习网络的过程。事实上,在上一篇TensorFlow教程中 ,TensorFlow大约需要42行完成的内容,在Keras中只需11行就可以完成类似的功能。接下来我将向你展示如何通过Keras做到这一点。 该Keras教程将向你展示如何使用MNIST数据集构建CNN并实现> 99%的准确性。它与我之前的卷积神经网络教程中构建的结构完全相同 ,下图显示了网络的架构: 这个Keras教程的完整代码可以在这里找到。 Keras教程中的主要代码讲解: 下面的代码是在此Keras教程中使用的CNN结构的“胆量” model = Sequential() model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=input_shape)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(64, (5, 5), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(1000, activation='relu')) model.add(Dense(num_classes, activation='softmax')) 接下来我们一步一步的来解释: Model = Sequential() Keras中的模型可以有两种——序贯和通过API函数。对于构建的大多数深度学习网络,序贯模型是最常用的。它允许你从输入到输出整个过程都能轻松地堆叠网络层(甚至循环层)。而API函数可以帮助你构建更复杂的网络体系结构,本教程将不介绍它。 第一行将模型类型声明为Sequential()。 model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=input_shape)) 接下来,我们添加一个2D卷积层来处理2D MNIST输入的图像。传递给Conv2D() 函数的第一个参数是输出通道的数量。这里我们设置为我们有32个输出通道,下一个输入是kernel_size,我们选择了一个5×5移动窗口,其次是x和y方向(1,1)的步态。接着,激活函数是整流线性单元,最后我们必须与输入层的大小提供模型。 还要注意,我们不必声明任何权重或偏差变量,Keras会帮助我们进行完成。 model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 接下来我们添加一个2D max pooling层。层的定义很简单。在这种情况下,我们只是简单地指定在x和y方向上的池的大小 和(2,2)的步。 model.add(Conv2D(64, (5, 5), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) 接下来,我们添加另一个卷积层+最大池化层,具有64个输出通道。在Keras中Conv2D()函数的参数默认的步伐是(1,1),在Keras 中默认步伐是使它等于池的大小。 该层的输入张量是(batch_size,28,28,32)28×28是图像的大小,32是来自上一层的输出通道数。但是,我们不必明确说明输入的形状是什么,Keras也能自动识别。这样可以快速组合网络架构,而不用担心网络周围张量的大小。 model.add(Flatten()) model.add(Dense(1000, activation='relu')) model.add(Dense(num_classes, activation='softmax')) 现在我们已经在Keras中构建了卷积层,我们希望将这些输出平坦化,以完全进入我们的连接层。在TensorFlow中,我们为了平坦化必须弄清楚卷积层的输出张量的大小,还要明确我们的权重和偏差变量的大小。 接下来的两行声明了我们的完全连接层,使用Keras中的Dense()层。首先我们指定大小,根据我们的架构,我们指定了1000个节点,每个节点都是由ReLU功能激活。第二个是我们softmax分类或输出层,这是我们类数量的大小。就这样 - 我们已经成功地开发了CNN的架构,只有8行代码。现在让我们来训练模型并执行预测。 训练和评估卷积神经网络 我们已经开发了Keras的CNN架构,但是我们还没有指定损失函数,或者告诉框架使用哪种类型的优化器(即梯度下降,Adam optimiser等)。在Keras中,这些可以在一个命令中执行: model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01), metrics=['accuracy']) Keras提供了许多损失函数(或者你可以建立自己的),这里可以看到的keras所有的损失函数。我们将使用标准交叉熵来进行分类(keras.losses.categorical_crossentropy)。Keras还提供了许多优化器,可以在这里看到。在这种情况下,我们使用Adam优化器(keras.optimizers.Adam)。最后,我们可以在模型上运行evaluate()时计算的度量。 接下来,我们要训练我们的模型。这可以通过在Keras中再次运行下面这个命令来完成: model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test), callbacks=[history]) 该命令看起来类似于非常受欢迎的Python机器学习库中scikit learn 使用的语法。我们首先传递我们的所有训练的数据,x_train和y_train,下一个参数是批量大小,我们不必在Keras训练期间明确我们数据的批量处理,而是指定批量大小。在这种情况下,我们使用的批量大小为128。接下来我们设置训练周期(在这种情况下为10)。详细标志在此处设置为1,指定设定是否要在控制台中打印详细信息以了解训练进度。 3328/60000 [>.............................] - ETA: 87s - loss: 0.2180 - acc: 0.9336 3456/60000 [>.............................] - ETA: 87s - loss: 0.2158 - acc: 0.9349 3584/60000 [>.............................] - ETA: 87s - loss: 0.2145 - acc: 0.9350 3712/60000 [>.............................] - ETA: 86s - loss: 0.2150 - acc: 0.9348 最后,我们将验证或测试数据传递给拟合函数,因此Keras知道在模型上运行evaluate()时,会测量指标的数据。 一旦模型被训练,我们可以评估它并打印结果: score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) 在上述模型培训10个周期之后,我们实现了99.2%的准确度,你可以看到每个周期的准确性的改善如下图所示: Kersa让事情很更加简单了,你不觉得吗?我希望这个Keras教程已经展示了它如何成为深度学习解决方案的有用框架。 作为一种附录,我会告诉你如何跟踪我们通过训练时期的准确性,这使我能够生成上面的图表。 在Keras中记录网络性能 Keras有一个实用的程序,名为“回调”,可用于跟踪训练期间的各种变量。你还可以使用它来创建检查点,将模型在训练的不同阶段进行保存,以帮助你避免工作结果丢失。整个结果会被传递到.fit()函数,如上所述。我会向你显示一个相当简单的用例,其中记录了准确性。 要创建一个回调,我们创建一个继承的类,它继承自keras.callbacks.Callback: class AccuracyHistory(keras.callbacks.Callback): def on_train_begin(self, logs={}): self.acc = [] def on_epoch_end(self, batch, logs={}): self.acc.append(logs.get('acc')) 上面代码继承的Callback超类有一些可以在我们的回调定义中覆盖的方法,例如 on_train_begin,on_epoch_end,on_batch_begin和on_batch_end。这些方法的名称就是代表了训练过程中我们可以“做事情”的时刻。在上面的代码中,在训练开始时,我们初始化一个列表self.acc = []来存储我们的精度结果。使用on_epoch_end ()方法,我们可以从日志中提取我们想要的变量,这是一个字典,默认情况下保留了训练过程中的丢失和准确性。然后我们实例化这样的回调: history = AccuracyHistory() 现在我们可以使用回调参数名将历史记录传递给.fit()函数。请注意,.fit()需要一个回调参数的列表,所以你必须传递这样的历史:[history]。要访问我们在训练完成后创建的准确性列表,你可以简单地调用history.acc: plt.plot(range(1,11), history.acc) plt.xlabel('Epochs') plt.ylabel('Accuracy') plt.show() 本文由@阿里云云栖社区组织翻译。 文章原标题《Keras tutorial – build a convolutional neural network in 11 lines》 作者:Andy 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 今天我们来介绍一下如何使用(opencv/python)来实现OCR处理银行票据。文末有代码和相关文档下载! 在第一部分中,我们将讨论两个主题: 1. 首先,我们将了解MICR E-13B字体,美国,英国,加拿大等国家用于支票上都是使用的这种字体。 2. 其次,我们将讨论如何从MICR E-13B参考图像中提取数字和符号。这将使我们能够提取每个字符的ROI,然后将其用于OCR银行支票。 MICR E-13B 字体: MICR(磁墨字符识别)是处理文件的金融工业技术。 MICR的E-13B变体包含14个字符: · 数字:数字0-9。 · ⑆过境:银行分行分隔。 · ⑇金额:交易金额分隔符。 · ⑈在我们:客户帐号分隔符。 · ⑉dash:数字分隔符(例如路由和帐号之间)。 银行支票字符识别看起来更难: 在银行支票上使用的MICR E-13B字体中,数字有一个轮廓。但是,控制符号对于每个角色具有三个轮廓,使任务稍微更具挑战性。我们不能使用简单的轮廓和边框方法。相反,我们需要设计自己的方法来可靠地提取数字和符号。 用OpenCV提取MICR数字和符号: 创建一个新的文件,命名为bank_check_ocr.py,并插入以下代码: # import the necessary packages from skimage.segmentation import clear_border from imutils import contours import numpy as np import argparse import imutils import cv2 首先我们先导入各种我们需要的包,以确保程序的正确运行 · OpenCV:从此页面选择适合您系统的安装版本。 · scikit-image :这是通过pip安装的, pip install -U scikit-image · numpy :通过 pip install numpy。 · imutils :这是可以通过 pip 安装: pip install --upgrade imutils。 接着我们来构建一个从MICR字体中提取字符的函数: def extract_digits_and_symbols(image, charCnts, minW=5, minH=15): charIter = charCnts.__iter__() rois = [] locs = [] 对于初学者,我们的功能需要4个参数: · image:MICR E-13B字体图像(代码下载中提供)。 · charCnts:包含参考图像中的字符轮廓的列表。 · minW :表示最小字符宽度的可选参数。默认值为5像素宽度。 · minH :最小字符高度。默认值为15像素。 接着我们初始化我们的charCnts列表的迭代器。列表对象本质上是“可迭代的”,意味着__iter__方法是由生成器完成的。 最后初始化空列表以保存我们的rois(感兴趣的区域)和loc(ROI位置)。我们将在函数结尾的一个元组中返回这些列表。 我们开始循环,看一下迭代器的工作原理: while True: try: c = next(charIter) (cX, cY, cW, cH) = cv2.boundingRect(c) roi = None 在我们的函数中,我们开始一个无限循环,我们的退出条件是当我们捕获 StopIterator异常时。为了捕获这个异常,我们需要设置try-catch块。对于循环的每次迭代,我们通过调用next(charIter)来获取下一个字符轮廓。从这个函数调用,我们可以提取矩形的(x,y)坐标和宽度/高度。接着我们初始化一个roi,我们将在短时间内存储字符图像。 接下来,我们将检查我们的边框宽度和高度的大小,并采取相应的措施: if cW >= minW and cH >= minH: roi = image[cY:cY + cH, cX:cX + cW] rois.append(roi) locs.append((cX, cY, cX + cW, cY + cH)) 如果字符计数器的尺寸分别大于或等于最小宽度和高度,我们采取以下措施: 1. 使用我们的边界矩形调用的坐标和width / height从图像中提取roi。将roi添加到rois 。 3. 向locs附加一个元组。该元组由矩形的两个角的(x,y)坐标组成。稍后我们将返回这个位置列表。 否则,我们假设我们正在使用MICRE-13B字符符号,需要应用更高级的一组处理操作: else: parts = [c, next(charIter), next(charIter)] (sXA, sYA, sXB, sYB) = (np.inf, np.inf, -np.inf,-np.inf) for p in parts: (pX, pY, pW, pH) = cv2.boundingRect(p) sXA = min(sXA, pX) sYA = min(sYA, pY) sXB = max(sXB, pX + pW) sYB = max(sYB, pY + pH) roi = image[sYA:sYB, sXA:sXB] rois.append(roi) locs.append((sXA, sYA, sXB, sYB)) if-else的else块具有分析包含在MICR E-13B字体中的多个轮廓的特殊符号的逻辑。我们做的第一件事就是建立符号的部分。正如我们需要知道一个具有一个轮廓角色的边框,我们需要知道包含三个轮廓的角色的边框。为了实现这一点,通过sYB初始化四个边界框参数sXA。 现在我们将循环遍历表示一个字符/符号的部分列表。使用边界矩形参数,我们比较和计算与先前值相关的最小值和最大值。这是我们首先通过 sYB 将sXA初始化为正/负无限值的原因。 现在我们已经找到了围绕符号的框的坐标,我们从图像中提取出roi,将roi附加到rois,并将框坐标元组附加到locs 我们函数的剩余代码块处理我们的while循环退出条件和return语句。 Except StopIteration: break return (rois, locs) 如果在charIter(我们的iterator对象)上调用next来抛出一个StopIteration异常,那么说明我们已经到达了最后一个轮廓。 现在我们已经准备好解析命令行参数并继续执行脚本: ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-r", "--reference", required=True, help="path to reference MICR E-13B font") args = vars(ap.parse_args()) 在上面的代码中,我们建立了两个必需的命令行参数: · - image:我们的查询图像。 · - reference :我们的参考MICR E-13B字体图像。 接下来,我们将为每个符号/字符创建“名称”,并将其存储在列表中。 charNames = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "T", "U", "A", "D"] 上面的代码很简单,我们只是在参考图像中从左到右建立了我们遇到的符号的名称。 注意:由于OpenCV不支持unicode中的绘图字符,因此需要定义“T”表示transit,“U”表示“on-us”,“A”表示amount,“D”表示dash。 接下来,我们将参考图像加载到内存中,并执行一些预处理: ref = cv2.imread(args["reference"]) ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY) ref = imutils.resize(ref, width=400) ref = cv2.threshold(ref, 0, 255, cv2.THRESH_BINARY_INV |cv2.THRESH_OTSU)[1] 在上面的代码中,我们完成了四个任务: 1. 加载 图像到存储器中作为 参考。 2. 图片转换为灰度级。 3. 调整 width=400 。 4. 使用Otsu方法的二进制逆阈值。 这些简单操作的结果可以在下图中看到: 其余的代码遍历分为两部分。首先,我将向您展示一个逻辑和简单的轮廓方法以及生成的图像。 然后,我们将继续使用更高级的方法,利用我们在脚本顶部写的函数extract_digits_and_symbols 。 对于这两个部分,我们将使用一些常见的数据,包括ref(参考图像,我们刚刚预处理的)和refCnt(参考轮廓,我们即将提取)。 refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) refCnts = refCnts[0] if imutils.is_cv2() else refCnts[1] refCnts = contours.sort_contours(refCnts, method="left-to-right")[0] clone = np.dstack([ref.copy()] * 3) # loop over the (sorted) contours for c in refCnts: (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(clone, (x, y), (x + w, y + h), (0, 255, 0), 2) # show the output of applying the simple contour method cv2.imshow("Simple Method", clone) cv2.waitKey(0) 要从参考图像中提取轮廓,我们利用OpenCV的cv2 .findContours函数 接下来,我们要绘制图像,所以我们将所有频道复制到上称为克隆的图像。在显示结果之前,简单轮廓方法的最后一步是循环遍历排序轮廓。在这个循环中,我们计算每个轮廓的边界框,然后在其周围绘制一个矩形。通过显示图像显示结果并在此处暂停直到按下一个键参见图4 你看到这种方法的问题吗?问题是我们有22个边框,而不是所需的14个边界轮廓(每个角色一个)。显然,这个问题可以通过更先进的方法来解决。 更先进的方法如下所示和描述 (refROIs, refLocs) = extract_digits_and_symbols(ref, refCnts, minW=10, minH=20) chars = {} clone = np.dstack([ref.copy()] * 3) for (name, roi, loc) in zip(charNames, refROIs, refLocs): # draw a bounding box surrounding the character on the output # image (xA, yA, xB, yB) = loc cv2.rectangle(clone, (xA, yA), (xB, yB), (0, 255, 0), 2) # resize the ROI to a fixed size, then update the characters # dictionary, mapping the character name to the ROI roi = cv2.resize(roi, (36, 36)) chars[name] = roi # display the character ROI to our screen cv2.imshow("Char", roi) cv2.waitKey(0) # show the output of our better method cv2.imshow("Better Method", clone) cv2.waitKey(0) 我们初始化一个空字典,chars,它将保存每个符号的name和roi。我们通过用新的ref副本覆盖clone图像来执行此操作(以摆脱刚刚绘制的矩形)。 最后在for循环的主体中,首先我们为clone图像中的每个角色绘制一个矩形 。 其次,我们调整roi到36像素和从词典的roi和name 的键值对,更新我们的chars。最后一步(主要用于调试/开发目的)是在屏幕上显示每个 roi,直到按下一个键。所产生的“更好的方法”图像显示在屏幕,直到按下一个键,并且结束了我们的脚本。 数字和符号提取结果: 现在我们已经编码了我们的MICR E-13B数字和符号提取器,让我们试一试。 从那里执行以下脚本: $ python bank_check_ocr.py --image example_check.png \ --reference micr_e13b_reference.png 总结 我们可以看到OCR的银行支票比OCR的信用卡更难识别,主要是由于银行支票符号由多个部分组成。我们不能假设我们的引用字体图像中的每个轮廓映射到一个单独的角色。 相反,我们需要插入额外的逻辑来检查每个轮廓的尺寸,并确定我们正在检查数字或符号。在我们找到一个符号的情况下,我们需要抓住下两个轮廓来构建我们的边界框(因为银行检查控制字符由三个不同的部分组成)。 希望上述的介绍能够帮助到你! 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《Bank check OCR with OpenCV and Python | PyImageSearch》 作者:Adrian Rosebrock译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 对于深度学习开发者来说,深度学习系统变得越来越复杂。以至于我们需要使用轻量级的工具从头到尾来管理流程,为了将更多的连续学习内置到神经网络中,这就要求我们建立可以迭代增强的更有弹性的数据集以及更多的动态模型。 深度学习开发人员必须花费大量的时间来整合神经网络的组件,管理模型生命周期,组织数据和调整系统并行度等等。随着使用新的培训样本后,人类对于神经网络模型的见解,更新模型和跟踪其变化的能力就变得非常必要了。为此伦敦帝国理工学院的一个团队开发了一个python库来管理跨学科开发人员项目的复杂迭代过程。 为了更好地管理开发过程,该团队开发了一个通用的Python库——TensorLayer。这个库集成了很多开发过程中包括的方法,其中包括(操作、模型生命周期、并行计算、失败)都以模块化进行抽象。这些模块包括以下功能:用于管理神经网络层、用于管理模型和其生命周期、用于管理数据集、最后是解决容错的工作流模块。而TensorFlow是培训和推理的核心平台,它为MongoDB提供了存储空间。这些API的使用可以在文末链接中查看,正是由于这些API的存在,TensorLayer才会如此的强大。 深度学习的开发人员可以借助TensorLayer的功能编写了多媒体应用程序。这些功能包括提供和导入层实现,构建神经网络,管理模型生命周期,创建在线或离线数据集,以及编写训练计划。这些功能分为四个模块:层,网络,数据集和工作流。 该团队表示,虽然像Keras和TFLearn这样的工具现在很有用,但它们并不像网络那样可以随网络的扩张变得更复杂甚至无限制的迭代。它们提供了必要的抽象,以降低使用工具的门槛,但又掩盖了很多底层的算法。虽然对开发者有好处,但是相对来说底层技术就变得难以调整和修改,而底层技术的修改和调整,这在解决许多现实世界的问题上是非常必要的。 与Keras和TFLearn相比,TensorLayer不仅提供了高级抽象,而且提供了包括数据预处理、训练、训练后处理,以及服务模块和数据库管理在内的端到端工作流程,这些是开发者建立一个完整模型所需要的全部过程。 TensorLayer倡导更灵活且可组合的范式:神经网络库可以与本机引擎交换使用。这允许开发者轻松地利用预建模块,而且不会影响可见性。这种非侵入性也使得与其他TF的包装器如TF-Slim和Keras合并成为了可能。并且开发小组认为,灵活性不会影响性能。 该小组在文档中中强调了许多应用,其中还提供了有关每个模块、整体架构和当前开发的详细信息。应用包括生成对抗网络、深层加强学习、最终用户环境中的超参数调优。自去年GitHub发布以来,TensorLayer已经被用于多模式研究、图像转换和医疗信号处理。 TensorLayer正处于积极的发展阶段,而且从开放社区获得了许多贡献。它已被伦敦帝国理工学院,卡内基梅隆大学,斯坦福大学,清华大学,加州大学洛杉矶分校等大学研究人员广泛使用,还包括谷歌,微软,阿里巴巴,腾讯,ReFULE4,彭博等许多工程师。 TensorLayer安装: TensorLayer需要一些预安装库,如 TensorFlow , numpy 和 matplotlib。 对于 GPU 加速,需要安装 CUDA 和 cuDNN。 如果你遇到麻烦,可以查看 TensorFlow 安装手册 ,它包含了在不同系统中安装 TensorFlow 的步骤。 如需了解更多关于TensorFlow 的相关功能,请点击:TensorLayer 中文文档。 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《Managing Deep Learning Development Complexity》 作者:Nicole Hemsoth 译者:袁虎 审阅:阿福 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 更详细的Tensorflow教程:点击 Tensorflow基础知识: Tensorflow和其他数字计算库(如numpy)之间最明显的区别在于Tensorflow中操作的是符号。这是一个强大的功能,这保证了Tensorflow可以做很多其他库(例如numpy)不能完成的事情(例如自动区分)。这可能也是它更复杂的原因。今天我们来一步步探秘Tensorflow,并为更有效地使用Tensorflow提供了一些指导方针和最佳实践。 我们从一个简单的例子开始,我们要乘以两个随机矩阵。首先我们来看一下在numpy中如何实现: import numpy as np x = np.random.normal(size=[10, 10]) y = np.random.normal(size=[10, 10]) z = np.dot(x, y) print(z) 现在我们使用Tensorflow中执行完全相同的计算: import tensorflow as tf x = tf.random_normal([10, 10]) y = tf.random_normal([10, 10]) z = tf.matmul(x, y) sess = tf.Session() z_val = sess.run(z) print(z_val) 与立即执行计算并将结果复制给输出变量z的numpy不同,tensorflow只给我们一个可以操作的张量类型。如果我们尝试直接打印z的值,我们得到这样的东西: Tensor("MatMul:0", shape=(10, 10), dtype=float32) 由于两个输入都是已经定义的类型,tensorFlow能够推断张量的符号及其类型。为了计算张量的值,我们需要创建一个会话并使用Session.run方法进行评估。 要了解如此强大的符号计算到底是什么,我们可以看看另一个例子。假设我们有一个曲线的样本(例如f(x)= 5x ^ 2 + 3),并且我们要估计f(x)在不知道它的参数的前提下。我们定义参数函数为g(x,w)= w0 x ^ 2 + w1 x + w2,它是输入x和潜在参数w的函数,我们的目标是找到潜在参数,使得g(x, w)≈f(x)。这可以通过最小化损失函数来完成:L(w)=(f(x)-g(x,w))^ 2。虽然这问题有一个简单的封闭式的解决方案,但是我们选择使用一种更为通用的方法,可以应用于任何可以区分的任务,那就是使用随机梯度下降。我们在一组采样点上简单地计算相对于w的L(w)的平均梯度,并沿相反方向移动。 以下是在Tensorflow中如何完成: import numpy as np import tensorflow as tf x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) w = tf.get_variable("w", shape=[3, 1]) f = tf.stack([tf.square(x), x, tf.ones_like(x)], 1) yhat = tf.squeeze(tf.matmul(f, w), 1) loss = tf.nn.l2_loss(yhat - y) + 0.1 * tf.nn.l2_loss(w) train_op = tf.train.AdamOptimizer(0.1).minimize(loss) def generate_data(): x_val = np.random.uniform(-10.0, 10.0, size=100) y_val = 5 * np.square(x_val) + 3 return x_val, y_val sess = tf.Session() sess.run(tf.global_variables_initializer()) for _ in range(1000): x_val, y_val = generate_data() _, loss_val = sess.run([train_op, loss], {x: x_val, y: y_val}) print(loss_val) print(sess.run([w])) 通过运行这段代码,我们可以看到下面这组数据: [4.9924135, 0.00040895029, 3.4504161] 这与我们的参数已经相当接近。 这只是Tensorflow可以做的冰山一角。许多问题,如优化具有数百万个参数的大型神经网络,都可以在Tensorflow中使用短短的几行代码高效地实现。而且Tensorflow可以跨多个设备和线程进行扩展,并支持各种平台。 理解静态形状和动态形状的区别: Tensorflow中的张量在图形构造期间具有静态的形状属性。例如,我们可以定义一个形状的张量[None,128]: import tensorflow as tf a = tf.placeholder([None, 128]) 这意味着第一个维度可以是任意大小的,并且将在Session.run期间随机确定。Tensorflow有一个非常简单的API来展示静态形状: static_shape = a.get_shape().as_list() # returns [None, 128] 为了获得张量的动态形状,你可以调用tf.shape op,它将返回一个表示给定形状的张量: dynamic_shape = tf.shape(a) 我们可以使用Tensor.set_shape()方法设置张量的静态形状: a.set_shape([32, 128]) 实际上使用tf.reshape()操作更为安全: a = tf.reshape(a, [32, 128]) 这里有一个函数可以方便地返回静态形状,当静态可用而动态不可用的时候。 def get_shape(tensor): static_shape = tensor.get_shape().as_list() dynamic_shape = tf.unstack(tf.shape(tensor)) dims = [s[1] if s[0] is None else s[0] for s in zip(static_shape, dynamic_shape)] return dims 现在想象一下,如果我们要将三维的张量转换成二维的张量。在TensorFlow中我们可以使用get_shape()函数: b = placeholder([None, 10, 32]) shape = get_shape(tensor) b = tf.reshape(b, [shape[0], shape[1] * shape[2]]) 请注意,无论是否静态指定形状,都可以这样做。 实际上,我们可以写一个通用的重塑功能来如何维度之间的转换: import tensorflow as tf import numpy as np def reshape(tensor, dims_list): shape = get_shape(tensor) dims_prod = [] for dims in dims_list: if isinstance(dims, int): dims_prod.append(shape[dims]) elif all([isinstance(shape[d], int) for d in dims]): dims_prod.append(np.prod([shape[d] for d in dims])) else: dims_prod.append(tf.prod([shape[d] for d in dims])) tensor = tf.reshape(tensor, dims_prod) return tensor 然后转化为二维就变得非常容易了: b = placeholder([None, 10, 32]) b = tf.reshape(b, [0, [1, 2]]) 广播机制(broadcasting)的好与坏: Tensorflow同样支持广播机制。当要执行加法和乘法运算时,你需要确保操作数的形状匹配,例如,你不能将形状[3,2]的张量添加到形状的张量[3,4]。但有一个特殊情况,那就是当你有一个单一的维度。Tensorflow隐含地功能可以将张量自动匹配另一个操作数的形状。例如: import tensorflow as tf a = tf.constant([[1., 2.], [3., 4.]]) b = tf.constant([[1.], [2.]]) # c = a + tf.tile(a, [1, 2]) c = a + b 广播允许我们执行隐藏的功能,这使代码更简单,并且提高了内存的使用效率,因为我们不需要再使用其他的操作。为了连接不同长度的特征,我们通常平铺式的输入张量。这是各种神经网络架构的最常见模式: a = tf.random_uniform([5, 3, 5]) b = tf.random_uniform([5, 1, 6]) # concat a and b and apply nonlinearity tiled_b = tf.tile(b, [1, 3, 1]) c = tf.concat([a, tiled_b], 2) d = tf.layers.dense(c, 10, activation=tf.nn.relu) 这可以通过广播机制更有效地完成。我们使用f(m(x + y))等于f(mx + my)的事实。所以我们可以分别进行线性运算,并使用广播进行隐式级联: pa = tf.layers.dense(a, 10, activation=None) pb = tf.layers.dense(b, 10, activation=None) d = tf.nn.relu(pa + pb) 实际上,这段代码很普遍,只要在张量之间进行广播就可以应用于任意形状的张量: def tile_concat_dense(a, b, units, activation=tf.nn.relu): pa = tf.layers.dense(a, units, activation=None) pb = tf.layers.dense(b, units, activation=None) c = pa + pb if activation is not None: c = activation(c) return c 到目前为止,我们讨论了广播的好的部分。但是你可能会问什么坏的部分?隐含的假设总是使调试更加困难,请考虑以下示例: a = tf.constant([[1.], [2.]]) b = tf.constant([1., 2.]) c = tf.reduce_sum(a + b) 你认为C的数值是多少如果你猜到6,那是错的。这是因为当两个张量的等级不匹配时,Tensorflow会在元素操作之前自动扩展具有较低等级的张量,因此加法的结果将是[[2,3], [3,4]]。 如果我们指定了我们想要减少的维度,避免这个错误就变得很容易了: a = tf.constant([[1.], [2.]]) b = tf.constant([1., 2.]) c = tf.reduce_sum(a + b, 0) 这里c的值将是[5,7]。 使用Python实现原型内核和高级可视化的操作: 为了提高效率,Tensorflow中的操作内核完全是用C ++编写,但是在C ++中编写Tensorflow内核可能会相当痛苦。。使用tf.py_func(),你可以将任何python代码转换为Tensorflow操作。 例如,这是python如何在Tensorflow中实现一个简单的ReLU非线性内核: import numpy as np import tensorflow as tf import uuid def relu(inputs): # Define the op in python def _relu(x): return np.maximum(x, 0.) # Define the op's gradient in python def _relu_grad(x): return np.float32(x > 0) # An adapter that defines a gradient op compatible with Tensorflow def _relu_grad_op(op, grad): x = op.inputs[0] x_grad = grad * tf.py_func(_relu_grad, [x], tf.float32) return x_grad # Register the gradient with a unique id grad_name = "MyReluGrad_" + str(uuid.uuid4()) tf.RegisterGradient(grad_name)(_relu_grad_op) # Override the gradient of the custom op g = tf.get_default_graph() with g.gradient_override_map({"PyFunc": grad_name}): output = tf.py_func(_relu, [inputs], tf.float32) return output 要验证梯度是否正确,你可以使用Tensorflow的梯度检查器: x = tf.random_normal([10]) y = relu(x * x) with tf.Session(): diff = tf.test.compute_gradient_error(x, [10], y, [10]) print(diff) compute_gradient_error()是以数字的方式计算梯度,并返回与渐变的差异,因为我们想要的是一个很小的差异。 请注意,此实现效率非常低,只对原型设计有用,因为python代码不可并行化,不能在GPU上运行。 在实践中,我们通常使用python ops在Tensorboard上进行可视化。试想一下你正在构建图像分类模型,并希望在训练期间可视化你的模型预测。Tensorflow允许使用函数tf.summary.image()进行可视化: image = tf.placeholder(tf.float32) tf.summary.image("image", image) 但这只能显示输入图像,为了可视化预测,你必须找到一种方法来添加对图像的注释,这对于现有操作几乎是不可能的。一个更简单的方法是在python中进行绘图,并将其包装在一个python 方法中: import io import matplotlib.pyplot as plt import numpy as np import PIL import tensorflow as tf def visualize_labeled_images(images, labels, max_outputs=3, name='image'): def _visualize_image(image, label): # Do the actual drawing in python fig = plt.figure(figsize=(3, 3), dpi=80) ax = fig.add_subplot(111) ax.imshow(image[::-1,...]) ax.text(0, 0, str(label), horizontalalignment='left', verticalalignment='top') fig.canvas.draw() # Write the plot as a memory file. buf = io.BytesIO() data = fig.savefig(buf, format='png') buf.seek(0) # Read the image and convert to numpy array img = PIL.Image.open(buf) return np.array(img.getdata()).reshape(img.size[0], img.size[1], -1) def _visualize_images(images, labels): # Only display the given number of examples in the batch outputs = [] for i in range(max_outputs): output = _visualize_image(images[i], labels[i]) outputs.append(output) return np.array(outputs, dtype=np.uint8) # Run the python op. figs = tf.py_func(_visualize_images, [images, labels], tf.uint8) return tf.summary.image(name, figs) 请注意,由于概要通常只能在一段时间内进行评估(不是每步),因此实施中可以使用该实现,而不用担心效率。 本文由北邮@爱可可-爱生活老师推荐,@阿里云云栖社区组织翻译。 文章原标题《Effective Tensorflow - Guides and best practices for effective use of Tensorflow》 作者:Vahid Kazemi 作者是google的件工程师,CS中的博士学位。从事机器学习,NLP和计算机视觉工作。 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 适合多输入变量的神经网络模型一直让开发人员很头痛,但基于(LSTM)的循环神经网络能够几乎可以完美的解决多个输入变量的问题。 基于(LSTM)的循环神经网络可以很好的利用在时间序列预测上,因为很多古典的线性方法难以适应多变量或多输入预测问题。 在本教程中,你会看到如何在Keras深度学习库中开发多变量时间序列预测的LSTM模型。 读完本教程后,你将学会: · 如何将原始数据集转换为可用于时间序列预测的数据集。 · 如何准备数据并创建适应多变量时间序列预测问题的LSTM。 · 如何做出预测并将结果重新调整到原始单位。 本教程分为3部分: 1.空气污染预报。 2.基本数据准备。 3.多变量LSTM预测模型。 Python环境 本教程假设你已安装Python SciPy环境,你可以在本教程中使用Python 2或3。你必须使用TensorFlow或Theano后端安装Keras(2.0或更高版本)。本教程还 假设你已经安装了scikit-learn,Pandas,NumPy和Matplotlib。如果你需要帮助你的环境,请参阅这篇文章: 如何为Anaconda设置机器学习和深度学习的Python环境 空气污染预报 在这个小例子中,我们将使用空气质量数据集。这是一个数据集,在美国驻北京大使馆五年内报告天气和污染水平。数据类型包括日期时间、称为PM2.5浓度的污染物、以及天气信息、包括露点(露点温度)、温度、压力、风向、风速和累积的降雪小时数。原始数据中的完整功能列表如下: 1.NO:行号。 2.year:年。 3.month:月。 4.day:日。 5.hour:小时。 6.pm2.5:PM2.5浓度。 7.DEWP:露点温度。 8.TEMP:温度。 9.PRES:压力。 10.cbwd:风向。 11.Iws:风速。 12.ls:积雪的时间 13.Ir:累积的下雨时数 我们可以使用这些数据并构建一个预测问题,基于天气条件和前几个小时的污染,我们预测在下一个小时的污染。你可以从UCI Machine Learning Repository下载数据集—北京PM2.5数据集。下载数据集并将其放在你当前的工作目录中,文件名为“raw.csv”。 基本数据准备 第一步,我们必须清洗数据。 以下是原始数据集的前几行。 No,year,month,day,hour,pm2.5,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir 1,2010,1,1,0,NA,-21,-11,1021,NW,1.79,0,0 2,2010,1,1,1,NA,-21,-12,1020,NW,4.92,0,0 3,2010,1,1,2,NA,-21,-11,1019,NW,6.71,0,0 4,2010,1,1,3,NA,-21,-14,1019,NW,9.84,0,0 5,2010,1,1,4,NA,-20,-12,1018,NW,12.97,0,0 第一步是将日期时间信息整合为一个日期时间,以便我们可以将其用作Pandas的索引。我们需要快速显示前24小时的pm2.5的NA值。因此,我们需要删除第一行数据。在数据集中还有几个分散的“NA”值;我们现在可以用0值标记它们。 以下脚本加载原始数据集,并将日期时间信息解析为Pandas Data Frame索引。“No”列被删除,然后为每列指定更清晰的名称。最后,将NA值替换为“0”值,并删除前24小时。 from pandas import read_csv from datetime import datetime # load data def parse(x): return datetime.strptime(x, '%Y %m %d %H') dataset = read_csv('raw.csv', parse_dates = [['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse) dataset.drop('No', axis=1, inplace=True) # manually specify column names dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] dataset.index.name = 'date' # mark all NA values with 0 dataset['pollution'].fillna(0, inplace=True) # drop the first 24 hours dataset = dataset[24:] # summarize first 5 rows print(dataset.head(5)) # save to file dataset.to_csv('pollution.csv') 运行该示例打印转换的数据集的前5行,并将数据集保存到“pollution.csv”。 Date pollution dew temp press wnd_dir wnd_spd snow rain 2010-01-02 00:00:00 129.0 -16 -4.0 1020.0 SE 1.79 0 0 2010-01-02 01:00:00 148.0 -15 -4.0 1020.0 SE 2.68 0 0 2010-01-02 02:00:00 159.0 -11 -5.0 1021.0 SE 3.57 0 0 2010-01-02 03:00:00 181.0 -7 -5.0 1022.0 SE 5.36 1 0 2010-01-02 04:00:00 138.0 -7 -5.0 1022.0 SE 6.25 2 0 下面的代码加载了“ pollution.csv ”文件,并将每个系列作为单独的子图绘制,除了风速dir,这是分类的。 from pandas import read_csv from matplotlib import pyplot # load dataset dataset = read_csv('pollution.csv', header=0, index_col=0) values = dataset.values # specify columns to plot groups = [0, 1, 2, 3, 5, 6, 7] i = 1 # plot each column pyplot.figure() for group in groups: pyplot.subplot(len(groups), 1, i) pyplot.plot(values[:, group]) pyplot.title(dataset.columns[group], y=0.5, loc='right') i += 1 pyplot.show() 运行示例创建一个具有7个子图的程序,显示每个变量的5年数据。 多变量LSTM预测模型建立: LSTM数据准备 第一步是为LSTM准备污染数据集。这涉及将数据集视为监督学习问题并对输入变量进行归一化处理。考虑到上一个时间段的污染测量和天气条件,我们将把监督学习问题作为预测当前时刻(t)的污染情况。根据过去24小时的天气情况和污染,预测下一个小时的污染,并给予下一个小时的“预期”天气条件。 我们可以使用在博客中开发的series_to_supervised()函数来转换数据集:如何将时间序列转换为Python中的监督学习问题 首先,加载“ pollution.csv ”数据集。风速特征是标签编码(整数编码)。如果你有兴趣探索,也可以使用热编码。 接下来,所有功能都被规范化,然后将数据集转换为监督学习问题。然后删除要预测的小时的天气变量(t)。 完整的代码清单如下: # convert series to supervised learning def series_to_supervised(data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] df = DataFrame(data) cols, names = list(), list() # input sequence (t-n, ... t-1) for i in range(n_in, 0, -1): cols.append(df.shift(i)) names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)] # forecast sequence (t, t+1, ... t+n) for i in range(0, n_out): cols.append(df.shift(-i)) if i == 0: names += [('var%d(t)' % (j+1)) for j in range(n_vars)] else: names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)] # put it all together agg = concat(cols, axis=1) agg.columns = names # drop rows with NaN values if dropnan: agg.dropna(inplace=True) return agg # load dataset dataset = read_csv('pollution.csv', header=0, index_col=0) values = dataset.values # integer encode direction encoder = LabelEncoder() values[:,4] = encoder.fit_transform(values[:,4]) # ensure all data is float values = values.astype('float32') # normalize features scaler = MinMaxScaler(feature_range=(0, 1)) scaled = scaler.fit_transform(values) # frame as supervised learning reframed = series_to_supervised(scaled, 1, 1) # drop columns we don't want to predict reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True) print(reframed.head()) 运行示例打印转换后的数据集的前5行。我们可以看到8个输入变量(输入序列)和1个输出变量(当前小时的污染水平)。 var1(t-1) var2(t-1) var3(t-1) var4(t-1) var5(t-1) var6(t-1) \ 1 0.129779 0.352941 0.245902 0.527273 0.666667 0.002290 2 0.148893 0.367647 0.245902 0.527273 0.666667 0.003811 3 0.159960 0.426471 0.229508 0.545454 0.666667 0.005332 4 0.182093 0.485294 0.229508 0.563637 0.666667 0.008391 5 0.138833 0.485294 0.229508 0.563637 0.666667 0.009912 var7(t-1) var8(t-1) var1(t) 1 0.000000 0.0 0.148893 2 0.000000 0.0 0.159960 3 0.000000 0.0 0.182093 4 0.037037 0.0 0.138833 5 0.074074 0.0 0.109658 注意:我们必须提供超过一小时的输入时间步长。因为在解决序列预测问题时,LSTMs通过时间进行反向传播。 定义和拟合模型 在本节中,我们将通过多变量输入数据拟合LSTM。 首先,我们必须将准备好的数据集分成训练集和测试集。为了加快对这次示范模型的训练,我们将仅使用第一年的数据来拟合模型,然后对其余4年的数据进行评估。下面的示例将数据集分成训练集和测试集,然后将训练集和测试集分成输入和输出变量。最后,将输入(X)重构为LSTM预期的3D格式,即[样本,时间步长,特征]。 # split into train and test sets values = reframed.values n_train_hours = 365 * 24 train = values[:n_train_hours, :] test = values[n_train_hours:, :] # split into input and outputs train_X, train_y = train[:, :-1], train[:, -1] test_X, test_y = test[:, :-1], test[:, -1] # reshape input to be 3D [samples, timesteps, features] train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1])) test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) print(train_X.shape, train_y.shape, test_X.shape, test_y.shape) 运行此示例打印训练集的形状: (8760, 1, 8) (8760,) (35039, 1, 8) (35039,) 现在我们可以定义和拟合我们的LSTM模型。 我们将在第一个隐层中定义具有50个神经元的LSTM和用于预测污染的输出层中的1个神经元。输入形状是1个时间步长,具有8个特征。 我们将在我们的模型中使用平均绝对误差(MAE)损失函数。该模型将拟合50个批量大小为72的训练时期。最后,我们通过在fit()函数中设置validation_data参数来跟踪训练过程中的训练和测试失败。在运行结束时,绘制训练和测试损失。 # design network model = Sequential() model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2]))) model.add(Dense(1)) model.compile(loss='mae', optimizer='adam') # fit network history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False) # plot history pyplot.plot(history.history['loss'], label='train') pyplot.plot(history.history['val_loss'], label='test') pyplot.legend() pyplot.show() 评估模型 模型拟合后,我们可以预测整个测试数据集。 我们将预测的数据集与测试数据集相结合,并反演缩放。我们还可以用预期的污染数字来反演测试数据集的缩放。使用预测值和实际值,我们可以计算模型的误差分数。并且我们还可以计算出与变量本身相同的单位产生误差的均方根误差(RMSE)。 完整例子 完整的示例如下所示:源程序附件中下载! 运行示例首先创建一个绘图,显示训练中的训练损失和测试损失: 有趣的是,我们可以看到测试损失低于训练损失,该模型可能过度拟合训练数据。 训练损失和测试损失在每个训练时期结束时打印。在运行结束时,打印测试数据集上模型的最终RMSE。我们可以看到,该模型实现了可观的RMSE:3.836。 Epoch 46/50 0s - loss: 0.0143 - val_loss: 0.0133 Epoch 47/50 0s - loss: 0.0143 - val_loss: 0.0133 Epoch 48/50 0s - loss: 0.0144 - val_loss: 0.0133 Epoch 49/50 0s - loss: 0.0143 - val_loss: 0.0133 Epoch 50/50 0s - loss: 0.0144 - val_loss: 0.0133 Test RMSE: 3.836 进一步阅读 如果你想学到更多,请参考一下资源: ·北京PM2.5数据集在UCI机器学习库中 ·克拉斯长期记忆模型的5步生命周期 ·使用Python中的长时间内存网络进行时间序列预测 ·用Python中的长时间内存网络进行多步时间序列预测 总结: 在本教程中,你发现了如何将LSTM适用于多变量时间序列预测问题。 具体来说,你学到了: ·如何将原始数据集转换为可用于时间序列预测的内容。 ·如何准备数据并适应多变量时间序列预测问题的LSTM。 · 如何做出预测并将结果重新调整到原始单位。 本文由@阿里云云栖社区组织翻译。 文章原标题《Multivariate Time Series Forecasting with LSTMs in Keras》 作者:Jason Brownlee 作者个人博客地址:http://machinelearningmastery.com/blog/ 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
“拥有智能的机器”是人们长期以来的愿景,AI的发展速度这个愿景似乎就要成为现实了。当机器有了足够多的智慧,它们就能脱离人类的控制,自主运作,独立作出判断和选择。当一个机器有权利去选择的时候,问题就来了:它的选择是道德的吗?对于它们而言,它们的道德标准和人类一样吗? 谷歌的AlphaGo与李世石的第二场围棋赛中,AlphaGo下出的第37收震惊了专家评委们。没有人理解它为什么要那么走,因为人类棋手不会走子。然而事实证明它并不是走错了,连它的创造者都明白它是怎么规划战略的,AlphaGo告诉了我们,在完成同一项任务的时候,AI的思维并不是一定和我们相同。 对于人类来说,我们对价值观或者说道德的判断几乎都是要基于一定的情感判断的。所以道德一旦掺加了人性情感的判断就变得无比复杂。历史上对道德的观点有两派:天理派和本质派。 “天理派”认为,道德是在人类本性之上的,是永恒且客观的;而“本质派”则认为人类的道德是人类这一存在的产物,而也许其他种类的存在会有其他形式的道德。 天理派学说的代表人物亨利·西奇威克19世纪的功利主义哲学家,他认为,一个有道德的行为从全宇宙的角度来看都应该是正当的。也就是说,一个行为道德与否不取决于任何个人的看法;一个有道德的行为应该能把全人类的利益最大化。而对于掺加了情感的道德行为,进化遗留的问题,它意味着人类还未完全进化。 然而智能机器还没有进化遗留问题,关于道德,他们有一个崭新的开始。如果我们能教会它们从宇宙的角度去思考,那么会发生什么呢? 请想象一下,现在是2026年。一辆无人驾驶的汽车载着你的两个孩子去上学,这时三个你不认识的小孩突然出现在前方的路上。刹车也来不及了,唯一救那三个小孩的方法就是拐进路边的水沟里,而这样做的话你的两个孩子就会淹死。你不会做这样的决定,因为你被自己对自己孩子的无逻辑的感情蒙蔽了双眼;但是这辆自驾车的道德观告诉它,从全宇宙的角度看,两个儿童的死亡好过三个的。它会拐进沟里,将全人类的利益最大化;对于“天理派”,智能机器必须做出道德上可观正确的选择,即使这种选择是我们这些有缺陷的人类无法做出的。 如果是基于我们人类的情感来说,我们的选择肯定是保住我们自己的两个孩子。虽然这个做法着实很不道德,但是这是符合人类本性的行为。在这一点上,我们人类不得不承认,我们是一类充满缺陷的生物群体,而这种最大的缺陷却是我们最珍惜的、最值得骄傲的人性的温馨。 但是,对于AI来说,它们肯定选择保住三个孩子,对于它们来说,价值最大是终极目标。可能这样的做法,对于它们的拥有着来说,是很难接受的,但是在他们的所谓的道德标准里面,利益最大化是终极目标。这也是区别于人类最大弱点的价值判断,没有人性。这种没有人性的道德,从全宇宙的角度来看,是最好的选择。 但是,有一个问题:AI是由人来设计的,它的道德准则势必会受到人类的影响。我们所想象的这种几乎接近完人的机器,到底会不会存在呢?基于人类人性的特征,我们不会允许AI比我们强太多,换句话说,今天我们人类自主设计的AI不会接近完美。而不让AI接近完美的干扰因素正是我们人类的不完美因素造成的。 在1940年的时候,科幻作家艾萨克·阿西莫夫(Isaac Asimov)提出了“机器人三定律”,旨在保证人类能在享其利的同时避其害。三定律的第一条很简单:“机器人不得伤害人类,也不得对人类受到伤害袖手旁观”。剩下的两条则要求机器人在第一条得到保证的前提下,服从指令且保护自己。对阿西莫夫来说,机器人存在的意义就是辅助我们。 但是机器人三定律真的就足够了吗?举个例子:假设一位钢琴家的手染上了坏疽,不截肢就会导致死亡。但她发誓说,如果不能弹琴,她就不想活了;但是同时她也在发烧,所以她可能并没有真的这么想。机器人医生该怎么做呢?是该让钢琴家承受被截去手的伤害,还是坏疽带来的死亡的伤害? 机器在面对这样的问题的时候,到底是按照自己的思路去选择,还是按照人类的思路去选择呢?或许对于这样的问题,我们无法给予一个合理的答案,因为不管怎么样,或多或少对于这位钢琴家来说,都会带来些许的伤害。至于这些伤害到底如何去选择,或许机器要用超过全宇宙的角度来抉择。 如果教这些机器阅读人类文明的结晶——哲学巨著,想想一下,它是否会得出一些不同于人类的感悟。会不会形成自己的独到的哲学观念? 人类对于道德的理解,其实就一句话,能够找到合理的解释来证明自己的做法是合理的就行了。同样机器人道德应该符合他们的本性,它们是独立的理性个体,虽然它们是被个体刻意创造的,但它们和创造者共享着世界,同样需要向世界证明自己选择的合理性。
更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 本月初,谷歌CEO Sundar Pichai在跟开发者分享从他的机器学习实验室得到的结果时,他表现的非常兴奋。因为他们实验室的研究人员,已经找到了自动化生成机器学习软件的方法。并且他们也发现,这个方法很容易就能部署到新的情景和行业内。 不过,该项目在AI研究领域内名声大噪的另外一个原因就是,它成功的证明了在机器学习领域竞争,计算资源(计算能力)才是取胜的关键。 一篇来自谷歌的论文研究表明,在这个项目中,他们同时使用了800多个功能强大并且非常昂贵的图形处理器(GPU)。GPU的使用,对近期机器学习能力的提高起到了至关重要的作用。(详见:2013年10大突破性技术:深度学习)他们告诉《麻省理工科技评论》,这个项目已经持续使用这些芯片两周。仅仅这一个研究项目就消耗了大量的资源,即使像谷歌这样有钱的公司,也难以承受如此大的开销。 对于无法访问大型GPU集群的研究人员来说,做这样的实验就意味着要有大量的研究经费。如果从亚马逊的云计算服务中心租用800个GPU,一周就需要大约12万美金的开销。 比起运行深度学习的软件,训练深度学习软件所消耗的资源更加庞大。计算能力对于现在的机器学习来说,算是一个瓶颈。斯坦福大学的副教授Reza Zadeh如是说,同时Reza Zadeh还是Matroid的创始人兼首席执行官,Matroid是一家利用软件帮助企业来识别视频中人和车的公司。 人工智能的发展需要在计算能力不断的有所突破,但是不幸的是计算行业赖以生存了50年的两大定律却正在渐渐的走向灭亡,一个是“摩尔定律”,它曾预测每两年,相同面积的芯片上的晶体管数量将会翻倍;另外一个是Dennard缩放比例定律,它指出当晶体管变小时,它们的功耗如何按比例缩小。 今天,这两个昔日辉煌的定律都不在适用了。英特尔已经减缓了引入更小,更密集的晶体管的步伐。(详见:Moore's Law is dead.Now What?)在20世纪中期,随着晶体管的不断变小,晶体管的使用效率就很难得到提升,所以能耗成为了最头疼的问题。 押注人工智能的一个好消息是,图形芯片目前已经成功的进入到人们的视野中。最近,全球领先图形芯片英伟达的首席执行官黄仁勋向公众展示了一个图表,该图表显示,英伟达芯片的性能在以指数级加速,相比之下通用处理器CPU的性能提升已经减缓。 致力于将新技术商业化的微软NEXT的工程师Doug Burger表示,传统软件和机器学习软件之间也有类似的差距(暗指CPU和GPU之间的差距)。他说:“目前,通用软件的性能已经到了一个停滞期,但是人工智能却还在迅猛的发展。” Doug Burger还认为,这种趋势还会继续下去。工程师们会让GPU变得越来越强大,因为GPU可以更专业的处理图形或者机器学习中所需要的数学问题。 同样的理念还出现在Doug Burger在微软领导的一个项目中,它通过使用被称作是FPGAs的可重构芯片为人工智能软件提供了更加强大的计算能力。它同样激励着一些初创公司和巨头,比如说谷歌——创造一种特殊的芯片去驱动机器学习。(详见:google reveals a powerful NEW Ai Chip and Supercomputer)。 从长远角度来看,要使人工智能更加强大,计算机芯片必须更加彻底的改变。开发特定的芯片是一个主要的方向,现实情况已经证明,这些芯片确实能够使计算机效率更高,并且不会损害机器学习软件输出结果的准确性。(详见:Why a Chip That’s Bad at Math Can Help Computers Tackle Harder Problems)。 芯片的设计直接复制生物结构也可能会成为未来的一个新的方向,IBM和其他公司已经构建出使用尖峰电流进行计算的芯片原型,其计算过程类似于人类神经元的激发过程。(详见:Thinking in Silicon) Burger说“一些简单的动物,能够用很少的能量实现的功能就超过了今天我们机器人,不得不承认的是,在这些行为中一定存在很多提高性能和效率机制等待着被我们发现。” 毕竟人工智能这条路才真正的开始,我们可以从人类的神经网络中获取算法模型。或许我们也可以从人类的神经网络中获取更多的启发。在人工智能这条道路上,我们还需要花费很长的时间。 作者介绍:Tom Simonite 麻省理工技术评论在旧金山总编辑。曾经在剑桥大学伦敦帝国学院和新科学家杂志工作过五年。本文由北邮@爱可可-爱生活推荐,阿里云云栖社区翻译。文章原标题《How AI Can Keep Accelerating After Moore’s Law》作者:Tom Simonite,译者:袁虎,审阅:我是主题曲哥哥文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 当15年前推出MapReduce时,它展示了整个世界对于未来的不屑一瞥。硅谷科技公司的工程师第一次可以分析整个互联网。然而,MapReduce提供了非常低级API,结果使这个“超级力量”成为了奢侈品,只有极少数的高学历的,有很多资源的工程师才可以使用它。 今天,深度学习已经达到了“MapReduce”当时的地位:它已经显示出了很大潜力,它是人工智能的“超级力量”。它的力量在过去的几年创造的价值很让人吃惊,例如:自动驾驶汽车和AlphaGo这些都被认为是奇迹。 然而,今天利用深度学习的超级力量与过去的大数据一样具有挑战性。深度学习框架由于低级API而具有陡峭的“学习曲线” ;扩展分布式硬件需要大量的人工工作; 即使是大量的时间和资源的结合,深度学习实现成功也需要繁琐的工作和实验参数。因此深度学习也通常被称为“黑魔法”。 七年前,我们开始了一个Spark项目,其目标是通过提供高级API和统一的引擎来实现机器学习,ETL,流式传输和交互式SQL,从而实现“大众化”大数据的“超级力量”的目标。今天,Apache Spark已经为软件工程师们及SQL分析师们都提供了大量数据。 继续这个民主化的愿景,我们很高兴地宣布深度学习管道,这是一个新的开源库,旨在使每个人都能轻松地将可扩展的深度学习整合到他们的工作流程中,使他们能从机器学习从业者过渡到商业分析师,真正的将技术应用于实际生活中。 深度学习管道基于Apache Spark的ML管道培训,并使用Spark DataFrames和SQL部署模型。它包括用于深度学习的常见的高级API,因此有些功能可以在几行代码中高效地完成,比如说: · 图像加载(Image loading) · 在Spark ML管道中应用预先训练的模型(Apply pre-trained models as transformers in a Spark ML pipeline) · 迁移学习(Transfer learning) · 分布式超参数调优(Distributed hyperparameter tuning) · 在DataFrames和SQL中部署模型 接下来,我们通过实例详细描述这些功能。要在Databricks上尝试这些和更多的例子,请查看笔记本深度学习流水线在数据库中。 图像加载(Image loading) 在图像上应用深度学习的第一步是加载图像的能力。深度学习管道包括可以将数百万图像加载到DataFrame中的实用程序功能,并以分布式方式自动解码它们,从而允许进行大规模操作。 df = imageIO.readImages("/data/myimages") 我们还正在努力增加对更多数据类型的支持,如文本和时间序列。 应用可预测的预训练模型(Applying Pre-trained Models for Scalable Prediction) 深度学习管道支持以分布式的方式运行预训练的模型,可用于批量和流式数据处理。它包含了一些最受欢迎的模型,使用户在不需要花费昂贵的培训模型的前提下,能够直接开始深度学习。例如,以下代码使用InceptionV3创建一个Spark预测流水线,InceptionV3是用于图像分类的最先进的卷积神经网络(CNN)模型,并且预测了我们刚加载的图像中是什么样的对象。当然,这个预测是利用Spark一起完成的。 from sparkdl import readImages, DeepImagePredictor predictor = DeepImagePredictor(inputCol="image", outputCol="predicted_labels", modelName="InceptionV3") predictions_df = predictor.transform(df) 除了使用已经创建好的模型,用户还可以在Spark预测管道中插Keras 模型和TensorFlow Graphs。这可以将单节点工具上的任何单节点模型转换成可以分布式应用在大量数据的单节点模型。 在数据库统一分析平台上,如果选择基于GPU的集群,计算密集型部分将自动运行在GPU上,以获得最佳效率。 迁移学习(Transfer learning) 预先训练的模型在适合手头任务时非常有用,但通常不会针对用户正在处理的特定数据集进行优化。例如,InceptionV3是针对广泛的1000个类别进行图像分类优化的模型,但我们的域可能是狗种分类。一种常用的深度学习技术是迁移学习,它使针对类似任务训练的模型适应于手头的任务。同从初级培训新模式相比,迁移学习需要大幅度的减少数据和资源。这就是为什么迁移学习已经成为许多现实世界的用例,如癌症检测方法。 深度学习管道可以快速转移学习与Featurizer的概念。以下示例结合了Spark中的InceptionV3模型和逻辑回归,以将InceptionV3适配到我们的特定域。DeepImageFeaturizer自动剥离预先训练的神经网络的最后一层,并使用所有以前层的输出作为逻辑回归算法的特征。由于逻辑回归算法是一种简单而快速的算法,所以这种迁移学习训练可以快速收敛,而不需要通过培训远程学习模型所需的图像。 from sparkdl import DeepImageFeaturizer from pyspark.ml.classification import LogisticRegression featurizer = DeepImageFeaturizer(modelName="InceptionV3") lr = LogisticRegression() p = Pipeline(stages=[featurizer, lr]) # train_images_df = ... # load a dataset of images and labels model = p.fit(train_images_df) 分布式超参数调优(Distributed hyperparameter tuning) 在深度学习中获得最佳结果需要对培训参数进行不同的测试,这是一个超参数调优的重要步骤。由于深度学习管道可以将深度学习培训作为Spark的机器学习流程中的一步,因此用户可以依靠已经内置到Spark中的超参数调优基础架构。 以下代码插入到Keras Estimator中,并使用具有交叉验证的网格搜索来执行超参数调整: myEstimator = KerasImageFileEstimator(inputCol='input', outputCol='output', modelFile='/my_models/model.h5', imageLoader=_loadProcessKeras) kerasParams1 = {'batch_size':10, epochs:10} kerasParams2 = {'batch_size':5, epochs:20} myParamMaps = ParamGridBuilder() \ .addGrid(myEstimator.kerasParams, [kerasParams1, kerasParams2]) \ .build() cv = CrossValidator(myEstimator, myEvaluator, myParamMaps) cvModel = cv.fit() kerasTransformer = cvModel.bestModel # of type KerasTransformer 在SQL中部署模型(Deploying Models in SQL) 一旦数据科学家建立了所需的模型,深度学习管道就可以将其作为SQL中的一个功能,所以组织中的任何人都可以使用它 - 数据工程师,数据科学家,业务分析师,任何人。 sparkdl.registerKerasUDF("img_classify", "/mymodels/dogmodel.h5") 接下来,组织中的任何用户都可以在SQL中应用预测: SELECT image, img_classify(image) label FROM images WHERE contains(label, “Chihuahua”) 所有支持的语言(Python,Scala,Java,R)中的DataFrame编程API中也提供了类似的功能。与可扩展预测类似,此功能可以在批量和结构化流中使用。 结论: 在这篇博文中,我们介绍了深层学习管道,这是一个新的图书馆,使深度学习更加容易使用和扩展。虽然这只是一个开始,我们认为深度学习管道有潜力完成Spark所完成的工作:使深度学习的“超级力量”对每个人都是触手可得的。 系列中的未来帖子将更详细地介绍图书馆中的各种工具,比如说:大规模的图像处理,迁移学习,大规模预测,以及在SQL中进行深度学习。 要了解有关该库的更多信息,请查看Databricks笔记本以及github仓库。我们希望您能给我们反馈。或者,作为贡献者,并帮助将可扩展的深度学习的超级力量带给每个人。 超级福利:免费试用DATABRICKS 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。文章原标题《A Vision for Making Deep Learning Simple From Machine Learning Practitioners to Business Analysts》, 作者: Sue Ann Hong, Tim Hunter and Reynold Xin ,译者:袁虎,审阅:我是主题曲哥哥 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 众所周知,R语言是统计分析最好用的语言。但在Keras和TensorFlow的帮助下,R语言也可以进行深度学习了。 在机器学习的语言的选择上,R和Python之间选择一直是一个有争议的话题。但随着深度学习的爆炸性增长,越来越多的人选择了Python,因为它有一个很大的深度学习库和框架,而R却没有(直到现在)。 但是我就是想使用R语言进入深度学习空间,所以我就从Python领域转入到了R领域,继续我的深度学习的研究了。这可能看起来几乎不可能的。但是今天这变成了可能。 随着Keras在R上的推出,R与Python的斗争回到了中心。Python慢慢成为了最流行的深度学习模型。但是,随着Keras库在R后端的发布,并且在后台还可以使用张力流(TensorFlow)(CPU和GPU兼容性),所以在深度学习领域,R将再次与Python打成平手。 下面我们将看到如何使用Tensorflow在R中安装Keras,并在RStudio的经典MNIST数据集上构建我们的第一个神经网络模型。 目录: 1.在后端安装带有张量的Keras。 2.使用Keras可以在R中构建不同类型的模型。 3.在R中使用MLP对MNIST手写数字进行分类。 4.将MNIST结果与Python中的等效代码进行比较。 5.结束笔记。 1.在后端安装带有TensorFlow的Keras。 在RStudio中安装Keras的步骤非常简单。只需按照以下步骤,您将很顺利的在R中创建您的第一个神经网络模型。 install.packages("devtools") devtools::install_github("rstudio/keras") 上述步骤将从GitHub仓库加载keras库。现在是将keras加载到R并安装TensorFlow的时候了。 library(keras) 默认情况下,RStudio加载TensorFlow的CPU版本。使用以下命令下载TensorFlow的CPU版本。 install_tensorflow() 要为单个用户/桌面系统安装具有GPU支持的TensorFlow版本,请使用以下命令。 install_tensorflow(gpu=TRUE) 有关更多的用户安装,请参阅本安装指南。 现在我们在RStudio中安装了keras和TensorFlow,让我们在R中启动和构建我们的第一个神经网络来解决MNIST数据集 2.使用keras可以在R中构建的不同类型的模型 以下是使用Keras可以在R中构建的模型列表。 1.多层感知器 2.卷积神经网络 3.循环神经网络 4.Skip-Gram模型 5.使用预先训练的模型,如VGG16,RESNET等 6.微调预先训练的模型。 让我们开始构建一个非常简单的MLP模型,只需一个隐藏的层来尝试分类手写数字。 3.使用R中的MLP对MNIST手写数字进行分类 #loading keras library library(keras) #loading the keras inbuilt mnist dataset data<-dataset_mnist() #separating train and test file train_x<-data$train$x train_y<-data$train$y test_x<-data$test$x test_y<-data$test$y rm(data) # converting a 2D array into a 1D array for feeding into the MLP and normalising the matrix train_x <- array(train_x, dim = c(dim(train_x)[1], prod(dim(train_x)[-1]))) / 255 test_x <- array(test_x, dim = c(dim(test_x)[1], prod(dim(test_x)[-1]))) / 255 #converting the target variable to once hot encoded vectors using keras inbuilt function train_y<-to_categorical(train_y,10) test_y<-to_categorical(test_y,10) #defining a keras sequential model model <- keras_model_sequential() #defining the model with 1 input layer[784 neurons], 1 hidden layer[784 neurons] with dropout rate 0.4 and 1 output layer[10 neurons] #i.e number of digits from 0 to 9 model %>% layer_dense(units = 784, input_shape = 784) %>% layer_dropout(rate=0.4)%>% layer_activation(activation = 'relu') %>% layer_dense(units = 10) %>% layer_activation(activation = 'softmax') #compiling the defined model with metric = accuracy and optimiser as adam. model %>% compile( loss = 'categorical_crossentropy', optimizer = 'adam', metrics = c('accuracy') ) #fitting the model on the training dataset model %>% fit(train_x, train_y, epochs = 100, batch_size = 128) #Evaluating model on the cross validation dataset loss_and_metrics <- model %>% evaluate(test_x, test_y, batch_size = 128) 上述代码的训练精度为99.14,验证准确率为96.89。代码在i5处理器上运行,运行时间为13.5秒,而在TITANx GPU上,验证精度为98.44,平均运行时间为2秒。 4.MLP使用keras–R VS Python 为了比较起见,我也在Python中实现了上述的MNIST问题。我觉得在keras-R和Python中应该没有任何区别,因为R中的keras创建了一个conda实例并在其中运行keras。你可以尝试运行一下下面等效的python代码。 #importing the required libraries for the MLP model import keras from keras.models import Sequential import numpy as np #loading the MNIST dataset from keras from keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() #reshaping the x_train, y_train, x_test and y_test to conform to MLP input and output dimensions x_train=np.reshape(x_train,(x_train.shape[0],-1))/255 x_test=np.reshape(x_test,(x_test.shape[0],-1))/255 import pandas as pd y_train=pd.get_dummies(y_train) y_test=pd.get_dummies(y_test) #performing one-hot encoding on target variables for train and test y_train=np.array(y_train) y_test=np.array(y_test) #defining model with one input layer[784 neurons], 1 hidden layer[784 neurons] with dropout rate 0.4 and 1 output layer [10 #neurons] model=Sequential() from keras.layers import Dense model.add(Dense(784, input_dim=784, activation='relu')) keras.layers.core.Dropout(rate=0.4) model.add(Dense(10,input_dim=784,activation='softmax')) # compiling model using adam optimiser and accuracy as metric model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy']) # fitting model and performing validation model.fit(x_train,y_train,epochs=50,batch_size=128,validation_data=(x_test,y_test)) 上述模型在同一GPU上实现了98.42的验证精度。所以,我们最初猜到的结果是正确的。 5.结束笔记 如果这是你在R的第一个深度学习模型,我希望你喜欢它。通过一个非常简单的代码,您可以有98%位准确率对是否为手写数字进行分类。这应该是足够的动力让你开始深度学习。 如果您已经在Python中使用keras深度学习库,那么您将在R中找到keras库的语法和结构与Python中相似的地方。事实上,R中的keras包创建了一个conda环境,并安装了在该环境中运行keras所需的一切。但是,让我更为激动的是,现在看到数据科学家在R中建立现实生活中的深层次的学习模型。据说 - 竞争应该永远不会停止。我也想听听你对这一新发展观点的看法。你可以在下面留言分享你的看法。 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《Getting started with Deep Learning using Keras and TensorFlow in R》,作者: NSS , 译者:袁虎,审阅: 阿福 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 计算机视觉是一门研究如何使机器‘看’的科学,我们都喜欢看美丽的图像,但是你有没有想过计算机是如何看这些图像的?接下来,我会详细介绍说明计算机如何处理图像的。 看到上面的图像,一个正常的人可以很容易地知道,图像中有一只猫。但是,计算机可以真正看到猫吗?答案是否定的,计算机看到数字矩阵(0到255之间)。一般来说,我们可以将图像分类为灰度图像或彩色图像。首先,我们先讨论灰度图像然后再讨论彩色。上图是灰度图像,图像中每个像素都表示的是像素的亮度,下面我们就说一说这个亮度问题。了解更多关于像素。让我们先来看看上面图片中计算机是怎么看的。 我已将上面的图像大小调整为18 * 18,以便于理解。与我们不同的是,计算机将图像看作2D矩阵。你可能听说有人说这幅画的大小是1800 * 700或1300 * 700,这个大小显示了一个图像的宽度和高度。换句话说,如果大小为1300 * 700,则水平方向为1300像素,垂直方向为700像素。这意味着总共有910000(1300 * 700)像素。如果图像的大小为700 * 500,那么矩阵的维数将为(700,500)。这里,矩阵中的每个元素(像素)表示该像素中的亮度强度。这里,0表示黑色,255表示白色,数字越小,越接近黑色(数字大小决定黑的程度)。 彩色图像 在灰度图像中,每个像素表示仅一种颜色的强度。换句话说,它有一个通道。而在彩色图像中,我们有3个通道RGB(红,绿,蓝)。标准数码相机都有3(RGB)通道。 如上图所示,彩色图像由红色、绿色和蓝色三个通道组成。现在的问题是,计算机如何看待这个形象?同样,答案是他们看到矩阵。现在下一个问题应该是,我们要如何在矩阵中表示这个图像,因为它有3个通道,与我们只有一个通道的灰度图像不同。在这种情况下,我们利用3D矩阵来实现表示彩色图像。我们有一个通道的矩阵,但在这种情况下,我们将有三个矩阵堆叠在一起,这就是为什么它是3D。700 * 700彩色图像的尺寸将为(700,700,3)。假设第一个矩阵表示红色通道,则该矩阵的每个元素表示该像素中的红色强度,同样为绿色和蓝色。通常,彩色图像中的每个像素具有与其相关联的三个数字(0至255)。这些数字表示该特定像素中的红色、绿色和蓝色的强度。至于为什么是红绿蓝这三色,想必大家都知道色度学的最基本原理,即三基色原理。大多数颜色都可以通过三色按照不同的比例混合产生。 结论 计算机将图像看作矩阵。灰度图像具有一个通道(灰色),因此我们可以在2D矩阵中表示灰度图像,其中每个元素表示该特定像素中亮度的强度。记住,0表示黑色,255表示白色。灰度图像有一个通道,而彩色图像有三个通道RGB(红、绿、蓝)。我们可以在深度为3的3D矩阵中表示彩色图像。 本文由阿里云云栖社区组织翻译。 文章原标题《How do computers see an image ?》,作者:Savan Visalpara 作者个人网站:https://savan77.github.io/,可以与作者交流。 译者:袁虎,审阅:李烽 阿福 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 当你正在处理文本分类问题,当你正在改进你的训练集,也许你已经尝试使用Naive Bayes。但是现在你对数据集分类有信心,并希望进一步了解整个数据集的特征。我想支持向量机(SVM):一种快速可靠的分类算法,可以在有限的数据量下帮你做的更好。 SVM算法背后的思想很简单,将其应用于自然语言分类并不需要大部分复杂的东西。 在继续之前,我们建议你首先阅读our guide to Naive Bayes classifiers(Naive Bayes分类器的解释),因为有关文本处理的许多事情也与此相关。 SVM如何工作? 支持向量机的基础知识及其工作原理可以通过一个简单的例子来理解。我们假设有两个类别:红色和蓝色,我们的数据有两个特征:x和y。我们想要一个分类器,给定一对(x,y)坐标,如果它是红色或蓝色,则在坐标轴上输出红点或者蓝点,我们将我们已经标记的训练数据绘制在坐标轴上: 支持向量机采用这些数据点并输出最佳分类的超平面(其在二维中只是一条线)。这条线是决策边界:任何落在其一侧的东西,我们将分类为蓝色,另外一侧就是红色。 但是,什么是最优的超平面?对于SVM来说,如果训练数据可以无误差地被划分,并且每一类数据中距离超平面最近点和超平面之间的距离最大。超平面决定了我们对数据分类的准确度。 你可以查看此视频教程,了解如何找到最佳超平面。 非线性数据 现在这个例子很简单,因为数据显然是线性分离的,我们可以画一条直线来分开红色和蓝色。可悲的是,通常情况并不简单。看看这种情况: 很清楚的可以看到这没有一个线性决策边界(一个直线分开两个类别)。然而,这些向量非常清楚地分离,看起来好像应该很容易分开它们。 所以这里是我们要做的:我们将添加第三维。到目前为止,我们有两个维度:x和y。我们创建一个新的维度z,我们创建它是因为它是一种方便的方式可以计算出来的:z = x2 + y2(你会注意到这是一个圆的方程式)。 这将给我们一个三维的空间。看一下这个空间,看起来像这样: SVM可以做什么?让我们来看看: 请注意,由于现在我们处于三维空间,超平面是在某一z(即z = 1)平行于x轴的平面。 我们将其映射回二维: 我们的决策边界是半径为1的圆周。 核技巧 在我们的例子中,我们找到了一种通过将我们的空间巧妙地映射到更高维度来分类非线性数据的方法。然而,事实证明,计算这种转换可能会带来很大的计算成本:可能有很多新的维度,每一个都可能涉及复杂的计算。数据集中的每个向量执行此操作都需要做很多工作,所以去找到一个更便宜的解决方案就变得非常重要了。 这是一个窍门:SVM不需要实际的向量来工作,它实际上可以通过它们之间的点积(Dot product)获得。这意味着我们可以回避昂贵的计算! 想象一下我们想要的新空间: z = x 2 + y 2 弄清楚该空间中的点积(Dot product)是什么样的: a·b = xa·xb+ ya·yb+ za·zb a·b = xa·xb+ ya·yb+(xa2 + ya2)·(xb2 + yb2) 告诉SVM做它的事情,但要使用新的点积 - 我们称之为内核函数。 这是内核技巧,这使我们能够避开很多昂贵的计算。通常,内核是线性的,我们得到一个线性分类器。然而,通过使用非线性内核(如上所述),我们可以得到一个非线性分类器,且不用转换数据,我们只将数量积改变为我们想要的空间。 注意,内核技巧实际上不是SVM的一部分。它可以与其他线性分类器一起使用,如逻辑回归。支持向量机只负责找出决策边界。 SVM如何与自然语言分类一起使用? 我们可以在多维空间中对向量进行分类。但现在我们要将这个算法应用于文本分类,首先我们需要的是将一段文本转换为一个数字向量,以便我们可以运行SVM。换句话说,我们必须使用哪些功能才能使用SVM对文本进行分类? 最常见的答案是字频,就像我们在Naive Bayes一样。这意味着我们将一个文本视为一个单词,对于这个包中出现的每个单词,我们都能记录它出现的频率。 这种方法只是为了计算每个单词在文本中出现次数,并将其除以总字数。所以,在句子“All monkeys are primates but not all primates are monkeys”这个monkey有2/10 = 0.2的频率,and这个词,但有1/10 = 0.1的频率。 对于更高级的计算频率的替代方案,我们也可以使用TF-IDF(逆文档频率)。 现在我们已经做到了,我们的数据集中每个文本都被表示为具有数千(或数万)维度的向量,每一个都代表文本中的一个单词的频率。我们可以通过使用预处理技术来改善这一点,例如词干提取,删除停止词和使用N元文法n-gram。 选择一个核函数 现在我们有特征向量,唯一需要做的就是为我们的模型选择一个内核函数。每个问题都不同,内核功能取决于数据分布的外观。在我们的例子中,我们的数据是以同心圆排列的,所以我们选择了一个与这些数据分布外观匹配的内核。 考虑到这一点,自然语言处理最好用哪一种?我们需要一个非线性分类器吗?还是数据线性分离?事实证明,最好坚持线性内核。为什么? 回到我们的例子中,我们有两个特征。SVM在其他领域的一些实际用途可能会使用数十甚至数百个特征,而NLP分类器使用有成千上万的特征。这会出现新的问题:在其他情况下使用非线性内核可能是一个好主意,有这么多特征将最终使非线性内核过拟合数据。因此,最好只是坚持一个好的旧线性内核,在这些情况下它往往是表现最好的。 训练: 这些都准备好后,最后唯一要做的就是训练!我们必须使用我们的标签文本集,将它们转换为使用字频率的向量,并将它们送到算法,这将使用我们选择的内核函数,最后它生成一个模型。然后,当我们有一个我们想要分类的新的未标记的文本时,我们将其转换为一个向量,并将其转换为模型,这将输出文本的类别。 总结: 支持向量机允许您对可线性分离的数据进行分类。 如果它不是线性分离的,你可以使用内核技巧使其工作。 然而,对于文本分类,最好只是坚持线性内核。 与较新的算法(如神经网络)相比,它们具有两个主要优点:具有较高速度和更好的性能,数量有限(以千计)。这使得算法非常适合于文本分类问题,其中通常可以访问至多几千个标记样本的数据集。 本文由北邮@爱可可-爱生活推荐,阿里云云栖社区翻译。文章原标题《An introduction to Support Vector Machines (SVM)》 作者:Bruno Stecanella,机器学习爱好者,译者:袁虎,审阅:李烽 主题曲哥哥文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 最简单的解决方案通常是最强大的解决方案,而朴素贝叶斯就是一个很好的证明。尽管机器学习在过去几年取得了巨大的进步,但朴素贝叶斯已被证明不仅简单,而且快速、准确、可靠。它已经成功地用于许多项目中,而且它对自然语言处理(NLP)的问题的解决提供了很大的帮助。 朴素贝叶斯是利用概率论和贝叶斯定理预测样本类别(如新闻或客户评论)的概率算法。它们是概率性的,这意味着它们计算给定样本的每个类别的概率,然后输出概率最高的样本类别。他们获得这些概率的方式是使用贝叶斯定理,它基于可能与该特征相关的条件的先前数据来描述特征的概率。 我们将使用一种称为多项式朴素贝叶斯的算法。我们将以一个例子的方式介绍应用于NLP的算法,所以最终不仅你会知道这个方法是如何工作的,而且还会知道为什么它可以工作。我们将使用一些先进的技术,使朴素贝叶斯与更复杂的机器学习算法(如SVM和神经网络)可以相提并论。 一个简单的例子 让我们看一下这个例子在实践中如何运作。假设我们正在建立一个分类器,说明文本是否涉及体育运动。我们的训练集有5句话: Text Category A great game(一个伟大的比赛) Sports(体育运动) The election was over(选举结束) Not sports(不是体育运动) Very clean match(没内幕的比赛) Sports(体育运动) A clean but forgettable game (一场难以忘记的比赛) Sports(体育运动) It was a close election (这是一场势均力敌的选举) Not sports(不是体育运动) 由于朴素贝叶斯贝叶斯是一个概率分类器,我们想要计算句子“A very close game” 是体育运动的概率以及它不是体育运动的概率。在数学上,我们想要的是P(Sports | a very close game)这个句子的类别是体育运动的概率。 但是我们如何计算这些概率呢? 特征工程 创建机器学习模型时,我们需要做的第一件事就是决定使用什么作为特征。例如,如果我们对健康进行分类,特征可能就是是一个人的身高,体重,性别等等。我们会排除对模型无用的东西,如人的名字或喜爱的颜色。 在这种情况下,我们甚至没有数字特征。我们只有文字。我们需要以某种方式将此文本转换成可以进行计算的数字。 那么我们该怎么办?一般都是使用字频。也就是说,我们忽略了词序和句子的构造,把每一个文件作为单词库来处理。我们的特征将是这些词的计数。尽管它似乎过于简单化,但它的效果令人惊讶。 贝叶斯定理 贝叶斯定理在使用条件概率(如我们在这里做)时很有用,因为它为我们提供了一种方法来扭转它们:P(A|B)=P(B|A)×P(A)/P(B)。在我们这种情况下,我们有P(sports | a very close game),所以使用这个定理我们可以逆转条件概率: 因为对于我们的分类器,我们只是试图找出哪个类别有更大的概率,我们可以舍弃除数,只是比较 这样就更好理解了,因为我们可以实际计算这些概率!只要计算句子 “A very close game” 多少次出现在“ Sports”的训练集中,将其除以总数,就可以获得P(a very close game | Sports)。 有一个问题,但是我们的训练集中并没有出现“A very close game”,所以这个概率是零。除非我们要分类的每个句子都出现在我们的训练集中,否则模型不会很有用。 Being Naive 我们假设一个句子中的每个单词都与其他单词无关。这意味着我们不再看整个句子,而是单个单词。我们把P(A very close game)写成:P(a very close game)=P(a)×P(very)×P(close)×P(game) 这个假设非常强大,但是非常有用。这使得整个模型能够很好地处理可能被错误标签的少量数据或数据。下一步将它应用到我们以前所说的: P(a very close game|Sports)=P(a|Sports)×P(very|Sports)×P(close|Sports)×P(game|Sports) 现在,我们所有的这些单词在我们的训练集中实际出现了好几次,我们可以计算出来! 计算概率 计算概率的过程其实只是在我们的训练集中计数的过程。 首先,我们计算每个类别的先验概率:对于训练集中的给定句子, P(体育运动)的概率为⅗。然后,P(非体育运动)是⅖。然后,在计算P(game | Sports)就是“game”有多少次出现在sports的样品,然后除以sports的总数(11)。因此,P(game|Sports)=2/11。 但是,我们遇到了一个问题:“close”不会出现在任何sports样本中!那就是说P(close | Sports)= 0。这是相当不方便的,因为我们将把它与其他概率相乘,所以我们最终会得到P(a|Sports)×P(very|Sports)×0×P(game|Sports)等于0。这样做的事情根本不会给我们任何信息,所以我们必须找到一个办法。 我们该怎么做呢?通过使用一种被称为拉普拉斯平滑的方法:我们为每个计数添加1,所以它不会为零。为了平衡这一点,我们将可能的词数加到除数,因此这部分将永远不会大于1。在我们的案例中,可能的话是 [ “a” ,“great” ,“very” ,“over” ,'it' ,'but' ,'game' ,'election' ,'close' ,'clean' ,'the' ,'was' ,'forgettable' ,'match' ] 。 由于可能的单词数是14,应用拉普拉斯平滑我们得到了。全部结果如下: 现在我们只是将所有的概率加倍,看看谁更大: 完美!我们的分类器给出了“A very close game” 是Sport类。 先进的技术 改进这个基本模型可以做很多事情。以下这些技术可以使朴素贝叶斯与更先进的方法效果相当。 Removing stopwords(删除停用词)。这些常用的词,不会真正地添加任何分类,例如,一个,有能力,还有其他,永远等等。所以为了我们的目的,选举结束将是选举,一个非常接近的比赛将是非常接近的比赛。 Lemmatizing words(单词变体还原)。这是将不同的词汇组合在一起的。所以选举,大选,被选举等将被分组在一起,算作同一个词的更多出现。 Using n-grams (使用实例)。我们可以计算一些常用的实例,如“没有内幕的比赛”和“势均力敌的选举”。而不只是一个字,一个字的进行计算。 使用TF-IDF。而不是只是计数频率,我们可以做更高级的事情 本文由北邮@爱可可-爱生活推荐,阿里云云栖社区翻译。文章原标题《A practical explanation of a Naive Bayes classifier》 作者:Bruno Stecanella,机器学习爱好者,译者:袁虎,审阅:文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud PyTorch由于使用了强大的GPU加速的Tensor计算(类似numpy)和基于tape的autograd系统的深度神经网络。这使得今年一月份被开源的PyTorch成为了深度学习领域新流行框架,许多新的论文在发表过程中都加入了大多数人不理解的PyTorch代码。这篇文章我们就来讲述一下我对PyTorch代码的理解,希望能帮助你阅读PyTorch代码。整个过程是基于贾斯汀·约翰逊的伟大教程。如果你想了解更多或者有超过10分钟的时间,建议你去读下整篇代码。 PyTorch由4个主要包装组成: Torch:类似于Numpy的通用数组库,可以在将张量类型转换为(torch.cuda.TensorFloat)并在GPU上进行计算。 torch.autograd:用于构建计算图形并自动获取渐变的包 torch.nn:具有共同层和成本函数的神经网络库 torch.optim:具有通用优化算法(如SGD,Adam等)的优化包 1.导入工具 你可以这样导入PyTorch: import torch # arrays on GPU import torch.autograd as autograd #build a computational graph import torch.nn as nn # neural net library import torch.nn.functional as F # most non-linearities are here import torch.optim as optim # optimization package 2.torch数组取代了numpy ndarray - >在GPU支持下提供线性代数 第一个特色,PyTorch提供了一个像Numpy数组一样的多维数组,当数据类型被转换为(torch.cuda.TensorFloat)时,可以在GPU上进行处理。这个数组和它的关联函数是一般的科学计算工具。 从下面的代码中,我们可以发现,PyTorch提供的这个包的功能可以将我们常用的二维数组变成GPU可以处理的三维数组。这极大的提高了GPU的利用效率,提升了计算速度。 大家可以自己比较 Torch和numpy ,从而发现他们的优缺点。 # 2 matrices of size 2x3 into a 3d tensor 2x2x3 d=[[[1., 2.,3.],[4.,5.,6.]],[[7.,8.,9.],[11.,12.,13.]]] d=torch.Tensor(d) # array from python list print "shape of the tensor:",d.size() # the first index is the depth z=d[0]+d[1] print "adding up the two matrices of the 3d tensor:",z shape of the tensor: torch.Size([2, 2, 3]) adding up the two matrices of the 3d tensor: 8 10 12 15 17 19 [torch.FloatTensor of size 2x3] # a heavily used operation is reshaping of tensors using .view() print d.view(2,-1) #-1 makes torch infer the second dim 1 2 3 4 5 6 7 8 9 11 12 13 [torch.FloatTensor of size 2x6] 3.torch.autograd可以生成一个计算图 - >自动计算梯度 第二个特色是autograd包,其提供了定义计算图的能力,以便我们可以自动计算渐变梯度。在计算图中,一个节点是一个数组,边(edge)是on数组的一个操作。要做一个计算图,我们需要在(torch.aurograd.Variable())函数中通过包装数组来创建一个节点。那么我们在这个节点上所做的所有操作都将被定义为边,它们将是计算图中新的节点。图中的每个节点都有一个(node.data)属性,它是一个多维数组和一个(node.grad)属性,这是相对于一些标量值的渐变(node.grad也是一个.Variable()) 。在定义计算图之后,我们可以使用单个命令(loss.backward())来计算图中所有节点的损耗梯度。 使用torch.autograd.Variable()将张量转换为计算图中的节点。 使用x.data访问其值。 使用x.grad访问其渐变。 在.Variable()上执行操作,绘制图形的边缘。 # d is a tensor not a node, to create a node based on it: x= autograd.Variable(d, requires_grad=True) print "the node's data is the tensor:", x.data.size() print "the node's gradient is empty at creation:", x.grad # the grad is empty right now the node's data is the tensor: torch.Size([2, 2, 3]) the node's gradient is empty at creation: None # do operation on the node to make a computational graph y= x+1 z=x+y s=z.sum() print s.creator <torch.autograd._functions.reduce.Sum object at 0x7f1e59988790> # calculate gradients s.backward() print "the variable now has gradients:",x.grad the variable now has gradients: Variable containing: (0 ,.,.) = 2 2 2 2 2 2 (1 ,.,.) = 2 2 2 2 2 2 [torch.FloatTensor of size 2x2x3] 4.torch.nn包含各种NN层(张量行的线性映射)+(非线性)--> 其作用是有助于构建神经网络计算图,而无需手动操纵张量和参数,减少不必要的麻烦。 第三个特色是高级神经网络库(torch.nn),其抽象出了神经网络层中的所有参数处理,以便于在通过几个命令(例如torch.nn.conv)就很容易地定义NN。这个包也带有流行的损失函数的功能(例如torch.nn.MSEloss)。我们首先定义一个模型容器,例如使用(torch.nn.Sequential)的层序列的模型,然后在序列中列出我们期望的层。这个高级神经网络库也可以处理其他的事情,我们可以使用(model.parameters())访问参数(Variable()) # linear transformation of a 2x5 matrix into a 2x3 matrix linear_map=nn.Linear(5,3) print "using randomly initialized params:", linear_map.parameters using randomly initialized params: <bound method Linear.parameters of Linear (5 -> 3)> # data has 2 examples with 5 features and 3 target data=torch.randn(2,5) # training y=autograd.Variable(torch.randn(2,3)) # target # make a node x=autograd.Variable(data, requires_grad=True) # apply transformation to a node creates a computational graph a=linear_map(x) z=F.relu(a) o=F.softmax(z) print "output of softmax as a probability distribution:", o.data.view(1,-1) # loss function loss_func=nn.MSELoss() #instantiate loss function L=loss_func(z,y) # calculateMSE loss between output and target print "Loss:", L output of softmax as a probability distribution: 0.2092 0.1979 0.5929 0.4343 0.3038 0.2619 [torch.FloatTensor of size 1x6] Loss: Variable containing: 2.9838 [torch.FloatTensor of size 1] 我们还可以通过子类(torch.nn.Module)定义自定义层,并实现接受(Variable())作为输入的(forward())函数,并产生(Variable())作为输出。我们也可以通过定义一个时间变化的层来做一个动态网络。 定义自定义层时,需要实现2个功能: _ init_函数必须始终被继承,然后层的所有参数必须在这里定义为类变量(self.x) 正向函数是我们通过层传递输入的函数,使用参数对输入进行操作并返回输出。输入需要是一个autograd.Variable(),以便pytorch可以构建图层的计算图。 class Log_reg_classifier(nn.Module): def __init__(self, in_size,out_size): super(Log_reg_classifier,self).__init__() #always call parent's init self.linear=nn.Linear(in_size, out_size) #layer parameters def forward(self,vect): return F.log_softmax(self.linear(vect)) # 5.torch.optim也可以做优化—> 我们使用torch.nn构建一个nn计算图,使用torch.autograd来计算梯度,然后将它们提供给torch.optim来更新网络参数。 第四个特色是与NN库一起工作的优化软件包(torch.optim)。该库包含复杂的优化器,如Adam,RMSprop等。我们定义一个优化器并传递网络参数和学习率(opt = torch.optim.Adam(model.parameters(),lr = learning_rate)),然后我们调用(opt.step())对我们的参数进行近一步更新。 optimizer=optim.SGD(linear_map.parameters(),lr=1e-2) # instantiate optimizer with model params + learning rate # epoch loop: we run following until convergence optimizer.zero_grad() # make gradients zero L.backward(retain_variables=True) optimizer.step() print L Variable containing: 2.9838 [torch.FloatTensor of size 1] 建立神经网络很容易,但是如何协同工作并不容易。这是一个示例显示如何协同工作: # define model model = Log_reg_classifier(10,2) # define loss function loss_func=nn.MSELoss() # define optimizer optimizer=optim.SGD(model.parameters(),lr=1e-1) # send data through model in minibatches for 10 epochs for epoch in range(10): for minibatch, target in data: model.zero_grad() # pytorch accumulates gradients, making them zero for each minibatch #forward pass out=model(autograd.Variable(minibatch)) #backward pass L=loss_func(out,target) #calculate loss L.backward() # calculate gradients optimizer.step() # make an update step 希望上述的介绍能够帮你更好的阅读PyTorch代码。 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《Understand PyTorch code in 10 minutes》, 作者: Hamidreza Saghir,机器学习研究员 - 多伦多大学博士生 译者:袁虎 审阅:阿福 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 介绍: 你可以通过阅读或者观看视频/MOOC来学习数据科学,接着你就必须将学到的知识应用到解决问题当中来。你需要完成这两件事才能有效地完成你的学习计划。接下来这篇文章旨在向你介绍深度学习如何应用到一个有趣的问题。 今天我们将用深度学习来解决年龄检测问题。 如果你是刚刚想要进入深度学习领域的new boy。请先阅读下面的文章,它们能帮你了解并且快速进入深度学习领域: https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/ https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/ https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/ 如果你已经花了几天或者几个月的时间来学习深度学习,并且正在寻找新的方式来提高你的深度学习技能,练习解决实际问题的例子无疑是最佳选择。我这样说是因为他们为你提供从头开始解决问题的经验,而且他们也不是很难。 以下是你应该选择几个实践问题练习的原因: 花时间建立基础:我一直建议,我们应该始终建立一个正确的基础(思考问题陈述和探索数据集),并练习很多。但我仍然看到人们一开始就编码,而不考虑问题和理解数据。在这种方法中,你实际上不是在探索问题和数据,因为你正在专注于算法。 同行学习(论坛/博客):在实践中,参与者在论坛或博客上分享他们的方法,并随时准备讨论新的方法。这实际上就是一种开源的学习方式。 练习:这些实践问题就像你的练习课,在出山和解决现实生活中的问题之前。你应该首先多多练习,然后评估你的表现。相信熟能生巧,这句话。 测试你的知识:这是一个伟大的方式,尝试练习你学到的东西,这将是非常有益。结果并不重要,因为这是一个练习问题。 让我们进入正题:如何用深度学习来预测年龄: 我假设你已经安装了numpy,scipy,pandas,scikit-learn和keras 。如果没有,请安装它们。以上文章可以帮助你。 第一件事 让我们下载数据并将其加载到我们的jupyter笔记本中!这里是实践问题的链接https://datahack.analyticsvidhya.com/contest/practice-problem-age-detection/。 在建立模型之前,我希望你解决这个简单的练习: 你可以写一个脚本,随机地将图像加载到jupyter笔记本中并打印出来吗?(PS:不要看下面的答案!)。在这个讨论主题中发布你的代码。这是我实践的方法; 和往常一样,我先导入所有必要的模块, % pylab inline import os import random import pandas as pd from scipy.misc import imread 然后我加载了csv文件,这样可以更容易找到文件 root_dir = os.path.abspath('.') data_dir = '/mnt/hdd/datasets/misc' train = pd.read_csv(os.path.join(data_dir, 'train.csv')) test = pd.read_csv(os.path.join(data_dir, 'test.csv')) 然后我写了一个脚本来随机选择一个图像并打印出来 i = random.choice(train.index) img_name = train.ID[i] img = imread(os.path.join(data_dir, 'Train', img_name)) imshow(img) print(‘Age: ‘, train.Class[i]) 这是我得到的:Age:YOUNG 上述实践的练习的动机是让你能随机的访问到数据集,并且帮助发现你在建立模型时可能遇到的问题。 这里有几个我从上述实践中分析到的可能在建立模型时要面对的问题的假设。 1.形状变化:一个图像是(66,46),而另一个图像是(102,87)。 2.多个方向:我们的图像可能是多个方向的,这里有些例子: 侧面图 正视图 3.图像质量:一些图像的质量可以太差了点,例如下面这张: 4.亮度和对比度差异:检查下面的图像, 他们似乎是故意来捣乱的,但是,这种现象在实际生活中确实存在。 现在,让我们先关注一个问题,即如何处理形状的变化? 我们可以通过简单地调整图像大小来做到这一点。让我们加载所有的图像,并将它们调整为单个numpy数组 from scipy.misc import imresize temp = [] for img_name in train.ID: img_path = os.path.join(data_dir, 'Train', img_name) img = imread(img_path) img = imresize(img, (32, 32)) img = img.astype('float32') # this will help us in later stage temp.append(img) train_x = np.stack(temp) 对于测试图像也是如此 temp = [] for img_name in test.ID: img_path = os.path.join(data_dir,'Test',img_name) img = imread(img_path) img = imresize(img,(32,32)) temp.append(img.astype( 'FLOAT32')) test_x = np.stack(temp) 我们可以做另外一件事情,帮助我们建立一个更好的模型:即我们可以标准化我们的图像,标准化图像将使我们的训练更快。 train_x = train_x / 255. test_x = test_x / 255. 现在我们来看看我们的目标变量。我有一个问题:我们数据中类的分布是什么?你能说这是一个非常不平衡的问题吗? 这是我的尝试: train.Class.value_counts(normalize=True) MIDDLE 0.542751 YOUNG 0.336883 OLD 0.120366 Name: Class, dtype: float64 在分拣数据的基础上,我们可以创建一个简单的提交。我们看到大多数演员都是中年人。所以我们可以说我们测试数据集中的所有演员都是中年了! 在提交页面上上传这个文件,看看结果! test['Class'] = 'MIDDLE' test.to_csv(‘sub01.csv’, index=False) 让我们解决问题!第2部分:建立更好的模型 在建立模型之前,让我们为目标变量引进形状。我们将目标转换为虚拟列,以便我们的模型更容易吸收。 import keras from sklearn.preprocessing import LabelEncoder lb = LabelEncoder() train_y = lb.fit_transform(train.Class) train_y = keras.utils.np_utils.to_categorical(train_y) 现在是开始建立模型!由于问题与图像处理相关,使用神经网络来解决问题更为明智。我们也将为这个问题建立一个简单的前馈神经网络。 首先我们应该指定我们将在神经网络中使用的所有参数: input_num_units = (32,32,3) hidden_num_units = 500 output_num_units = 3 epochs = 5 batch_size = 128 然后我们将导入必要的keras模块 from keras.models import Sequential from keras.layers import Dense, Flatten, InputLayer 之后,我们将定义我们的网络 model = Sequential([ InputLayer(input_shape=input_num_units), Flatten(), Dense(units=hidden_num_units, activation='relu'), Dense(units=output_num_units, activation='softmax'), ]) 看看我们的模型的效果如何:让它打印 model.summary() 现在让我们编译我们的网络并且让它训练一段时间: model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_x, train_y, batch_size=batch_size,epochs=epochs,verbose=1) 好像已经训练好了!但是我们还没有验证它。如果我们想要确保我们的模型在对其进行培训的数据和新的测试数据上都能表现良好,验证是非常必要的。 让我们调整一下代码来验证它。 model.fit(train_x,train_y,batch_size = batch_size,epochs = epochs,verbose = 1,validation_split = 0.2) 该模型看起来比第一个模型表现要好。让我们提交结果。 pred = model.predict_classes(test_x) pred = lb.inverse_transform(pred) test ['Class'] = pred test.to_csv('sub02.csv',index = False) 实际检查我们的预测(实际检验) 这是另一个简单的练习,打印你在模型中训练的图像。最好在你的训练数据集上进行此操作,以便你可以与真实的图像进行对比 i = random.choice(train.index) img_name = train.ID[i] img = imread(os.path.join(data_dir, 'Train', img_name)).astype('float32') imshow(imresize(img, (128, 128))) pred = model.predict_classes(train_x) print('Original:', train.Class[i], 'Predicted:', lb.inverse_transform(pred[i])) Original: MIDDLE Predicted: MIDDLE 下一步是什么? 我们已经建立了一个具有简单模型的基准解决方案。我们还能做些什么? 这里是我的一些建议: 一个好的神经网络模型可以帮你取得更大的进步。你可以尝试使用更适合图像相关问题的卷积神经网络。这是一个简单的CNN供你参考 我们没有让模型训练太多。你可以让模型获得更多的训练,在你可以调整的神经网络中有多个超参数。这是一个帮助你调整他们的指南:(https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/) 当我们解决问题时可能会面对的问题,这是可以避免的。如果我们对数据进行适当的预处理,大多数的问题将会消失。 有一件事你可以尝试,将彩色图像转换为灰度。这是因为当你解决问题时,颜色并不重要。 希望这个简单的年龄检测实践问题能够帮助到你! 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《Hands on with Deep Learning -Solution for Age Detection Practice Problem》, 作者:Faizan Shaikh,数据科学爱好者,深度学习的新秀 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文 项目地址
更多深度文章,请关注:https://yq.aliyun.com/cloud TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。 时间序列分析在计量经济学和财务分析中具有重要意义,但也可以应用于了解趋势做决策和对行为模式的变化做出反应的领域。其中例如,作为主要石油和天然气供应商的MapR融合数据平台客户将传感器放在井上,将数据发送到MapR Streams,然后将其用于趋势监测井的状况,如体积和温度。在金融方面,时间序列分析用于股票价格,资产和商品的价格的预测。计量经济学家长期利用“差分自回归移动平均模型”(ARIMA)模型进行单变量预测。 ARIMA模型已经使用了几十年,并且很好理解。然而,随着机器学习的兴起,以及最近的深度学习,其他模式正在被探索和利用。 深度学习(DL)是基于一组算法的机器学习的分支,它通过使用由多个非线性变换组成的人造神经网络(ANN)架构来尝试对数据进行高级抽象然后建模。更为流行的DL神经网络之一是循环神经网络(RNN)。RNN是依赖于其输入的顺序性质的一类神经网络。这样的输入可以是文本,语音,时间序列,以及序列中的元素的出现取决于在它之前出现的元素。例如,一句话中的下一个字,如果有人写“杂货”最有可能是“商店”而不是“学校”。在这种情况下,给定这个序列,RNN可能预测是商店而不是学校。 人工神经网络 实际上,事实证明,虽然神经网络有时是令人畏惧的结构,但使它们工作的机制出奇地简单:随机梯度下降。对于我们网络中的每个参数(如权重或偏差),我们所要做的就是计算相对于损耗的参数的导数,并在相反方向微调一点。 ANNs使用称为反向传播(有想了解BP算法的可以参考BP算法双向传,链式求导最缠绵)的方法来调整和优化结果。反向传播是一个两步过程,其中输入通过正向传播馈送到神经网络中,并且在通过激活函数变换之前与(最初随机的)权重和偏差相乘。你的神经网络的深度将取决于你的输入应该经过多少变换。一旦正向传播完成,反向传播步骤通过计算产生误差的权重的偏导数来调整误差。一旦调整权重,模型将重复正向和反向传播步骤的过程,以最小化误差率直到收敛。下图中你看到这是一个只有一个隐藏层的ANN,所以反向传播不需要执行多个梯度下降计算。 循环神经网络 循环神经网络(RNN)被称为循环是因为它们对输入序列中的所有元素执行相同的计算。由于RNN的广泛应用,RNN正在变得非常受欢迎。它们可以分析时间序列数据,如股票价格,并提供预测。在自动驾驶系统中,他们可以预测汽车轨迹并帮助避免事故。他们可以将句子,文档或音频样本作为输入,它们也可以应用于自然语言处理(NLP)系统,如自动翻译,语音对文本或情感分析。 上图是RNN架构的示例,并且我们看到xt是时间步长t的输入。例如,x1可能是时间段1中的股票的第一个价格。st是在时间步长tn处的隐藏状态,并且使用激活函数基于先前的隐藏状态和当前步骤的输入来计算。St-1通常被初始化为零。ot是步骤t的输出。例如,如果我们想预测序列中的下一个值,那么它将是我们时间序列中概率的向量。 RNN隐藏层的成长是依赖于先前输入的隐藏状态或记忆,捕获到目前为止所看到的内容。任何时间点的隐藏状态的值都是前一时间步骤中的隐藏状态值和当前时间的输入值进行函数计算的结果。RNN具有与ANN不同的结构,并且通过时间(BPTT)使用反向传播来计算每次迭代之后的梯度下降。 一个小例子: 此示例使用3个节点的小型MapR群集完成。此示例将使用以下内容: Python 3.5 TensorFlow 1.0.1 Red Hat 6.9 如果你使用Anaconda,你需要保证你能够安装TensorFlow 1.0.1版本在你本地的机器上。此代码将不能在TensorFlow <1.0版本上使用。如果TensorFlow版本相同,则可以在本地机器上运行并传输到集群。其他需要考虑的深度学习库是MXNet,Caffe2,Torch和Theano。Keras是另一个为TensorFlow或Theano提供python包的深度学习库。 MapR提供了用户喜好的集成Jupyter Notebook(或Zeppelin)的功能。我们将在这里显示的是数据管道的尾端。在分布式环境中运行RNN时间序列模型的真正价值是你可以构建的数据流水线,将聚合的系列数据推送到可以馈送到TensorFlow计算图中的格式。 如果我正在聚合来自多个设备(IDS,syslogs等)的网络流,并且我想预测未来的网络流量模式行为,我可以使用MapR Streams建立一个实时数据管道,将这些数据聚合成一个队列,进入我的TensorFlow模型。对于这个例子,我在集群上只使用一个节点,但是我可以在其他两个节点上安装TensorFlow,并且可以有三个TF模型运行不同的超参数。 对于这个例子,我生成了一些虚拟数据。 我们在我们的数据中有209个观察结果。我want确保我对每个批次输入都有相同的观察次数。 我们看到的是我们的训练数据集由10个批次组成,包含20个观测值。每个观察值是单个值的序列。 现在我们有了我们的数据,我们来创建一个将执行计算的TensorFlow图。 这里有很多事情需要处理。例如我们正在指定我们用来预测的周期数。我们指定我们的变量占位符。我们初始化一种使用的RNN单元格(大小100)和我们想要的激活函数的类型。ReLU代表“整流线性单元”,是默认的激活功能,但如果需要,可以更改为Sigmoid,Hyberbolic Tangent(Tanh)等。 我们希望我们的输出与我们的输入格式相同,我们可以使用损失函数来比较我们的结果。在这种情况下,我们使用均方误差(MSE),因为这是一个回归问题,我们的目标是最小化实际和预测之间的差异。如果我们处理分类结果,我们可能会使用交叉熵。现在我们定义了这个损失函数,可以定义TensorFlow中的训练操作,这将优化我们的输入和输出网络。要执行优化,我们将使用Adam优化器。Adam优化器是一个很好的通用优化器,可以通过反向传播实现渐变下降。 现在是时候在我们的训练数据上实施这个模型了。 我们将指定我们的批次训练序列循环的迭代/纪元的数量。接着,我们创建我们的图形对象(tf.Session()),并初始化我们的数据,以便在我们遍历历元时被馈送到模型中。缩写输出显示每100个纪元后的MSE。随着我们的模型提供数据向前和反向传播运行,它调整应用于输入的权重并运行另一个训练时期,我们的MSE得到了持续改善(减少)。最后,一旦模型完成,它将接受参数并将其应用于测试数据中,以Y的预测输出。 我们来看看我们的预测跟实际相差多少。对于我们的测试数据,我们集中在整个209个周期的最后20个时期。 看来这还有一些改进的空间。这可以通过改变隐藏的神经元的数量或增加迭代的数量来完成。优化我们的模式是一个试错的过程,但我们有一个好的开始。这是随机数据,所以我们期待着很好的结果,但是也许将这个模型应用到实时系列中会给ARIMA模型带来一些竞争压力。 数据科学家因为RNN(和深度学习)的出现,有了更多可用的选项以此来解决更多有趣的问题。许多数据科学家面临的一个问题是,一旦我们进行了优化,我们如何自动化我们的分析运行?拥有像MapR这样的平台允许这种能力,因为你可以在大型数据环境中构建,训练,测试和优化你的模型。在这个例子中,我们只使用了10个训练批次。如果我的数据允许我利用数百批次,而不仅仅是20个时期,我想我一定能改进这种模式。一旦我做到了,我可以把它打包成一个自动化脚本,在一个单独的节点,一个GPU节点,一个Docker容器中运行。这就是在融合数据平台上进行数据科学和深度学习的力量。 希望上述的文章能够帮到你理解TensorFlow。 更多阅读: 阅读博客“TensorFlow on MapR教程:一个完美的地方开始” 阅读博客“深度学习:我的选项是什么?“ 阅读博客“通过SparkR和H2O的MapR融合数据平台上的可扩展机器学习” 希望上述的介绍能够帮助到你! 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《Applying Deep Learning to Time Series Forecasting with TensorFlow》, 作者:Justin Brandenburg 译者:袁虎 审阅:董昭男 文章为简译,更为详细的内容,请查看原文
更多深度文章,请关注:https://yq.aliyun.com/cloud 机器学习算法无法直接用于数据分类。数据分类必须转换为数字才能进一步进行。 在本教程中,你将发现如何将输入或输出的序列数据转换为一种热编码,以便于你在Python中深度学习的序列分类问题中使用。 看完本教程后,你将会了解: · 1.什么是整数编码和One-Hot编码,以及为什么它们在机器学习中是必需的。 · 2.如何在Python中手工计算一个整数编码和One-Hot编码。 · 3.如何使用scikit-learn和Keras库来自动对Python中的序列数据进行编码。 本教程分为4部分: 1.什么是One-Hot编码? 2.手动编写One-Hot编码 3.One-Hot Encode with scikit-learn. 4.One-Hot Encode with Keras. 1.什么是One-Hot编码? One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。 One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。 2.One-Hot编码的工作示例 让我们用一个小例子来说明一下到底什么是One-Hot编码。假设我们有一个带有'red'和'green'值的标签序列。我们可以将'red'的整数值分配为0,'green'的整数值为1。只要我们总是将这些数字分配给这些标签,这称为整数编码。一致性是重要的,所以我们可以稍后反转编码,并从整数值获取标签。 接下来,我们可以创建一个二进制向量来表示每个整数值。对于2个可能的整数值,向量的长度为2。 编码为0的“红色”标签将用二进制向量[1,0]表示,其中第0个索引被标记为值1。然后,编码为1的“绿色”标签将用一个二进制向量[0,1],其中第一个索引被标记为1。 如果我们有序列: ‘red’,‘red’,‘green’。 我们可以用整数编码来表示它: 0,0,1 而One-Hot编码就为: 1 2 3 [1, 0] [1, 0] [0, 1] 1.为什么要使用One-Hot编码? One hot 编码进行数据的分类更准确,许多机器学习算法无法直接用于数据分类。数据的类别必须转换成数字,对于分类的输入和输出变量都是一样的。 我们可以直接使用整数编码,需要时重新调整。这可能适用于在类别之间存在自然关系的问题,例如温度“冷”(0)和”热“(1)的标签。 当没有关系时,可能会出现问题,一个例子可能是标签的“狗”和“猫”。 在这些情况下,我们想让网络更具表现力,为每个可能的标签值提供概率式数字。这有助于进行问题网络建模。当输出变量使用one-hot编码时,它可以提供比单个标签更准确的一组预测。 2.手动One Hot编码: 在这个例子中,我们将假设我们有一个字符串的例子,但是示例序列并不涵盖所有可能的例子。 我们将使用以下字符的输入序列: Hello world。 我们将假设所有可能输入是小写字母和空格的完整字母表。因此,我们将以此展示如何滚动我们自己的one hot编码。 完整的示例如下所示。 from numpy import argmax # define input string data = 'hello world' print(data) # define universe of possible input values alphabet = 'abcdefghijklmnopqrstuvwxyz ' # define a mapping of chars to integers char_to_int = dict((c, i) for i, c in enumerate(alphabet)) int_to_char = dict((i, c) for i, c in enumerate(alphabet)) # integer encode input data integer_encoded = [char_to_int[char] for char in data] print(integer_encoded) # one hot encode onehot_encoded = list() for value in integer_encoded: letter = [0 for _ in range(len(alphabet))] letter[value] = 1 onehot_encoded.append(letter) print(onehot_encoded) # invert encoding inverted = int_to_char[argmax(onehot_encoded[0])] print(inverted) 运行示例首先打印输入字符串。 所有可能的输入的映射都是从char值创建为整数值。然后使用该映射对输入字符串进行编码。我们可以看到输入'h'中的第一个字母被编码为7。然后将整数编码转换为one hot编码。一次完成一个整数编码的字符。创建0个值的列表,以便字母表的长度可以表示任何预期的字符的长度。 接下来,特定字符的索引标记为1。我们可以看到,编码为7的第一个字母“h”整数由二进制向量表示,长度为27,第七个索引标记为1。 最后,我们反转第一个字母的编码并打印结果。我们通过使用NumPy argmax()函数定位具有最大值的二进制向量中的索引,然后使用字符值的反向查找表中的整数进行整数。 注意:输出格式化为可读性(我们将空格默认设置为z)。 hello world [7, 4, 11, 11, 14, 26, 22, 14, 17, 11, 3] [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] h 现在我们已经看到了如何从头开始自己的one hot编码,我们来看看如何使用scikit学习库来对输入序列自动完全捕获输入值的预期范围的情况。 3.One-Hot Encode with scikit-learn: 在这个例子中,我们假设你有一个输出序列如下3个标签: Cold,warm,hot 10个时间序列的示例顺序可以是: Cold,cold,warm,cold,hot,hot,warm,cold,warm,hot 这将首先需要一个整数编码,如1,2,3,然后是整数到one hot编码具有3个值的二进制向量,例如[1,0,0]。 这个情况下提供序列中每个可能值的至少一个示例。因此,我们可以使用自动方法来定义整数到二进制向量的映射。 在这个例子中,我们将使用scikit学习库的编码器。具体来说,LabelEncoder创建标签的整数编码,OneHotEncoder用于创建整数编码值的one hot编码。 from numpy import array from numpy import argmax from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import OneHotEncoder # define example data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot'] values = array(data) print(values) # integer encode label_encoder = LabelEncoder() integer_encoded = label_encoder.fit_transform(values) print(integer_encoded) # binary encode onehot_encoder = OneHotEncoder(sparse=False) integer_encoded = integer_encoded.reshape(len(integer_encoded), 1) onehot_encoded = onehot_encoder.fit_transform(integer_encoded) print(onehot_encoded) # invert first example inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])]) print(inverted) 运行示例首先打印标签序列。之后是标签的整数编码,最后是one hot编码。训练数据包含所有可能示例的集合,因此我们可以依靠整数和one hot编码变换来创建标签到编码的完整映射。 默认情况下,OneHotEncoder类将返回更高效的稀疏编码,这可能不适用于某些应用程序。例如使用Keras深度学习库。在这种情况下,我们通过设置sparse = False这个参数来禁用稀疏返回类型。 首先,我们可以使用argmax()NumPy函数来找到具有最大值的列的索引。然后可以将其输入到LabelEncoder,以计算反向变换回文本标签。运行结果为: ['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot'] [0 0 2 0 1 1 2 0 2 1] [[ 1. 0. 0.] [ 1. 0. 0.] [ 0. 0. 1.] [ 1. 0. 0.] [ 0. 1. 0.] [ 0. 1. 0.] [ 0. 0. 1.] [ 1. 0. 0.] [ 0. 0. 1.] [ 0. 1. 0.]] ['cold'] 在下一个例子中,我们来看一下如何直接对一个整数值进行one hot编码。 4.One Hot Encode with Keras: 您可能有一个已经是整数编码的序列。 经过处理后,您可以直接使用整数。或者,您可以直接对整数进行one hot 编码。这是非常重要的如果整数没有真正的顺序关系并且只是标签的占位符。 Keras提供了一个名为to_categorical()的函数,它可以帮助你使用one hot编码整数数据。接下来我们看一个小例子: 在这个例子中,我们有4个整数值[0,1,2,3],我们有以下10个数字的输入序列: Data = [1,3,2,0,3,2,2,1,0,1] 该序列具有已知了所有值,因此我们可以直接使用to_categorical()函数。以下列出了此功能的完整示例。 from numpy import array from numpy import argmax from keras.utils import to_categorical # define example data = [1, 3, 2, 0, 3, 2, 2, 1, 0, 1] data = array(data) print(data) # one hot encode encoded = to_categorical(data) print(encoded) # invert encoding inverted = argmax(encoded[0]) print(inverted) 运行示例并打印输入序列。 然后将整数编码为二进制向量并打印。我们可以看到,正如我们预期的那样,第一个整数值1被编码为[0,1,0,0]。 然后,我们使用NumPy argmax()函数反转编码,该函数返回第一个整数的期望值1的序列中的第一个值。 [1 3 2 0 3 2 2 1 0 1] [[ 0. 1. 0. 0.] [ 0. 0. 0. 1.] [ 0. 0. 1. 0.] [ 1. 0. 0. 0.] [ 0. 0. 0. 1.] [ 0. 0. 1. 0.] [ 0. 0. 1. 0.] [ 0. 1. 0. 0.] [ 1. 0. 0. 0.] [ 0. 1. 0. 0.] 1 进一步阅读: OneHotEncoder scikit-learn API文档 LabelEncoder scikit-learn API文档 分类Keras API文档 Python中使用XGBoost进行渐变增强的数据准备 多层次分类教程与Keras深度学习库 总结: 从该教程中你应该学到了: 1.什么是整数编码和one hot编码,为什么它们在机器学习中是必需的。 2.如何在Python中手工计算一个整数编码和one hot编码。 3.如何使用scikit-learn和Keras库来自动对Python中的序列数据进行编码。 文章代码可以直接运行!希望能够帮助各位理解one-hot编码 希望上述的介绍能够帮助到你! 本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 文章原标题《How to One Hot Encode Sequence Data in Python》, 作者:Jason Brownlee 译者:袁虎 审阅:李烽 文章为简译,更为详细的内容,请查看原文
逃离北上广,正如高晓松那句:生活不止眼前的苟且,还有诗和远方。每个人都想逃走,但是我们又能逃到哪里去呢?回家,我相信是每个人心中都会有的一种渴望,就像余光中在诗中说,乡愁是一方小小的邮票,是一张窄窄的船票,是一湾浅浅的海峡,但是却不是我们可以回去的故乡。为什么?因北上广吞噬的不仅是我们的青春,更是我们对于家园的想象,那记忆中美好的故乡可能只存在于记忆中,因为你发现你根本回不去了,逃离回家的结局往往是又买上一张返程的车票而已。 对于程序猿来说,这些文字上的感伤可能会很少。但是内心深处,大致的意思和这样是一样的。 文化的天花板始终逃离不掉! 大多数在北上广的程序猿,无论你是在这里接受过教育,还是在这里经历过打拼,只要你在这里呆的时间足够久,那么北上广的文化就已经深深地烙印在了你的灵魂深处,当我们习惯于大都市的便利生活之后,我们将难以习惯家乡的人情社会,那种盘根错节的人脉网、关系网、背景网,让习惯于一线城市简单生活的人显得手足无措,一些在一线城市你早已习以为常的东西,但是在家乡却需要付出更高的人情成本。 这仅仅是文化差异的一角,比这个一角更大的是北上广与故乡之间不仅是地理的距离,而是从吃菜、喝水到整个生活方式与价值观都无法融合的巨大差距,这种来自北上广的文化烙印,让你根本没有办法回去分毫。所以长期逃离,或者说逃回故乡,十有八九撞到的是文化的天花板。 短期逃离的生活玻璃门! 既然家乡回不去,于是我们很多的人爱上了度假,喜欢说走就走的旅行。无论是烟雨江南,还是塞外风雪,甚至是异域风情,这些美景的确会给我们带来一种美好的享受,但是一种来自于文化的幽灵,让我们觉得似乎我们的身体离开了北上广,我们的心却始终没有离开。地理空间的改变不过是一种自欺欺人式的讽刺,在我们面前的是一面透明的玻璃门,我们透过玻璃看到了风景,但是我们的心依然在里面。 从本质上来说,无论是长期的逃离,还是短期的逃离,我们都只是一个被文化烙印出来的单个个体而已。我们已经在内心接受了这种文化,无论你在哪里,都只不过是换个地方过着同样的生活,文化烙印远比现实中的制度、规则、金钱的纽带更为有力。它的文化侵略性就在于,只要你在这里生活过、发展过,那么你已经无法摆脱这种文化的印记了。 对于很多程序猿来说,北上广的工作机会有着绝对的天然优势。这或许也会成为大部分程序猿逃离不掉的原因。逃离北上广,可能也只是说说而已,毕竟生活就是如此。不管我们如何去抉择,都得遵循一定的生活规则。当有一天我们能够超越规则的能力,选择什么样的生活也就变得顺其自然了。
北上广的围城效应: 里面的人想出去,外面的人想进去,这就是事实。而对于程序猿来说,程序猿行业也有些围城效应的味道。 谈到从事程序员的工作,好像大家都会被贴上什么“没有女朋友”,“加班狗”“技术宅”等行业标签。在外界人看来,优势是工资高,不用处理复杂的人际关系,还略带一丝神秘感。这就是程序员就业的“围城效应”——城里的人想出来,城外的人挤破脑袋想进去。于是社会上出现了各种速成的培训班,几乎在二线城市,这也就形成了一个新的产业。 这些完成培训的新的入场选手,满怀期待的走向了他们认为的北上广,向着高工资进发。一开始的一两年,感觉还行。但是随着时间的推移,围城效应就开始慢慢起作用了。 到底为什么会形成这样的“围城效应”呢? 时间被挤占引发未来发展的焦虑 一项针对20—40岁的城市上班族的调查显示,九成人的内心充满了焦虑。与我们父母那一代相比,现在的80后90后不需要在为温饱挣扎,而需要面对如何在城市中安身立命的压力。 Lily在上海刚刚参加工作两年,属于“沪漂”,因为上海房屋租金高企,在徐家汇上班的她只能在奉贤租了房子,每天上下班需要3个多小时再加上加班的时间,每晚到家已经十点多甚至11点了。她说:“到家之后,只有瘫在床上的力气了,那里还有精力看书呢!”居住成本的上升导致时间的被挤占,让年轻人担心大量改变工作现状的机会被白白错失,对未来发展产生迷茫。 过度劳累引发健康焦虑 在北上广工作的上班族工作压力大是不争的事实,大家在办公室呆的时间越来越长,坐在电脑前的时间越来越多。工作时间越来越长,工作疲劳不断积累,亚健康现象可谓是大家的常态。过度的加班,无规律的饮食作息,导致上班族对自己身体健康产生担忧,又因为工作继续高压力的生活从而成为一个恶性循环引发焦虑。这对于大多数程序猿来说,算得上是通病。 被单一的成功标准绑架引发的无价值感 房子,户口永远都是外地人进入北上广的硬伤,在北上广没有房子始终是个“外地人”没有归属感和价值感。只有拥有了这些,你才会被认为真正的成功。 为了所谓的成功,盲目的工作生活,忽略自己的特点与兴趣。有向往的事情不敢做,当下的工作又没有兴趣产生倦怠,进而感觉不到价值感,长此以往心情越来越苦闷压抑。 这些种种的焦虑都会让我们感觉在北上广的生活中,充满了无法解脱的压力,好似乎进入围城,不得不在围城中一生奔波无法突破。 高压力的生活易造成情感空冷 一线城市房价、堵车、生活成本、激烈竞争等,让我们不仅承受着生活工作上的压力,心理也承受了很大的压力。极容易造成情绪上的失控,说出做出不当的言行伤害与伴侣、亲人的情感。这种情况长时间得不到有效的改变,我们的亲密关系必然疏离恶化。
前不久,在朋友圈爆发了一场逃离北上广的运动。那么北上广到底有什么需要我们逃离的呢?正如去年那句“世界那么大,我想去看看”,逃离北上广牵动了多少程序猿对生活的渴望。作为一座城市,北上广既不是枷锁也不是牢笼,但是为什么我们程序猿总有一种要逃离的冲动! 每当我们喊出高晓松“生活不止有眼前的苟且,还有诗和远方”的时候,其实心中知道“不仅有眼前的苟且,还有以后几乎下半辈子的苟且”的苦涩。活在当下的时候,还有永远都修改不完的BUG,和永远都写不完的需求。对于程序猿来说,这可能就是我们要逃离北上广的原因。 其实,还有很多原因,逃离北上广好像有说不完的原因: ä¸ãPrint(“春风再美也比不上你的笑”) 当我们闯荡在北上广的时候,总是期待着自己有一天能和自己的亲人团聚。回去,只为和亲人的团聚,手里再多的工资也比不上你们欢聚时的微笑。 äºãPrint(“宁做鸡头不做凤尾”) 回到小地方,你就是人才。去了北上广你就是普普通通的一员,逃离北上广我要做人才。 ä¸ãPrint(“一个户口难道英雄汉”) 经过多年的努力打拼,才发现,我和北上广只差一个户口本的距离。不是在于你努力了多久,有时候一张纸真的可以打败你。 åãPrint(“丈母娘看女婿,没房怎么都不欢喜”) 在北上广,房子可能是唯一的痛。想想自己没日没夜的敲代码,到最后连一套房子都搞不定。搞不定房子自然而然也搞不懂丈母娘! äºãPrint(“世界那么大,我想去看看”) 这是逃离北上广最常用的借口,其实,在我们程序猿的内心深处是:世界那么大,竟没有我的容身之处。 å ãPrint(“世界当空气都成了奢侈品”) 我工作在北京的朋友年仅两岁的女儿被诊断患上了支气管炎,这与北京的雾霾天气有着直接关系。回到老家后,孩子欢蹦乱跳,一点事也没有。但是一到北京,就间歇性咳嗽。远在老家的孩子奶奶就劝他们带着孩子回来吧,北京雾霾威力大,都有人找不着家了,别在哪天再把孩子给丢了。 ä¸ãPrint(“如果连自己的命都保不住”) 大城市看病挂号都出现黄牛了,拍个片子要等到一周,花销也高。而我们程序猿身体素质本来就不是很好,想想这里,还是赶紧逃离这可怕的北上广吧。 当我们同呼吸,共命运,遥望灰蒙蒙的天空,呼吸着富含雾霾的空气的时候,我们不知道我们的自由在哪里,脱离了自由的代码世界,我们不得不面对这个现实的世界。当自己希望通过一个APP改变这个世界的梦想的棱角一点点被磨平,也许每个人都有那一份采菊东篱下,悠然见南山的渴望吧。这或许就是我们程序猿口中“逃离”的根源。
中国的程序猿大多在那?根据统计数据分析,目前按省份排名前十名分别是:广东省,北京市,上海市,浙江省,江苏省,山东省,四川省,湖北省,福建省,河南省。具体人数分布数的占比如下: 毫无悬念,广东、上海、北京,成为了前三名。但是,城市房价的攀升注定这些程序猿成不了本地人?逃离北上广成为了大势所趋,那么这些人都逃到了那些地方呢?今天我们就来总结一下! NO.1杭州: 这些年杭州,一直是程序猿最佳的归属地,杭州有很多的互联网公司,尤其是阿里巴巴的存在,让杭州的程序猿的需求量急剧上升。再加上杭州的房价还不是特别高,被目前认为是中国程序员最好的归宿的地方,在杭州,工资还算很高,房价在可承受范围内,这两年有很多程序员都离开了帝都,魔都,去了杭州。杭州的前景也是不可估量的。所以杭州成为了首选之地。 NO.2成都: 近期发布的中国新一线城市排名,成都成为了第一名。无论是在商业资源集聚度还是城市人活跃度以及未来可塑性上来说,成都都是由很大的潜力的。而且,这几年很多互联网创业者,大多选择了在成都创业。这无疑是让成都成为了程序猿的第二选择,相对于北上广来说,成都的房价更加有优势。 NO.3武汉: 武汉和郑州都被称为中国中部地区最大的都市,但是相较于郑州来说,武汉优势更加突出一些。而且,就在5月22日,武汉为了吸引人才,武汉的户籍新政开始实施,这对于想要在大城市里安个家的程序猿们来说,无疑是最好的消息。不用考虑北上广的户口问题,地方政府帮你解决。而且武汉的房价相较于北上广来说,还是比较便宜的。而且武汉的景色和环境也很不错。 NO.4西安: 长安自古帝王都,西安拥有着5000多年的文明史,对于喜欢旅游和喜欢古老建筑的程序猿来说,西安一定是最好的选择。如果考虑到以后孩子,西安同时也具备很好的教育资源。在一定程度上,西安可以与北京媲美。但是,由于地理位置的限制,西安常常被人忘记。但是,随着政府政策的不断放开,以及西安战略位置的不断上升,西安也成为了程序猿心仪目的地。 NO.5落叶归根: 最近,在知乎上看到一个关于程序猿逃离北上广的一则回答:攒够一百万,回家考了一个公务员,虽然工资从之前的30K讲到现在的3500,但有房有车,没有贷款真是爽。其实,对于很多人来说,回到老家可能是最好的结局。但是,做这个选择着实有些困难。因为需要考虑到各个方面:家庭、孩子的教育,当然还有自我的实现,这都是需要考虑的事情。 总而言之,无论逃到哪里,适合自己就好。受不了北上广的压力,逃了出来,远离那个不属于我们的城市,在属于我们的城市里寻找到自己。加油程序猿,愿你能找到适合自己的城市。 附上程序猿价格表: Java工程师前十大高薪城市排名 C语言程序员十大高薪城市排名 python语言程序员十大高薪城市排名 php语言程序员十大高薪城市排名 前端语言程序员十大高薪城市排名
1、隐身风扇 这种T恤有4台风扇,据说可以降温10度左右。纯棉、碳纤维的材料能快速蒸发水分,带走更多热量,装上电池可以用四个小时左右。出门在外,穿上这样的T恤,既凉快又拉风。很帅很舒服。 2、冰感毛巾 冰感毛巾,吸水性能相当好,据说甩一下毛巾就可以变成“冰”的。这是不是说以后可以顶着炎热去跑步了?当然,如果这样做的话那一定很拉风。程序猿锻炼完身体时可以把它佩戴在需要降温的部位,比如挂在颈脖上。使用完后,用水清洗拧干放入原包装袋中保存就行了。 3、风扇伞 顾名思义就是带风扇的伞,伞现在已经不光用来挡雨,加上遮阳、防紫外线等,这又添一个避暑功能。这回炎热已经挡不住逛街党的步伐了。买回家送个女票和老婆,一定显得贴心。 4、迷你空调 迷你空调一定是一种刚需,好的空调能利用水分的自然散发最低将周围的温度降低十几度。有时候其实根本不需要变频概念,中央空调也给人这样那样的不方便,要是觉得空调温度太低,那么离远一点不就行了?在家里,对于单身的程序猿来说,大空调浪费,迷你空调正好。 5、冰垫 冰垫的填充物主要是冰沙,这种物质是恒温技术的产物。温度低于27度自动结冰,不用插电也不需要电池,放在哪里都行,床上、沙发、车、办公椅或是垫在电脑下面。最关键的是,便宜。 上述三伏必备黑科技,淘宝天猫均有销售! 6、降温喷雾 这是一款来自日本的Tokiwa Shoukai衣物降温喷雾,出门前往衣服上喷几下,你就可以变成行走的空调,走到哪儿都自带冷风。 特别是喷在领子上,因为成分里有酒精和薄荷成分,挥发特别快,很快就能吸走衣服上的“热气”,脖子上凉凉的,好像就站在冰箱前一样。每次喷完,凉感大概能保持1小时左右。 不过需要注意的是,这种降温喷雾是衣物专用,千万别对着皮肤直接喷 7、没有伞布的智能伞 如果仅仅是看图片,你能相信它其实是一把伞么?这把没有伞布的雨伞名字叫做Air umbrella,曾登陆Kickstarter众筹平台。它的工作原理很简单,依靠喷射出来的气流改变雨滴的轨迹,让气流形成一个看不见的雨伞。当下雨时,雨水遇到气流就会滑落到四周。 这款智能伞还有各种调节按钮,面对不同天气,有小雨小风大雨大风等多种出风强度模式,伞柄长度也可根据自身情况自由伸缩哦。 但是,可惜的是这款伞目前有3种型号,续航时间最短只有15分钟,最长也不过只有40分钟。 8、腋下降温贴 这款KIRIBAI 腋下降温贴也是来自日本的神奇个人小物,挽救衣服上各种不规则的“地图”带来的尴尬。 降温贴里面有两种冷感成分,凉感很强,贴上之后短时间内基本不出什么汗,而且吸汗能力超强,就算腋下有积汗,衣服上也不会出现“小地图”。同时,这款降温贴厚度只有0.3毫米,几乎可以忽略不计。
1、夏季少吃瓜,换吃参 预防中暑,是大家首先想到的问题。夏季瓜果众多,特别是西瓜,确能解暑,但不可多食。因其性寒,日常可配些红糖姜茶以平衡其寒性。 夏天最好的补气药是西洋参,这是参中唯一一个不上火、不伤阴的参。即便有阴虚、口干口渴的问题,西洋参也照样适用。因为它是气阴双补的,特别是汗出过多,人觉得很疲惫、心慌的时候,适合用西洋参泡茶饮,对苦夏者很有利。 2、不吃冰饮、雪糕,冷粥祛湿最好 如果怕热,可以喝常温的凉白开,朴素而养身。如果你能坚持一个三伏天不碰冰饮、雪糕,即使不专门去“冬病夏治”,体内的顽固寒气也能自己好大半。 尤其是一到冬天就特别怕冷、手脚冰凉的亲,记住了哦! 夏天不能吃冰淇淋,不能吃生冷的,但是冷粥来上一碗还是可以的。这个冷粥,不是说加了沙冰的那种,而是经过冷藏之后,恢复到室温稍带凉意的粥。 山楂冰粥能开胃养脾、消脂益气,更适合老年人食用。 具体做法: 1、山楂洗净备用,糯米洗净,冷水浸泡2小时后沥干水分。 2、锅里注入凉水,旺火煮开,倒入山楂,煮15分钟后,捞出山楂;倒入糯米,中小火煮熟,加入冰糖。晾后存入冰箱的冷藏柜,适时取出后,放致室温食用。 3、吹干头发再睡 很多人认为,夏天气温高可以不吹干、擦干头发就睡,但实际上这是很不好的习惯! 夏天时,人洗澡特别勤。有的人头发湿漉漉的,就坐在空调屋里,甚至头发不吹干就睡觉,导致“湿邪”在不知不觉中入侵身体。所以,夏天也要把头发擦干再入睡。 4、颈椎、腰身不要对着空调 从外面一身汗回来或者在运动后,对着空调使劲吹凉风,湿气会借机顺着张开的汗毛孔进入人体,损伤阳气。现在冬天很少见到真正着凉感冒的病人,夏天反而比比皆是,就是因为用空调导致汗液挥发不出来淤积体内。在空调房里穿衣服,要过肘过肩,女性不露腰,男性不露颈椎。 5、纳凉熬夜是大忌 很多程序猿都喜欢熬夜,从中医角度来说,睡眠不足就是脾虚的症状,表明体内湿气过重。三伏这几天应该要补一个午觉,30~60分钟都可以。过了1个小时的午觉,就会影响晚上的睡眠了。 6、久坐不动 夏天动一动就出汗,现代人不像以前,爱动久坐会使人供血不足,加重乏力和肌肉酸痛,影响湿气的排除。夏练三伏,就是告诉我们,夏天不可以完全不动,应该要稍微活动一下。 7、洗热水澡祛湿邪: 很多人在进入伏天后,会感到四肢乏力、全身发困、浑身酸困、汗出过多而黏腻不爽。有时候吃东西,也感觉没有胃口,吃下去难以消化,整天肚子胀胀的。 造成这一切的根本原因,就是湿邪。而对付湿邪的一个很好的办法,就是洗热水澡。 进入伏天后,大部分人就会把洗热水澡这个习惯给排除了,觉得夏天要洗冷水才够清凉。其实天气越热,湿邪越重,热水洗澡就显得更有必要,而且洗完以后身体会觉得神清气爽,并不会觉得出汗难受。
采用湖水制冷的阿里浙江千岛湖数据中心在前几年早已启用,预计全年平均PUE(数据中心能源效率)1.3,无论是水冷本身,还是数据中心的设计和建设,以及其所采用的硬件和软件技术,各方面的实践都值得关注。今天我们就来看一看数据中心如何降温。 湖水冷却技术设计细节最关键 工业设计层面: ·90%时间不需要电制冷,深层湖水通过完全密闭的管道流经数据中心,帮助服务器降温,再流经2.5公里的青溪新城中轴溪,作为城市景观呈现,自然冷却后回到千岛湖; ·采用光伏太阳能、水力发电等可再生能源,服务器余热也被回收用作办公区采暖; 硬件和软件层面: 按需制冷技术纳入动态环境管理,通过智能算法模型综合判断,监测服务器的功率和温度变化,实时调整冷量输出,把制冷所需的能耗降到最低、 自主研发数据中心微模块:独创的铝合金预制框架,实现精密的契合结构,简化了现场安装工作。 整机柜服务器:服务器上架密度和传统机柜相比提升了30%,同样的服务器空间硬盘容量增加了一倍。还支持即插即用,服务器交付更加方便。 PCle固态硬盘:打破接口瓶颈,使吞吐量、IOPS提升5——10倍,延迟下降70%以上。自主掌握驱动逻辑,进一步提升了性能表现。 除了上述技术之外,阿里巴巴集团技术保障事业部总经理周明还特别补充了一点:数据中心机房布满了传感器,用以检测温度和分布情况,不是追求最冷,而是追求最适合,以保证最节能的目标。 · 数据中心外部有两台湖水处理器,通过密封管道从湖中取水,技术讲解人员表示:“取水口完全符合环保标准,选择的是中间层,既不会太深避免泥沙等问题,也不会太浅有较多浮游生物。取水层基本无杂质,水温基本在13度左右,虽然不同天气略有变化,但基本浮动也就在1度左右。”由于水质极好,经过缓冲池进入湖水处理器,但从实际情况看,基本不需要进行水处理。 · 高压柴油发电机作为应急电力设备。即使发生突发情况,常规油管储备可以保证8-10小时供电,而后将通过直供油管由资源企业直接提供,1小时到位。“得益于双十一保障预案,阿里会人为断电+监控的方式,实现负载状态的实时柴油发电机的电力切换测试。阿里是很少几家能够做到这一点的企业之一。” · 监测大屏是必不可少的参观之一。一面墙的屏幕上,分别是10KV自动化控制综合管理系统,电力监控系统,群控系统,光伏发电系统,综合监控系统等。据悉,目前刚刚投入使用的千岛湖数据中心,IT运维人员5名,而后续还将继续加速扩容。 阿里云数据中心“真正的三伏天”——“双十一大练兵” 扩容的目标是为了每年的“双十一”。阿里巴巴集团首席风险官刘振飞表示:“2012年开始建设的千岛湖数据中心,将在今年双十一中承担重要数据运算任务(如离线数据,而随着业务负荷加大,服务器会加快上架,并最终承担大数据相关业务,比如电商、金融、云计算等)。 今年计划双十一部分流量,即淘宝核心交易链条和支付宝核心支付链条中对计算冲击压力的部分流量会打到阿里云公共云上。以后淘宝、天猫、支付宝都是跑到阿里云上的,今年双十一来做真实的验证。当时达到了每秒8万笔的交易量,支付能力突破每秒3.8亿。没有好的降温,恐怕服务器很快就会死掉。 总结: 看完这篇文章,是不是觉得用阿里云的服务,放心、舒服~~
“三伏”的说法由秦汉时盛行的五行学说延伸而来,主要指中原地区气候上一年中最闷热的一段时期,它是“头伏”、“中伏”和“末伏”的统称,出现在阳历7月中旬到8月中旬,每到这时人们都会感慨“我与烤肉之间只差一撮孜然”。 “伏”表示阴气受阳气所迫藏伏地下。夏至后第三个庚日,为头伏(初伏)入伏,第四个庚日为中伏(二伏)开始,立秋后第一个庚日为进入“末伏”(三伏)。 通常三伏为三十天,每伏十天,但有些年份中伏为二十天。如2015年,头伏为7月13日至7月22日十天、中伏为7月23日至8月11日二十天、末伏为8月12日至8月21日十天。今年的三伏天总长为四十天,被网友戏称为是加长版的三伏天。 那么三伏天高温闷热的原因究竟是什么呢? 都是太阳惹的祸! 大家知道,我们地球在不停地绕太阳自转和公转,而且地球是侧着身子转的。正是得益于这种得天独厚的配置,地球上才有了昼夜和四季。太阳是地球大气能量的主要来源。中国的二十四节气正是由地球公转的不同位置来确定的。春、秋时太阳直射在赤道;夏至时,太阳直射在北回归线,此时北半球接收的太阳辐射能最多,北半球为夏季;冬至时,太阳直射在南回归线,此时北半球接收的太阳辐射能最少,北半球为冬季;从本质上来讲,是太阳主宰了地球气候。 是谁点的火? 看到这里你可能想:切,没新意,是个地球人都知道!但注意,下面你可能就不知道了。 实际上有一种天气系统,叫副热带高压,它出现在南北两半球副热带地区。在北半球,副热带高压随着太阳直射点的北移而缓慢向北移动。被它笼罩的地区会受下沉气流的控制,天空中不能再积攒出很多云彩,格外晴朗,导致地表接受的太阳辐射能急剧上升,气温也随之上升。进入三伏,地面积累热量达到最高峰,天气就最热,这也是为什么夏至日虽然太阳高度角最高,却不是一年中最热的时期的原因——积累的热量还未达到高峰。 具体到某一年或某一地区,最高温度是出现在头伏、二伏还是末伏,或是立秋末伏后会不回出现“秋老虎”等,还要取决于当时的天气系统。通常我国大陆,主要是热在头伏和中伏,但东南沿海和岛屿地区大多是热在末伏;云南最热的时期是雨季前的5月,在入伏前二个月;到了我国南沙群岛地区,三伏反而是全年两个最凉季节之一。即使是通常热在中伏的长江中下游地区,末伏后的8月中下旬,偶尔也可出现被称为“秋老虎”的连续高温天气。 厄尔尼诺“火上浇油”? 厄尔尼诺对南美、印尼和澳大利亚的天气和气候都有影响。我们的高温天气是不是被厄尔尼诺传染的?通常在厄尔尼诺现象发生的当年,我国的夏季风比较弱,雨带自南向北移动,到我国中部或长江以南地区就呆住不动了,这就导致我国北方地区会出现干旱少雨、晴朗暴热的现象。当然在南方就会由于长时间的雨季而出现洪涝灾害,气温也会比往年略低。 全球变暖有没有份? 酷热的天气总是让人脾气烦躁,有些人开始将矛头直指人类生产生活造成的温室效应。那么,古代人是不是就不会经历这样的高温天气了呢?历史气候研究表明,我国史上最热的夏天出现在乾隆八年。《中国三千年气象记录总集》中说,当时北京、天津、河北、山西、山东等整个华北地区炎热异常;当年(1743年)在北京的法国传教士记录的实测温度是,7月20日—25日的气温值都高于40℃,7月25日竟然达到了惊人的44.4℃!那时候又没有电扇和空调,古人比咱们更加煎熬!当然,这种极端的天气事件很难说与全球变暖有直接关系。
1.用软件控制处理器温度 相信资深的DIY玩家对通过软件降温一定不会感到陌生,但此前的软件降温是通过软件发送一个空闲的信号,让处理器处于闲置的状态,然而在使用中效果并不明显。而处理器厂商为了有效控制CPU的发热,为桌面CPU添加了来自笔记本CPU方面的技术,通过监测处理器的任务负载智能调整CPU的主频,从而起到降低发热的作用。 然而为了保证处理器的高性能,这类技术一般都较为保守。例如我们连续打开数个网页、打开数个文件,处理器将马上全速工作,如果我们的操作比较连续,则处理器还是会以全速运作较长的时间。特别是游戏玩家,由于游戏过程中处理器需要不断的工作,显然这时候智能温控的效果就很不明显了。 2.极端的液冷散热 液冷散热凭借极其出色的效果受到发烧玩家的喜爱,其中水冷较为流行,而需要较高动手能力的液氮散热方法一般用于极限超频时使用。而且液冷散热可以通过管道而使其他配件受贿,如显卡、硬盘都能在高温天气下稳定运行。 3. 服务器降温——液体降温法 如何给服务器快速低耗高效低成本降温始终是一个难题。阿里云科学家在 4 月 26 日的云栖大会·南京峰会上展示了全浸没的服务器——麒麟,把整台服务器浸在液体里循环冷却,这一方案可以无需使用空调,能源使用率(PUE)逼近了理论极限值 1.0。这是「麒麟」数据中心解决方案首次公开展示,这种耗能极低的技术方案将应用于阿里云服务,也将成为阿里巴巴的 NASA 计划的重要基础,可为未来 20 年提供计算能力。 利用热交换的原理,阿里巴巴工程师将服务器完全浸没在一种特殊的冷却液里,极速运算的服务器产生大量热量可被冷却液直接吸收进入外循环冷却,全程用于散热的能耗几乎为零。在传统数据中心里,几乎有一半的电能消耗在了散热上。 液体降温是一种极为高效的降温散热方式,但运用到商用服务器集群上还是头一次。阿里云科学家克服了服务器系统、制冷系统、冷却材料等多个领域的难题,实现了零噪音、零污染、绿色节能,可支持超过 200kW 功耗的服务器集群。 4.服务器降温——矿物油降温法 英特尔发明设计的一种可快速实现降温的技术——将服务器浸泡在矿物油中。采用矿物油实现服务器散热的数据中心PUE值极为接近1.0(PUE = 数据中心总设备能耗/IT设备能PUE是一个比率,基准是2,越接近1表明能效水平越好)。 经过测试,英特尔发现这种采用矿物油冷却系统只需要花费2%-3%的冷却功耗——远比传统服务器的功耗少得多(50%-60%)。这意味着会比当前谷歌、Facebook等世界上最为高效的数据还更具能效,预计能在这些数据中心的基础上进一步降低10%-20%的功耗。 经过一年的测试后,英特尔发现其所在新墨西哥数据中心的服务器,并不会因被浸入到油体中而损害硬件。未来,英特尔将会在服务器中部署更多此类散热解决方案
更多深度文章,请关注:https://yq.aliyun.com/cloud 这是“Python代码性能优化”系列中的第一篇文章——环境设置。通过每个帖子,我将介绍一些Python代码的工具和剖析器,以及它们中的每一个如何帮助您更好地在前端(Python脚本)和/或后端(Python解释器)中找到突破点。 配置: 在进行基本测试和分析之前,首先需要一个适当的环境。这意味着必须为此任务配置机器和操作系统。 一般来说,我的机器有以下规格: 处理器:Intel(R)Xeon(R)CPU E5-2699 v3 @ 2.30GHz 内存:32GB 操作系统:Ubuntu 16.04 LTS 内核:4.4.0-75通用 我们的目标是得到具有可重复的结果,从而确保我们的数据不受其他后台进程、操作系统配置或任何其他硬件性能带来的影响。 我们从配置我们用于分析的机器开始。 硬件功能: 首先,禁用任何硬件性能功能。这意味着从BIOS / UEFI禁用Intel Turbo Boost和超线程。 正如官方所述,Turbo Boost是一种技术,如果处理器内核运行在低于功率、电流和温度规格限制的情况下,自动允许处理器内核的运行速度高于额定工作频率。另一方面,超线程是“更有效地使用处理器资源的技术,可以使多个线程在每个核心上运行”,如这里所述。 我们花了钱在工具上,而且我们真的想让它们发挥它们的作用。那么为什么在分析/基准测试时能够启用它们呢?因为我们没有得到可靠和可重复的结果,这转化为运行变化。让我们在一个小例子中看到这一点,叫做primes.py。 该代码也可在GitHub上找到。作为依赖分析,您将需要运行: pip install statistics 让我们在启用了Turbo Boost并超线程的系统中运行它: python primes.py Benchmark duration:1.0644240379333496seconds Mean duration:0.2128755569458008seconds Standard deviation:0.032928838418120374(15.468585914964498 %) 现在,在同一个系统上,但是禁用Turbo Boost和超线程: python primes.py Benchmark duration:1.2374498844146729seconds Mean duration:0.12374367713928222seconds Standard deviation:0.000684464852339824(0.553131172568 %) 观察第一种情况下的标准差--15%。相反,在第二种情况下,变化减小到约0.6%。这难道不是优化产生的巨大价值吗? CPU设置: 禁用一些CPU的功能,能够省电并能使用固定的CPU频率。实现这个功能可以通过将Linux调节器从更改intel_pstate为 acpi_cpufreq。 该intel_pstate驱动程序使用Intel Core(Sandy Bridge和更新的)处理器的内部调节器实现缩放驱动程序。该acpi_cpufreq驱动器利用ACPI处理器性能状态。我们先来看看吧! $ cpupower frequency-info analyzing CPU 0: driver: intel_pstate CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 0.97 ms. hardware limits: 1.20 GHz - 3.60 GHz available cpufreq governors: performance, powersave current policy: frequency should be within 1.20 GHz and 3.60 GHz. The governor "powersave" may decide which speed to use within this range. current CPU frequency is 1.20 GHz. boost state support: Supported: yes Active: yes 您会看到使用调节器设置为powersave,CPU频率会在1.20 GHz和3.60 GHz之间。这对您的个人电脑或其他日常使用是有好处的,但在做基准测试时会影响到结果。 调节器还有其他什么功能?如果你浏览文档,你会看到以下内容: performance - 以最高频率运行CPU。 powersave - 以最低频率运行CPU。 userspace - 以用户指定的频率运行CPU。 ondemand - 根据当前负载动态缩放频率。跳转到最高频率,然后可能随着空闲时间的增加而退回。 conservative - 根据当前负载动态缩放频率。比频率更频繁地扩大频率。 我们想要使用的是性能调节器,并将频率设置在CPU支持的最大值。比如说是这样的结果: $ cpupower frequency-info analyzing CPU 0: driver: acpi-cpufreq CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 10.0 us. hardware limits: 1.20 GHz - 2.30 GHz available frequency steps: 2.30 GHz, 2.20 GHz, 2.10 GHz, 2.00 GHz, 1.90 GHz, 1.80 GHz, 1.70 GHz, 1.60 GHz, 1.50 GHz, 1.40 GHz, 1.30 GHz, 1.20 GHz available cpufreq governors: conservative, ondemand, userspace, powersave, performance current policy: frequency should be within 2.30 GHz and 2.30 GHz. The governor "performance" may decide which speed to use within this range. current CPU frequency is 2.30 GHz. cpufreq stats: 2.30 GHz:100.00%, 2.20 GHz:0.00%, 2.10 GHz:0.00%, 2.00 GHz:0.00%, 1.90 GHz:0.00%, 1.80 GHz:0.00%, 1.70 GHz:0.00%, 1.60 GHz:0.00%, 1.50 GHz:0.00%, 1.40 GHz:0.00%, 1.30 GHz:0.00%, 1.20 GHz:0.00% (174) boost state support: Supported: no Active: no 现在你要使用 performance 调节器,固定频率为2.3 GHz。该值是可以在Xeon E5-2699 v3上使用的最大的可能,没有Turbo Boost。要设置所有内容,请以管理权限运行以下命令: cpupower frequency-set -g performance cpupower frequency-set --min 2300000 --max 2300000 如果没有cpupower,请使用以下命令安装: sudo apt-get install linux-tools-common linux-header-`uname -r` -y 调节器对CPU的使用有很大的影响。默认情况下,调速器设置为自动缩放频率以降低功耗。我们不希望在我们的系统上,我们继续从GRUB禁用它。只需编辑/boot/grub/grub.cfg (但是如果您在内核升级时操作要小心,这将会消失)或者在其中创建一个新的内核条目 /etc/grub.d/40_custom。我们的引导行必须包含以下标志:intel_pstate=disable,如下所示: linux/boot/vmlinuz-4.4.0-78-generic.efi.signed root=UUID=86097ec1-3fa4-4d00-97c7-3bf91787be83 ro intel_pstate=disable quiet splash $vt_handoff ASLR设置(地址空间布局随机器): 这个设置是有争议的,你可以在Victor Stinner的帖子中看到。当我第一次建议在执行基准测试时禁用ASLR,这是在进一步改进对CPython中存在的Profile Guided Optimizations的支持的背景下。 什么导致我说这是个事实,在上面提到的特定硬件上,禁用ASLR,运行primes.py,标准差变化到0.4%! 另一方面,在我的个人计算机(拥有Intel Core i7 4710MQ)上进行测试,使得禁用ASLR导致出现了Victor所提出的相同问题。 由于它似乎不是普遍可用的结论,而是在很大程度上取决于硬件/软件配置,所以最好的方法是让它启用并测试,禁用它并重新测试,然后比较结果。 在我的机器上,我通过添加以下内容在全球禁用/etc/sysctl.conf。 申请使用sudo sysctl -p。 kernel.randomize_va_space = 0 如果要在运行时禁用它: sudo bash -c 'echo 0 >| /proc/sys/kernel/randomize_va_space' 如果要启用它: sudo bash -c 'echo 2 >| /proc/sys/kernel/randomize_va_space' 未完待续! 希望上述的介绍能够帮助到你! 本文由北邮@爱可可-爱生活老师推荐, 文章原标题《Hunting Performance in Python Code – Part 1. Environment Setup》, 作者:pythonrinf 译者:袁虎 审阅: 文章为简译,更为详细的内容,请查看原文
一、旅行箱或双肩背包(加上一个轻便小包)。 根据你出门的远近可以分为:装衣物的大箱子,带锁的旅行箱和旅游时的轻便背包。如果是打算几个月在路上,那就准备双肩包吧。最好是有背负系统的专业包。除了装所有行李的背包或旅行箱外,准备一个小的包包,放证件、手机等小物品一旦你到达一个地方,肯定要先放下行李了出去玩,那小包就很有必要了。 二、证件和银行卡。 1.身份证、护照(国外游) :现今飞机、火车以及酒店实行身份证实名制登记,所以身份证是您无论旅行哪里的必备物品之一。2.现金、银行卡:不用太多,现在很多地方都支持无现金消费,但是也得备点,防止出现意外情况。三、手机、相机及充电器、充电宝。手机绝对是必带品,不解释。相机则是记录旅途的利器,肯定要带。可别忘了充电器。现在有了充电宝,也要买一个带上,以防路上手机没电。(就算没带也无所谓,当地可以购买,万一去的是偏僻的地方,就得带全了。)四、衣物和鞋。看所去地方的天气以及所待时间来定,夏天带的衣物就比较方面,几件t恤和裤子即可。内衣裤和袜子可以多备几套。冬天的话就需要带上厚衣服了。牛仔裤很适合旅途,耐脏。一双比较好走路的鞋很重要,经过个人多次实践,鞋子很影响旅途的幸福感。五、卫生用品。1.毛巾、洗漱用品;2.卫生纸、面巾纸、湿巾纸;3.护肤品、化妆品、梳子;4.润唇膏;5.防晒霜(海岛游必备);6.男性剃须刀/女性卫生用品;7.洗涤用品(蓝月亮洗衣液旅行装,小瓶装80g,专为旅途洗衣设计,可以带上飞机)。卫生用品是很有必要带的,虽然有些东西当地也有卖,酒店也有提供,但是随身带自己常用的比较好。六、常用药品。常用药品:感冒药、晕车药、创可贴。高原反应药品:去高原地区要带防高原反应的药品如红景天,以及自身疾病常用药。其实很多药品都可以没有必要带,当地就可以购买。七、打发时间的物品。手机肯定是必带的,在车上打发时间的电子产品有平板电脑,MP3,电子书。其余产品有扑克,纸质书。八、睡袋和帐篷(仅限想露营的朋友)。睡袋、防潮垫、帐篷是露营爱好者的必带品。长途旅行带上这三件很有必要。 家中常备这些东西,旅途说走就走。 上面是通用版本的旅游必备清单。接下来介绍一种实用的旅游必备清单! 1、城市休闲型: 如果旅游目的地是大城市(如上海、香港、新加坡等),以休闲、购物为主要内容,那么所带之物不必很多、很全。鞋可以选择休闲鞋;服装与平日逛街无异,但双肩背包就不如身前腰包更为安全、方便;一把折叠雨伞是必备之物。 2、海滨度假型: 许多南方的海滨一年四季都适合旅游度假,因而吸引了众多游客。鞋:沙滩鞋(或拖鞋)和旅游鞋;服装:夏装且颜色鲜艳,以使拍出的照片更漂亮,泳装一定要自购,不宜租用;用品:折叠伞、墨镜、防晒用品、遮阳帽等。 3、长途跋涉型: 旅游探险渐成时尚,几乎一切都靠自己。鞋:选择高帮的户外旅游鞋为佳。服装要注意保暖性,最外层的应兼备雨衣的功能,双肩背包是不错的选择,最好再有一个腰包或有着许多口袋的马甲。去高原,防晒霜和墨镜必不可少。如果就是去体验野营生活,那么帐篷、睡袋、防潮垫、火源、水壶等物必不可少,而且最好集体行动。
VR——Virtual Reality,虚拟现实。使用者戴着VR设备旁若无人地摇头晃脑,在虚拟世界里畅游。 带上VR眼睛,你可以时而漫步在八达岭长城的城墙上,时而徜徉在马尔代夫的沙滩上,时而穿梭在美国大峡谷之间,时而到南极欣赏可爱的小企鹅,时而到非洲热带雨林观看大象。 你可以任意体验豪华酒店房间,尽管你没有住进去;随便品尝美味餐厅菜品尽管没有味觉,但是视觉效果绝对满分;自由购买世界各地的产品,放心跨境电商会帮你搞定;与世界各地的朋友握手、拥抱、嬉笑打闹,尽管你们没有在现实中相见。 VR以它真实性、沉浸感、互动性的特点必将带来旅游具有革命性意义的超越。特别是对于我们喜欢宅在家里的程序猿们,未来一定是生活必备。 VR,近两年异军突起的“黑科技”。从1935年斯坦利·温鲍姆首次在小说中描述VR眼镜,到如今PC头盔、VR分体机以及VR一体机的相继问世,VR自身已从虚拟走向现实。而当硬件迭代逐步稳定,作为增加用户黏性及用户吸引力的核心力量,“VR+旅游”不再是梦想。对于想足不出户就像走遍世界各地的互联网懒人们来说,此乃神器。 V R全景平台,以线下实体为依托,利用VR技术把线下实体店还原到线上,让线上购物具有更真实的体验感和交互感,旨在构建全景城市,实现智慧生活,让人们随时随地身临其境拥有全世界,享受快捷、真实、趣味、优质生活。 让实体商家360度全景展示营销平台,广大用户虚拟现实在线逛街购物平台。足不出户,身临其境,带上VR眼镜,真正实现在平台上逛遍城市的每个角落,体验每一家店,vr虚拟现实逛街、购物、旅游。 参观吉萨大金字塔、埃及的西奈山、雅典的万神庙或者是美国大峡谷对于许多人来说是不切实际的,不过由于VR技术,这些著名的历史经典不久之后就会变得触手可及,无论你在世界的哪个角落,甚至是躺在自家的沙发上。 新加坡的一家初创公司Hiverlab致力于将历史遗迹保存在虚拟世界中,用户通过虚拟世界就可以近距离地观看这些著名的历史遗迹,并且通过他们VR中的互动链接了解到历史。 “历史遗迹终会消失,此时此刻将这些历史遗迹数字化不失为一种留存他们的方式,”Hiverlab的创始人Ender Jiang在接受913VR采访时表示。Ender Jiang的野心非常大,他希望最终能够积累足够的VR内容来创建一个可扩展的人类历史数字图书馆。今年早些时候,该公司和南洋理工大学的一位艺术历史学家Michael Walsh,在塞浦路斯的法马古斯塔创办了亚美尼亚教堂的VR原型。 想想在不久的未来,我们就可以足不出户,看尽世界名胜,甚是开心!
第一站:斐济 斐济是一个太平洋岛国,位于南太平洋,也就是赤道的南边。斐济属热带海洋性气候,每年的5月至10月,温度较低,平均气温为摄氏22度,也是全年雨水较少的时期。每年中国的夏季这里是绝佳的避暑胜地。 张小娴在《流浪的面包树》这样形容斐济:“每逢月满的晚上,螃蟹会爬到岸上,比目鱼也会游到浅水的地方,天与海遥遥呼应。……这个岛上,几乎到处都可以看到攀向蓝色天空的面包树。” 因为斐济位于南太平洋中心,介于赤道与南回归线之间,是地球上最西也是最东的角落。在这里你可以迎接世界的第一缕阳光,观赏第一轮日落,见证世界独一无二的美好。 斐济拥有三百多个小岛,每个岛都有自己独特的特色。波光碧海,白沙椰林,五彩斑斓的海底世界和淳朴的风土人情让这里成为了名副其实的海上乐园。而且中国游客免签、中国游客免签、中国游客免签! 欣赏美景的同时也别忘了享受岛上丰盛的美食,特别是大名鼎鼎的椰子蟹。这种会爬椰子树的螃蟹,能够剥开坚硬的椰子壳,吃椰子果肉。所以肉质格外鲜美,有着独特的椰子香哟。 最佳旅行时间: 每年的5月至10月,也就是每年中国的夏季,这里绝对是互联网人绝佳的避暑胜地。 第二站:毛里求斯 毛里求斯共和国(The Republic of Mauritius)绝对可以挤进海岛避暑胜地的TOP5,在这个火山岛国,你的很多旅行愿望将被一一满足:海景、丛林、野生动物、极限运动、人文、美食……总之,来了这里,你便知何为天堂原乡。 这个非洲东部的岛国位于印度洋西南方,距离非洲大陆2200公里。作为非洲的知名海岛,毛里求斯四周被珊瑚礁环绕着,色彩斑斓的热带海洋生物也是这里的成员。在陆地上,沿海是狭窄的平原,中部是高原山地,景色颇为壮观。毛里求斯是世界上空气质量最好的国家之一,在世界卫生组织公布的全球空气质量排名中列第二位。 除了风景绮丽的自然风光,毛里求斯也是动物的天堂。在这里,人们可以见到上百种鸟类,有30种非常稀有,16种在全球范围内正在面临灭绝的威胁。毛里求斯还有多种独有的爬行动物,其种类包括多种壁虎及蜥蜴,以及仅生存在毛里求斯的岛蚺,在毛里求斯的若干公园里,还生存着很多巨龟,身材娇小的游客甚至可以轻轻地坐在他们身上,被温柔的巨龟驮着前行。 在毛里求斯,旅行愿望将被一一满足:海景、丛林、野生动物、极限运动、人文、美食……用一句话来神评毛里求斯,“不愧是天堂的样板间。” 毛里求斯除了天堂般的美景外,还能体验到更多的人文风情,可以驾驶四驱越野,搭乘环岛直升机,玩风筝冲浪,去感受毛里求斯不一样的激情刺激,在这的每一分钟,都可以嗨出另一份境地。 最佳旅行时间: 毛里求斯属于亚热带海洋性气候。毛里求斯全年仅分夏、冬两季,平均气温为25℃。每年的5月份到10月份为冬季,全年气候温热。相对而言,最佳旅游季节为每年的6月到11月,气候较为凉爽而少雨。 第三站:大堡礁 大堡礁目前是世界上最大的礁石群,是自然世界的7大奇观之一。长2300公里,从南回归线一直向北延伸到托雷斯海峡。 大堡礁有上千座岛屿和不同种类珊瑚礁,这里是潜水的天堂,瑰丽的海底珊瑚礁等待你的探寻。这里也是暑期度假的圣地,岛上有不同星级的酒店,你可以找个喜欢的沙滩和海岛,在那发上一天的呆。 其实大堡礁分内堡礁和外堡礁两部分,但处于保护大堡礁生态环境的需要,外堡礁现在是不让船只驶入也不让开发,所以我们最远就只能到外堡礁外沿的海上浮台附近去潜潜水,或者就是在空中领略大堡礁的壮丽风景。 在内堡礁范围,游客比较喜欢以凯恩斯和圣灵群岛作为游览的重点,这两个地方都是大堡礁的一部分,凯恩斯连着澳洲大陆,兼顾了原始森林景观和礁石群,比较受中国游客欢迎。圣灵群岛则大部分远离陆地,因此能看到更纯净美丽的海底景观。 最佳旅行时间: 探访大堡礁的最佳旅游时间应为5-10月,此时的大堡礁虽正值秋冬季,但水温正合适,白天也没有那么炎热,十分适宜户外出海或者浮潜。 第四站:大溪地 人们常用大溪地岛的名字代指整个法属波利尼西亚,但它其实只是这个广袤群岛上的最大岛。大溪地岛有太平洋女王的美称,它同时是法阿国际机场的所在地、国际港口及法属波利尼西亚所属群岛的经济及行政中心首都帕皮提(Papeete)的所在地。不管你来自世界的哪个角落,这里都将是你踏上法属波利尼西亚的第一个岛屿。 大溪地岛属于火山岛,外形类似一个倒挂的葫芦瓜,大的一边是大溪地大岛——努伊(Tahiti Nui),小的一边是大溪地小岛——伊蒂(Tahiti Iti),两边由Taravao地峡连接。岛上各种地貌丰富,有火山、河流、瀑布以及平坦的黑沙滩,是户外体验不可多得的好去处。 这里是《月亮与六便士》里的心灵小栈,这里是海岛控的终极目的地之一,这里是最接近天堂的地方,这里就是大溪地。 大溪地,又名塔希提岛,从国内出发经东京中转,全程大约18小时就能到达,你会发现出发和到达几乎是在同一天的同一时间。这个上帝最眷顾的地方就是如此奇妙。 和其他岛屿相比,除了阳光沙滩、椰林树影,大溪地岛还有着更壮丽的山峰,浓厚的人文情怀和绚丽热闹的市场,无论哪一面都在向你展示这个互联网人避暑圣地的迷人魅力。 最佳旅行时间: 大溪地岛分为两个季节:干季(5月到10月)和湿季(11月至次年4月)。干季凉爽少雨,是旅游旺季。 第五站:仙本那 在这里有媲美马尔代夫的无敌海景,这里是世界顶级的潜水圣地,你以为又贵又远?就在马拉西亚,费用只有马尔代夫的三分之一不到。三人一顿虾蟹肥美的大餐才不到200人民币,性价比简直无敌!这里就是一半天堂一半地狱的仙本那。 一半天堂是指仙本那最原始最明亮的海岛景观,透彻见底的玻璃海,触手可及的蓝天白云。一半地狱是指当地巴瑶族的贫苦生活。他们没有国籍,不被允许登上陆地,终其一生漂泊海上,属于真正意义上的“海上吉普赛”人。 仙本那同时是绝佳的潜水胜地,周围有很多潜水基地,可以学习各种潜水课程。《Lonely Planet》评选出的十大潜水胜地,亚洲唯一入选的就是仙本那的诗巴丹岛。 诗巴丹岛是一座无人岛,每天只接待100名潜客。岛周围是完全原生态景观,海水能见度很高,能看到丰富多彩又奇特的海底世界。 最佳旅行时间: 仙本那一年四季都很适宜旅行,但夏季是最好的选择。 第六站:塞班岛 塞班(Saipan)是北马里亚纳群岛的首府,位于太平洋西岸,靠近菲律宾,是美国的海外领地。对中国公民免签的政策吸引了大批游客杳然而来。 塞班岛由于近邻赤道一年四季如夏,风景秀美,是世界著名的旅游休养胜地。身处塞班,背倚热带植被覆盖的山脉,透过道路两旁的郁郁葱葱的椰树展示在你面前的是迷人的蓝绿色菲律宾海,故有“身在塞班犹如置身天堂”之说。 军舰岛因岛上残留着太平洋战争时日军的残舰与战机而得名,对于避暑旅行中的互联网人来说这里当然是酝酿产品的绝佳去处。整个海岛被银白色的沙滩所围绕,外围布满珊瑚礁的海水经过阳光折射,变幻着奇幻的色彩。 塞班岛以富有变化的地形以及超高透明度的海水令潜水族们一展身手,被誉为世界第一潜水圣地。 除了浮潜和潜水,还可以选择钓鱼、冲浪、直升机、乘船出海、丛林探险、潜水艇、水上降落伞各类水上活动。此外,塞班岛更设有四个世界级高尔夫球场及两个小型高尔夫球场,都融合了塞班岛的热带美景,环境优越,是球手极富挑战性的场地,适合不同程度的高尔夫球手。 喜欢浪漫的互联网人可以尝试塞班岛著名的夕阳晚宴,晚霞满天的时刻搭乘游船出海,在塞班岛的夕阳下享受塞班美食;喜欢热闹的,不妨前往超级水上乐园,游一圈要花上15分钟的河流式泳池、刺激的冲浪池、人造海浪等相当过瘾的水上活动设施,还有有趣的水中有氧运动、水上排球等五花八门的玩水招式。 塞班宛如一片远离尘世的世外桃源,以其澄澈的海水、动人的热带景致、令人兴奋的沙滩烧烤及无休无止的疯狂海上运动而吸引着游客前来一睹塞班的风采。 最佳旅行时间: 塞班岛一年四季都适宜旅行,其中5-7月最佳。塞班岛终年都以炎热的气候为主,温差较小,均温在29度左右,全年只分为旱、雨两季。雨季(7-11月)多阵雨,大雨瞬时而过,对旅行的影响不大。 第七站:塞舌尔 塞舌尔群岛地处印度洋的西南部,享有“旅游者天堂”的美誉。塞舌尔是个世外桃源,没有遭受太多的人工破坏,青山绿树,海风吹斜阳,纯白沙滩,椰林密布,美丽珍贵的海鸟,淘气玩耍的热带鱼,热辣辣的太阳,都会让人念念不忘。 远离喧嚣世界,塞舌尔被誉为最奢侈的度假圣地,塞舌尔的美千变万化。蓝天白云,青山绿树,海风吹斜阳,纯白沙滩,椰林密布,美丽珍贵的海鸟,淘气玩耍的热带鱼,热辣辣的太阳。塞舌尔的克里奥尔(Creole)民族热爱音乐,能歌善舞;塞舌尔的美食既有原汁原味的清新,也有强烈的辛辣。在塞舌尔绝对能够满足你脑海里浮现过千万遍的度假。 塞舌尔,位于马达加斯加以北远离非洲东海岸的西印度洋。大多人都对塞舌尔很陌生,但是提起“海盗”会让你对塞舌尔增加一层神秘感。从1685年开始,大量海盗船以塞舌尔为据点频繁攻击非洲东海岸,1730年海盗彻底绝迹,但至今人们还是坚信在岛上藏着大量的宝藏…… 塞舌尔群岛,由92个岛屿组成,每一个小岛都有自己的特点。这里是"昆虫的世界"、"鸟雀天堂",人们心中的“伊甸园”。在塞舌尔,你可以得到的最大幸福就是什么都不必做,不看电视、不看报纸、不用电脑,因为统统不会有。这里也没有购物中心、快餐店和咖啡馆文化,只有大自然馈赠的美好景色。 最佳旅行时间: 塞舌尔靠近赤道,属热带雨林气候。每年5-10月是最适合旅游的季节,这时候天气凉爽雨量较少。 第八站:留尼汪岛 印度洋上最后一个冒险之岛,这片弹丸之地的景观丰富至极,令人叹为观止。这座风景优美的魔幻岛屿就像一面玄武岩盾牌一样,从海面上伸出并笼罩在绿色之中,俨然是微型的夏威夷。 郁郁葱葱的森林,奔腾不息的瀑布,令人难忘的山景,曲曲折折的道路,荡气回肠的全景,充满活力的海滨城市以及星罗棋布的白沙或黑沙海滩都值得你期待。令人生畏的富尔奈斯火山是世界上最容易登上的活火山之一,更为其锦山添花。难怪这里能够成为自然和户外爱好者的梦想之地。 留尼汪岛最热月平均气温26℃,最冷月20℃。每年5月~11月,凉爽干燥,11月至次年4月炎热多雨。1998年3月9日,岛上富尔奈斯火山大喷发。夏季一到,印度洋上潮湿的气候源源而来,加之岛上有一座海拔3069米的活火山,潮湿气流遇上高高的山脉,回流形成了这里特有的气候天气。 最佳旅游季节: 5月至11月前往,也就是现在,留尼汪岛每年5月~11月,凉爽干燥。