李宏毅 || 机器学习笔记一
李宏毅 || 機(jī)器學(xué)習(xí)筆記一
這是李宏毅老師的2021春季機(jī)器學(xué)習(xí)課程筆記。現(xiàn)在開始第一節(jié) Introduction 的學(xué)習(xí)
首先簡(jiǎn)單介紹一下機(jī)器學(xué)習(xí)
1.什么是機(jī)器學(xué)習(xí)呢?
事實(shí)上,機(jī)器學(xué)習(xí)概括來(lái)說(shuō)可以用一句話來(lái)描述機(jī)器學(xué)習(xí)這件事,機(jī)器學(xué)習(xí)就是讓機(jī)器具備找一個(gè)函式的能力
2.機(jī)器學(xué)習(xí)三大任務(wù)
- Regression,回歸問(wèn)題,輸出是一個(gè)連續(xù)的數(shù)值、標(biāo)量,比如PM2.5預(yù)測(cè)。
- Classification,分類問(wèn)題(輸出為離散數(shù)值),二分類(Binary Classification)的輸出就是0或1、Yes或No。多分類(Multi-Category Classification)的輸出就是[1,2,3,…,N],比如圖像分類里判斷一張圖片是貓還是狗還是杯子。
- Structured learning,結(jié)構(gòu)學(xué)習(xí)(輸出為一個(gè)有結(jié)構(gòu)的內(nèi)容,如一張圖畫、一段文字)
3.機(jī)器學(xué)習(xí)步驟
Function with unknown parameters(寫出一個(gè)帶有未知參數(shù)的函數(shù))
(Ex. Linear Model y=wx+b. 這里y即是一個(gè)model,w、b為待訓(xùn)練的參數(shù))
Define loss fun from training data(定義loss函數(shù))
Optimization(優(yōu)化的方法為Gradient decent)
舉例
機(jī)器學(xué)習(xí)找這個(gè)函式的過(guò)程,分成三個(gè)步驟,那我們就用Youtube頻道,點(diǎn)閱人數(shù)預(yù)測(cè)這件事情,來(lái)跟大家說(shuō)明這三個(gè)步驟,是怎么運(yùn)作的。
Step 1. Function with Unknown Parameters
第一個(gè)步驟是我們要寫出一個(gè),帶有未知參數(shù)的函式,舉例來(lái)說(shuō),我們這邊先做一個(gè)最初步的猜測(cè),我們寫成這個(gè)樣子 y=b+w*x? 這邊的每一個(gè)數(shù)值是什么呢。
- y是我們準(zhǔn)備要預(yù)測(cè)的東西,我們準(zhǔn)備要預(yù)測(cè)的是今天(2月26號(hào))這個(gè)頻道總共觀看的人;
- x?是這個(gè)頻道前一天總共觀看的人數(shù),y跟x?都是數(shù)值,叫做特征(Feature);
- **b(**Bias)跟w(weight)是未知的參數(shù)(Parameter),它是準(zhǔn)備要通過(guò)資料去找出來(lái)的,我們還不知道w跟b應(yīng)該是多少,我們只是隱約的猜測(cè);
這個(gè)猜測(cè)往往就來(lái)自于,你對(duì)這個(gè)問(wèn)題本質(zhì)上的了解,也就是Domain knowledge,這是一個(gè)猜測(cè),它不一定是對(duì)的,之后會(huì)再來(lái)修正這個(gè)猜測(cè)。
Step 2. Define Loss from Training Data
定義Loss Function,這個(gè)Function的輸入是Parameter,即Model里面的參數(shù)b跟w;輸出的值代表這筆數(shù)值好還是不好。那這個(gè)Loss怎么計(jì)算呢?
函式預(yù)估的結(jié)果跟真正的結(jié)果(這個(gè)真實(shí)的值叫做Label)的差距有多大。估測(cè)的值用y來(lái)表示,真實(shí)的值用?來(lái)表示,計(jì)算y跟?之間的差距e?、
計(jì)算差距其實(shí)不只一種方式
- 算y跟?之間,絕對(duì)值的差距,這一種計(jì)算差距的方法,得到的這個(gè)大L,得到的Loss叫 mean absolute error(MAE)
- 如果e是用相減y平方算出來(lái)的,這個(gè)叫mean square error(MSE)
- 如果y和?它都是機(jī)率分布的話,可能會(huì)選擇Cross-entropy
接下來(lái)我們把每一天的誤差加起來(lái)然后取得平均,N代表訓(xùn)驗(yàn)資料的個(gè)數(shù),算出一個(gè)L,是每一筆訓(xùn)練資料的誤差,就是Loss。L越大,代表現(xiàn)在這一組參數(shù)越不好,L越小,代表現(xiàn)在這一組參數(shù)越好。
估測(cè)的值跟實(shí)際的值之間的差距。
Error Surface:
對(duì)所計(jì)算出來(lái)的結(jié)果,那我們可以調(diào)整不同的w,我們可以調(diào)整不同的b,組合起來(lái)以后,都去計(jì)算它的Loss,然后就可以畫出下面的這個(gè)等高線圖。
如上圖所示,越偏紅色系,代表計(jì)算出來(lái)的Loss越大,就代表這一組w跟b越差,如果越偏藍(lán)色系,就代表Loss越小,就代表這一組w跟b越好。那像這樣子的一個(gè)等高線圖,就是試著試了不同的參數(shù),然后計(jì)算它的Loss,畫出來(lái)的這個(gè)等高線圖,叫做Error Surface,那這個(gè)是機(jī)器學(xué)習(xí)的第二步。
Step 3. Optimization
解一個(gè)最佳化的問(wèn)題。把未知的參數(shù)w跟b,找一個(gè)數(shù)值出來(lái),代入L,讓Loss的值最小,那個(gè)就是我們要找的w跟b。
在這一門課里面唯一會(huì)用到的Optimization的方法,叫做梯度下降法(Gradient Descent)。先假設(shè)未知的參數(shù)只有一個(gè),只有w這個(gè)未知的參數(shù)。
那當(dāng)w代不同的數(shù)值的時(shí)候,就會(huì)得到不同的Loss,這一條曲線就是error surface
那怎么樣找一個(gè)w,去讓這個(gè)loss的值最小呢?
首先隨機(jī)選取一個(gè)初始的點(diǎn)w?,
那接下來(lái)你就要計(jì)算,在w等于w0的時(shí)候,w這個(gè)參數(shù)對(duì)loss的微分L/?w |(w=w^0 ),計(jì)算在w?這個(gè)位置的error surface的切線斜率。
這一步的步伐的大小取決于兩件事情:
- 第一件事情是這個(gè)地方的斜率有多大,這個(gè)地方的斜率大,這個(gè)步伐就跨大一點(diǎn),斜率小步伐就跨小一點(diǎn)。
- 另外一個(gè)東西會(huì)影響步伐大小,這個(gè)η叫做學(xué)習(xí)速率(learning rate),它是你自己設(shè)定的。如果η設(shè)大一點(diǎn),那你每次參數(shù)update就會(huì)量大。
這種你在做機(jī)器學(xué)習(xí)需要自己設(shè)定的東西叫做hyperparameters。
為什么loss可以是負(fù)的呢?
Loss這個(gè)函數(shù)是自己定義的,決定一個(gè)loss function,就是絕對(duì)值再減100,那你可能就有負(fù)的,所以我這邊這一個(gè)curve并不是一個(gè)真實(shí)的loss,
那我們說(shuō)我們要把w?往右移一步,那這個(gè)新的位置就叫做w1,然后再繼續(xù)反覆做同樣的操作,不斷的把w移動(dòng)位置,最后你會(huì)停下來(lái)。
什么時(shí)候會(huì)停下來(lái)呢?往往有兩種狀況:
- 第一種狀況開始的設(shè)定,最多計(jì)算幾次。
- 那還有另外一種理想上的,微分的值正好是0的時(shí)候,如果這一項(xiàng)正好算出來(lái)是0,0乘上learning rate η還是0,
Gradient Descent 這個(gè)方法,有一個(gè)巨大的問(wèn)題,在這個(gè)例子里面,從W0當(dāng)作隨機(jī)初始的位置,很有可能走到WT這里,你的訓(xùn)練就停住了,你就沒(méi)有辦法再移動(dòng)w的位置。那右側(cè)紅點(diǎn)這一個(gè)位置,這個(gè)真的可以讓loss最小的地方,叫做全局最小值(global minima),而W^T這個(gè)地方叫做局部最小值(local minima)
那有兩個(gè)參數(shù)的情況下,怎么用Gradient Descent呢?
我們現(xiàn)在有兩個(gè)參數(shù),都給它隨機(jī)的初始的值,就是w?跟b?
你要計(jì)算w跟loss的微分和b對(duì)loss的微分,計(jì)算是在w等于w?的位置,b等于b?的位置,你要計(jì)算w對(duì)L的微分,計(jì)算b對(duì)L的微分,
計(jì)算完以后,就根據(jù)之前一個(gè)參數(shù)的時(shí)候的做法去更新w跟b,把w?減掉learning rate乘上微分的結(jié)果得到w1,把b?減掉learning rate乘上微分的結(jié)果得到b1
Linear Model
這三個(gè)步驟合起來(lái)叫做訓(xùn)練。我們現(xiàn)在是在知道答案的資料上去計(jì)算loss。
但是我們真正要在意的是未來(lái)的觀看的次數(shù)是多少,所以接下來(lái)拿這個(gè)函式來(lái)真的預(yù)測(cè)一下未來(lái)的觀看次數(shù)。
能不能夠做得更好呢,在做得更好之前,我們先來(lái)分析一下結(jié)果:
- 橫軸是代表的是時(shí)間,所以0(最左邊的點(diǎn)),代表的是2021年1月1號(hào),最右邊點(diǎn)代表的是2021年2月14號(hào)
- 縱軸就是觀看的人次,這邊是用千人當(dāng)作單位;
- 紅色的線是真實(shí)的觀看人次
- 藍(lán)色的線是機(jī)器用這一個(gè)函式,預(yù)測(cè)出來(lái)的觀看人次
這藍(lán)色的線沒(méi)什么神奇的地方,因?yàn)槲覀冇X(jué)得,可以拿前一天的觀看人次去預(yù)測(cè)隔天的觀看人次。但是仔細(xì)觀察這個(gè)圖,它是有周期性的,它每隔七天就會(huì)有兩天特別低,所以既然我們已經(jīng)知道每隔七天是一個(gè)循環(huán),那這一個(gè)model顯然很爛,因?yàn)樗荒軌蚩辞耙惶臁?/p>
每隔七天它一個(gè)循環(huán),如果我們一個(gè)模型,它是參考前七天的資料,把七天前的資料,直接復(fù)制到拿來(lái)當(dāng)作預(yù)測(cè)的結(jié)果,也許預(yù)測(cè)的會(huì)更準(zhǔn)也說(shuō)不定,所以我們就要修改一下我們的模型。通常一個(gè)模型的修改,往往來(lái)自于你對(duì)這個(gè)問(wèn)題的理解,就是Domain Knowledge。
所以一開始,我們對(duì)問(wèn)題完全不理解的時(shí)候,我們就胡亂寫一個(gè) y=b+wx_1 ,效果并沒(méi)有特別好。接下來(lái)我們觀察了真實(shí)的數(shù)據(jù)以后,得到一個(gè)結(jié)論是,每隔七天有一個(gè)循環(huán),所以我們應(yīng)該要把,前七天的觀看人次都列入考慮,所以寫了一個(gè)新的模型。
x?的下標(biāo)j代表是幾天前,然后這個(gè)j等于1到7,那七天前的資料,乘上不同的weight,再加上bias,得到預(yù)測(cè)的結(jié)果。如果這個(gè)是我們的model,
那這邊每一個(gè)w跟b,我們都會(huì)用Gradient Descent,算出它的最佳值,它的最佳值長(zhǎng)什么樣子呢,這邊show出來(lái)。
本來(lái)是考慮前七天,然后考慮28天會(huì)怎么樣呢,28天就一個(gè)月,考慮前一個(gè)月每一天的觀看人次,去預(yù)測(cè)隔天的觀看人次,預(yù)測(cè)出來(lái)結(jié)果怎樣呢,訓(xùn)練資料上是0.33k,那在2021年的資料上,在沒(méi)有看過(guò)的資料上是0.46k,那接下來(lái)考慮56天會(huì)怎么樣呢?是0.32k,在沒(méi)看過(guò)的資料上還是0.46k,看起來(lái),考慮更多天沒(méi)有辦法再更進(jìn)步了,也許已經(jīng)到了一個(gè)極限。
這邊這些模型輸入x(feature),把feature乘上一個(gè)weight,再加上一個(gè)bias就得到預(yù)測(cè)的結(jié)果,這樣的模型有一個(gè)共同的名字,叫做Linear model,那我們接下來(lái)會(huì)看,怎么把Linear model做得更好。
Regression
1.擬合一條分段折線
Piecewise Linear Curves
對(duì)于下面這條紅線(piecewise linear curve),你永遠(yuǎn)不能用Linear Model來(lái)很好的擬合它。所以我們需要一個(gè)更加有彈性的,有未知參數(shù)的Function。
如上圖,仔細(xì)觀察紅色的這一條曲線,它可以看作是一個(gè)常數(shù),再加上一群藍(lán)色的這樣子的 Function。事實(shí)上,
- 任何piecewise linear curve(分段線性線段)都可以看作是一個(gè)常數(shù),再加上一堆藍(lán)色的Function。
- 任何連續(xù)曲線,你只要取足夠多的轉(zhuǎn)折點(diǎn),你都能用piecewise linear curve去逼近他
- 為什么不用分段函數(shù)呢,因?yàn)樵跀帱c(diǎn)處,分段函數(shù)不可以求導(dǎo)
如果你今天點(diǎn)取的夠多或取的位置適當(dāng)?shù)脑?#xff0c;這個(gè) Piecewise Linear 的 Curves,就可以逼近這一個(gè)連續(xù)的這一個(gè)曲線。
2.怎么表示這個(gè)藍(lán)色折線呢?
那么如何來(lái)表示這個(gè)藍(lán)色的折線呢(即Hard Sigmoid)?這里用了Sigmoid函數(shù),它可以逼近Hard Sigmoid。
Back to ML_Step 1 :function with unknown
用一條曲線來(lái)理解它,用一個(gè)Sigmoid 的 Function來(lái)逼近這個(gè)藍(lán)色的Function,Sigmoid Function表達(dá)式為:
輸入的 x1,我們先乘上一個(gè) w,再加上一個(gè)b,再取一個(gè)負(fù)號(hào),再取 Exponential,再加 1,這一串被放在分母的地方。當(dāng)然,前面可以乘上一個(gè) Constant 叫做 c。
如果輸入的這個(gè) x1 的值,趨近于無(wú)窮大的時(shí)候,那 e^{-(b+wx_1)}這一項(xiàng)就會(huì)消失,那當(dāng) x1 非常大的時(shí)候,這一條這邊就會(huì)收斂在這個(gè)高度是 c 的地方。
那如果 x1 負(fù)的非常大的時(shí)候,分母的地方就會(huì)非常大,那 y 的值就會(huì)趨近于 0。
如上圖所示,我們?cè)倩氐竭@個(gè)藍(lán)色的 Function,比較常見的名字就叫做Hard Sigmoid。我們要組出各種不同的曲線,就需要各式各樣合適的藍(lán)色的 Function,而這個(gè)合適的藍(lán)色的 Function 怎么制造出來(lái)呢?
如上圖所示,修改不同的參數(shù)會(huì)得到不同的效果:
如果你改 w ,會(huì)改變斜率(斜坡的坡度)
如果你改 b ,Sigmoid Function 可以左右移動(dòng)
如果你改 c ,可以改變它的高度(曲線和y軸的交點(diǎn))
因此,你只要有不同的 w 、b 和 c,你就可以制造出不同的Sigmoid Function,把不同的 Sigmoid Function 疊起來(lái)以后,你就可以去逼近各種不同的Piecewise Linear 的 Function,然后 Piecewise Linear 的 Function可以近似各種不同的 Continuous 的 Function。
我們知道說(shuō)紅色這條線就是 0+1+2+3,它們都是藍(lán)色的 Function,函式有一個(gè)固定的樣子(b+wx_1),去做 Sigmoid 再乘上 c1。只是 1 跟 2 跟 3的 w 不一樣,它們的 b 不一樣,它們的c 不一樣。如果是第一個(gè)藍(lán)色 Function,它就是 w1、b1、c1,第二個(gè)藍(lán)色 Function是 w2、b2、 c2,第三個(gè)藍(lán)色 Function是 w3、b3、c3。加起來(lái)以后,我們得到的函式為 :
這個(gè) Function里面的 b 跟 w 跟 c是未知的,都是我們未知的參數(shù)。
如上圖,我們不是只用一個(gè) Feature X_1,我們可以用多個(gè) Feature。
- i來(lái)表示不同的sigmoid函數(shù)
- j來(lái)表示Feature的編號(hào)。
x1 :前一天的觀看人數(shù),x2:兩天前觀看人數(shù),x3:三天前的觀看人數(shù)
每一個(gè)i 就代表了一個(gè)藍(lán)色的 Function,只是我們現(xiàn)在每一個(gè)藍(lán)色的 Function,都用一個(gè) Sigmoid Function 來(lái)比近似它
我們現(xiàn)在為了簡(jiǎn)化起見,把括號(hào)里面的數(shù)字,用一個(gè)比較簡(jiǎn)單的符號(hào)r來(lái)表示。分別簡(jiǎn)記為: r1, r2,r3。可以表示為
如上圖公式,把 x1 x2 x3 拼在一起變成一個(gè)向量,把這邊所有的 w 統(tǒng)統(tǒng)放在一起變成一個(gè)矩陣,把 b1 b2 b3 拼起來(lái)變成一個(gè)向量,把 r1 r2 r3 拼起來(lái)變成一個(gè)向量。
如上圖最后一行,最后簡(jiǎn)寫成,向量 x 乘以矩陣W(9 個(gè)數(shù)值就是9 個(gè) 權(quán)重Weight),再加上 b 就得到 r 這個(gè)向量。那這邊做的事情跟上邊做的事情是一模一樣的,只是表示的方式不一樣。
上面描述的是括號(hào)里的運(yùn)算,把 x 乘上 W 加上 b 等于 r。那接下來(lái) r 要分別通過(guò) Sigmoid Function得到a。以r1為例:
然后同樣的方法由 r2 去得到 a2,把 r3 透過(guò) Sigmoid Function 得到 a3。
因此,上圖藍(lán)色的虛線框完成了x到a。首先通過(guò)虛線框中的括號(hào)運(yùn)算從 x1 x2 x3 得到了 r1 r2 r3。接下來(lái)通過(guò)Sigmoid Function,然后得到 a1 a2 a3。
接下來(lái)我們這個(gè)Sigmoid 的輸出a,還要乘上 ci 然后還要再加上 b。用向量來(lái)表示的話,a1 a2 a3 拼起來(lái)叫這個(gè)向量 a,c1 c2 c3 拼起來(lái)叫一個(gè)向量 c( 這里c 作 Transpose),那 a 乘上 c 的 Transpose 再加上 b,就得到了 y。
如上面公式,總結(jié)一下,它整體而言做的事情是輸入Feature x 這個(gè)向量,x 乘上矩陣 w 加上向量 b 得到向量 r,向量 r 通過(guò) Sigmoid Function得到向量 a,再把向量 a 跟乘上 c 的 Transpose 加上 b 就得到 y。
那我們把這些未知參數(shù)通通拉直,拼成一個(gè)很長(zhǎng)的向量。用一個(gè)符號(hào)叫做 θ來(lái)表示它。θ是一個(gè)很長(zhǎng)的向量,里面的第一個(gè)數(shù)值我們叫 θ1,第二個(gè)叫 θ2…,它統(tǒng)稱我們所有的未知的參數(shù)。
Back to ML_Step 2 :define loss from training data
那接下來(lái)進(jìn)入第二步:從訓(xùn)練數(shù)據(jù)定義loss函數(shù)。 Loss Function 變成 L( θ )。
- 先給定某一組 W、b、c^T跟 b的初始值
- 然后把一種 Feature x 帶進(jìn)去,然后看看你估測(cè)出來(lái)的 y 是多少
- 再計(jì)算一下跟真實(shí)的 Label 之間的差距,你得到一個(gè) e
- 把所有的誤差通通加起來(lái),你就得到你的 Loss
Back to ML_Step 3: Optimization
接下來(lái)下一步就是優(yōu)化(Optimization),
現(xiàn)在的 θ 它是一個(gè)很長(zhǎng)的向量,要找一組 θ讓我們的 Loss 越小越好,可以讓 Loss 最小的那一組 θ,我們叫做 θ Star,θ^*,具體步驟如下:
(1)我們一開始要隨機(jī)選一個(gè)初始的數(shù)值θ_0。
(2)接下來(lái)要計(jì)算微分,你要對(duì)每一個(gè)未知的參數(shù),去計(jì)算對(duì) L 的微分以后,集合起來(lái)它就是一個(gè)向量
(3)算出這個(gè) g 以后,接下來(lái)呢我們Update參數(shù)。
Batch
實(shí)際上在做 Gradient的時(shí)會(huì)這么做:會(huì)把這大 N 筆資料分成一個(gè)一個(gè)的 Batch(一包一包的東西,一組一組的),隨機(jī)分就好,所以每個(gè) Batch 里面有大B 筆資料,所以本來(lái)全部有大 N 筆資料,現(xiàn)在大B筆資料一組,一組叫做 Batch。
根據(jù)這個(gè) L1 來(lái)算 Gradient,用這個(gè) Gradient 來(lái)更新參數(shù),接下來(lái)再選下一個(gè) Batch 算出 L2,根據(jù) L2 算出Gradient,叫做一個(gè) Epoch,每一次更新參數(shù)叫做一次 Update, Update 跟 Epoch 是不一樣的東西(每次更新一次參數(shù)叫做一次 Update,把所有的 Batch 都看過(guò)一遍,叫做一個(gè) Epoch)。
全部batch叫做一個(gè) Epoch,每一次更新參數(shù)叫做一次 Update, Update 跟 Epoch 是不一樣的東西(每次更新一次參數(shù)叫做一次 Update,把所有的 Batch 都看過(guò)一遍,叫做一個(gè) Epoch)。
補(bǔ)充:所謂 HyperParameter 就是你自己決定的東西,人所設(shè)的東西不是機(jī)器自己找出來(lái)的,叫做 HyperParameter,我們今天已經(jīng)聽到了,幾個(gè) Sigmoid 也是一個(gè) HyperParameters,Batch Size 也是一個(gè) HyperParameter。
模型變型
那我們其實(shí)還可以對(duì)模型做更多的變形.這個(gè) Hard Sigmoid 不好嗎,為什么我們一定要把它換成 Soft 的Sigmoid?
你確實(shí)可以不一定要換成 Soft 的 Sigmoid,有其他的做法。舉例來(lái)說(shuō)這個(gè) Hard 的 Sigmoid,它可以看作是兩個(gè) Rectified Linear Unit 的加總,所謂 Rectified Linear Unit (ReLU)它就是長(zhǎng)這個(gè)樣。
如上圖,每條不同的 w 不同的 b 不同的 c,你就可以挪動(dòng)它的位置,你就可以改變這條線的斜率,在機(jī)器學(xué)習(xí)里面,這條線我們叫做 Rectified Linear Unit,它的縮寫叫做ReLU。
把兩個(gè) ReLU 疊起來(lái)就可以變成 Hard 的 Sigmoid。
那本來(lái)這邊只有 i 個(gè)Sigmoid,你要 2 個(gè)ReLU,才能夠合成一個(gè) Hard Sigmoid ,所以這邊有 i 個(gè) Sigmoid,那如果ReLU 要做到一樣的事情,那你可能需要 2 倍的 ReLU,所以我們把 Sigmoid 換成 ReLU。這邊就是把一個(gè)式子換了,因?yàn)橐硎疽粋€(gè) Hard 的 Sigmoid,表示那個(gè)藍(lán)色的 Function 不是只有一種做法,你完全可以用其他的做法。那這個(gè) Sigmoid或是 ReLU,他們?cè)跈C(jī)器學(xué)習(xí)里面,我們就叫Activation Function。
總結(jié)
以上是生活随笔為你收集整理的李宏毅 || 机器学习笔记一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大数据hadoop组件下载、window
- 下一篇: 如何做项目总结与汇报