iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
AI & Data

30天搞懂機器學習是否搞錯了什麼系列 第 5

【Day 5】機器學習基本功(三) --- Regression

如何找到一個函式(function)?(下)

步驟一:寫出一個帶有未知參數的函式

昨天舉的例子 https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20b%20%2B%20wx_1 是一個線性模型(linear model),隨著 https://chart.googleapis.com/chart?cht=tx&chl=x_1 越大,https://chart.googleapis.com/chart?cht=tx&chl=y 就越大,可以透過設定不同的 https://chart.googleapis.com/chart?cht=tx&chl=w 來改變斜率,或是設定不同的 https://chart.googleapis.com/chart?cht=tx&chl=b 來改變直線與 y 軸的交叉點,但它永遠會是一條直線。

然而實際情況可能會是紅色曲線這樣子,但不管怎麼設定 https://chart.googleapis.com/chart?cht=tx&chl=w%2C%20b 也沒辦法變成紅色那條曲線。由此可知線性模型會有很大的限制(Model Bias),因此如要產生紅色曲線我們就需要更複雜的模型。

紅色曲線可以看成是一個常數加上很多個藍色的函式,從下圖中可以看到紅色的曲線可以由 0(常數項), 1, 2, 3 這四個函數所組成。而這個紅色曲線是由很多線段所組成的,我們稱之為分段線性曲線(Piecewise Linear Curves)

那剛剛提到的藍色曲線要如何表示呢?
我們可以使用 S型函數(Sigmoid function) 去逼近它,其式子寫成 https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20c%20%5Cfrac%201%20%7B1%2Be%5E%7B-(b%2Bwx_1)%7D%7D%20%3D%20c%20%5Ctimes%20sigmoid(b%2Bwx_1),當 https://chart.googleapis.com/chart?cht=tx&chl=x_1 趨近於無窮大,https://chart.googleapis.com/chart?cht=tx&chl=e%5E%7B-%20%5Cinfty%7D%20%3D%200https://chart.googleapis.com/chart?cht=tx&chl=y 就會收斂在 https://chart.googleapis.com/chart?cht=tx&chl=c ,而當 https://chart.googleapis.com/chart?cht=tx&chl=x_1 趨近於無窮小,分母會趨近於無窮大,即 https://chart.googleapis.com/chart?cht=tx&chl=y 會趨近於 0。這些藍色曲線我們稱之為 Hard Sigmoid。

調整 https://chart.googleapis.com/chart?cht=tx&chl=w 即會改變斜率,調整 https://chart.googleapis.com/chart?cht=tx&chl=b 就能將 Sigmoid funtion 左右移動,調整 https://chart.googleapis.com/chart?cht=tx&chl=c 則會改變高度。

藉由調整不同的參數來產生各種Sigmoid function,再透過這些Sigmoid function產生各種不同的 Piecewise linear function,最後甚至能夠逼近各種連續函數。

根據上述方法我們就可以將原本的 https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20b%20%2B%20wx_1 改成 https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20b%20%2B%20%5Cdisplaystyle%20%5Csum_i%20c_i%20%5Ctimes%20sigmoid(b_i%20%2B%20w_ix_i)

我們將上述的數學式子透過圖形來表示,每個圖形都代表著一矩陣或是數值,而我們將這些未知的參數拉直,拼成一個很長的向量 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta,即為所有未知的參數。

步驟二:從訓練資料定義損失函數(Loss)

  • 損失函數:https://chart.googleapis.com/chart?cht=tx&chl=L(%5Ctheta)

計算Loss的方法跟昨天教的方法一樣,首先設定一組 https://chart.googleapis.com/chart?cht=tx&chl=b%2C%20%5Cbf%20c%5ET%2C%20https://chart.googleapis.com/chart?cht=tx&chl=%5Cbf%20b%2C%20W 的值,接著把feature https://chart.googleapis.com/chart?cht=tx&chl=%5Cbf%20x 代入,得出預測的 https://chart.googleapis.com/chart?cht=tx&chl=y,再去計算預測的值與真實的值的差距 https://chart.googleapis.com/chart?cht=tx&chl=e,最後加總誤差。

步驟三:解最佳化問題

  • 找一組能讓Loss最小的 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta%5E*

方法也跟昨天教的一樣,使用Gradient descent,首先隨機選一個初始數值 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta%5E0,接著去計算每一個參數對Loss的微分,會得到一個向量 https://chart.googleapis.com/chart?cht=tx&chl=g,即為Gradient,我們可以用 https://chart.googleapis.com/chart?cht=tx&chl=%5Cnabla 來表示,將式子寫成 https://chart.googleapis.com/chart?cht=tx&chl=g%20%3D%20%5Cnabla%20L(%5Ctheta%5E0),最後去重複更新所有的參數。

而實際上在做Gradient descent的時候,我們會將我們有的 https://chart.googleapis.com/chart?cht=tx&chl=N 筆資料隨意分成好幾個Batch https://chart.googleapis.com/chart?cht=tx&chl=B,並對其中一個Batch計算它的Loss https://chart.googleapis.com/chart?cht=tx&chl=L%5E1,並使用 https://chart.googleapis.com/chart?cht=tx&chl=L%5E1 來計算Gradient並更新參數,接著再取下一個Batch去計算Loss,以此類推。
每次更新一次參數,我們叫做一次Update,而將所有Batch看過一次,我們稱之為一次Epoch

Sigmoid -> ReLU

Hard sigmoid也可以看成是兩個 Rectified Linear Unit(ReLU) 的加總,其式子寫成 https://chart.googleapis.com/chart?cht=tx&chl=c%20%5Ctimes%20max(0%2C%20b%20%2B%20wx_1)

將原本Sigmoid換成ReLU,而這兩種function我們稱之為Activation function。


參考資料

李宏毅老師 - 機器學習2021


上一篇
【Day 4】機器學習基本功(二) --- Regression
下一篇
【Day 6】機器學習基本功(四)
系列文
30天搞懂機器學習是否搞錯了什麼30

尚未有邦友留言

立即登入留言