世界上最难的数学题,好难啊!!ai!

AI 技术讲座精选: 数学不好,也可以学习人工智能(二)
【AI100 导读】本系列文章将陆续向大家推荐一些数学用书,今天这篇文章有针对性的介绍了数学不好的人,究竟该怎样学习人工智能。如果你已经看过本系列的第一篇文章,那么肯定已经具备了某些数学基础。相应地,某些数学表达对你来说变得越来越熟悉,越来越重要。但是关于人工智能,还有一个小秘密要告诉你:实际上,刚起步的时候,不一定需要具备很多的数学基础。如果你是一名开发人员或者系统管理员,你可能已经调用了大量的根本就不熟悉的库和各种框架。例如,当你调用 curl 的时候,你并不需要理解其内部的 &web-scraping 是如何工作的。同理,人工智能(AI)的学习也是如此。目前,计算机软件领域存在大量的框架和各种不同的项目,这些框架和项目使得人工智能的学习很容易便可掌握,并不需要达到数据科学家博士那样高的水平。但不要被我所误导,我并不是说数学不重要。数学可以帮你更加清楚的理解人工智能的深层含义。同时,它能帮助你仔细地阅读一些研究论文和前沿书籍,如 Ian Goodfellow 所写的 Deep Learning 等。所以,请继续学习我在先前的文章中给你列出的那些书籍吧。但是如果你想开始运用人工智能,那么今天就可以开始了。让我们从一些实用的项目开始吧。我的学习方法与 The FirstTwenty Hours 中所讲述的优秀方法非常类似。我们都知道10000小时法则:如果要真正的掌握一项技能,需要投入大量的时间。但是我们还没到要掌握某项技能的程度,仅仅处于入门阶段。那么,让我们立即开始学习吧,你不需要很多时间,但是却充满了乐趣!方法很简单,以下就是其基本要素:选择一个项目克服自我否定大量尝试,直面挑战不断实践很简单是不是?那么让我们开始吧!&&&&&&&&&&&&&&选择一个项目&首先,你需要选择一个项目,一个会真正激励你去不断尝试的项目。一个奖金100万美元并且有机会深入研究肺癌的项目怎么样呢?Kaggle 是一个机器学习竞赛平台。现在 Kaggle 正在举办一个奖金高达100万美元的比赛,目的是提高肺癌的分类效率。任何人都能参加这个比赛,当然也包括你。我知道你此刻的想法,肯定觉得自己没有机会赢取这个比赛,毕竟是一个重量级的比赛。但我很高兴你能阅读到这里,因为接下来我们要学习第二步。&克服自我否定&在学习任何新东西之前,都要尽可能快的打消自我怀疑的想法,这一点非常重要。The First Twenty Hours 中提倡人们消除干扰,有计划地学习和工作。同时,它还提出了诸如冥想、肯定思维或者喝酒等方法。无论是哪种方法,只要能让那些干扰的声音走开并能让你全神贯注的工作,都可以使用。如果你需要一本书来帮助你,那么我推荐 You Are a Badass(已有中文版出版----《你骨子里是个牛人》,/ebook//)。这本书风趣幽默,十分尖刻,是难得的杰作。当下,你可能仍未找到适合自己的方法。但是没关系,你很快就能找到的。在学习的第一阶段,感到困惑和沮丧是必然的。所以,不要让困惑和沮丧打败自己,将其视为踏上正轨的标志吧,你正学习某些非常有价值东西!你可能不会赢得比赛,但是这又怎样呢?你只需要在截止日期之前,提交完整的结果就行了。不是每个人都能获得马拉松比赛的冠军,但是完成马拉松比赛本身就已经很了不起了,不是吗?&&&&&&&&&&&&&&&但是你知道吗?你真的有可能会赢哦,相信我。作为机器学习的业余爱好者,你可能没有接受过多年的理论训练和思维训练,专业程度远远低于专业人士。但是,还记得那个学生的故事吗?他只是将黑板上的两道未曾解决的数学问题当成了家庭作业,最终却把这两个数学问题都解决了!事实上,数据科学比一般的科学更加具有吸引力,它吸引着各个领域的学者。所以,加入数据科学领域并勇敢的尝试吧!谁知道接下来会发生什么呢?你很可能会发现一些专家都还没有发现的东西,并且在癌症检测方面做出贡献,最终把这100万美元带回家。&大量尝试,直面挑战&如果你是一名开发者,那么你肯定知道这句口头禅,这句话也非常适合学习过程。比如,我现在有大量的书籍,我需要快速的浏览这些书籍,并且从中找到那些对我有意义的内容。每个人喜欢的风格内容不尽相同,对这个人有用的书对另一个人很可能没有用。所以,每个人都需要选择适合自己的书。关于机器学习的书籍有很多,Real World Machine Learning 就是其中一本。令人遗憾的是,机器学习这个领域太新了,大多与之相关的书籍今年才陆续出版。现在,你也可以预定 Deep Learning: A Practitioners Approach 或者 &Hands-on Machine Learning with Scikit-Learn and Tensorflow 这两本书了。&&但是,你也不用去等待新书的出版,在这里我向你推荐一个读书平台 Safari Books Online,费用是一个月四十美元。只要你想看,你可以在这个平台上阅读各种各样的书籍,包括部分未正式出版的书籍。当然,刚刚提到的两本书也可以通过 Safari Books Online 看到。我会帮助你节约一些时间。目前这个阶段,你不需要学习如何使用 Python、R或者 Java,从头开始构建深度学习系统。你需要的,是那些能快速帮你进入比赛状态的工具。Kears 将是一个很好的帮手,它的构建基础要么是 TensorFLow,要么是 &Theano。&& & & & & & & &你甚至不需要自己去设置使用环境,你只需要使用它所提供的Docker镜像即可。坦率的说,现阶段你不必去关心 Keras 后端用的是 TensorFlow 还是 Theano。TensorFlow 和 Theano 都是运行深度学习算法的基本引擎。在目前的学习阶段,它们两个对你来说都是一样的,选哪一个都可以。Keras 是由一流的谷歌研究员创建的深度学习框架。我有幸在本周末遇见了Keras 的开发者 Francois Chollet。他说:“目前,深度学习是成熟的,只是没有得到广泛的传播。而 Keras 恰巧在其传播过程中起到了关键的作用,帮助深度学习为大众所接受。任何人不必成为 AI 研究专员,就能使用 Keras。”此时此刻,你就可以开始使用各种先进的深度学习算法。如果你已经拥有一个 Mac 或者 Linux 主机,并且配备良好的 Nvidia 显卡,那么就开始行动吧。如果你没有,那么可以考虑购买一个 Alienware,我推荐中档的 &Aurora 系列。还有,你并不需要 kick-ass 处理器。你需要一个 SSD、辅助旋转盘、内存介于16-64GB之间的存储器以及你能负担的起的性能 Nvidia &显卡。记住,显卡是最重要的,必须买好的显卡,因为它可以实实在在地帮你提升深度学习的速度。你需要重新格式化显卡,使其与 Linux 系统兼容。同时,显卡必须配备最新的二进制驱动程序。遗憾的是,开源的系统不会兼容最新的芯片组,一启动很可能就会黑屏。所以,你要参考这个网站来修复它:/questions/760934/graphics-issues-after-while-installing-ubuntu-16-04-16-10-with-nvidia-graphics如果你想自己 DIY 一个机组,你可以点击这里获取相关的教程:/@acrosson/building-a-deep-learning-box-d17d97e2905c#.j698c3ake/blog/2016/11/building-a-machine-learning-deep-learning-workstation-for-under-5000/最后,你也可以使用 AWS、Google 云或者 Azure 云,但是云计算中的 GPU 计算可能会非常昂贵。当然在你想明白自己要做什么之前,租一个机组比购买一个机组来的更加划算。&不断实践&现在,你可以开始学习了。以下是一个非常简单的Keras实例:/tutorial-first-neural-network-python-keras/你需要选择一个方法来参加竞赛。我再来教你一些模型来节约时间。目前,标记和研究图像的最有效的方法是卷积神经网络(CNN)。Google、Facebook、Pinterest 和 Amazon 都用这个方法来进行图片处理和标记。你也需要从最好的实践开始,对吧?&&事实上,如果你已经朝着本次竞赛努力了的话,那么快去下载数据集并查看相关的比赛教程吧。它会告诉你如何分割图片并且使用 Keras(TensorFlow 作为后端)来构建 CNN 模型。特别棒!坦率的说,如果没有这些教程的帮助,结果可能要糟糕的多,光是调试里边的各种参数,很可能就要花几个星期。经历过这个疯狂的阶段之后,将各种参数和算法抛之脑后吧!尽管去尝试,尽管去寻找其中的乐趣!也许你会发现一些专家都没有发现的东西!完成上述实验之后,如果你还想尝试更高级的东西,可以查阅 Kaggle 数据科学2017版(/c/data-science-bowl-2017/kernels),这里面有很多值得你学习的内容。如果在这里查不到数据科学家的相关分享,也可以参考下面这个网站:/anokas/data-science-bowl-2017/exploratory-data-analysis,这对数据探索也是非常有用的,里面含有一系列的匿名 CT 扫描数据。下面这个网站里边含有比上述网站更好地教程:/gzuidhof/data-science-bowl-2017/full-preprocessing-tutorial,这也是目前最受欢迎的教程。它能帮助你做“预处理”,也就是最基础的数据清洗和数据整理工作,使得神经网络的处理更加容易。它实际上是把2D图像转换成了3D图像。超酷!坦白说,如果你自己手动编写代码并让代码成功运行,这是非常不明智的选择。我们将这种编程方法称之为“硬编码”。也就是说,在完全理解代码之前,你就已经开始编写程序了。目前市面上甚至有许多与 Python 或者其他语言相关的书,都是采用“硬编码”的方法。如果你想采用“硬编码”方法,这些书可能会对你有一些帮助。警告:已经有人在比赛中获得了完美的分数。他是通过研究棋盘游戏并增加训练数据集的数量来实现的,非常聪明。这种方法没有任何错误,但是对于最终的目标却没有实质性的帮助。我们应当利用这次比赛,学习如何运用神经网络。这种方法暂时不做介绍,我们主要专注于用 Keras 来分析 CT 扫描数据。就这么定了!如果你运气好,说不定还可能会重新定义癌症的研究,并且把奖金带回家。还不错吧!即使没有赢得比赛,你也学习到了如何在现实世界中使用AI技术。无论输赢,开心是最重要的!&本文作者 Daniel Jeffries 是一位作家、工程师和企业家,研究领域涵盖了从 &Linux 到虚拟化和容器的各种技术。本文由 AI100 编译,转载请联系本公众号获得授权编译:AI100原文链接:/learning-ai-if-you-suck-at-math-part-two-practical-projects-47d7a1e4e21f查看更多AI最新,请访问 AI100 微信公众号:点击?阅读原文?查看更多资讯
& 上一篇:
& 下一篇:
AI 技术讲座精选: 数学不好,也可以学习人工智能(二) [相关推荐]
Copyright & , All rights reserved.牛哥网 , 传播文明正能量,做有文艺范的青年喜爱网站。两个AI被今年的高考虐哭了,看来高考是真难啊!
来源:AI财经社 作者:林木木
两台高考机器人,AI-MATHS和Aidam,6名历年的高考状元,挑战了2017年的高考数学题。尽管柯洁败给阿尔法狗,但在高考这件事情上,高考状元仍是不可战胜的。
6月7日下午5时,全国高考数学科目的结束铃声响起。另一边,两个特殊的高考生正准备“展开”试卷。
成都的一个会议室里,准星云学研发的高考机器人AI-MATHS在媒体见证下,两小时内解答多套2017高考数学题;数千里外的北京,“学霸君”研发的另一个机器人Aidam将与四位高考状元同台对战。
2017年的高考,是两家科技公司要征服的目标。在高考的考场上,这场AI与人的角逐在6年前就开始了。最终,高考状元取得了胜利。
2012年6月的某一天,在投资公司工作的张凯磊坐在办公室里,收到一封在Google任职的同学发来的群邮件,邮件内容是一篇尚未发表的论文,揭示了这一轮人工智能学习的大浪潮。
这篇论文将在未来引起巨大反响。很快,全世界都将知道Google在秘密实验室Xlab做出了关于“猫脸识别”的惊人研究。
“教学会因此迎来变革。”张凯磊说,他受到强烈的震撼。张凯磊是南开大学数学系出身,曾在大二辍学创办过一家教育培训机构,因此这成了第一个跳入他脑中的想法。
10月,张凯磊果断辞掉投资公司的工作,邀请陈锐峰加入,开始筹备创业。一年后,主打“拍照搜题”的“学霸君”面世,它将为日后的高考机器人Aidam提供大量的题库储备。
这个时期的中国高考机器人,正在襁褓中孕育着能量。
国际上,高考机器人的研究开始于2011年。来自日本国立情报学研究所(NII)的新井纪子教授领头发起了“东大机器人计划”(Todai Robot Project)。她召集了超过100名人工智能领域的专家组成专项团队,目标是让机器人Torobo能在2021年前通过东京大学的入学考试。
这一年,另一个中国人林辉,在无数次碰壁后,找到了清华大学苏研院。那时人工智能的概念尚未在国内苏醒,这个领域的创业公司寥寥,很多投资人不理解这个概念,“聊项目之前先得给他们科普”。
清华大学苏研院大数据中心的成立,加速了研发进程。林辉担任数据中心主任,2014年,大数据中心旗下的智慧教育事业部被分出来成立为准星云学科技有限公司,林辉任CEO,并在不久后承担起开发高考机器人AI-MATHS的责任。
四年后,日。合肥一间会议室里,数十位专家领导围坐在一张棕色的圆桌旁。圆桌中间摆着一大簇鲜花,每个人身边都放着一个白色茶杯,头顶上拉着一条红底黄字的大横幅。在这个极其传统的会议场景中,正讨论着十分前沿的主题。
(国家“十二五”863计划信息技术领域“基于大数据的类人智能关键技术与系统”项目启动会暨研讨会)
会议探讨并启动了国家863类人智能项目,这个项目的主要任务就是在3--5年时间内研制出能够参加高考并考取大学的智能机器人。
这个节点预示着中国第一个高考机器人的诞生。
项目由科大讯飞牵头,联合了包括清华大学在内的30家院校和单位。当天,首创高考机器人的日本教授新井纪子也出现在会议席上。
时间回溯到5月的某一天,正在NII工作的新井纪子收到一封来自中国的邮件,这封邮件由科大讯飞发出,意欲与NII共同开发考试机器人。邮件提到,中国将推出一个国家级项目来开发考试机器人,前三年的预算大概是30亿日元,“中国为此付出了巨大的努力”,新井纪子在收到邮件后很感慨,他们在“东大机器人计划”上的花费大概为每年数百万日元。
(日本国立情报学研究所(NII)教授新井纪子)
她很快同意了这项合作,并在7月到访中国。
林辉的公司在人工智能领域的长期研究这时候起了作用。立项后,准星公司一举中标了高考机器人的数学应考项目,成为数学组别的组长单位。当时,人工智能识别、大数据处理等难关已经被攻破。
除了数学,这款机器人还包括另外两个独立的人工智能程序,分别应考语文和文综。研发团队立下目标,要在两年后,即2017年6月,让它在封闭环境中、断网情况下与全国文科高考生一起考试,目标是考上“一本”。
这并不是一个容易实现的目标。当时,已经研究了四年的Torobo还无法达到日本入学考试分数线。上线两年的“学霸君”的技术能力只能使系统在数学考试中得到30分。消息一出,有网友评论四个字:“坐等打脸。”
“参加大学入学考试对人工智能来说是一个很好的目标。”新井纪子说。
高考机器人在这一年的11月迎来突破性进展。
从2013年开始,Torobo每年都会参加日本大学入选考试,2015年的11月,它在考试中取得了511分的成绩,总分950分,平均分数416分。这意味着,它可以进入全日本441家私立大学和33所全国性大学就读,排名在全国前20%,其中数学排名前1%。
这是Torobo迄今为止取得的最佳成绩。但它仍然未能考入东京大学。并最终放弃了这一目标。
当月,中国代表团到日本进行交流访问,见证了这一关键时刻。
与随后出现的中国机器人的虚拟系统不同,Torobo拥有一个真实的身体。它是白色的,有两条可以灵巧活动的机械臂,左手捏着固定爪,右手握着圆珠笔。它在真正的试卷上进行答题。
(Torobo 在真正的试卷上进行答题)
确切地说,高考是比围棋更难的测试。阿法狗可以战胜九段世界级高手,但围棋的规则相对简单。而高考对机器人来说,其泛化知识库里的规则,远比围棋的黑白、点位置和吃子规则复杂得多。它要求机器有感知分析、认知联想和推理验证的能力。
“请拍板。”陈锐锋在***里对张凯磊说。
号,张凯磊正在美国出差,晚上11点,夜色已经笼罩住整座城市,张凯磊回到酒店准备休息。这时,他接到了公司首席科学家陈锐锋打来的***,对方告诉他说,最近两个礼拜,机器学习突然取得实质性突破,智能机器人项目可以开始做了。
很长一段时间,他们的机器人在学习上的进展极其缓慢。从2012年10月创业以来,“学霸君”的工程师做过许多努力,三年时间只把分数从0分提高到40分左右,其中从0分到30分大概用了6个月,之后两年多的时间基本在原地踏步,无法取得突破。很多做这个项目的人最终都选择了离开。
但这一次,陈锐锋告诉张凯磊,新一批庞大的数据“喂”进去之后,突然发现增速变快,两周内分数增加了2到3分,这在之前是从未发生过的。在排除了误差之后,工程师们认定,新的方法被证实有效,虽然风险仍旧存在,但这个项目有了实现的可能性。
那一夜,张凯磊激动到失眠,他一直清醒地思考到凌晨五点:“一定要做,这是核心突破口。”他随后拨通了公司的***。
这个***持续了四个多小时,他在美国的这一头拿着***,让那一头的陈锐锋召集来所有研发人员。近十个研发人员挤在一个办公室里,对着一部***,挨个回答张凯磊提出的问题。全部问完以后,他命令下面的工程师出去,只留下核心工程师金霄然和陈锐锋,接着给几个副总裁打了***,最后,他说:“定了,招人吧。”
挂了***,美国清晨的阳光已经照进窗户,北京已经进入黑夜,张凯磊站起身,走出了房间。
Aidam的加入,是个历史性的时刻。他们拥有了紧随国家“超脑计划”之后的全国第二部高考机器人,并间接地向AI-MATHS提出挑战。
谈到和林辉的关系,张凯磊说:“我们是朋友,经常交流。”但他不愿意对对方的产品下论断。
2月23日,是林辉的数学高考机器人AI-MATHS的成果展示时间。这是一次测试。
这一天,林辉带着他的系统来到成都石室天府中学,将于高三文科班的43名学生进行一场“人机大战”。这是AI-MATHS首次与学生对决。
机器人AI-MATHS败给成都石室天府中学高三学生,仅得93分。
气氛很紧张。高三数学老师拿着一个***密封袋,严肃地走进高三5班和6班的教室,密封袋里装着即将测试的数学试卷。老师站在讲台上,举起密封袋,展示其完好无损,接着解开密封袋的绳索,抽出一叠试卷。学生们端坐在下面,望着他,激动中带着忐忑。
旁边的办公室里,一个隔间的工位上放着两台未联网的台式电脑,穿黑色外套的技术人员将一个磁盘插入主机,随后坐在电脑面前,开始快速地点击鼠标,电脑屏幕上出现一行行密密麻麻的数字。
试卷被依次发到学生的桌上,同时每一道题也输入了电脑。答题开始了,接下来两个小时是紧张的等待。
林辉不知道结果会如何,他感慨了一句:“想给系统烧上几炷香。”高三学生佘雨佳觉得自己肯定要输给人工智能了,她略显悲壮地说:“感觉我们是为人类的荣誉而战”。
答题结束,电脑连上打印机,打印出纸质版的试卷***,老师收上学生试卷,当场批改了这44份试卷。
事实证明,这一战,人类赢了。高考机器人的试卷审批完毕,老师在分数栏写下了数字“93”,而43名学生的平均成绩是“106”。
(高考机器人 AI-MATHS的服务器)
结果在林辉的预料之中。当时的AI-MATHS每天要吃10套题,运算量可达2的800次方。截至这次测试,机器仅有100套试题的训练量。“它不是题库,而是理解答题的逻辑。”这是林辉对数学机器人的解释。
他给AI-MATHS定下目标:6月7号上重点本科分数线。
另一边,张凯磊的电脑突然跳出一个测试结果。公司的几十台服务器承载着机器人的系统,每天自动训练着40万--50万道的题目,不间断地输出测试结果。这一天,测试分数突然比往常多了几十分之多。
他立马拨通研究人员的***,对方告诉他,几何难题终于攻破了,Aidam又迎来一次质的飞跃。
张凯磊曾一度觉得,自己研发的机器人Aidam无法参加高考了。
3月之前,他们一直无法攻克这个难题----如何将几何语言转换为机器能理解的语言。
他在上海组建了一个专攻几何的团队,8个人,包括老师和技术人员,每天坐在办公室里思考、运算,就这样过了一整年,一无所获。
几何问题解决不了,挑战高考试题就是无稽之谈。张凯磊焦虑地在办公室走来走去,突然灵机一动,想到一个无策之策。他召集几何团队的人员表示,从今年往后,老师来学写代码,工程师学备课。
前期并无效果,经过几个月的积累,3月的某一天,就像突然开窍了一样,这个难题就这么消失了,张凯磊把这归功于工程师与老师长期融合的结果。
以“拍照搜题”起家的“学霸君”,四年来累积了超过7000万道数学题目的题库系统,加上学生大量手写和上传的题目,以及教辅书籍中的题目,共同构成Aidam的训练数据库。
(AI-MATHS的读题设备)
阶段性成果取得,张凯磊也定下目标----6月7日Aidam将在媒体见证下挑战高考数学题,与数名高考状元同台对战。
但与AI-MATHS不同,Aidam是需要联网的。这意味着两者有不同的逻辑。
6月7日,高考日,决战的日子到来了。下午5点过后,两场比拼分别在成都和北京的高考机器人之间上演。
“105分。”主持人说出AI-MATHS的数学高考成绩。
AI-MATHS机器人的“身体”并非模仿人类的样子,而是10余台服务器组成的像冰箱一样的柜子。它被放在会议室旁边的休息室里,孤零零地“站”在房间中央,被一条白线与外界隔开。
这张高考试卷,花费了AI-MATHS 22分钟。
与此同时,另一个高考机器人Aidam也在北京的一间会议室里快速地运算着,它这次的任务是与6名来自不同省份的高考状元对决。
一个小时后,数学老师拿来了Aidam的成绩,舞台大屏幕显示出Aidam的答题卡,老师详细地通报了机器人的得分。每一次念到满分的题目,下面的观众都爆发出热烈的掌声。
“机器人得分134分。”主持人最终报出数字,接着补充道:“6位高考状元平均分,135分。”
1分之差,曾经输给阿法狗的人类,这次在高考面前,打败了AI。
(Aidam与高考状元成绩对比,人类平均分以一分之差胜出。)
这是一次阶段性的胜利,这似乎能够表明,尽管机器能够实现大量的运算,但面对“理解”这个难题,至少在很长一段时间里,它是只属于人类的专利。
除了人类与AI的成绩差,可以看到,Aidam的成绩要明显高于AI-MATHS。
AI-MATHS的研发牵头人林辉在演讲中对此做出解释。“‘联网联库’相当于开卷考试的环境,但我们是闭卷。”他说。
他显然是暗指机器人Aidam。
张凯磊对此未做解释。笔者问张凯磊,怎么看林辉的AI-MATHS。他只回答了一句:“我跟林辉是朋友,经常交流。”
中国高考已经进行到了第四十年,每年诞生数百万考生,很多人事后回忆起来,觉得当年没日没夜做题的自己与机器人无异。多年过后,高考也会在命运的不可掌控中消逝它的意义。
那么,为什么我们还要耗费如此多的精力和资金造出一个机器人来,迎合所谓的“应试教育”?
“学霸君”CEO张凯磊的回答是,如果机器人能够挑战高考,有理由相信机器人可以辅导学生,在自动解题、自动批改与个性化作业上帮助学生,这对中国教育来说具有革命性意义。
AI-MATHS的负责人林辉觉得,技术要应用在教育评测上,保证教师、学生、家长的“三减负一增效”。
新井纪子教授则没有那么乐观了。高考机器人的研究让她重新审视已有的教育方式。“如果AI在那方面能够做得更好,那说明,我们需要新型的教育。”她忧心忡忡地说。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点数学不好,也可以学好人工智能(五)----深度学习和卷积神经网络
我的图书馆
数学不好,也可以学好人工智能(五)----深度学习和卷积神经网络
【AI100 导读】欢迎阅读《数学不好,也可以学好人工智能》系列的第五篇文章。如果你错过了之前的四部分,一定记得把它们找出来看一下!本文主要介绍了深度学习架构----深度卷积神经网络(DCNN),以及作者用 Python 写的图像识别程序。今天我们要介绍的是我们自己用 Python 写出来的图像识别程序。开始写之前,我们先来研究一下这个非常强大的深度学习架构----深度卷积神经网络(DCNN)。卷积神经网络(convnet)是计算机视觉的驱动力。从自动驾驶汽车到 Google 的图像查找,都是运用的卷积神经网络。在2017 TensorFlow 峰会上,一个研究者曾向大家展示如何像皮肤科医生一样利用卷积神经网络侦测皮肤癌的过程(/watch?v=toK1OSLep3s),而他们利用的就只是一部智能手机而已。那么,神经网络为什么有如此强大的能力?其中一个关键因素就是:他们做自动模式识别。那什么是模式识别,为什么我们会关注是否为自动模式识别?模式的形式有很多,我们先看两个典型的例子:定义一个物理形式的特征做一个任务的步骤计算机视觉我们将图像处理中的模式识别称为特征抽取。当你在看一幅图或者是真实世界中的某个东西的时候,你会有选择性的提取出其中的关键特征,这些关键特征会让你明白所看东西的含义。这是无意识的动作。当你看到我家猫 Dove 的图片的时候,你可能会认为它是一只“猫”或者是“其他动物”,虽然你并不知道你是怎么做出这个判断的,但是你确实做到了。你不知道你是怎么做到的,因为它是自动发生的,并且是无意识的。对你来说,这似乎很简单,因为你每天都在做这样的事情,错综复杂的处理过程是被隐藏了的。你的大脑相当于一个黑盒子,一个生来就没有操作手册的黑盒。然而,如果你停下来想一下,你刚才做的那一小部分实际上涉及了大量的步骤。表面上看来是令人难以置信的简单过程,但实际上却非常复杂。你移动你的视线。你接收到光线,并且处理由光线组成的部件发送到你脑中的信号。之后,你的大脑开始工作,把光转化为电化学信号。这些信号经由你构建的神经网络发送出去,激活不同的部分,包括记忆、联想和感觉等。在这些最基本的层面上,大脑强调低水平模式(耳朵、胡须、尾巴等),在此基础上合并成高水平模式(动物)。最后,你做了一个分类,这意味着你把它转换成了一个词,这就是现实生活中事物的符号化表达,这个例子中的符号化表达为“猫”。这一切都发生在眨眼之间。如果让你去教一台计算机来做这些,你要从哪开始呢?你能告诉它如何侦测耳朵吗?什么是耳朵?你怎么去描述耳朵?为什么猫的耳朵与人类或者蝙蝠(蝙蝠侠)的耳朵是不同的?从不同的角度看去,耳朵分别是什么样的?所有的猫的耳朵都一样吗(不,看一下苏格兰折耳就知道了)?问题远不止这些。在如何教计算机实现上述过程的问题上,如果你运用了 C++ 或 Python,可能会找不到好的解决方案。但是别沮丧,因为这个问题已经困扰计算机科学家长达50年了!你再自然不过的一个动作,却是深度学习神经网络的一个关键应用----“分类器”,在上述猫咪的例子中即为图片分类器。刚开始,人工智能研究者尝试利用像我们刚才所说的步骤那样练习,尝试人工定义所有的步骤。比如,当想到自然语言处理(NLP)的时候,他们把最好的语言学家集合到一起,然后说:“把所有的规则都用语言写出来”。他们把这些称为早期的人工智能“专家系统”。语言学家坐到一起,苦苦思索出一套令人眼花缭乱的组合,包含各种 if,unless 和 except:是鸟么?是如果不是,它是:死了伤了一个像企鹅一样不能飞的鸟翅膀不见了这个表单所包含的规则和例外的情况可以说是无穷无尽的。不幸的是,在各种各样的错误面前,这些规则同样非常脆弱且容易出错。他们耗费了大量的时间来创建、讨论其中的规则和例外情况,但是却很难解决这个问题。深度神经网络称得上是真正的突破,它使得你不再需要为所有的步骤找到解决方案,而是让机器来自动抽取猫的关键特征。“自动化”是基础,因为我们会忽略掉在我们做复杂活动,尝试找到数千或数百万隐藏的步骤是不可能解决的问题。让计算机自动处理这个过程!无尽的步骤让我们来看一下第二个例子:算出一个任务的步骤数量。手动处理上述过程并为计算机定义步骤的做法叫做编程。假设你想找到硬盘上所有的照片,然后把它们都转移到新的文件夹下。对大多数任务来说,编程者就是神经网络。他充满智慧,在研究任务的同时将任务***成小的步骤,接着又为计算机定义了所有的小步骤。他把这一切以形式化向量的形式输入到计算机中,这就是我们所说的机器编程语言。以下是一个 Python 语言的实例,来自于 Stack Exchange 上的“JollyJumper” (/questions//copy-all-jpg-file-in-a-directory-to-another-directory-in-python):import globimport shutilimport ossrc_dir = “your/source/dir”dst_dir = “your/destination/dir”for jpgfile in glob.iglob(os.path.join(src_dir, “*.jpg”)):shutil.move(jpgfile, dst_dir)Jolly Jumper 算出了所有的步骤,然后翻译给了计算机,例如:我们需要知道源目录我们也需要一个目标目录我们需要一个方法来区分我们想要的文件类型,在这个例子中是“jpg”文件最后我们去目录下,找到jpg文件,然后把他们从源目录移到目标目录下这个方法适用于简单或中等复杂程度的问题。操作系统是现今最复杂的软件,包含数亿行代码。每行代码不但明确的介绍了计算机是如何工作的(例如:在屏幕上画东西、存储或升级信息),而且也介绍了人是如何完成工作的(复制文件、输入文本、发邮件、看照片、与其他人聊天等)。但是我们一直处于进步的过程中,不断尝试解决更具挑战性的问题,于是便遇到了人工操作过程所不能解决的问题。例如,我们如何定义开车?要向完成此类极为复杂的任务,需要有数以亿计的小步骤的参与。我们不得不:站成一条线知道线是什么,然后识别它行驶于两地之间识别出类似于墙,人,碎片等障碍物对有用的目标(街区指示)或有威胁的目标(行人在绿灯时穿过马路)进行分类评估我们周围不断行驶过的汽车瞬间做出决定在机器学习领域,这就是有名的决策问题。复杂的决策问题示例如下:机器人导航和感知语言翻译系统自动驾驶汽车股票交易系统神经网络的内部秘密让我们看一下深度学习是如何利用自动特征抽取来帮助我们解决现实世界里极度复杂的问题的!如果你曾经读过 V. Anton Spraul 的杰作“Think Like a Programmer”(你应该读一下),你就会明白编程是为了解决问题。程序员把问题拆解成若干的小问题,然后为其制定解决方案,最终用代码将它们一一实现。深度学习为我们解决问题,但人工智能当下仍然需要人的参与(谢天谢地)去设计和测试它的架构(至少现在还需要)。因此,让我们把神经网络拆散成小块儿,然后编程去识别图片----我的 Dove 是只猫。深度学习的深度深度学习是机器学习的子领域。深度学习的名字源于这样一个想法:把不同的层堆叠在一起,以便学习越来越有意义的数据向量。每一个层都是一层神经网络,每一个层都包含着一定数量的与人工神经元的连接点。在使用强大的 GPU 来为我们做计算之前,我们只能构建一些很小的神经元网络。而且这些神经元网络的作用非常有限。现在我们已经能把很多层堆叠在一起了,因此也就产生了深度学习的深度。神经网络的灵感来源与19世纪50年代医学对人脑的研究成果。研究者创建了一个神经元的数学表达式,如下图所示(感谢 Stanford 关于卷积神经网络的公开课和维基百科,http://cs231n.github.io/neural-networks-1/):现在,忘记那些复杂的数据公式吧!因为根本就不需要。基础相当容易。用 x0 来表示的数据在神经元之间传送,连接的强度用其权重来表示(w0x0,w1x1等)。如果信号够强,它能通过其“激活功能”激活神经元。以下是一个三层深度神经网络的例子:通过激活其中的一些神经元,加强一些神经元之间的连接,系统学习到世界上什么是重要的,什么不重要。构建并训练一个神经网络让我们从更深入些的层次看一下深度学习,像之前一样写点代码。所有的代码我都已经上传到了我的 Github 上:/the-laughing-monkey/learning-ai-if-you-suck-at-math/tree/master/Deep%20Learning%20Examples。系统的基本特征如下:训练输入数据层权重目的损失函数优化函数预测训练训练过程就是教神经网络学习那些我们想让其学习的东西。它遵循以下五个简单的步骤:创建训练数据集,我们把他命名为 x,然后加载它的标签命名为目标 y。为 x 供给数据,向前通过神经网络形成的结果是预测目标 y。计算出网络损失,就是预测 y 与正确结果 y’ 之间的不同。计算出损失梯度(l),损失梯度表示我们接近或偏离正确目标有多快。在梯度方向的反方向调整网络权重,从第二步开始再试一下。输入数据在示例中,DCNN 的输入数据为一堆图片,而且图片数量越多越好。和人不一样,计算机需要利用大量的实例来学习如何区分这些图片。人工智能研究者正致力于研发用相对教少的数据来进行学习,但那仍然是一个前沿的问题。一个著名的例子就是 ImageNet 数据集,这个数据集包含大量的手工标注的图片。换句话说,他们众包了一批人,利用他们已经构建好的神经网络去浏览所有的图片,赋予数据某些意义。人们在上传图片同时为图片打上了各种不同的标签,如“狗”或者是具体的“小猎犬”。对网络来说,这些标签就代表准确的预测。网络开始匹配手工打标签的数据(y)和自身的预测结果(y’),y 与 y’ 越接近,网络越精确。数据被分成两部分:训练数据集和测试数据集。训练数据集是输入,也就是我们要“喂给”神经网络的那一部分。它会学习各种各样目标的关键特征,然后我们测试在测试图像集中能否准确的找到那些随机目标。在我们的程序中,我们用到了知名的数据集----CIFAR10 数据集,这个数据集是由加拿大高等研究所开发的(CanadianInstitute for Advanced Research)。CIFAR10 包含10个类,含有60,000张32*32色的图片,也就是每个类里有6,000张图片。我们用其中的50,000张图片作为训练数据集,另外的10,000张作为测试数据集。在我一开始用 CIFAR 的时候,我错误的假设了相对于使用 ImageNet 这种大图的挑战来说,使用 CIFAR 的挑战会比较小。但结果却是 CIFAR 更具挑战性,原因是图片太小而且少了很多,所以对于我们的神经网络来说图片的显著特征太少,很难锁定。以我的经验,类似于 ResNet 这样的最大且最坏的模型在使用 ImageNet 的时候准确率也可以达到97%,而使用 CIFAR-10 时准确率仅仅能达到87%。当下 CIFAR-10 上最先进的是 DenseNet,拥有超大的250层和1500万个参数,准确率可以达到约95%!我把这些框架附在了文章的底部,以便未来进行研究。但是在专研如此复杂的系统之前,我们最好从一些简单的系统开始。理论已经足够了,开始写代码吧。如果你 Python 用的还不够熟练,我强烈、强烈而又强烈得向你推荐 Fabrizio Romano 所著的“Learning Python”这本书,书中的每一个细节都写得非常好。关于 Python,我从没见过比这更好的书。我有很多其他的关于 Python 的书,但对我的帮助都没有这本大。我的 DCNN 的代码是基于 Github 上 Keras 的样例代码而编写的:/fchollet/keras/tree/master/examples。你能在这找到我的修订版:/the-laughing-monkey/learning-ai-if-you-suck-at-math/tree/master/Deep%20Learning%20Examples。我已经调整了其中的架构和参数并且增加了TensorBoard,以帮助实现网络的可视化。让我们开始 Python 编程吧,输入数据集和各种各样的类,我们还需要创建我们的 DCNN。幸运的是,Keras 已经知道如何自动获取数据集,所以我们省了很多力气。from __future__ importprint_functionimport numpy as npfrom keras.datasets importcifar10from keras.callbacks importTensorBoardfrom keras.models importSequentialfrom keras.layers importDense, Dropout, Activation, Flattenfrom keras.layers importConvolution2D, MaxPooling2Dfrom keras.utils importnp_utilsfrom keras import backend asK我们的神经网络开始于某个随机的配置。从哪里开始都很好,我们不应一味期望这个开端会非常明智。其次,随机配置可能会完全偶然的给我们带来一个神奇的结果,因此我们设定随机权重,以确保我们得到的结果不是源于纯粹的运气。np.random.seed(1337) # Very l33t层现在我们需要增加一些层了。很多神经网络用的是全连接层,这就意味着已经把所有的神经元都连接在了一起。全连接层对于解决各种各样的问题都堪称完美。但不幸的是,在图像识别上它表现的不尽人意。因此,我们选择用卷积层来构建我们的系统。由于系统并没有把所有的神经元都联系到一起,所以它是独一无二的。让我们看一下 Stanford 课程上计算机视觉关于卷积神经网络扩展是怎么说的:在 CIFAR10 中,图像的大小仅仅为 32*32*3(32位、32位高、3个颜色通道),因此一个全连接神经在一个规则神经网络的第一隐藏层中的权重应该是 32*32*3=3072。这个大小看起来仍然是可控的,但很明显这个全连接架构不能扩展为较大的图片。例如,像 200*200*3这样一张更大的图片,它会导致神经元的权重变成 200*200*3=120000。与此同时,我们几乎可以肯定,一定会需要一些这样的神经元,所以参数增加的速度会相当的快!很明显,这种全连接非常浪费,海量的参数会很快便会导致系统过度拟合。所谓过度拟合,就是在网络训练得很好的情况下,会对训练集中的数据全权精通,但是一旦出现没有见过的图片便无计可施了。换句话说,它在识别现实世界里的图片的时候并没有什么卵用。就好像你玩同一个游戏,玩了一次、一次又一次直到你完美的记住了它。然后有人在现实游戏里做了一个不同的动作,你就不知道怎么办了。我们稍后会讨论一下过度拟合。以下是数据通过 DCNN 的过程。它只看到了数据中的一个很小的子集,将这个子集捕获出来用于各种模式。随后又把这些观察到的数据构建成了更高层次的理解方式。注意一下最初的几个层,观察它们模式简单的原因,如边缘、颜色和基本形状等信息。随着信息流不断通过各个层,系统会发现模式会越来越复杂,如质地信息。最终,它会归纳出各种各样的目标类。这个想法是基于猫的视觉做的一个实验,该实验表明不同的细胞仅对某些特定的刺激有反应,如边缘或特定的颜色。人类也是一样的。我们的视觉细胞仅对特定的特征有反应。这是一个典型的 DCNN 架构算法:你将注意到这里有三个不同种类的层,一个池化层。关于具体的细节,你可以在 Oxford 和 Standford 的课程里统统找到。不管怎样,我会跳过大量的细节描写,因为这些细节会让很多人会感到困惑。我清楚的知道在我第一次想搞清楚它的含义的时候,我也感到很混乱。现在你需要知道的是池化层。池化层的目的非常简单,就是做二次抽样。换句话说,它们能够缩小输入的图片,这样可以减少计算加载量和内存使用率。需要处理的信息越少,我们对图片要做的工作就越简单。在训练集异常的情况下,它们也能帮我们减少网络零的第二类过度拟合情况,但是真的与挑选狗、鸟或者猫的图片一点关系都没有。例如,在一堆图片里可能会出现像素混乱的情况或者镜头闪烁的情况,当它们认为小行星和婴儿喃喃自语比较相近的时候,那么网络可能会决定把镜头闪烁和狗归到一起。最后,很多 DCNN 增加了一些密集型连接,我们将其称为全连接层,来处理在前面一些层里侦测到的特征图谱,并且进行预测。因此,给我的卷积网络加几个层吧。首先,我们为卷积神经网络的层增加一些变量。# Defines how many images wewill process at once batch_size = 128# Defines how many types ofobjects we can detect in this set. Since CIFAR 10 only detects 10 kinds of objects,we set this to 10.nb_classes = 10# The epoch defines how lonewe train the system. Longer is not always better.After a period of time wereach the point of diminishing returns. Adjust this as necessary.nb_epoch = 45# Here we put in the imagedimensions. We know the images are 32 x 32. They are already preprocessed forus to be nicely uniform to work with at this point.img_rows, img_cols = 32, 32# Here we set the number ofconvolutional filters to usenb_filters = 32# size of pooling area formax poolingpool_size = (2, 2)# convolution kernel sizekernel_size = (3, 3)核心和池化大小定义了卷积网络是如何忽略图片其他部分而直接寻找其特征的。最小核心的大小为1*1,也就是关键特征仅为1个像素。确认特征有效性的典型核心大小应该是一次大于3个像素,然后池化这些特征缩小到2*2栅格。从图片中抽取2*2栅格的特征,然后像交易卡片一样把它们堆叠起来。这便使其与图片上特定的点上脱离开来,允许系统在图片任意位置按直线或螺旋线查询,而不单单只是在发现它们的第一个位置。大多数教程将其描述成处理“翻译不变性”(“translation invariance”)。这到底是什么意思?好问题!再看一下这张图:在不把特征拉出来的情况下,就像你在第一层和第二层中看到的那样,系统可能会把发现猫鼻子的那个圆形区域认定为是图片中间最重要的位置。让我们看一下是如何识别出我的猫 Dove。如果系统最开始发现了她眼睛中的一个圆,那么它就可能错误的去假设图片中的这个位置与侦测猫有关系。相反,系统应该主动去寻找图片中的圆,不管这些圆处于图片中的哪个位置,就像我们下面看到的一样。在我们增加层之前,我们首先需要加载并处理数据。# This splits the data into training and test sets and loads the data. Cifar10 is a standard test data set for Keras so it can download it automatically. It's about 186MB expanded.(X_train, y_train), (X_test, y_test) = cifar10.load_data()# Unfortunately, TensorFlow and Theano want their tenor parameters in a different order, so we check for the backend from the json initialization file and set them accordingly.if K.image_dim_ordering() == 'th':X_train = X_train.reshape(X_train.shape[0], 3, img_rows, img_cols)X_test = X_test.reshape(X_test.shape[0], 3, img_rows, img_cols)input_shape = (1, img_rows, img_cols)else:X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 3)X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 3)input_shape = (img_rows, img_cols, 3)X_train = X_train.astype('float32')X_test = X_test.astype('float32')X_train /= 255X_test /= 255print('X_train shape:', X_train.shape)print(X_train.shape[0], 'train samples')print(X_test.shape[0], 'test samples')# convert class vectors to binary class matricesY_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)OK,我们现在终于准备好往我们的程序里增加层了:model = Sequential()model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],border_mode='valid',input_shape=input_shape))model.add(Activation('relu'))model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=pool_size))model.add(Dropout(0.25))层堆叠需要遵循:卷积激活值卷积激活值池化中途退出除了中途退出和激活值以外,上述层的类型我们基本都讨论过了。中途退出是最容易懂的。基本上,它指的是模型随机消失的概率。这与 Netflix 使用 Chaos Monkey 的方式很相似,都运用脚本随机关闭网络上的服务器,以确保网络可以通过内建的韧性和冗余而存活下来。这里也是如此。我们希望能够确保网络不过分依赖于任何一个特征。激活值层是决定神经是否激活或被激活的方法。在激活层上存在许多激活功能,RELU 是其中最成功的一个,因为其计算效率高。这个表单是所有可以在 Keras 获取到的不同种类的激活功能。我们同时也增加了第二个卷积层,目的是作第一层的镜像。如果为了提高效率而重写程序的话,我们应该创建一个模型生成器,然后做一个for循环来创建我们想堆叠的层数。但在这个例子中,我们只需要从上面剪切和黏贴层,为了方便而违背了 Python 的 zen 规则(/?PythonPhilosophy)。model.add(Convolution2D(nb_filters,kernel_size[0], kernel_size[1]))model.add(Activation('relu'))model.add(Convolution2D(nb_filters,kernel_size[0], kernel_size[1]))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=pool_size))model.add(Dropout(0.25))最后,我们增加了密集层以及更多的中途退出层,然后把所有的特征图平铺。model.add(Flatten())model.add(Dense(256))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))我们在最后一层使用名叫 Softmax 的激活值,因为它定义类以外的概率分布。权重之前我们曾简单的说了一下什么是权重,但是现在,我们会更深层次的探讨一下。权重是各种神经元之间的连接强度。在我们的大脑中,也有类似权重的存在。在人类大脑中存在一系列的生物神经元,这些神经元相互连接,会有电信号或化学信号从中流过。但这些连接不是静态的。随着时间的流逝,有些连接变强了,而有些连接则变弱了。两个生物神经元中流过的电化学信号越多,连接就变得越强。本质上,当你的大脑有新体验的时候,它会不断的给自己发送信息。通过加强神经元之间的链接,为你的种种体验的记忆、感觉和想法编码。基于神经网络的计算机同样受到了生物个体的启发。我们可以把他们叫做人工神经网络(Artificial Neural Networks)或简单的叫 ANN。通常当我们说“神经网络”的时候,我们真正想表达的其实是 ANN。ANN 不能像生物个体功能那样准确,所以,不要错误的理解 ANN 是一种模拟人脑。这是不对的。例如在生物神经网络(BNN)中,并不是所有的神经元都与其他神经元连接在一起,而 ANN 某一层中的神经元通常是与下一层的神经元相连接的。下图是 BNN 的图像,显示了各种神经元之间的连接情况。注意:不是所有神经元都有与之连接的神经元。尽管有很多不同,在 BNN 和 ANN 间仍然有很多相似的地方。就像你脑中的神经元会形成强连接或弱连接,在人工神经网络中权重决定着神经元间的连接强度。每个神经元仅了解世界的一小部分。当把它们集合到一起的时候,串在一起的神经元会拥有了一个更为综合而又全面的世界观。我们认为,相对较强的连接是解决问题时更为重要的部分。让我们看一些关于神经网络游乐场的截图,一个可视化的 TensorFlow 会帮我们理解得更容易。第一个网络展示的是一个简单的六层系统。这个网络要做的是在图片最右侧位置将橘色的点和蓝色的点清清楚楚的分开。它正在寻找一种最好的模式,以高度准确的将两种颜色的点分离开来。我还没有开始对系统进行训练。因为我们明白,神经元间的权重基本相同。细虚线之间是弱连接,粗虚线之间是强连接。在开始的时候,利用随机权重对网络进行初始化。现在看一下我们训练过的网络。首先我们看一下最右边的图片。现在蓝色点都集中在了中间的区域,橘色点环绕在图片的其他位置。正如你所看到的,分离情况高度准确,非常好。这大概花费80个“纪元”或者训练周期。同时请注意,很多权重在各式神经元中存在诸多蓝色虚线。权重增加了,现在系统被训练出来了,已经准备好接纳世界了。训练我们的神经网并优化它现在让我们的模型尝试一下数字吧。为了能实现目标,我们对模型进行了编译并赋予了它优化功能。 馆藏&55674
TA的最新馆藏
喜欢该文的人也喜欢

参考资料

 

随机推荐