機器學習(0):機器學習概述及基本概念

最近自己會把自己個人博客中的文章陸陸續續的複製到CSDN上來,歡迎大家關注我的 個人博客,以及我的github

一、序言

機器學習(machine learning)是當前計算機專業的一大熱門,也是我研究生幾年需要學習的內容之一。雖然之前粗略的學過一點皮毛,但是當初筆記做的實在不好,這次趁着看吳恩達老師的機器學習教學視頻以及李航老師的《統計學習方法》,重新整理一下自己的筆記,同時也是整理一下自己的思路。

該系列估計會有10餘篇的文章,可能主要包括機器學習的基本知識、線性迴歸、logistic迴歸、softmax迴歸、決策樹、隨機森林、聚類算法、支持向量機(SVM)、EM算法、隱馬爾可夫模型(HMM)等內容。文章的順序大概會從易到難,從常用到不常用的順序來寫,後期儘量每篇補充幾個配套的代碼。由於本人比較懶,所以什麼時候更新新的文章,就看時間和心情了。

作爲該系列的第一篇文章,本文將會介紹機器學習算法的概念,以及凸函數、梯度下降算法、損失函數、正則化有/無監督學習以及最大似然函數等內容。

二、一點建議

由我淺薄的機器學習經驗來說,我認爲機器學習比較適合剛考完研或者大學數學基礎比較好的人來學,因爲在學習過程中經常會遇到公式的推導,所以學習的人應該有較好的微積分知識(主要是求導)、概率論的基礎知識和最大似然估計,以及線性代數中矩陣的逆、轉置、乘法等基本運算。在鄒博老師的機器學習課上,還介紹了矩陣的求導,這在推導公式也可能會遇到。此外最好有一定的編程基礎,可以讓算法落地。

三、課程資源

我所瞭解到的機器學習方面比較不錯的圖書有:周志華的《機器學習》,俗稱西瓜書;李航的《統計學習方法》等。我當前正在看《統計學習方法》,裏面的機器學習算法大都是從數學的角度進行講解的,所以需要一定的數學功底,雖然有些地方看不懂,但是感覺講得真是好,知識點也比較全。有關的教學視頻我推薦兩個:一個是吳恩達老師的機器學習;另一個是鄒博老師的機器學習和深度學習課程。只能說兩位老師各有千秋,我一開始看的是鄒博老師的,因爲他的視頻有配套的代碼資源,講的也比較形象,涉及的內容比較廣,也比較注重公式推導。而吳恩達老師的比較經典,但是沒有配套的代碼,有些機器學習算法沒有講到。所以就看大家自己的選擇了。另外免費附上一個上述網站對應的鄒博機器學習與深度學習2019課件,提取碼是:8ykz。

四、機器學習概述

首先要明確一點,機器學習和機器人沒有半毛錢關係,可以理解爲計算機(程序)通過大量的數據不斷學習如何解決特定的問題。機器學習是人工智能的一個領域,人們希望通過它來像人類一樣較爲智能處理各種問題,而我們經常聽到的深度學習又是機器學習的一個分支。通過機器學習算法,我們可以解決數據預測、數據分類,甚至是音頻、圖像等的處理等問題。

有一種有關機器學習的定義是:程序通過利用經驗E在解決一個任務T的過程中,性能P得到了一定的改善,則說該程序從經驗E中進行了學習。這個定爲稍顯抽象,舉個栗子,如果讓程序完成對郵件進行是否是垃圾郵件的分類問題,那麼通常我們需要給程序大量的已經標註好的是否是垃圾郵件的郵件,程序通過對其進行分析,並建立數學模型(可以理解爲一個有很多參數的數學表達式或概率分佈)。對於一個新的郵件,將其輸入到該數學模型中,就會得到一個輸出,該輸出表示是否是垃圾郵件,或者是垃圾郵件的概率。而機器學習的過程就是在構建數學模型的時候程序自動的學習模型的參數的過程。

在學習機器學習時,我們經常會看到類似於下圖這樣的圖片。下圖是用機器學習算法預測房價,圖中綠線是某個房子的房價隨時間的波動情況,而紅線是對房價的估計(或者說「擬合」),那麼對於一個新的時間點,則只要看對應的紅線的值就可以對房價進行預測了。

圖(1)

下圖是利用機器學習算法,根據花萼長度和花瓣長度對花進行分類。其中藍、紅、綠三個區域表示預測得到的不同類別所包含的區域,而形狀不一的點表示花的真實分類。

圖(2)

五、基本概念

下面講解的概念有點多了,讀者可能一時難以消化,當前只需要瞭解它們分別是做什麼用的,以及它們的運行過程是什麼樣的即可。等後面的講解提到的時候再來查看也不遲。

1.分類和迴歸

分類(classification)和迴歸(regression)模型的本質是一樣的,其中輸入變量和輸出變量均爲離散變量的預測問題是分類問題,反之,均爲連續變量的爲迴歸問題。例如上面提到的對房價的預測就是迴歸問題,而對花的分類就是分類問題。

2.訓練集、測試集和驗證集

上面提到過,機器學習算法就是用現有的樣本構建一個模型,然後用該模型去對新的數據進行預測。那麼問題來了,我們用什麼來判斷預測結果的好壞呢?如果用同樣的數據去構建和測試模型顯然不合理。這個時候通常把樣本劃分爲訓練集(training set)和測試集(test set),其中訓練集就是用來訓練(構建)模型的那部分樣本,而測試集就是測試已經構建的模型好壞的那部分樣本。而驗證集(validation set)則是在交叉驗證時用來挑選最優模型的那部分樣本。以上三個集合之間均無交集。

data set

3.交叉驗證

當已有的樣本數據不夠多時,爲了得到更好的模型就可以採取交叉驗證(cross validation)的方式。它的主要思想就是重複的使用樣本數據。在簡單交叉驗證中可以將樣本隨機劃分爲訓練集和測試集兩部分,然後在各種條件(比如不同參數數目)下用訓練集訓練模型,再用測試集對模型的誤差進行評估,從而選出誤差最小的模型。除了簡單交叉驗證之外,還有S折交叉驗證和留一交叉驗證等,原理都是差不多的,這裏就不再贅述了。

4.有/無監督學習

有監督學習就是指在對給定的樣本構建模型時,給定的樣本中包含數據真實的值,也就是說給定的是有標籤數據,而無監督學習則正好與之相反。例如在對花分類的例子中,如果只給出每朵花的花萼長度和花瓣長度,而不給出花所屬的真實類別,這就屬於無監督學習。而如果也給出了花的所屬的真實類別,則就是有監督學習。

5.假設函數和損失函數

假設函數(hypothesis function)可以理解爲我們所構建的模型,可以用 h θ ( x ) h_\theta(x) 來表示,對於一個輸入$ x_i$,則輸出爲 h θ ( x i ) h_\theta(x_i) 。其實也可以簡寫爲h(x)。

損失函數(loss function)又稱代價函數(cost function)或誤差函數,是一種對模型的好壞進行評估的方法,它的做法通常是通過計算真實值與預測值之間的誤差來實現。常用的損失函數有很多,例如:

(1)均方誤差(mean-square error, MSE)函數

其公式爲:
M S E = 1 n i = 1 n ( y y ^ ) 2 MSE=\frac{1}{n}\sum_{i=1}^{n}{(y-\hat{y})^2}
其中n是樣本個數,y和 y ^ \hat y 分別是樣本的真實值和假設函數所給出的預測值。

0-1損失函數

其公式爲:

也就是當真實值和預測值相等時損失爲0,反之爲1。

除此之外,還有交叉熵損失等,這裏不再一一贅述。

6.過擬合和正則化

爲了防止所建立的模型過擬合(overfitting),可以爲損失函數增加正則化項。所謂過擬合就是模型對訓練集數據預測效果非常好,而對測試集數據則預測效果不好。也可以說泛化能力(對新樣本的適應能力)差。如下圖中的圖c就是過擬合了。

過擬合

表現在房價預測的例子上就是房價的估值(紅線)會經過每一個樣本點,但是如果要對新的房價進行預測則效果很差。爲什麼紅線經過每個樣本點效果反而變差了呢,這主要是因爲模型的複雜度太高了,所以因爲增加一個正則化項來對模型的複雜度進行限制,也就是對參數進行懲罰。常用的正則化方式有L1正則和L2正則等。

L1正則:

L 1 ( θ ) = i = 1 m θ i L1(\theta)=\sum_{i=1}^{m}|\theta_i|

L2正則:

L 2 ( θ ) = i = 1 m θ i 2 L2(\theta)=\sum_{i=1}^{m}\theta_i^2

其中 θ \theta 是模型的參數向量,m是參數的個數。L1正則又稱LASSO。

要注意區分損失函數和正則化,正則化是爲了防止模型過擬合而對模型複雜度做的懲罰,而損失函數是評判預測結果好壞的標準,損失函數往往由真實值和預測值之間的誤差加上正則化項而組成。

7.凸函數和梯度下降

機器學習中提到的凸函數(convex function)和平常我們在數學中接觸到的凸函數有些不同,機器學習中的凸函數是數學中的下凸函數,這種函數的優勢是它只有一個全局最小值點,這爲什麼是優勢還請先來看一下梯度下降算法(gradient descent)的含義。

凸函數

想象一下你現在在一座山的靠近山頂的位置,如果你想盡快下山,那麼一個可行的方法是每次朝高度變化最大的方向(即負梯度方向)走一小步,那麼就可以到達一個局部最低點。而從靠近山峯的另一個地方按照該方法下山又可以到達另一個局部最低點。爲了獲取全局最低點,那麼應該要求目標函數(一般指損失函數)是一個凸函數,這樣就保證了只有一個全局極(最)小值點。熟悉算法的同學可以理解爲這是一個貪心算法,而凸函數則保證了局部最優解就是全局最優解。

梯度下降

梯度下降算法的提出主要是爲了可以讓計算機迭代的求解模型中參數的最優值,這可以讓模型的參數 theta 每次都朝最優的方向更新,通過有限次更新到達最優值。該過程可表示爲:

Repeat until convergence{
θ j : = θ j α h θ ( x ) \theta_j:=\theta_j-\alpha\nabla h_\theta(x)
}

下三角表示求導,上式表示第j個參數更新爲其原來值減去 α \alpha 倍的導數方向。 α \alpha 又被稱爲學習率(learning rate),這個概念等以後用到的時候再講,現在只需要瞭解它是用來調整每次更新的幅度的。大家可能有個疑問:參數 θ \theta 的初始值該怎麼確定呢?答案是對其進行隨機初始化。

在機器學習中,梯度下降算法以及其他優化算法關心的是損失函數在何時取極小值,而並不關心極小值是多少。

如果先計算出所有樣本在某點的平均梯度方向再對參數進行更新,則稱之爲批量梯度下降(batch gradient decline),而如果只用一個樣本計算梯度方向並對參數進行更新,則稱之爲隨機梯度下降(stochastic gradient descent,SGD),但是SGD存在模型收斂慢的問題,所以可以取以上兩者的折中——mini-batch梯度下降,也就是每次用若干個樣本梯度的平均方向作爲更新的方向。

8.最小二乘法和正規方程

最小二乘法中二乘就是平方的意思,它是指:把使得測量值和真實值之間誤差的平方和最小的測量值y當作真實值。可以用公式表示爲:
min y ( ( y y ^ ) 2 ) y \min_y(\sum{(y-\hat y)^2})\Rightarrow 真值y
關於最小二乘法的詳細介紹,請參考文章:如何理解最小二乘法?

在求解最優的參數值時,除了可以用梯度下降算法,還可以用正規方程(normal equation)的方法來進行求解,正規方程和最小二乘法息息相關,如果把最小二乘法的公式寫爲矩陣的形式,然後對參數 θ \theta 求導就可以得到以下正規方程的公式,也就是當平方和誤差最小時參數的取值:
θ = ( X T X ) 1 X T y \theta=(X^TX)^{-1}X^Ty
其中,X是m*n的矩陣,即由m個樣本,n個特徵組成的矩陣,y是m*1的向量,即m個樣本的真實值組成的向量。

該方法的優勢時不必設置學習率,也不用迭代求解。但是需要求逆矩陣,所以當n比較大(大於1w)時,求解速度很慢。並且不知道大家有沒有注意到一個問題,當式子中的逆矩陣不存在時,就不能用上述公式計算了,這時可以用矩陣的僞逆來代替矩陣的逆進行求解。關於僞逆的知識可以自行百度。

9.特徵縮放

不知道你有沒有想過一個問題,當給你一對樣本數據,你該怎麼對它進行建模呢?首先得確定用哪些特徵,比如在房價預測中,可以根據房子的面積、房子的使用年數、離市中心的距離等可以量化的特徵來對其價格進行預測。當然選取的特徵不是越多越好,必要時還需對其進行篩選。當選取多個特徵時,如果特徵之間的取值範圍相差較大時,就可能會導致梯度下降的速度變慢,所以應該保證特徵的取值範圍在同一尺度內,取值範圍太大或太小都是不好的。這時候就需要對特徵進行縮放,可以使用以下公式來實現:
f e a t u r e = f e a t u r e m e a n m a x m i n feature=\frac{feature-mean}{max-min}
公式中幾個標記分別代表特徵值、平均值、最大值和最小值

10.極大似然估計

極大似然估計又稱最大似然估計,「似然」就是「可能性」的意思。它可以解決「模型已定,參數未知」的情況,即當給定一堆樣本數據,想要預測它們的模型已經選定,但是最優的參數還沒有確定的情況下,就可以用極大似然估計來求解使得模型產生出觀測數據的概率最大的最優參數。

設總體樣本的概率分佈爲:p(x; θ \theta ),其中 θ \theta 是未知參數,則求最大似然估計量的 θ \theta 一般步驟爲:

​ (1)寫出似然函數:


L ( θ ) = i = 1 n p ( x i ; θ ) L(\theta)=\prod_{i=1}^{n}{p(x_i;\theta)}
​ (2)對似然函數取對數得 ln L ( θ ) \ln L(\theta) ,並整理;

​ (3)對參數 θ \theta 求導數,並令其爲0:
ln L ( θ ) θ j = 0 \frac{\partial \ln L(\theta)}{\partial \theta_j}=0
​ (4)解以上似然方程,得到最優的參數 θ \theta