本系列是台湾大学资讯工程系林軒田(Hsuan-Tien Lin)教授开设的《机器学习基石》课程的梳理。重在梳理,而非详细的笔记,因此可能会略去一些细节。

该课程共16讲,分为4个部分:

  1. 机器什么时候能够学习?(When Can Machines Learn?)
  2. 机器为什么能够学习?(Why Can Machines Learn?)
  3. 机器怎样学习?(How Can Machines Learn?)
  4. 机器怎样可以学得更好?(How Can Machines Learn Better?)

本文是第4部分,对应原课程中的13-16讲。

本部分的主要内容:

  • 过拟合问题,过拟合与噪声、目标函数复杂度的关系;
  • 正则化,正则化与VC理论的联系;
  • 验证,留一交叉验证和V-折交叉验证;
  • 三个学习原则,即奥卡姆剃刀、抽样偏差和数据窥探。

1 过拟合问题

1.1 过拟合的发生

假设现在用带很小噪声的2次多项式生成了5个样本,对于这5个样本,其实用4次多项式就可以完美拟合它:

这样做可使Ein=0E_\text{in}=0Ein​=0,但EoutE_\text{out}Eout​却会非常大。

如果出现EinE_\text{in}Ein​很小,EoutE_\text{out}Eout​很大的情况,就是出现了不好的泛化(bad generalization)。如果在训练的过程中,EinE_\text{in}Ein​越来越小,EoutE_\text{out}Eout​越来越大,就称为过拟合(overfitting)。

噪声和数据规模都会影响过拟合。先来看以下两个数据集:

  • 数据由10次多项式生成,有一些噪声;
  • 数据由50次多项式生成,无噪声。

数据集图像如下:

如果我们用2次和10次多项式分别拟合以上两个数据集,那么在从g2∈H2g_2 \in \mathcal{H}_2g2​∈H2​到g10∈H10g_{10} \in \mathcal{H}_{10}g10​∈H10​的过程中,会发生过拟合吗?

拟合结果如下:

比较后发现,在两个数据集中,都发生了过拟合!

来看学习曲线,当N→∞N\to \inftyN→∞时显然H10\mathcal{H}_{10}H10​会有更小的Eout‾\overline{E_{out}}Eout​​,但NNN较小时它会有很大的泛化误差。灰色区域就是过拟合发生的区域。

其实对于由无噪声的50次多项式生成的数据,“目标函数的复杂度”本身就可以看作类似的噪声。

接下来做个更细节的实验。用

y=f(x)+ϵ∼Gaussian(∑q=0Qfαqxq,σ2)\begin{aligned} y &= f(x) + \epsilon\\ &\sim \text{Gaussian}\left(\sum_{q=0}^{Q_f} \alpha_q x^q, \sigma^2 \right) \end{aligned} y​=f(x)+ϵ∼Gaussian⎝⎛​q=0∑Qf​​αq​xq,σ2⎠⎞​​
生成NNN个数据,其中ϵ\epsilonϵ是独立同分布的高斯噪声,噪声水平为σ2\sigma^2σ2,f(x)f(x)f(x)关于复杂度水平QfQ_fQf​是均匀分布的。也就是说,目标函数有QfQ_fQf​和σ2\sigma^2σ2两个变量。

然后,分别固定Qf=20Q_f=20Qf​=20和σ2=0.1\sigma^2=0.1σ2=0.1,还是分别用2次和10次多项式拟合数据,并用Eout(g10)−Eout(g2)E_\text{out}(g_{10})-E_\text{out}(g_{2})Eout​(g10​)−Eout​(g2​)度量过拟合水平。结果如下:

颜色偏红的区域,就是发生了过拟合。

加上去的σ2\sigma^2σ2高斯噪声可称为stochastic noise,而目标函数的次数QfQ_fQf​也有类似噪声的影响,因此可叫deterministic noise

如果f∉Hf\notin \mathcal{H}f∈/​H,那么fff一定有某些部分就无法被H\mathcal{H}H所捕捉到,最好的h∗∈Hh^*\in\mathcal{H}h∗∈H与fff的差就是deterministic noise,它的表现与随机噪声没什么不一样(与伪随机数生成器类似)。它与stochastic noise的不同之处在于,它与H\mathcal{H}H有关,且对于每个xxx,它的值是确定的:

1.2 过拟合的处理

一般来说,处理过拟合的思路有以下几种:

  • 从简单的模型开始;
  • 数据清洗(data cleaning),将错误的数据修正(如更正它的标签类别);
  • 数据剪枝(data pruning),删去离群点(outlier);
  • data hinting,当样本量不够时,可以对现有样本做些简单的处理,增加样本量,如在数字分类中,可以将数据微微旋转或平移而不改变它们的标签,这样就可增大样本量;
  • 正则化(regularization),见下节;
  • 验证(validation),见后文。

2 正则化(regularization)

2.1 正则化

正则化的思想是好比从H10\mathcal{H}_{10}H10​“逐步回退”到H2\mathcal{H}_{2}H2​。这个名字的由来是在早期做函数逼近(function approximation)时,有很多问题是ill-posed problems,即有很多函数都是满足问题的解,所以要加入一些限制条件。从某种意义上说,机器学习中的过拟合也是“正确的解太多”的问题。

H10\mathcal{H}_{10}H10​中假设的一般形式为
w0+w1x+w2x2+w3x3+⋯+w10x10w_0+w_1 x+w_2 x^2+w_3 x^3+\cdots+w_{10} x^{10} w0​+w1​x+w2​x2+w3​x3+⋯+w10​x10
而H2\mathcal{H}_{2}H2​中假设的一般形式为
w0+w1x+w2x2w_0+w_1 x+w_2 x^2 w0​+w1​x+w2​x2
其实只要限制w3=w4=⋯=w10=0w_3=w_4=\cdots=w_{10}=0w3​=w4​=⋯=w10​=0,就会有H10=H2\mathcal{H}_{10}=\mathcal{H}_{2}H10​=H2​。如果在用H10\mathcal{H}_{10}H10​时加上这个限制,其实就是在用H2\mathcal{H}_2H2​做机器学习。

H2\mathcal{H}_2H2​的灵活性有限,但H10\mathcal{H}_{10}H10​又很危险,那有没有折中一些的假设集呢?不妨把这个条件放松一些,变成∑q=0101[w1≠0]≤3\sum\limits_{q=0}^{10}\mathbf{1}_{[w_1\ne 0]}\le 3q=0∑10​1[w1​​=0]​≤3,记在该限制下的假设集为H2′\mathcal{H}_2'H2′​,有H2⊂H2′⊂H10\mathcal{H}_{2}\subset \mathcal{H}_{2}' \subset \mathcal{H}_{10}H2​⊂H2′​⊂H10​,即它比H2\mathcal{H}_{2}H2​更灵活,但又没有H10\mathcal{H}_{10}H10​那么危险。

在H2′\mathcal{H}_{2}'H2′​下,求解的问题转化成了
min⁡w∈R10+1Ein(w)s.t. ∑q=0101[w1≠0]≤3\min\limits_{\mathbf{w}\in \mathbb{R}^{10+1}} E_\text{in}(\mathbf{w})\quad \text{s.t. } \sum\limits_{q=0}^{10}\mathbf{1}_{[w_1\ne 0]}\le 3 w∈R10+1min​Ein​(w)s.t. q=0∑10​1[w1​​=0]​≤3
这是个NP-hard问题,复杂度很高。不如再将它变为
min⁡w∈R10+1Ein(w)s.t. ∑q=010wq2≤C\min\limits_{\mathbf{w}\in \mathbb{R}^{10+1}} E_\text{in}(\mathbf{w})\quad \text{s.t. } \sum\limits_{q=0}^{10}w^2_q \le C w∈R10+1min​Ein​(w)s.t. q=0∑10​wq2​≤C
记该假设集为H(C)\mathcal{H}(C)H(C),它与H2′\mathcal{H}_2'H2′​是有部分重叠的,并且对于CCC有软的、光滑的结构:
H0⊂H1⊂⋯⊂H∞=H10\mathcal{H}_{0} \subset \mathcal{H}_{1} \subset \cdots \subset \mathcal{H}_{\infty} =\mathcal{H}_{10} H0​⊂H1​⊂⋯⊂H∞​=H10​
记在H(C)\mathcal{H}(C)H(C)下找到的最优解为wREG\mathbf{w}_\text{REG}wREG​。

在没有正则化时,用梯度下降更新参数的方向是−∇Ein(w)-\nabla E_\text{in}(\mathbf{w})−∇Ein​(w)。而在加入了正则化wTw≤C\mathbf{w}^T \mathbf{w}\le CwTw≤C的限制时,必须在该限制下更新,如下图:

wTw=C\mathbf{w}^T \mathbf{w}= CwTw=C的法向量(normal vector)就是w\mathbf{w}w,从图中可知,只要−∇Ein(w)-\nabla E_\text{in}(\mathbf{w})−∇Ein​(w)和w\mathbf{w}w不平行,就可继续在该限制下降低Ein(w)E_\text{in}(\mathbf{w})Ein​(w),因此,达到最优解时,一定有
−∇Ein(w)∝wREG-\nabla E_\text{in}(\mathbf{w}) \propto \mathbf{w}_\text{REG} −∇Ein​(w)∝wREG​
由此,问题可以转化为求解
∇Ein(wREG)+2λNwREG=0\nabla E_\text{in}(\mathbf{w}_\text{REG}) +\dfrac{2 \lambda}{N} \mathbf{w}_\text{REG}=0 ∇Ein​(wREG​)+N2λ​wREG​=0
其中λ\lambdaλ是引入的拉格朗日乘子(Lagrange multiplier)。假设已知λ>0\lambda>0λ>0,只需要把梯度的式子写出来,即有:
2N(XTXwREG−XTy)+2λNwREG=0\dfrac{2}{N}(X^T X\mathbf{w}_\text{REG}-X^T \mathbf{y})+\dfrac{2 \lambda}{N} \mathbf{w}_\text{REG}=0 N2​(XTXwREG​−XTy)+N2λ​wREG​=0
直接求解即可得
wREG←(XTX+λI)−1XTy\mathbf{w}_\text{REG}\leftarrow (X^T X+\lambda I)^{-1} X^T\mathbf{y} wREG​←(XTX+λI)−1XTy
只要λ>0\lambda>0λ>0,XTX+λIX^T X+\lambda IXTX+λI就是正定矩阵,它一定可逆。

在统计学中,这通常叫岭回归(ridge regression)。

换一种视角来看,求解
∇Ein(wREG)+2λNwREG=0\nabla E_\text{in}(\mathbf{w}_\text{REG}) +\dfrac{2 \lambda}{N} \mathbf{w}_\text{REG}=0 ∇Ein​(wREG​)+N2λ​wREG​=0
就等价于求解(相当于对上式两边取积分)
min⁡wEin(w)+λNwTw\min\limits_{\mathbf{w}} E_\text{in}(\mathbf{w})+\dfrac{\lambda}{N}\mathbf{w}^T\mathbf{w} wmin​Ein​(w)+Nλ​wTw
wTw\mathbf{w}^T\mathbf{w}wTw可叫regularizer,整个Ein(w)+λNwTwE_\text{in}(\mathbf{w})+\dfrac{\lambda}{N}\mathbf{w}^T\mathbf{w}Ein​(w)+Nλ​wTw可叫作augmented error Eaug(w)E_\text{aug}(\mathbf{w})Eaug​(w)。

这样,原本是给定CCC后解一个条件最值问题,现在转化成了一个给定λ\lambdaλ的无条件最值问题。

可将+λNwTw+\dfrac{\lambda}{N}\mathbf{w}^T\mathbf{w}+Nλ​wTw称为weight-decay regulariztion,因为更大的λ\lambdaλ,就相当于让w\mathbf{w}w更短一些,也相当于CCC更小一点。

一个小细节:在做特征变换时,如果用Φ(x)=(1,x,x2,…,xQ)\Phi(\mathbf{x})=(1,x,x^2,\ldots,x^Q)Φ(x)=(1,x,x2,…,xQ),假设xn∈[−1,+1]x_n \in [-1,+1]xn​∈[−1,+1],那么xnqx^q_nxnq​会非常小,这一项本来就需要很大的wqw_qwq​才能起到作用,如果此时再用正则化,就对高维的系数有些“过度惩罚”了,因为它本来就要比较大才行。因此,可在多项式的空间中找出一些正交的基函数(orthonormal basis function),这是一些比较特别的多项式,叫勒让德多项式(Legendre Polynomials),再用这些多项式这样做特征变换(1,L1(x),L2(x),…,LQ(x))(1,L_1(x),L_2(x),\ldots,L_Q(x))(1,L1​(x),L2​(x),…,LQ​(x))即可。前5个勒让德多项式如下图:

2.2 正则化与VC理论

在最小化augmented error的时候,尽管它与带约束最值问题是等价的,但在计算时,其实并没有真正的将w\mathbf{w}w限制在H(C)\mathcal{H}(C)H(C)中。那么正则化究竟是怎么发生的?

可以从另一个角度看augmented error:
Eaug(w)=Ein(w)+λNwTwE_\text{aug}(\mathbf{w})=E_\text{in}(\mathbf{w})+\dfrac{\lambda}{N}\mathbf{w}^T\mathbf{w} Eaug​(w)=Ein​(w)+Nλ​wTw
若记wTw\mathbf{w}^T\mathbf{w}wTw为Ω(w)\Omega(\mathbf{w})Ω(w),它度量的是某个假设w\mathbf{w}w的复杂度。而在VC Bound中
Eout(w)≤Ein(w)+Ω(H)E_\text{out}(\mathbf{w})\le E_\text{in}(\mathbf{w})+\Omega(\mathcal{H}) Eout​(w)≤Ein​(w)+Ω(H)
Ω(H)\Omega(\mathcal{H})Ω(H)度量的是整个H\mathcal{H}H的复杂度。如果λNΩ(w)\dfrac{\lambda}{N}\Omega(\mathbf{w})Nλ​Ω(w)与Ω(H)\Omega(\mathcal{H})Ω(H)有某种关联,EaugE_\text{aug}Eaug​就可以直接作为EoutE_\text{out}Eout​的代理,不需要再通过做好EinE_\text{in}Ein​来做好EoutE_\text{out}Eout​,而同时,又可以享受整个H\mathcal{H}H的高度灵活性。

再换个角度,原本对于整个H\mathcal{H}H有dVC(H)=d~+1d_\text{VC}(\mathcal{H})=\tilde{d}+1dVC​(H)=d~+1,而现在相当于只考虑H(C)\mathcal{H}(C)H(C)中的假设,也就是说VC维变成了dVC(H(C))d_\text{VC}(\mathcal{H}(C))dVC​(H(C))。可以定义一个“有效VC维”dEFF(H,A)d_\text{EFF}(\mathcal{H},\mathcal{A})dEFF​(H,A),只要A\mathcal{A}A中做了正则化,有效VC维就会比较小。

2.3 更一般的正则项

有没有更一般的正则项Ω(w)\Omega(\mathbf{w})Ω(w)?该如何选择呢?有以下建议:

  • 与目标有关(target-dependent),如果知道目标函数的一些性质,就可以写出来,比如我们预先知道目标函数是接近于偶函数的,那就可以选取∑1[qis odd]wq2\sum \mathbf{1}_{[q \text{ is odd}]} w^2_q∑1[q is odd]​wq2​;
  • 合理的(plausible),可以选平滑的或简单的,如为了稀疏性而选L1正则项∑∣wq∣\sum\vert w_q \vert∑∣wq​∣,下文会说明;
  • 友好的(friendly),即容易优化,如L2正则项∑wq2\sum w_q^2∑wq2​;
  • 就算选的正则项不好,也没有关系,因为可以靠λ\lambdaλ来调节,最差也就是相当于没有加入正则项。

L1正则项如下图:

它是凸的,但不是处处可微,加入它之后,解具有稀疏性。如果在实际中需要有稀疏解,L1就会很有用。

λ\lambdaλ要怎么选呢?可根据EoutE_\text{out}Eout​的情况选出的最优λ\lambdaλ,示例如下(加粗点为最优λ\lambdaλ):

从图中可以看到,噪声越大,越需要增加regularization。

但一般情况下,噪声是未知的,该如何选择合适的λ\lambdaλ?

3 验证(Validation)

3.1 验证集

λ\lambdaλ该如何选择?我们完全不知道EoutE_\text{out}Eout​,并且也不能直接通过EinE_\text{in}Ein​做选择。如果有一个从来没被使用过的测试集就好了,这样就可以根据测试集进行选择:
m∗=arg⁡min⁡1≤m≤M(Em=Etest(Am(D)))m^*=\mathop{\arg\min}\limits_{1\le m\le M} \left( E_m=E_\text{test}(\mathcal{A}_m(\mathcal{D})) \right) m∗=1≤m≤Margmin​(Em​=Etest​(Am​(D)))
并且,这样做是有泛化保证的(Hoeffding):
Eout(gm∗)≤Etest(gm∗)+O(log⁡MNtest)E_\text{out}(g_{m^*})\le E_\text{test}(g_{m^*})+O(\sqrt{\dfrac{\log M}{N_\text{test}}}) Eout​(gm∗​)≤Etest​(gm∗​)+O(Ntest​logM​​)
但哪里有真正测试集?只能折中地从D\mathcal{D}D划分出一部分数据作为验证集Dval⊂D\mathcal{D}_\text{val}\subset \mathcal{D}Dval​⊂D了,当然,也要求它是在过去从未被Am\mathcal{A}_mAm​使用过的。

划分验证集Dval\mathcal{D}_\text{val}Dval​的过程如下:

用训练集得到的gm−g^-_mgm−​,也可以有泛化保证:
Eout(gm−)≤Eval(gm−)+O(log⁡MK)E_\text{out}(g_m^-)\le E_\text{val}(g_m^-)+O(\sqrt{\dfrac{\log M}{K}}) Eout​(gm−​)≤Eval​(gm−​)+O(KlogM​​)
做验证时的一般流程如下:

可以看到,在用验证集选出最好的模型gm∗−g^-_{m^*}gm∗−​后,还是要用所有的数据再训练一个最好的模型gm∗g_{m^*}gm∗​出来,一般来说这次训练得到的gm∗g_m^*gm∗​会由于训练数据量的更大而有更低的EoutE_\text{out}Eout​,见下图:

图中最下面的虚线为EoutE_\text{out}Eout​。可以看到,KKK不能过大或过小,如果KKK过小,虽然gm−≈gmg_m^-\approx g_mgm−​≈gm​,但EvalE_\text{val}Eval​和EoutE_\text{out}Eout​会差别很大,而如果KKK过大,尽管Eval≈EoutE_\text{val}\approx E_\text{out}Eval​≈Eout​,但会使gm−g_m^-gm−​比gmg_mgm​差很多。

我们真正想要做到的是

Eout(g)≈Eout(g−)≈Eval(g−)E_\text{out}(g)\approx E_\text{out}(g^-)\approx E_\text{val}(g^-)Eout​(g)≈Eout​(g−)≈Eval​(g−)

第一个约等号要求KKK较小,第二个约等号要求KKK较大,因此必须选一个合适的KKK,按经验法则可选K=N5K=\dfrac{N}{5}K=5N​。

3.2 留一交叉验证(LOOCV)

如果让K=1K=1K=1,即只留一个样本nnn作为验证集,记
Eval(n)(gn−)=err(gn−(xn),yn)=enE_\text{val}^{(n)}(g_n^-)=\text{err}(g_n^-(\mathbf{x}_n),y_n)=e_n Eval(n)​(gn−​)=err(gn−​(xn​),yn​)=en​
但单个ene_nen​无法告诉我们准确的信息,要想办法对所有可能的Eval(n)(gn−)E_\text{val}^{(n)}(g_n^-)Eval(n)​(gn−​)取平均。可以用留一交叉验证(Leave-One-Out Cross Validation):
Eloocv(H,A)=1N∑n=1Nen=1N∑n=1Nerr(gn−(xn),yn)E_\text{loocv}(\mathcal{H},\mathcal{A})=\dfrac{1}{N}\sum\limits_{n=1}^{N} e_n=\dfrac{1}{N} \sum\limits_{n=1}^{N} \text{err}(g_n^- (\mathbf{x}_n),y_n) Eloocv​(H,A)=N1​n=1∑N​en​=N1​n=1∑N​err(gn−​(xn​),yn​)
我们希望的是有Eloocv(H,A)≈Eout(g)E_\text{loocv}(\mathcal{H},\mathcal{A})\approx E_\text{out}(g)Eloocv​(H,A)≈Eout​(g)。可作证明:
EDEloovc(H,A)=ED1N∑n=1Nen=1N∑n=1NEDen=1N∑n=1NEDnE(xn,yn)err(gn−(xn),yn)=1N∑n=1NEDnEout(gn−)=1N∑n=1NEout‾(N−1)=Eout‾(N−1)\begin{aligned} &\mathop{\mathcal{E}}\limits_{\mathcal{D}} E_\text{loovc}(\mathcal{H},\mathcal{A})\\ =& \mathop{\mathcal{E}}\limits_{\mathcal{D}}\dfrac{1}{N}\sum\limits_{n=1}^{N} e_n\\ =&\dfrac{1}{N} \sum\limits_{n=1}^{N} \mathop{\mathcal{E}}\limits_{\mathcal{D}} e_n\\ =&\dfrac{1}{N} \sum\limits_{n=1}^{N} \mathop{\mathcal{E}}\limits_{\mathcal{D}_n} \mathop{\mathcal{E}}\limits_{(\mathbf{x}_n,y_n)} \text{err}(g_n^-(\mathbf{x}_n),y_n)\\ =&\dfrac{1}{N} \sum\limits_{n=1}^{N} \mathop{\mathcal{E}}\limits_{\mathcal{D}_n} E_\text{out}(g_n^-)\\ =&\dfrac{1}{N} \sum\limits_{n=1}^{N} \overline{E_\text{out}}(N-1)\\ =& \overline{E_\text{out}}(N-1) \end{aligned} ======​DE​Eloovc​(H,A)DE​N1​n=1∑N​en​N1​n=1∑N​DE​en​N1​n=1∑N​Dn​E​(xn​,yn​)E​err(gn−​(xn​),yn​)N1​n=1∑N​Dn​E​Eout​(gn−​)N1​n=1∑N​Eout​​(N−1)Eout​​(N−1)​

由于Eloovc(H,A)E_\text{loovc}(\mathcal{H},\mathcal{A})Eloovc​(H,A)的期望会告诉我们一些关于Eout(g−)E_\text{out}(g^-)Eout​(g−)的期望的信息,因此也叫作Eout(g)E_\text{out}(g)Eout​(g)的“几乎无偏估计”(almost unbiased estimate)。

用手写数字识别——对数字是否为1进行分类——看看效果,两个基础特征为对称性和平均强度(average intensity),对它们进行特征变换(增加特征数量),再分别用EinE_\text{in}Ein​和EloocvE_\text{loocv}Eloocv​进行参数选择(参数是变换后的特征个数),结果如下:

如果将EoutE_\text{out}Eout​、EinE_\text{in}Ein​、EloocvE_\text{loocv}Eloocv​分别随特征数变化而变化的情况画出来,如图:

3.3 VVV-折交叉验证

如果有1000个点,做留一交叉验证就要计算1000次ene_nen​,每次计算还要用999个样本做训练,除了少数算法(如线性回归,它有解析解),在大多数情况下会非常耗时间。另一方面,由上一节最后可看到,由于EloocvE_\text{loocv}Eloocv​是在单个点上做平均,结果会有跳动,不够稳定。因此,在实际中,loocv并不是很常用。

在实际中,更常用的是VVV折交叉验证(VVV-Fold Cross Validation),即将D\mathcal{D}D随机分为VVV等分,轮流用每一份做验证,用剩下的V−1V-1V−1份做训练,在实际中一般常取V=10V=10V=10,如下图:

这样能计算出
Ecv(H,A)=1V∑v=1VEval(v)(gv−)E_\text{cv}(\mathcal{H}, \mathcal{A})=\dfrac{1}{V}\sum\limits_{v=1}^{V} E_\text{val}^{(v)}(g_v^-) Ecv​(H,A)=V1​v=1∑V​Eval(v)​(gv−​)
再用它对参数做选择:
m∗=arg⁡min⁡1≤m≤M(Em=Ecv(Hm,Am))m^*=\mathop{\arg\min}\limits_{1\le m\le M} \left( E_m=E_\text{cv}(\mathcal{H}_m, \mathcal{A}_m) \right) m∗=1≤m≤Margmin​(Em​=Ecv​(Hm​,Am​))
值得注意的是,由于验证过程也是在做选择,它的结果依旧会比最后的测试结果乐观一些。因此,最后重要的是测试的结果,而非找出来的最好的验证的结果。

4 三个学习的原则

这里介绍三个学习的原则。

4.1 奥卡姆剃刀

首先是奥卡姆剃刀(Occam’s Razor)。

An explanation of the data should be made as simple as possible, but no simpler.

–Albert Einsterin (?)

这句话传说是爱因斯坦所说,但没有证据。最早可追溯到奥卡姆的话:

entia non sunt multiplicanda praeter necessitatem (entities must not be multiplied beyond necessity)

–William of Occam (1287-1347)

在机器学习中,这是说能拟合数据的最简单的模型往往是最合理的。

什么叫简单的模型呢?对于单个假设hhh来说,要求Ω(h)\Omega(h)Ω(h)较小即参数较少,对于一个模型(假设集)H\mathcal{H}H来说,要求Ω(H)\Omega(\mathcal{H})Ω(H)较小即它没包含太多可能的假设。这两者是相关的,比如∣H∣\vert \mathcal{H} \vert∣H∣规模是2ℓ2^\ell2ℓ,那么其实只需要ℓ\ellℓ个参数就可以描述所有的hhh,因此小的Ω(H)\Omega(\mathcal{H})Ω(H)也就意味着小的Ω(h)\Omega(h)Ω(h)。

从哲学意义上说,越简单的模型,“拟合”发生的概率越小,如果真的发生了,那就说明数据中可能真的有一些比较重要的规律。

4.2 抽样偏差

第二个是要注意抽样偏差(Sampling Bias)。

如果数据的抽样过程存在偏差,那么机器学习也会产生一个有偏差的结果。

在讲解VC维时,提到过一个前提条件,就是训练数据和测试数据需要来自同一个分布。当无法满足时,经验法则是,尽可能让测试环境和训练环境尽可能匹配。

4.3 数据窥探

第三是要注意数据窥探(Data Snooping)。

如果你通过观察,发现数据比较符合某个模型,进而选用该模型,这是比较危险的,因为相当于加入了你大脑中的模型的复杂度。

在任何使用数据的过程中,其实都是间接窥探到了数据。在窥探了数据的表现后,做任何决策,都会引入“大脑”复杂度。

比如在做scaling时,不能把训练集和测试集放在一起做scaling,而只能对训练集做。

其实在机器学习的前沿研究中,也存在类似的情况。比如第一篇论文发现了H1\mathcal{H}_1H1​会在D\mathcal{D}D上表现较好,而第二篇论文提出了H2\mathcal{H}_2H2​,它在D\mathcal{D}D上比H1\mathcal{H}_1H1​表现得更好(否则就不会发表),第三篇也如此……如果将所有论文看作一篇最终版的论文,那么真正的VC维其实是dvc(∪mHm)d_\text{vc}(\cup_m \mathcal{H}_m)dvc​(∪m​Hm​),它会非常大,泛化会非常差。这是因为其实在每一步过程中,作者都通过阅读前人的文献而窥探了数据。

因此在做机器学习时,要审慎地处理数据。要避免用数据来做一些决策,即最好事先就将领域知识加入到模型中,而不是在观察了数据后再把一些特性加入模型中。另外,无论是在实际操作中,还是在看论文过程中,或者是在对待自己的结果时,都要时刻保持怀疑。

机器怎样可以学得更好?相关推荐

  1. python比java简单好学-python和java哪个学起来更简单

    在近几年Python的呼声越来越高,很多刚开始起步想要学习编程的朋友都会犹豫要不要选择学习Python,毕竟作为人工智能时代的首选语言这个诱惑还是很大的.在选择上最纠结的就是Python和Java选择 ...

  2. 自动化测试和测试开发的区别?培训学哪个更好?

    自动化测试和测试开发是目前测试两个比较热门的方向,但刚入门的同学却不知道它们都是干嘛的,到底该学习哪个方向.今天小千就来给大家介绍一下. 自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的 ...

  3. python和java学哪个好-Python VS Java,学哪个更有前途?

    原标题:Python VS Java,学哪个更有前途? 曾几何时,软件开发人员一直在使用C语言环境.几年之后,Java出现在一个更好的选择,具有一些独特的优势,再后来Python出现了,与Java不同 ...

  4. python和java选择哪个-python和java哪个学起来更简单

    在近几年Python的呼声越来越高,很多刚开始起步想要学习编程的朋友都会犹豫要不要选择学习Python,毕竟作为人工智能时代的首选语言这个诱惑还是很大的.在选择上最纠结的就是Python和Java选择 ...

  5. python和java哪个更有潜力-Python VS Java,学哪个更有前途?

    原标题:Python VS Java,学哪个更有前途? 曾几何时,软件开发人员一直在使用C语言环境.几年之后,Java出现在一个更好的选择,具有一些独特的优势,再后来Python出现了,与Java不同 ...

  6. python简单编程-编程中最简单的语言Python,这样学或许更容易

    最近微信小程序上面出了一个跳一跳的小游戏 大家有没有玩呀? 编程中最简单的语言Python,这样学或许更容易 分享之前我还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Py ...

  7. 最简单的python语言程序设计_编程中最简单的语言Python,这样学或许更容易

    最近微信小程序上面出了一个跳一跳的小游戏 大家有没有玩呀? 编程中最简单的语言Python,这样学或许更容易 分享之前我还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Py ...

  8. 学Python好还是学Java好?学哪个更好就业?

    学Python好还是学Java好?学哪个更好就业?对于刚刚入行的的初学者来说,常常会在Python和Java这两大编程语言面前感到迷茫.Python作为后起之秀,潜力无限;而Java是行业经典,成熟稳 ...

  9. 是学Java好呢?还是学C++更有前途?

    目录 1.C++和Java在编程排行榜中的排名 2.Java语言的使用场景 3.C++语言的应用场合 4.最后 最近有不少初学编程的朋友问:他们比较倾向于Java和C++作为他们首选学习语言,但是学J ...

最新文章

  1. 5.2k Star!一款 Python 实现的美观终端资源监视器
  2. Mybatis 逆向工程 自动生成代码
  3. 前端学习(2037)vue之电商管理系统电商系统之优化
  4. Oracle 怎么删除重复数据
  5. EfficientNet 解析:卷积神经网络模型尺度变换的反思
  6. linux内核兼容性,各种glibc和Linux内核版本的兼容性
  7. “Replit 威胁我,要求我关闭我的开源项目!”
  8. vs无法启动程序 系统找不到指定文件_进不了系统时要做的事情
  9. vim使用方法的总结摘自鸟哥的私房菜
  10. 经典C语言学习教程资料
  11. 实数域上的压缩映射不动点原理
  12. 没有比粥更温柔的了。念予毕生流离红尘,就找不到一个似粥温柔的人。
  13. MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4.
  14. 2017年sfdc工作总结_Duplicate, Matching Rule
  15. 版图ECO的那点事(下)
  16. 问题 D: 天神下凡
  17. 机器学习笔记之深度信念网络(二)模型构建思想(RBM叠加结构)
  18. VT虚拟化驱动入门教程
  19. 咸鱼前端—CSS浮动
  20. 质数与合数系列——素数判断

热门文章

  1. 我的世界服务器显示弹幕,我的世界直播弹幕模组
  2. c# 收取邮件 解析_C# 接收邮件
  3. Mysql统计近30天的数据,无数据的填充0
  4. GAN综述及其在图像生成领域的应用(含原理、代码详解)
  5. FCC TributePage
  6. 数据集成工具 —— datax与flinkx的使用
  7. 【iOS开发】——MRC(手动内存管理)的一些补充
  8. Remote Server returned '420 4.2.0 Recipient deferred because there is no Mdb'
  9. 小米手机不用html,小米手机不用三星AMOLED屏幕的真相
  10. TPA3255 classD 音频功放快速设计