fast.ai 新课程:计算线性代数

课程
作者

Rachel Thomas

发布于

2017年7月17日

我很高兴发布 fast.ai 的最新免费课程《计算线性代数》,包括一份 在线教材 和一系列 视频,并涵盖了(使用 Python)的应用,例如如何识别监控视频中的前景、如何对文档进行分类、驱动谷歌搜索的算法、如何从 CT 扫描重建图像等等。

Jeremy 和我开发了这份材料,用于我们在 旧金山大学分析学硕士 项目中教授的《数值线性代数》课程。据我们所知,它是第一门完全围绕实际应用展开,并使用前沿算法和工具(包括 PyTorchNumba随机 SVD)的数值线性代数课程。它还涵盖了基础的数值线性代数概念,例如浮点运算、机器精度、奇异值分解、特征分解和 QR 分解。

什么是数值线性代数?

你可能想知道:“数值线性代数到底是什么?” 它的核心是让计算机快速可接受的精度进行矩阵运算,而且比这个有点枯燥的名字听起来要酷得多。谁关心计算机如何进行矩阵运算呢?可能你们都在乎。数据科学很大程度上是关于操作矩阵的,因为几乎所有数据都可以表示为矩阵:时间序列、结构化数据、任何能放入电子表格或 SQL 数据库的数据、图像和语言(通常表示为 词嵌入)。

典型的初级线性代数课程侧重于如何手动解决矩阵问题,例如,花时间用纸笔手工使用高斯消元法求解小型方程组。然而,事实证明,通过计算机解决大型矩阵问题的方法和关注点通常截然不同

  • 速度:当矩阵很大时,矩阵计算会变得非常慢。有不同的方法来解决这个问题

    • 不同的算法:可能有一种不那么直观的方法来解决问题,但仍然能得到正确答案,而且速度更快。
    • 代码向量化或并行化。
    • 局部性:传统的运行时计算侧重于 Big O,即计算操作的数量。然而,对于现代计算,在内存中移动数据可能非常耗时,你需要方法来最小化内存移动量。
  • 精度:计算机以离散有限的方式表示数字(它们是连续无限的),这意味着它们的精度有限。舍入误差可能会累积,特别是当你进行迭代时!此外,有些数学问题不太稳定,这意味着如果你稍微改变输入,你会得到一个截然不同的输出。这不是舍入或计算机的问题,但它仍然会对你的结果产生很大影响。

  • 内存使用:对于有大量零条目或具有特定结构的矩阵,有更有效的方法将它们存储在内存中。

  • 可伸缩性:在许多情况下,你希望处理的数据量超出内存容量。

本课程还包括一些非常现代的方法,据我们所知,其他数值线性代数课程没有涵盖这些内容(我们对数值线性代数课程和教学大纲进行了大量研究),例如

  • 随机算法
  • Numba:一个将 Python 编译为优化 C 代码的库
  • PyTorch:一个可在 GPU 上运行的 Numpy 替代品(它也是一个优秀的深度学习框架,尽管我们在这里仅将其用作 Numpy 替代品来加速我们的代码)

总之,我们认为任何可以加速矩阵计算的方法都值得在此课程中涵盖!

教学方法

本课程采用与我们 面向程序员的实用深度学习 课程相同的 自顶向下、代码优先、以应用为中心 的教学方法,我在 这篇博客文章我在旧金山机器学习聚会上的演讲 中更详细地描述了这种方法。简而言之,我们的目标是让学生尽快开始研究有趣的应用,然后随着时间的推移深入研究底层细节。

这种方法与大多数数学课程的运作方式截然不同:通常,数学课程首先介绍你将使用的所有独立组件,然后你逐渐将它们构建成更复杂的结构。这样做的问题在于学生常常失去动力,对“大局”没有概念,也不知道最终会需要哪些部分。我们受到了哈佛大学教授 David Perkin 的棒球类比 的启发。我们不会要求孩子们在享受乐趣和玩游戏之前记住棒球的所有规则并理解所有技术细节。相反,他们会带着一个大致的概念开始玩,然后随着时间的推移逐渐学习更多规则/细节。总而言之,如果一开始不完全理解,不必担心!你本来就不应该完全理解。我们会先使用一些尚未解释的“黑箱”或矩阵分解方法,然后再深入研究更底层的细节。

我热爱数学(我甚至有数学博士学位!),但当我在尝试解决实际问题时,代码比理论更有用。此外,衡量你是否真正理解某事的标准之一就是你能否将其编码实现,因此,本课程比典型的数值线性代数课程更注重代码实践。

课程详情

本课程的主要资源是 免费的在线 Jupyter Notebook 教材,可在 Github 上获取。它们包含详细的解释、代码示例、图片、有趣链接和练习供你尝试。任何人都可以通过点击 readme 目录 中的链接在线查看 Notebook。然而,要真正学习这些材料,你需要交互式地运行代码,这需要在你的计算机上 安装 Anaconda(或 Python 科学计算库的等效设置),并且你需要能够克隆或下载 Git 仓库。

配套 Notebook 的是 YouTube 上的讲座视频播放列表。如果你对某个讲座感到困惑或觉得它讲得太快,请查看下一个视频的开头,我会在那里回顾上一讲的概念,通常会从新的角度或使用不同的插图进行解释。

你可以使用 我们的 fast.ai 讨论论坛中的计算线性代数类别 提问或分享你的想法和资源。

本课程比我们的 面向程序员的实用深度学习 课程要求更多的背景知识。它最初是在 旧金山大学分析学硕士 项目毕业前的最后一个学期讲授的,所有学生都已经参加过“线性代数训练营”。如果你是线性代数新手,我建议你观看精彩的 3Blue 1Brown 线性代数本质 系列视频作为准备。

本课程没有官方注册;你可以按照自己的进度学习材料。你现在就可以开始,观看第一个视频

涵盖的应用案例

此列表并非详尽无遗,但这里列出了一些涵盖的应用案例

  • 如何识别监控视频中的前景,通过将一个矩阵分解为另外两个矩阵的和

    Photo = Background + People


  • 如何利用 X 射线角度和读数从 CT 扫描重建图像(剧透:这出奇地简单,我们使用了线性回归!),在 第四课 中涵盖


  • 如何识别文档集中的主题,在 第二课 中涵盖。
图片来源:NMF 教程


  • 谷歌 PageRank 背后的算法,用于对不同网页的相对重要性进行排序

我可以直接使用 sci-kit learn 吗?

本课程涵盖的许多(当然不是全部)算法已在 Numpy、Scipy 和 Scikit Learn 等科学计算 Python 库中实现,因此你可能想知道为什么有必要学习其底层原理。了解这些算法如何实现将使你能够更好地组合和利用它们,并在需要时对其进行定制。在至少一个案例中,我们展示了如何比 sci-kit learn 的某种方法实现获得显著的加速。我们涵盖的一些主题是活跃的研究领域,并且有一些最新的研究尚未添加到现有库中。