论机器学习的正确学习姿势

2020 年 3 月 27 日

论机器学习的正确学习姿势

很多开发人员并没有机器学习的背景,在机器学习如火如荼的今天,没学过机器学习的开发人员要怎样才能学会机器学习呢?Caleb Kaiser 为我们带来了他的学习建议。


本文最初发表在 Towards Data Science,经原作者 Caleb Kaiser 授权,InfoQ 中文站翻译并分享。


如果你是一名开发人员,你可能至少对机器学习有一点兴趣。若能够靠着自学就掌握预测的算法概念,真的有点酷。


然而,如果你真的下定决定去学习机器学习,并遵循典型的入门建议开始学习的话,那么,在放弃学习机器学习之前,你很可能需要花上两个星期来学习线性代数和多元微积分。


原因在于,大多数机器学习的入门资料并不是为开发人员编写的,而是面向机器学习研究人员,这对于那些只是想用机器学习来开发产品的开发人员来说,是个问题。


你是想做产品,还是想做研究?


在 2000 年代后期之前,机器学习或多或少只是一个研究问题而已。当时,并没有多少公司在生产中以有意义的方式来使用机器学习。


因此,许多机器学习的入门资料都是从这个研究角度来编写的。这些入门资料都首先从数学的角度解释神经网络,解释机器学习背后的所有理论,比如反向转播和对抗网络。


即使是非大学的附属资料在某种程度上也遵循了这种模式。例如,这是直接摘自 TensorFlow 的《初学者快速入门》(Quickstart for Beginners)的一段:


来源:https://www.tensorflow.org/tutorials/quickstart/beginner


losses.SparseCategoricalCrossentropy 损失采用 logits 的向量和 True 索引,并为每个示例返回一个标量损失。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

该损失等于真实类的负对数概率:如果模型确定了正确类别,则为零。

这个未经训练的模型给出了接近随机的概率(每个类的概率为 1/10),因此初始损失应该接近 -tf.log(1/10) ~= 2.3

loss_fn(y_train[:1], predictions).numpy()


如果你觉得我在用诘屈聱牙的语言,那请你阅读整篇文章看看。


如果你已经熟悉机器学习背后的数学知识,或者对学习机器学习很感兴奋,那么这种方法对你来说是可行的。但是,如果你主要是想用机器学习来开发某种东西的话,那么,这就可能并不是你想要的学习方法了。


想要用推论的方法来学习编程?这种方法就像是通过首先学习汇编语言来学习编写代码。实际上,没有哪一个开发人员是这样学习的。


注意:如果你以某种方式学会了使用汇编语言编写代码,我会接受你愤怒的评论,并且令我印象深刻的是,你能够在任何晦涩的 Linux 发行版上安装浏览器。


当你学习编程时,你很可能是通过使用高级语言编写 “hello world” 来学习的。然后,随着一点一点地向项目引入复杂性,你可以根据需要去学习越来越多的底层编程。


这种学习模式在开发软件的人中很成功,因为它优先考虑的是开发内容,如果你对开发推荐引擎比发表论文更感兴趣的话,那么这就是你应该如何学习机器学习的方法。


如何通过开发软件来学习机器学习


如果你是那种通过学习课程学习效果最好的人,那么最好的资源,或许也是这种自上而下,边做边学的机器学习方法最积极的倡导者,就是 Fast.ai 的《程序员实用深度学习课程》(Practical Deep Learning For Coders)。


或者,如果你是那种通过自己钻研并自己动手来学习效果最好的那类人,那么开始学习机器学习和学习其他编程领域是一样的。我整理了一份庞大的项目列表,这些项目都是对初学者友好的自然语言处理项目,你可以看看,选择一个你感兴趣的项目,然后加入进来。


如果你正是这样学习的,那么熟悉使用机器学习开发的好方法是:


  1. 确定一个目标,比如,开发一个文本自动完成器,或者一个车牌识别器。

  2. 找到适合你的项目的预训练模型,如 GPT-2 或 YOLOv3,这两个分别适用于上面提到的两个项目。

  3. 如果你喜欢的话,甚至还可以使用 gpt-2-simple 之类的库来微调(根据你自己的数据定制)你的模型。

  4. 最后,将模型部署为微服务。


一旦你将模型部署为 API,就可以像查询任何其他 Web 服务一样对其进行查询,并围绕它开发应用程序。


通过这种方法,你可以了解各种流行的模型架构和机器学习方法,以及它们适用于哪些应用程序。同样重要的是,你将会了解机器学习基础设施,这对于从模型中开发真正的产品至关重要。


开发与理论学习并重


如果你是一名工程师,你以前可能实现过某种形式的身份验证,这意味着你(希望如此)对密码进行了哈希处理。


在设置密码哈希时,你是否编写了自定义的哈希算法?你花了几个礼拜的时间去学习密码学?还是你只不过是使用了 bcrypt 而已?


类似的,当你开发你的第一个 Web 应用程序时,你是否花了几个星期的时间来学习数据库?你是自己从零开始编写程序的吗?还是使用了你最喜欢的框架附带的任何 ORM?


同样的逻辑也适用于机器学习。如果你是那种喜欢开发软件的人,那么可以从使用机器学习开发软件开始,让工具、预训练模型和机器学习框架抽象出机器学习的基本理论。然后,如果你很好奇,或者你的项目需要更多的复杂性,就深入研究,看看机器学习是如何工作的。


免责声明: 以下内容是基于我对机器学习团队的观察,而不是对该行业的学术调查。利益相关:我是 Cortex 的贡献者,Cortex 是一个用于在生产环境中部署模型的开源平台。


作者介绍:


Caleb Kaiser,Cortex Lab 创始团队成员,曾在 AngelList 工作,最初在 Cadillac 供职。


原文链接:


https://towardsdatascience.com/dont-learn-machine-learning-8af3cf946214


2020 年 3 月 27 日 07:301401
用户头像
刘燕 InfoQ记者

发布了 471 篇内容, 共 147.0 次阅读, 收获喜欢 831 次。

关注

评论

发布
暂无评论
发现更多内容

冰河是谁?到底是干嘛的?

冰河

程序员 程序人生 架构师 冰河 冰河技术

Dubbo 微服务调用过程

梧桐

代理模式

soolaugust

设计模式 代理模式 七日更

第五周 技术选型作业

简简单单

第十周总结

孤星

第八周-学习总结

Mr_No爱学习

架构训练营第九周作业

一期一会

微服务 dubbo

架构师训练营第十四周课程笔记及心得

Airs

Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory

程序员小航

spring 源码 源码阅读

Code Review实践

HQ数字卡

Code Review 七日更

第十周作业

孤星

计算机专业必看!记录一次腾讯Android岗面试笔试总结,讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

日本准备推行AI婚配,年轻人会为“爱情算法”买单吗?

脑极体

第 10 周作业

Steven

训练营第十周总结

大脸猫

极客大学架构师训练营

架构师技能图谱

天天向上

极客大学架构师训练营

行业寒冬:程序员怎样优雅度过35岁中年危机?跳槽薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

通达快递产品架构设计

天天向上

极客大学架构师训练营

提问开启创新-激发团队创新的提问法

Alan

个人成长 创新 团队文化 28天写作营 七日更

第五章学习总结

简简单单

第 10 周 系统架构作业

心在那片海

NO.002-Java并发编程之多核硬件架构

葛一凡

操作系统 设计原则 硬件架构

TypeScript | 第七章:配置文件说明

梁龙先森

typescript 前端 编程语言 七日更

架构师训练营第二期 Week 10 总结

bigxiang

极客大学架构师训练营

第八周-作业1

Mr_No爱学习

讲的真透彻!Android开发了解这些自然无惧面试,成功入职阿里

欢喜学安卓

android 程序员 面试 移动开发

工具词典:数据

lidaobing

数据 28天写作营

wildfly 21中应用程序的部署

程序那些事

程序那些事 wildfly wildfly21 应用程序部署 应用程序配置

架构师训练营第二期 Week 10 作业

bigxiang

极客大学架构师训练营

训练营第十周作业

大脸猫

极客大学架构师训练营

第 10 周 系统架构总结

心在那片海

论机器学习的正确学习姿势-InfoQ