--- tags: 【學習ML】 title: 【學習ML - 1】- 回歸-案例研究 --- # 【學習ML - 1】 - 回歸-案例研究 > 這系列文章是為了自己所學的東西特別寫下來的 本人是新手還請見諒 > > 使用 台大台大電機系李宏毅老師 所教的人工智慧所有內容 的課程筆記 {%youtube fegAeph9UaA %} ## Regression (回歸) 可以透過 Regression 來預測 * 股票道瓊指數 * 自動駕駛無人車 * 推薦系統,例:Youtube推薦影片、Amazon推薦商品 * 寶可夢的Combat Power(CP值) ### 如何解寶可夢的Combat Power(CP值) ### Step1:Model(模型) + y=b+w*$x_{cp}$ 是一種Linear model(線性模型) #### Linear model(線性模型) 如果可以把一個Function(函式)寫成 y=b+$\sum_(w_ix_i)$ 那他就是一個Linear model(線性模型) - $X_i$指的是input各種的屬性X 例:寶可夢的身高、體重... 這也叫做 feature(特徵) - $W_i$是指 weight(體重) - $b$是指 bias(偏差) 不過我們還是要先找到 **Training Data(訓練資料)** 才可以找到我們要的Function(函式) ### Step2:Goodness of Function(功能優度) #### Training Data (訓練資料) 因為我們是用 **Supervised Learning(監督式學習)** 所以蒐集的資料要有 - function input - function output 而我們是使用 **Regression(回歸)** 所以在Output上是需要 **Scalar(純量-數值)** 的資料 --- 例: 以水箭龜升級成卡咪龜為例 ![](https://i.imgur.com/oYw5Ti3.png) - 我們以水箭龜(左圖)用$X^1$表示Input的第一筆資料 - 而卡咪龜(右圖)的Combat Power(CP值)當作Function Output ![](https://i.imgur.com/yytm9Bg.png) - 所以Function Input $X^1$ 那他就需要對應 Function Output $\hat{Y^1}$ 而第二筆可能是雷精靈 ![](https://i.imgur.com/NldvNsY.png) - Input 為$X^2$ Output為$\hat{Y^2}$ #### 以Hat來表示是實際的數值$\hat{Y}\hat{X}$,並以此類推到($x^{10},\hat{y}^{10}$) 註: Hat是在說英文上的^ --- 並將他們的information(訊息)以散佈圖顯示 ![](https://i.imgur.com/yxn5YtH.png) - X軸是進化 前 的Combat Power(CP值) - Y軸是進化 後 的Combat Power(CP值) - 透過用($X_{cp}^n , \hat{y}^n$)表示 $X_{cp}^n$第N隻寶可夢的CP值 和 $\hat{y}^n$進化後的CP值 來代表某一個筆資料 那我們就有 Training Data(訓練資料),我們要用這些資料來定義Function(函式)的好壞 --- #### Loss Function L(損失函數L) 因為要定義我們的Function(函式)的好壞,所以我們將要再定義一個Loss Function(損失函數)。 - Loss Function Input:是一個 Function - Loss Function Output:數值 (代表我們的Function(函式)的好壞) 那怎麼知道自己Function(函式)的好壞呢? - L(f)=L(w,b) = $\sum_{n=1}^{10}(\hat{y}^n-(b+w*x^n_{cp}))^2$ - 註:可以依照自己覺得合理的Loss Function(損失函數)來定,影片中老師用常見的做法去做 這裡在觀看影片的時候也嚇一跳,突然跑出這些東西,但仔細分解、解釋就還好了 #### L(f)=L(w,b) 是透過 y=b+w*$x_{cp}$的b,w來決定的,所以我們可以知道一個Loss Function(損失函數) 是在衡量b,w的好壞 #### $(b+w*x^n_{cp})$ w乘上第N隻寶可夢的CP值然後再加上b,會得到**預測的y** - 因為將這段帶入到y=b+w*$x_{cp}$ 所以得出來是預測y #### $\hat{y}^n$ 因為前面有提到$\hat{y}^n$是代表某項真實的數值,所以用 真實的數值y 減去 預測的數值y 再平方($\hat{y}^n$ - $y^n)^2$ 就可以得到 估測的誤差值 - 筆者認為平方的意思應該是擔心有 **負號數值出現** , 如果不平方全部算好之後加起來會變成0這樣就無法知道意義 #### $\sum_{n=1}^{10}$ 是將所有資料都帶入算過一遍再加起來,就會得到Loss Function(損失函數) - 如果估測誤差值越大,代表這個Function越不好 #### 尋找合適的(b,w) ![](https://i.imgur.com/qePtHml.png) 透過畫圖的方式來找出較好的(b,w),這個圖上每個點都是一個Loss function(損失函數) - 顏色越紅=數值越大代表Function(函式)越不好 - 顏色越藍=數值越小代表Function(函式)越好 --- ### Step3:Best Function / Gradient Descent(梯度下降法) #### Pick the Best Function(提取最好的函式) - f* = arg $\binom{min}{f}$L(f) 也等於 w*,b* = arg $\binom{min}{w,b}$L(w,b) 更等於 arg $\binom{min}{w,b}$$\sum_{n=1}^{10}(\hat{y}^n-(b+w*x^n_{cp}))^2$ 這些都是用**窮舉的方式**找出最小的w,b - 註:arg為Argument(變數) 所以老師使用Gradient Descent(梯度下降法)來找出最小值 - 註:同時也說用Linear Algebra(線性代數)也可以找到 #### 假設一個簡單可微分的L(w) --- #### Gradient Descent(梯度下降法) - 一個參數 - 隨機選取初始的w值 - $-\eta\frac{dL}{dw}|$w=$w^0$算出w值 - 如果w值是 **負** 的就應該 **增加w值** **往右移動**,w值是 **正** 的就應該 **減少w值** **往左移動** - 註: $\frac{dL}{dw}$d是微分 分解$-\eta\frac{dL}{dw}|$w=$w^0$ #### $\frac{dL}{dw}$微分值 **移動的距離** 取決於 $\frac{dL}{dw}$ 微分值, 如果微分值越 **大** 代表它在越 **陡峭** 的地方所以它移動的距離就越 **大** 如果微分值越 **小** 代表它在越 **平緩** 的地方所以它移動的距離就越 **小** #### $-\eta$常數項-Learning Rate(學習率) 以及取決於$-\eta$常數項-Learning Rate(學習率),是事先訂好的數值 數值越 **大** 更新幅度就越 **大**,更新的越快 數值越 **小** 更新幅度就越 **小**,更新的越慢 - 注意!筆者認為Learning Rate越大不代表越好 #### $w^1$ <- $w^0-\eta*\frac{dL}{dw}|$w=$w^0$ 在把之前訂好的$w^0$去減掉$\eta*\frac{dL}{dw}|$w=$w^0$,所以變成$w^0-\eta*\frac{dL}{dw}|$w=$w^0$算出來後我們會得到 $w^1$。 之後就重複剛剛的算式 -> $w^1-\eta*\frac{dL}{dw}|$w=$w^0$ ... $w^T-\eta*\frac{dL}{dw}|$w=$w^0$ = 更新T次後微分到後面會是0,所以會到$w^T$, 這叫做Local Optimal(局部最佳),但不是 Global optimal(全局最佳) 這是只有一個參數的情況。 --- #### Gradient Descent(梯度下降法) - 兩個參數 - 隨機選取兩個初始值($w^0,b^0$) 1.$-\eta\frac{\partial L}{\partial w}|$w=$w^0$,$b=b^0$算出w值 2.$-\eta\frac{\partial L}{\partial b}|$b=$b^0$,$w=w^0$算出b值 - 將兩個初始值直接都算一次 - $\partial$ 是偏微分 - 然後再把這兩個算出的值個別減掉$\eta*\frac{\partial L}{\partial w}|$w=$w^0,b=b^0$以及$\eta*\frac{\partial L}{\partial b}|$b=$b^0,$w=$w^0$變成 1.w值方面$w^1 <- w^0 - \eta*\frac{\partial L}{\partial w}|$w=$w^0,b=b^0$ 2.b值方面$b^1 <- b^0 - \eta*\frac{\partial L}{\partial b}|$b=$b^0,$w=$w^0$ - 後面就重複剛剛的算式 1.w值方面$w^2 <- w^1 - \eta*\frac{\partial L}{\partial w}|$w=$w^0,b=b^0$ ... $w^T <- w^T - \eta*\frac{\partial L}{\partial w}|$w=$w^0,b=b^0$ 2.b值方面$b^2 <- b^1 - \eta*\frac{\partial L}{\partial b}|$b=$b^0,$w=$w^0$ ... $b^T <- b^T - \eta*\frac{\partial L}{\partial b}|$b=$b^0,$w=$w^0$ #### 窮舉 如果透過比較暴力的方式-**窮舉** ![](https://i.imgur.com/OCqeOch.png) 從 **負無限大** 到 **無限大** 所有數值都試一遍也可以找到,但這樣很沒有效率 所以使用 **Gradient Descent(梯度下降法)** 來尋找。 小結: Gradient Descent(梯度下降法)可以讓我們可以用更快的方式找到最佳點,但如果今天Loss function(損失函數)不是很完整就會出現找到的低點/最佳點,可能不是最低的這是一個大問題。 ### Regression Worry(回歸問題) ![](https://i.imgur.com/THkY3e1.png) 如圖所示, 如果今天Loss Function(損失函數)是長這個樣子,可能我們找到的點位就不是最低/最佳點。 但我們可以使用Linear Regression(線性回歸)來找到最低/最佳點 --- ## Linear Regression(線性回歸) - 沒有Local optimal(局部最低點),所以可以找到真實的最低點/最佳點 ### Linear Regression Formulation (線性回歸公式) 原本我們Regression Formulation(回歸公式)是長這樣L(w,b) = $\sum_{n=1}^{10}(\hat{y}^n-(b+w*x^n_{cp}))^2$ 只要將上面的式子進行偏微分 L(w,b) = $\sum_{n=1}^{10}(\hat{y}^n-(b+w*x^n_{cp}))^2$ w值: - $\frac{\partial L}{\partial w}$ =?$\sum_{n=1}^{10}2(\hat{y}^n-(b+w*x^n_{cp}))(-x^n_{cp})$ - 將平方$^2$移到左邊變成2,再將w*$x^n_{cp}$跟$\frac{\partial L}{\partial w}$做偏微分得到$(-x^n_{cp})$ b值: - $\frac{\partial L}{\partial b}$ =?$\sum_{n=1}^{10}2(\hat{y}^n-(b+w*x^n_{cp}))(-x^n_{cp})$ - 將平方$^2$移到左邊變成2,再將b跟$\frac{\partial L}{\partial b}$做偏微分得到-1 ![](https://i.imgur.com/bRxuEGL.png) 最後求得解為如上圖呈現,透過計算點與線之間的距離(垂直x軸)就可以計算出均方誤差,但是我們真正想關心的是未知的資料。 ![](https://i.imgur.com/S26vLJG.png) 另外準備了10隻寶可夢的資料Testing Data(測試資料)要來驗證模型的擬合是否完善,求得的解似乎比剛才的Training Data(測試資料)還要大一些。 正常 Training Data(訓練資料)的Average Error(平均誤差)應該是要大於 Testing Data(測試資料)的Average Error(平均誤差) 觀察模型可以發現,在cp兩極值的部份對預測值來說是較為不準的,這代表我們可能需要一個更複雜的Model。 --- #### 多次項模型 因為發現預測值不準確代表可能我們需要更複雜的模型。 y = b + $w_1$ * $x_{cp}$ + $w_2$ * ($x_{cp})^2$ <-二次項模型 與我們原本的y=b+w*$x_{cp}$多增加了$+w_2*(x_{cp})^2$ 之後再用跟剛剛一樣的方式找出Best Function(最佳函式) ![](https://i.imgur.com/UsRQIKQ.png) 更改成二次項發現到效果更好了,那再更複雜下去呢? 三次項 ![](https://i.imgur.com/kd1o7uH.png) 結果來說好了一點點,那再再更複雜呢? 四次項 ![](https://i.imgur.com/46ud9ck.png) 看起來更糟,但可能更複雜下去情況會變好 五次項 ![](https://i.imgur.com/T5RSQTW.png) 看來可以知道當二次項之後Training Data Average Error(訓練資料平均誤差)成績越小,但Testing Data Average Error(測試資料平均誤差)在三次項之後就越大。 如果Function越複雜,理論上可以讓Training Data Average Error(訓練資料平均誤差)越小。 可是考慮到Testing Data Average Error(測試資料平均誤差), 所以不一定越複雜的Function(函式)就越好。 小結: 如果在 **Training Data Average Error(訓練資料平均誤差)** 越小 而 **Testing Data Average Error(測試資料平均誤差)** 越大,這叫做Overfitting(過度彌合)。 #### 更多資料 ![](https://i.imgur.com/6KDvnYD.png) 將資料蒐集到60隻的時候,會發現有個東西影響進化的數值。 ![](https://i.imgur.com/FdEW0oD.png) 寶可夢為例,會發現到只考慮CP值是不太好的,還必須考慮到物種的影響。 所以我們必須依照他們不同的物種,來去制定不同的Function(函式),但也可以把他們寫成一個Function(函式)(如下圖)。 ![](https://i.imgur.com/P4f1onU.png) 這樣看起來很多,但其實很好算。 如果物種$x_s$=Pidgey那剛剛上面的Function(函式)就變成y=$b_1+w_1*x_{cp}$, ![](https://i.imgur.com/JNv82g7.png) 而其他的Function(函式)就變成0 ![](https://i.imgur.com/NGNyRVi.png) 而這整個Function(函式)就是Linear Model(線性模型) 那考慮到物種之後Average Error(平均誤差)有更好嗎? ![](https://i.imgur.com/CCrhhF0.png) 看到Training Data(訓練資料)跟Testing Data(測試資料) 都如我們一開始的數值都來的低,代表我們考慮到物種是有效的。 但這樣看還是有一些地方可以做得更好,可能缺了什麼 例如: ![](https://i.imgur.com/3gl10Mq.png) 這幾個都是可能影響CP值的問題(高度、體重、血量) ### back to step 1:redesign the model again (回到第一步:重新設計模型) ![](https://i.imgur.com/ecVlohU.png) 可以把我們想到的東西都塞到Function(函式)裡(如上圖),但發生了Overfitting(過度彌合) 所以我們換種方式 ### back to step 2:Regularization(回到第二步,正則化) 我們重新定義對Function(函式)的好壞 ![](https://i.imgur.com/B0Y0Zke.png) 原始的Loss Function(損失函數)只考慮誤差平方的加總,加入另一個Regularization(正則化)如下: - $L=\sum_n(\hat{y}^n-(b+\sum w_ix_i))^2 + \lambda\sum(w_i)^2$ - $\lambda$是一個常數 參數$w_i$接近0的function是較為平滑的,意思是當輸入有變化的時候,輸出對這變化是不敏感的,因為$w_i$是接近0的,乘上$w_i$的值也是小的,也因此當資料有雜訊的時候它的影響也會是小的。 ![](https://i.imgur.com/13rYxpb.png) 會發現到我們將$\lambda$常數調大之後,雖然Training Data Error變大,但我們未來的資料Testing Data Error卻變小了 這讓我們可以解決我們模型Overfitting的問題 ![](https://i.imgur.com/u7CeNOg.png) 但我們$\lambda$常數不能調太大會導致Function太平滑, 以結論來說$\lambda$常數100是效果最好的。 所以$\lambda$ - $\lambda$越大 - 考慮Smoother的Regularization那一項影響力越大 - Function越平滑,Training Data Error會越大 因為$\lambda$越大的時候,我們就越傾向於$w_i$的值而減少考慮Error所以得到的Training Data Error越大是合理,而Testing Data Error越小 但Function太平滑的話在Testing Data Error上會得到糟糕的結果。 所以我們希望我們Function多平滑呢? - 所以我們要調整我們的$\lambda$來找出我們的Best Function 正則化通常不考慮bias(偏差),調整Function的Smooth跟bias是沒有關係的(bias它只影響上下不影響左右)。 總結: - 我們可以知道了解到資料如果只考慮單一特徵會導致之後預測的東西不準確 - 簡單說明了Gradient Descent(梯度下降) - 了解到Overfitting以及Regularization如何解決Overfitting