假如你想深入機器學習和它背後的數學,你將會很快意識到一切都可歸結為一個優化問題。就連訓練神經網絡都是一個參數優化的問題。因此要想理解機器學習算法,你需要首先理解數學優化的基本概念,以及它為什麼這麼有用。
這篇文章,你將會看到一步一步的演示如何求解一個簡單的機器學習問題。在這個過程中,你將會看到為什麼以及它怎樣歸結為一個機器學習問題,參數如何被優化以及如何計算最優值。
“
機器學習求解步驟
”
Step 1: 問題定義
如下所示一個簡單的數據集,一共包括11個已知點,點的座標為:(x1, x2):
x1,x2的含義可以任意假定,比如x1 表示計算機的使用年限,x2表示訓練神經網絡所需要的時間。
如果你的電腦使用年限為下圖中的x, 顯然你不知道訓練神經網絡所需要的準確時間x2
Step 2: 僅憑猜測
我們隨便找一個電腦使用年限與x 最接近的點,如下圖所示,來預測x對應的x2值,產生的誤差為err.
但是,如果我們運氣不好,下圖所示,已知的11個點中,沒有與預測點的使用年限x值相近的,此時誤差就會很大。
因此,我們需要一個更好的算法來求解。
Step 3: 讓猜測更準確:機器學習方法
a. 數據擬合
現在我們進入機器學習領域。在觀察紅色數據點後,你會很容易看出一種線性趨勢,你的電腦使用越長(x1 越大),訓練時間就會越長(x2 越大)。一個更好的算法將會依據數據,識別出這個趨勢,做出更好的預測,誤差自然會更小。
函數應該近似擬合我們的數據
b. 擬合線
我們怎樣發現這條線?利用高中知識:
我們只需要找到更好的a和b:
對於此處的數據,最優值分別為 a=0.8 and b=20 . 但是,我們應該怎麼發現這些最優值 a and b
c. 發現最優a和b,最小化均方誤差
就像我們前面說的,我們想要發現 a 和 b ,以便使得 y=ax+b 這條線儘可能好的擬合我們的數據。用數學的術語來表述,在我們數據集中的點與這條線的誤差(或稱距離)應該是最小的,如下圖所示,這些黃色的虛線儘可能地短。
綠色箭頭指向的點,其誤差(或稱距離)距離等於:
如果此點的座標為 (x1, x2) = (100, 120) , 還記得最優參數 a=0.8 and b=20 ,所以此點的誤差:
Error = f(x) — yi
Error = f(100) — 120
Error = a*100+b — 120
Error = 0.8*100+20–120
Error = -12
圖中我們也可看出這個點比擬合線高12個單元。為了評估擬合線整體的表現,需要計算所有點的誤差。怎麼做?首先計算每個點的誤差的平方。有兩個原因:
- 通過平方誤差,我們會得到一個絕對值,(-12)^2 = 144,
- 平方放大了誤差,如果某些點離擬合線比較遠,結果誤差將會變得非常大
用公式表達為:
更一般的寫法:
這個公式稱為均方誤差的和(sum of square error),它在統計學和機器學習中非常常見。
d. 優化函數
優化函數為什麼這麼有用?初始問題的定義:我們想要發現a和b以便
y=ax+b 更好的擬合數據集。也可以表述為,我們想要發現 a 和 b 以便均方誤差最小,即:假如找到函數 f(a, b) 的最小值,我們將會發現a和b的最優值:
進入實際計算前,先讓我們圖形繪製下優化函數 f(a, b) :
左圖的高度代表均方誤差的大小,山峰越高,誤差越大。最小均方誤差位於綠色箭頭所指處,此處對應的a和b就是最優值。
沿著軸a,改變a的取值(對應左圖的斜率變大),相應的誤差也會變大。
沿著軸b,改變b的取值,也就是叫線上下移動,我們同樣也會得到更大的均方誤差。
e. 計算最優值
怎樣計算均方誤差最小值對應的a和b呢?我們知道取得全局最小點必須滿足兩個條件:
- 一階偏導 f’(a,b) = 0
- 二階偏導 f’’(a,b) >0
因為目標函數是2個維度的函數,我們可以簡單的計算每一個維度上的偏導數,根據必須滿足的條件1,得到如下方程:
f(a, b) Δa = 0
f(a, b) Δb = 0
已知 f(a,b) = SUM [axi+b — yi]² ,進一步化簡:
f(a,b) = SUM [yi² + b²+a²x + 2abxi — 2byi — 2bxiyi] , 綜合可得:
SUM [yi² + b²+a²xi + 2abxi — 2byi — 2axiyi] Δa = 0
SUM [yi² + b²+a²xi + 2abxi — 2byi — 2axiyi] Δb = 0
很容易計算出偏導數:
f(a,b) = SUM [2axi + 2bxi — 2xiyi] = 0
f(a,b) = SUM [2b+ 2axi — 2yi ] = 0
記住,在上面兩個方程中,有兩個SUM,和許多已知點xi 和yi. 就算只有10個點,代入後方程也會變得很長,因此手算也變得不容易,只能藉助計算機。
恭喜你!你已經知道線性迴歸是如何工作的,以及如何通過已知樣本學習到兩個參數a,b.
但是,要等一下,還有更多知識需要了解。
“
逼近多項式
”
如果我們的數據沒有展現線性走勢,而是像如下一個二次函數走勢:
在這種情況下,很明顯線性函數擬合的將不會太好,多項式將會更好,這就意味著我們需要處理平方函數,三次方函數,甚至更高階的多項式逼近。
但是,計算這些問題的方法通用的,首先我們再次定義問題,我們想要一個平方函數 y = ax² + bx + c 以此更好的擬合我們的數據:
就像你看到的,我們現在有三個參數要去確定: a, b 和 c . 因為,我們的最小化問題需要稍作改變,不過均方誤差和最小的目標函數不會改變:
需要優化的三個參數 a,b 和 c :
“
過擬合
”
我們仍然有一個問題需要去解釋,文章一開始提到的具有線性走勢的那個問題,難道就不能用二次函數擬合嗎?肯定可以!我們用更高階的函數 y = ax² + bx + c 去擬合不好嗎?如果單從訓練集上的表現來看,高階函數肯定會讓誤差更小的。
事實上,目標函數的階次比總的樣本點個數小於1的時候,我們的目標函數將會擬合到每一個點,均方誤差將會是 0 . 非常完美,不是嗎?
並不是那樣好,用下面兩幅圖來解釋:
在左圖,我們用二次函數近似擬合數據,在右圖,我們用10階函數擬合,因此它能近似擬合幾乎所有14個樣本點。
但是,右圖的線條運動看起來很奇怪,它試圖去擬合所有點,但是它丟失了樣本數據的整體走勢。得到的高階函數對值得變化更加敏感,預測結果更加不可靠。
因此,我們應該首先觀察數據,決策用幾階多項式擬合效果很最好,然後選擇合適的階數去擬合。
閱讀更多 sandag 的文章