机器学习哪能没有这些数学知识傍身啊!
点击上方关注,All in AI中国
作者:Vincent Chen
目前我们还不完全清楚开始机器学习需要达到什么样的数学水平,尤其是对于那些没有在学校学习过数学或统计学的人。
在这篇文章中,我的目标是提出创建产品或进行机器学习的学术研究所需的数学背景。这些建议源于与机器学习工程师、研究人员和教育工作者的对话,以及我在机器学习研究和行业方面的经验。
为了构建数学先决条件,我首先提出了不同的思维模式和策略,以便在传统的课堂环境之外进行数学教育。然后,我概述了不同类型的机器学习工作所需的具体背景,因为这些学科的范围从高中水平的统计和微积分到概率图形模型(PGM)的最新发展。在这篇文章的最后,我希望你能对数学教育有一个大致的了解。
关于数学焦虑的笔记
事实证明,很多人(包括工程师)都害怕数学。首先,我想谈谈"擅长数学"的奇事。
事实上,擅长数学的人通常会做大量的练习。但是,他们在做数学时很容易陷入困境。与先天能力相反,学生的心态是一个人学习数学能力的主要预测因素(如最近的研究所示https://www.theatlantic.com/education/archive/2013/10/the-myth-of-im-bad-at-math/280914/)。
明确地说,要达到这种舒适状态需要时间和精力,但这肯定不是你与生俱来的。本文的其余部分将帮助你确定所需的数学基础水平,并概述构建它的策略。
开始
作为先决条件,我们假设具有线性代数/矩阵演算的基本能力(http://cs229.stanford.edu/section/cs229-linalg.pdf)(因此你不会卡在符号上)和懂得概率(http://cs229.stanford.edu/section/cs229-prob.pdf)。我们还鼓励你具备基本的编程能力,我们支持将其作为在上下文中学习数学的工具。之后,你可以根据你感兴趣的工作类型来调整你的关注点。
如何在校外学习数学呢?我认为学习数学的最佳方式是有一份全职工作(比如作为一名学生)。在这种环境之外,你可能不会拥有学术课堂中的结构,(积极的)同伴压力和可用资源。
为了在校外学习数学,我建议你参加学习小组,学习研讨会来作为你学习的重要资源。在研究实验室中,可以以阅读小组的形式出现。在结构方面,你的小组可以浏览教科书章节并定期讨论课程。
文化在这里发挥着重要作用——这种"额外"的研究应该受到管理部门的鼓励和激励。事实上,尽管有短期成本,但在有同伴驱动的学习环境中可以使你更有效率。
数学和代码
数学和代码在机器学习工作流程中高度交织在一起。代码通常直接由数学直觉构建,它甚至共享数学符号的语法。事实上,现代数据科学框架(例如NumPy 链接:http://www.numpy.org/)使得将数学运算(例如矩阵/矢量积)转换成可读代码,使其变得直观和高效。
我鼓励你将代码作为巩固学习的一种方式。数学和代码都依赖于理解和符号的精确性。例如,实践损失函数或优化算法的手动实现(实践)是真正理解基础概念的好方法。
作为通过代码学习数学的一个例子,让我们考虑一个实际的例子:在神经网络中实现ReLU激活的反向传播(https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b)。作为简要的入门读物,反向传播是一种依赖于微积分的链式法则来有效计算梯度的技术。为了利用链式法则,我们将上游导数(upstream derivatives)乘以ReLU的梯度。
首先,我们将可视化ReLU激活(https://en.wikipedia.org/wiki/Rectifier_%28neural_networks%29),定义如下:
要计算梯度(直观地说,斜率),你可以想象一个分段函数,由指标函数表示如下:
NumPy为我们提供了有用而直观的语法——我们的激活函数(蓝色曲线)可以在代码中解释,其中x是我们的输入,relu是我们的输出:
接下来是梯度(红色曲线),其中grad描述了上游梯度:
在没有自己推导出梯度的情况下,这行代码可能无法解释清楚。在我们的代码行中,对于满足条件的所有元素,将上游梯度(grad)中的所有值设置为0,[h <0]。在数学上讲,这实际上相当于ReLU梯度的分段表示,当它乘以上游梯度时,它会将所有小于0的所有值压缩为0!
正如我们在这里看到的那样,通过我们对微积分的基本理解,我们可以清楚地理解代码。这个神经网络实现的完整示例可以在这里找到。(https://pytorch.org/tutorials/beginner/pytorch_with_examples.html)
有关制造机器学习产品的数学
为了介绍这一部分,我与机器学习工程师进行了交谈,以得出数学在调试系统时最有帮助的方面。下面是一些工程师们发现自己用数学见解回答问题的示例。希望本节将为你可能会发现的特定类型的问题提供一些背景信息!
•我应该使用什么样的聚类方法来可视化我的高维客户数据?
○方法:PCA与tSNE(https://stats.stackexchange.com/questions/238538/are-there-cases-where-pca-is-more-suitable-than-t-sne)
•如何针对"阻止"欺诈性用户交易来校准阈值(例如置信水平0.9对0.8?)?
○方法:概率校准(http://scikit-learn.org/stable/modules/calibration.html)
•要描述我的卫星数据对世界特定地区(硅谷与阿拉斯加)的偏差,最好的方法是什么?
○方法:公开研究问题。(http://blog.mrtz.org/2016/09/06/approaching-fairness.html)
通常,统计学和线性代数可以以某种方式用于这些问题中。但是,要获得满意的答案通常需要针对特定领域的方法。如果是这样的话,你该如何缩小你需要学习的数学范围?
定义你的系统
不缺乏资源(例如,用于数据分析的scikit-learn,用于深度学习的keras),这些资源将有助于你开始编写代码来为你的系统建模。在这样做时,尝试回答以下有关问题:
1.系统的输入/输出是什么?
2.你应该如何准备数据以适应你的系统?
3.如何构建特性或规划数据以帮助你的模型进行泛化?
4.你如何为你的问题定义一个合理的目标?
你可能会感到惊讶——定义你的系统会很困难!之后,渠道建设所需的工程也是非常重要的。换句话说,构建机器学习产品需要大量繁重的工作,不需要深入的数学背景。
资源
•Google研究科学家Martin Zinkevich的ML工程最佳实践(https://developers.google.com/machine-learning/guides/rules-of-ml/)
根据需要来学习数学
深入机器学习工作流程,你可能会发现有一些步骤会让你陷入困境,特别是在调试时。当你被困住时,你知道要查找什么吗?为什么你的模型不能与特定的损失定义融合?衡量成功的正确方法是什么?此时,对数据进行假设,以不同方式约束优化或尝试不同的算法可能会有所帮助。
通常,你会发现在建模/调试过程中融入了数学直觉(例如,选择损失函数或评估指标),这些直觉可能有助于做出明智的工程决策。这些是你学习的机会!
来自Fast.ai的Rachel Thomas是这种"按需"方法的支持者——在教育学生时,她发现对于深度学习的学生来说,让他们对这些材料感兴趣更为重要。产生兴趣之后,再根据个人的需求填补不足。
资源
•课程:fast.ai的计算线性代数(http://www.fast.ai/2017/07/17/num-lin-alg/)
•YouTube:3blue1brown:线性代数和微积分的本质(https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw)
•教科书:Axler的线性代数(http://linear.axler.net/)
•教科书:Tibshirani等人编写的统计学习要素。(https://web.stanford.edu/~hastie/ElemStatLearn/)
•课程:斯坦福大学的CS229(机器学习)课程笔记(http://cs229.stanford.edu/syllabus.html#opt)
机器学习研究的数学
我现在想要描述的是对于机器学习中以研究为导向的工作有用的数学思维方式。机器学习研究观点指向即插即用系统,在这些系统中,模型会投入更多计算以获得更高的性能。在一些圈子里,研究人员对这种缺乏数学严谨性的经验方法仍然持怀疑态度。
值得关注的是,研究领域可能建立在现有系统和假设的基础上,这些系统和假设并不会扩展我们对该领域的基本理解。研究人员需要提供原始资源——新的基础构建模块,可用于获取对该领域目标的全新见解和目标。例如,这可能意味着要重新思考用于图像分类的卷积神经网络等的构建模块,正如Geoff Hinton,"深度学习的教父",在他最近的Capsule Networks论文中所做的那样。(https://arxiv.org/pdf/1710.09829v1.pdf)
为了实现机器学习的下一个飞跃,我们需要提出一些基本问题。这需要深度的数学成熟,《深度学习》的作者迈克尔·尼尔森(Michael Nielsen)向我描述为"有趣的探索"。在这个过程中,你会被许多困难"卡住",也会提出问题,并在追求新问题时翻来覆去地寻找新的问题观点。"有趣的探索"使科学家们能够提出深刻的、富有洞察力的问题,而不仅仅是简单的想法和架构的结合。
在ML研究中,你无法学到所有东西!要正确地进行"有趣的探索",你需要遵循自己的兴趣,而不是只着眼于最热门的新结果。
ML研究是一个非常丰富的研究领域,在公平性、可解释性和可访问性方面存在着许多问题。在所有科学学科中都是如此,基本思维不是一个按需过程——需要耐心才能用具有广度和深度的思考批判性问题,解决高水平数学框架。
资源
•博客:SWE需要数学吗?作者:Keith Devlin(https://www.maa.org/external_archive/devlin/devlin_10_00.html)
•Reddit Thread:AI研究员的自白(https://www.reddit.com/r/MachineLearning/comments/73n9pm/d_confession_as_an_ai_researcher_seeking_advice/)
•博客:Shai Simonson和Fernando Gouvea如何阅读数学(http://www.people.vcu.edu/~dcranston/490/handouts/math-read.html)
•论文:NIPS和ICML最近的会议论文(https://papers.nips.cc/book/advances-in-neural-information-processing-systems-30-2017 http://proceedings.mlr.press/v70/)
•散文:保罗·洛克哈特《数学家的哀叹》(https://www.maa.org/external_archive/devlin/LockhartsLament.pdf)
机器学习研究
我希望我没有把"研究数学"描绘得太深奥,因为使用数学公式表达的思想应该以直观的形式呈现!遗憾的是,许多机器学习论文仍然充斥着复杂且不一致的术语,使关键的数学直觉难以辨别。(https://arxiv.org/abs/1807.03341)作为一名学生,你可以尝试通过博客文章,推特等渠道来学习。你甚至可以从pubas(http://distill.pub/)中获取一个例子,它是关注出版物,专注于提供机器学习研究的清晰解释。
小贴士
总之,我希望我为能你提供一个起点,让你思考机器学习中的数学问题。
·不同的问题需要不同程度的数学基础,我鼓励你首先弄清楚你的目标是什么。
·如果你希望构建产品,请通过问题寻找同伴和学习小组,并通过深入研究最终目标来激发你的学习兴趣。
·在研究领域,广泛的数学基础可以为你提供帮助,通过提供新的基础构建模块来推动这一领域的发展。
·一般而言,数学(特别是研究论文形式)可能令人生畏,但被"卡住"是学习过程的一个重要组成部分。