Skip to content

Commit 07d6b7c

Browse files
deploy: update docs (en+zh) from openmlsys-zh@09dd2692364170747f8e3bc003e7b367775afc7c
1 parent c960380 commit 07d6b7c

1,026 files changed

Lines changed: 178710 additions & 56378 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 2 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,3 @@
11

2-
经典机器学习方法
3-
----------------
4-
5-
大量经典机器学习算法,如 支持向量机(Support Vector Machine,SVM),
6-
K最近邻(K-Nearest Neighbor, KNN)分类算法 和K均值聚类算法(K-Means
7-
Clustering Algorithm)等,
8-
虽然它们有的有网络参数,有的没有网络参数,有的是监督学习算法,有的是无监督学习算法,
9-
训练过程也不一样,但是从系统的角度,它们都是以矩阵运算为基础的。下面,我们来简要介绍一下这些算法。
10-
11-
支持向量机
12-
~~~~~~~~~~
13-
14-
**支持向量机**\ (Support Vector
15-
Machine,SVM),是一种经典的机器学习分类算法,其核心思想在于最大化决策边界到数据点的距离。在这里,我们以线性可分数据为例;对于非线性可分的数据,运用\ **核方法**\ (Kernel
16-
Method)即可类似处理。
17-
18-
如果训练数据是线性可分的,SVM的目标则是最大化\ **间隔**\ (Margin)。首先,我们先来定义最大化间隔的分类器,如下:
19-
20-
.. math:: \min_{{w},b} ~~~\frac{1}{2} ||{w}||^2
21-
22-
.. math:: s.t. ~~~y_i ({w}^T {x_i} + b) \geq 1, ~~~\forall 1 \leq i \leq n
23-
24-
其拉格朗日乘子为
25-
26-
.. math:: L({w},b,{\lambda}) = \frac{1}{2} ||{w}||^2 + \sum_{i=1}^n \lambda_i (1-y_i({w}^T {x_i} + b))
27-
28-
由于\ :math:`\frac{1}{2} ||{w}||^2`\ 是凸的,并且\ :math:`\lambda_i (1-y_i({w}^T {x_i} + b))`\ 是线性的(也是凸的),所以优化问题的解为
29-
30-
.. math:: \max_{\lambda>0} \min_{{w},b} L({w},b, {\lambda})
31-
32-
\ :math:`L`\ 关于\ :math:`{w},b`\ 的导数有
33-
34-
.. math:: \nabla_{{w}} L= {w} - \sum_{i=1}^n \lambda_i y_i {x_i}
35-
36-
.. math:: \nabla_b L = - \sum_{i=1}^n \lambda_i y_i
37-
38-
\ :math:`L`\ 关于\ :math:`{w},b`\ 的导数均为0得到,\ :math:`{w}^* = \sum_{i=1}^n \lambda_i y_i {x_i}`\ 以及\ :math:`\sum_{i=1}^n \lambda_i y_i = 0`\
39-
由于当\ :math:`\lambda`\ 固定的时候,\ :math:`b`\ 的值对目标函数无贡献,所以可以令\ :math:`b^* = 0`\
40-
这时,由对偶性理论和KTT条件,我们得到:
41-
42-
.. math:: y_i ({w}^{*T} {x_i} + b^*) > 1 \Rightarrow \lambda_i^* = 0
43-
44-
.. math:: \lambda_i^* > 0 \Rightarrow y_i ({w}^{*T} {x_i} + b^*) = 1
45-
46-
.. math:: {w}^* = \sum_{i=1}^n \lambda_i^* y_i {x_i}
47-
48-
如果\ :math:`y_i ({w}^{*T} {x_i} + b^*) = 1`\ ,那么\ :math:`{x_i}`\ 就是离超平面\ :math:`({w}^*,b^*)`\ 最近的点之一,否则就不是。因此,\ :math:`{w}^*`\ 就是离超平面\ :math:`({w}^*,b^*)`\ 最近的点\ :math:`{x_i}`\ 的线性组合。
49-
50-
如此,通过SVM算法,我们实现了数据的分类,并且能够最大化了决策边界到最近点的距离。
51-
我们定义满足\ :math:`y_i ({w}^{*T} {x_i} + b^*) = 1`\ \ :math:`{x_i}`\ \ **支持向量**\ (Support
52-
Vectors),同时把分类器\ :math:`\hat{y}=sgn({w}^{*T} {x_i} + b^*)`\ 称为支持向量机。
53-
54-
K最近邻算法
55-
~~~~~~~~~~~
56-
57-
**K最近邻算法**\ (K-Nearest
58-
Neighbor,KNN)也是一种传统的机器学习算法,可用于分类、回归等基本的机器学习任务。和上面介绍的SVM算法不同,K最近邻算法的核心思想并不是用一个决策边界把属于不同类的数据分开,而是依靠每个数据点周围几个距离最近的数据的性质,来预测数据点本身的性质。
59-
60-
KNN用于分类时,为了预测某个样本点的类别,会进行一次投票。投票的对象为离这个观测样本点最近的K个样本点,每个要投票的样本点可能会被赋予不同的权重,而投票的“内容”则是样本点的类别。处理投票结果的时候,采用的是少数服从多数的决策方法(Majority
61-
Vote)。也就是说,若一个样本点最近的K个样本点中大多数属于某个类别,那么该样本点也属于这个类别。
62-
63-
KNN算法的具体描述如下:(1)计算待分类点到各已知类别点的距离;(2)将这些点按照距离排序,并按照距离挑选出最近的K个点;(3)按照每个点的权重进行“统票”,票面内容为点所处的类别;(4)返回得票最高的类别,并作为待分类点的预测类别。
64-
65-
KNN算法有几个需要注意的关键问题,包括超参数K的选择,距离的度量方式,还有分类决策规则。对于超参数K,不宜过大,否则会导致很大的近似误差,反之亦不宜过小,否则会导致很大的估计误差。距离的度量,则可以选择曼哈顿距离、欧式距离和闵可夫斯基距离等等。为了降低K值对于预测结果产生的误差和影响,我们通常可以对分类决策规则做一定的规定,比如在投票决策时让距离小的点有更大的权重,距离较大的点权重较小。在编程实现KNN算法的时候,权重等参数都会以矩阵的形式进行运算,以提高运算效率。
66-
67-
K均值聚类算法
68-
~~~~~~~~~~~~~
69-
70-
**K均值聚类算法**\ (K-Means Clustering
71-
Algorithm)是机器学习中一种常见的无监督聚类算法。在这里,我们首先定义聚类问题:给定数据点\ :math:`{x_1},\cdots, {x_n} \in \mathbb{R}^d`\ \ :math:`K\in \mathbb{N}`\ ,需要划分为\ :math:`K`\ 个簇\ :math:`{C_1}, \cdots, {C_K} \in \mathbb{R}^d`\ 以及每个数据点所对应的分类中心点\ :math:`{ C_{(1)}}, \cdots, {C_{(n)}}`\ ,以最小化距离和\ :math:`\sum_i ||{x_i} - {C_{(i)}}||^2`\
72-
73-
K均值聚类算法是一种解决聚类问题的算法,算法过程如下:
74-
75-
- 随机选择\ :math:`{C_1}, \cdots, {C_K}`
76-
77-
- 把\ :math:`{x_i}`\ 所对应的分类置为距离其最近的聚类中心点的分类
78-
79-
- 计算并赋值\ :math:`{C_K} = \frac{\sum_{{C_{(i)}}={C_K}} {x_i}}{\sum_{{C_{(i)}}={C_K}} 1}`
80-
81-
- 重复以上步骤直到算法收敛
82-
83-
可以证明,K均值聚类算法会使得距离和\ :math:`\sum_i ||{x_i} - {C_{(i)}}||^2`\ 不断地单调减小,并且最终能够收敛。不过,算法可能收敛到局部最小值。
84-
85-
本章结束语:
86-
87-
在系统角度,机器学习的算法无论是什么算法,涉及到高维数据任务的现都是矩阵运算实现的。
88-
89-
参考文献
90-
--------
91-
92-
.. bibliography:: ../references/appendix.bib
93-
:style: apa
2+
[TODO: src =
3+
zh_chapters/appendix_machine_learning_introduction/classic_machine_learning.md]
Lines changed: 2 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,3 @@
11

2-
梯度下降与反向传播
3-
------------------
4-
5-
上面大体上介绍了经典神经网络的内容,那么现在有一个问题,这些网络中的参数是如何确定的呢?如果要解决的问题是一个小感知器就能解决的话,参数可以人为地去确定。但是如果是一个深度网络的话,参数的确定需要自动化,也就是所谓的网络训练,而这个过程需要我们设定一个\ **损失函数**\ (Loss
6-
Function)来作为训练优化的一个方向。
7-
常见的损失函数有:1)用来衡量向量之间距离的均方误差(Mean Squared
8-
Error,MSE)
9-
:math:`\mathcal{L} = \frac{1}{N}\|{y}-\hat{{y}}\|^{2}_{2} = \frac{1}{N}\sum_{i=1}^N(y_{i}-\hat{y}_{i})^{2}`
10-
和 平均绝对误差(Mean Absolute Error,MAE)
11-
:math:`\mathcal{L} = \frac{1}{N}\sum_{i=1}^{N}|y_{i}-\hat{y}_{i}|`
12-
,其中\ :math:`N`\ 代表数据样本的数量,用以求平均用,而\ :math:`y`\ 代表真实标签(Ground
13-
Truth)、\ :math:`\hat{y}`\ 代表网络输出的预测标签。
14-
2)分类任务可以用的交叉熵损失(Cross Entropy)
15-
:math:`\mathcal{L} = - \frac{1}{N} \sum_{i=1}^N \bigg(y_{i}\log\hat{y}_{i} + (1 - y_{i})\log(1 - \hat{y}_{i})\bigg)`\ 来作为损失数,当且仅当输出标签和预测标签一样的时候损失值才为零。
16-
17-
有了损失值之后,我们就可以利用大量真实标签的数据和优化方法来更新模型参数了,其中最常用的方法是\ **梯度下降**\ (Gradient
18-
Descent)。如 :numref:`gradient_descent2`\ 所示,
19-
开始的时候,模型的参数\ :math:`{w}`\ 是随机选取的,然后求出损失值对参数的偏导数\ :math:`\frac{\partial \mathcal{L}}{\partial {w}}`\ ,通过反复迭代
20-
:math:`{w}:={w}-\alpha\frac{\partial \mathcal{L}}{\partial {w}}`\ 完成优化。这个优化的过程其实就可以降低损失值以达到任务目标,其中\ :math:`\alpha`\ 是控制优化幅度的\ **学习率**\ (Learning
21-
Rate)。
22-
在实践中,梯度下降最终得到的最小值很大可能是一个局部最小值,而不是全局最小值。不过由于深度神经网络能提供一个很强的数据表达能力,所以局部最小值可以很接近全局最小值,损失值可以足够小。
23-
24-
.. _gradient_descent2:
25-
26-
.. figure:: ../img/ch_basic/gradient_descent2.png
27-
:width: 600px
28-
29-
梯度下降介绍。(左图)只有一个可以训练的参数\ :math:`w`\ ;(右图)有两个可以训练的参数\ :math:`{w}=[w_1,w_2]`\ 。在不断更新迭代参数后,损失值\ :math:`\mathcal{L}`\ 会逐渐地减小。但是由于存在很多局部最优解,我们往往不能更新到全局最优解。
30-
31-
32-
33-
那么接下来,在深度神经网络中如何实现梯度下降呢,这需要计算出网络中每层参数的偏导数\ :math:`\frac{\partial \mathcal{L}}{\partial {w}}`\ ,我们可以用\ **反向传播**\ (Back-Propagation)
34-
:cite:`rumelhart1986learning,lecun2015deep`\ 来实现。 接下来,
35-
我们引入一个中间量\ :math:`{\delta}=\frac{\partial \mathcal{L}}{\partial {z}}`\ 来表示损失函数\ :math:`\mathcal{L}`
36-
对于神经网络输出\ :math:`{z}`\ (未经过激活函数,不是\ :math:`a`\ )的偏导数,
37-
并最终得到\ :math:`\frac{\partial \mathcal{L}}{\partial {w}}`\
38-
39-
我们下面用一个例子来介绍反向传播算法,
40-
我们设层序号为\ :math:`l=1, 2, \ldots L`\ (输出层(最后一层)序号为\ :math:`L`\ )。
41-
对于每个网络层,我们有输出\ :math:`{z}^l`\ ,中间值\ :math:`{\delta}^l=\frac{\partial \mathcal{L}}{\partial {z}^l}`\ 和一个激活值输出\ :math:`{a}^l=f({z}^l)`
42-
(其中\ :math:`f`\ 为激活函数)。
43-
我们假设模型是使用Sigmoid激活函数的多层感知器,损失函数是均方误差(MSE)。也就是说,我们设定:
44-
45-
- 网络结构\ :math:`{z}^{l}={W}^{l}{a}^{l-1}+{b}^{l}`
46-
47-
- 激活函数\ :math:`{a}^l=f({z}^l)=\frac{1}{1+{\rm e}^{-{z}^l}}`
48-
49-
- 损失函数\ :math:`\mathcal{L}=\frac{1}{2}\|{y}-{a}^{L}\|^2_2`
50-
51-
我们可以直接算出激活输出对于原输出的偏导数:
52-
53-
- :math:`\frac{\partial {a}^l}{\partial {z}^l}=f'({z}^l)=f({z}^l)(1-f({z}^l))={a}^l(1-{a}^l)`
54-
55-
和损失函数对于激活输出的偏导数:
56-
57-
- :math:`\frac{\partial \mathcal{L}}{\partial {a}^{L}}=({a}^{L}-{y})`
58-
59-
有了这些后,为了进一步得到损失函数对于每一个参数的偏导数,可以使用\ **链式法则**\ (Chain
60-
Rule),细节如下:
61-
62-
首先,从输出层(\ :math:`l=L`\ ,最后一层)开始向后方传播误差,根据链式法则,我们先计算输出层的中间量:
63-
64-
- :math:`{\delta}^{L} =\frac{\partial \mathcal{L}}{\partial {z}^{L}} =\frac{\partial \mathcal{L}}{\partial {a}^{L}}\frac{\partial {a}^L}{\partial {z}^{L}}=({a}^L-{y})\odot({a}^L(1-{a}^L))`
65-
66-
除了输出层(\ :math:`l=L`\ )的中间值\ :math:`{\delta}^{L}`\ ,其他层(\ :math:`l=1, 2, \ldots , L-1`\ )的中间值\ :math:`{\delta}^{l}`\ 如何计算呢?
67-
68-
- 已知模型结构\ :math:`{z}^{l+1}={W}^{l+1}{a}^{l}+{b}^{l+1}`\ ,我们可以直接得到\ :math:`\frac{\partial {z}^{l+1}}{\partial {a}^{l}}={W}^{l+1}`\ ;而且我们已知\ :math:`\frac{\partial {a}^l}{\partial {z}^l}={a}^l(1-{a}^l)`
69-
70-
- 那么根据链式法则,我们可以得到
71-
:math:`{\delta}^{l} =\frac{\partial \mathcal{L}}{\partial {z}^{l}} =\frac{\partial \mathcal{L}}{\partial {z}^{l+1}}\frac{\partial {z}^{l+1}}{\partial {a}^{l}}\frac{\partial {a}^{l}}{\partial {z}^{l}} =({W}^{l+1})^\top{\delta}^{l+1}\odot({a}^l(1-{a}^l))`
72-
73-
根据上面的计算有所有层的中间值\ :math:`{\delta}^l, l=1, 2, \ldots , L`\ 后,我们就可以在此基础上求出损失函数对于每层参数的偏导数:\ :math:`\frac{\partial \mathcal{L}}{\partial {W}^l}`\ \ :math:`\frac{\partial \mathcal{L}}{\partial {b}^l}`\ ,以此来根据梯度下降的方法来更新每一层的参数。
74-
75-
- 已知模型结构\ :math:`{z}^l={W}^l{a}^{l-1}+{b}^l`\ ,我们可以求出
76-
:math:`\frac{\partial {z}^{l}}{\partial {W}^l}={a}^{l-1}` 和
77-
:math:`\frac{\partial {z}^{l}}{\partial {b}^l}=1`
78-
79-
- 那么根据链式法则,我们可以得到\ :math:`\frac{\partial \mathcal{L}}{\partial {W}^l}=\frac{\partial \mathcal{L}}{\partial {z}^l}\frac{\partial {z}^l}{\partial {W}^l}={\delta}^l({a}^{l-1})^\top`
80-
,
81-
:math:`\frac{\partial \mathcal{L}}{\partial {b}^l}=\frac{\partial \mathcal{L}}{\partial {z}^l}\frac{\partial {z}^l}{\partial {b}^l}={\delta}^l`
82-
83-
求得所有偏导数\ :math:`\frac{\partial \mathcal{L}}{\partial {W}^l}` 和
84-
:math:`\frac{\partial \mathcal{L}}{\partial {b}^l}`\ 后,我们就可以用梯度下降更新所有参数\ :math:`{W}^l`
85-
:math:`{b}^l`\
86-
87-
- :math:`{W}^l:={W}^l-\alpha\frac{\partial \mathcal{L}}{\partial {W}^l}`,
88-
:math:`{b}^l:={b}^l-\alpha\frac{\partial \mathcal{L}}{\partial {b}^l}`
89-
90-
但是还有一个问题需要解决,那就是梯度下降的时候每更新一次参数,都需要计算一次当前参数下的损失值。然而,当训练数据集很大时(\ :math:`N`\ 很大),若每次更新都用整个训练集来计算损失值的话,计算量会非常巨大。
91-
为了减少计算量,我们使用\ **随机梯度下降**\ (Stochastic Gradient
92-
Descent,SGD)来计算损失值。具体来说,我们计算损失值不用全部训练数据,而是从训练集中随机选取一些数据样本来计算损失值,比如选取16、32、64或者128个数据样本,样本的数量被称为\ **批大小**\ (Batch
93-
Size)。
94-
此外,学习率的设定也非常重要。如果学习率太大,可能无法接近最小值的山谷,如果太小,训练又太慢。
95-
自适应学习率,例如Adam :cite:`KingmaAdam2014`\ 、RMSProp :cite:`tieleman2012rmsprop`\
96-
Adagrad :cite:`duchi2011adagrad`\ 等,在训练的过程中通过自动的方法来修改学习率,实现训练的快速收敛,到达最小值点。
2+
[TODO: src =
3+
zh_chapters/appendix_machine_learning_introduction/gradient_descent.md]
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,3 @@
11

2-
附录:机器学习介绍
3-
==================
4-
5-
本书假设读者有一定的机器学习算法基础,因此本章只会简略地介绍一下机器学习,其中的梯度下降方法对本书机器学习系统来说尤为重要,是必须掌握的内容。
6-
7-
.. toctree::
8-
:maxdepth: 2
9-
:numbered:
10-
11-
neural_network
12-
gradient_descent
13-
classic_machine_learning
2+
[TODO: src =
3+
zh_chapters/appendix_machine_learning_introduction/index.md]

0 commit comments

Comments
 (0)