摘要:我們就有了組訓練數據我們將其進化前的值和進化后的值畫在一個二維坐標圖上橫軸為進化前的值,那每個藍色的點都代表一只寶可夢現在我們有了和,但是我們還需要一個函數來將它們連接起來,這個函數就是接下來要講的第三步中間藍色的塊就是誤差函數。
前言
如果遇到排版問題,請點擊 閱讀原文
這個課程是來自于 YouTube 上 NTU 李宏毅老師的視頻課程,老師的課講得非常有趣,通過引入 Pokémon 來生動的講解機器學習中一些技術的應用,只要你有一定的高數、線代以及概率基礎,看這個課程無壓力。
我在學習的同時將其搬運并做簡單的英文翻譯,并加上自己的理解與更通俗的解釋。加深自己印象的同時希望能對國內不能使用 YouTube 的讀者們提供一個方便。
回歸運算其實就是用一個函數去擬合當前給出的數據,如下圖:
圖中藍色點代表數據,我們假設這組數據是 Linear Regression 線性回歸的,那我們就需要用一條直線去擬合它們,也就是那條紅色的線。
Regression 的使用范圍也是很廣的:
股票預測:
$$ egin{eqnarray} f ( 以往多年股票的走勢情況 ) = 明天的點數 end{eqnarray} $$
當然真正的股市也不可能這么簡單,你能預測你就發了?
自動駕駛
$$ egin{eqnarray} f ( 傳感器得到的數據 ) = 方向盤與油門的控制 end{eqnarray} $$
推薦系統
像淘寶、京東等的購物網站,會推送一些商品給你,這些商品肯定要是你喜歡的或者需要的,你才可能去購買。一個好的推薦系統可能會讓這些網站的利潤成倍提高。
$$ egin{eqnarray} f ( 用戶 A,商品 B ) = 用戶 A 購買商品 B 的可能性 end{eqnarray} $$
如果這個可能性很大的話,購物網站就會更傾向于向用戶 A 推薦此商品
但今天,我們要做的是一件更加實際的事情。
用數據估測寶可夢的攻擊力(CP值)比如,下面是一只妙蛙種子,你給他吃一些糖果或者星辰,它就會進化成妙蛙草,進化以后,它的 CP 值就變了。
如果我們有能力預測它進化后 CP 值的變化的話,我們就能夠事先決定是否進化這只寶可夢。如果它 CP 值比較低的話,有可能你就把它拿去做糖果了? 就不進化它了,這就可以節省一些糖果用來進化更強的寶可夢。
那我們現在要做的就是,找到這么一個 function,我們輸入這只寶可夢的相關數據,他就能返回給我們,進化過后,可能的 CP 值是多少。
$$ egin{eqnarray} f ( 寶可夢的信息 ) = 進化后的 CP 值 end{eqnarray} $$
這里,我們用 $x$ 代表這只寶可夢,則:
$ x_{cp} $ 代表其進化前的 CP 值,為 14
$ x_s $ 代表它所屬的物種,為 妙蛙種子
$ x_{hp} $ 代表它進化前的生命值,為 10
$ x_w $ 代表它進化前的重量,為 11.62 kg
$ x_{hp} $ 代表它進化前的生命值,為 0.88 m
$y$ 則代表進化后的 CP 值
這里 $x$ 的下標表示:這些都是 $x$ 這個個體的某個屬性(比如 $小明\_{體重}$、$小明\_{身高}$)。
那我們怎么來解這個問題呢,我們知道,ML 其實就是尋找一個 Model(模型),將我們的數據代進去,經過復雜的運算后就能得到我們想要的結果。
所以我們首先需要找到這個 Model。
第一步:Model一個 Model 其實就是一個 Function set(一組方法)。那我們要尋找的這個 Model,它應該長什么樣子呢?
我們當然還是期望它能簡單點,所以呢,我們就假設它是這么一個方程組:
$$ y = b + w cdot x_{cp} $$
就是一個常數 $b$ 和一個數 $w$,它們組合起來,$x$ 與 $y$ 就構成一種線性關系。當然,我們現在的 $b$ 和 $w$ 都是不確定的,它可以是任何的數字,不過我們能從直覺上排除一些組合,比如 $w$ 和 $b$ 都為負數:
$$ f_1: y = -1 - 2 cdot x $$
這樣子 $y$ 就成了負數,我們知道,一個寶可夢的 CP 值是不可能為負數的,所以我們能夠直接排除這類組合。
前面提到,我們假設的這個方程是一個線性的函數,所以我們這個 Model 就是一個 Linear Model(線性模型):
$$ Linear Model: y = b + sum w_i x_i x_i:輸入 x 的某個屬性(如 CP) b:bias(誤差) w:weight(權重) $$
有了 Model 我們就需要考慮下一個問題:
第二步:Training Data我們需要訓練數據,因為 ML 就像人一樣,本來就是通過一定量的基礎練習,才能夠學到這類數據的共通點。像下面這個圖,左側是杰尼龜,右側則是杰尼龜進化后,變成的卡咪龜:
那現在,整個 Model 的 輸入就是這只杰尼龜,我們用 $x^1$ 來表示,那這只 卡咪龜 我們就用 $widehat{y}^1$ 來表示。這里 $x$ 和 $widehat{y}$ 的上標表示:這是一個完整的個體,1 只是它的編號(比如 $學生^1$ 、$學生^2$),至于 hat(就是 $widehat{y}$ 頭上的那個尖尖符號),它代表這是一個準確的值(因為這是真實的數據,為了和后面預測出來的數據 $y$ 做區分)。
只有一只肯定不夠呀,我們需要很多的數據,就要抓足夠多的寶可夢,比如這只 伊布,它進化過后就是 雷精靈:
那我們同樣就能夠得到$x^2$ 和 $widehat{y}^2$,就像這樣:
嗯,我們搜集了十只寶可夢?????????? ,數據可以從這里找到。
我們就有了 10 組 Training Data(訓練數據):
$$ (x^1,widehat{y}^1) (x^2,widehat{y}^2) vdots (x^{10},widehat{y}^10) $$
我們將其進化前的 CP 值和進化后的 CP 值畫在一個二維坐標圖上(橫軸為進化前的 CP 值),那每個藍色的點都代表一只寶可夢:
現在我們有了 Model 和 Training Data,但是我們還需要一個函數來將它們連接起來,這個函數就是接下來要講的:
第三步:Loss Function中間藍色的塊就是 Loss Function(誤差函數)。為什么需要這個函數呢,因為我們現在需要根據這 10 只已知寶可夢數據,代入 Model 推測出它們進化后的 CP 值,然后再與實際的 CP 值進行比較,來慢慢調整 Model 中的 weight 和 bias。所以,我們需要有一個函數來評判這次推測的誤差度,這就是 Loss Function:
$$ egin{cases} L(f) = L(w,b) = sum\_{n=1}^{10} (widehat{y}^n - y^n)^2 y^n = b + wcdot x\_{cp}^n end{cases} Downarrow L(f) = sum\_{n=1}^{10} (widehat{y}^n - (b + wcdot x\_{cp}^n))^2 $$
上面的方程其實就是將 $widehat{y}$ 準確值減去$y$估測值,然后將其平方,再將 10 只寶可夢都這樣計算并加起來。
我們要做的就是從我們的 Model 中挑選出一個 function $f$,它能夠讓 Loss Function $L(f)$ 的計算結果最小,這個 function 我們就將它命名為 $f^*$:
$$ f^* = arg min_f L(f) $$
或者從另一個角度考慮,我們的 function 其實就只由 weight $w$ 和 bias $b$ 來確定的,那上面的公式還可以寫成如下:
$$ w^*, b^* = arg min\_{w,b} L(w,b) $$
我們需要做的就是 窮舉所有的 ? 和 ?,直到找到最佳的那一對,讓 Loss Function $L$ 最小。
第四步:Gradient Descent上面說的窮舉真不是一個好辦法(基本沒法實現),那我們能不能找一個更好、更有效率的辦法解決這個問題呢?有!
用線性代數的辦法:求解非齊次線性方程組(由于這里的方程并不是同解,所以這個辦法還是會有些折騰)
用高等數學的辦法:L 可微分,求梯度即可
如下曲線,我們隨機選擇一個起點 $w^0$,然后在這個點上對 $L$ 求 $w$ 的微分 $frac{dL}{dw}|\_{w=w^0}$:
如果你還搞不太懂微分是啥,那就假想這個曲線是一個山坡,你站在 $w^0$ 上,向左邁一步($w$ 減小)或者向右邁一步 ($w$ 增大),然后看往哪邊走 $L$ 會變小就往那個方向走一步,得到一個新的位置 $w^1$,然后這樣不斷重復,就有機會走到最低點。
$$ w^1 gets w^0 - eta frac{dL}{dw}|\_{w=w^0} $$
那新問題出現了,我們步子該邁多大呢?Gradient Descent 中,這個步子的大小為:
$$ - {color{red}eta} frac{dL}{dw}|\_{w=w^0} $$
其中,$frac{dL}{dw}|\_{w=w^0}$ 為 $w^0$ 處的梯度,${color{red}eta}$ 是一個常數項,我們把它叫做 Learning Rate(學習速率),它是一個事先定好的數值,越大,每踏出一步的距離就越大,這意味著學習得就越快。負號則是因為,我們所求的梯度如果是負值說明我們往這個方向前進,$L$ 就會變小,我們就需要增大 $w$,所以,梯度的符號和我們前進的方向是相反的關系。
到了 $w^1$ 后重新計算梯度,很明顯這里的梯度比 $w^0$ 小了很多,所以邁的下一步也會隨之變小。經過很多次的調整行走后,我們終于走到了 $w^T$,在這個地方,微分趨近于 0,算法就認為這里是最好的點了(讓 $L$ 最小的點)。
但很明顯我們能看到,這只是一個 Local Minimum(局部最小),全局最小的點并不在這里,當然 Linear Model 不太會存在這種走到 Local Minimum 的情況,至于為什么,后面會給予說明。
我們總的過程用公式表達就是這樣的:
$$ 隨機選擇一個初始的 w^0 和 b^0 Downarrow 分別對 w^0 和 b^0 做微分并計算下一個點 w^1 和 b^1: egin{cases} w^1 gets w^0 - {color{red}eta} frac{dL}{dw}|\_{w=w^0,b=b^0} b^1 gets b^0 - {color{red}eta} frac{dL}{db}|\_{w=w^0,b=b^0} end{cases} Downarrow 分別對 w^1 和 b^1 做微分并計算下一個點 w^2 和 b^2: egin{cases} w^2 gets w^1 - {color{red}eta} frac{dL}{dw}|\_{w=w^1,b=b^1} b^2 gets b^1 - {color{red}eta} frac{dL}{db}|\_{w=w^1,b=b^1} end{cases} vdots 最終得到一組讓 L 最小的 w^T 和 b^T $$
Gradient Descent 到底是什么呢?其實就是將 $L$ 分別對 $w$ 和 $b$ 做偏微分,最后組成一個向量:
$$ abla L = egin{bmatrix} frac{partial L}{partial w} frac{partial L}{partial b} end{bmatrix} _{gradient} $$
當然如果你還是有點點糊涂的話,下面這張圖就能更好地向你說明,Gradient Descent 的原理:
Gradient Descent 其實就相當于每次計算所處位置圓弧的法線方向,這個方向是數值變化最明顯的方向,所以照著這個方向能最快的走到最低點。
但是,遇到這種圖怎么辦?
不用擔心(至少現在),因為 Linear Model 的圖形其實不會像上面的圖那樣,而是像上面第二張圖那樣的,一圈一圈很規整的凹面圖形,幾乎不存在 Local Minimum 的問題。
最后,我們看一下 $frac {partial L} {partial w} $ 和 $frac {partial L} {partial b} $ 都怎么計算的(如果你不會的話,可要惡補一下高等數學了)
$$ L(f) = sum\_{n=1}^{10} (widehat{y}^n - (b + wcdot x\_{cp}^n))^2 Downarrow egin{cases} frac {partial L} {partial w} = sum\_{n=1}^{10} 2cdot (widehat{y}^n - (b + wcdot x\_{cp}^n))(-x\_{cp}^n) frac {partial L} {partial b} = sum\_{n=1}^{10} 2cdot (widehat{y}^n - (b + wcdot x\_{cp}^n)){-1} end{cases} $$
本文總結我們講了 Regression(線性回歸) 的一些作用與高大上的一些應用場景,不過這些都是很復雜的應用;
然后我們就提出了一個用 Regression 來解決寶可夢升級 CP 值預測的系統;
通過將寶可夢的屬性代數化:$x$ 代表某個寶可夢個體、$x_{cp}$ 代表它的 CP 值、$x_h$ 代表它的高度等等,讓我們能夠通過代數的方法解決這個預測 CP 的問題;
在最開始,我們需要建立一個 Model(模型),Model 其實就是一堆 Function(計算方法)的集合,我們將一些數據輸入進去,他就能輸出我們想要的結果:比如我們輸入一只寶可夢的數據,他就能輸出這只寶可夢進化后的 CP 值;
在第二步,我們需要 Training Data(訓練數據)。我們需要有大量的訓練數據,才能夠教會我們的模型正確預測可能的 CP 值變化;
有了 Model 和 Training Data,我們還需要有 Loss Function(誤差函數)來評價我們當前模型的好壞,其實它的實現很簡單,就是一個普通的函數,然后將 Model 預測的 CP 值,和實際已知進化后的 CP 值做比較,他們差距越大,Loss Funciton 輸出的 $L$ 也就越大,越小說明預測得越準確;
最后我們講了如何訓練這個 Model,用 Gradient Descent(梯度下降)算法來調節模型,梯度下降算法其實就是通過高等數學中的微分運算,找到一個能讓 $L$ 變得更小的方向(并且這個方向是能讓 $L$減小得最快的),根據這個方向來決定是增大參數的大小還是減小參數的大小,總之,我們能夠通過不斷地訓練調節,得到一個能比較合理的、誤差盡可能小的模型。
今天就先寫到這里,小步快跑,下次更新見...
ML01 - Regression 案例學習 (下)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19690.html
摘要:同理三次方程會比二次方程擬合更好誤差更小五次方程會比四次方程擬合得更好誤差更小。舉個例子來說,如果我們想訓練機器人識別人類,我們就把小明拿給它學習。所以我們應當合理地選取,在減少擬合不夠情況的同時避免過度擬合。 續上 緊接著上面一篇文章 ML01 - Regression 案例學習 (上) 講到的 Gradient Descent,我們現在有了 Model、Training Data、...
摘要:值得一提的是每篇文章都是我用心整理的,編者一貫堅持使用通俗形象的語言給我的讀者朋友們講解機器學習深度學習的各個知識點。今天,紅色石頭特此將以前所有的原創文章整理出來,組成一個比較合理完整的機器學習深度學習的學習路線圖,希望能夠幫助到大家。 一年多來,公眾號【AI有道】已經發布了 140+ 的原創文章了。內容涉及林軒田機器學習課程筆記、吳恩達 deeplearning.ai 課程筆記、機...
閱讀 1525·2023-04-26 00:20
閱讀 1121·2023-04-25 21:49
閱讀 802·2021-09-22 15:52
閱讀 575·2021-09-07 10:16
閱讀 972·2021-08-18 10:22
閱讀 2663·2019-08-30 14:07
閱讀 2236·2019-08-30 14:00
閱讀 2651·2019-08-30 13:00