從線性模型(linear model)衍生出的機器學習分類器(classifier)

Andrew.Hann發表於2019-03-24

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:一元線性迴歸(一維情形 (d=1))

在這個章節,我們在討論一維線性模型的同時,也藉著一維線性函式這種最簡單的形式,來討論一下關於“損失函式的選擇原理、以及求解損失函式最小化時最優引數問題(即優化問題)”。

1. 數學公式定義

我們先考慮一種最簡單的形式:輸入屬性的維度只有一個,這種函式也被稱作仿射函式

2. 損失函式的選擇

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

1)MSE均方損失函式 - 在假設誤差符合大數定理正態分佈前提假設下,解線性模型引數優化問題等同於均方誤差損失函式最小化問題

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

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

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

對應似然公式為:

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

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

在一些書籍和paper中,MSE均方損失演算法也被稱為狹義最小二乘。讀者朋友需要明白其中的區別,廣義上的最小二乘LSM的是一種引數求解演算法。

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

Relevant Link:

https://www.jianshu.com/p/b49f28b1b98c

2)交叉熵代價函式 - 在KL散度最小的前提假設下,線性模型引數優化問題等同於交叉熵代價函式最小化問題

讀者朋友需要注意的是,上小節的公式之所以可以推導成立的一個非常核心的條件是:模型的預測輸出和實際的y值之間的差值符合正態分佈,即符合大數定理。這是一個非常合理的假設,但是這並不是唯一的假設。

這個小節,我們更換到另一個世界觀中,資訊熵!

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

2.1)什麼是熵(Entropy)?- 表示一個事件A的自資訊量

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

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

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

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

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

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

2.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個土雞蛋。選取的參照物不同,那麼得到的結果也不同

2.3)KL散度的數學定義

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

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

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

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

從公式中可以看出:

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

交叉熵公式:

交叉熵的一些性質:

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

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

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

這是熵的公式:

這是交叉熵公式:

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

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

2.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. 引數求解演算法的選擇 - 引數優化演算法選擇

1)最小二乘法演算法(The least square method)求解線性迴歸模型引數

線性模型試圖學得。同時在噪聲符合高斯分佈的假設前提下,均方誤差是衡量 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

2)梯度下降演算法(Gradient decent)來求解線性迴歸模型引數

在前面的討論中,不管是從極大似然還是從KL散度的角度求解線性函式的解,本質上都是在求一個“閉式解”,即可以直接通過極值求導得到解析解。

之所以能夠直接得到解析解的原因在於,線性模型無論多複雜其本質上都是凸函式,凸函式一定可以求得全域性最優的極值點,也即最優引數。

但是,當函式複雜度繼續提高,例如增加了非線性變換之後的複合函式之後,目標函式不一定就是凸函式了(例如深度神經網路),這個時候我們就很難直接求得閉式解。

針對這種複雜函式,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)其他引數優化演算法

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

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

Relevant Link:

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

0x2:多元線性模型 

一般情況下,資料集的屬性是有很多維度組成的,此時我們試圖學得: 

這稱為”多元線性迴歸(multivariate linear regression)“。

1. 用線性方程組矩陣增廣矩陣的方法來重寫多元線性模型

我們依然可以用最小二乘法來對 w 和 b 進行估計。我們使用向量形式來表示 w 和 b,同時把資料集(包括label)D 表示為一個 m x (d+1) 的矩陣 X,其中每行對應一個樣本示例,每行的列對應於特徵屬性值,最後一個元素恆置為1,即:

再把label也寫成向量形式 y = (y1; y2; ... ; ym)。

和前面說過的一樣,基於(樣本特徵,特徵label)得到一個增廣矩陣。

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. 對數機率迴歸 - 基於線性迴歸的一種概率函式

在實數數域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

 

相關文章