【2021機器學習筆記】預測 youtube 頻道觀看人數 (上) – 機器學習基本概念簡介

機器學習專有名詞

Regression 迴歸

定義:The function outputs a scalar.

假設我們今天要找的函式的輸出是一個數值,scalar。

那這樣子的機器學習的任務就稱之為Regression。

舉個例子,假設我們今天要機器預測未來某一個時間的 PM2.5的數值。

機器要做的事情是找一個函式,這個函式我們用 f 來表示,函式的輸出是明天中午的PM2.5的數值。

他的輸入可能是一些跟預測PM2.5有關的指數,包括今天的PM2.5的數值、今天的平均溫度、今天平均的臭氧濃度等等。

這一個函式可以拿這些數值當作輸入,然後輸出明天中午的PM2.5的數值。

那這一個找這個函式的任務,叫作Regression。

除了Regression,另外一個大家耳熟能詳的任務,叫作Classification。

Classification 分類

Classification 要機器做的是選擇題,我們先準備好一些選項。

這些選項又叫作類別,又叫作classes。

機器從我們設定好的選項裡面,選擇一個當作輸出,這個任務就叫作Classification。

舉個例子,gmail account裡面有一個函式可以幫我們偵測一封郵件是不是垃圾郵件。

這個函式的輸入是一封電子郵件,那他的輸出是 Yes 或者是 No,是垃圾郵件或不是垃圾郵件。

我們先把選項 Yes / No 給機器,機器要從Yes跟No裡面選一個選項出來。

不過,Classification 不一定只有兩個選項,也可以有多個選項,例如 alpha go本身也是一個Classification。

只不過 alpha go 是從19*19個可以落子的位置裡面,選出下一步應該要落子的位置。

迴歸和分類之外的

在於Regression跟Classification以外,還有 Structured Learning。

也就是說機器今天除了輸出一個數字,或者是做選擇題, 還要產生一個有結構的物件。

用擬人化的講法說,就是要讓機器學會創造這件事情。

那今天我們要利用老師的 youtube 頻道,從昨天的觀看數預測明天的觀看次數。

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

我們假設我們的公式是這樣的。

y= b+wxₗ

  • y:我們希望預測的結果,這裡是今天的觀看次數。
  • xₗ:已知的數據,昨天的觀看次數
  • w 和 b :未知參數(機器學習得出的),其中 w 我們稱為 weight, b 是 bias

ps. x 也被稱為 feature (特徵)。

2. 定義 loss

Loss : How good a set of values is.

Loss 也是其中一個 function,function 的輸入是我們 model 裡的參數,因此 L(b, w)。

這個Function輸出的值代表說,現在如果我們把這一組未知的參數設定某一個數值的時候,這筆數值好還是不好。

假設現在我們給未知的參數的設定是 bias 等於 0.5k,w 等於 1。

那我們預測未來的點閱次數的函式就變成 y = 0.5k+xₗ。

L(0.5k,1) y = 0.5k+xₗ  →   y = 0.5k+xₗ

在這個問題裡面,我們的訓練資料是,頻道過去的點閱次數。

接下來我們就可以計算Loss,我們把2017年1月1號的點閱次數代入這一個函式裡面。

我們已經說我們想要知道 b 設定為 0.5k,w 設定為 1 的時候,這個函式有多好。

當 b =0.5k,w =1的時候,我們拿來預測的這個函數是 y = 0.5k+xₗ。

L(0.5k,1) y = 0.5k+xₗ  ---   y = 0.5k+xₗ

我們讓 xₗ = 4.8k,看它的預測出來的結果是多少。

因此,根據這一個函式,假設 b = 0.5k,w = 1。

如果1月1號是4.8k的點閱次數的話,那隔天應該是 4.8k*1 + 0.5k = 5.3k

1/1        : 4.8k 點閱
1/2(預計)  : 4.8k*1 + 0.5k = 5.3k

隔天實際的點閱次數,也就是 1月2號的點閱次數我們可以比對一下,是 4.9k。

現在這個函式預估的結果跟真正的結果是有差距的。

這個函式預估的結果是5.3k,真正的結果是4.9k。

那就可以計算一下這個差距,計算一下估測的值跟真實的值的差距。

  • y:估測值
  • ŷ:真實值
  • eₗ :y 和 ŷ 的差距
 eₗ = |y - ŷ| = 0.4k

今天我們有2017年1月1號到2020年12月31號總共三年的資料。

那這個真實的值叫做Label,所以常常聽到有人說機器學習都需要Label。

Label

Label指的就是正確的數值

那我們除了用1月1號來預測1月2號的值,我們可以用1月2號的值來預測1月3號的值。

如果我們現在的函式是 y = 0.5k + xₗ

1/1        : 4.8k 點閱
1/2        : 4.9k 點閱
1/3(預計)  : 4.9k*1 + 0.5k = 5.4k

接下來計算 5.4k,跟真正的答案,也就是 Label之間的差距。

 e2 = |y - ŷ| = |5.4 - 7.5k| = 2.1k

接下來我們就把每一天的誤差全部加起來,然後取得平均。

N 代表我們的訓驗資料的個數,也就是三年來的訓練資料,365 * 3 = 1095。

我們算出一個 L(Loss),L是每一筆訓練資料的誤差。

L 越大,代表我們現在這一組參數越不好。

L 越小,則代表現在這一組參數越好。

這一種計算差距的方法得到的 Loss 叫 mean absolute error,縮寫是MAE。

重點:
MAE : mean absolute error
e = |y - ŷ|

那在 MAE 裡面,我們是算 y 跟 ŷ 相減以後的平方。

重點:
MSE : mean square error
e = (y - ŷ)2

如果你今天的e是用相減y平方算出來的,就叫mean square error,MSE。

第二步 算出cross entropy

cross entropy交叉熵,簡單講就是衡量要找出正確答案,不同的策略,所要消耗的成本

MSE vs MAE

MSE 跟 MAE 其實有非常微妙的差別。

通常我們需要選擇用哪一種方法來衡量距離,取決於我們的需求以及我們對這個任務的理解。

反正我們就是選擇 MAE 作為我們計算這個誤差的方式。

如果 y 和 ŷ 都是機率分佈的話,我們會用 MSE。

在這個時候,我們可能會選擇Cross-entropy,這個我們都之後再討論。

那這個是機器學習的第二步。

先前舉的數字都不是真正的例子,但是在接下來,舉的都是真正的例子。

那我們可以調整不同的 w 和 b,求取各種 w 和 b。

組合起來以後,我們可以為不同的 w 跟 b 的組合計算它的Loss,然後就可以畫出以下這一個等高線圖。

在這個等高線圖上面,越偏紅色系,代表計算出來的Loss ↑

Loss ↑ = w 跟 b 越差。

如果越偏藍色系,就代表 Loss越小,就代表這一組 w 跟 b越好

如果 Loss 越小, w 跟 b 放到我們的Function (Model)裡面,我們的預測也會越精準。

重點:
如果 Loss 越小, w 跟 b 放到我們的Function裡面,放到我們的Model裡面,我們的預測也會越精準。

假設 w 在 -0.25,b 在 -500,就代表這個頻道每天看的人越來越少,而且對應的 Loss 很大,跟真實的狀況不太一樣。

如果 w 代 0.75,b 代 500,那這個正確率會比較精準。

那估測最精準的地方看起來,應該是在這裡。(下圖紅點的位置)

如果你今天 w 代一個很接近 1 的值,b 代 100多,那這個時候估測是最精準的,跟大家的預期可能是比較接近的。

就是你拿前一天的點閱的總次數,去預測隔天的點閱的總次數。

那可能前一天跟隔天的點閱的總次數其實是差不多的。

因此 w 設 1, b 設一個小一點的數值,這樣也許你的估測就會蠻精準的。

那像這樣子的一個等高線圖,就是你試著試了不同的參數,計算 Loss 後才畫出來的等高線圖,叫做Error Surface。

第三步 最佳化

那機器學習第三步要做的事情,其實是解一個最佳化的問題。

我們今天要做的事情就是找一個 w 跟 b,可以讓我們的 Loss 值最小、也就是最好的 w 跟 b。

w*, b* = arg min L
  • w*: 可以讓loss最小的w
  • b*: 可以讓loss最小的b

在這一門課裡面,們唯一會用到的 Optimization的方法叫做 Gradient Descent。

為了要簡化,我們先假設我們未知的參數只有 w。

我們先假設只有 w這個未知的參數,沒有 b 未知參數。

w* = arg min L

那當我們 w 代不同的數值的時候,我們就會得到不同的Loss。

1D 的 error surface

這一條曲線就是error surface,剛才在前一個例子裡面我們看到的error surface 是二維的是2D的。

這裡我們看到的 error surface 只有一個參數,是1D的。

那怎麼樣找一個 w 去讓這個loss的值最小?

那首先你要隨機選取一個初始的點,w0

這個初始的點往往就是隨機的,

在往後的課程裡面,我們也會看到也許有一些方法可以給我們一個比較好的 w0 的值。

這裡我們先把 w0 當成是隨機的。

那假設我們隨機決定的結果是在這個地方。

那接下來就要計算在 w 等於 w0 的時候,w 對loss的微分是多少,也就是在 w0 這個位置的 error surface 的切線斜率,也就是圖中藍色的虛線。

如果這一條虛線的斜率是負的,代表左邊比較高,右邊比較低

如果左邊比較高右邊比較低的話,就把w的值變大,我們就可以讓loss變小。

微分也就代表斜率。

如果算出來的斜率是正的,就代表左邊比較低右邊比較高,那我們把w變小,w往左邊移,我們可以讓Loss的值變小。

重點:
斜率 -ve  (左邊比較高,右邊比較低)--> ↑w --> loss↓
斜率 +ve  (左邊比較低,右邊比較高)--> ↓w --> loss↓

如果你不知道什麼是斜率的話,你可以想像說有一個人站在這個地方,然後他左右環視一下。

看哪邊比較低,它就往比較低的地方跨出一步。

至於一步要跨多大,取決於兩件事情,

  • 這個地方的斜率有多大。如果斜率大,步伐就跨大一點;斜率小,步伐就跨小一點。
  • η ,也叫 learning rate,叫做學習速率

learning rate 是自己設定的,如果η設大一點,那每次參數update就會量大,學習可能就比較快。

如果η設小一點,那參數的update就很慢,每次只會改變一點點參數的數值。

那這種在做機器學習需要自己設定的東西,也叫 hyperparameters。

這個我們剛剛講說機器學習的第一步,就是訂一個有未知參數的function。

而這些未知的參數是機器自己找出來的。

為什麼loss可以是負的呢?

Loss這個函數是自己定義的,這個curve並不是一個真實的loss,是老師隨便亂舉的一個例子。

loss 的 error surface 可以是任何形狀,這邊沒有預設立場它一定要是什麼形狀。

如果loss的定義就跟我剛才定的一樣,那 loss 一定是絕對值,不可能是負值。

一般這個loss 、這個function是你自己決定的,所以它有可能是負的。

關於hyperparameter

在機器學習的這整個過程中,你需要自己設定的這個東西,就叫做 hyperparameter。

那我們說我們要把w0往右移一步,到新的位置就叫做w1

這一步的步伐是η乘上微分的結果。

如果要用數學式來表示的話,就是把w0減掉η乘上微分的結果,得到w1

接下來就是反覆進行剛才的操作,計算w1微分的結果,然後再決定現在要把w1移動多少,然後再移動到w2,然後再繼續反覆做同樣的操作。

不斷的把w移動位置,最後你會停下來。

什麼時候會停下來呢?

往往有兩種狀況,第一種狀況是你失去耐心了。

你一開始會設定說,我今天在調整我的參數的時候、我在計算我的微分的時候,我最多計算幾次。

你可能會設說,我的上限就是設定100萬次。我參數更新100萬次以後,我就不再更新了。

那至於要更新幾次,這個也是一個hyperparameter,是自己決定的。

如果一個deadline是明天,那可能更新的次數就設少一點,對它下周更新的次數就設多一點。

那還有另外一種理想上的停下來的可能是當我們不斷調整參數,調整到一個地方的微分值正好是0的時候。

如果這一項正好算出來是0,0乘上learning rate η還是0,所以你的參數就不會再移動位置。

那假設我們是這個理想的狀況,我們把w0更新到w1再更新到w2,最後更新到wt有點卡。

wt卡住了,也就是算出來這個微分的值是0了,那參數的位置就不會再更新。

那講到這邊,你可能會馬上發現說 Gradient Descent 這個方法有一個巨大的問題。

也就是我們沒有找到真正最好的解,可以讓Loss最小的那個w。

在這個例子裡面,把w設定在這個地方可以讓loss最小。

但是如果 Gradient Descent是從猴子在的位置,當作隨機初始的位置的話,也很有可能走到wt,訓練停住了,你就沒有辦法再移動w的位置。

重點:
global minima: loss最小的地方
local minima : 左右兩邊都比較高,但是它又不是整個error surface上的最低點

所以我們可能常常可能會聽到有人講到Gradient Descent 不是個好方法,因為這個方法可能會有local minima的問題,沒有辦法真的找到global minima。

事實上,假設你有做過深度學習相關的事情、自己訓練network、自己做過Gradient Descent 經驗的話,其實local minima是一個假問題。

我們在做Gradient Descent 的時候,真正面對的難題不是local minima。

剛才舉的是只有一個參數的例子而已,那實際上我們剛才的模型有兩個參數,有w跟b。

那有兩個參數的情況下,怎麼用Gradient Descent呢?

其實跟剛才一個參數沒有什麼不同,若一個參數你沒有問題的話,你可以很快的推廣到兩個參數。

我們現在有兩個參數,那我們給它隨機的初始值,就是w⁰跟b⁰。

接下來我們要計算b對loss的微分、w跟loss的微分。

計算是在w等於w⁰的位置、b等於b₀的位置、在w等於w₀的位置、b等於b⁰的位置。

計算完以後,就根據我們剛才,一個參數的時候的做法去更新w跟b。

把 w⁰ -( η *微分) = w¹,把b⁰-(η*微分) = b¹。

不會計算微分怎麼辦

在deep learning 的framework裡面會用pytorch,微分都是程式自動幫你算的。

你就,就寫一行程式,自動就把微分的值就算出來了。

那就是反覆同樣的步驟不斷的更新w跟b,然後期待最後你可以找到一個最好的w、w*跟最好的b*。

假設隨便選一個初始的值在這個地方。

那你就先計算一下w對L的微分、跟b對L的微分,然後接下來你就要更新w跟b。

更新的方向就是w對L的微分,乘以η再乘以一個負號。

b對L的微分乘以η再乘以一個負號。

算出這個微分的值,就可以決定更新的方向。

那把w跟b更新的方向結合起來就是一個向量,就是這個紅色的箭頭。

我們就移動到紅色的箭頭後的位置。

然後再計算一次微分,把這個微分的值乘上learning rate,再乘上負號,你就知道紅色的箭頭要指向那裡。

你就知道怎麼移動w跟b的位置。

一直移動一直移動一直移動,期待最後可以找出一組不錯的w跟b。

那實際上真的用Gradient Descent進行一番計算以後,我們算出來的最好的w是0.97,最好的b是0.1k,跟我們的猜測蠻接近的。

因為x₁的值可能跟y很接近,所以這個w就設一個接近1的值,b就設一個比較偏小的值。

loss算一下是0.48k。

也就是在2017到2020年的資料上,如果使用這一個函式,b代0.1k,w代0.97,那平均的誤差是0.48k,也就是它的預測的觀看人數誤差,大概是500人次左右。

到目前為止,我們就提到了機器學習的三個步驟。

第一個步驟、寫出一個函式。這個函式裡面是有未知數的。

第二個步驟、定義一個叫做loss的function。

第三個步驟、解一個Optimization的problem,找到一組w跟b讓loss最小。

那w跟b的值剛才已經找出來的,這組w跟b可以讓loss小到0.48k。

但是這樣是一個讓人滿意或的結果嗎?

也許不是。

因為這三個步驟合起來叫做訓練。

我們現在是在我們已經知道答案的資料上,去計算loss。

2017到2020年的資料,我們已經知道啦。

我們其實已經知道2017到2020年每天的觀看次數 所以其實我們現在其實只是在假裝我們不知道隔天的觀看次數。

然後拿這一個函式來進行預測發現誤差是0.48k。

但是我們真正要在意的是已經知道的觀看次數嗎?

我們真正要在意的是未來的觀看的次數是多少。

所以我們接下來要做的事情是什麼呢?

就是拿這個函式預測一下未來的觀看次數。

我們在2020年的最後一天找出了這個函式,接下來從2021年開始每一天,我們都拿這個函式去預測隔天的觀看人次。

我們就拿2020年的12月31號的觀看人次去預測2021年元旦的觀看人次。

用2021年元旦的觀看人次預測一下2021年元旦隔天,1月2號的觀看人次。

用1月2號的觀看人次去預測1月3號的觀看人次。

以此類推,每天都做這件事。

一直做到2月14號,就做到情人節,然後得到平均的值。

平均的誤差值是多少呢,這個是真實的數據的結果。

在2021年沒有看過的資料上,這個誤差值我們這邊用 L’ 來表示,是0.58。

所以在有看過的資料上,在訓練資料上誤差值是比較小的。

在沒有看過的資料上,在2021年的資料上看起來誤差值是比較大的。

那我們每一天的平均誤差,有580人左右,只是能不能夠做得更好呢?

在做得更好之前,我們先來分析一下結果。

這個圖怎麼看呢?

這個圖的橫軸是代表的是時間,因此0這個點,最左邊的點,代表的是2021年1月1號。

最右邊點,代表的是2021年2月14號。

縱軸就是觀看的人次,這邊是用千人當作單位。

紅色的線是真實的觀看人次,藍色的線是機器用這一個函式預測出來的觀看人次。

你有發現很明顯的這藍色的線沒什麼神奇的地方,它幾乎就是紅色的線往右平移一天而已。

它其實也沒做什麼特別厲害的預測,就把紅色的線往右平移一天。

這很合理,因為我們覺得x₁也就是前一天的觀看人次跟隔天觀看人次的。

要怎麼拿前一天的觀看人次去預測隔天的觀看人次呢?

前一天觀看人次乘以0.97加上0.1k 加上100,就是隔天的觀看人次。

所以你會發現說,機器幾乎就是拿前一天的觀看人次來預測隔天的觀看人次。

但是如果你仔細觀察這個圖,你會發現這個真實的資料有一個很神奇的現象。

它是有週期性的,就是它每隔七天就會有兩天特別低。

兩天觀看的人特別少,那我發現那兩天都固定是禮拜五跟禮拜六。

禮拜五跟禮拜六我可以了解禮拜五週末 大家出去玩。

那不知道為什麼禮拜天大家去學機器學習。

這個我還沒有參透為什麼是這個樣子。

也許跟youtube背後神奇的演算法有關係。

也許youtube在推頻道的影片的時候,它都選擇禮拜五禮拜六不推,只推禮拜天到禮拜四。

但是反正看出來的結果,我們看真實的數據就是這個樣子。

每隔七天一個循環每個禮拜五禮拜六,看的人就是特別少。

既然我們已經知道每隔七天就是一個循環,那這一個式子、這一個model 顯然很爛。

因為它只能夠看前一天,如果說每隔七天它一個循環,我們應該要看七天對不對。

如果我們一個模型,它是參考前七天的資料,然後把七天前的資料,直接複製到拿來當作預測的結果也許預測的會更準也說不定。

所以我們就要修改一下我們的模型。

通常一個模型的修改往往來自於你對這個問題的理解,也就是Domain Knowledge。

重點:
Domain Knowledge -- 一個模型的修改往往來自於你對這個問題的理解

所以一開始,我們對問題完全不理解的時候,我們就胡亂寫一個,y等於b 加wx₁,並沒有做得特別好。

接下來我們觀察了真實的數據以後,得到一個結論是,每隔七天有一個循環。

因此我們應該要把前七天的觀看人次都列入考慮,所以我們寫了一個新的模型。

xⱼ代表什麼

j:代表幾天前

也就是從一天前兩天前,一直考慮到七天前。

那七天前的資料通通乘上不同的weight,乘上不同的wⱼ,加起來,再加上bias,得到預測的結果。

這邊考慮了比較多的資訊,在訓練資料上你應該要得到更好的更低的loss。

考慮七天在訓練資料上,會得到比較低的loss,0.38k。

這邊算出來是0.38k,但它在沒有看過的資料上面,做不做得好呢

在沒有看到的資料上,是0.49k。

所以剛才只考慮一天是0.58k的誤差,考慮七天是0.49k的誤差。

那這邊每一個w跟b,我們都會用Gradient Descent,算出它的最佳值。

它的最佳值長什麼樣子呢?

當然機器的邏輯我是有點沒有辦法了解,我本來以為它會選七天前的數據,七天前的觀看人數直接複製過來。

它在這裡的邏輯是前一天跟你要預測的隔天的數值的關係很大。

因此 w₁* ( 前一天 )是0.79。

那不知道為什麼 它還考慮前三天( w3* ),是0.12。

然後前六天(w6*)是0.30,前七天(w7*)是0.18。

不過它知道如果是前兩天前四天前五天,它的值會跟未來我們要預測的隔天的值是成反比的。

所以w₂ w₄跟w₅它們最佳的值,讓Loss可以在訓練資料上是0.38k的值是負的。

但是w₁ w₃ w₆跟w₇是正的。

我們考慮前七天的值,那你可能會問說,能不能夠考慮更多天呢

考慮28天

那這個輕易的改考慮更多天,那考慮28天會怎麼樣呢?

考慮前一個月每一天的觀看人次去預測隔天的觀看人次

訓練資料上是0.33k,那在2021年的資料上在沒有看過的資料上是0.46k。

看起來又更好一點。

考慮56天

在訓練資料上是稍微再好一點,是0.32k,在沒看過的資料上還是0.46k。

看起來考慮更多天沒有辦法再更進步了。

看來考慮天數這件事,也許已經到了一個極限。

那這邊這些模型,它們都是把輸入的這個x,這個x 還記得它叫什麼嗎?

它叫做feature,把feature乘上一個weight,再加上一個bias就得到預測的結果。

這樣的模型有一個共同的名字,叫做Linear model。

那我們接下來會看,怎麼把Linear model做得更好。

Leave a Comment

Your email address will not be published. Required fields are marked *