从事实际科目工作的从业者可能会有“数学焦虑”。
他们认为数学家比他们聪明,并且在掌握一门学科之前就必须“懂数学”。
我亲眼见过这种情况,也见过它阻止了人们开始学习。
在这篇文章中,我想说服您,即使您不擅长数学,也可以开始并能在机器学习领域取得巨大进步。

如果我不擅长数学怎么办
照片来自 meneldur,保留部分权利
从实践中学习,动手开始
我开始编程之前并没有学习布尔逻辑。
我只是开始编程,您可能也一样。
我遵循了一条涉及试错的经验主义道路。这很慢,我写了很多糟糕的代码,但我有极大的兴趣,并且能看到进步。
当我构建越来越复杂的大型软件程序时,我如饥似渴地阅读教科书,因为它们能帮助我更好地构建程序。我寻找可以用来克服我实际遇到的限制的概念和实用工具。
这是一个强大的学习工具。如果我一开始编程就不得不学习布尔逻辑或多态性等概念,我的热情就不会被点燃。
危险区域
我喜欢我的程序无法正常工作的时候。这意味着我必须卷起袖子,真正理解发生了什么。
你可以通过复制粘贴代码而无需真正理解它就能走得很远。你只需要将代码块视为执行你需要的任务的功能单元。将它们足够地粘合在一起,你就可以得到一个解决你问题的程序。
这种经验主义的“黑客”方法是快速学习的好方法,但却是构建生产系统的可怕方法。这是一个重要的区别。常说的“危险区域”是当由经验学习构建的系统投入运行时,而作者却不真正了解其工作原理或其结果的真正含义。
这是一个非常现实的问题。例如,看看一些小型企业将其IT系统和网页的完成度停留在这种水平。
在我看来,原型是一个由复制粘贴的泥巴组成、用胶带粘起来的球,它勾勒出了解决方案可能的样子。
一个运行系统或能产生运行结果或决策的系统,不应该有意外。你希望能够与团队一起进行一整天的代码审查,检查每一行代码。
技术人员
你今天就可以通过实践开始机器学习。你有三个可行的选择:
- 学习使用像 scikit-learn、R 或 WEKA 这样的工具。
- 使用提供算法的库并编写小程序。
- 自己根据教程和书籍实现算法。
这不仅仅是选项,这可以是从初级到中级的技术人员的学习路径,他们“即时”学习一项技术所需的数学知识。
定义小问题,有条不紊地解决它们,并在你的博客上展示你学到的结果。按照这个过程,你将开始积累动力。
你会遇到一些有趣的算法,你会想了解更多,比如更改某个特定参数时它实际上做了什么,或者如何从某个特定算法中获得更好的结果。
这将促使你想要(需要)理解该技术是如何真正工作的以及它在做什么。你可能会画出数据流和转换的图,但最终,你将需要内化正在发生的向量或矩阵表示和转换,仅仅因为它们是我们用来清晰、明确地描述正在发生的事情的最佳工具。
你可以保持经验主义。我称之为技术人员的道路。
你可以通过经验来建立一种直觉,知道使用哪些方法以及如何使用它们。你也可以学习足够的代数知识,以便能够阅读算法描述并将其转换为代码。
这条道路可以让技术娴熟的技术人员创建工具、插件甚至使用机器学习的运行系统。
技术人员与另一端的理论家相对。理论家可以
- 内化现有方法。
- 提出对现有方法的扩展。
- 设计全新的方法。
理论家可能能够抽象地证明一种方法的能力,但可能技能不足,最多只能将其转化为原型演示系统。
你可以根据需要学习尽可能少或尽可能多的数学知识。专注于你的优势,并诚实地认识到你的局限性。
数学在后期是至关重要的
如果必须“即时”学习线性代数,为什么不从一开始就完全、更全面地学习它,并从一开始就深入理解机器学习方法呢?
这当然是一种选择,可能是最有效率的选择,这就是大学的教学方式。但这并不是你唯一的选择。
就像通过从逻辑和抽象概念开始学习编程一样,内化机器学习理论可能不是你开始的最有效方式。
在这篇文章中,你了解到存在一条技术人员可以走的,与理论家不同的道路。
你了解到技术人员可以“即时”学习机器学习算法的数学表示和描述。你还了解到技术人员的危险区域是过度自信,以及将理解不清的系统投入生产的风险。
这可能是一篇有争议的文章,请在评论中告诉我你的想法。
这正是我在加州大学所做的。我从技术人员的路线开始,然后挣扎着学习非常艰深的机器学习课程,一边学习一边进步。数学确实令人望而生畏,但随着时间的推移,我在这方面变得越来越好。虽然在成为理论家之前还有很长的路要走,但做得越多,我发展的直觉就越多。此外,一旦你意识到学习理论的意义,学习理论会更有趣。认识到简单“黑客”方法的局限性是做更多数学和计算机科学研究的强大动力。
感谢分享,Rishi,很高兴听到你有类似的经历。
我上过一些大学课程,我喜欢数学,但我已经50多岁了,担心这会不会是浪费时间。另外,数据分析或机器学习技术哪个更容易?
数据分析比机器学习更容易。
不要追求轻松,使用工具箱中所需的任何工具来获得所需的结果。
我的一位机器学习讲师是数据分析(DA)训练营的一部分;他正在帮助我们掌握使用和理解机器学习如何用于执行更好的数据分析的基础知识。
这种方法对我们学生来说非常有动力,因为我们已经初步了解了严格数据分析的局限性以及机器学习如何帮助我们超越和走得更远。
感谢你的反馈,Francois!
好建议!
谢谢 Alex!
精彩的文章。你触及了我作为一名软件工程师的内心深处,也说出了我一直在机器学习领域走的路线。感谢你花时间激励我坚持下去。
很高兴听到你这么说,Mike!坚持下去,伙计。
感谢这篇文章。我通过搜索“为什么我学不好机器学习”的答案找到了它。我想说我现在正走在“理论家”的道路上,在没有扎实的数学和统计学背景的情况下,在大学里学习机器学习。这是一次非常艰巨的经历。阅读机器学习教科书却不懂大多数数学/统计学术语,就像在读一门你不知道的语言。但是,我能够用 scikit-learn 解决问题,你的提醒我如何开始学习编程,这帮助我继续前进。
很高兴听到你这么说,Stefan,坚持下去,多提问题!
对于一个统计学和概率论背景较少的人来说,这是一份巨大的鼓励!
没有什么语言能够充分表达我对你为“机器学习人人共享”的贡献的衷心感激!
上帝保佑!
好建议。
我开始学习 Coursera 上的机器学习课程。虽然这是一门很棒的课程,但由于其理论密集型的方法,我几乎要放弃了。我确实学到了很多东西。但作为一个程序员,我会坚定地支持你的方法。
谢谢!
但是,如果一个人想提高机器学习所需的数学能力,从数学新手变成高级水平,该怎么办?需要学习的主要领域是什么(基础/基本概念/预备概念和定义)?你是否有关于这个主题的文章?
谢谢!
以项目为中心的方法是最有效的。当数学在特定情境中应用时,它才变得有意义并真正被记住。
我非常喜欢这篇文章,因为我首先是一名程序员,我想理解问题并用“代码”来解决它。我不太懂统计学/数学/线性代数。
你的自顶向下方法应该是该领域程序员的首选方法。
自顶向下还有另一个原因。一旦你接触到数学,当相关概念出现时,你就会特别留意。我曾经学过统计学,我记得当时想:“特征向量?我什么时候会用到它们?”现在我回去重新学习,并且很享受。
我个人喜欢“扫地和拖地”的方法。扫地:快速了解数学基础(甚至是一些快速的YouTube视频);学习机器学习基础,足以使用 scikit-learn。现在开始动手,每天1小时拖地:从头开始,彻底学习所有内容。即:(1)快速的自顶向下,(2)动手实践,(3)彻底的自底向上。
仍然有很多人认为自己永远无法精通数学。这确实阻碍了很多人,但实际上不应该这样。
这可能部分是由于数学焦虑(我最近写过关于这个的文章 http://www.mlopt.com/?p=73)。这也可能归因于数学在学校的教学方式很抽象。学习抽象概念并不容易,但在这个例子中也是不必要的。你可以通过将其应用于具体问题来有效地学习数学。这意味着深入学习机器学习,并在接触到数学时去处理它。在我看来,避免数学是错误的,尤其是在学习者刚接触算法的早期阶段。
非常非常感谢你关于数学焦虑的文章。作为一名刚刚开始本科计算机科学学习,并渴望进入人工智能领域的人,我数学基础非常薄弱,而且有严重的数学焦虑……这非常有帮助。我知道如果我能在代码中做到,我也应该能在纸上做到。但我正在尽力避免微积分/数学课程。这真的激励我做得更好,继续练习。
坚持住!
我拥有数学学士学位,我同意你的方法。我肯定不记得大学里学到的一切,而且我的职业生涯一直是软件开发人员,我总是在需要时(即时)学习。而且你说得对,一旦你有学习某事物的动力,因为它解决了你遇到的一个实际问题,你就会学会它。我也同意上面 James 的观点,人们不应该害怕数学——但是,数学焦虑是真实存在的,可能是因为我们教孩子数学的方式。你的文章还暗示了另一个观点,那就是花时间解决“正确的问题”;有很多问题,所以要明智地利用你的时间。一旦你确定你的时间会花得物有所值,学习就会容易得多。
太棒了,谢谢你,Jason
不客气,Michael。
你好,我目前正在学习加州理工学院的一门 MOOC,它非常注重数学,有时我因为不理解概念和涉及的数学而感到非常愤怒和沮丧,这让我觉得自己很愚蠢!谢谢这篇文章,它给了我第二次机会的动力。
很高兴它有帮助,Adolfo。
我非常赞同你非常实用的方法。机器学习这样一个新领域,对于从研究人员到软件专业人士的每个人来说都非常令人兴奋。对我来说,机器学习为我提供了一种解决挑战性问题的新方法。正规学习将为我打下良好的基础来更好地理解机器学习。但我非常热衷于将其应用于解决我的问题。虽然我可以付出额外的努力来掌握理论,但我希望在需要时以及需要多少时才“即时”学习。是的,我乐于以务实的态度学习/应用新事物,谢谢,Ravi
谢谢 Ravi。
我对机器学习很感兴趣,我将遵循上述方法。谢谢。
很高兴听到你这么说,坚持下去!
我同意你的方法。我真的不记得大学课程中学到的数学了。希望这能起作用。感谢你的建议。
谢谢 Rajiv,坚持下去!
我完全同意,机器学习应该需要大量的代码实现经验,而不是数学理论。感谢你在这个困境中的指导,我现在更有信心学习机器学习了。
谢谢,坚持下去。
先生,我现在正在学习 JavaScript。我曾计划用 PHP 构建应用程序环境。但自从我听说机器学习以来,我想转去学习机器学习……我该怎么做?
您可以从这里开始
https://machinelearning.org.cn/start-here/
Jason,所以“克服数学焦虑”这句话的意思是“延迟数学焦虑,直到你更好地理解它的背景”。这很有道理。这基本上就是我在研究生院学习微观经济学、数学经济学和数学统计学课程的同时,通过几本书学习微积分的方式。从数学本身的角度开始对我来说意义不大,但当我发现经济学和建模时,我理解了它,并且喜欢学习它。谢谢,Brian
说得对,Brian!
我不确定是在使用机器学习之前学习理论和数学背后的一切是否是最有效的方式,或者至少不是在学术或大学环境中,因为这会限制你的学习速度。我认为最好是边做边学,按需深入。我认为关键是学习那在80%的情况下被使用的20%。
我同意。事实上,在学习了端到端地解决问题的过程后,那20%才能出现,这样你就有了一个学习数学的语境。
我喜欢学习机器学习的数学。
太棒了!
多么可爱的文章。我敢肯定你在网上找不到这样的文章……如果你想想,这真的太棒了。当网上的每个人都在试图销售他们的培训计划时,没有人关心写这个。非常感谢。
谢谢,很高兴对您有帮助。
Jason - 我确定你非常有动力,但我需要你快速的建议。我今年四十多岁(目前在印度,职业生涯大部分时间都在做数据库管理员)。我正在接受一所海外学院的数据科学正规学习路径,其中涉及大量数学。我大学毕业(大约18-20年前)后就放弃并忘记了大部分数学,尽管我最近已经掌握到了一定程度,足以通过我的课程,并且能够处理基本的矩阵、特征向量、线性代数、优化,但每天当我看到数学的世界无穷无尽,并且没有任何东西能够令人信服地确立时,我就会感到沮丧。那些已经进行数学核心研究的人无疑做得更好。我仍然决心学习并尽快进入机器学习领域。但最基本的问题是——我能否与市场上已经存在的数学高手竞争?当我开始掌握它时,我就会离开市场并退休了——这就是我的担忧。我现在做这些值得吗?尽管我没有回头的余地,因为我下定了决心——只是我怀疑我未来的成功。
谢谢
Saurav
坚持下去,Saurav。
想想你合作过多少没有计算机科学学位的程序员。有多少网络工程师没有电气工程学位等等。
专注于解决实际问题和交付成果的技能。
数学不是让一切都奏效或让一切都说得通的魔法。应用机器学习就像应用其他任何东西一样,都是艰苦的工作。
嗨 Jason。我是一名拥有数据科学硕士学位的工程师。我完全同意你的帖子,并在我的个人学习路径中解释了原因。凭借技术背景,我对微积分没有问题。我开始用 Python 开发程序,但对于一些更高级的预测模型(深度学习)的概念我还不了解。所以我学习了线性代数(矩阵微积分)和统计学的一般课程。凭借这些数学知识,我对神经网络有了更深入的理解(例如:神经网络是如何训练的)。下一步是尝试为特定的网络构建自己的成本函数(和梯度)。(一个项目涉及到 RNN 算法……我会买你的书;))
我不是一个“临时抱佛脚”的学习者。我宁愿找一本书(或者至少是关于最相关主题的大量章节)来阅读。之后我再开发自己的项目。坏消息是,你需要花费大量时间来熟悉一些高级数学/编程概念,而在工作中你没有那么多时间。
是的,这很难。我们每个人都必须找到我们独特的道路。
坚持住!
嗨 Jason,我非常害怕机器学习,因为我真的非常不喜欢微积分。它太难了。但现在我看到,每个初创公司都在他们的软件公司中使用机器学习。或者说,几乎所有公司都在使用机器学习。如果一个人不会微积分,如何在当今时代蓬勃发展?我不能因为微积分而不去学习机器学习。你能给像我这样的人一些建议吗,如果我在微积分和复杂数学方面都很糟糕,我应该如何进行?(一年前我勉强通过了高中数学)
你可以使用这些方法而不深入研究微积分!
从这里开始
https://machinelearning.org.cn/start-here/#getstarted
我在数学方面比较薄弱,或者说不太擅长,那么我应该选择数据科学、数据分析师、商业分析师还是机器学习/人工智能?
最重要的是,我应该为此选择 BCA 还是 BCS。
你能告诉我 BCA 之后可以从事哪些以上职位,BCS 之后又可以从事哪些职位?哪些最适合它们?
哪些可能会提供海外工作机会,Jason Brownlee 先生,请回复!
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/what-school-university-or-courses-should-i-take
嗨,Jason,
您的文章对我来说非常有启发性,我是一名计算机科学毕业生,在 Web/移动开发领域拥有 5 年的经验,我想进入机器学习和人工智能领域。我目前在一组织担任软件工程师,使用 Python、JavaScript 等语言进行 Web/移动应用程序开发。我精通 SQL。正如您所说,要处理实际问题,我尝试解决了一些 Kaggle 问题。但每次我都很困惑如何开始解决一个特定的机器学习问题,或者应该使用哪个模型来解决问题。当我尝试搜索一些解决方案时,我发现了一些以数学为核心的解决方案,这极大地打击了我的进步。如果您能就如何克服这个问题提出建议,那将非常有帮助。
我之前的软件开发经验会对我在机器学习领域找工作有帮助吗?或者这是一个完全不同的领域,那些专业技能不再需要了?
谢谢,很高兴听到这个。
是的,软件开发经验非常有帮助!
原因在于,归根结底,机器学习方法只是另一种编程工具。你必须将它们集成到软件中,模型/结果才能有用。这一点很容易被忽略,人们花费了过多的时间专注于机器学习方法。
嗨 Jason,我在做一个 Udacity 的预备课程(他们免费提供的一个)时偶然发现了你的博客。我来自阿根廷,在这里我的领域很难发展。团队合作是一个永不实现的梦想,所以随着疫情的形势,我回到了这个激情(也是一种梦想)——成为一名程序员,与队友一起学习,享受这个过程。我目前正在完成一个数据科学课程,但说实话,我比以前更困惑了。我的背景是健康科学,我开始学习机器学习,想法是结合健康与计算机,这样我就可以利用我以前的知识。现在我在这里,从头开始,试图找到一个可以坚持的道路。我绝对是一个理论派,我需要更多的实践。非常感谢您提供了这个机会,让我可以搭建一个阶梯,让我感觉我可以一步一步地深入,来实现这个梦想并改变我的生活。
感谢分享你的故事。希望你也喜欢这里的其他帖子。