一、引言
1. 机器学习的定义
Tom Mitchell定义的机器学习是,一个程序被认为能从经验E中学习,解决任务T,达到性能度量值P,当且仅当,有了经验E后,经过P评判,程序在处理T时的性能有所提升。(经验E就是程序上万次的自我练习的经验而任务T 就是下棋。性能度量值P呢,就是它在与一些新的对手比赛时,赢得比赛的概率。)
2. 监督学习
一个学生从波特兰俄勒冈州的研究所收集了一些房价的数据。你把这些数据画出来,看起来是这个样子:横轴表示房子的面积,单位是平方英尺,纵轴表示房价,单位是千美元。那基于这组数据,假如你有一个朋友,他有一套750平方英尺房子,现在他希望把房子卖掉,他想知道这房子能卖多少钱。
那么关于这个问题,机器学习算法将会怎么帮助你呢?
我们应用学习算法,可以在这组数据中画一条直线,或者换句话说,拟合一条直线,根据这条线我们可以推测出,这套房子可能卖$150,000,当然这不是唯一的算法。可能还有更好的,比如我们不用直线拟合这些数据,用二次方程去拟合可能效果会更好。根据二次方程的曲线,我们可以从这个点推测出,这套房子能卖接近$200,000。稍后我们将讨论如何选择学习算法,如何决定用直线还是二次方程来拟合。两个方案中有一个能让你朋友的房子出售得更合理。这些都是学习算法里面很好的例子。以上就是监督学习的例子。
可以看出, 监督学习指的就是我们给学习算法一个数据集。这个数据集由“正确答案”组成。在房价的例子中,我们给了一系列房子的数据,我们给定数据集中每个样本的正确价格,即它们实际的售价然后运用学习算法,算出更多的正确答案。比如你朋友那个新房子的价格。用术语来讲,这叫做回归问题。我们试着推测出一个连续值的结果,即房子的价格。
一般房子的价格会记到美分,所以房价实际上是一系列离散的值,但是我们通常又把房价看成实数,看成是标量,所以又把它看成一个连续的数值。
回归这个词的意思是,我们在试着推测出这一系列连续值属性。
再举另外一个监督学习的例子。我和一些朋友之前研究过这个。假设说你想通过查看病历来推测乳腺癌良性与否,假如有人检测出乳腺肿瘤,恶性肿瘤有害并且十分危险,而良性的肿瘤危害就没那么大,所以人们显然会很在意这个问题。
这个数据集中,横轴表示肿瘤的大小,纵轴上,我标出1和0表示是或者不是恶性肿瘤。我们之前见过的肿瘤,如果是恶性则记为1,不是恶性,或者说良性记为0。
我有5个良性肿瘤样本,在1的位置有5个恶性肿瘤样本。现在我们有一个朋友很不幸检查出乳腺肿瘤。假设说她的肿瘤大概这么大,那么机器学习的问题就在于,你能否估算出肿瘤是恶性的或是良性的概率。用术语来讲,这是一个分类问题。
分类指的是,我们试着推测出离散的输出值:0或1良性或恶性,而事实上在分类问题中,输出可能不止两个值。比如说可能有三种乳腺癌,所以你希望预测离散输出0、1、2、3。0 代表良性,1 表示第1类乳腺癌,2表示第2类癌症,3表示第3类,但这也是分类问题。
因为这几个离散的输出分别对应良性,第一类第二类或者第三类癌症,在分类问题中我们可以用另一种方式绘制这些数据点。
现在我用不同的符号来表示这些数据。既然我们把肿瘤的尺寸看做区分恶性或良性的特征,那么我可以这么画,我用不同的符号来表示良性和恶性肿瘤。或者说是负样本和正样本现在我们不全部画X,良性的肿瘤改成用 O 表示,恶性的继续用 X 表示。来预测肿瘤的恶性与否。
在其它一些机器学习问题中,可能会遇到不止一种特征。举个例子,我们不仅知道肿瘤的尺寸,还知道对应患者的年龄。在其他机器学习问题中,我们通常有更多的特征,我朋友研究这个问题时,通常采用这些特征,比如肿块密度,肿瘤细胞尺寸的一致性和形状的一致性等等,还有一些其他的特征。这就是我们即将学到最有趣的学习算法之一。
那种算法不仅能处理2种3种或5种特征,即使有无限多种特征都可以处理。
3. 无监督学习
在无监督学习中,我们已知的数据。看上去有点不一样,不同于监督学习的数据的样子,即无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。所以我们已知数据集,却不知如何处理,也未告知每个数据点是什么。别的都不知道,就是一个数据集。你能从数据中找到某种结构吗?针对数据集,无监督学习就能判断出数据有两个不同的聚集簇。这是一个,那是另一个,二者不同。是的,无监督学习算法可能会把这些数据分成两个不同的簇。所以叫做聚类算法。事实证明,它能被用在很多地方。
聚类应用的一个例子就是在谷歌新闻中。如果你以前从来没见过它,你可以到这个URL网址news.google.com去看看。谷歌新闻每天都在,收集非常多,非常多的网络的新闻内容。它再将这些新闻分组,组成有关联的新闻。所以谷歌新闻做的就是搜索非常多的新闻事件,自动地把它们聚类到一起。所以,这些新闻事件全是同一主题的,所以显示到一起。
二、单变量线性回归
Linear Regression with One Variable
以之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示:
我们将要用来描述这个回归问题的标记如下:
m \ m m代表训练集中实例的数量
x \ x x代表特征/输入变量
y \ y y代表目标变量/输出变量
( x , y ) \left(x, y\right) (x,y) 代表训练集中的实例
( x ( i ) , y ( i ) ) \left(x^{(i)}, y^{(i)}\right) (x(i),y(i))代表第 个观察实例
h
\ h
h 代表学习算法的解决方案或函数也称为假设(hypothesis)
h的表达方式为:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_{\theta}(x)=\theta_{0}+\theta_{1} x
hθ(x)=θ0+θ1x,因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。
1. 代价函数
接下来我们会引入一些术语我们现在要做的便是为我们的模型选择合适的参数(parameters)
θ
0
\theta_{0}
θ0 和
θ
1
\theta_{1}
θ1 ,在房价问题这个例子中便是直线的斜率和在
y
\ y
y轴上的截距。
我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}
J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2最小。
我们绘制一个等高线图,三个坐标分别为
θ
0
\theta_{0}
θ0 和
θ
1
\theta_{1}
θ1和
J
(
θ
0
,
θ
1
)
J\left(\theta_{0}, \theta_{1}\right)
J(θ0,θ1)
则可以看出在三维空间中存在一个使得
J
(
θ
0
,
θ
1
)
J\left(\theta_{0}, \theta_{1}\right)
J(θ0,θ1)最小的点。
代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。我们之所以要求出误差的平方和,是因为误差平方代价函数,对于大多数问题,特别是回归问题,都是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。
下面直观的理解一下代价函数:
Hypothesis:
h
θ
(
x
)
=
θ
0
+
θ
1
x
\begin{array}{c}{\text { Hypothesis: }} {h_{\theta}(x)=\theta_{0}+\theta_{1} x}\end{array}
Hypothesis: hθ(x)=θ0+θ1x
Parameters:
θ
0
,
θ
1
{\text { Parameters: }} {\theta_{0}, \theta_{1}}
Parameters: θ0,θ1
cost Function: J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \begin{array}{l}{\text { cost Function: }}{J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}} \end{array} cost Function: J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2
Goal: minimize:
J
(
θ
0
,
θ
1
)
\\ {\text { Goal: minimize:} J\left(\theta_{0}, \theta_{1}\right)}
Goal: minimize:J(θ0,θ1)
(
1
)
θ
1
=
0
时
(1)\theta_{1}=0时
(1)θ1=0时
J
(
0
)
=
1
2
m
(
1
2
+
2
2
+
3
2
)
=
1
6
⋅
14
≈
2.3
\begin{aligned} J(0) =\frac{1}{2 m}\left(1^{2}+2^{2} +3^{2}\right) =\frac{1}{6} \cdot 14 \approx 2.3 \end{aligned}
J(0)=2m1(12+22+32)=61⋅14≈2.3
(
2
)
θ
1
=
0.5
时
(2)\theta_{1}=0.5时
(2)θ1=0.5时
J
(
0.5
)
=
1
2
m
(
(
0.5
)
2
+
1
2
+
(
1.5
)
2
)
=
1
6
⋅
3.5
≈
0.58
\begin{aligned} J(0.5) =\frac{1}{2 m}\left((0.5)^{2}+1^{2} +(1.5)^{2}\right) =\frac{1}{6} \cdot 3.5 \approx 0.58 \end{aligned}
J(0.5)=2m1((0.5)2+12+(1.5)2)=61⋅3.5≈0.58
(
3
)
θ
1
=
1
时
(3)\theta_{1}=1时
(3)θ1=1时
J
(
1
)
=
1
2
m
(
0
2
+
0
2
+
0
2
)
=
1
6
⋅
0
≈
0
\begin{aligned} J(1) =\frac{1}{2 m}\left(0^{2}+0^{2} +0^{2}\right) =\frac{1}{6} \cdot 0 \approx 0\end{aligned}
J(1)=2m1(02+02+02)=61⋅0≈0
…
由此我们可以得出右边图中的曲线。当然这里,我们是默认
θ
0
=
0
\theta_{0}=0
θ0=0的。在下面我们将继续讨论
θ
0
\theta_{0}
θ0 ≠0时候的曲线。
代价函数的样子,等高线图,则可以看出在三维空间中存在一个使得
J
(
θ
0
,
θ
1
)
J\left(\theta_{0}, \theta_{1}\right)
J(θ0,θ1)最小的点。
下面的图形是代价函数的轮廓图。右边的图中每个圆圈上面所代表的
θ
0
\theta_{0}
θ0 和
θ
1
\theta_{1}
θ1的值是不同的,但是代价函数
J
(
θ
0
,
θ
1
)
J\left(\theta_{0}, \theta_{1}\right)
J(θ0,θ1)的值是一样的。左图代表右图我们选择的
θ
0
\theta_{0}
θ0 和
θ
1
\theta_{1}
θ1所构成的预测函数的图形
h
θ
(
x
)
h_{\theta}(x)
hθ(x)的图形,
通过这些图形,我希望你能更好地理解这些代价函数
J
\ J
J所表达的值是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点,更接近于代价函数
J
\ J
J的最小值。
当然,我们真正需要的是一种有效的算法,能够自动地找出这些使代价函数 J \ J J取最小值的参数 θ 0 \theta_{0} θ0 和 θ 1 \theta_{1} θ1来。
2. 梯度下降
如果不懂什么是梯度的话,参考我的这篇文章 : 方向导数、梯度与梯度下降
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数
J
(
θ
0
,
θ
1
)
J\left(\theta_{0}, \theta_{1}\right)
J(θ0,θ1)的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合
(
θ
0
,
θ
1
,
…
,
.
,
,
θ
n
)
\left(\theta_{0}, \theta_{1}, \ldots, .,, \theta_{n}\right)
(θ0,θ1,…,.,,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
批量梯度下降(batch gradient descent)算法的公式为:
repeat until convergence
{
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
(
for
j
=
0
and
j
=
1
)
}
\begin{array}{l}{\text { repeat until convergence }\{ } \\ {\theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}\right) \quad(\text { for } j=0 \text { and } j=1)} \\ {\}}\end{array}
repeat until convergence {θj:=θj−α∂θj∂J(θ0,θ1)( for j=0 and j=1)}
Correct: Simultaneous update temp0 : = θ 0 − α ∂ ∂ θ 0 J ( θ 0 , θ 1 ) temp1 : = θ 1 − α ∂ ∂ θ 1 J ( θ 0 , θ 1 ) θ 0 : = temp 0 θ 1 : = temp1 \begin{array}{l}{\text { Correct: Simultaneous update }} \\ {\text { temp0 } :=\theta_{0}-\alpha \frac{\partial}{\partial \theta_{0}} J\left(\theta_{0}, \theta_{1}\right)} \\ {\text { temp1} :=\theta_{1}-\alpha \frac{\partial}{\partial \theta_{1}} J\left(\theta_{0}, \theta_{1}\right)} \\ {\theta_{0} :=\operatorname{temp} 0} \\ {\theta_{1} :=\text { temp1 }}\end{array} Correct: Simultaneous update temp0 :=θ0−α∂θ0∂J(θ0,θ1) temp1:=θ1−α∂θ1∂J(θ0,θ1)θ0:=temp0θ1:= temp1
在梯度下降算法中,我们要更新 θ 0 \theta_{0} θ0 和 θ 1 \theta_{1} θ1,当 j = 0 j=0 j=0 和 j = 1 j=1 j=1 时,会产生更新,所以你将更新 J ( θ 0 ) J\left(\theta_{0}\right) J(θ0)和 J ( θ 1 ) J\left(\theta_{1}\right) J(θ1)。在这个表达式中,如果你要更新这个等式,你需要同时更新 θ 0 \theta_{0} θ0 和 θ 1 \theta_{1} θ1,我的意思是在这个等式中,我们要这样更新:
θ 0 \theta_{0} θ0 := θ 0 \theta_{0} θ0 ,并更新 θ 1 \theta_{1} θ1:= θ 1 \theta_{1} θ1。
:=表示赋值, α \alpha α表示学习率(learning rate),它控制我们以多大的速率更新 θ j \theta_{j} θj
实现方法是:你应该计算公式右边的部分,通过那一部分计算出 θ 0 \theta_{0} θ0 和 θ 1 \theta_{1} θ1的值,然后同时更新 θ 0 \theta_{0} θ0 和 θ 1 \theta_{1} θ1。
在梯度下降算法中,这是正确实现同时更新的方法。我不打算解释为什么你需要同时更新,同时更新是梯度下降中的一种常用方法,更自然的实现方法。当人们谈到梯度下降时,他们的意思就是同步更新。
如果你熟悉偏导数和导数,这其实就是这个微分项:
α
∂
∂
θ
0
J
(
θ
0
,
θ
1
)
,
α
∂
∂
θ
1
J
(
θ
0
,
θ
1
)
\alpha \frac{\partial}{\partial \theta_{0}} J\left(\theta_{0}, \theta_{1}\right), \alpha \frac{\partial}{\partial \theta_{1}} J\left(\theta_{0}, \theta_{1}\right)
α∂θ0∂J(θ0,θ1),α∂θ1∂J(θ0,θ1)
下面我们更直观地感受一下这个算法是做什么的,以及梯度下降算法的更新过程有什么意义。梯度下降算法如下:
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
\theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta)
θj:=θj−α∂θj∂J(θ)
描述:对
θ
\theta
θ赋值,使得
J
(
θ
)
J\left(\theta\right)
J(θ)按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中
α
\alpha
α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
求导的目的:取这个红点的切线,刚好与函数相切于这一点,这条直线的斜率正好是这个三角形的高度除以这个水平长度,这条线有一个正斜率,也就是说它有正导数,因此,我得到的新的 θ 1 \theta_{1} θ1, θ 1 \theta_{1} θ1更新后等于 θ 1 \theta_{1} θ1减去一个正数乘以 α \alpha α。
如果太小或太大会出现什么情况:
- 如果 α \alpha α太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
- 如果 α \alpha α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果太大,它会导致无法收敛,甚至发散。
如果我们预先把 θ 1 \theta_{1} θ1放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?
假设你将
θ
1
\theta_{1}
θ1初始化在局部最低点,在这儿,它已经在一个局部的最优处或局部最低点。结果是局部最优点的导数将等于零,因为它是那条切线的斜率。这意味着你已经在局部最优点,它使得
θ
1
\theta_{1}
θ1不再改变,也就是新的
θ
1
\theta_{1}
θ1等于原来的
θ
1
\theta_{1}
θ1,因此,如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这也解释了为什么即使学习速率
α
\alpha
α保持不变时,梯度下降也可以收敛到局部最低点。
首先初始化我的梯度下降算法,在那个品红色的点初始化,更新一步梯度下降,也许它会带我到这个绿色的点,再更新一步,你会发现斜率,是没那么陡的。随着接近最低点,导数越来越接近零,所以,梯度下降一步后,新的导数会变小一点点。然后再梯度下降一步,在这个绿点,自然会用一个稍微跟刚才在那个品红点时比,再小一点的一步,到了新的红色点,更接近全局最低点了,因此这点的导数会比在绿点时更小。所以再进行一步梯度下降时,导数项是更小的,
θ
1
\theta_{1}
θ1更新的幅度就会更小。随着梯度下降法的运行,移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现,已经收敛到局部极小值。