1. 程式人生 > >線性迴歸與梯度下降

線性迴歸與梯度下降

線性迴歸(Linear Regression)

從這篇文章開始,主要介紹機器學習的一些列基本演算法,本文介紹線性迴歸問題,以及利用最小均方和梯度下降解決線性迴歸問題。

(以下內容是根據斯坦福大學ng教授的機器學習公開課總結的內容)

監督學習:即訓練資料中既包含了輸入資料又包含了對應於這個是輸入資料的正確的輸出結果。
迴歸問題:當給出了輸入資料後,預測正確的輸出結果。

線性迴歸函式

首先考慮一個問題:我們需要預測自己房屋的價格,現在擁有的資料只是幾十個房屋樣本價格,如下圖所示。怎樣根據這些房屋的面積以及價格來預測我們自己房屋的價格呢?
房屋樣本
為了更加直觀的將已知樣本房屋的價格表示出來,我們將上述資料標註在座標系中,如下圖:
此處輸入圖片的描述


由圖我們可以看出,點的分佈大致圍繞在一條直線周圍,因此,我們可以用一個線性函式表示房屋的面積與房屋的價格的對應關係,流程大致如下:
此處輸入圖片的描述
利用訓練資料+學習演算法得到一個函式h,然後將待預測的房屋面積輸入,即可得到預測的房價。
首先介紹具體字母代表的含義:

  • m:訓練資料的總數。
  • x:輸入值
  • y:輸出值
  • (x,y):訓練樣本
  • x(i),y(i)):訓練樣本中的第i對值

為了使得問題更加具有一般性,我們將上面的例子進行擴充成如下表格:
此處輸入圖片的描述

現在我們假設輸出值和輸入值之間對應的關係為線性函式:

  • hθ(x)=θ0+θ1x1+θ2x2

上面的式子為了便於表達,假設x0=1,因此,可以寫成:

  • hθ(x)=θ0x0+θ1x1+
    θ2x2=ni=0θixi=θTX

現在,當我們有了測試集,怎樣來預測引數θ?,我們的目的就是使得預測結果儘量接近與真實的結果,因此,在所有的訓練集上,我們需要使得該函式的輸出結果儘量可能接近真實值,也就是使得差量最小,因此可以表示為如下的形式:

  • J(θ)=1/2mi=0(hθ(x(i))y(i))2

這個表達形式可以表現出預測值和真實值的平方差量,其中前面的1/2主要是為了後面的求導計算方便,m表示的是所有的訓練資料總數量。到這裡,我們表示出了誤差函式,也就是損失函式,我們的目標是最小化損失函式J(θ),用到的方法是梯度下降法

梯度下降(gradient descent)

首先我們考慮一個實際的情景,當我們站在山腰的時候,如果我們想最快到達山地,我們首選的方法當然是找坡度最大的地方,即梯度的方向。如下圖所示:
此處輸入圖片的描述


但是,我們會發現一個問題,那就是當我們所處的位置不同的時候,就會走到不同的最低位置,即會出現區域性最優,而不是尋找的全域性最優值,如下圖所示:
此處輸入圖片的描述
其實,現實我們遇見的現實問題大多隻有一個最小值,因此,不會走入區域性最優值。例如本例項影象如下所示:
此處輸入圖片的描述
現在,根據上圖可以看出我們需要做的就是不斷地更新θ(此處的為一個向量,包括θ1θ2)值,得到到達最小值時候的θ,更新的方法如下,即求偏導後沿著偏導數數的方向進行更新。
此處輸入圖片的描述
該表示式表示對θi(包括θ1θ2)更新,其中的α表示更新不發的大小(如果太大可能直接越過了最小值,如果太小,迭代速度太慢,代價太大)。將J帶入後計算如下:
此處輸入圖片的描述
最後結果為:
此處輸入圖片的描述
這個規則稱為最小均方(LMS,least mean squares)更新規則
對於以上的式子進行充分直到得到結果即可,其中重複的形式有兩種,一種稱作批梯度下降(batch gradient descent)隨機梯度下降(stochastic gradient descent)

批梯度下降(batch gradient descent)

批梯度下降即每次更新一個引數的一步時候,都需要將所有的資料計算一遍,演算法如下:
此處輸入圖片的描述
很明顯,這個演算法當訓練資料集很大的時候,會導致演算法變慢,時間複雜度太大。因此,一般用的比較少。

隨機梯度下降(stochastic gradient descent)

隨機梯度下降主要是對以上演算法的優化,每一步引數的更新,只看訓練資料集中的一個訓練資料,演算法如下:
此處輸入圖片的描述

利用以上的演算法更新開頭提出的問題的解法過程影象和最終結果影象如下:
此處輸入圖片的描述
此處輸入圖片的描述

前言:

   上次寫過一篇關於貝葉斯概率論的數學,最近時間比較緊,coding的任務比較重,不過還是抽空看了一些機器學習的書和視訊,其中很推薦兩個:一個是stanford的machine learning公開課,在verycd可下載,可惜沒有翻譯。不過還是可以看。另外一個是prml-pattern recognition and machine learning, Bishop的一部反響不錯的書,而且是2008年的,算是比較新的一本書了。

   前幾天還準備寫一個分散式計算的系列,只寫了個開頭,又換到寫這個系列了。以後看哪邊的心得更多,就寫哪一個系列吧。最近乾的事情比較雜,有跟機器學習相關的,有跟數學相關的,也有跟分散式相關的。

   這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些式子吧,不然看一些相關的論文可就看不懂了,這個系列主要將會著重於去機器學習的數學描述這個部分,將會覆蓋但不一定侷限於迴歸、聚類、分類等演算法。

迴歸與梯度下降:

   迴歸在數學上來說是給定一個點集,能夠用一條曲線去擬合之,如果這個曲線是一條直線,那就被稱為線性迴歸,如果曲線是一條二次曲線,就被稱為二次迴歸,迴歸還有很多的變種,如locally weighted迴歸,logistic迴歸,等等,這個將在後面去講。

   用一個很簡單的例子來說明迴歸,這個例子來自很多的地方,也在很多的open source的軟體中看到,比如說weka。大概就是,做一個房屋價值的評估系統,一個房屋的價值來自很多地方,比如說面積、房間的數量(幾室幾廳)、地段、朝向等等,這些影響房屋價值的變數被稱為特徵(feature),feature在機器學習中是一個很重要的概念,有很多的論文專門探討這個東西。在此處,為了簡單,假設我們的房屋就是一個變數影響的,就是房屋的面積。

   假設有一個房屋銷售的資料如下:

   面積(m^2)  銷售價錢(萬元)

   123            250

   150            320

   87              160

   102            220

   …               …

   這個表類似於帝都5環左右的房屋價錢,我們可以做出一個圖,x軸是房屋的面積。y軸是房屋的售價,如下:

   image

   如果來了一個新的面積,假設在銷售價錢的記錄中沒有的,我們怎麼辦呢?

   我們可以用一條曲線去儘量準的擬合這些資料,然後如果有新的輸入過來,我們可以在將曲線上這個點對應的值返回。如果用一條直線去擬合,可能是下面的樣子:

    image

   綠色的點就是我們想要預測的點。

   首先給出一些概念和常用的符號,在不同的機器學習書籍中可能有一定的差別。

   房屋銷售記錄表 - 訓練集(training set)或者訓練資料(training data), 是我們流程中的輸入資料,一般稱為x

   房屋銷售價錢 - 輸出資料,一般稱為y

   擬合的函式(或者稱為假設或者模型),一般寫做 y = h(x)

   訓練資料的條目數(#training set), 一條訓練資料是由一對輸入資料和輸出資料組成的

   輸入資料的維度(特徵的個數,#features),n

   下面是一個典型的機器學習的過程,首先給出一個輸入資料,我們的演算法會通過一系列的過程得到一個估計的函式,這個函式有能力對沒有見過的新資料給出一個新的估計,也被稱為構建一個模型。就如同上面的線性迴歸函式。

   image

    我們用X1,X2..Xn 去描述feature裡面的分量,比如x1=房間的面積,x2=房間的朝向,等等,我們可以做出一個估計函式:

image

    θ在這兒稱為引數,在這兒的意思是調整feature中每個分量的影響力,就是到底是房屋的面積更重要還是房屋的地段更重要。為了如果我們令X0 = 1,就可以用向量的方式來表示了:

image

    我們程式也需要一個機制去評估我們θ是否比較好,所以說需要對我們做出的h函式進行評估,一般這個函式稱為損失函式(loss function)或者錯誤函式(error function),描述h函式不好的程度,在下面,我們稱這個函式為J函式

    在這兒我們可以做出下面的一個錯誤函式:

image 

    這個錯誤估計函式是去對x(i)的估計值與真實值y(i)差的平方和作為錯誤估計函式,前面乘上的1/2是為了在求導的時候,這個係數就不見了。

    如何調整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一種完全是數學描述的方法,在stanford機器學習開放課最後的部分會推導最小二乘法的公式的來源,這個來很多的機器學習和數學書上都可以找到,這裡就不提最小二乘法,而談談梯度下降法。

    梯度下降法是按下面的流程進行的:

    1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。

    2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。

    為了更清楚,給出下面的圖:

image    這是一個表示引數θ與誤差函式J(θ)的關係圖,紅色的部分是表示J(θ)有著比較高的取值,我們需要的是,能夠讓J(θ)的值儘量的低。也就是深藍色的部分。θ0,θ1表示θ向量的兩個維度。

    在上面提到梯度下降法的第一步是給θ給一個初值,假設隨機給的初值是在圖上的十字點。

    然後我們將θ按照梯度下降的方向進行調整,就會使得J(θ)往更低的方向進行變化,如圖所示,演算法的結束將是在θ下降到無法繼續下降為止。

image     當然,可能梯度下降的最終點並非是全域性最小點,可能是一個區域性最小點,可能是下面的情況:

image

   上面這張圖就是描述的一個區域性最小點,這是我們重新選擇了一個初始點得到的,看來我們這個演算法將會在很大的程度上被初始點的選擇影響而陷入區域性最小點  

   下面我將用一個例子描述一下梯度減少的過程,對於我們的函式J(θ)求偏導J:(求導的過程如果不明白,可以溫習一下微積分)

  image

    下面是更新的過程,也就是θi會向著梯度最小的方向進行減少。θi表示更新之前的值,-後面的部分表示按梯度方向減少的量,α表示步長,也就是每次按照梯度減少的方向變化多少。

image     一個很重要的地方值得注意的是,梯度是有方向的,對於一個向量θ,每一維分量θi都可以求出一個梯度的方向,我們就可以找到一個整體的方向,在變化的時候,我們就朝著下降最多的方向進行變化就可以達到一個最小點,不管它是區域性的還是全域性的。

    用更簡單的數學語言進行描述步驟2)是這樣的:

  image    倒三角形表示梯度,按這種方式來表示,θi就不見了,看看用好向量和矩陣,真的會大大的簡化數學的描述啊。

總結與預告:

    本文中的內容主要取自stanford的課程第二集,希望我把意思表達清楚了:)本系列的下一篇文章也將會取自stanford課程的第三集,下一次將會深入的講講迴歸、logistic迴歸、和Newton法,不過本系列並不希望做成stanford課程的筆記版,再往後面就不一定完全與stanford課程保持一致了。