做为普通Ruby开发,我如何从零转型机器学习

1. 不要担忧

假设你对数学不怎么感冒,就我我的而言,八年前,我从理工学院毕业以后,就再也没有碰过数学教科书了(至少在我开始学习深度学习以前是这样)。你要知道它到底是怎么回事:你阅读语言、框架文档的频率可比其余任何东西高多了。node

通过一些初步的 Google 搜索,并与周围的数学高手交谈以后,我获得一种印象,如下罗列的是你在尝试用神经网络解决现实问题以前就须要积累的数学知识。至少,我两年前的印象是这样的:  程序员

  • 掌握线性代数。web

  • 熟悉几率论。面试

  • 学习全部经典的机器学习概念,从线性回归开始。算法

  • 学习如何使用 Python、C、C++、或 Java 实现全部这些算法。编程

  • 学习如何处理数据集,提取特征、参数微调以及发展直觉,了解哪一种特定算法适合手头的任务。数组

  • 熟悉深度学习框架 / 库(我那会儿是 Theano 和 Torch 的天下,如今多是 PyTorch、TensorFlow 和 Keras 大行其道)。服务器

据一些专家说,只有掌握上述提到的全部知识以后,你才可以解决一些实际的问题,好比区分猫和狗。网络

若是你的状况与我相似,上面的清单就足以让你产生畏难情绪,并致使拖延症发做。app

不过别担忧!虽然从技术上来讲,上述列表中全部的内容都是适用的,但这些并不是入门级要求。若是你知道如何编程,那么你就已经知道如何训练模型。

2. 记住,它仍然是代码

看看这段代码:

图片

从这段代码中,你能获得什么信息呢?

  • 这是一段用 Python 编写的代码。

  • 它使用了 fastai 深度学习库。

  • 它只有三行(不包括 import)。

  • resnet34 在这里彷佛很重要。经搜索以后,咱们知道了缘由:https://www.kaggle.com/pytorch/resnet34/home

这是来自 Jermy Howard 教授的 fast.ai 课程中的一个例子,这门课程很棒,并且免费。Jeremy 倡导的理念是:从预先准备好的抽象概念开始,只有通过一些实践练习后,才能深刻挖掘。

上面的代码调整了预训练的图像分类模型(在 ImageNet 上训练,大约 1500 万张图像的数据集),这样它就能够解决前面提到的 Dogs vs. Cats 任务。它在短短三个轮数以内(经过数据传递)就达到了 98% 的准确率。在配备 GPU 的计算机上进行训练须要 17 秒钟。这些结果使长久以来未能解决一样问题的尝试获得迎刃而解。

固然,别看只有短短三行代码,要知道这三行代码背后凝聚了多年的研究、数十篇学术论文和数千小时的反复试验。但这些都是你如今可用的几行代码。一旦你掌握了为你本身的用例对图片进行分类(并在生产中进行使用)的要点,那么就跟区分猫和狗没有什么区别了。

3. 找一个合做伙伴

我更愿意将本身视为一个勤劳的人,一个善于学习的人。做为一名初出茅庐的程序员,我是从微软产品开始接触 C# 和.NET 的。不久以后,我就发现了 Ruby 的美和表现力,并转投到 Rails 中,最终成为了一名优秀的 Ruby 程序员,并经过 Evil Martians 为初级开发人员而设的面试挑战。我在一家之内部项目起家的初创公司很快升任为 CTO。同时,我还开发了一些 Ruby gems(gon 在 Rails 社区中很是受欢迎),在会议上发言,在最佳实践方面为开发人员提供一些指导,当你是 Evil Martians 团队的一员时,一切照旧。固然,我也相信改变观点的好处。在使用 Ruby 全职工做期间,我还涉足了 C++、Haskell。JavaScript 以及有些晦涩难懂的 Eve。

在个人业余时间里,我喜欢弹低音大提琴和吉他,还喜欢画油画、冲浪。

尽管如此,拖延症对我来讲也不是什么新鲜事:在我工做效率很低的时候,我常常追剧,把时间浪费在 MMORPG(Massive Multiplayer Online Role Playing Games,大型多人在线角色扮演游戏)以及奇幻小说上,毕竟我是个书呆子。

当我准备涉足机器学习,尤为是深度学习时,我和我朋友那会儿正是《风暴英雄》(Heroes of the Storm)多人在线竞技游戏的玩家。

为了让本身在通往新知识的漫长道路上迈出第一步,我必须与一样梦想着人工智能的朋友达成协议。咱们决定一块儿治愈拖延症,参加相同的课程,互相督促学习。如今咱们常常一块儿参加比赛。

若是你的线下朋友都不肯意和你一块儿学习,那么互联网就是你的朋友:网上有不少地方,你能够找到其余初学者一块儿学习。

AI 前线注:网上有不少这样的地方,如 http://u6.gg/eH96j、http://u6.gg/eH96U、http://u6.gg/eH97m 等,都是值得一去的地方。

4. 避免认知超载

众所周知,学习太难的东西是一种使人沮丧的经历。做为人类,咱们有信心避免沮丧。与此同时,学习太容易的东西也不会让你满意:你很快就会失去任何动力。关键是要尽量的咬牙坚持下去。

我参加的第一个在线课程是 Udacity 的 Deep Learning Nanodegree(深度学习纳米学位):这是一个昂贵的计划(如今 999 美圆,我当时花了大约 400 美圆),承诺为期四个月的理论入门以及将所学知识应用于现实世界所需的实践。做为奖励,修完这门课程后,参加 Self-Driving Cars Nanodegree(无人自驾车纳米学位)的在线课程能够享受折扣。

AI 前线注:纳米学位(Nanodegree)是美国出现的新型学位凭证,这一类凭证专为企业定制并输送专门人才,能实现定制型人才的快速就业,它具备针对性强、技术难度不高、就业快捷、市场需求量大等特色。Deep Learning Nanodegree 见 http://u6.gg/eH9Cd。Self-Driving Cars Nanodegree 见 http://u6.gg/eH9EB。

我错在深陷其中,不能自拔。首先,没有覆盖到个人基础。当我对课程中提到的一些概念感到吃力时,我就惶恐不安,开始阅读网上所能找到的一些:文章、书籍和其余课程。

结果,我没法专一于本应给我打下基础的资料。过后看来,我强烈建议你坚持学习一门课程,而不是同时学习多门课程。毕竟,人类在多任务处理方面的能力是出了名的差。

若是我如今开始的话,我会先看看 Jeremy Howard 的 fast.ai,前面我已经提过,还有 Andrew Ng 最新的 Coursera(有个证书费用,但你可免费得到)。它包含五门课程:从神经网络概述、深度学习、经过发现卷积神经网络(对处理图像数据相当重要),到序列模型(语音识别、音乐合成、任什么时候间序列数据)。

第二门课程更侧重于理论,而第一门课程强调的是“快速而随性”的实现,我认为这是最好的入门方法。只要记住调整本身的步调,避开同时处理多任务,并采起一些较小的步骤。

5. 设定目标

不要试图一次学完全部的东西,要试着选择那些使用深度学习技术可以给你我的带来满意结果的领域。处理与你相关的事情(而非处理随机抽象数据点),会让你保持积极性。你须要一个反馈循环,一种从实验中得到实际结果的方法。

如下是启动项目的一些想法:  

  • 若是你热衷视觉艺术(如电影、摄影、视频、美术等),那就去钻研计算机视觉吧。神经网络用来对图像上的对象进行分类,突出显示感兴趣的区域(如核磁共振扫描的异常或道路上的行人),检测肖像的情感或年龄,艺术风格迁移,甚至生产原创艺术品(http://u6.gg/eHAa6)。  

  • 若是你对声音更感兴趣,你能够像 Spotify 那样(http://u6.gg/eHBaa、http://u6.gg/eHBab),用神经网络进行谱曲(http://u6.gg/eHAXs)、分类和推荐新曲目。或者,你能够探索语音风格的转换,并加装用别人的声音说话(http://u6.gg/eHBbp)。  

  • 若是你喜欢电子游戏,你必定要看看强化学习。你能够训练一个游戏智能体,在你最喜欢的游戏中超越你本身的表现。并且,你能够用智能体进行电子游戏,没有人会所以责怪你,由于你懂得,以研究的名义。  

  • 若是你热衷于用户体验和客户支持,请参阅天然语言处理和聊天机器人,这样你就能够在必定程度上自动化地与客户进行交流:从聊天内容揣测客户的意图,对支持票证进行分类,为大多数常见问题提供即时答案。

在尝试计算机视觉领域以后,我和朋友将注意力转向了自动语音识别(Automatic Speech Recognition,ACR)和天然语言处理。看看行业巨头(Google、Apple 等)支持的无人驾驶汽车项目,就知道计算机视觉如今多是资金最多的研究领域,也是深度学习技术巩固地位的领域:在图像分类这块,神经网络预测的准确率从 2010 年低于 75% 增加到 2018 年的 98%。

另外一方面,与语言相关的挑战(尤为是那些与书面语言有关的挑战),最近才开始从神经网络中受益。目前最热门的领域是机器翻译(Machine Translation,MT)。人们可能会注意到,Google 翻译的质量在过去几年来有了很大的提升。自 2015 年以来,深度学习在其中起到了重要的做用(详见 http://u6.gg/eHBdX、http://u6.gg/eHBdY)。

注:形成这种延迟的主要缘由是硬件限制:机器翻译任务须要大量的内存和处理能力来训练大型神经网络。

要想知道深度学习改变一个几十年来未见重大进展的研究领域的速度有多快,看看下面一个有趣的事实就知道了:

机器翻译竞赛中首次出现神经网络的影子,仅仅就在三年前的 2015 年。到了 2016 年,机器翻译竞赛中 90% 的竞争者都是基于神经网络。

从关于这个主题的学术论文中能够提取大量的知识,并应用到现实世界的任务中,特别是若是你的初创公司与文本(和 Amplifr)相关的话。

若是这些可以说服你本身尝试将深度学习应用到天然语言处理,那么请看看 Stanford 的 CS224n 课程:“Natural Language Processing with Deep Learning”(用深度学习进行天然语言处理)(https://web.stanford.edu/class/cs224n/)。你没必要非得是斯坦福大学的学生才能学习这门课程,全部的讲课视频均可以在 YouTube 上找到。若是你在小组讨论中取得最佳进展,那么就可使用社交新闻网站 Reddit 专为该课程开设的整个子版块(https://www.reddit.com/r/CS224n/),在这里你能够找到同窗这门课程的在线学习伙伴。

6. 竞争力

机器学习领域本质上是充满了竞争的。全球最大的数据科学家和机器学习从业者的社区 Kaggle,早在 2010 年就将***马拉松的精神引入了这一学术领域。从那时起,解决机器学习任务的竞争方式就成为了标准作法。从 Microsoft 到 CERN(欧洲核子研究组织)的公司和机构都为解决挑战提供了奖励,以换取免版税的许可,让他们可使用获奖做品背后的技术。

机器学习竞赛是评估你技能的最佳方式,可以让你在某个领域得到“基准线”的感受,从更高级的竞争对手那里得到灵感,找到同事合做,并且还能让你在机器学习领域中名扬天下。

参加竞赛是机器学习业余从业者的必经之路。对我和朋友来讲,认识到这一点是在 2017 年,也就是咱们开始自学的那一年。咱们在 Kaggle 选择了 Understanding the Amazon from Space(在太空中了解亚马逊)竞赛项目(http://u6.gg/eHBjM),由于这是咱们进行多分类图像分类的机会(咱们也关心环境)。两个多月以来的每一个周末,咱们都在解决这个任务:从卫星图像中检测森林砍伐状况,并区分其缘由。

另外一个迹象代表,全部与深度学习相关的事情都在迅速发展:一年前,咱们花了大量的时间和精力设法让 Google Cloud Platform 以更低的成原本运行咱们的实验。到了今天,Google 提供了一个免费的 GPU 支持的 Jupyter notebook 环境(http://u6.gg/eHBmT),而且有不少服务能够用来训练你的模型(https://www.paperspace.com/、https://www.floydhub.com/)。

咱们虽然没有拿到奖品,但咱们在排行榜上位列前 15%(这没有什么可吹嘘的),在书中列举了每一个初学者会犯下的错误,这些经验都是无价的:咱们得到了继续努力的信心,并选择下一场竞赛,此次是天然语言处理的领域。

开发问答系统的挑战是由一家俄罗斯主要银行主办(http://u6.gg/eHBqW),竞争者必须使用一个由著名的 SQUAD 精神建立的独特数据集(斯坦福大学的阅读理解数据集,由志愿者基于维基百科文章集建立的 15 万个问题组成)(http://u6.gg/eHBrG),但这一次是俄文版的。

注:俄语是一种形态丰富的语言,在天然语言处理研究中被认为资源不足,更多详情请参阅此论文:http://worldcomp-proceedings.com/proc/p2015/ICA7022.pdf

这个任务是训练一个系统,回答基于一段文字的问题。这个模型能够在 Docker 容器中提交(RAM 被限制为 8GB),它应该可以在一个以天然语言提问的问题中突出显示文本段落中的相关部分。由于在最具挑战性的比赛中,常常会出现这种状况,所以咱们不得不提交未经训练的模型,而是一个解决方案,必须在两个小时的机器时间内彻底训练并给出测试问题的答案(为确保公平竞争,测试数据集仅部分公开)。

咱们的解决方案在公共排行榜上位列亚军,但咱们太过专一于解决任务,忘记正确阅读竞赛规则:他们说团队合做是禁止的,只接受我的参赛项目。咱们不得不全盘招供,并得到了“安慰奖”铜奖(这一奖项有点像戛纳电影节的奖项,当电影做为“非竞赛片”展映时)。

咱们很幸运地避免了被取消比赛资格的厄运,但咱们汲取了教训。如今,我强烈建议你们参赛时不要冲动,必定要花点时间仔细阅读竞赛规则。

因为我对深度学习的兴趣主要是以生产为导向的(提出解决方案,能够应用于个人创业公司的实际需求),我还注意到,查看排行榜可让你很好地了解“接近生产”的程度。顶级的解决方案一般是学术性的,还没有作好准备进行商业部署。而银奖、铜奖以及后面的一些解决方案一般是最有但愿的应用。

7. 随时了解动态

深度学习领域不断发展的步伐有两面性:有好处也有坏处。甚至这篇文章(做为介绍性质的、我的的和非学术性的)在发表以前可能在某些方面就已通过时了。

保持最新状态的最佳方式,就是加入到拥有大量机器学习爱好者的大型在线论坛。若是你了解俄语,那么必定要加入 Open Data Science(开发数据科学社区,http://ods.ai/):拥有超过 12000 名用户和 140 多个公共频道的公共 Slack 服务器。经过 Reddit 的 r/MachineLearning 子版块或 Meetup.com,总能找到更小的、更多的本地群组。

创建一个 Twitter 订阅源(http://u6.gg/eHCAU)和邮件订阅(http://u6.gg/eHCB7)对于随时了解动态也是相当重要的。你还能够把时间投入到世界各地举办的各类线下新兵训练营中。

曾经我觉得西班牙的夏令营就是冲浪的,直到我参观了 Bilbao 的 International Summer School on Deep Learning(深度学习国际暑期学校,http://grammars.grlmc.com/DeepLearn2017/)以后方知并不是如此。这是一个草率的决定,但我并不后悔:它彻底适合个人水平(我当时加入这个领域有一年了)。在缺少实践的状况下,这所学校更像是一个会议,虽然是一个很是紧张的会议:天天上午九点到下午六点,连续五天。整个会程安排被分红了几个部分,每一个演讲者都要进行三场为期一个半小时的演讲。

一旦你感到更有自信的话,那就试着参加关于人工智能、机器学习和深度学习的主要会议之一:ICLR(https://iclr.cc/),今年我就有幸参会。其余值得关注的国际会议是 VCPR(特别是计算机视觉)(http://cvpr2018.thecvf.com/)和 NIPS(https://nips.cc/)。

8. 使用你的编程技能

咱们必须认可一个显而易见的事实:Python 彻底赢得了人工智能和数据科学社区的支持。在今天,可能没有理由从一种不一样的语言开始,除非你真的很擅长这门语言,或者你计划处理一些很是低级的优化。

对我来讲,做为一名 Ruby 开发人员,切换到 Python 真的是一种简单、愉快的体验。你只需几个礼拜的练习(以及学习数组索引技巧和理解(http://u6.gg/eHCEP))就可让本身感受舒服一些。可是,我仍是花了一些时间来完成一个免费的中级 Python 编程课程,固然,上这种课没有什么坏处。

对于软件工程师来讲,语言“障碍”并非什么问题。但对于非编程背景的爱好者来讲,进入深度学习领域很难。所以,你已经领先一步了。

可是,你不要期望一些优秀的 OOP 代码和直观的 API。大多数公共代码示例在个人团队中也不能经过严格的代码审查。这与软件工程无关,毕竟,这是关于数学的:矩阵乘法须要先把矩阵相乘,干净的领域特定语言(Ryby 让你习惯优秀的 DSL)老是过后才会考虑的事情。

AI 前线注:领域特定语言(domain-specific language,DSL),指的是专一于某个应用程序领域的计算机语言。又译做领域专用语言。详见 https://en.wikipedia.org/wiki/Domain-specific_language

即便在同一个库中,相同的功能也能够有不一样的 API。使用 np.ones((2,3))(取一个元组)来建立一个 1 的数据(http://u6.gg/eHCFf)彷佛使人困惑,同时使用两个单独的证书参数建立相同形状的随机数的数组(http://u6.gg/eHCFM):np.random.randn(2,3)。

另外,不要对文档或风格抱有过高的指望。一旦你在将学术论文翻译成代码时遇到了一些重要的细节,你将不得不阅读库的源代码,并且这并不容易。测试覆盖率也常常不足。

然而!这是一个很好的利用你最佳编程实践的机会:你能够自由地使用公开的 Jupyter notebook 制做优秀的可重用库(http://u6.gg/eHCGJ)。

9. 最后,复习一下你的数学

固然,我把最好的心得经验留在最后。最终,你将不得不缩小你的数学差距。特别是若是你在了解了本身的基础知识以后,愿意站在前沿并关注学术出版物的话。

幸运的是,机器学习也有它本身的“圣经”,由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 所著的一本长达 800 页的大块头教科书《Deep Learning (Adaptive Computation and Machine Learning)》(深度学习)。好消息是,这本书能够在网上免费下载!下载网址为:http://www.deeplearningbook.org/

该书的第一部分(线性代数、几率论和信息论,数值计算,机器学习基础知识)是最基本、最简单的部分,属于介绍性质的。使人惊讶的是,当你继续跟进当前的研究时,它已经不那么使人生畏了。是的,这是长达 130 页的阅读,虽然谈不上清闲,但你绝对不会后悔阅读这部分的内容。

我但愿读者们可以从这篇文章中,感觉到我对深度学习的热情,让这一领域对我这样来自应用编程的人来讲显得平易近人。我真的相信,随着人工智能和深度学习的进展,这个世界正在接近另外一个“电灯泡时刻”,是的,我指的就是爱迪生发明的那盏灯泡。

像你我这样的“充满好奇心的软件开发者”,将是这场已经开始的革命背后的主要推进力。也许,你并不彻底处于科学的前言(不然你可能不会读到这篇文章),但你有能力实现学术界的最佳创意,那么,每次一个应用,就是咱们改变世界的方式。

因此你继续前进吧!你可阅读文章中以及文末我列出的一些资源,创建你的信心,让咱们开始踏上人工智能征途吧!