吳恩達機器學習筆記 - 線性迴歸 & 代價函數 & 梯度下降

一、基本概念

1.1 機器學習的定義

一個年代近一點的定義,由來自卡內基梅隆大學的 Tom Mitchell 提出,一個好的學習問題定義如下:

一個程序被認爲能從經驗 E 中學習,解決任務 T,達到性能度量值 P,當且僅當,有了經驗 E 後,經過 P 評判,程序在處理 T 時的性能有所提升。

比如以下棋的機器學習算法爲例:經驗 E 就是程序上萬次的自我練習的經驗,任務 T 是下棋,性能度量值 P 是它在與一些新的對手比賽時,贏得比賽的概率。

1.2 分類問題和迴歸問題

**分類問題:預測離散的數據點。**比如下面的二分類問題:

紅×和藍圈代表兩種不同類型,中間的直線是我們算法預測的分類邊界函數,當函數參數確定好了,我們給定一個輸入,那麼輸出就是在直線上部或者下部的一個離散的點,表示該輸入數據是最可能是哪一種類型,對於多個特徵的分類問題,原理是一樣的。

迴歸問題:預測連續的輸出(擬合函數曲線),比如用最小二乘迴歸一個連續的輸出曲線:

擬合的曲線可能有多條,通過不斷的優化函數模型和參數,可以看出藍色的曲線比紫色的直線擬合(迴歸)效果好。

再來練習下:

  • 你有一大批同樣的貨物,想象一下,你有上千件一模一樣的貨物等待出售,這時你想預測接下來的三個月能賣多少件? - 迴歸問題

  • 你有許多客戶,這時你想寫一個軟件來檢驗每一個用戶的賬戶。對於每一個賬戶,你要判斷它們是否曾經被盜過? - 分類問題

1.3 監督學習

監督學習可以理解爲:算法使用的數據集中已經人爲設置了正確的屬性。

比如用監督學習來根據房屋面積預測房價,那麼在訓練數據集中每個房屋面積都對應一個確定的價格(750, 200),這個確定的價格 200 就是我們人爲給定的,用來訓練算法模型(預測函數參數)。

1.3 無監督學習

無監督學習:算法使用的數據集不做任何人爲處理,即沒有加上任何屬性。

上面是監督學習,已經人爲設置了屬性(紅叉,藍圈)

這是無監督學習,所有的數據沒有進行處理,表面上看起來都差不多。

在無監督學習中,常用的是聚類算法,即把距離相近的數據點劃分爲同一個簇,比如 Google 新聞從互聯網上收集很多條新聞,然後將類型相近的文章劃分爲同一個類別:科技,情感,政治等等。

二、單變量線性迴歸算法

這個線性迴歸算法就是高中學的最小二乘擬合曲線數據點,通過下面這個例子來複習下機器學習算法工作流程,根據房屋面積預測出售價格(監督學習):

訓練數據集如下(訓練就是用給定的數據來計算最優的函數曲線參數,使得擬合效果最好):

  • m 代表訓練集中實例的數量
  • x 代表輸入變量(特徵 Feature)
  • y 代表輸出變量(目標變量)
  • (x, y) 代表訓練集中的實例
  • (Xi, Yi) 代表第 i 個觀察實例
  • h 代表學習算法的解決方案或函數,也稱爲假設函數(hypothesis

一個經典監督學習算法工作流程如下圖:

使用訓練數據集和選擇的訓練算法,來計算假設函數 hh 的參數,使得給定一個輸入,假設函數給出一個預測的輸出。比如預測房屋價格:

  • 訓練集:人爲標記的房屋面積和對應房價的一組數據點
  • 學習算法:比如梯度下降法
  • 假設函數 hh:比如 hθ(x)=θ0+θ1xh_\theta \left( x \right)=\theta_{0}+\theta_{1}x,線性函數擬合
  • 輸入和輸出:房屋的預測價格 y=hy = h(房屋面積 x)

機器學習算法的訓練就是計算最優的參數 a 和 b,這裏的函數只有一個輸入特徵面積,所以叫單變量線性迴歸模型。

三、代價函數(Cost Function)

我的理解:代價函數(cost function,loss function)在機器學習中的作用是確定最優的函數參數,使得擬合數據點的誤差達到最小,即擬合效果最好。

因爲我們訓練函數參數,最終還是要選擇一個最優的,那麼代價函數就給我們一個最優參數的度量方式,使得我們可以根據數學理論選擇訓練參數。

3.1 預測房價的代價函數

還是用預測房價的例子來介紹下代價函數的原理,這是預測房價的數據集:

我們使用線性迴歸算法來預測,所以取假設函數 Hypothesis 的表達式爲 2 個參數(θ0\theta_0θ1\theta_1)線性函數,那麼這個機器學習的問題就可以轉換爲如何選擇最優的參數來使得預測的誤差(代價)最小?

可問題是用什麼方式來度量預測的誤差呢?這時代價函數就派上用場了,我們可以用代價函數來計算不同參數所對應的誤差,取誤差最小的那組參數作爲訓練的最終結果,代價函數有挺多種形式,線性迴歸常用誤差的平方和計算代價:

上面的代價函數 Cost Function 的求和公式其實就是高中學習的最小二乘法的平方誤差的計算,最終的求和結果就是預測值與真實值誤差的平方和,再除以訓練集實例數量,不過要注意這裏的乘以 1/2,只是爲了儘量把最後的求和結果變小一點,不含有其他邏輯。

可以將 Cost Function 的求和值理解就是下圖中三條藍色線段的長度平方之和再除以 1/ 2m,表示當前預測的函數值與實際的函數值之間的總的誤差:

可以直觀的理解,藍色的線段總長度越小(誤差越小,代價越小),則預測的函數直線就越接近(1,1)(2,2)(3,3)這 3 個點,且當代價函數的值爲 0 時,預測的函數直線就是 y = x(淺藍色直線),直接擬合了這 3 個訓練的數據點,這時誤差達到最小,對應的函數參數爲 θ0\theta_0 = 0,θ1\theta_1 = 1,這就是訓練的最終結果了。

所以機器學習的訓練就是找到使得代價函數取最小值得那組參數,就這麼簡單,聽起來挺高大上的,上圖中右邊的代價函數 J(θ0)J(\theta_0) = 0,但如果不把 θ0\theta_0 設置爲 0,又如何理解帶有 2 個參數的代價函數呢?繼續往下看。

3.2 理解 2 個參數的代價函數

上面一個參數 θ1\theta_1 的代價函數容易理解,如果是兩個參數的 J(θ0,θ1)J(\theta_0, \theta_1) 的代價函數,函數圖形稍微複雜些,不過也不是很難理解,我們目前只需要理解 2 個參數成本函數的求最小值的過程就行了,其他的暫時不需要深究。

來看下這個 2 參數的代價函數,其實就是在參數 θ1\theta_1 的基礎上,縱向擴展了一個 θ0\theta_0 維度,最後的曲線變成了一個像漁網一樣的圖像,我們稱這樣的函數爲凸函數,不必追究它的概念,只需要知道凸函數只有一個局部最優解 - 即漁網的最底部。

但這個漁網一樣的曲線也不是很直觀,爲了在二維座標系中顯示這個曲線,我們使用等高線來表示這 2 個參數,可以把上面的漁網從下往上看,像個小山頭,下面右圖就相當於山頭的等高線,每個等高線上函數的代價都相同。

當代價函數達到最小時:

  • 漁網圖像中(θ0\theta_0θ1\theta_1)在漁網的最底部取得,使得代價函數達到最小值;
  • hθ(x)h_\theta \left( x \right) 圖像中預測的函數曲線對訓練數據的擬合效果達到最優;

四、梯度下降算法(Gradient Descent)

如何在程序中求代價函數的最小值呢?可以使用經典的梯度下降算法,迭代求代價函數 J(θ0,θ1)J(\theta_0, \theta_1) 的最小值。

4.1 算法思想

梯度下降基本思想:開始時隨機選擇一個參數的組合 (θ0,θ1,......,θn)\left( {\theta_{0}},{\theta_{1}},......,{\theta_{n}} \right),計算代價函數,然後尋找下一個能讓代價函數值下降最多的參數組合,持續這麼迭代直到求出一個局部最小值(local minimum)。

但是因爲沒有嘗試完所有的參數組合,所以不能確定得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值(下圖中的 2 個谷底就是不同的局部最小值)。

可以拿下山的例子來形象地理解梯度下降:想象一下你正站立在山頂的某一點上,我們要做的就是原地旋轉 360 度,看看我們的周圍,並問自己如果要在某個方向上用小碎步儘快下山,那麼這些小碎步需要朝什麼方向?如果我們發現最佳的下山方向,就邁出一步,然後再看看周圍,想想我應該從什麼方向下山?依此類推,直到你接近局部最低點的位置。

你也可以把這個算法記成梯度下山算法,幫助你更好的理解算法的執行邏輯,但還是要記住原名。

4.2 算法數學理解

在實際算法中,常用批量梯度下降算法(Batch Gradient Descent)來同時更新多個參數 θi\theta_i

解釋下這個更新公式:

  • θj\theta_j 是待更新的參數 (θ0\theta_0θ1\theta_1
  • α\alpha 是學習率(learning rate),決定了代價函數在下降方向每次更新的步長(其實就是每次下山的小碎步)
  • αθjJ(θ0,θ1)\alpha \frac{\partial }{\partial {{\theta_j}}}J(\theta_0,\theta_1) 是代價函數對(θ0\theta_0θ1\theta_1)的偏導數
  • 因爲是求偏導,所以(θ0\theta_0θ1\theta_1)必須同步更新

可以用一句話總結這個公式:在批量梯度下降中,每一次同時讓所有參數減去學習率 alphaalpha 乘以代價函數的偏導數。

4.3 算法的直觀理解

下面用實際的預測房價的代價函數曲線來直觀理解梯度下降尋找最優解的執行過程:θj:=θjαθjJ(θ){\theta_{j}}:={\theta_{j}}-\alpha \frac{\partial }{\partial {\theta_{j}}}J\left(\theta \right)

爲了方便理解,上面的代價函數假設 θ0\theta_0 = 0,紅色的直線線表示 θ1\theta_1 點的切線,切線斜率即右端的紅框中的對 θ1\theta_1 的偏導數,且切線的斜率大於 0,所以一次更新過程爲:新的 θ1\theta_1 = 舊的 θ1\theta_1 - α\alpha * 正數。

影響梯度下降算法的一個重要變量是 α\alpha,它對更新會產生如下作用:

  • 如果 α\alpha 太小,每次更新的步長很小,導致要很多步才能才能到達最優點;
  • 如果 α\alpha 太大,每次更新步長很大,在快接近最優點時,容易應爲步長過大錯過最優點,最終導致算法無法收斂,甚至發散;

雖然 α\alpha 會對更新步長產生影響,但是實際設計算法時,並不需要對 α\alpha 進行特殊處理,爲什麼呢?來看下面這個例子:

我們知道一點的切線越陡則斜率(α\alpha)越大,越緩則斜率(α\alpha)越小(這裏只強調斜率大於 0,斜率小於 0 完全類似,只不過變了符號而已),在上圖中隨着算法不斷迭代,更新的數據點越來越接近曲線底部,相對應的切線也越來越緩,即學習率 α\alpha 會自動變小,隨着學習率變小,那麼下一步更新的步長也就隨之變小,因爲下一步更新的步長使用的 α\alpha 在上一步中已經自動變小了,所以直到下降到最低點(該點導數爲 0)時:新的 θ1\theta_1 = 舊的 θ1\theta_1 - α\alpha * 0 = 舊的 θ\theta,此時不再進行迭代,算法找到最優解!

可以看出,梯度下降算法在執行過程中會自動更新 α\alpha,所以沒必須另外再減小 α\alpha,這點一定要注意了!那麼既然學習了梯度下降算法,下面來看看如何用它來找到預測房價的代價函數最優解!

五、梯度下降的線性迴歸

我們用梯度下降算法來求平方誤差代價函數的最小值,以此來擬合房價預測的函數直線,兩個部分的公式如下:

當你理解了梯度下降算法的公式後,便可以看出求解的關鍵點就在於求出代價函數關於參數 θi\theta_i 的偏導數,求偏導是高數中很基礎的方法,這裏就不介紹了,直接看下求出的 2 個偏導數:

當我們在程序中求出了所有參數的偏導數後,接着就可以按照算法的邏輯來同步更新參數 θi\theta_i,再一步步迭代下去直到找到最優解。

要注意一點,因爲這裏代價函數求出的偏導,在計算時需要使用到所有的訓練集,因爲它含有求和公式,需要累加所有訓練數據的誤差,所以這裏的梯度下降算法也稱爲批量梯度下降,其中批量的意思就是每次梯度下降時都會用到所有的訓練樣本。

實際上也有其他不是批量型的梯度下降法,每次迭代值關注訓練集中的一個子集,以後我學到了再跟你分享吧,記得持續關注我哈哈哈哈。

本文原創首發於 同名微信公號「登龍」,微信搜索關注回覆「1024」你懂的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章