天天看點

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

回歸定義

Regression 就是找到一個函數 function ,通過輸入特征 x,輸出一個數值 Scalar。

應用舉例

  • 股市預測(Stock market forecast)
    • 輸入:過去10年股票的變動、新聞咨詢、公司并購咨詢等
    • 輸出:預測股市明天的平均值
  • 自動駕駛(Self-driving Car)
    • 輸入:無人車上的各個sensor的資料,例如路況、測出的車距等
    • 輸出:方向盤的角度
  • 商品推薦(Recommendation)
    • 輸入:商品A的特性,商品B的特性
    • 輸出:購買商品B的可能性
  • Pokemon精靈攻擊力預測(Combat Power of a pokemon):
    • 輸入:進化前的CP值、物種(Bulbasaur)、血量(HP)、重量(Weight)、高度(Height)
    • 輸出:進化後的CP值

模型步驟

  • step1:模型假設,選擇模型架構(線性模型)
  • step2:模型評估,如何判斷衆多模型的好壞(損失函數)
  • step3:模型優化,如何篩選最優的模型(梯度下降)

二、利用回歸進行預測

預測寶可夢的CP值

2.1 背景

  • “CP值”是一隻寶可夢的戰鬥力。你抓到一隻寶可夢“妙蛙種子”,給它吃一些糖果以後,它就會進化成“妙蛙草”,此時CP值就變了。
  • 如果能預測一隻寶可夢在進化後的CP值,你就可以評估是否需要進化,以充分利用糖果的資源,來進化更多更強的寶可夢。

操作:找一個function,輸入為一隻寶可夢x 的各種屬性值,輸出為進化後的CP值y ,如圖所示。

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

一隻寶可夢記作 x ,其屬性值如下:

标記 解釋
x c p x_{cp}xcp​ 進化前的CP值(14)
x s x_sxs​ 物種(妙蛙種子)
x h p x_{hp}xhp​ 生命值(10)
x w x_wxw​ 重量(11.62kg)
x h x_hxh​ 身高(0.88m)

2.2 如何解決這個問題呢?

上一節我們知道有三個步驟:

  1. 模組化:選一個模型(function set)
  2. 評估:評價模型中function的好壞
  3. 擇優:找一個最好的function

詳細步驟

2.2.1 找模型(使用一次函數)

先找一個簡單的 一次函數:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

即進化後的CP值y等于某一個常數項b,加上某一個數值w乘以輸入的寶可夢x在進化前的CP值。

w和b是參數,為任意值,取不同的數值就得到不同的function

如下圖所示:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

f3​ 顯然不太可能是正确的,因為進化後CP值變負數了。 這就需要訓練集來告訴我們哪些function才是合理的function。

  • 将無窮多個w i ∗ x ii​相加之和再加上b,就得到了一個 線性模型
  • x i 中抽取出來的各種屬性值稱作 “特征”(feature),當做function的輸入
  • w i 為權重(weight),b \ 為偏置(bias)

2.2.2 評價映射的好壞

1. 收集訓練集

先收集訓練集,才能找這個function。這是一個監督學習的模型,需要手動給出輸入和輸出,本例中,它們都是數值。

舉例來說,

傑尼龜

 能進化成 

卡咪龜

,用x 1 x^1x1表示傑尼龜的各種特征,用^y 1 y^1y1表示進化後的CP值979:x 1 → y 1 x^1→y^1x1→y1。其中這個979是我們實際觀察到的正确數值。

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

繼續上述操作,收集更多的x i → y i x^i→y^ixi→yi。首先我們通過少量資料來進行訓練,這裡收集了10隻寶可夢進化後的CP值,将輸入作為橫軸,輸出作為y軸,标記在圖像上:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

2. 定義映射的好壞

定義另一個函數,用以評價Model中function的糟糕程度——損失函數 L LL(Loss function):

  • 輸入:一個function
  • 輸出:糟糕程度
  • 定義:L ( f ) = L ( w , b ) L(f) = L(w, b)L(f)=L(w,b),此處使用 最小二乘法
f由w和b決定,是以損失函數實際上是用來衡量一組參數的好壞

用真正的數值減去預測的數值再取平方,就是估測的誤差。再将它們相加取和就得到損失函數:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

損失函數值越大,即誤差越大,function效果越差。

2.2.3 找出最好的映射

根據損失函數的定義可得:找到 使損失函數值最小 的function即為最好的function。可窮舉w和b,代入使得損失函數最小,但這個非常消耗時間

,顯然不可接受。是以就需要一種方法來較快地尋找 —— 梯度下降法(Gradient Descent)。

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

梯度下降法

在高等數學中我們學過,梯度就是可微函數 f 在各個方向上求偏導數的向量( f x ′ , f y ′ , f z ′ , . . . ) (f'_x, f'_y, f'_z, ...)(fx′​,fy′​,fz′​,...),表示某一函數在該點處的方向導數沿着該方向取得最大值。

前提:函數 L ( w ) L(w)L(w) 可微分。

做法:

  • 随機選取一個初始點 w 0 w^0w0
  • 做 L LL 對 w ww 在 w 0 w_0w0​ 處的微分,即切線的斜率
    • 斜率為負↘,則增大w:w ww 右移 → L ( w ) L(w)L(w) 減小
    • 斜率為正↗,則減小w:w ww 左移 → L ( w ) L(w)L(w) 減小
      《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

那麼問題來了,參數值如何增加呢,該增加多少呢?

w向右走的步伐大小取決于兩個條件:

  1. 現在的微分值大小:微分值越大,越陡峭,步伐越大;反之越小。
  2. 學習率(Learning rate)η:事先定好的數值,η越大,步伐越大,參數更新的幅度越大,學習的效率更快;反之越小。
    《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
注意是減号,微分正,減小w。
  • 重複上述步驟的疊代,直到w移動到 局部最小值。
《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

梯度下降法不能找到全局最小值,但是在 線性回歸問題 中并沒有局部最小,因為線性回歸模型的損失函數是 凸函數(convex),局部極值必為全局極值。

【若函數可二階導(或二階可偏導),則可利用二階導數(或偏導數)大于零證明】

以上是一個參數的問題,現在由一個參數推廣到兩個參數:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

類似地,将b利用w的方法,分别計算出L對w和b的偏導數,反複疊代,求出最小的損失函數。

梯度下降法參數調整在等高線中展示效果如下:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

2.3 測試訓練結果

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

可以看到曲線拟合得并不完美,在某些點處有很大的誤差,或許拟合曲線并不是一條直線。那麼我們還能做的更好嗎?當然,可以考慮換個更複雜的模型。

2.3.1 換模型(二次函數)

y = b + w 1 ∗ x c p + w 2 ∗ ( x c p ) 2 y=b + w_1*x_{cp}+w_2*(x_{cp})^2y=b+w1​∗xcp​+w2​∗(xcp​)2

可以用上述方法找到一個最好的 function:

  • b = − 10.3 b = -10.3b=−10.3
  • w 1 = 1.0 , w 2 = 2.7 × 1 0 − 3 w_1=1.0, w_2=2.7×10^{-3}w1​=1.0,w2​=2.7×10−3

在訓練集上的圖像如下:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

看起來更加合理了,且平均誤差為15.4。那麼在測試集上表現如何呢:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

平均誤差為18.4!有沒有可能做得更好呢?

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

上圖分别為三次、四次、五次函數。可以發現,到五次函數的時候已經将訓練集拟合得很好了,但是測試集上誤差反而更大!這種現象稱為 “過拟合”(Overfitting)。

2.3.2 過拟合

如何解釋這種現象呢?

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

如上圖所示,次數越高的函數,它的解空間包含了低次數函數的解空間。是以越複雜的模型,它包含越多的函數,理論上就可以找出一個函數使得訓練誤差越來越低,前提是梯度下降法能真正幫我們找到最好的函數,不能出現局部最優。

但是在測試集上的結果與訓練集的結果是不一樣的:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

在到第三個式子為止,測試集的誤差一直在降低;但是越往後走,誤差就暴增了!越複雜的模型并不一定得到越好的結果,這就是 過拟合。是以我們需要選擇一個合适的模型。

2.4 收集大量資料來訓練測試

現在我們收集60隻寶可夢,把原來和進化後的CP值作圖(如下圖所示),會發現右上角幾個點被某種“隐藏力量”影響了。這到底是什麼呢?答案就是物種。

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

隐藏因素

我們将不同的物種用不同的顔色表示

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

隻考慮進化前的CP值是遠遠不夠的,還要考慮物種對進化的影響,是以需要重新設計模型:不同的物種就代入不同的線性函數。

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
但是把 if 放在 function 裡面,這樣不就不是一個線性模型了嗎?後續還能對損失函數進行微分、用梯度下降法嗎?

可以把上述式子改寫成 一個 線性函數:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

通過控制δ函數的值,來控制函數的結構,具體如下:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
那麼對于更換後的模型,它的結果怎麼樣呢?
《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

對于不同的物種,線的顔色不一樣。當分不同的種類來考慮時,所預測的誤差比原來的模型誤差更小。

但這裡還是有不能拟合得很好的點,還有其他可能的因素影響着模型預測結果。
《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測

可以把所有因素加入模型,看看結果如何:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
可以看到又是過拟合了。怎麼辦呢?使用 正則化 (Regularization)

我們重新定義損失函數,加入一些輔助的額外項λ,讓我們找到比較好的function。其中,λ項越趨于0越好:

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
這裡不需要考慮 bais 這一項。因為我們要找一個平滑的function,調整b的大小隻是将函數圖像上下移動而已,和平滑程度并無關系。

當我們加上λ項時,就說這個function是比較 平滑的(smooth) ——當輸入有變化時,輸出對輸入的變化是比較 不敏感 的。

假設模型為一次函數模型,在某一個 x i x_ixi​ 加上一個 Δ x i \Delta x_iΔxi​,即:

y = b + Σ w i x i + Δ x i y = b + {\Sigma}w_ix_i + \Delta x_iy=b+Σwi​xi​+Δxi​

這個時候輸出的變化:

y → y + w i Δ x i y→y+w_i \Delta x_iy→y+wi​Δxi​

當w i w_iwi​越接近0,輸出的變化就越小,也即輸出對輸入的變化不敏感。

為什麼我們喜歡比較平滑的 function ?
  • 假設我們的輸入在測試的時候被噪聲幹擾了,那麼一個比較平滑的function就能受到比較小的影響,進而給出一個好的結果。

實驗結果

《深度學習》李宏毅 -- task2 回歸二、利用回歸進行預測
  • λ值越大,代表考慮平滑項的影響力越大,找到的function就越平滑。
  • 當λ值越大時,在測試集上的誤差就越大,因為這時就越傾向于考慮 w ww 的數值,而減小考慮訓練的誤差。
  • 有趣的是,在訓練集上得到的誤差越大,在測試集上得到的誤差是可能比較小的。我們喜歡平滑的function,但不喜歡太平滑的function。
如何找出function有多平滑呢?
  • 這就需要我們調λ的值來決定平滑程度
  • 如上圖,選擇λ = 100,在測試集上的誤差最小。

總結

  • 寶可夢進化前的CP值和進化後的CP值,以及它是哪個物種是非常有關系的,也可能會有其他的因素
  • 梯度下降法的原理和技巧
  • 過拟合和正則化
  • 我們最後得到測試集的平均誤差結果是11.1。但是如果用于其他的資料集來預測,得到的誤差會是怎樣的?

繼續閱讀