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

上期回顧

上次我們提到 Linear Model。

我們可以想像說 x1 跟 y 中間有比較複雜的關係。

x1 跟 y 的關係就是一條直線,隨著 x1 越來越高,y 就應該越來越大。

我們可以設定不同的 w 來改變這條線的斜率;設定不同的 b改變這一條藍色的直線跟 y 軸的交叉點。

但是無論你怎麼改 w 跟 b,它永遠都是一條直線。

永遠都是 x1 越大,y 就越大。

前一天觀看的人數越多,隔天的觀看人數就越多。

但也許現實並不是這個樣子啊,也許在 x1 小於某一個數值的時候,前一天的觀看人數跟隔天的觀看人數是成正比。

那也許當 x1 大於一個數值的時候,這個物極必反。

過了一個峰值以後,過了一個假設 x1 太大,前天觀看的人數太高,那隔天觀看人數就會變少,也說不定。

也許 x1 跟 y 中間有一個比較複雜的,像這個紅色線一樣的關係,但你不管怎麼擺弄你的 w 跟 b,你永遠製造不出紅色那一條線。

你永遠無法用 Linear 的 Model 製造紅色這一條線,顯然 Linear 的 Model 有很大的限制。

Model 的 bias

這一種來自於 Model 的限制,叫做 Model 的 Bias。

重點:
Model 的 Bias: 來自於 Model 的限制

那其實我們剛才在課堂一開始的時候也把 b 叫做 Bias。

這邊特別強調一下,這個東西叫做 Model 的 Bias,它跟 b 的這個 Bias 不太一樣。

它的意思是,我們今天的這個限制,因此它沒有辦法模擬真實的狀況。

我們需要寫一個更複雜的、更有彈性的、有未知參數的 Function。

Linear 的 Model 顯然是不夠的。

計算第一段紅色折線

我們可以觀察一下紅色的這一條曲線。

紅色曲線可以看作是一個常數,再加上一群藍色的這樣子的 Function。

而藍色的 Function 的特性是這個樣子的,當 x 軸的值小於某一個這個 threshold 的時候,它是某一個定值。

大於另外一個 threshold 的時候,又是另外一個定值,中間有一個斜坡。

所以它是先水平的,然後再斜坡然後再水平的。

因為它是藍色的 Function,我們就先叫它藍方。

這個紅色的線可以看作是一個常數項加一大堆的藍方。

那這個常數項的值應該要有多大呢?

你就看這一條紅色的線,它跟 x 軸的交點在哪裡。

常數項就設跟 x 軸的交點一樣大。

那怎麼加上這個藍色的 Function 以後,變成紅色的這一條線呢?

就像圖中這樣加。

這個藍色 Function 的這個這個坡度的起點,設在紅色 Function 的起始的地方。

第二個斜坡的終點設在第一個轉角處。

它的斜坡的終點設在紅色 Function 的第一個轉角。

然後我們刻意讓這邊這個藍色 Function 的斜坡跟這個紅色 Function 的斜坡的斜率是一樣的。(上圖紅點之前的斜坡)

這個時候如果你把 0 加上 1,你就可以得到紅色線段的第一個轉折點之前的數值。

所以 0 加上 1,可以得到紅色線段第一個轉折點之前的部分。

計算第二段紅色折線

接下來再加第二個藍色的 Function。

你就看紅色折線第二個轉折點出現在哪裡。

那你刻意讓這邊的斜率跟這邊的斜率一樣,這時候你把圖中的 0+1+2,你就可以得到兩個轉折點這邊的線段。

計算第三段紅色折線

把第三個藍色的 Function 加在這個坡度的起始點。

接下來把0+1+2+3 全部加起來,你就得到紅色的這個線。

因此紅色折線可以看作是一個常數,再加上一堆藍色的 Function。

那你仔細想一下就會發現說,不管我畫什麼樣的 Piecewise Linear 的 Curves。

Piecewise Linear 的 Curves
由很多鋸齒狀的線段所組成的Curves 

我們可以用常數項加一大堆的藍色 Function 組合出來,只是他們用的藍色 Function 不見得一樣。

因此我們用很多不一樣的藍色 Function,加上一個常數以後,就可以組出這些 Piecewise Linear 的 Curves。

如果你今天 Piecewise Linear 的 Curves 越複雜、轉折的點越多,那你需要的這個藍色的 Function 就越多。

有些人可能會說也許我們今天要考慮的 x 跟 y 的關係不是 Piecewise Linear 的 Curves ,也許它是這樣子的曲線。

那就算是這樣的曲線也無所謂,我們可以在這樣的曲線上面,先取一些點,再把這些點 連起來,變成一個 Piecewise Linear 的 Curves。

如果你今天點取的夠多,這個 Piecewise Linear 的 Curves 跟原來的曲線就會非常接近,就可以逼近這一個不是 Piecewise Linear,而是有角度的、有弧度的這一條曲線。

所以我們今天知道一件事情,我們可以用 Piecewise Linear 的 Curves去逼近任何的連續的曲線。

而每一個 Piecewise Linear 的 Curves 又都可以用一大堆藍色的 Function 組合起來。

也就是說,只要我有足夠的藍色 Function 把它加起來,我也許就可以變成任何連續的曲線。

假設我們的 x 跟 y 的關係非常地複雜也沒關係。

我們就想辦法寫一個帶有未知數的 Function,就是一堆藍色的 Function加上一個 Constant。

那我們接下來的問題就是這一個藍色 Function的式子應該要怎麼把它寫出來呢?

也許你要直接寫出它,沒有那麼容易,但是我們可以用一條曲線來逼近它。

用一個 Sigmoid 的 Function來逼近這一個藍色的 Function。

Sigmoid 如果硬要翻成中文的話,可以翻成 S 型的,所以 Sigmoid Function 就是 S 型的 Function。

Sigmoid Function 的式子長的是這個樣子的,它的橫軸輸入是 x1,輸出是 y輸入的 x1。

當 x1 的值趨近於無窮大的時候,那 Exponential 這一項就會消失,並收斂在這個高度是 c 的地方。

如果今天 x1 負的非常大的時候,分母的地方就會非常大, y 的值就會趨近於 0。

因此我們可以用這樣子的一個 Function來試著畫出這一條曲線,用這一條曲線來逼近這一個藍色的 Function 的名字就叫做 Sigmoid。

那這邊我們之後都懶得把 Exponential 寫出來,我們就直接寫成圖中的樣子,就是 y 等於 c 倍的 Sigmoid。

好 所以我們可以用這個 Sigmoid Function 去逼近一個藍色的 Function。

那其實這個藍色的 Function 比較常見的名字就叫做 Hard Sigmoid

我們今天我們需要各式各樣不同的藍色的 Function。

我們要組出各種不同的曲線,那我們就需要各式各樣合適的藍色的 Function。

要有合適的藍色的 Function 需要調整這裡的 b 跟 w 跟 c,這樣就可以製造各種不同形狀的 Sigmoid Function。

用各種不同形狀的 Sigmoid Function 去逼近這個藍色的 Function。

舉例來說,如果你今天改 w ,就會改變斜率。

改變這個斜坡的坡度,就會改變斜坡的坡度。

如果動了 b 就可以把這一個 Sigmoid Function 左右移動。

如果改 c ,你就可以改變它的高度。

因此只要有不同的 w 不同的 b 不同的 c,就可以製造出不同的 Sigmoid Function。

把不同的 Sigmoid Function 疊起來以後,你就可以疊出、逼近各種不同的 Piecewise Linear 的 Function。

然後 Piecewise Linear 的 Function 可以拿來近似各種不同的 Continuous 的 Function。

所以今天如果我們要把紅色的這條線的函數寫出來的話,我們知道說紅色這條線 就是 0+1+2+3。

其中的 123 都是藍色的 Function。

所以它們的函式 就是有一個固定的樣子。

它們都寫做 x1 乘上 w 再加上 b,去做 Sigmoid 再乘上 c1。

只是 1 跟 2 跟 3,它們的 w 、b、c 不一樣。

如果是第一個藍色 Function,它就是 w1、b1、c1。

第二個藍色 Function、它用的是 w2、b2、c2。

第三個藍色 Function,我們就說它用的是 w3、b3、c3。

我們把 0、1、2、3 全部加起來以後,我們得到的函式就長這個樣子。

這邊的每一個式子,都代表了一個不同藍色的 Function。

Summation 就是把不同的藍色的 Function 給它加起來。

別忘了加一個 Constant,b,代表 0 的直線。

假設裡面的 b、w、c 是未知的參數。

那我們就可以設定不同的 b、w、c,製造不同的藍色的 Function。

不同的藍色的 Function 疊起來以後,就可以製造出不同的紅色的 Curves。

然後製造出不同的紅色的 Curves,再製造出不同的 Piecewise Linear 的 Curves,就可以去逼近各式各樣不同的 Continuous 的 Function。

所以我們其實有辦法寫出一個非常有彈性的、有未知參數的 Function。

它們有不同的 c 、不同的 b 、不同的 w。

好 那所以本來我們是 Linear 的 Model,y b+wx1

它有非常大的限制,叫 Model Bias。

我們可以寫一個更有彈性的、有未知參數的 Function 減少 Model 的 Bias。

就本來這邊是 b+wx1,變成 bi+wix1

我們只要帶入不同的 c 、不同的 b、 不同的 w,就可以變出各式各樣不同的 Function。

那我們剛才其實已經進化到不是只用一個 Feature,我們可以用多個 Feature。

其中 j 代表 Feature 的編號。

如果要考慮前 28 天的話,j 就是 1 到 28;考慮前 56 天的話,j 就是 1 到 56。

如果把這個 Function 再擴展成我們剛才講的比較有彈性的 Function 的話那也很簡單。

本來這邊是 b+Summation Over j wjxj

我們就把 Sigmoid 裡面的東西換掉。

只要 ci、bi、wij 在放不同的值,就可以變成不同的 Function。

接下來我們用比較直觀的方式,把這個式子實際上做的事把它畫出來。

我們先考慮一下 j 就是 1 2 3 的狀況,只考慮三個 Feature。

舉例來說,我們只考慮前一天、前兩天、前三天的 Case,所以 j 等於 1 2 3。

輸入 x1 代表前一天的觀看人數、x2 兩天前觀看人數、x3 三天前的觀看人數。

i 就代表了一個藍色的 Function,只是我們現在每一個藍色的 Function 都用一個 Sigmoid Function 來比近似它。

所以每一個 i 就代表了一個 Sigmoid Function,或是代表了一個藍色的 Function。

1 2 3 就代表我們有三個 Sigmoid Function。

每一個 Sigmoid 都有一個括號。

第一個 Sigmoid i 等於 1 的 Case。

就是把 x1 乘上一個 Weight 叫 w11,以此類推,全部把它加起來,然後把 b 加起來。

  • r1 = b1 + w11x1 + w12x2 + w13x3
  • r2 = b2 + w21x1 + w22x2 + w23x3
  • r3 = b3 + w31x1 + w32x2 + w33x3
    wij : weight for xi for i-th sigmoid

x1、x2、x3 和 r1、r2、r3 關係

那 x1、x2、x3 和 r1、r2、r3中間的關係是什麼呢?

我們可以用矩陣跟向量相乘的方法,寫一個比較簡單的 簡潔的寫法。

我們剛才已經知道說 r1、r2、r3,也就是括弧裡面算完的結果。

三個 Sigmoid 括弧裡面算完的結果,r1、r2、r3跟輸入的三個 Feature x1、x2、x3

它們之間的關係就是這樣。

  • r1 = b1 + w11x1 + w12x2 + w13x3
  • r2 = b2 + w21x1 + w22x2 + w23x3
  • r3 = b3 + w31x1 + w32x2 + w33x3

如果你熟悉線性代數的話,簡化成矩陣跟向量的相乘。

把 x1、x2、x3 拼在一起變成一個向量,把這邊所有的 w 統統放在一起變成一個矩陣。

把 b1、b2、b3拼起來變成一個向量,把 r1、r2、r3拼起來變成一個向量。

我們就可以簡寫成有一個向量叫做 x,這個 x 乘上個矩陣叫做 w。

x 先乘上 w 以後再加上 b 就得到 r 這個向量。

在這個括號裡面做的事情哪就是這麼一回事,把 x 乘上 w 加上 b 等於 r,r 呢就是這邊的 r1、r2、r3

接下來這個 r1、r2、r3 就要分別通過 Sigmoid Function。

下圖中的藍色的虛線框框裡面做的事情,就是從 x1、x2、x3 得到了 a1、a2、a3

接下來我們有一個簡潔的表示方法,我們用 r 通過一個叫做這個 Sigmoid 的 Function。

我們用 σ 來代表 Sigmoid 的 Function,然後們得到 a 這個向量。

把 r1、r2、r3分別通過 Sigmoid Function(這裡用 σ 表示),然後得到 a1、a2、a3

接下來 Sigmoid 的輸出,還要乘上 ci 然後還要再加上 b。

也就是 y = a1c1+a2c2+a3c3 + b

如果你要用向量來表示的話,a1、a2、a3 拼起來叫向量 a,c1、c2、c3拼起來叫一個向量 c。

那我們可以把 c 作 Transpose。

a 乘上 c 的 Transpose 再加上 b,我們就得到了 y。

重點步驟

簡單來說,就只是以下幾個步驟。

  1. r = b + Wx
  2. a= σ(r)
  3. y = b + cT*a

如果用線性代數來表示的話,就是:y = b + cTσ(b + Wx)。

重點:
用線性代數來表示的話,就是:y = b + cTσ(b + Wx)。

x: Feature

這裡有兩個 b ,但是這兩個 b 是不一樣的。

右邊的 b 是向量,左邊的 b 是數值。

接下來的右邊的向量 b 會以加粗的 b 表示,左邊的數值 b 會以一般的 b 表示。

未知的參數:b、b、W、cT

我們把 w 的每一個 Row 或者是每一個 Column 拿出來(Row 或 Column 意思都一樣),拼成一個長的向量。

然後把 b 拼上來、把 c 拼上來、把 b 拼上來。

這個長的向量,我們直接用一個符號叫做 θ 來表示它。

θ 是一個很長的向量,裡面的第一個數值我們叫 θ1、第二個叫 θ2、 第三個叫 θ3

y = b + cTσ(b + Wx)。

那 θ 裡面有一些未知參數,反正 θ 它統稱我們所有的未知的參數,我們就一律統稱 θ。

這樣我們就重新改寫了機器學習的第一步,重新定了一個有未知參數的 Function。

所以在參數很少的情況下,你甚至你有可能不用 Gradient Descent,也不需要什麼 Optimization 的技巧。

但是我們今天參數很快就會變得非常多。

像在這個例子裡面參數有一大把,有 w、b、c、b 串起來,變成一個很長的向量叫 θ。

那這個時候你需要 Gradient Descent 這樣的方法,來找出可以讓 Loss 最低的參數。

剛才的例子裡面有三個 Sigmoid,那為什麼是三個呢,能不能夠四個、五個、六個呢?

可以,Sigmoid 的數目是自己決定的,而且 Sigmoid 的數目越多,你可以產生出來的 Piecewise Linear 的 Function 就越複雜。

假設你只有三個 Sigmoid,意味著你只能產生三個線段

假設你有越多 Sigmoid,你就可以產生有越多段線的Piecewise Linear 的 Function,你就可以逼近越複雜的 Function。

但是至於要幾個 Sigmoid,這個又是另外一個 Hyper Parameter,這個你要自己決定。

我們在剛才例子裡面舉三個,那只是一個例子。

不一定只能夠用剛才那個 Sigmoid 去逼近那個 Hard Sigmoid,完全有別的做法,等一下我們就會講別的做法。

第二步,定 Loss

有了新的這個 Model ,之前是 L ( w 跟 b ),因為 w 跟 b 是未知的。

那我們現在接下來的未知的參數很多了,再把它一個一個列出來太累了。

所以我們直接用 θ 來代表所有未知的參數。

所以我們現在的 Loss Function 就變成 L( θ ),這個 θ 如果它是某一組數值的話會有多不好或有多好。

計算的方法跟剛才只有兩個參數的時候,其實是一模一樣的。

你先給定某一組 w、b、cT、b 的值。

你先給定某一組 θ 的值,假設你知道 w 的值是多少,把 w 的值寫進去, b 的值寫進去,c 的值寫進去 b 的值寫進去。

然後呢你把一種 Feature x 帶進去,然後看看你估測出來的 y 是多少,再計算一下跟真實的 Label 之間的差距,你得到一個 e。

把所有的誤差通通加起來,你就得到 Loss。

接下來下一步就是 Optimization,Optimization 的 problem 跟前面講的沒有甚麼不同,還是一樣的。

所以就算我們換了一個新的模型,這個 Optimization 的演算法還是 Gradient Descent,看起來其實真的沒有太多的差別。

我們現在的 θ 它是一個很長的向量,我們把它表示成 θ1 θ2 θ3 等。

我們現在就是要找一組 θ,讓我們的 Loss 越小越好。

可以讓 Loss 最小的那一組 θ,我們叫做 θ 的 Start。

要找出那個 θ 的 Start ,我們一開始要隨機選一個初始的數值,這邊叫做 θ0

  • θ0:θ 的 Start,我們一開始要隨機選一個初始的數值。
  • θ* = arg min L

你可以隨機選,那之後也可能會講,也會講到更好的找初始值的方法,我們現在先隨機選就好。

那接下來要計算微分,你要對每一個未知的參數,這邊用 θ1、θ2、θ3 來表示。

你要為每一個未知的參數都去計算它對 L 的微分,把每一個參數都拿去計算對 L 的微分以後,集合起來它就是一個gradient,gradient 是一個向量,我們用 g 來表示。

這邊假設有 1000 個參數,1000 個 θ,這個向量的長度就是 1000,

我們把每一個參數對 L 的微分集合起來以後,他有一個名字叫做 Gradient。

  • g = ∇L(θ0)

L 前面放一個倒三角形(∇)的意思就是,把所有的參數 θ1、θ2、θ3 通通拿去對 L 作微分。

那後面放 θ0 的意思是說我們這個算微分的位置是在 θ = θ0 的地方。

算出 gradient 之後,我們來更新參數,方法跟剛才只有兩個參數的狀況是一模一樣的。

只是從更新兩個參數,可能換成更新成 1000 個參數。

本來有一個參數叫 θ10,上標 0 代表它是一個隨機選的起始的值。

θ10 減掉 learning rate 乘上微分的值,得到 θ11,代表 θ1 更新過一次的結果。

θ20 減掉 learning rate 乘上微分的值,得到 θ21,代表 θ2 更新過一次的結果。

以此類推,就可以把那 1000 個參數統統都更新了。

那這邊有一個簡寫,就是會把這邊所有的 θ11、θ21… 合起來當做一個向量,θ1

θ10、θ20… 合起來當做一個向量,θ0

θ1 = θ0 - ηg

那假設你這邊參數有 1000 個,就代表有 1000 個 θ1、θ2、θ3…。

簡單來說,就是由 θ0 算 Gradient,根據 Gradient 去把 θ0 更新成 θ1,然後再算一次 Gradient。

然後呢根據 Gradient 把 θ1 再更新成 θ2

θ1 = θ0 - ηg
θ2 = θ1 - ηg
θ3 = θ2 - ηg
...

以此類推直到算出來的這個 Gradient是零向量 是 Zero Vector,導致你沒有辦法再更新參數為止。

不過在實作上幾乎不太可能作出 Gradient 是零向量的結果,通常你會停下來就是你不想做了。

那這邊是一個實作的 Detail 的 Issue,之所以會在這邊就提它,是因為助教的程式裡面有這一段,所以我們必須要講一下,免得去看助教的程式的時候覺得有點困惑。

實際上我們在做 Gradient Descent 的時候,我們會這麼做,我們這邊有大 N 筆資料。

我們會把這大 N 筆資料分成一個一個的 Batch,就是一包一包的東西 一組一組的。

怎麼分?隨機分就好。

所以每個 Batch 裡面有大 B 筆資料,現在大 B 筆資料一組,一組叫做 Batch。

怎麼分組?隨便分就好。

那本來我們是把所有的 Data 拿出來算一個 Loss,那現在我們不這麼做。

我們只拿一個 Batch 裡面的 Data,只拿第一筆 Data 出來算一個 Loss。

我們這邊把它叫 L1,跟右邊的 L 以示區別。

你把全部的資料拿出來算 Loss,跟只拿一個 Batch 拿出來的資料算 Loss,它不會一樣。

所以這邊用 L1來表示它。

但是你可以想像如果這個 B 夠大,也許 L 跟 L1 會很接近。

所以實作上的時候,每次我們會先選一個 Batch,用這個 Batch 來算 L。

根據這個 L1 來算 Gradient,用這個 Gradient 來更新參數 θ1

接下來再選下一個 Batch 算出 L2,根據 L2 算出 Gradient,然後再更新參數,再取下一個 Batch 算出 L3

Compute gradient g = ∇L10)
                 θ1 ←θ0 - ηg
Compute gradient g = ∇L11)
                 θ2 ←θ1 - ηg
Compute gradient g = ∇L1(θ2)
                 θ3 ←θ2 - ηg
...

所以我們並不是拿圖中右邊的 L 來算 Gradient,實際上我們是拿一個 Batch 算出來的 L1、L2、L3 來計算 Gradient。

Update 和 Epoch

那把所有的 Batch 都看過一次,叫做一個 Epoch。

每一次更新參數叫做一次 Update。

Epoch: 把所有的 Batch 都看過一次
Update: 每一次更新參數

所以我們在文獻上,常常會看到 Update 、Epoch 。

但是為了讓大家更清楚認識 Update 跟 Epoch 的差別,這邊就舉一個例子。

※Update 跟 Epoch 的差別例子

假設我們有 10000 筆 Data,也就是 N 等於 10000。

假設我們的 Batch 的大小是設 10,也就是 B 等於10。

我們在一個 Epoch 中,總共 Update 了幾次參數呢?

只要算一下 N 個 Example,也就是 10000 筆 Example,會形成了幾個 Batch,相除就是答案了。

總共形成了 10000 除以 10,也就是 1000 個 Batch。

所以在一個 Epoch 裡面,你其實已經更新了參數 1000 次。

因此一個 Epoch 並不是更新參數一次,在這個例子裡面一個 Epoch 已經更新了參數 1000 次了。

※Update 跟 Epoch 的差別例子2

第二個例子假設有 1000 個資料,Batch Size 設 100。

那1個 Epoch 總共更新幾次參數呢?

是 10 次。

所以有人跟你說,我做了一個 Epoch 的訓練,那你其實不知道它更新了幾次參數,有可能 1000 次,也有可能 10 次,取決於它的 Batch Size 有多大。

其實 Batch Size 的大小也是我們自己決定的,所以這邊我們又多了一個 HyperParameter。

人所設的東西不是機器自己找出來的,叫做 HyperParameter。

今天接觸的HyperParameter:
1. Learning rate
2. Sigmoid 
3. Batch Size

那我們其實還可以對模型做更多的變形,剛才有同學問到說 Hard Sigmoid 不好嗎?

為什麼我們一定要把它換成 Soft 的 Sigmoid?

你確實可以不一定要換成 Soft 的 Sigmoid,有其他的做法。

舉例來說這個 Hard Sigmoid 的函式有點難寫出來,但其實也沒有那麼難寫出來。

它可以看作是兩個 Rectified Linear Unit 的加總。

所謂 Rectified Linear Unit 它就是長這個樣,就是它有一個水平的線,走到某個地方有一個轉折的點,然後變成一個斜坡。

那這種 Function 它的式子,寫成 c 乘上 max(0, b + wx1)。

這個 max(0, b + wx1) 的意思就是,看 0 跟 b + wx1 誰比較大,比較大的那一個就會被當做輸出。

如果 b + wx1 小於 0,那輸出就是0。

如果 b + wx1 大於 0,輸出就是 b + wx1

每條不同的 w、不同的 b、不同的 c,你就可以挪動它的位置,改變這條線的斜率。

這種線在機器學習裡面,我們叫做 Rectified Linear Unit,它的縮寫叫做 ReLU。

那你把兩個 ReLU 疊起來,就可以變成 Hard 的 Sigmoid。

如果我們想要用 ReLU,不想要用 Sigmoid 的話,就把 Sigmoid 的地方

換成 max(0, bi + Σj wij * xj)

那本來這邊只有 i 個 Sigmoid,但是需要 2 個 ReLU才能夠合成一個 Hard Sigmoid ,所以這邊有 i 個 Sigmoid。

如果 ReLU 要做到一樣的事情,可能需要 2 倍的 ReLU,i → 2i。

因為 2 個 ReLU 合起來,才是一個 Hard Sigmoid。

我們把 Sigmoid 換成 ReLU,這邊就是把一個式子換了,

要表示一個 Hard 的 Sigmoid,表示那個藍色的 Function 不是只有一種做法,你完全可以用其他的做法。

Sigmoid 或是 ReLU 在機器學習裡面,我們就叫它 Activation Function。

當然還有其他常見的 Activation Function,但 Sigmoid 跟 ReLU,應該是今天最常見的 Activation Function。

顯然 ReLU 比較好,至於它為什麼比較好,那就是之後討論的事情了。

考慮 56 天

如果是 Linear 的 Model,我們現在考慮 56 天,訓練資料上面的 Loss 是 0.32k。

沒看過的資料 2021 年資料是 0.46k。

如果用 10 個 ReLU,好像沒有進步太多。

這邊跟用 Linear 是差不多的,所以看起來 10 個 ReLU 不太夠。

100 個 ReLU 就有顯著的差別了。

100 個 ReLU 在訓練資料上的 Loss : 0.32k → 0.28k。

有 100 個 ReLU,我們就可以製造比較複雜的曲線。

本來 Linear 就是一直線,但是 100 個 ReLU 我們就可以產生有 100 個折線的 Piecewise Linear Function。

接下來換 1000 個 ReLU。

1000 個 ReLU在訓練資料上 Loss 更低了一些,但是在沒看過的資料上看起來也沒有太大的進步。

接下來我們還可以繼續改我們的模型。

舉例來說,剛才我們說從 x 到 a 做的,是把 x 乘上 w 加 b,再通過 Sigmoid Function。

a = σ(b + Wx)

不過我們現在已經知道說,不一定要通過 Sigmoid Function,通過 ReLU 也可以,然後得到 a。

下圖中的紅點代表 ReLU。

我們可以把這個同樣的事情再反覆地多做幾次。

a

a = σ(b + Wx)

代入

a' = σ(b' + W'a)

現在我們可以把 a 再乘上另外一個 w’,再加上另外一個 b’,再通過 Sigmoid Function或 ReLU Function,得到 a’。

所以我們可以把 x 做這一連串的運算產生 a,接下來把 a 做這一連串的運算產生 a’。

那我們可以反覆地多做幾次。

至於要做幾次另外一個 Hyper Parameter。

今天接觸的HyperParameter:
1. Learning rate
2. Sigmoid 
3. Batch Size
4. 計算 a 次數

兩次嗎?三次嗎?四次嗎?一百次嗎?

這個需要你自己決定。

不過 w 跟 w’不是同一個參數; b 跟 b’不是同一個參數,而是增加了更多的未知的參數。

開始實驗

接下來我們就是每次都加 100 個 ReLU,

Input Features就是 56 天前的資料。

如果乘上 w 再加 b,再通過 ReLU 或 Sigmoid 這件事只做一次的話。

這是我們剛才看到的結果。

兩次,可以明顯看到 Loss 降低很多,0.28k → 0.18k,沒看過的資料上也好了一些。

三層又有進步, 0.18k → 0.14k。

接下來我們來看看結果。

那橫軸是日期。

縱軸是觀看的人次是千人,紅色的線代表的是真實的數據,藍色的線是預測出來的數據。

那你會發現說,紅色的數據是每隔一段時間就會有兩天的低點。

在低點的地方,機器的預測還算是蠻準確的,它都準確抓到說這兩天就是低的。

那這邊有一個神奇的事情,這個機器高估了真實的觀看人次,

尤其是在第 40 天,這一天有一個很明顯的低谷,但是機器沒有預測到這一天有明顯的低谷。

它是晚一天才預測出低谷,那你知道是怎麼回事嗎?

是因為過年,這一天最低點就是除夕啊。

所以當然對機器來說,你不能怪它。

它根本不知道除夕是什麼。

它只知道看前 56 天的值來預測下一天會發生什麼事,所以它不知道那一天是除夕,所以你不能怪它預測地不準。

我們講了很多各式各樣的模型,那我們現在還缺了一個東西,缺一個好名字。

所以我們的模型也需要一個好名字。

這些 Sigmoid 或 ReLU ,它們叫做 Neuron (神經元)。

我們這邊有很多的 Neuron,很多的 Neuron 就叫做 Neural Network。

Neuron 是什麼,Neuron 就是神經元。

人腦中就是有很多神經元,很多神經元串起來就是一個神經網路。

這邊有很多的 Neuron,每一排 Neuron 我們就叫它一個 Layer,它們叫 Hidden Layer,有很多的 Hidden Layer 就叫做 Deep,這整套技術就叫做 Deep Learning。

我們就把 Deep Learning 講完了,就是這麼回事。

所以人們就開始,把類神經網路越疊越多,越疊越深。

12 年的時候有一個 AlexNet ,它有 8 層 它的錯誤率是 16.4%,

兩年之後 VGG 19層,錯誤率在影像辨識上進步到 7.3 %。

這個都是在影像辨識上一個基準的資料庫上面的結果。

後來 GoogleNet 有錯誤率降到 6.7%,有 22 層。

這些都不算是什麼,Residual Net 有 152 層,它比 101 還要高。

但是這個 Residual Net ,其實要訓練這麼深的 Network 是有訣竅的,這個我們之後再講。

我們一開始說想要用 ReLU 或者是 Sigmoid,去逼近一個複雜的 Function。

實際上只要夠多的 ReLU 夠多的 Sigmoid,就可以知道夠複雜的線段,就可以逼近任何的連續的 Function。

所以我們只要一排 ReLU 一排 Sigmoid 夠多就足夠了。

那深的意義到底何在呢?

把 ReLU Sigmoid Function 反覆用到底有什麼好處呢?

為什麼不把它們直接排一排呢?

直接排一排也可以表示任何 Function。

所以把它反覆用沒什麼道理。

好 那有人就說

那怎麼不變得更深呢?

剛才只做到 3 層,應該要做得更深。

好 所以要做更深,確實做得更深、做 4 層,4 層在訓練資料上的 Loss 是 0.1k,在沒有看過 2021 年的資料上是 0.44k。

在訓練資料上,3 層比 4 層差,4 層比 3 層好。

這種訓練資料跟沒看過的資料它的結果是不一致的狀況做 Overfitting。

但是做到目前為止,我們都還沒有真的發揮這個模型的力量。

和 2021 的資料到 2 月 14 號之前的資料,我們也都已經手上有了。

我們要做的事情就是預測未知的資料,但是如果我們要預測未知的資料,我們應該選 3 層的 Network,還是 4 層的 Network 呢?

舉例來說,今天是 2 月 26 號,今天的觀看人數我們還不知道,如果我們要用一個 Neural Network

用我們已經訓練出來的 Neural Network去預測今天的觀看人數。

我們應該要選 3 層的,雖然 4 層在訓練資料上的結果比較好,可是我們並不在意訓練資料的結果。

我們在意的是沒有看過的資料,而 2 月 26 號是沒有看過的資料,所以我們應該選 3 層的 Network。

我們真的來預測一下,2 月 26 號應該要有的觀看次數是多少。

但是因為其實 YouTube 的統計,它沒有那麼及時,所以它現在只統計到 2 月 24 號。

那我們先計算一下 2 月 25 號的觀看人數是多少,這個 3 層的 Network 告訴我2 月 25 號這個頻道的總觀看人次應該是 5250 人。

那我們先假設 2 月 25 號是對的。

但實際上我還不知道 2 月 25 號對不對,因為 YouTube 後台統計的數據還沒有出來。

但我們先假設這一天都是對的,然後再給我們的模型去預測 2 月 26 號的數字,得到的結果是 3.96k 有 3960 次。

那它為什麼這邊特別低,因為模型知道說,這個禮拜五觀看的人數就是比較少,所以它預測特別低聽起來也是合理的。

但是你覺得這個預測,跟這邊的 0.38k 比起來,哪一個會比較準確呢?

Leave a Comment

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