1. 程式人生 > >機器學習(一)——單變數線性迴歸

機器學習(一)——單變數線性迴歸

關鍵詞:線性迴歸監督學習模型假設函式代價函式梯度遞降學習率訓練集

一.前言

前段時間在學習 Andrew Ng《機器學習課程》,個人認為這是一個非常適合新手學習機器學習的課程(即使你對線性代數,微積分、概率論等已經忘得差不多了)。這裡對學習課程做一些筆記和經驗總結,方便自己後面做回顧複習,也希望對新手學習機器學習有些幫助。

機器學習的第一個演算法就是 線性迴歸演算法 , 這也是 監督學習 (Supervised Learning) 中學習的第一個演算法,非常適合作為新手學習機器學習的入門例子,從中可以瞭解監督學習過程完整的流程,建立機器學習的基本概念。

二.模型表示

線性迴歸中最常見的例子就是預測房屋價格:
WechatIMG40.jpeg

  • 監督學習
    在房屋價格預測的例子中,提供了一個資料集或者訓練集(Training Set) , 對於每個資料樣本都給出了一個對應的“正確答案”(即每個房屋的Size都對應一個Price), 因此被稱作監督學習,與無監督學習對應。

  • 迴歸問題
    它也是一個迴歸問題,因為針對每個輸入的房屋Size,我們都可以預測出一個房屋的Price,而房屋的Price是一個在實數範圍內變化的值,即輸出值為連續變化不可列舉的值。(還有一種最常見的監督學習方式,叫做分類問題,即每個輸出的預測值為離散可列舉的輸出值)

  • 單變數線性迴歸
    線性迴歸的直觀理解是輸入自變數

    和輸出因變數存在近似的線性關係,若只有一個自變數和因變數,且二者的關係可用一條直線近似表示,則這種迴歸可以稱為單變數線性迴歸;若有兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則這種迴歸稱為多變數線性迴歸

2.1 變數定義

假使我們迴歸問題的訓練集(Training Set)如下表所示:
WechatIMG41.jpeg
在機器學習中,我們通常用以下字母來標記各個變數:
- m 代表訓練集中例項的數量(樣本個數)
- x 代表特徵/輸入變數
- y 代表目標變數/輸出變數
- (x,y) 代表訓練集中的例項
- (x(i),y(i) ) 代表第 i 個觀察例項
- h 代表學習演算法的解決方案或函式也稱為假設函式(hypothesis)

2.2 演算法原理

WechatIMG43.jpeg

上圖為一個監督學習演算法的工作方式,豎向的流程是演算法學習和訓練的過程,即給出一個訓練集,將它“喂”給學習演算法,最終訓練得到一個模型的輸出;橫向的流程為演算法預測的過程,給出房屋的Size,經過上一步訓練得到的模型,輸出房屋Price的預測值。

2.3 模型定義

在單變數線性迴歸中,我們將模型定義為:WechatIMG44.jpeg
其中WechatIMG45.jpeg也稱作假設函式, WechatIMG46.jpeg稱為模型引數, 在演算法訓練過程中,我們期望得到最優的 WechatIMG46.jpeg的值使得模型最為匹配訓練集的資料:
WechatIMG47.jpeg

2.3.1 代價函式

在確定模型之後,我們需要做的是選擇合適的引數 WechatIMG46.jpeg,使得模型所預測的值與訓練集中的實際值之間(下圖中藍色線所指)的差距(誤差)最小。
WechatIMG48.jpeg

對於每個樣本,都有一個損失值(loss), 線上性迴歸中損失函式(Loss Function),也叫誤差函式(Error Function)定義為:
WechatIMG49.jpeg

一般我們用預測值h(x)實際值y的平方差或者它們平方差的一半來定義損失函式, 用來衡量預測輸出值和實際值有多接近。

而將所有樣本的損失值作求和,我們便得到一個代價函式(Cost Function):
WechatIMG50.jpeg

我們的優化目標就是選擇出合適的模型引數 WechatIMG46.jpeg,使得代價函式取得最小值。

注意:在不同的模型中,損失函式代價函式可能都是不同的,如分類問題的損失函式就與線性迴歸的損失函式代價函式都不同,在後續的文章中將介紹其他代價函式。

2.3.2 代價函式的直觀理解

  • WechatIMG52.jpeg函式畫在一張三維的圖上,可以看到它是一個凸面
    WechatIMG51.jpeg

  • 若將WechatIMG52.jpeg函式中WechatIMG53.jpeg固定為0,則圖形有三維的變為二維的拋物線
    WechatIMG54.jpeg

三. 演算法訓練

在2.3.2小節中,我們通過畫圖可以大致地觀察到代價函式J(θ0,θ1)在何處取到最小值,當然這種作圖的方法給人一種直觀的理解,但不能讓計算機可以自動地求解出代價函式J(θ0,θ1)的最小值。因此需要一種有效的演算法可以求解代價函式J(θ0,θ1)的最小值。

其中在計算機中,梯度下降演算法是一個用來求函式最小值常用的演算法, 下面我們將使用梯度下降演算法來求出代價函式 J(θ0,θ1) 的最小值。

3.1 梯度下降演算法(Gradient Descent)

梯度下降背後的思想是: 開始時我們隨機選擇一個引數的組合(θ0,θ1,...,θn),計算代價函式,然後我們尋找下一個能讓代價函式值下降最多的引數組合。我們持續這麼做直到到到 一個區域性最小值(local minimum),因為我們並沒有嘗試完所有的引數組合,所以不能確定 我們得到的區域性最小值是否便是全域性最小值(global minimum),選擇不同的初始引數組合, 可能會找到不同的區域性最小值。

3.1.1 直觀理解

WechatIMG55.jpeg

想象你正站在山上的一點,想要以最快的速度下山,你會怎麼做?在梯度下降演算法的思想中,我們要做的是站在那個點觀察周圍360°的方向,選出當前最佳(最陡,即可以理解為梯度的方向)的方向向前一小步,然後繼續重複觀察選出最佳的方向往下走,以此類推,直到逼近一個區域性的最低點的位置。

3.1.2 演算法過程

WechatIMG56.jpeg

梯度下降演算法的過程十分簡單,即不斷地更新 WechatIMG46.jpeg引數,使得代價函式J(θ0,θ1)收斂到一個值。

下面說幾個注意點:
- α 學習率(learning rate)
α 學習率 決定了沿著能讓代價函式下降程度最大的方向向下邁出的步子有多大,它會影響演算法收斂速度的快慢,因此選擇合適的學習率很重要,在第四節中會詳細闡述如何選擇合適的學習率

  • 梯度(Gradient)
    等式右邊的偏導數WechatIMG59.jpeg即為該點WechatIMG60.jpeg 處的梯度值,後面會介紹如何計算該點處的偏導數。

  • 同步更新(Simultaneous update)
    梯度下降演算法中,在更新θ0,θ1時需要同步更新兩者,同步更新是一種更加自然的實現方法,在向量化(Vectorization)實現中更加容易,人們常說的梯度下降指的也是同步更新。

3.1.3 演算法實現

前面我們已經得到了梯度下降演算法的流程和線性迴歸的模型,如下:
WechatIMG61.jpeg
那麼如何求WechatIMG59.jpeg的值呢?

公式推導過程:
WechatIMG62.jpeg

代入後得到最後的公式:

WechatIMG64.jpeg

注意: 在多變數線性迴歸和分類問題中,梯度遞降演算法的公式都與上述公式極為相似。

四. 優化與總結

4.1 如何選擇合適的學習率α

首先我們來看下α太小或太大會出現什麼情況:
WechatIMG65.jpeg
我們將θ0固定為0,則J(θ1)的影象為二次拋物線
可以看到當α太小時,每次更新θ1的變化都十分小,即迭代速度十分緩慢;當α太大時,那麼梯度下降演算法可能會越過最低點,甚至無法收斂,每次迭代都會移動一大步,越來越遠離最低點。

最佳實踐:
在開始時我們不確定最合適的α值是多少,一般我們會選取等比的一系列α值做嘗試,如0.001,0.003,0.01,0.03,0.1,0.3,1,… 每次嘗試間隔大約是3倍左右。
最終比較不同學習率下,演算法的收斂速度,選取合適的學習率。

4.2 如何選取迭代次數

我們可以將每次迭代後J(θ)的值記錄下來,並畫出迭代次數與代價函式J(θ)的圖,當一次迭代後J(θ)的減小量小於ε值時,終止迭代。
WechatIMG68.jpeg

五. 後言

  1. 在本文描述的梯度遞降演算法為批量梯度遞降演算法(Batch Gradient Descent),此外還有微型批量遞降演算法(Mini-Batch Gradient Descent)與隨機梯度遞降演算法(Stochastic Gradient Descent), 後兩者在處理大資料的樣本時用的比較多。
  2. 在下一節中,我們將繼續學習多變數線性迴歸問題,並學習如何用向量化來實現演算法。