你会给想学习机器学习的软件工程师提出什么建议?

你会给想学习机器学习的软件工程师提出什么建议?

这很大一部分都取决于这名软件工程师的背景,以及他但愿掌握机器学习的哪一部分。为了具体讨论,如今假设这是一名初级工程师,他读了 4 年本科,从业 2 年,如今想从事计算广告学(CA)、天然语言处理(NLP)、图像分析、社交网络分析、搜索、推荐排名相关领域。如今,让咱们从机器学习的必要课程开始讨论(声明:下面的清单很不完整,若是您的论文没有被包括在内,提早向您抱歉)。html

  • 线性代数
    不少的机器学习算法、统计学原理、模型优化都依赖线性代数。这也解释了为什么在深度学习领域 GPU 要优于 CPU。在线性代数方面,你至少得熟练掌握如下内容:前端

    • 标量、向量、矩阵、张量。你能够将它们当作零维、一维、二维、三维与更高维的对象,能够对它们进行各类组合、变换,就像乐高玩具同样。它们为数据变换提供了最基础的处理方法。
    • 特征向量、标准化、矩阵近似、分解。实质上这些方法都是为了方便线性代数的运算。若是你想分析一个矩阵是如何运算的(例如检查神经网络中梯度消失问题,或者检查强化学习算法发散的问题),你得了解矩阵与向量应用了多少种缩放方法。而低阶矩阵近似与 Cholesky 分解能够帮你写出性能更好、稳定性更强的代码。
    • 数值线性代数
      若是你想进一步优化算法的话,这是必修课。它对于理解核方法与深度学习颇有帮助,不过对于图模型及采样来讲它并不重要。
    • 推荐书籍
      《Serge Lang, Linear Algebra》
      很基础的线代书籍,很适合在校学生。
      《Bela Bolobas, Linear Analysis》
      这本书目标人群是那些想作数学分析、泛函分析的人。固然它的内容更加晦涩难懂,但更有意义。若是你攻读 PhD,值得一读。
      《Lloyd Trefethen and David Bau, Numerical Linear Algebra》
      这本书是同类书籍中较为推荐的一本。《Numerical Recipes》也是一本不错的书,可是里面的算法略为过期了。另外,推荐 Golub 和 van Loan 合著的书《Matrix Computations》
  • 优化与基础运算react

    大多数时候提出问题是很简单的,而解答问题则是很困难的。例如,你想对一组数据使用线性回归(即线性拟合),那么你应该但愿数据点与拟合线的距离平方和最小;又或者,你想作一个良好的点击预测模型,那么你应该但愿最大程度地提升用户点击广告几率估计的准确性。也就是说,在通常状况下,咱们会获得一个客观问题、一些参数、一堆数据,咱们要作的就是找到经过它们解决问题的方法。找到这种方法是很重要的,由于咱们通常得不到闭式解。android

    • 凸优化ios

      在大多状况下,优化问题不会存在太多的局部最优解,所以这类问题会比较好解决。这种“局部最优即全局最优”的问题就是凸优化问题。git

      (若是你在集合的任意两点间画一条直线,整条线始终在集合范围内,则这个集合是一个凸集合;若是你在一条函数曲线的任意两点间画一条直线,这两点间的函数曲线始终在这条直线之下,则这个函数是一个凸函数)github

      Steven Boyd 与 Lieven Vandenberghe 合著的书能够说是这个领域的规范书籍了,这本书很是棒,并且是免费的,值得一读;此外,你能够在 Boyd 的课程中找到不少很棒的幻灯片;Dimitri Bertsekas 写了一系列关于优化、控制方面的书籍。读通这些书足以让任何一我的在这个领域立足。web

    • 随机梯度降低(SGD)面试

      大多数问题其实最开始都是凸优化问题的特殊状况(至少早期定理如此),可是随着数据的增长,凸优化问题的占比会逐渐减小。所以,假设你如今获得了一些数据,你的算法将会须要在每个更新步骤前将全部的数据都检查一遍。算法

      如今,我不怀好意地给了你 10 份相同的数据,你将不得不重复 10 次没有任何帮助的工做。不过在现实中并不会这么糟糕,你能够设置很小的更新迭代步长,每次更新前都将全部的数据检查一遍,这种方法将会帮你解决这类问题。小步长计算在机器学习中已经有了很大的转型,配合上一些相关的算法会使得解决问题更加地简单。

      不过,这样的作法对并行化计算提出了挑战。咱们于 2009 年发表的《Slow Learners are Fast》论文可能就是这个方向的先导者之一。2013 年牛峰等人发表的《Hogwild》论文给出了一种至关优雅的无锁版本变体。简而言之,这类各类各样的算法都是经过在单机计算局部梯度,并异步更新共有的参数集实现并行快速迭代运算。

      随机梯度降低的另外一个难题就是如何控制过拟合(例如能够经过正则化加以控制)。另外还有一种解决凸优化的惩罚方式叫近端梯度算法(PGD)。最流行的当属 Amir Beck 和 Marc Teboulle 提出的 FISTA 算法_files/Breck_2009.pdf)了。相关代码能够参考 Francis Bach 的 SPAM toolbox

    • 非凸优化方法

      许多的机器学习问题是非凸的。尤为是与深度学习相关的问题几乎都是非凸的,聚类、主题模型(topic model)、潜变量方法(latent variable method)等各类有趣的机器学习方法也是如此。一些最新的加速技术将对此有所帮助。例如个人学生 Sashank Reddy 最近展现了如何在这种状况下获得良好的收敛速率

      也能够用一种叫作谱学习算法(Spectral Method)的技术。Anima Anandkumar 在最近的 Quora session 中详细地描述了这项技术的细节。请仔细阅读她的文章,由于里面干货满满。简而言之,凸优化问题并非惟一可以可靠解决的问题。在某些状况中你能够试着找出其问题的数学等价形式,经过这样找到可以真正反映数据中聚类、主题、相关维度、神经元等一切信息的参数。若是你愿意且可以将一切托付给数学解决,那是一件无比伟大的事。

      最近,在深度神经网络训练方面涌现出了各类各样的新技巧。我将会在下面介绍它们,可是在一些状况中,咱们的目标不只仅是优化模型,而是找到一种特定的解决方案(就好像旅途的重点实际上是过程同样)。

  • (分布式)系统

    机器学习之因此如今成为了人类、测量学、传感器及数据相关领域几乎是最经常使用的工具,和过去 10 年规模化算法的发展密不可分。Jeff Dean 过去的一年发了 6 篇机器学习教程并非巧合。在此简单介绍一下他:点击查看,他是 MapReduce、GFS 及 BigTable 等技术背后的创造者,正是这些技术让 Google 成为了伟大的公司。

    言归正传,(分布式)系统研究为咱们提供了分布式、异步、容错、规模化、简单(Simplicity)的宝贵工具。最后一条“简单”是机器学习研究者们经常忽视的一件事。简单(Simplicity)不是 bug,而是一种特征。下面这些技术会让你受益良多:

    • 分布式哈希表

      它是 memcacheddynamopastry 以及 ceph 等的技术基础。它们所解决的都是同一件事情 —— 如何将对象分发到多台机器上,从而避免向中央存储区提出请求。为了达到这个目的,你必须将数据位置进行随机但肯定的编码(即哈希)。另外,你须要考虑到当有机器出现故障时的处理方式。

      咱们本身的参数服务器就是使用这种数据布局。这个项目的幕后大脑是个人学生 Mu Li 。请参阅 DMLC 查看相关的工具集。

    • 一致性与通讯

      这一切的基础都是 Leslie Lamport 的 PAXOS 协议。它解决了不一样机器(甚至部分机器不可用)的一致性问题。若是你曾经使用过版本控制工具,你应该能够直观地明白它是如何运行的——好比你有不少机器(或者不少开发者)都在进行数据更新(或更新代码),在它们(他们)不随时进行交流的状况下,你会如何将它们(他们)结合起来(不靠反复地求 diff)?

      在(分布式)系统中,解决方案是一个叫作向量时钟的东西(请参考 Google 的 Chubby)。咱们也在参数服务器上使用了这种向量时钟的变体,这个变体与本体的区别就是咱们仅使用向量时钟来限制参数的范围(Mu Li 作的),这样能够确保内存不会被无限增加的向量时钟时间戳给撑爆,正如文件系统不须要给每一个字节都打上时间戳。

    • 容错机制、规模化与云

      学习这些内容最简单的方法就是在云服务器上运行各类算法,至于云服务能够找 Amazon AWSGoogle GWCMicrosoft Azure 或者 其它各类各样的服务商。一次性启动 1,000 台服务器,意识到本身坐拥如此之大的合法“僵尸网络”是多么的让人兴奋!以前我在 Google 工做,曾在欧洲某处接手 5,000 余台高端主机做为主题模型计算终端,它们是咱们经过能源法案获益的核电厂至关可观的一部分资源。个人经理把我带到一旁,偷偷告诉我这个实验是多么的昂贵……

      可能入门这块最简单的方法就是去了解 docker 了吧。如今 docker 团队已经开发了大量的规模化工具。特别是他们最近加上的 Docker MachineDocker Cloud,可让你就像使用打印机驱动同样链接云服务。

    • 硬件

      说道硬件可能会让人迷惑,可是若是你了解你的算法会在什么硬件上运行,对优化算法是颇有帮助的。这可让你知道你的算法是否能在任何条件下保持巅峰性能。我认为每一个入门者都应该看看 Jeff Dean 的 《每一个工程师都须要记住的数值》。我在面试时最喜欢的问题(至少如今最喜欢)就是“请问你的笔记本电脑有多快”。了解是什么限制了算法的性能是颇有用的:是缓存?是内存带宽?延迟?仍是磁盘?或者别的什么?Anandtech 在微处理器架构与相关方面写了不少很好的文章与评论,在 Intel、ARM、AMD 发布新硬件的时候不妨去看一看他的评论。

  • 统计学

    我故意把这块内容放在文章的末尾,由于几乎全部人都认为它是(它的确是)机器学习的关键于是忽视了其它内容。统计学能够帮你问出好的问题,也能帮你理解你的建模与实际数据有多接近。

    大多数图模型、核方法、深度学习等都能从“问一个好的问题”获得改进,或者说可以定义一个合理的可优化的目标函数。

这篇文章已经写的够久了,不知道有没有人能读到这里,我要去休息啦。如今网上有不少很棒的视频内容能够帮助你学习,许多教师如今都开通了他们的 Youtube 频道,上传他们的上课内容。这些课程有时能够帮你解决一些复杂的问题。这儿是个人 Youtube 频道欢迎订阅。顺便推荐 Nando de Freitas 的 Youtube 频道,他比我讲得好多了。

最后推荐一个很是好用的工具:DMLC。它很适合入门,包含了大量的分布式、规模化的机器学习算法,还包括了经过 MXNET 实现的神经网络。

虽然本文还有不少方面没有提到(例如编程语言、数据来源等),可是这篇文章已经太长了,这些内容请参考其余文章吧~


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOSReact前端后端产品设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划

相关文章
相关标签/搜索