[关闭]
@sambodhi 2018-09-30T11:35:03.000000Z 字数 11265 阅读 2772

Ruby开发者的深度学习自学笔记

作者|Alexey Gaziev
译者|Sambodhi Liou
编辑|Vincent Chen

AI前线导读:本文讲述的是一名软件工程师踏上机器学习漫漫不归路的故事。Alexey Gaziev,是Amplifr(https://amplifr.com/)的首席技术官,分享了他从Ruby开发者转型到深度学习爱好者的历程中所取得的心得经验,并为我们提供了如何从零开始学习深度学习,并充分利用改变人生的经验技巧。今天这篇文章由作者Alexey Gaziev授权在AI前线翻译发布。

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

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

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

AI前线注:关于人工智能是新能源的言论,出自Andrew Ng: Why AI Is the New Electricity,详见http://u6.gg/eH8cp

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

大家好,我叫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”字母,如“网络”)都属于深度学习。

AI前线注:RNN详见http://u6.gg/eH8Rw;CNN详见http://u6.gg/eH8RX;DBN详见http://u6.gg/eH8Sp;DQN详见http://u6.gg/eH8Tq

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

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

1. 不要担心

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

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

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

AI前线注:Dogs vs. Cats和Cats Redux都是Kaggle上著名的图像分类大赛。Dogs vs. Cats详见http://u6.gg/eH9sg;Cats Redux详见http://u6.gg/eH9sP
区分猫和狗可参阅fast.ai在线课程Lesson 1:Deep Learning 2018的第一节Recognizing Cats and Dogs:https://course.fast.ai/lessons/lesson1.html

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

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

2. 记住,它仍然是代码

看看这段代码:

  1. # a bunch of Python imports like:
  2. from fastai.imports import *
  3. data = ImageClassifierData.from_paths("./dogscats", tfms=tfms_from_model(resnet34, 224))
  4. learn = ConvLearner.pretrained(resnet34, data, precompute=True)
  5. learn.fit(0.01, 3)
  6. # Wait 17 seconds or so...

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

这是来自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。

AI前线注:gon的GitHub项目地址:https://github.com/gazay/gon;Eve官网:http://play.witheve.com/

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

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

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

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

如果你的线下朋友都不愿意和你一起学习,那么互联网就是你的朋友:网上有很多地方,你可以找到其他初学者一起学习。

AI前线注:网上有很多这样的地方,如http://u6.gg/eH96jhttp://u6.gg/eH96Uhttp://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

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

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

AI前线注:见Who Multi-Tasks and Why? Multi-Tasking Ability, Perceived Multi-Tasking Ability, Impulsivity, and Sensation Seeking一文:http://u6.gg/eH9KR

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

AI前线注:
Andrew Ng的在线课程Deep Learning Specialization:http://u6.gg/eH9SX
概述:http://u6.gg/eH9Uf
卷积神经网络:http://u6.gg/eH9UD
序列模型:http://u6.gg/eH9Vx
时间序列(time series)是一组按照时间发生先后顺序进行排列的数据点序列。通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,12小时,7天,1年),因此时间序列可以作为离散时间数据进行分析处理。时间序列广泛应用于数理统计、信号处理、模式识别、计量经济学、数学金融、天气预报、地震预测、脑电图、控制工程、航空学、通信工程以及绝大多数涉及到时间数据测量的应用科学与工程学。

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

5. 设定目标

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

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

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

另一方面,与语言相关的挑战(尤其是那些与书面语言有关的挑战),最近才开始从神经网络中受益。目前最热门的领域是机器翻译(Machine Translation,MT)。人们可能会注意到,Google翻译的质量在过去几年来有了很大的提高。自2015年以来,深度学习在其中起到了重要的作用(详见http://u6.gg/eHBdXhttp://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页的阅读,虽然谈不上悠闲,但你绝对不会后悔阅读这部分的内容。


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

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

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

有用的资源:


原文链接: Learning how to learn deep learning
https://evilmartians.com/chronicles/learning-how-to-learn-deep-learning

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注