線性模型(linear model)基本定義及參數求解數學本質、損失函數的選擇與評估數學原理、及其基於線性模型衍生的其他機器學習模型相關原理討論


1. 線性模型簡介

0x1:線性模型的現實意義

在一個理想的連續世界中,任何非線性的東西都可以被線性的東西來擬合(參考Taylor Expansion公式),所以理論上線性模型可以模擬物理世界中的絕大多數現象。而且因為線性模型本質上是均值預測,而大部分事物的變化都只是圍繞着均值而波動,即大數定理。

事物發展的混沌的線性過程中中存在着某種必然的聯結。事物的起點,過程,高潮,衰退是一個能被推演的過程。但是其中也包含了大量的偶然性因素,很難被准確的預策,只有一個大概的近似范圍。但是從另一方面來說,偶然性自身也可以組成一條符合大數定理的線性。 

0x2:線性模型的基本形式

給定有d個屬性描述的示例x = (x_{1};x_{2};...;x_{d}),線性模型試圖學得一個通過屬性的線性組合來進行預測的函數,即:

f(x)=\omega _{1}*x_{1}+\omega _{2}*x_{2}+...+\omega _{d}*x_{d}

一般用向量形式寫成:,其中,

線性模型中 f(x) 可以是各種“尺度”上的函數,例如:

f(x)為離散的值:線性多分類模型
f(x)為實數域上實值函數:線性回歸模型
f(x)為對數:對數線性模式
f(x)進行sigmoid非線性變換:對數幾率回歸
...

實際上 ,f(x)可以施加任何形式的變換,筆者在這篇blog中會圍繞幾個主流的變換形式展開討論,需要大家理解的是,不同的變換之間沒有本質的區別,也沒有好壞優劣之分,不同的變換帶來不同的性質,而不同的性質可以用於不同的場景。

1. 線性模型參數求解的本質 - 線性方程組求解

不管對 f(x) 施加什么樣的變化,從方程求解角度來看,f(x)=\omega _{1}*x_{1}+\omega _{2}*x_{2}+...+\omega _{d}*x_{d}是一個線性方程組。

在這個方程組中,x 是我們已知的,因為我們有訓練樣本,所以在初始化時,我們的線性方程組看起來是如下形式:

y1 = 1 * w1 + 2 * w2 + .... + 3 * wn;
....
yn = 3 * w1 + 4 * w2 + .... + 3 * wn;

每個樣本代表線性方程組的一行,樣本中完全線性共線的可以約去。

這樣,我們就得到了一個 N(樣本數) * M(特征維度) 的巨大矩陣。而樣本的值和標簽即(x,y)共同組成了一個巨大的增廣矩陣。注意,是樣本組成了系數矩陣,不是我們要求的模型參數!

求解線性模型的參數向量(w,b)就是在求解線性方程組的一個方程解,所有的方程解組成的集合稱為線性方程組的解集合

同時,在機器學習中,我們稱 w 和 b 為線性模型的超參數,滿足等式條件的(w,b)組合可能不只一種,所有的超參數構成了一個最優參數集合。實際上,根據線性方程組的理論,線性方程組要么有唯一解,要么有無限多的解。

唯一解的條件比較苛刻,在大多數的場景和數據集下,解空間都是無限的,機器學習算法的設計目標就是:

基於一種特定的歸納偏置,選擇一個特定的超參數(w,b),使得模型具備最好的泛化能力,機器學習算法的目的不是解方程,而是獲得最好的泛化能力。

當超參數通過訓練擬合過程確定后,模型就得以確定。

0x3:線性模型蘊含的基本思想

線性模型的形式很簡單,甚至可以說是一種最簡單質朴的模型,但是卻蘊含着機器學習中一些重要的基本思想:

1. 原子可疊加性:許多功能更為強大的非線性模型(nonlinear model)可在線性模型的基礎上通過引入層級結構或高維映射而得到;
2. 可解釋性(comprehensibility):權重向量 w 直觀表達了各個屬性在預測中的重要性(主要矛盾和次要矛盾),而誤差偏置 b 則表達了從物理世界到數據表達中存在的不確定性,即數據不能完整映射物理世界中的所有隱狀態,一定存在某些噪聲無法通過數據表征出來;

Relevant Link:

https://www.cnblogs.com/jasonfreak/p/5551544.html
https://www.cnblogs.com/jasonfreak/p/5554407.html
http://www.cnblogs.com/jasonfreak/p/5595074.html
https://www.cnblogs.com/pengyingzhi/p/5383801.html

 

2. 線性回歸 - 基於線性模型的一種回歸預測模型

0x1:線性回歸模型的基本形式

通常給定數據集:D={(x1,y1),(x2,y2),…,(xn,yn)},其中xi=(xi1;xi2;…;xid),yi∈R。

線性回歸(linear regression)試圖學得一個線性模型:

,以盡可能准確地預測實值輸出標記。

注意,這里用”盡可能地准確“這個詞,是因為在大多數時候,我們是無法得到一個完美擬合所有樣本數據的線性方程的,即直接基於輸入數據構建的多元線性方程組在大多數時候是無解的。

例如下圖,我們無法找到一條完美的直線,剛好穿過所有的數據點:

這個時候怎么辦呢?數學家高斯發現了最小二乘,它的主要思想是:尋找一個解向量,它和目標數據點的距離盡可能地小。

所以現代線性回歸算法所做的事情是:在一定的線性約束條件下,求解線性目標函數的極值問題,這是一個線性規划問題。

0x2:線性回歸模型中損失函數的選擇

我們上一章說道,直接基於輸入數據求解對應線性方程組是無解的,高斯為了解決這個問題,引入了最小二乘。在此之上,之后的數學家又發展出了多種損失評估函數,其數學形式各異,但其核心思想是一致的。

我們知道,損失函數的選擇,本質上就是在選擇一種誤差評價標准。我們知道,損失函數的本質是物理世界和數學公式之間的橋梁,選擇何種損失函數取決於我們如何看待我們的問題場景,以及我們希望得到什么樣的解釋。關於損失函數的討論,讀者朋友可以參閱另一篇blog

我們這章來討論主要的常用損失函數。

1. 最小二乘損失函數

1)線性最小二乘的基本公式

考慮超定方程組(超定指未知數小於方程個數): ,其中m代表有m個等式,n代表有 n 個未知數  ,m>n ;
將其進行向量化后為:
  
   ,   ,
前面解釋過,在大多數情況下,該方程組一般而言沒有解,所以高斯為了選取最合適的 ,讓該等式"盡量成立",引入殘差平方和函數:
在統計學中,殘差平方和函數可以看成n倍的均方誤差MSE,常數n不影響參數求解,在計算時可忽略。

2)為什么是最小二乘?不是最小三乘或者四乘呢?

這節我們來討論一個問題,為什么MSE的形式是平方形式的,這背后的原理是什么。

這里先拋出結論:在假設誤差符合大數定理正態分布前提假設下,解線性模型參數優化問題等同於均方誤差損失函數最小化問題

下面來證明這個結論:

在線性回歸問題中,假設模型為,其中 x 為輸入,b為偏置項。

根據中心極限定理(注意這個前提假設非常重要)(關於大數定理的相關討論,可以參閱我另一篇blog)假設模型 h(θ) 與實際值 y 誤差 ϵ 服從正態分布(即噪聲符合高斯分布),即:  

則根據輸入樣本 xi 可以計算出誤差 ϵi 的概率為: 

對應似然公式為:

其中 m 為樣本總數。基於以上公式可以寫出對數最大似然,即對 l(θ整體取log,則: 

則最大化似然公式 L(θ相當於最小化損失函數最小問題即變換為最小二乘求解問題

另外一點需要注意的是,線性回歸的模型假設,這是最小二乘方法的優越性前提,否則不能推出最小二乘是最佳(即方差最小)的無偏估計,具體請參考高斯-馬爾科夫定理。特別地,當隨機噪聲服從正態分布時,最小二乘與最大似然等價。

3)最小二乘參數求解方法

3.1)偏導數為零求極值方法

線性模型試圖學得。同時在噪聲符合高斯分布的假設前提下,均方誤差是衡量 f(x) 和 y 之間的差別的最佳損失函數。

因此我們可以試圖讓均方誤差最小化,即:

均方誤差有非常好的幾何意義,它對應了常用的歐幾里得距離或簡稱歐氏距離(enclidean distance)。基於均方誤差誤差最小化來進行模型求解的方法稱為“最小二乘法(least square method)”。

在一元線性回歸中,最小二乘法就是試圖找到一條直線,使所有樣本到直線上的歐氏距離之和最小。

求解 w 和 b 使最小化的過程,稱為線性回歸模型的最小二乘參數估計(parameter estimation)。我們可將分別對 w 和 b 求導,得到:

令上式等於零可得到 w 和 b 最優解的閉式(closed-form)解,同時損失函數中極值就是上式參數優化公式的最小值,線性規划問題得解。

注意:這里 E(w,b) 是關於 w 和 b 的凸函數,當它關於 w 和 b 的導數均為零時,得到 w 和 b 的最優解。
但是對於更高維的線性模型甚至非線性模型,目標函數往往並不是全局凸函數,因此不能繼續使用導數為零的方式進行最優解求解,這個時候就需要例如GD這種遞歸優化求解算法

Relevant Link: 

https://www.zhihu.com/question/20822481
https://www.jianshu.com/p/985aff037938
https://juejin.im/entry/5be53a575188257cf9715723 
3.2)逆矩陣計算參數求解方法

根據最小二乘求解公式,我們有: 

 令,對求導得到:

令上式為零可得最優解的閉式解。

接下來的問題就是,該線性方程組矩陣是否有解?如果有解,是有唯一解還是有無窮多解?這個問題在矩陣論中有明確的理論定義和討論,讀者朋友可以參閱一些清華/北大初版的線性代數書籍,講解特別好。

1)滿秩情況下

為滿秩矩陣(full-rank matrix)或正定矩陣(positive definite matrix)時,令上面求導公式為零可得:

其中,是矩陣的逆矩陣,令,則最終學得的多元線性回歸模型為:

2)非滿秩情況下

然而,在現實中,往往不是滿秩矩陣。 

例如在許多任務中我們遇到大量的變量(即特征維度),其數目甚至超過樣例數,導致 X 的列數多於行數,顯然不滿秩。此時可解出無限多個 ,它們都能使均方誤差最小化。

選擇哪一個解作為輸出,將由學習算法的歸納偏好來決定,一個常用的做法是引入正則化(regularization)項。

筆者思考:

線性方程組的行數就是樣本數嗎?
答案是否定的,准確來說,線性方程組的行數應該是互相線性不相關的樣例的行數。因為可以把同一個向量復制N遍,得到N+1個樣本,例如(1,1)、(2,2)、(3,3)其實是同一個樣例。這里背后其實是矩陣的秩的概念原理。 

過擬合和線性方程組求解的關系是什么?
這提示我們可以從線性方程組角度解釋過擬合問題的原因。過擬合的問題本質上是方程組的解有無窮多個,而算法模型選擇了其中較為復雜的一種。
我們將訓練樣例輸入模型,轉化為一個線性方程組,如果從線性方程組化簡化階梯矩陣后,非零行數 < 未知量個數的角度,則該線性方程組有無窮多個解,即有可能發生過擬合。
發生過擬合並不是算法有問題,算法做的就是是合理的,符合現行方程組原理的,其實在解空間中,所有的解都是一樣的,都可以使得在這個訓練集上的損失最小,但是機器學習的目的是得到一個泛化能力好的模型,而根據奧卡姆剃刀原理,越簡單的模型在未知的樣本上的泛化能力越好。解決過擬合問題是一個機器學習的技巧,並不是線性代數的數學問題。
關於過擬合問題的詳細討論,可以參閱另一篇blog

Relevant Link: 

https://zhuanlan.zhihu.com/p/34842727
https://zhuanlan.zhihu.com/p/33899560
https://blog.csdn.net/shiyongraow/article/details/77587045  
3.3)梯度下降算法(Gradient decent)來求解線性回歸模型參數

我們前面說過,為了解決基於原始輸入樣本數據構成的線性方程組無解的問題,我們引入了損失函數,之后問題轉換為了求解損失函數的參數解。

需要明白的,線性模型無論多復雜其本質上都是凸函數,凸函數一定可以求得全局最優的極值點,也即最優參數。

但是,當函數復雜度繼續提高,例如增加了非線性變換之后的復合函數之后,目標函數不一定就是凸函數了(例如深度神經網絡),這個時候我們就很難直接求得閉式解,矩陣求逆也不一定可以完成。

針對這種復雜函數,GD梯度下降就是一種相對萬能通用的迭代式參數求解算法。

當然,理論上,我們也可以將GD算法用於線性模式的參數求解中。

下面的代碼中,我們通過GD算法來求解一個二元線性模型的參數,並且將GD的求解結果和使用LSM算法求解的結果進行對比。

首先用3D繪制出數據集的分布:

# -*- coding: utf-8 -*- import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import random from sklearn import linear_model #首先要生成一系列數據,三個參數分別是要生成數據的樣本數,數據的偏差,以及數據的方差 def getdata(samples, bias, variance): X = np.zeros(shape=(samples, 2)) #初始化X Y = np.zeros(shape=samples) for i in range(samples): X[i][0] = 2 * i X[i][1] = i Y[i] = (i + bias) + random.uniform(0, 1) * variance return X, Y # 梯度下降算法來解決最優化問題,求損失函數的最小值 def gradient(X, Y, alpha, m, iter_numbers): theta = np.ones(2) # 初始化theta的值 初始化要求解模型中參數的值 bias = np.ones(1) X_trans=X.transpose() # 轉化為列向量 for i in range(iter_numbers): Y_hat = np.dot(X, theta) + bias # 待預測的函數: y = wx + b loss = Y_hat - Y # 得到的仍然是一個m*1的列向量 coss = np.sum(loss**2) / (2 * m) # 平方和損失函數 print("iteration:%d / Cost:%f"%(i, coss)) #打印出每一次迭代的損失函數值,正常情況下得到的損失函數隨着迭代次數的增加該損失函數值會逐漸減少 gradient_theta = np.dot(X_trans, loss) / m #損失函數的對 theta 參數求導后的結果,后面梯度下降算法更新參數theta的值時會用到這一項的值 gradient_bias = np.sum(loss) / m #損失函數的對 b 參數求導后的結果 theta = theta - alpha * gradient_theta bias = bias - alpha * gradient_bias return theta, bias if __name__=="__main__": m = 100 X, Y = getdata(m, 25, 10) # Plot data ax = plt.subplot(111, projection='3d') ax.scatter(X[:,0], X[:,1], Y, c='r',marker='1') theta, bias = gradient(X, Y, 0.00002, m, 2000000) print("GD -> the parameters (theta) is: ", theta) print("GD -> the parameters (bias) is: ", bias) # 打印GD得到的參數對應的函數曲線 X_GD = np.zeros(shape=(m, 2)) Y_GD = np.zeros(shape=m) for i in range(m): X_GD[i][0] = 2 * i X_GD[i][1] = i Y_GD[i] = theta[0] * X_GD[i][0] + theta[1] * X_GD[i][1] + bias ax.plot(X_GD[:,0], X_GD[:,1], Y_GD, c='b', lw=1) clf = linear_model.LinearRegression() clf.fit(X,Y) print("LSM -> the theta is: ", clf.coef_) print("LSM -> the bias is: ", clf.intercept_) # 打印MSE得到的參數對應的函數曲線 X_LSM = np.zeros(shape=(m, 2)) Y_LSM = np.zeros(shape=m) for i in range(m): X_LSM[i][0] = 2 * i X_LSM[i][1] = i Y_LSM[i] = theta[0] * X_LSM[i][0] + theta[1] * X_LSM[i][1] + bias ax.plot(X_LSM[:,0], X_LSM[:,1], Y_LSM, c='g') plt.show()

運行結果如下:

('GD -> the parameters (theta) is: ', array([0.2020337 , 0.60101685])) ('GD -> the parameters (bias) is: ', array([29.915184]))  ('LSM -> the theta is: ', array([0.40202688, 0.20101344])) ('LSM -> the bias is: ', 29.916313760692574)

從運行結果以及我們將GD和LSM得到的參數打印出軌跡圖中我們可以看出以下幾點:

1. 盡管使用了相同的損失函數,但是GD算法得到的結果和LSM最小二乘法的最優結果並不一致,GD算法只是在逼近最優值,且接近最優值,並不能在有限步驟內完全達到最優點; 2. GD算法是一種參數求解算法,和使用什么損失函數沒有關系,筆者在代碼中使用了MSE平方和損失誤差,讀者朋友可以自己換成交叉熵代價損失,並不影響最終結果。 3. 在梯度下降中,權值更新是一個迭代的過程,每個維度權值(wi)更新取決於當前輪次中的誤差,誤差較大大的個體(xi)會使得對應的 wi 調整的更劇烈,這點從代碼中可以體現。這種權值更新辦法比較直觀,但是同時也比較低效:即人人都有發言的權利,每次只考慮部分人,容易顧此失彼。 相比之下,LSM直接基於大數定理進行最小化均方誤差,本質上就是求每個屬性維度 xi 的樣本均值。
3.4)其他參數優化算法

最速下降法是一種最優化求極值的方法。與此相關的還有共軛梯度法,牛頓法,擬牛頓法(為解決海森矩陣求逆代價過大的問題)等。

筆者思考:最小二乘和GD都需要計算 w 和 b 的偏導數。但是不同的的是,最小二乘直接基於偏導數求極值求得最全最優的參數值,而GD基於偏導數作為本輪迭代對 w 和 b 的修正因子(梯度方向)

Relevant Link:

https://blog.csdn.net/Wang_Da_Yang/article/details/78594309

4)最小二乘損失的幾何意義

這個章節,我們來討論下幾何投影與最小二乘法的聯系。線性代數中的非常多概念都能在三維空間中找到對應的概念,這非常有利於我們學習和理解。

最小二乘法中的幾何意義是:高維空間中的一個向量在低維子空間的投影。這個思想在MIT教授Gilbert Strang的線性代數的公開課程上有討論。

我們基本向量討論概念開始討論起:

3.1)三維空間的向量在二維平面的投影

我們以三維空間作為例子,因為三維是可視化的最高維度,同時更高維的情況是可以擴展的。

如下圖所示,在三維空間中給定一個向量 u,以及由向量 v1,v2 構成的一個二維平面:

向量 p 為 u 到這個平面的投影,它是 v1,v2 的線性組合:

 

接下來我們利用 u - P 這個向量分別與 v1,v2 垂直這兩個條件,分別能求出 c1,c2。用數學語言來表示,就是下面這兩個式子。 

為了方便之后擴展到更高維的情況,我們把它們合並成一個式子,令 V = [v1,v2],則上式等價於:

把向量p公式帶入上式,然后矩陣轉置(transpose)一下,得到以下這個式子

這里的 c = [c1,c2]T。所以系數 c 的表達式為

3.2)最小二乘和投影的關系

以二元情況為例,

每個點的誤差可以寫成:

損失函數的目標是最小化誤差的平方和,也就是下面這個關於 a0,a1 的函數(注意,xi,yi都是已知的輸入數據):

這是個函數求極值的問題,我們很快想到可以矩陣微分求導來得到答案:

現在我們把平方和損失S重新寫成矩陣形式,平方和損失就是下面這個向量的長度平方:

把上面呢這個向量長度最小化的意思是:尋找在 [1, ... , 1]T 和 [x1, ... , xn]T 構成的二維子空間上的一個點,使得向量 [y1, ... , yn]T 到這個點的距離最小。

那怎么找這個點呢?根據幾何原理,只要做一個幾何投影就好了。

我們只要把上個小節中的幾何投影公式中的 u 替換成 [y1, ... , yn]T ,把 v1,v2 分別替換成  [1, ... , 1]T 和 [x1, ... , xn]T, 系數 c1 和 c2 也就是我們要求的 a0,a1,可以馬上可以得出:

這和用矩陣微積分求得的公式是一樣的。

總結一下:最小二乘法的幾何意義是高維空間的一個向量(由y數據決定)在低維子空間(由x數據以及多項式的次數決定)的投影

Relevant Link:

https://www.jianshu.com/p/b49f28b1b98c
https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fr=aladdin
《線性代數的幾何意義》西安電子科技大學出版社
https://blog.csdn.net/xiaoshengforever/article/details/14546075

2. 交叉熵代價函數

從信息熵的角度來看損失誤差,在KL散度最小的前提假設下,線性模型參數優化問題等同於交叉熵代價函數最小化問題。

這個章節,我們從熵(Entropy) -> KL散度(Kullback-Leibler Divergence) -> 交叉熵 -> 交叉熵在一定條件下等價於KL散度,這個順序逐漸引入我們的話題,即:為什么交叉熵代價函數同樣適合用作線性模型(實際上不只線性模型)的損失函數,而且效果並不比MSE均方損失函數差,甚至在某些復雜模型場景下(例如深度神經網絡模型),交叉熵代價函數的效果和性能還要優於MSE(從函數收斂性質的角度討論)。

1)熵(Entropy) - 表示一個事件A的自信息量

放在信息論的語境里面來說,就是一個事件所包含的信息量。我們常常聽到"這句話信息量好大",比如"昨天花了10萬,終於在西湖邊上買了套500平的別墅"。這句話為什么信息量大?因為它的內容出乎意料,違反常理。由此引出信息的兩個基本規則:

  • 越不可能發生的事件信息量越大,比如"上帝存在"這句話信息量就很大。而確定事件的信息量就很低,比如"我是我媽生的",信息量就很低甚至為0

  • 獨立事件的信息量可疊加。比如"a. 張三今天喝了阿薩姆紅茶,b. 李四前天喝了英式早茶"的信息量就應該恰好等於a+b的信息量,如果張三李四喝什么茶是兩個獨立事件。

因此熵被定義為 , x指的不同的事件比如喝茶, 指的是某個事件發生的概率比如和紅茶的概率。

對於一個一定會發生的事件,其發生概率為1, ,信息量為0;反之,對於一個不可能發生的事,信息量無窮大,這個公式也包含了一個意思,宇宙中不存在完全不可能的事情。

熵的主要作用是告訴我們最優編碼信息方案的理論下界(存儲空間),以及度量數據的信息量的一種方式。理解了熵,我們就知道有多少信息蘊含在數據之中。

2)衡量兩個事件/分布之間的不同 - KL散度

我們已經知道對於一個隨機變量x的事件A的自信息量可以用熵來衡量。但是如果我們有另一個獨立的隨機變量x相關的事件B,該怎么計算它們之間的區別?或者說我們如何對兩個不同的概率分布之間的區別進行定量的分析?

此處我們討論一種常用的計算方法:KL散度,有時候也叫KL距離,一般被用於計算兩個分布之間的不同。

對KL散度,需要重點牢記的是,KL(A||B)散度是有嚴格的方向性的:KL散度不具備有對稱性,A到B的KL散度和B到A的KL散度是不同的

舉個例子:

事件A:張三今天買了2個土雞蛋,事件B:李四今天買了6個土雞蛋。

我們定義隨機變量x:買土雞蛋,那么事件A和B的區別是什么?

對於張三來說,李四多買了4個土雞蛋;對於李四來說,張三少買了4個土雞蛋。選取的參照物不同,那么得到的結果也不同

3)KL散度的數學定義

熵公式已經提供了一種量化衡量一個概率分布中包含信息量的多少,只要稍加改造就可以得到兩個不同分布之間的信息差異,即 K-L散度。

顯然,根據上面的公式,K-L散度其實是數據的原始分布 p 和近似分布 q 之間的對數差值的期望。如果用2為底的對數計算,則 K-L散度值表示信息損失的二進制位數。下面公式以期望表達K-L散度:

一般,K-L散度以下面的書寫方式更常見:

4)k-l散度的數學特性

從公式中可以看出:

  • 如果 P(p) = P(q),即兩個事件分布完全相同,那么KL散度等於0,當事件A為100%確定性事件時,分子為1,而當事件 q 越接近100%確定(即越靠近事件 p)時,總體KL散度公式趨向於0。
  • KL散度公式中,減號左邊的和公式事件 p 的熵有關,這是一個非常重要的理解KL散度的視角
  • KL散度是嚴格順序的,如果顛倒一下順序,那么結果就不一樣了。所以KL散度來計算兩個分布 p 與 q 的時候是不是對稱的,有"坐標系"的問題。

5)交叉熵

交叉熵公式:

交叉熵的一些性質:

  • 和KL散度相同,交叉熵也不具備對稱性: ;
  • Cross(交叉)主要是用於描述這是兩個事件之間的相互關系,對自己求交叉熵等於熵。即 

6)交叉熵在一定條件下等價於KL散度

觀察交叉熵和KL散度的公式可以發現,交叉熵和KL散度的公式非常相近。事實上交叉熵公式就是KL散度的后半部分: 

對比一下這是KL散度的公式:

這是熵的公式:

這是交叉熵公式:

而 S(A) 代表了待估計對象本身的真實分布,它的熵可以被認為是一個常量,因此在求極值的時候,常量可以忽略,也就是說KL散度和交叉熵在真值存在條件下下等價。

在機器學習項目中,我們都可以假設真值是一定存在的,而且分布是固定的。因此我們的損失函數可以直接選擇cross-entropy代替kl散度。

7)交叉熵作為損失函數在機器學習中的作用

機器學習的過程就是希望在訓練數據上模型學到的分布 和真實數據的分布 越接近越好(泛化能力才是機器學習模型的最終目的,注意不是僅僅在訓練集上表現好)。怎么衡量並最小化兩個分布之間的不同呢?通過使其KL散度最小即可達到目的

但我們沒有真實數據的分布,那么只能退而求其次,希望模型學到的分布和訓練數據的分布 盡量相同,也就是把訓練數據當做模型和真實數據之間的代理人。假設訓練數據是從總體中獨立同步分布采樣(Independent and identically distributed sampled)而來,那么我們可以利用最小化訓練數據的經驗誤差來降低模型的泛化誤差。即,我們假設如果模型能夠學到訓練數據的分布,那么應該近似的學到了真實數據的分布

但是,完美的學到了訓練數據分布往往意味着過擬合,因為訓練數據不等於真實數據,我們只是假設它們是相似的,而一般還要假設存在一個高斯分布的誤差,是模型的泛化誤差下線。 

Relevant Link:  

https://zhuanlan.zhihu.com/p/39682125 
https://www.cnblogs.com/kexinxin/p/9858573.html
https://blog.csdn.net/qq_17073497/article/details/81485650
https://blog.csdn.net/jiaowosiye/article/details/80786670
https://blog.csdn.net/u014135091/article/details/52027213
https://www.jianshu.com/p/3e163b6b96f5 
https://blog.csdn.net/pxhdky/article/details/82388964
https://www.jianshu.com/p/43318a3dc715 
https://www.zhihu.com/question/41252833  

3. 其他損失函數

除了mse和cross-entropy之外,我們還可以使用例如絕對值損失、0-1損失等損失函數,其本質都是一樣的。  

 

3. 對數幾率回歸 - 基於線性回歸的一種概率函數

在實數數域R上,線性模型輸出的一個實值,如果我們希望將其用於分類任務,只需要找到一個單調可微函數,將分類任務的真實標記 y 與線性回歸模型的預測值聯系(link)起來即可。

0x1:階躍函數 - 硬分類

考慮二分類任務,其輸出標記,而線性回歸模型產生的預測值是實值,於是,我們將實值 z 轉換為 0/1 值,一種最簡單直觀的連接函數是“單位階躍函數(unit-step function)”。

即若預測值 z 大於零就判別為正例;小於零則判別為反例;預測值為臨界值則可以任意判別;

這種判別很符合人的直觀直覺,實際上在生活中我們面臨選擇的時候很多時候就是遵循階躍式的判別思維模式的。

但是,從數學上,單位階躍函數不連續,無法進行求導,不利於方程組求解。

0x2:sigmoid函數(對數幾率函數) - 軟分類 

對數幾率函數(logistic function)在一定程度上近似代替單位階躍函數,同時具備單調可微的數學性質,非常便於求導。

下圖是對數幾率函數和單位階躍函數的對比 

可以看到,對數幾率函數是一種“sigmoid函數”,它將 z 值轉化為一個接近 0 或 1 的 y 值,並且其輸出值在 z = 0 附近變換很陡。

對數幾率函數的函數形式如下:

 = 

1. logistic function中體現的幾率性質

對數幾率函數的公式可等價變化為:

在對數幾率函數的語境中,我們定義 y 為正例發生的概率,而 1-y 代表了反例發生的概率。兩者的比值 y / 1-y 稱為“幾率(odds)”,反映了 x 作為正例的相對可能性,相對於反例發生的可能性

對幾率函數取對數即得到“對數幾率(log odds,即logit)”,即

由此可以看到,對數幾率實際上是在用線性回歸模型的預測結果去逼近真實標記的對數幾率。因此,其對應的模型稱為“對數幾率回歸(logistic regression)”,亦稱 logit regression。

需要特別注意的是,雖然它的名字是“回歸”,但實際卻是一種分類學習方法。

0x3:對數幾率回歸的優點性質

1. 它直接對分類可能性進行建模,是一種判別式模型,無需事先假設數據分布,這樣就避免了假設分布不准確所帶來的問題;
2. 它不僅是預測出“類別”,而是可得到近似概率預測,這對需要需要利用概率輔助決策的任務很有用;
3. 對數幾率函數是任意階可導的凸函數,有很好的數學性質,現有的許多數值優化算法都可以直接用於求取最優解;

0x4:求解模型參數(w,b)

我們將視為類后驗概率估計,則對數幾率函數可重寫為:

又因為有:

於是,我們可以通過“極大似然法(maximum likelihood method)”來估計(w,b)。

給定數據集,對數幾率回歸模型最大化“對數似然(log likelihood)

即令每個樣本屬於其真實標記的概率越大越好。

為了便於討論,令即參數向量,即正例向量,則可簡寫為

再令

則上面對數似然公式中的似然項可重寫為:

綜上可得,最大化對數似然函數等價於最小化下式:

,即

上式是關於的高階可導連續函數,根據凸優化理論,經典的數值優化算法,如梯度下降(gradient descent method)、牛頓法(newton method)等都可以求得次最優解。

Relevant Link:   

https://baike.baidu.com/item/%E5%AF%B9%E6%95%B0%E5%87%A0%E7%8E%87%E5%9B%9E%E5%BD%92/23292667?fr=aladdin

  

4. 廣義線性回歸

0x1:對數線性回歸

假設我們認為模型所對應的輸出標記是在指數尺度上的變化,那就可以將輸出標記的對數作為線性模型逼近的目標,即:

。這就是“對數線性回歸(log-linear regression)”

它實際上是在試圖讓逼近y。對數線性回歸雖然形式上還是線性回歸,但實質上已是在求取輸入空間到輸出空間的非線性函數映射

0x2:廣義線性模型

更一般地,考慮單調可微函數,令:

這樣得到的模型稱為“廣義線性模式(generalized linear model)”,其中函數稱為“聯系函數(link function)”。

顯然,對數線性回歸是廣義線性模型在的特例。

Relevant Link: 

https://baike.baidu.com/item/%E5%B9%BF%E4%B9%89%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B/8465894?fr=aladdin 

 

4. 線性判別分析(Fisher linear discriminant analysis) - 基於線性模型的線性投影判別算法

線性判別分析(linear discriminant analysis LDA)是一種經典的線性學習方法,在二分類問題上最早由Fisher提出,因此亦稱為“Fisher判別分析”。

0x1:LDA的思想

LDA的思想非常朴素:

1. 給定訓練樣例集,設法將樣例投影到一條直線上,使得同類樣例的投影點盡可能接近、異類樣例的投影點盡可能遠離;
2. 在對新樣本進行分類時,將其投影到同樣的這條直線上,再根據投影點的位置來確定新樣本的類別;

下圖給出了一個二維示意圖:

0x2:LDA算法數學公式

給定數據集,令表示第類示例的集合、表示均值向量、表示協方差矩陣。

若將數據投影到直線 w 上,則兩類樣本的中心在直線上的投影分別為

若將所有樣本點都投影到直線上,則兩類樣本的協方差分為為

0x3:LDA算法求最優解

欲使同樣樣例的投影點盡可能接近,可以讓同類樣例投影點的協方差盡可能小,即+盡可能小;而

而欲使異類樣例的投影點盡可能遠離,可以讓類中心之間的距離盡可能大,即盡可能大。

同時考慮上述2者,可得最大化的總目標:

定義“類內散度矩陣(within-class scatter matrix)

定義“類間散度矩陣(between-class scatter matrix)

則上式最大化總目標函數為重寫為:

上式即LDA欲最大化的目標,即轉化為最大化 Sb 與 Sw 的“廣義瑞利商(generalized Rayleigh quotient)

接下來的問題是如何求得 w 呢?注意到上式中,分子和分母都是關於 w 的二次項,分子分母中關於w的長度部分會相約,因此解與 w 的長度無關,只與其方向有關,即選擇的超曲線w的方向決定了廣義瑞利商的值。

不是一般性,令=1,則上式等價於:

借助拉格朗日乘子法,上式等價於:

其中 λ 是拉格朗日乘子,注意到的方向恆為,不妨令:

帶入上式得:

考慮到數值解的穩定性,在實踐中通常是對 Sw 進行奇異值分解,即:Sw = ,這里 ∑ 是一個實對角矩陣,其對角線上的元素是 Sw 的奇異值,然后再由得到

0x4:LDA和PCA的內在共通之處

在machine learning領域,PCA和LDA都可以看成是數據降維的一種方式。但是PCA是unsupervised,而LDA是supervised。

所以PCA和LDA雖然都用到數據降維的思想,但是監督方式不一樣,目的也不一樣。

PCA是為了去除原始數據集中冗余的維度,讓投影子空間的各個維度的方差盡可能大,也就是熵盡可能大;LDA是通過數據降維找到那些具有discriminative的維度,使得原始數據在這些維度上的投影,不同類別盡可能區分開來,而同類別之間盡量相近。

顯然,這2種算法內核都借助方差矩陣實現最優化算法,從而實現數據降維壓縮的目的。另一方面,筆者個人認為LDA的算法思想和一些社區發現算法例如pylouvain倒是有異曲同工之妙。

Relevant Link: 

https://www.cnblogs.com/jiahuaking/p/3938541.html
https://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 

 

5. 類別不平衡問題,及其緩解手段

0x1:類別不平衡帶來的“偽訓練成功問題”

我們本文討論的分類方法都有一個共同的假設,即不同類別的訓練樣本數量相當。如果不同類別的訓練樣本數目稍微有區別,通常影響不大,但若差別很大,則會對學習過程造成困擾,甚至得到一個偽成功的結果。

例如有998個反例,但正例只有2個,那么學習方法只需返回一個永遠將新樣本預測為反例的學習器,就能達到99.8%的精度,這樣的學習器往往泛化能力很差,因為它不能預測出任何正例。

讀者朋友可能會質疑機器學習模型不可能這么笨,但其實是確認可能發生,例如GD在優化過程中,有一個局部最優點(全部預測為反例)以及一個全局最優點(998反例,2個正例),但是因為訓練參數設置的關系,GD可能就會陷入那個局部最優,而永遠跳不出來。

這就是類別不平衡問題(class-imbalance),指分類任務中不同類別的訓練樣例數目差別很大的情況。

0x2:類別不平衡帶來的影響的原理分析

從對數概率線性回歸分類器的角度討論容易理解,在我們用對新樣本 x 進行分類時,事實上是在用預測出的 y 值與一個閾值進行比較。

例如通常在 y > 0.5(1-y < 0.5)時判別為正例,否則為反例。

y 實際上表達了正例的可能性,幾率 y/1-y 在反映了正例可能性和反例可能性的比值,閾值設置為0.5恰表明了分類器認為真實正、反例可能性相同,即分類器決策規則為:

若 y/1-y > 1:預測為正例.

然而,當訓練集中正、反例數目不同時,令表示正例數目,表示反例數目,則觀測幾率是

由於我們通常假設訓練集是真實樣本總體的無偏采樣,因此觀測幾率就代表了真實幾率注意這個非常重要的大前提,只有這個大前提成立,類別不平衡問題才存在,否則本小節也沒有討論的必要了,也不需要做任何的縮放處理

於是,理論上來說,預測的閾值應該隨着觀測樣本的類別分布來動態調整,即:

:預測為正例.

但是,我們的分類器邏輯往往是固定的,即“若 y/1-y > 1:預測為正例”。

這就導致實際預測值和理論預測值之間存在一個gap,具體gap的多少取決於類別不平衡的程度:

gap = (1 - y/1-y) * 

當反例和正例差別越大的時候,這個gap的也越大。

0x3:類別不平衡問題的一種解決策略 - 再縮放(rescaling)

正確的做法應該是,需要對預測值進行動態縮放,即:

如果正反例數目相當,這個再縮放基本可以忽略,如果正反例數目有偏差,這個再縮放可以起到

這就是類別不平衡學習的一個基本策略,“再縮放(rescaling)”。

再次提醒讀者朋友的一點是:再縮放的比例是根據真實樣本分布中的比例來決定的,但是真實的分布只有上帝才知道,一種比較實用的獲取方法是進行海量采樣,通過海量樣本並結合一些自己的領域業務經驗,相對合理的設定這個縮放因子,根據筆者不多的項目經驗來看,往往都可以取得比較好的效果

0x4:類別不平衡問題的另一種解決策略 - 代價敏感學習(cost-sensitive learning)

在代價敏感學習中,將代替,其中:

cost+是將正例誤分為反例的代價:如果更加關注正例別漏報了,就加大cost+懲罰比例;
cost-是將反例誤分為正例的代價:如果更加關注反例別分錯了,就加大cost-懲罰比例;

0x5:如何利用類別不平衡問題實現特定的分類策略

知道了類別不平衡的原理之后,我們可以在實際項目中有效利用這個特性,得到更加貼近業務的分類器。

例如在筆者所在的網絡安全的場景中,對precision的要求往往比recall的要求高,因為虛警帶來的對用戶的困擾是非常巨大的,在任何時候都應該盡量比較誤報。

因此,在設計機器學習模型的時候,可以采取以下策略:

1. 訓練集中,有意的將白樣本:黑樣本的比例設置的比較大,例如 51,甚至更大,人為的造成一個類別不平衡偏置,這么做的結果很容易理解,模型判黑的幾率會降低,會更傾向於判白,也即降低了誤報的幾率;
2. 在訓練中,進行自定義損失函數,keras/tensorflow中很容易做到這點,將“白判黑損失”認為的增加為“黑判白”的 N 倍,這么做的結果和第一點也是一樣的;  

Relevant Link: 

https://stackoverflow.com/questions/45961428/make-a-custom-loss-function-in-keras

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM