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

让我们从描绘想象的肖像开始,看看你是否认出了你自己,还是你所认识的人。

你是一名软件工程师,每天都与代码打交道,构建复杂的东西,将业务需求转化为应用程序的逻辑,并按时交付。你尝试过不同的编程开发语言,并选择了你趁手的兵器。你对自己的工作充满了信心,并准备好去学习一些全新的东西,这些东西会赋予你新的能力,让你在这个职业中与时俱进。

关于人工智能是“新能源”的言论一直不绝于耳。得益于机器学习的进步,整个行业因此发生了变化。而最乐观的研究人员将人工智能的兴起比作工业革命。

这场革命贯穿你的生涯,你想投身其中。你想知晓有关人工智能、机器学习、深度学习的更多知识并进行实验,但你不知道应该从哪入手。

大家好,我叫 Alexey,两年前我就是上面描述的那种人。今天,我在 Amplifr 负责机器学习。Amplifr 是一家社交媒体管理初创公司,我担任首席技术官。我仍然密切关注“传统”的代码:毕竟我们的应用是基于 Ruby on Rails 开发的。虽然没有在我们的主要代码库上工作,但我参加了机器学习竞赛(最近在一个主要的 NLP 竞赛中获奖,http://u6.gg/eH8Cp),还参加了人工智能会议,阅读学术论文,每天进行实验并探索如何运用机器学习使 Amplifr 在竞争中脱颖而出。

AI 前线注:Ruby on Rails(官方简称为 Rails。也有人简称为 RoR,该缩写目前仍于一些中文讨论中被使用。),是一个使用 Ruby 语言写的开源 Web 应用框架,它是严格按照 MVC 结构开发的。它努力使自身保持简单,来使实际的应用开发时的代码更少,使用最少的配置。

一般的经验法则是,所有现代人工神经网络(RNN、CNN、DBN、DQN,总带有一个“N”字母,如“网络”) 都属于深度学习。

首先,让我们先澄清是非。“正确”地使用人工智能、机器学习和深度学习等术语是一个永无止境的争论话题,很快就会让初学者感到迷茫,无所适从。为了简单起见,我们将机器学习视为来自人工智能的一组工具,深度学习是它们的一个特定子集。在我这份笔记中,所有三个术语都可互换,但主要是在深度学习的背景之下。

刚入门机器学习的新鲜感犹如昨日,因此,我想给那些刚开始探索这一新领域的菜鸟们提供一些建议。

1. 不要担心

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

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

  • 掌握线性代数。

  • 熟悉概率论。

  • 学习所有经典的机器学习概念,从线性回归开始。

  • 学习如何使用 Python、C、C++、或 Java 实现所有这些算法。

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

  • 熟悉深度学习框架 / 库(我那会儿是 Theano 和 Torch 的天下,现在可能是 PyTorch、TensorFlow 和 Keras 大行其道)。

据一些专家说,只有掌握上述提到的所有知识之后,你才能够解决一些实际的问题,比如区分猫和狗。

如果你的情况与我类似,上面的清单就足以让你产生畏难情绪,并导致拖延症发作。

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

2. 记住,它仍然是代码

看看这段代码:

作为普通Ruby开发,我如何从零转型机器学习_第1张图片
image

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

  • 这是一段用 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 页的阅读,虽然谈不上悠闲,但你绝对不会后悔阅读这部分的内容。

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

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

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

有用的资源:

  • Deep Learning Book:http://www.deeplearningbook.org/

  • deeplearning.ai:https://www.deeplearning.ai/

  • Practical Deep Learning For Coders by Jeremy Howard:https://course.fast.ai/

  • Must-read blogs for AI and Deep Learning enthusiasts:https://blog.paralleldots.com/data-science/must-read-blogs-ai-deep-learning-enthusiasts/

  • Some email subscriptions to stay informed:https://becominghuman.ai/6-ai-subscriptions-to-keep-you-informed-4cfc6cb024a

  • Distill.pub:https://evilmartians.com/chronicles/%28https://becominghuman.ai/6-ai-subscriptions-to-keep-you-informed-4cfc6cb024a%29

  • A great recap of matrix calculus for deep learning:http://explained.ai/matrix-calculus/index.html

原文链接:

https://evilmartians.com/chronicles/learning-how-to-learn-deep-learning

原文

你可能感兴趣的:(作为普通Ruby开发,我如何从零转型机器学习)