机器学习 之 最小二乘法,各种损失函数

最小二乘法就是机器学习的开始,设这个最简单的式子是:
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=1n(tiyi)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=1n(tiyi)2=21i=1n(ti(wxi+b))2=21i=1n(ti2+w2xi2+b22tiwxi2tib+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=1n(wxi2tixi+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=1n(bti+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=1n(wxi2tixi+xib)=0wi=1nxi=i=1n(tib)w=i=1nxii=1n(tib)

∑ 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=1n(bti+wxi)=0nb=i=1n(tiwxi)b=ni=1n(tiwxi)

就这样算出来了。注意 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=xtb

b = t ‾ − w x ‾ b=\overline{t}-w\overline{x} b=twx

相互带入,完全一样的:
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=1n(wxi2tixi+xib0)=i=1n(wxi2tixi+xi(tw0x))=wi=1nxi2i=1ntixi+(tw0x)i=1nxi=w0nx2ntx+(tw0x)nx=0w0=x2x2txtx

更一般的,大家都这么写:
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=n1i=1nxi2xxn1i=1nxititx

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=wn1xn1+bn1

设一共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=1n(tiwTxi)2

取代 ∑ \sum ,变成如下的:
L = ( t − Xw ) T ( t − Xw ) L=(\textbf{t}-\textbf{X}\textbf{w})^T(\textbf{t}-\textbf{X}\textbf{w}) L=(tXw)T(tXw)

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=wTXTXw2wTXTt+tTt

注意此时的 X \textbf X X n ∗ k n*k nk的矩阵,包含所有的数据了(但 x \textbf x x k ∗ 1 k*1 k1矩阵),这里 w \textbf w w k ∗ 1 k*1 k1矩阵,只有这样 Xw \textbf{Xw} Xw才是 n ∗ 1 n*1 n1的矩阵,是所有的解,转置相乘恰好就是平方差的形式。
接下来自然是求导了:
ϑ 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=2XTXw2XTt=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=0kwi2

那么损失函数就变成了:
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)=(tXw)T(tXw)+λ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=2XTXw2XTt+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)=(yXw)2+λw22=(yXw)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))=Yf(x)

log对数损失函数
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y,P(Y|X))=-logP(Y|X) L(Y,P(YX))=logP(YX)
log对数损失函数能非常好的表征概率分布,如果需要知道结果属于每个类别的置信度,那它非常合适。但健壮性不强,对噪声敏感。

大名鼎鼎的平方损失函数
L ( Y ∣ f ( X ) ) = ∑ N ( Y − f ( X ) ) 2 L(Y|f(X))=\sum_N(Y-f(X))^2 L(Yf(X))=N(Yf(X))2

不解释

指数损失函数
L ( Y ∣ f ( X ) ) = e − y f ( x ) L(Y|f(X))=e^{-yf(x)} L(Yf(X))=eyf(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,1yf(x))

SVM就用这个损失函数

交叉熵损失函数
这个后面讲,值得注意的是对数损失函数和交叉熵损失函数是等价的。

你可能感兴趣的:(机器学习,1024程序员节)