一、机器学习相关概念
1.1 机器学习的定义
计算机程序从任务 T 中学习经验 E,并根据性能度量 P 获得更好的效果。
对于垃圾邮件过滤系统:
- 任务 T :对邮件是否为垃圾邮件进行判定
- 经验 E :有是否为垃圾邮件标记的这些邮件
- 性能度量 P :对邮件正确进行分类的比例。
1.2 机器学习算法的分类
1.2.1 分类与回归
分类(classification)就是给定一个数据集,将其中的每个元素与一个离散的值一一对应。
例如,对于一组手写体数字的数据集来说,我们的目的是将每张图片中的数字识别出来,那么每张图片最后对应的就是一个数字,这些预测的结果是离散分布的,即 0 , 1 , ⋯ , 9 0,1,\cdots, 9 0,1,⋯,9,所以这是一个分类问题。
回归(regression)就是数据集中的元素预测的结果是连续的。
比如对于房子房价的预测,我们得到的房价的值是连续的值,而不是固定的只有几个值,即 33.5 , 33 , 6 , 55.8 33.5, 33,6,55.8 33.5,33,6,55.8 等,只要是一个数值,都有可能成为预测的结果,这就是回归。
分类与回归之间的区别就是预测得到的结果是离散的还是连续的。
1.2.2 监督学习(Supervised Learning)
监督学习:给定一个数据集,其中的每个元素都包含一个对应的真实结果,我们根据数据和它们对应的真实结果训练出一个模型,这个模型可以对新给出的数据做出尽可能接近接近其真实结果的预测。
对于一个根据房子面积预测房价的问题来说,监督学习的过程就是根据现在已出售房子的数据,来对新给出的房子的价格做一个预测。
下图包含了对应面积房子的出售价格,有了这些数据,就可以使用监督学习建立一个模型,如果给出了指定面积的房子,我们就可以使用这个模型对该房子的价值做出预测。
对于房价的预测,我们可以知道预测的结果应该是分布在某个区间内的连续值,所以这是一个回归问题。
对于一个肿瘤预测的问题来说,其主要目的是根据肿瘤的特征对肿瘤进行分类,下图中根据肿瘤大小和年龄将不同特征的肿瘤展示在坐标中,红叉代表肿瘤细胞,蓝色的圈代表正常细胞,我们根据给定的样本学习一个模型,那么当我们给出新样本时候(紫色的圆点),就可以利用模型来判断新样本是属于肿瘤细胞还是正常细胞。
从上面的描述可以看出,对于肿瘤预测的问题,预测的结果是离散的值,即是肿瘤细胞或不是肿瘤细胞,因此这对应的是分类问题。
1.2.3 无监督学习(Unsupervised Learning)
无监督学习:在无监督学习中,每个样本没有对应的真实标签,也就是所有的样本都是相同的,通过无监督学习算法自动的找到这些数据的结构。
下图表示无监督学习中的数据集,它们都没有对应的标签来区分属于哪一类,我们可以通过监督学习算法,发现它们是属于两个 “簇”,所以就可以自动的分为两类,这种将数据集直接分簇的算法称为 聚类。
二、线性回归
2.1 模型描述
首先看一下对数据集的表示方式,在监督学习中,我们记数据集的一个样本为 ( x , y ) (x,y) (x,y),用 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)) 表示第 i i i 个样本, x x x 代表数据, y y y 代表数据对应的真实标签,带有真实标签的数据集称为训练集。
对于一个监督学习算法,其学习方式为:
- 给定一个数据集,监督学习算法从数据集中学习一个 假设函数 h(hypothesis),使得假设函数可以将新给出的样本映射到一个对应的真实标签。
对于房价预测来说,就是给定一组房子面积及其对应的价格组成的数据集,通过学习算法学得一个能够根据房子面积预测价格的假设函数 h,当我们给出一个新房子的面积时,可以使用该假设函数来预测其价格,流程如下所示:
现在我们知道了学习算法的目的就是得到假设函数,但是假设函数是什么?我们怎么来表示假设函数呢?
假设函数有很多种表示方式,一种最简单的就是线性函数,这是因为线性函数是更复杂模型的基础,所以首先从最简单的线性函数开始,线性函数表示的假设函数有如下的形式:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta (x)=\theta_0 +\theta_1 x
hθ(x)=θ0+θ1x
假设函数也可以简写为
h
(
x
)
h(x)
h(x) ,线性的假设函数在坐标中表示是一条直线,如下图所示:
这种特定的模型称为线性回归,上面的例子中只有一个自变量,因此称为 一元线性回归。
2.2 代价函数
2.2.1 代价函数的定义
上面我们给出了线性假设函数的形式,如下所示:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta (x)=\theta_0 +\theta_1 x
hθ(x)=θ0+θ1x
其中 x x x 表示给出的数据,式子中的 θ 0 \theta_0 θ0 与 θ 1 \theta_1 θ1 称为模型参数,选择不同大小的模型参数时会得到不同的假设函数,如下图所示:
在线性回归中,对于一个给定的数据集,表示在坐标系中如下图所示,我们希望通过确定
θ
0
\theta_0
θ0 与
θ
1
\theta_1
θ1 的值,从而使得假设函数表示的直线与图中的数据点尽可能地拟合,也就是下图中的蓝线:
我们的目的是使假设函数能够与坐标点尽可能拟合,那么问题就可以转换为:对于数据集中的任意一个
x
x
x ,我们可以使得
h
(
x
)
h(x)
h(x) 与真实标签
y
y
y 尽可能接近,对于一个包含
m
m
m 个样本的训练集,我们可以将
h
(
x
)
h(x)
h(x) 与
y
y
y 之间尽可能小的差距表示为:
min
θ
0
θ
1
1
2
m
∑
i
=
1
m
[
h
(
x
(
i
)
)
−
y
(
i
)
]
2
\min_{\theta_0\theta_1} \frac{1}{2m} \sum^m_{i=1} \left[ h(x^{(i)})-y^{(i)} \right ] ^2
θ0θ1min2m1i=1∑m[h(x(i))−y(i)]2
上式表示预测值与实际值的差的 平方误差,其中的 1 m \frac{1}{m} m1 是求所有样本的平均误差,而 1 2 \frac{1}{2} 21 是为了后面的计算方便,加上这两个系数对于计算 θ 0 \theta_0 θ0 与 θ 1 \theta_1 θ1 得到的值并没有影响。
这里我们就可以定义一个代价函数:
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
[
h
(
x
(
i
)
)
−
y
(
i
)
]
2
J( \theta_0 ,\theta_1)=\frac{1}{2m}\sum^m_{i=1} \left[ h(x^{(i)})-y^{(i)} \right ] ^2
J(θ0,θ1)=2m1i=1∑m[h(x(i))−y(i)]2
我们的问题也就转换为,求出使得代价函数最小的
θ
0
\theta_0
θ0 与
θ
1
\theta_1
θ1 的值,表示为下式:
min
θ
0
,
θ
1
J
(
θ
0
,
θ
1
)
\min_{\theta_0,\theta_1} J(\theta_0,\theta_1)
θ0,θ1minJ(θ0,θ1)
上式的代价函数也被称作 平方误差函数 ,平方误差函数对于大多数回归问题都有很好的作用,所以是解决回归问题最常用的手段。
2.2.2 简化代价函数的可视化
为了更好的对代价函数
J
J
J 进行可视化,我们令
θ
0
=
0
\theta_0 = 0
θ0=0,这样假设函数就可以简化为通过原点的函数
h
(
x
)
=
θ
1
x
h(x)=\theta_1 x
h(x)=θ1x,代价函数就变为一个变量
θ
1
\theta_1
θ1 的函数
J
(
θ
)
=
1
2
m
∑
i
=
1
m
[
h
(
x
(
i
)
)
−
y
(
i
)
]
2
J(\theta)=\frac{1}{2m} \sum^m_{i=1} \left[ h(x^{(i)})-y^{(i)} \right ] ^2
J(θ)=2m1∑i=1m[h(x(i))−y(i)]2,我们的问题也就转换为:
min
θ
1
J
(
θ
1
)
\min_{\theta_1}J(\theta_1)
θ1minJ(θ1)
h
(
x
)
h(x)
h(x) 是一个关于
x
x
x 的函数,而
J
(
θ
1
)
J(\theta_1)
J(θ1) 是一个关于
θ
1
\theta_1
θ1 的函数, 对于一个有如下分布的训练集,选择不同的
θ
1
\theta_1
θ1 时,得到的假设函数
h
(
x
)
h(x)
h(x) 是不同的,这时得到的代价函数的值也是不同的。下图中红色的 ×
表示数据点,我们分别选择
θ
=
1
,
0.5
,
0
\theta=1,0.5,0
θ=1,0.5,0 会得到不同的拟合直线,如下图所示:
下面我们根据不同的
θ
1
\theta_1
θ1 的值来计算代价函数,对于
θ
1
=
1
,
0.5
,
0
\theta_1 =1,0.5,0
θ1=1,0.5,0 来说,
J
(
1
)
=
1
2
×
3
[
(
1
−
1
)
2
+
(
2
−
2
)
2
+
(
3
−
3
)
2
]
=
0
J(1)=\frac{1}{2\times 3}\left[(1-1)^2+(2-2)^2+(3-3)^2\right]=0
J(1)=2×31[(1−1)2+(2−2)2+(3−3)2]=0
J ( 0.5 ) = 1 2 × 3 [ ( 0.5 − 1 ) 2 + ( 1 − 2 ) 2 + ( 1.5 − 3 ) 2 ] ≈ 0.58 J(0.5)=\frac{1}{2\times 3}\left[(0.5-1)^2+(1-2)^2+(1.5-3)^2\right]\approx 0.58 J(0.5)=2×31[(0.5−1)2+(1−2)2+(1.5−3)2]≈0.58
J ( 0 ) = 1 2 × 3 [ ( 0 − 1 ) 2 + ( 0 − 2 ) 2 + ( 0 − 3 ) 2 ] ≈ 2.3 J(0)=\frac{1}{2\times 3}\left[(0-1)^2+(0-2)^2+(0-3)^2\right]\approx 2.3 J(0)=2×31[(0−1)2+(0−2)2+(0−3)2]≈2.3
选择不同的假设函数,对应于一个不同的代价函数的值,如果取很多
θ
1
\theta_1
θ1 的值,我们就能得到如下的代价函数曲线:
从代价函数曲线中我们可以看出,当 θ 1 = 1 \theta_1=1 θ1=1 时候,整个代价函数取最小值,而 θ 1 = 1 \theta_1 =1 θ1=1 时候,假设函数对应的曲线和数据点的拟合也完全重合,因此 θ 1 = 1 \theta_1=1 θ1=1 就是 min θ 1 J ( θ 1 ) \min_{\theta_1}J(\theta_1) minθ1J(θ1) 的解。
2.2.3代价函数的可视化
对于有如下数据分布的数据集,其表示房子面积和房子价格间对应的数据点,这里我们选择令
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta (x)=\theta_0 +\theta_1 x
hθ(x)=θ0+θ1x ,在选择不同的
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1 组合时,计算不同的代价函数的值。
因为有两个自变量,通过取不同的
θ
\theta
θ 值,我们可以得到一个三维坐标系中的曲面来表示代价函数,如下所示:
为了更好的观察图形的表示,我们利用等高线来表示上面的代价函数,其中的每条同样颜色的线表示在这个位置的值是相同的,其中的红点就对应于上图中整个曲面的最小点。
我们取 ( θ 0 , θ 1 ) (\theta_0,\theta_1) (θ0,θ1) 的值越接近中间的红点,表明该假设函数与数据点拟合的平方误差越小,也就是对应的假设函数越小。
但是对于越复杂的问题,其包含的参数越多,我们不能手动的计算参数与对应的值,所以我们需借助其他的方法自动的计算使得代价函数最小的点。
2.3 梯度下降
2.3.1 基本概念
梯度下降算法可用来对任意函数 J ( θ 0 , θ 1 , ⋯ , θ n ) J(\theta_0,\theta_1,\cdots,\theta_n) J(θ0,θ1,⋯,θn) 最小化,上面我们已经把假设函数的求解问题转换为最小化代价函数,最小化函数一种最常用的方法就是梯度下降,它被广泛的应用到机器学习的众多领域中,可以用来最小化任意函数。为了简化梯度下降过程的描述,这里选择有两个参数的任意函数 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)进行解释。
假设我们有一个函数 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1),我们想要求得使 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1) 最小化的参数 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1,即 min θ 0 , θ 1 J ( θ 0 , θ 1 ) \boldsymbol{\min_{\theta_0,\theta_1}J(\theta_0,\theta_1)} minθ0,θ1J(θ0,θ1),其基本步骤为:
- 任意初始化 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1
- 不断地改变 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1 来使 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1) 减少,直到达到期望的最小值
下图展示了梯度下降算法的工作流程,对于下图所示的函数
J
(
θ
0
,
θ
1
)
J(\theta_0,\theta_1)
J(θ0,θ1),我们的目的是找到该函数的最低点,我们可以在初始时候任意的选择一个点
(
θ
0
,
θ
1
)
(\theta_0,\theta_1)
(θ0,θ1) ——例如下面红色方框中的点,梯度下降就是在这个点处寻找一个方向,使得从这个方向走能够最快的走向最低点,每走一步就会得到一个新的点,我们在新点处再次寻找下降最快的点,依次循环,直到走到最低点。
梯度下降算法有一个特点,从不同的起点开始,可能会找到不同的最低点,下图表示从一个新的起点,可以发现最终走到了一个新的最低点,这些问题将会在后面深入讨论。
下面我们来看一下梯度下降的数学定义:
do{
θ j = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \qquad\theta_j = \theta_j-\alpha\frac{\partial}{\partial \theta_j} J(\theta_0,\theta_1) θj=θj−α∂θj∂J(θ0,θ1)(for j = 0 j=0 j=0 and j = 1 j=1 j=1)
} while(!convergence)
该公式表示每次先求函数 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1) 对第 j j j 个参数的导数 ∂ ∂ θ j J ( θ 0 , θ 1 ) \frac{\partial}{\partial \theta_j} J(\theta_0,\theta_1) ∂θj∂J(θ0,θ1),之后将求得的导数乘上一个 学习率 α \alpha α,令 θ j \theta_j θj 等于 θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \theta_j-\alpha\frac{\partial}{\partial \theta_j} J(\theta_0,\theta_1) θj−α∂θj∂J(θ0,θ1) 从而得到新的 θ j \theta_j θj 。
学习率 α \alpha α 用来控制梯度下降时每一步的步长,决定了更新参数的幅度,学习率越大,每次走的步长越大。
当连续多次 θ i \theta_i θi 的值不再改变时候,这个时候也就对应于代价函数也保持在某个范围内不再下降,这就表示对代价函数的优化达到了 收敛 ,这时更新结束。
对于有多个参数的函数,进行梯度下降时需要对所有的参数同时更新,如下所示:
t e m p 0 = θ 0 − α ∂ ∂ θ 0 J ( θ 0 , θ 1 ) temp0 = \theta_0-\alpha\frac{\partial}{\partial \theta_0} J(\theta_0,\theta_1) temp0=θ0−α∂θ0∂J(θ0,θ1)
t e m p 1 = θ 1 − α ∂ ∂ θ 1 J ( θ 0 , θ 1 ) temp1 = \theta_1-\alpha\frac{\partial}{\partial \theta_1} J(\theta_0,\theta_1) temp1=θ1−α∂θ1∂J(θ0,θ1)
θ 0 = t e m p 0 \theta_0 = temp0 θ0=temp0
θ 1 = t e m p 1 \theta_1 = temp1 θ1=temp1
我们不能更新 θ 0 \theta_0 θ0 后再更新 θ 1 \theta_1 θ1 ,而是用原来的值计算出来 t e m p 0 temp0 temp0 与 t e m p 1 temp1 temp1 后,再同时更新 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1 ,一般的梯度下降就是多个变量同时更新。
2.3.2 梯度下降的图形表示
对于只有一个参数的函数 J ( θ 1 ) J(\theta_1) J(θ1),如果用图形表示如下左图所示。
这里我们假设初始点
θ
1
\theta_1
θ1 在曲线的右边,这时我么对曲线求导,导数就是在该点的斜率,如右图红线所示,这时我们使用梯度更新的公式
θ
1
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
\theta_1 = \theta_1-\alpha\frac{\partial}{\partial \theta_1} J(\theta_1)
θ1=θ1−α∂θ1∂J(θ1),由于学习率一定是大于 0 的,此时的斜率是大于 0 的,那么
θ
1
\theta_1
θ1 就会向左边移动,也就是越来越接近中间的最低点。
如果初始点
θ
1
\theta_1
θ1 在曲线的左边,如下左图所示,在计算斜率时会发现斜率小于 0 ,而学习率是大于 0 的,所以更新
θ
1
\theta_1
θ1 时会让
θ
1
\theta_1
θ1 逐渐右移,接近最小点。
在梯度更新里还有一个参数是
α
\alpha
α,当
α
\alpha
α 太小时候,
θ
1
\theta_1
θ1 每次更新的步长就会比较小,这样总体更新的速度就会特别慢,如下图所示,可能需要很多次才能更新到最小点:
如果 α \alpha α 过大,就会造成梯度更新时候 θ 1 \theta_1 θ1 每次移动的步长过大,从而一次一次越过最低点,造成梯度不能收敛甚至发散,如下图所示。
经过如上的讨论,我们就能够得出结论,通过梯度下降的方式,我们可以将函数逐步逼近一个局部最低点,在每一步更新的过程中,移动的步长会逐渐减小,这是因为如下图所示,从紫色的点到绿色的点,斜率逐渐减小,所以就算我们保持
α
\alpha
α 不变,最终函数还是能够达到一个最低点。
2.3.3 线性回归中的梯度下降
在线性回归中,我们的任务是找到最小化的代价函数:
J ( θ ) = 1 2 m ∑ i = 1 m [ h ( x ( i ) ) − y ( i ) ] 2 = 1 2 m ∑ i = 1 m [ θ 0 + θ 1 x ( i ) − y ( i ) ] 2 \begin{aligned}J(\theta) & =\frac{1}{2m} \sum^m_{i=1} \left[ h(x^{(i)})-y^{(i)} \right ] ^2 \\ & =\frac{1}{2m} \sum^m_{i=1} \left[ \theta_0 + \theta_1x^{(i)}-y^{(i)} \right ] ^2 \end{aligned} J(θ)=2m1i=1∑m[h(x(i))−y(i)]2=2m1i=1∑m[θ0+θ1x(i)−y(i)]2
利用梯度下降的思想,我们对 θ 0 \theta_0 θ0 与 θ 1 \theta_1 θ1 分别进行求导,可以得到如下形式:
∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] \frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{1}{m}\sum^m_{i=1}\left[h_{\theta}(x^{(i)})-y^{(i)}\right] ∂θ0∂J(θ0,θ1)=m1i=1∑m[hθ(x(i))−y(i)]
∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x ( i ) \frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)=\frac{1}{m}\sum^m_{i=1}\left[h_{\theta}(x^{(i)})-y^{(i)}\right]x^{(i)} ∂θ1∂J(θ0,θ1)=m1i=1∑m[hθ(x(i))−y(i)]x(i)
所以,在线性回归中,梯度更新的方式为:
do{
θ 0 = θ 0 − α 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] \qquad\theta_0 = \theta_0-\alpha\frac{1}{m}\sum^m_{i=1}\left[h_{\theta}(x^{(i)})-y^{(i)}\right] θ0=θ0−αm1∑i=1m[hθ(x(i))−y(i)]
θ 1 = θ 1 − α 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x ( i ) \qquad\theta_1 = \theta_1-\alpha\frac{1}{m}\sum^m_{i=1}\left[h_{\theta}(x^{(i)})-y^{(i)}\right]x^{(i)} θ1=θ1−αm1∑i=1m[hθ(x(i))−y(i)]x(i)
} while(!convergence)
梯度下降存在一个问题就是可能会陷入局部最优,但是对于线性回归的代价函数,其总是一个凸函数,如下图所示,所以它只会包含全局最优,并不会只陷入某个局部最优,也就是通过梯度下降,我们总能找到线性回归代价函数的最小值。
下图展示了对线性回归求解代价函数最小值的过程:
上面的方式有时也称为 Batch 梯度下降,这表示每次计算梯度都遍历了整个训练集的样本。在机器学习中还存在一种只需要遍历一部分训练集就能进行梯度更新的算法,这将在以后学习。