书接上回,机器学习的基础知识大家应该有所了解,今天再继续学习几个机器学习的概念,方便以后学习的理解。
机器学习算法的重点在于我们要能够在位置的数据中获得良好的结果,而不是只看在测试机中表现良好,要能够应对不同的数据输入,这种能力被称为泛化。
容量、过拟合、欠拟合
通常情况下,我们在训练机器学习模型时候,我们往往希望能够有更少的测试误差,这些误差来源于不同的新输入的未训练的数据中,我们要考虑到这些未训练数据所占总体的概率分布。通常上我们从训练集中分裂出一部分作为测试集,通过这部分测试集来计算我们的模型训练的泛化误差(测试误差)。
在我们上篇文章的线性回归中,通过最小化训练误差来训练模型,
1
m
(
t
r
a
i
n
)
∣
∣
X
(
t
r
a
i
n
)
ω
−
y
(
t
r
a
i
n
)
∣
∣
2
2
\dfrac{1}{m^{(train)}}||X^{(train)}\omega-y^{(train)}||^2_2
m(train)1∣∣X(train)ω−y(train)∣∣22
但是我们真正希望关注的是测试误差
1
m
(
t
e
s
t
)
∣
∣
X
(
t
e
s
t
)
ω
−
y
(
t
e
s
t
)
∣
∣
2
2
\dfrac{1}{m^{(test)}}||X^{(test)}\omega-y^{(test)}||^2_2
m(test)1∣∣X(test)ω−y(test)∣∣22
当我们只能观测测试集时,如何才能知道它的性能精确度呢?统计学习理论(statistical learning theory)提供了一些解决方法。如果收集到的训练集和测试集的收集方式随机,那么我们的确无法对最后的性能做出足够的分析,所以我们需要对收集到的数据集多一点筛选操作。
训练集和测试集被设计为数据集的流程被称为数据生成过程(data generating process)的概率分布。通常情况下,我们会对这一系列操作统称为独立同分布假设。简单解释就是,数据集中所有的单例样本都具备彼此相互独立的,并且训练集和测试集采用相同的分布。通过这个概率框架和独立分布假设允许我们从数学上研究训练误差和测试误差之间的关系。
当然在使用机器学习算法时,我们并不会提前固定参数,然后再采样得到两个数据集。我们采样得到的训练集,然后挑选参数去降低训练集的误差,然后采样得到测试集。在这个过程中,测试误差期望会大于等于训练误差期望。以下是决定机器学习算法效果是否好的因素:
- 降低训练误差。
- 缩小训练误差和测试误差的差距。
两个因素影响的主要挑战就是:欠拟合和过拟合。欠拟合是指在训练中模型无法获得足够低的误差,而过拟合试指训练中训练误差与测试误差差距过大。
通过调整模型的容量,我们可以控制模型在欠拟合和过拟合之间的偏向。简单来说,就是必须选择一个适合大小的数据集,太多太少都会对最后有所影响。
空着这里容量的方法一种是选择假设空间(hypothesis space),即学习算法可以选择为了解决问题的指定数据集。例如,线性回归算法将关于其输入的所有线性函数作为其假设空间。广义线性回归的假设空间就包含了多项式函数,而不是只有线性函数。这样就增加了模型的容量。
一次多项式提供了熟悉的线性回归模型,预测如下:
y
^
=
b
+
ω
x
\hat{y}=b+\omega x
y^=b+ωx
通过引入
x
2
x^2
x2作为线性回归的另一个特征函数,我们可以建立模型如下:
y
^
=
b
+
ω
1
x
+
ω
2
x
2
\hat{y}=b+\omega_1x+\omega_2x^2
y^=b+ω1x+ω2x2
尽管这是一个二次函数,但是输入的参数仍然是线性的,因此我们仍然可以用正规规方程得到模型的解。我们可以继续添加
x
x
x更高的幂作为额外特征,例如下面的九次多项式:
y
^
=
b
+
∑
i
=
1
9
ω
i
x
i
\hat{y}=b+\displaystyle\sum^9_{i=1}\omega_ix^i
y^=b+i=1∑9ωixi
通过上面的三个函数,对应我们上节使用的简单5个数据的数据集进行测试,一次多项式无法穿越所有的数据点,九次函数穿过了所有的数据点,但是训练的参数比数据还多,这只能表示这是广多最符合当前数据集的函数,无法适应其他新的数据。而二次函数更加的贴近,所以它能够很好的泛化到新数据上。
没有免费午餐定理
初次看到这个定理名字总感觉有些奇怪,感觉这个与机器学习没有什么实际上的关联。这个定理的主要含义就是机器学习算法在当下蓬勃发展,各种算法相继现身,但是经过数据学家们的测试发现,所有的算法在相对应的数据集中进本都是相同的结果,无法找到一个绝对优秀的算法能够适用于任何场景,当然这些基础前提是数据集足够的广泛,包含所有类别。
这就意味着针对不同的任务要选择不同优化的算法与数据集,机器学习的目标不是寻找一个绝对的优化算法,而是具体问题具体分析,实现不同问题的最优解决方案。
正则化
至此,我们具体讨论以下如何修改学习算法,只有通过增加或减少学习算法可选的假设空间的函数来增加或减少模型的容量。所列举出线性回归的具体示例都是增加或减少多项式的次数。到目前位为止所讨论的观点都是简化很多的。
算法的效果,很大情况下受限于假设空间中函数的数量,也取决于这些函数的具体形式。例如,我们用线性回归,从 x x x预测 sin ( x ) \sin(x) sin(x),效果就不太好。因此我们可以通过两种方法影响算法性能,一个是允许更多的函数种类,一个是加大这些函数的数量。
我们在模型训练过程中经常会有出现偏好函数与非偏好函数同时满足模型的训练,我们往往会优先选择偏好函数,只有当非偏好函数的测试集效果明显优于偏好函数,才会选择非偏好函数。
例如,我们可以加入权重衰减(weight decay)来修改线性回归的训练标准。带权重衰减的线性回归最小化训练集上的均方误差和正则项的和为
J
(
ω
)
J(\omega)
J(ω),其偏好于平方
L
2
L^2
L2范数较小的权重。具体如下
J
(
ω
)
=
M
S
E
t
r
a
i
n
+
λ
ω
T
ω
J(\omega)=MSE_{train}+\lambda\omega^T\omega
J(ω)=MSEtrain+λωTω
其中
λ
\lambda
λ是提前挑选的值,控制我们偏好小范数权重的程度。当
λ
=
0
\lambda = 0
λ=0时,我们没有任何的偏好。越大的
λ
\lambda
λ偏好范数越小的权重。最小化
J
(
ω
)
J(\omega)
J(ω)可以看作是拟合训练数据和偏好小权重范数之间的权衡。这会使得解决方案的斜率更小,或是将权重放在较小的特征上。我们可以训练具有不同的
λ
\lambda
λ值的高次多项式回归模型,来举例说明如何通过权重衰减来控制模型欠拟合或过拟合的趋势。
我们仍然是使用上次用的数据集来拟合此次训练样本。真实函数是二次的,但是在这里我们只是用9次多项式。我们通过改变权重衰减的量来避免高阶模型的过拟合问题。当
λ
\lambda
λ非常大的时候,我们的图像会强制学习到无斜率的函数,由于它只能表示一个常函数,所示以上欠拟合的。当我们取得一个适当的
λ
\lambda
λ大小时,学习算法就会慢慢的回复它正常的斜率。当权重衰减接近于0时,这个9阶多项式就会过拟合,这于上节中测试的数据时一样的。
正则化在本例中就是 Ω ( ω ) = ω T ω \Omega(\omega)=\omega^T\omega Ω(ω)=ωTω是正则项,在之后的学习中我们会学习到更多的正则化项。正则化是指修改学习算法,使其降低泛化误差而非训练误差。正则化是机器学习领域的中心问题之一,只有优化能偶与其重要性相提并论。
超参数和验证集
大多数的机器学习算法都有超参数,可以设置来控制算法行为。超参数的值并不是训练出的。例如上文中多项式的次数,就是一个超参数。超参数的选定的方法没什么技巧,主要是因为它太难推算了。更多的情况是它不适合在训练集上模拟,这些超参数总时趋向于最大可能的模型,导致过拟合的情况发生。
为了解决这个问题,我们需要一个训练算法观测不到的验证集样本。
我们早先学习到的知识就是对于通过于训练数据相同分布的样本组成的集合我们用于测试,来验证学习后的泛化误差。其中重要的就是不能让测试样本通过任意形式进入到训练模型中,包含超参数的设计。所以训练集中的样本不能成为验证集,要从训练数据中构建验证集。
根据这一点,我们可以吧训练数据分为两个不相交的子集,一个用于学习参数,另一个用于验证集,用于估计泛化误差,更新超参数。通常80%的训练数据用于训练,20%用于验证。
交叉验证
当我们对数据划分完成后,如果测试集的误差很小,这是有问题的。一个小规模的测试意味着平均测试误差估计的统计不确定性,使得很难判断当前算法是否比另一个算法在当前给定任务上的表现更加良好。
当数据集有十万或更多的样本时,这不是严重的问题,当数据集过小,也有替代方法允许我们使用所有样本估计平均测试误差,代价是增加了计算量。最常见的算法是
k
k
k-折交叉验证过程,如下方算法所示,将数据集分为
k
k
k各不重合的子集。测试误差可以估计为
k
k
k次计算后的平均测试误差。在第
i
i
i次测试时,数据的第
i
i
i个子集用于测试集,其他数据用于训练集。
算法: k k k-折交叉验证算法。当给定数据集 D \mathbb D D对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确估计时(因为在小的测试集上, L L L可能具有过高的方差), k k k-折交叉验证算法可以用于估计学习算法 A A A的泛化误差。数据集 D \mathbb D D包含的元素时抽象的样本 z ( i ) z^{(i)} z(i)(对于第 i i i个样本),在监督学习的情况代表(输入,目标)对 z ( i ) = ( x ( i ) , y ( i ) ) z^{(i)}=(x^{(i)},y^{(i)}) z(i)=(x(i),y(i)),或者无监督学习情况下仅用于输入 z ( i ) = x ( i ) z^{(i)}=x^{(i)} z(i)=x(i)。该算法返回 D \mathbb D D示例中的每个误差向量 e e e,其均值时估计的泛化误差。
Define: KFoldXV(
D
,
A
,
L
,
k
\mathbb D,A,L,k
D,A,L,k):
Require:
D
\mathbb D
D为给定数据集,其中元素为
z
(
i
)
z^{(i)}
z(i)
Require:
A
A
A为学习算法,可以视为一个函数
Require:
L
L
L为损失函数,可视为来自学习完成的函数
f
f
f,将样本
z
(
i
)
∈
D
z^{(i)}\in\mathbb D
z(i)∈D映射到
R
\mathbb R
R中标量的函数
Require:
k
k
k为折数
\quad
将
D
\mathbb D
D分为
k
k
k个互斥的子集
D
i
\mathbb D_{i}
Di,他们的并集为
D
\mathbb D
D
\quad
for
i
i
i from 1 to
k
k
k do
\quad
f
i
=
A
(
D
/
D
i
)
\quad f_{i}=A(\mathbb D / \mathbb D_{i})
fi=A(D/Di)
\quad
\quad
for
z
(
j
)
z^{(j)}
z(j) in
D
i
\mathbb D_{i}
Di do
\quad
\quad
e
i
=
L
(
f
i
,
z
(
j
)
)
\quad e_{i}=L(f_{i},z^{(j)})
ei=L(fi,z(j))
\quad
\quad
end for
\quad
end for
\quad
Return
e
e
e