機器學習之單變數線性迴歸(Linear Regression with One Variable)
1. 模型表達(Model Representation)
我們的第一個學習演算法是線性迴歸演算法,讓我們通過一個例子來開始。這個例子用來預測住房價格,我們使用一個數據集,該資料集包含俄勒岡州波特蘭市的住房價格。在這裡,我要根據不同房屋尺寸所售出的價格,畫出我的資料集:
我們來看這個資料集,如果你有一個朋友正想出售自己的房子,如果你朋友的房子是1250平方尺大小,你要告訴他們這房子能賣多少錢。 那麼,你可以做的一件事就是構建一個模型,也許是條直線。從這個資料模型上來看,也許你可以告訴你的朋友,他大概能以220000美元左右的價格賣掉這個房子,顯然這就是監督學習演算法的一個例子。
在上一篇博文Introduction to Machine Learning
同時,還有另一種最常見的 Supervised Learning 的方式叫做分類問題。更進一步來說,在 Supervised Learning 中我們有一個數據集,這個資料集被稱訓練集。因此對於房價的例子,我們有一個包含不同房屋價格的訓練集,我們的任務就是從這個訓練集中學習並預測房屋價格。
現在我們給出經常使用的一些符號定義,如下:
用 m 來表示訓練樣本的數目,因此,在這個資料集中如果表中有47行,那麼我們就有47組訓練樣本,m就等於47。
用小寫字母 x 來表示輸入變數,往往也被稱為特徵量,就是用 x 表示輸入的特徵,並且我們將用 y 來表示輸出變數或者目標變數,也就是我的預測結果,也就是上面表格的第二列。
在這裡我們要使用 (x, y) 來表示一個訓練樣本,因此,在這個表格中的單獨的一行對應於一個訓練樣本。
為了表示某個特定的訓練樣本,我們將使用x上標(i)與y上標(i)來表示,並且用這個來表示第 i 個訓練樣本,所以上標為 i ,注意這不是求冪運算,這個(x(i), y(i)) 括號裡的上標 i 只是一個索引,表示我的訓練集裡的第 i 行。
我們的房屋價格預測就是一個監督學習演算法的工作方式,如下圖:
我們可以看到這裡有我們的訓練集裡房屋價格,我們把它餵給我們的學習演算法,進而學習得到一個函式,按照慣例,通常表示為小寫 h,h 代表 hypothesis(假設), 在此處,h 表示一個函式,其輸入是房屋尺寸大小。因此 h 根據輸入的 x 值來得出 y 值,y 值對應房子的價格。因此,h 是一個從 x到 y 的函式對映。
大家經常會有這樣的疑問:為什麼這個函式被稱作假設(hypothesis)?你們中有些人可能知道 hypothesis 的意思,從字典或者其它什麼方式可以查到。其實在機器學習中,這是一個在早期被用於機器學習的名稱,它有點繞口,對某些函式來說這可能不是一個很恰當的名字。例如,對錶示從房屋的大小到價格的函式對映,我認為這個詞 "hypothesis" 就可能不是最好的名稱。但是這是人們在機器學習中使用的標準術語,所以我們不用太糾結人們為什麼這麼叫它。
小結:當解決房價預測問題時,我們實際上是要將訓練集“喂”給我們的學習演算法,進而學習得一個假設 h,然後將我們要預測的房屋的尺寸作為輸入變數輸入給 h,預測出該房屋的交易價格作為輸出變數輸出為結果。
當我們在設計學習演算法的時候,需要去思考的是怎樣得到這個假設 h。例如,對於我們的房價預測問題,我們該如何表達 h ? 一種可能的表達方式為:
因為只含有一個特徵/輸入變數,因此這樣的問題叫作單變數線性迴歸問題。
那麼為什麼是一個線性函式呢? 實際上,有時候我們會有更復雜的函式,也許是非線性函式,但是由於線性方程是簡單的形式,我們將先從線性方程的例子入手。當然,最終我們將會建立更復雜的模型以及更復雜的學習演算法。
2. 代價函式(Cost Function)
接下來我們將定義代價函式的概念,這將有助於我們弄明白怎樣將最有可能的直線與我們的資料相擬合。
線上性迴歸中我們有一個像上圖一樣的訓練集 記住 m 代表了訓練樣本的數量,例如,此處 m = 47 。
而我們的假設函式(也就是用來進行預測的函式),線性函式形式也已在上圖中表示出來了。
接下來我們引入一些術語,諸如 θ0 和 θ1 之類這些 θi 我們通常稱其為模型引數。那麼我們如何選擇這兩個引數值 θ0 和 θ1 呢?選擇不同的引數 θ0 和 θ1 我們會得到不同的假設函式。例如下圖:
線上性迴歸中,我們有一個訓練集,我們要做的就是得出 θ0 和 θ1 這兩個引數的值,來讓假設函式表示的直線儘量地與這些資料點很好的擬合。那麼我們如何得出 θ0 和 θ1 的值,來使它很好地擬合數據的呢?
我們的想法是,我們要選擇能使 h(x) 輸入 x 時我們預測的值最接近該樣本對應的 y 值的引數 θ0 和 θ1 。在我們的訓練集中有一定數量的樣本,我們知道 x 表示賣出哪所房子,並且知道這所房子的實際價格,所以,我們要選擇引數值,儘量使得在訓練集中給出的 x 值,能準確地預測 y 的值。
讓我們給出標準的定義,線上性迴歸中,我們要解決的是一個最小化問題。
我們選擇的引數 θ0 和 θ1 決定了我們得到的直線相對於我們的訓練集的準確程度,模型所預測的值與訓練集中實際值之間的差距(下圖中藍線所指)就是建模誤差(modeling error)。
我們的目標便是選擇出可以使得建模誤差的平方和能夠最小的模型引數。即使得代價函式:
最小。我們繪製一個等高線圖,三個座標分別為 θ0 和 θ1 和J(θ0 ,θ1):
可以看出在三維空間中存在一個使得J(θ0,θ1)最小的點。
3. 梯度下降(Gradient Descent)
我們已經定義了代價函式,現在我們來介紹梯度下降演算法,該演算法可以將代價函式 J 最小化。梯度下降是很常用的演算法,它不僅被用線上性迴歸上,並且被廣泛的應用於機器學習的眾多領域中,之後為了解決其他線性迴歸問題,我們也將使用梯度下降法來最小化其他函式。
在這裡,我們有一個函式 J(θ0 ,θ1) ,也許這是一個線性迴歸的代價函式,也許是一些其他函式,要使其最小化,我們需要用一個演算法來最小化函式 J(θ0 ,θ1),事實證明,梯度下降演算法可應用於多種多樣的函式求解,所以想象一下如果你有一個函式J(θ0, θ1, θ2, ...,θn ),你希望可以通過最小化 θ0 到 θn 來最小化此代價函式J(θ0 到θn),用n個θ是為了證明梯度下降演算法可以解決更一般的問題。但為了簡潔起見,為了簡化符號,在接下來的討論中,我們只用兩個引數。
下面就是關於梯度下降的構想。首先我們要做的是對 θ0 和 θ1 進行初始化。實際上,它們到底是什麼其實並不重要,但通常的選擇是將 θ0 設為0
,同時也將 θ1 也設為0,即將它們都初始化為0。
我們在梯度下降演算法中要做的就是不停地一點點地改變 θ0 和 θ1 ,試圖通過這種改變使得 J(θ0 ,θ1) 變小,直到我們找到 J(θ0 ,θ1) 的最小值。或許是區域性最小值。
讓我們通過一些圖片來看看梯度下降法是如何工作的,我們在試圖讓 J(θ0 ,θ1) 最小,注意座標軸 θ0 和 θ1 在水平軸上,而函式 J(θ0 ,θ1) 在垂直座標軸上,圖形表面高度即是 J(θ0 ,θ1) 的值。我們希望最小化這個函式,因此我們從 θ0 和 θ1 的某個值出發。所以想象一下,對 θ0 和 θ1 賦以某個初值,也就是對應於從這個函式表面上的某個起始點出發,因此不管 θ0 和 θ1 的取值是多少,我將它們初始化為0。但有時你也可把它初始化為其他值。
現在我希望大家把這個影象想象為一座山。想像類似這樣的景色,公園中有兩座山,想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上。在梯度下降演算法中,我們要做的就是旋轉360度,看看我們的周圍,並問自己,如果我想要下山,如果我想盡快走下山,我們需要朝什麼方向?
如果我們站在山坡上的某一點,你看一下週圍 ,你會發現最佳的下山方向大約是那個方向。好的,現在你在山上的新起點上,你再看看周圍,然後再一次想想我應該從什麼方向邁著小碎步下山? 然後你按照自己的判斷又邁出一步,往那個方向走了一步。然後重複上面的步驟,從這個新的點,你環顧四周並決定從什麼方向將會最快下山,然後又邁進了一小步,又是一小步…並依此類推,直到你接近區域性最低點的位置。
此外這種下降有一個有趣的特點,不同的起始點開始進行梯度下降演算法,你會得到一個非常不同的區域性最優解,這就是梯度下降演算法的一個特點。
下圖是梯度下降演算法的定義:
注意,在梯度下降演算法中,我們需要同時更新 θ0 和 θ1。
如果學習速率太小,只能這樣像小寶寶一樣一點點地挪動,去努力接近最低點,這樣就需要很多步才能到達最低點。
如果學習速率太大,那麼梯度下降法可能會越過最低點,甚至可能無法收斂。實際上,會離最低點越來越遠,因此,如果α太大,會導致無法收斂,甚至發散。
如果你的引數已經處於區域性最低點,那麼梯度下降法更新其實什麼都沒做(求導為0),它不會改變引數的值,這也正是你想要的,因為它使你的解始終保持在區域性最優點,這也解釋了為什麼即使學習速率 α 保持不變時,梯度下降也可以收斂到區域性最低點。
梯度下降一步後,新的導數會變小一點點。隨著梯度下降法的執行,你移動的幅度會自動變得越來越小,直到最終移動幅度非常小,你會發現已經收斂到區域性極小值。
在梯度下降法中,當我們接近區域性最低點時,梯度下降法會自動採取更小的幅度。這是因為當我們接近區域性最低點時(很顯然在區域性最低時導數等於零 ),導數值會自動變得越來越小,所以梯度下降將自動採取較小的幅度,這就是梯度下降的做法,所以實際上沒有必要再另外減小α。
實際上,用於線性迴歸的代價函式總是呈現一個弓形的樣子,這個函式的專業術語是凸函式。這個函式沒有任何區域性最優解,只有一個全域性最優解。
實際上,我們剛剛介紹的梯度下降,是“批量梯度下降”,指的是,在梯度下降的每一步中我們都用到了所有的訓練樣本。在梯度下降中,在計算微分求導項時,我們需要進行求和運算,所以在每一個單獨的梯度下降中,我們最終都要計算這樣一項,這項需要對所有m個訓練樣本求和。
而事實上,也有其他型別的梯度下降法不是這種"批量"型的,不考慮整個的訓練集,而是每次只關注訓練集中的一些小的子集。