Skip to content

Commit

Permalink
fix typos and update images (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
luweizheng authored May 11, 2024
1 parent 734c1f8 commit a707913
Show file tree
Hide file tree
Showing 41 changed files with 510 additions and 471 deletions.
7 changes: 4 additions & 3 deletions ch-data-science/data-science-lifecycle.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"\n",
"```{figure} ../img/ch-data-science/data-science-lifecycle.svg\n",
"---\n",
"width: 400px\n",
"width: 600px\n",
"name: fig-data-science-lifecycle\n",
"---\n",
"数据科学生命周期\n",
Expand Down Expand Up @@ -62912,7 +62912,7 @@
"网络上的开源数据往往已经被处理过,实际业务场景的数据准备难度比开源数据大很多。\n",
"因此,数据准备是最耗时的步骤,它可能会占整个项目时间的 70%-90%,然而它是整个数据科学生命周期中最重要的步骤。\n",
"\n",
"在房价预测这个场景下,当前我们使用的这个开源数据集的特征只有 8 列。为了更好地做这个任务,应该挖掘更多的信息,包括房屋面积等更详细的信息。如果能从其他数据源获取的数据,并将这些数据融合,能显著提升最终要过,但数据融合需要进行数据清洗和对齐工作。\n",
"在房价预测这个场景下,当前我们使用的这个开源数据集的特征只有 8 列。为了更好地做这个任务,应该挖掘更多的信息,包括房屋面积等更详细的信息。如果能从其他数据源获取数据,并将这些数据融合,能显著提升最终要过,但数据融合需要进行数据清洗和对齐工作。\n",
"\n",
"数据的预处理非常依赖数据分析师的经验,这里不仔细展开讲解。现在我们只对数据进行切分,分为训练集和测试集。"
]
Expand All @@ -62926,7 +62926,8 @@
"from sklearn.model_selection import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(cal.data,\n",
" cal.target, random_state=11)"
" cal.target, \n",
" random_state=11)"
]
},
{
Expand Down
34 changes: 24 additions & 10 deletions ch-data-science/deep-learning.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ $$

$\boldsymbol{x}$ 是输入,$\boldsymbol{W}$ 是神经网络的参数,又被称为权重。神经网络的学习的过程,就是不断更新参数 $\boldsymbol{W}$ 的过程,这也是所谓的训练过程。训练好的模型可以用来推理,用来预测未知数据。

$f$ 是激活函数(Activation Function)。$\boldsymbol{W}$ 与 $\boldsymbol{x}$ 相乘仅是一个线性变换,就算很多个乘法叠加起来,仍然是线性变换,或者说没有激活函数的多层网络就退化成了一个单层线性模型。激活函数可以在神经网络中引入了非线性因素,使得多层神经网络理论上可以拟合任何输入数据到输出数据的模式。从模拟生物的神经元的角度,激活函数是为了让有些神经元被激活,有些神经元被抑制。常见的激活函数有 Sigmoid 和 ReLU。{numref}`sec-machine-learning-intro` 我们对 Sigmod 进行过可视化,ReLU 的公式为:$f(x) = \max (0, x)$。
$f$ 是激活函数(Activation Function)。$\boldsymbol{W}$ 与 $\boldsymbol{x}$ 相乘仅是一个线性变换,就算很多个乘法叠加起来,仍然是线性变换,或者说没有激活函数的多层网络就退化成了一个单层线性模型。激活函数可以在神经网络中引入了非线性因素,使得多层神经网络理论上可以拟合任何输入数据到输出数据的模式。从模拟生物神经元的角度,激活函数是为了让有些神经元被激活,有些神经元被抑制。常见的激活函数有 Sigmoid 和 ReLU。{numref}`sec-machine-learning-intro` 我们对 Sigmod 进行过可视化,ReLU 的公式为:$f(x) = \max (0, x)$。

## 前向传播

{numref}`fig-forward-pass` 是一种最简单的神经网络:将 $\boldsymbol{z^{[n]}} = \boldsymbol{W^{[n]}} \cdot \boldsymbol{a^{[n-1]}} + \boldsymbol{b^{[n]}}$ 和 $\boldsymbol{a^{[n]}} = f(\boldsymbol{z^{[n]}})$ 堆叠,前一层的输出 $\boldsymbol{a^{[n-1]}}$ 作为下一层的输入。这种网络又被成为前馈神经网络(Feedforward Neural Network),或者多层感知机(Multilayer Perceptron,MLP)。多层网络中,为了区分某一层,用方括号上标来表示,比如 $\boldsymbol{a^{[1]}}$ 是第一层的输出,$\boldsymbol{W^{[1]}}$ 是第一层的参数。
{numref}`fig-forward-pass` 是一种最简单的神经网络:将 $\boldsymbol{z^{[n]}} = \boldsymbol{W^{[n]}} \cdot \boldsymbol{a^{[n-1]}} + \boldsymbol{b^{[n]}}$ 和 $\boldsymbol{a^{[n]}} = f(\boldsymbol{z^{[n]}})$ 堆叠,前一层的输出 $\boldsymbol{a^{[n-1]}}$ 作为下一层的输入。这种网络又被称为前馈神经网络(Feedforward Neural Network),或者多层感知机(Multilayer Perceptron,MLP)。多层网络中,为了区分某一层,用方括号上标来表示,比如 $\boldsymbol{a^{[1]}}$ 是第一层的输出,$\boldsymbol{W^{[1]}}$ 是第一层的参数。

```{figure} ../img/ch-data-science/forward-pass.svg
---
Expand Down Expand Up @@ -61,7 +61,7 @@ name: fig-back-propagation

## 超参数

神经网络训练过程中,有很多训练模型之前需要人为设定的一些参数,这些参数不能通过模型的反向传播算法来自动学习,而需要手动选择和调整。这些参数又被成为超参数(Hyperparameter),超参数的选择通常基于经验或反复试验。以下是一些超参数:
神经网络训练过程中,有一些需要人为设定的参数,这些参数不能通过模型的反向传播算法来自动学习,而需要手动选择和调整。这些参数又被成为超参数(Hyperparameter),超参数的选择通常基于经验或反复试验。以下是一些超参数:

* 学习率,即刚才提到的 $\alpha$,控制着每次更新参数的步长。
* 网络结构:模型的层数、每层的神经元数量、激活函数的选择等。不同的网络结构对于不同的任务可能有不同的性能表现。
Expand All @@ -84,26 +84,40 @@ name: fig-model-training-input-output
前向传播、反向传播和更新模型权重的输入和输出
```

对于前向传播,输入有两部分:i-1 层输出 $\boldsymbol{a^{[i-1]}}$ 和第 i 层的模型权重 $\boldsymbol{W^{[i]}}$、$\boldsymbol{b^{[i]}}$;输出又被称为激活(Activation)。
### 前向传播

对于反向传播,输入有三部分:i 层输出 $\boldsymbol{a^{[i]}}$;第 i 层的模型权重 $\boldsymbol{W^{[i]}}$、$\boldsymbol{b^{[i]}}$;损失对 i 层输出的导数 $\boldsymbol{\boldsymbol{\frac{\partial L}{a^{[i]}}}}$。根据链式法则,可以求出损失对 i 层模型权重的导数 $\boldsymbol{\frac{\partial L}{\partial W^{[i]}
- **输入:**
对于前向传播,输入有两部分:i-1 层输出 $\boldsymbol{a^{[i-1]}}$ 和第 i 层的模型权重 $\boldsymbol{W^{[i]}}$、$\boldsymbol{b^{[i]}}$

- **输出:**
输出又被称为激活(Activation),是权重与输出相乘之后,经过激活函数的结果。

### 反向传播

- **输入:**
对于反向传播,输入有三部分:i 层输出 $\boldsymbol{a^{[i]}}$;第 i 层的模型权重 $\boldsymbol{W^{[i]}}$、$\boldsymbol{b^{[i]}}$;损失对 i 层输出的导数 $\boldsymbol{\boldsymbol{\frac{\partial L}{a^{[i]}}}}$。

- **输出:**
根据链式法则,可以求出损失对 i 层模型权重的导数 $\boldsymbol{\frac{\partial L}{\partial W^{[i]}
}}$、$\boldsymbol{\frac{\partial L}{\partial b^{[i]}
}}$,也就是梯度。

### 更新模型权重

得到梯度后,需要沿着梯度下降的方向更新模型权重。如果是最简单的梯度下降法,优化器直接在模型原有权重基础上做减法,不需要额外保存状态,比如:$\boldsymbol{W^{[l]}} = \boldsymbol{W^{[l]}}-\alpha\frac{\partial L}{\partial \boldsymbol{W^{[l]}}}$

复杂一点的优化器,比如 Adam, 在梯度下降时引入了动量的概念。动量是梯度的指数移动平均,需要维护一个梯度的移动平均矩阵,这个矩阵就是优化器的状态。因此,优化器状态、原来的模型权重和梯度共同作为输入,可以得到更新后的模型权重。至此才能完成一轮模型的训练。
复杂一点的优化器,比如 Adam {cite}`kingma2015Adam`, 在梯度下降时引入了动量的概念。动量是梯度的指数移动平均,需要维护一个梯度的移动平均矩阵,这个矩阵就是优化器的状态。因此,优化器状态、原来的模型权重和梯度共同作为输入,可以得到更新后的模型权重。至此才能完成一轮模型的训练。

如果只考虑前向传播和反向传播,对于一个神经网络,其训练过程如 {numref}`fig-model-training` 所示。{numref}`fig-model-training` 演示了 3 层神经网络,前向过程用 FWD 表示,反向过程用 BWD 表示。
对于一个神经网络,其训练过程如 {numref}`fig-model-training` 所示。{numref}`fig-model-training` 演示了 3 层神经网络,前向过程用 FWD 表示,反向过程用 BWD 表示。

```{figure} ../img/ch-data-science/model-training.svg
---
width: 800px
width: 600px
name: fig-model-training
---
前向传播(图中用 FWD 表示)和反向传播(图中用 BWD 表示)
前向传播(图中用 FWD 表示)、反向传播(图中用 BWD 表示)和更新模型权重
```

## 推理

模型训练就是前向和反向传播,模型推理只需要前向传播,只不过输入层换成了需要预测的 $\boldsymbol{x}$。
模型训练是前向和反向传播,模型推理只需要前向传播,只不过输入层换成了需要预测的 $\boldsymbol{x}$。
16 changes: 8 additions & 8 deletions ch-data-science/machine-learning.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
"\n",
"### 一元线性回归\n",
"\n",
"我们从线性回归开始,了解机器学习模型的数学原理。中学时,我们使用 $ y = ax + b $ 对很多问题进行建模,方程描述了变量 $y$ 随着变量 $x$ 而变化。方程是一条直线。如果建立好这样的数学模型,已知 $x$ 我们就可以得到预测的 $\\hat{y}$ 了。统计学家给变量 $y$ 带上了一个小帽子,表示这是预测值,以区别于真实观测到的数据。方程只有一个自变量 $x$,且不含平方立方等非一次项,因此被称为 ** 一元线性方程 **。\n",
"我们从线性回归开始,了解机器学习模型的数学原理。中学时,我们使用 $ y = ax + b $ 对很多问题进行建模,方程描述了变量 $y$ 随着变量 $x$ 而变化。方程是一条直线。如果建立好这样的数学模型,已知 $x$ 我们就可以得到预测的 $\\hat{y}$ 了。统计学家给变量 $y$ 带上了一个小帽子,表示这是预测值,以区别于真实观测到的数据。方程只有一个自变量 $x$,且不含平方立方等非一次项,因此被称为**一元线性方程**。\n",
"\n",
"在对数据集进行建模时,我们只关注房屋面积和房价两个维度的数据。我们可以对参数 $a$ 和 $b$ 取不同值来构建不同的直线,这样就形成了一个参数家族。参数家族中有一个最佳组合,可以在统计上以最优的方式描述数据集。那么一元线性回归的监督学习过程就可以被定义为:给定 $m$ 个数据对 $(x, y)$ ,寻找最佳参数 $a^*$ 和 $b^*$,使模型可以更好地拟合这些数据。$a$ 和 $b$ 可以取不同的参数,到底哪个参数组合是最佳的呢?如何衡量模型是否以最优的方式拟合数据呢?机器学习用损失函数(Loss Function)的来衡量这个问题。损失函数又称为代价函数(Cost Function),它计算了模型预测值 $\\hat{y}$ 和真实值 $y$ 之间的差异程度。从名字也可以看出,这个函数计算的是模型犯错的损失或代价,损失函数越大,模型越差,越不能拟合数据。统计学家通常使用 $L(\\hat{y}, y)$ 来表示损失函数。\n",
"在对数据集进行建模时,我们从最简单的开始,只关注房屋面积($x$)和房价($y$)两个维度的数据。我们可以对参数 $a$ 和 $b$ 取不同值来构建不同的直线,这样就形成了一个参数家族。参数家族中有一个最佳组合,可以在统计上以最优的方式描述数据集。那么一元线性回归的监督学习过程就可以被定义为:给定 $m$ 个数据对 $(x, y)$ ,寻找最佳参数 $a^*$ 和 $b^*$,使模型可以更好地拟合这些数据。$a$ 和 $b$ 可以取不同的参数,到底哪个参数组合是最佳的呢?如何衡量模型是否以最优的方式拟合数据呢?机器学习用损失函数(Loss Function)的来衡量这个问题。损失函数又称为代价函数(Cost Function),它计算了模型预测值 $\\hat{y}$ 和真实值 $y$ 之间的差异程度。从名字也可以看出,这个函数计算的是模型犯错的损失或代价,损失函数越大,模型越差,越不能拟合数据。统计学家通常使用 $L(\\hat{y}, y)$ 来表示损失函数。\n",
"\n",
"对于线性回归,一个简单实用的损失函数为预测值与真实值误差平方的平均值,下面公式中,$(i)$ 表示数据集中的第 $i$ 个样本点:\n",
"对于线性回归,一个简单实用的损失函数为预测值与真实值误差平方的平均值,下面公式中,$i$ 表示数据集中的第 $i$ 个样本点:\n",
"\n",
"$$\n",
"L(\\hat{y}, y) = \\frac{1}{m} \\sum_{i=1}^m(\\hat{y}_{i}- y_{i})^2\n",
Expand All @@ -43,7 +43,7 @@
"a^*, b^* = \\mathop{\\arg\\min}_{a, b}L(a, b)\n",
"$$\n",
"\n",
"式中 $\\arg\\min$ 是一种常见的数学符号,表示寻找能让 $L$ 函数最小的参数 $a*$ 和 $b*$。\n",
"式中 $\\arg\\min$ 是一种常见的数学符号,表示寻找能让 $L$ 函数最小的参数 $a^*$ 和 $b^*$。\n",
"\n",
"$$\n",
"a^*, b^* = \\mathop{\\arg\\min}_{a, b}\\frac{1}{m}\\sum_{i=1}^m[(ax_{i} + b) - y_{i}]^2\n",
Expand All @@ -53,23 +53,23 @@
"求解这个函数一般有两个方法:\n",
"\n",
"* 基于微积分和线性代数知识,求使得 $L$ 导数为 0 的点,这个点一般为最优点。这种方式只能解那些简单的模型。\n",
"* 基于梯度下降,迭代地搜索最优点。梯度下降法能解很多复杂复杂的模型,比如深度学习模型,{numref}`sec-deep-learning-intro` 进一步解释了梯度下降法。\n",
"* 基于梯度下降,迭代地搜索最优点。梯度下降法能解很多复杂的模型,比如深度学习模型,{numref}`sec-deep-learning-intro` 进一步解释了梯度下降法。\n",
"\n",
"### 线性回归的一般形式\n",
"\n",
"我们现在把回归问题扩展到更为一般的场景。假设 $\\boldsymbol{x}$ 是多元的,或者说是多维的。比如,要预测房价,需要考虑的因素很多,包括学区、卧室数量(两居、三居、四居)、周边商业、交通等。如下面公式所示,每个因素是一个 $w$:\n",
"我们现在把回归问题扩展到更为一般的场景。假设 $\\boldsymbol{x}$ 是多元的,或者说是多维的。比如,要预测房价,需要考虑的因素很多,包括学区、卧室数量(两居、三居、四居)、周边商业、交通等。如下面公式所示,每个因素是一个 $W$:\n",
"\n",
"$$\n",
"f(\\boldsymbol{x}) = b + W_1 \\times x_1 + W_2 \\times x_2 + ... + W_n \\times x_n\n",
"$$\n",
"\n",
"这里的 $\\boldsymbol{w}$ 是 **参数**(Parameter),也可以叫做 **权重**(Weight)。这里共有 $n$ 种维度的影响因素,机器学习领域将这 $n$ 种影响因素称为 **特征**(Feature)。用向量表示为:\n",
"$W$ 是 **参数**(Parameter),也可以叫做 **权重**(Weight)。这里共有 $n$ 种维度的影响因素,机器学习领域将这 $n$ 种影响因素称为**特征**(Feature)。用向量表示为:\n",
"\n",
"$$\n",
"f(\\boldsymbol{x}) = b + \\boldsymbol{W} \\boldsymbol{{x}}\n",
"$$\n",
"\n",
"要预测的 $y$ 是实数,从负无穷到正无穷,预测实数模型被称为**回归模型**。\n",
"要预测的 $y$ 是实数,从负无穷到正无穷,预测实数的模型被称为**回归模型**。\n",
"\n",
"## 逻辑回归\n",
"\n",
Expand Down
24 changes: 20 additions & 4 deletions ch-data-science/python-ecosystem.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
(sec-python-ecosystem)=
# Python 软件生态
(sec-ecosystem)=
# 软件生态与本书内容

## Python 软件生态

Python 已经成为数据科学首选的编程语言。{numref}`fig-python-ecosystem-img` 是一些主流的数据科学工具:

Expand All @@ -15,8 +17,22 @@ name: fig-python-ecosystem-img
Python 数据科学软件生态
```

Dask、Ray、Xorbits 和 mpi4py 是对数据科学生态的拓展。本书假设读者对以上软件生态有一定了解,读者也可以阅读以下书籍深入理解这些软件工具:
## 本书内容

本书假定读者已经对数据科学有所了解,已经使用过 pandas、XGBoost、PyTorch 等 Python 数据科学软件,希望使用一些工具加速数据科学,如果对数据科学不熟悉,可以阅读以下书籍。

* Wes McKinney(pandas 项目发起人)撰写的《利用 Python 进行数据分析》 {cite}`mckinney2022python` 是一本非常优秀的数据科学入门书籍,也是 pandas 框架的入门书籍。
* 周志华老师的《机器学习》 {cite}`zhou2016machine` 是机器学习理论的入门教科书,是了解绝大多数机器学习算法的必备书籍。
* 亚马逊科学家阿斯顿·张、李沐等人的《动手学深度学习》 {cite}`zhang2019dive` 从算法原理到编程实践,深入浅出地讲解了常见人工智能算法及其应用,是入门深度学习的最佳实战书籍。
* 亚马逊科学家阿斯顿·张、李沐等人的《动手学深度学习》 {cite}`zhang2019dive` 从算法原理到编程实践,深入浅出地讲解了常见人工智能算法及其应用,是入门深度学习的最佳实战书籍。

Dask、Ray、Xorbits 和 mpi4py 是对数据科学生态的拓展,将单机任务横向扩展到集群。这些框架有很多组件,{numref}`tab-lifecycle-module` 概括了这些框架组件所对应的数据科学生命周期、

```{table} 数据科学生命周期与框架组件
:name: tab-lifecycle-module
|生命周期|框架组件|
|---|---|
|数据处理|Dask DataFrame、Dask Array、Ray Data、Modin、Xorbits Data|
|模型训练|Dask-ML、Ray Train、RLib、mpi4py|
|超参数调优|Dask-ML、Ray Tune|
|模型部署|Ray Serve、Xinference|
```
2 changes: 1 addition & 1 deletion ch-parallel-computing/computer-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

大数据与人工智能应用对算力要求极高,为应对飞速增长的算力需求,芯片与硬件厂商近年来重点发展多核、集群(Cluster)和异构计算(Heterogeneous Computing)。{numref}`fig-computer-arch` 展示了现代计算机的体系结构。

```{figure} ../img/ch-intro/computer-arch.svg
```{figure} ../img/ch-parallel-computing/computer-arch.svg
---
width: 600px
name: fig-computer-arch
Expand Down
6 changes: 3 additions & 3 deletions ch-parallel-computing/parallel-program-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

如何设计软件和算法,使得程序可以并行运行在多核或者集群上?早在 1995 年,Ian Foster 在其书中提出了 PCAM 方法 {cite}`foster1995designing`,其思想可以用来指导并行算法的设计。PCAM 主要有四个步骤:切分(Partitioning)、通信(Communication)、聚集(Agglomeration)和分发(Mapping);{numref}`fig-pcam-img` 展示了这四个步骤。

```{figure} ../img/ch-intro/pcam.svg
```{figure} ../img/ch-parallel-computing/pcam.svg
---
width: 400px
name: fig-pcam-img
Expand Down Expand Up @@ -36,9 +36,9 @@ PCAM 方法

Google 2004 年提出 MapReduce {cite}`dean2004MapReduce`,这是一种典型的大数据并行计算范式。{numref}`fig-map-reduce` 展示了使用 MapReduce 进行词频统计的处理方式。

```{figure} ../img/ch-intro/map-reduce.svg
```{figure} ../img/ch-parallel-computing/map-reduce.svg
---
width: 600px
width: 800px
name: fig-map-reduce
---
MapReduce 进行词频统计
Expand Down
Loading

0 comments on commit a707913

Please sign in to comment.