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

1. 線性模型簡介

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

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

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

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中會圍繞幾個主流的變換形式展開討論,須要你們理解的是,不一樣的變換之間沒有本質的區別,也沒有好壞優劣之分,不一樣的變換帶來不一樣的性質,而不一樣的性質能夠用於不一樣的場景。dom

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

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

在這個方程組中,x 是咱們已知的,由於咱們有訓練樣本,因此在初始化時,咱們的線性方程組看起來是以下形式:ide

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
相關文章
相關標籤/搜索