吴恩达机器学习教程学习笔记 (2/16)
吴恩达教授(Andrew Ng)的机器学习可以说是一门非常重视ML理论基础的课程,做做一些简单的笔记加上个人的理解。本笔记根据吴恩达的课程顺序,以每章内容作为节点进行记录。(共18章,其中第3章“线性代数回顾”与第5章“Octava教程”的笔记就不总结了)
第二章 单变量线性回归
1、模型表示
例子
如果一套房子是1250平方尺大小,想要知道这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,能以大约220000(美元)左右的价格卖掉这个房子。
以上答案,是根据我们的数据预测房子实际的价格是多少,这便是一个回归问题。回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是预测价格。更进一步来说,在监督学习中我们有一个数据集,这个数据集被称训练集。
继续以上图的房屋价格为例,假使我们回归问题的训练集(Training Set)如下表所示:
我们将要用来描述这个回归问题的标记如下:
m 代表训练集中实例的数量
x 代表特征/输入变量
y 代表目标变量/输出变量
(x,y) 代表训练集中的实例
(x(i),y(i)) 代表第i 个观察实例
h 代表学习算法的解决方案或函数也称为假设(hypothesis)
h代表hypothesis(假设),h表示一个函数,输入是房屋尺寸大小,就像你朋友想出售的房屋,因此 h 根据输入的x值来得出y值,y值对应房子的价格。因此,h是一个从x到y的函数映射。
表达方式为:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_θ (x)=θ_0+θ_1 x
hθ(x)=θ0+θ1x因只含有一个特征/输入变量,这样的问题被称为单变量线性回归问题。
2、代价函数 (Cost Function)
代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。我们之所以要求出误差的平方和,是因为误差平方代价函数,对于大多数问题,特别是回归问题,都是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。
代价函数:
J
(
θ
0
,
θ
1
)
=
1
/
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(θ_0,θ_1 )=1/2m ∑_{i=1}^m(h_θ (x^{(i)})-y^{(i)} )^2
J(θ0,θ1)=1/2mi=1∑m(hθ(x(i))−y(i))2目标便是选择出可以使得建模误差的平方和能够最小的模型参数。
例子
这是一个简单的数据集,上面的三个点是训练集,现在想要通过这三个点来作回归预测。假设有三个方程:
我们以θ0= 0 , θ1= 0.5为例:
我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(上图中蓝线所指)就是建模误差(modeling error)。
根据代价函数公式:
J
(
θ
0
,
θ
1
)
=
1
/
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(θ_0,θ_1 )=1/2m ∑_{i=1}^m(h_θ (x^{(i)})-y^{(i)} )^2
J(θ0,θ1)=1/2mi=1∑m(hθ(x(i))−y(i))2计算出J:
J
(
0
,
0.5
)
=
1
/
(
2
∗
3
)
[
(
0.5
−
1
)
2
+
(
1
−
2
)
2
+
(
1.5
−
3
)
2
]
=
0.583
J(0,0.5 )=1/(2*3) [(0.5-1)^2+(1-2)^2+(1.5-3)^2]=0.583
J(0,0.5)=1/(2∗3)[(0.5−1)2+(1−2)2+(1.5−3)2]=0.583
这时,我们绘制一个等高线图,三个坐标分别为θ0和θ1和J(θ0,θ1):
则可以看出在三维空间中存在一个使得J(θ0,θ1)最小的点。
回到房价预测问题,结合以上方法,我们可以绘制出:
其中右上图是一个平面等高线图,其中每一个椭圆环代表的是相同的代价函数J的所有点的集合。其中红点代表的是J的最小值。
3、梯度下降
由于我们知道当代价函数J是最小值时,预测函数是最理想的,但是我们如何找到代价函数J中的参数呢?梯度下降是一个用来求函数最小值的算法,它可以求出代价函数J(θ0,θ1)的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合(θ0,θ1,…,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
如图中所示,任意取一个点,然后通过梯度下降算法,一步一步让代价函数靠近局部最小值,可以想象成你在山上,然后一步一步顺着山的坡度,小碎步下山。
批量梯度下降(batch gradient descent)算法的公式为:
其中α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新θ0和θ1 ,当 j=0 和j=1时,会产生更新,所以你将更新J(θ0)和J(θ1)。实现梯度下降算法的微妙之处是,在这个表达式中,如果你要更新这个等式,你需要同时更新θ0和θ1,我的意思是在这个等式中,我们要这样更新:
θ0:= θ0 ,并更新θ1:= θ1。(" := "是赋值的意思)
实现方法是:你应该计算公式右边的部分,通过那一部分计算出θ0和θ1的值,然后同时更新θ0和θ1。
同时,temp0、temp1是同步更新θ0、θ1的。
请注意比较,下面是错误的更新方式:
算法详细描述:
对θ赋值,使得J(θ)按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
对于这个问题,求导的目的,基本上可以说取这个红点的切线,就是这样一条红色的直线,刚好与函数相切于这一点,让我们看看这条红色直线的斜率,就是这条刚好与函数曲线相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条线有一个正斜率,也就是说它有正导数,因此,我得到的新的θ1,θ1更新后等于θ1减去一个正数乘以α。
如果α太小了,即我的学习速率太小,结果就是它会一点点挪动,它会需要很多步才能到达全局最低点。
如果α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远。
我想找到它的最小值,首先初始化我的梯度下降算法,在那个品红色的点初始化,如果我更新一步梯度下降,也许它会带我到这个点,因为这个点的导数是相当陡的。现在,在这个绿色的点,如果我再更新一步,你会发现我的导数,也即斜率,是没那么陡的。随着我接近最低点,我的导数越来越接近零,所以,梯度下降一步后,新的导数会变小一点点。然后我想再梯度下降一步,在这个绿点,我自然会用一个稍微跟刚才在那个品红点时比,再小一点的一步,到了新的红色点,更接近全局最低点了,因此这点的导数会比在绿点时更小。所以,我再进行一步梯度下降时,我的导数项是更小的,θ1更新的幅度就会更小。所以随着梯度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现,已经收敛到局部极小值。
有一种情况,当θ_1初始化在局部最低点,它已经在一个局部的最优处或局部最低点。结果是局部最优点的导数将等于零,因为它是那条切线的斜率。这意味着你已经在局部最优点,它使得θ1不再改变,也就是新的θ1等于原来的θ1。
感谢黄海广博士团队的翻译和笔记
END