吴恩达机器学习教程学习笔记 (15/16)
吴恩达教授(Andrew Ng)的机器学习可以说是一门非常重视ML理论基础的课程,做做一些简单的笔记加上个人的理解。本笔记根据吴恩达的课程顺序,以每章内容作为节点进行记录。(共18章,其中第3章“线性代数回顾”与第5章“Octava教程”的笔记就不总结了)
第十七章 大规模机器学习(Large Scale Machine Learning)
1、大型数据集的学习
如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好的结果。我们应该怎样应对一个有100万条记录的训练集?
以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,如果我们的学习算法需要有20次迭代,这便已经是非常大的计算代价。
首先应该做的事是去检查一个这么大规模的训练集是否真的必要,也许我们只用1000个训练集也能获得较好的效果,我们可以绘制学习曲线来帮助判断。
高方差:可通过增加数据以解决过拟合
高偏差:可通过增加额外特征、隐藏单元等以结果欠拟合
2、随机梯度下降法
如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法(SGD)来代替批量梯度下降法。
在随机梯度下降法中,我们定义代价函数为一个单一训练实例的代价:
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
=
1
/
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
cost(θ,(x^{(i)},y^{(i)}))=1/2 (h_θ (x^{(i)})-y^{(i)})^2
cost(θ,(x(i),y(i)))=1/2(hθ(x(i))−y(i))2随机梯度下降算法为:首先对训练集随机“洗牌”,然后:
随机梯度下降算法在每一次计算之后便更新参数 θ ,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。
3、小批量梯度下降
小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数b次训练实例,便更新一次参数 θ 。
通常我们会令 b 在 2-100 之间。这样做的好处在于,我们可以用向量化的方式来循环 b个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)。
在随机梯度下降中,我们在每一次更新 θ 之前都计算一次代价,然后每x次迭代后,求出这x次对训练实例计算代价的平均值,然后绘制这些平均值与x次迭代的次数之间的函数图表。
当我们绘制这样的图表时,可能会得到一个颠簸不平但是不会明显减少的函数图像(如上面左下图中蓝线所示)。我们可以增加α来使得函数更加平缓,也许便能看出下降的趋势了(如上面左下图中红线所示);或者可能函数图表仍然是颠簸不平且不下降的(如洋红色线所示),那么我们的模型本身可能存在一些错误。
如果我们得到的曲线如上面右下方所示,不断地上升,那么我们可能会需要选择一个较小的学习率α。
我们也可以令学习率随着迭代次数的增加而减小,例如令:
α
=
c
o
n
s
t
1
/
(
i
t
e
r
a
t
i
o
n
N
u
m
b
e
r
+
c
o
n
s
t
2
)
α=const1/(iterationNumber+const2)
α=const1/(iterationNumber+const2)随着我们不断地靠近全局最小值,通过减小学习率,我们迫使算法收敛而非在最小值附近徘徊。 但是通常我们不需要这样做便能有非常好的效果了,对α进行调整所耗费的计算通常不值得。
感谢黄海广博士团队的翻译和笔记
END