最小二乘法就是机器学习的开始,设这个最简单的式子是:
y = w x + b y=wx+b y=wx+b
平方损失函数为:
L = 1 2 ∑ i = 1 n ( t i − y i ) 2 L=\frac{1}{2}\sum_{i=1}^n(t_i-y_i)^2 L=21i=1∑n(ti−yi)2
之所以有 1 2 \frac{1}{2} 21是因为在接下来化简过程中会非常漂亮(仅限于高数,矩阵不算),其中 t i t_i ti是已测数据的结果集,现成的。那么如何降低损失函数呢?就是求导让其对 w w w求导等于0,那就是整个损失函数的最低点(损失函数是下凸函数):
L = 1 2 ∑ i = 1 n ( t i − y i ) 2 = 1 2 ∑ i = 1 n ( t i − ( w x i + b ) ) 2 = 1 2 ∑ i = 1 n ( t i 2 + w 2 x i 2 + b 2 − 2 t i w x i − 2 t i b + 2 w x i b ) L =\frac{1}{2} \sum_{i=1}^n(t_i-y_i)^2\\ =\frac{1}{2} \sum_{i=1}^n(t_i-(wx_i+b))^2\\ =\frac{1}{2} \sum_{i=1}^n(t_i^2+w^2x_i^2+b^2-2t_iwx_i-2t_ib+2wx_ib) L=21i=1∑n(ti−yi)2=21i=1∑n(ti−(wxi+b))2=21i=1∑n(ti2+w2xi2+b2−2tiwxi−2tib+2wxib)
ϑ L ϑ w = ∑ i = 1 n ( w x i 2 − t i x i + x i b ) \frac{\vartheta L}{\vartheta w}=\sum_{i=1}^n(wx_i^2-t_ix_i+x_ib) ϑwϑL=i=1∑n(wxi2−tixi+xib)
ϑ L ϑ b = ∑ i = 1 n ( b − t i + w x i ) \frac{\vartheta L}{\vartheta b}=\sum_{i=1}^n(b-t_i+wx_i) ϑbϑL=i=1∑n(b−ti+wxi)
接下来让偏导等于0,求出 w , b w,b w,b:
∑ i = 1 n ( w x i 2 − t i x i + x i b ) = 0 w ∑ i = 1 n x i = ∑ i = 1 n ( t i − b ) w = ∑ i = 1 n ( t i − b ) ∑ i = 1 n x i \sum_{i=1}^n(wx_i^2-t_ix_i+x_ib)=0\\ w\sum^n_{i=1}x_i=\sum_{i=1}^n(t_i-b)\\ w=\frac{\sum_{i=1}^n(t_i-b)}{\sum^n_{i=1}x_i} i=1∑n(wxi2−tixi+xib)=0wi=1∑nxi=i=1∑n(ti−b)w=∑i=1nxi∑i=1n(ti−b)
∑ i = 1 n ( b − t i + w x i ) = 0 n b = ∑ i = 1 n ( t i − w x i ) b = ∑ i = 1 n ( t i − w x i ) n \sum_{i=1}^n(b-t_i+wx_i)=0\\ nb=\sum^n_{i=1}(t_i-wx_i)\\ b=\frac{\sum^n_{i=1}(t_i-wx_i)}{n} i=1∑n(b−ti+wxi)=0nb=i=1∑n(ti−wxi)b=n∑i=1n(ti−wxi)
就这样算出来了。注意 w w w中有 b b b, b b b中有 w w w。用均值取代掉 ∑ \sum ∑:
w = t ‾ − b x ‾ w=\frac{\overline{t}-b}{\overline{x}} w=xt−b
b = t ‾ − w x ‾ b=\overline{t}-w\overline{x} b=t−wx
相互带入,完全一样的:
w 0 x ‾ + b 0 = t ‾ w_0\overline{x}+b_0=\overline{t} w0x+b0=t
意料之外,情理之中,表示数据集均值在这条直线上,接下来用这个式子带入上面的偏导式,消 b 0 b_0 b0(b最小值的时候),这样就会出现 w 0 w_0 w0了。
ϑ L ϑ w = ∑ i = 1 n ( w x i 2 − t i x i + x i b 0 ) = ∑ i = 1 n ( w x i 2 − t i x i + x i ( t ‾ − w 0 x ‾ ) ) = w ∑ i = 1 n x i 2 − ∑ i = 1 n t i x i + ( t ‾ − w 0 x ‾ ) ∑ i = 1 n x i = w 0 n x 2 ‾ − n t x ‾ + ( t ‾ − w 0 x ‾ ) n x ‾ = 0 w 0 = t x ‾ − t ‾ x ‾ x 2 ‾ − x ‾ 2 \frac{\vartheta L}{\vartheta w}=\sum_{i=1}^n(wx_i^2-t_ix_i+x_ib_0)\\ =\sum_{i=1}^n(wx_i^2-t_ix_i+x_i(\overline{t}-w_0\overline{x}))\\ =w\sum^n_{i=1}x_i^2-\sum^n_{i=1}t_ix_i+(\overline{t}-w_0\overline{x})\sum_{i=1}^nx_i\\ =w_0n\overline{x^2}-n\overline{tx}+(\overline{t}-w_0\overline{x})n\overline{x}=0\\ w_0=\frac{\overline{tx}-\overline{t}\overline{x}}{\overline{x^2}-\overline{x}^2} ϑwϑL=i=1∑n(wxi2−tixi+xib0)=i=1∑n(wxi2−tixi+xi(t−w0x))=wi=1∑nxi2−i=1∑ntixi+(t−w0x)i=1∑nxi=w0nx2−ntx+(t−w0x)nx=0w0=x2−x2tx−tx
更一般的,大家都这么写:
w = 1 n ∑ i = 1 n x i t i − t ‾ x ‾ 1 n ∑ i = 1 n x i 2 − x ‾ x ‾ w=\frac{\frac{1}{n}\sum_{i=1}^nx_it_i-\overline{t}\overline{x}}{\frac{1}{n}\sum^n_{i=1}x^2_i-\overline{x}\overline{x}} w=n1∑i=1nxi2−xxn1∑i=1nxiti−tx
b b b直接用 w w w推出,自此最小二乘法推导完毕。
接下来用线代推,用线代推不仅更简洁,更重要的一点是,它支持多 w w w,也就是多元超平面,这个是高数方法永远也解决不了的了(它会得出n个等式)。
f = w n ∗ 1 x n ∗ 1 + b n ∗ 1 f=\textbf{w}_{n*1}\textbf{x}_{n*1}+\textbf{b}_{n*1} f=wn∗1xn∗1+bn∗1
设一共n组数据,每组数据有k个参数。
这里进行了一个整理,把 b b b添加进 w w w里了,具体见下:
w = ( b w ) , x = ( 1 x ) \textbf{w} = \begin{pmatrix} b \\ w \end{pmatrix} , \textbf{x} = \begin{pmatrix} 1 \\ x \end{pmatrix} w=(bw),x=(1x)
这样 w T x = b + w x \textbf{w}^T\textbf{x}=b+wx wTx=b+wx,按照这个角度来说,b用 w 0 w_0 w0来表示比较合适了,接下来的参数为 w 1 , w 2 . . . w_1,w_2... w1,w2...,而变量也是从1 , x 1 , x 2 . . . ,x_1,x_2... ,x1,x2...特别完美,实际上的矩阵就是n+1的,参数矩阵第一个是 w 0 w_0 w0,变量矩阵第一个是 1 1 1,直接 wx \textbf{wx} wx得出解,下面都是多变量多参数的了。
损失函数为
L = ∑ i = 1 n ( t i − w T x i ) 2 L=\sum^n_{i=1}(t_i-\textbf{w}^T\textbf{x}_i)^2 L=i=1∑n(ti−wTxi)2
取代 ∑ \sum ∑,变成如下的:
L = ( t − Xw ) T ( t − Xw ) L=(\textbf{t}-\textbf{X}\textbf{w})^T(\textbf{t}-\textbf{X}\textbf{w}) L=(t−Xw)T(t−Xw)
L = w T X T Xw − 2 w T X T t + t T t L=\textbf{w}^T\textbf{X}^T\textbf{Xw}-2\textbf{w}^T\textbf{X}^T\textbf{t}+\textbf{t}^T\textbf{t} L=wTXTXw−2wTXTt+tTt
注意此时的 X \textbf X X是 n ∗ k n*k n∗k的矩阵,包含所有的数据了(但 x \textbf x x是 k ∗ 1 k*1 k∗1矩阵),这里 w \textbf w w是 k ∗ 1 k*1 k∗1矩阵,只有这样 Xw \textbf{Xw} Xw才是 n ∗ 1 n*1 n∗1的矩阵,是所有的解,转置相乘恰好就是平方差的形式。
接下来自然是求导了:
ϑ L ϑ w = ( ϑ L ϑ w 0 ϑ L ϑ w 1 ⋮ ϑ L ϑ w k ) \frac{\vartheta L}{\vartheta \textbf{w}}= \begin{pmatrix} \frac{\vartheta L}{\vartheta w_0} \\ \frac{\vartheta L}{\vartheta w_1} \\ \vdots \\ \frac{\vartheta L}{\vartheta w_k} \end{pmatrix} ϑwϑL=⎝⎜⎜⎜⎛ϑw0ϑLϑw1ϑL⋮ϑwkϑL⎠⎟⎟⎟⎞
ϑ L ϑ w = 2 X T Xw − 2 X T t = 0 \frac{\vartheta L}{\vartheta \textbf{w}}=2\textbf{X}^T\textbf{X}\textbf{w}-2\textbf{X}^T\textbf{t}=0 ϑwϑL=2XTXw−2XTt=0
这里的矩阵求导是固定式子(这里是对 w w w求导), ( w T x ) ′ = x , ( x T w ) ′ = x , ( w T w ) ′ = 2 w , ( w T C w ) ′ = 2 C w (w^Tx)'=x,(x^Tw)'=x,(w^Tw)'=2w,(w^TCw)'=2Cw (wTx)′=x,(xTw)′=x,(wTw)′=2w,(wTCw)′=2Cw(跟普通函数求导差不多)。
X T Xw = X T t \textbf{X}^T\textbf{X}\textbf{w}=\textbf{X}^T\textbf{t} XTXw=XTt
w = ( X T X ) − 1 X T t \textbf{w}=(\textbf{X}^T\textbf{X})^{-1}\textbf{X}^T\textbf{t} w=(XTX)−1XTt
这就是 w \textbf w w的最小值,注意是所有的(包括 w , b w,b w,b),矩阵最小二乘法完毕。
这样求得的式子是线性的,有时候平方式子可能更拟合(这是很有可能的),即 f = w 0 + w 1 x + w 2 x 2 f=w_0+w_1x+w_2x^2 f=w0+w1x+w2x2,这样参数就会是超过两个。但是,越高阶,其实就没有多少作用了,它会在有数据的地方过拟合,没数据的地方偏十万八千里。
如何验证模型的最优复杂度?就是用验证集测,得出最好的。
当数据集特别小,以至于分出一个验证集太奢侈,那么就将数据集分成k份,每次取一份作为验证集,其他作为测试集,一圈下来取平均值(交叉验证)。当k=n时,也就是验证集就一个数据,这叫留一交叉验证LOOCV。
那么什么是模型复杂度?就是 w w w尽可能的小和少:
∑ i = 0 k w i 2 \sum^k_{i=0}w_i^2 i=0∑kwi2
那么损失函数就变成了:
L ′ = L + λ w T w L'=L+\lambda \textbf w^T\textbf w L′=L+λwTw
L ( w ) = ( t − Xw ) T ( t − Xw ) + λ w T w L(\textbf w)=(\textbf t-\textbf X\textbf w)^T(\textbf t-\textbf X\textbf w)+\lambda \textbf w^T\textbf w L(w)=(t−Xw)T(t−Xw)+λwTw
ϑ L ϑ w = 2 X T Xw − 2 X T t + 2 λ w = 0 \frac{\vartheta L}{\vartheta \textbf{w}}=2\textbf{X}^T\textbf{X}\textbf{w}-2\textbf{X}^T\textbf{t}+2\lambda\textbf w=0 ϑwϑL=2XTXw−2XTt+2λw=0
w = ( X T X + λ E ) − 1 X T t \textbf w=(\textbf{X}^T\textbf{X}+\lambda\textbf{E})^{-1}\textbf{X}^T\textbf{t} w=(XTX+λE)−1XTt
λ \lambda λ值太小,函数就可能太过复杂(后面项就没多大用了),值太大,又不利于逼近数据(太简化了)。 这就叫正则化误差,正则化最小二乘法。也叫结构误差,这个以后讲。如何确定 λ \lambda λ(超参数)选什么好呢?交叉验证。
岭回归: 以损失部分信息(说明加入正则化项确实有深刻的缺点)、降低精度(加入正则化项)为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。实际上也是新瓶装旧酒,都一样的。
为了保证回归系数 w \textbf w w可求,岭回归模型在目标函数上加了一个L2范数的惩罚项
J ( w ) = ∑ ( y − Xw ) 2 + λ ∣ ∣ w ∣ ∣ 2 2 = ∑ ( y − Xw ) 2 + ∑ λ w 2 J(\textbf w)=\sum(y-\textbf X\textbf w)^2+\lambda||\textbf w||^2_2\\ =\sum(y-\textbf X\textbf w)^2+\sum\lambda \textbf w^2 J(w)=∑(y−Xw)2+λ∣∣w∣∣22=∑(y−Xw)2+∑λw2
w = ( X T X + λ I ) − 1 X T y \textbf w=(\textbf X^T\textbf X+\lambda\textbf I)^{-1}\textbf X^Ty w=(XTX+λI)−1XTy
单位矩阵 I I I的对角线上全是1,像一条山岭一样,这也是岭回归名称的由来。
每日小常识
0-1损失函数
L ( Y , f ( X ) ) = { 1 Y ≠ f ( X ) 0 Y = f ( X ) L(Y,f(X))=\left\{\begin{array}{l} 1 &Y\neq f(X)\\ 0 &Y=f(X) \end{array}\right. L(Y,f(X))={10Y=f(X)Y=f(X)
特点是比较严格,直接分类,但它是一个非凸函数,不太适用。
绝对值损失函数
L ( Y , f ( x ) ) = ∣ Y − f ( x ) ∣ L(Y,f(x))=|Y-f(x)| L(Y,f(x))=∣Y−f(x)∣
log对数损失函数
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y,P(Y|X))=-logP(Y|X) L(Y,P(Y∣X))=−logP(Y∣X)
log对数损失函数能非常好的表征概率分布,如果需要知道结果属于每个类别的置信度,那它非常合适。但健壮性不强,对噪声敏感。
大名鼎鼎的平方损失函数
L ( Y ∣ f ( X ) ) = ∑ N ( Y − f ( X ) ) 2 L(Y|f(X))=\sum_N(Y-f(X))^2 L(Y∣f(X))=N∑(Y−f(X))2
不解释
指数损失函数
L ( Y ∣ f ( X ) ) = e − y f ( x ) L(Y|f(X))=e^{-yf(x)} L(Y∣f(X))=e−yf(x)
对噪声非常敏感
Hinge损失函数
L ( y , f ( x ) ) = m a x ( 0 , 1 − y f ( x ) ) L(y,f(x))=max(0,1-yf(x)) L(y,f(x))=max(0,1−yf(x))
SVM就用这个损失函数
交叉熵损失函数
这个后面讲,值得注意的是对数损失函数和交叉熵损失函数是等价的。