机器学习 2021 - Introduction of Machine / Deep Learning

机器学习 2021 - Introduction of Machine / DeepLearning

\qquad 好,那我們就開始上課吧,那第一堂課,是要簡單跟大家介紹一下 machine learning 還有 deep learning 的基本概念。等一下會講一個跟寶可夢完全沒有關係的故事,告訴你機器學習還有深度學習的基本概念。

\qquad 好,那什麼是機器學習呢?想必大家在報章雜誌上其實往往都已經聽過機器學習這一個詞彙,那你可能也知道說機器學習就是跟今天很熱門的AI好像有那麼一點關聯。那所謂的機器學習到底是什麼呢?顧名思義好像是說,機器他具備有學習的能力,那些科普文章往往把機器學習這個東西吹得玄之又玄,好像機器會學習以後,我們就有了人工智慧,有了人工智慧以後機器接下來就要統治人類了。

\qquad 那機器學習到底是什麼呢?事實上,機器學習概括來說可以用一句話來描述機器學習這件事。什麼叫機器學習呢?機器學習就是讓機器具備找一個函式的能力,那機器具備找函式的能力以後他可以做什麼樣的事情呢?他確實可以做很多事,舉例來說,假設你今天想要叫機器做語音辨識,機器聽一段聲音,產生這段聲音對應的文字,那你需要的就是一個函式,這個函式的輸入是聲音訊號輸出是這段聲音訊號的內容。那你可以想像說,這個可以把聲音訊號當作輸入,文字當作輸出的函式顯然非常非常的複雜,他絕對不是你可以用人手寫出來的方程式。這個函式他非常非常的複雜,人類絕對沒有能力把它寫出來,所以我們期待憑藉著機器的力量把這個函式自動找出來,這件事情就是機器學習。那剛才舉的例子是 語音辨識。還有好多好多的任務我們都需要找一個很複雜的函式。舉例來說,假設我們現在要做影像辨識,那這個影像辨識我們需要什麼樣的函式呢?這個函式的輸入是一張圖片,他的輸出是什麼呢?他是這個圖片裡面有什麼樣的內容。或者是大家都知道的 AlphaGo 其實也可以看作是一個函式要讓機器下圍棋,我們需要的就是一個函式,這個函式的輸入是棋盤上黑子跟白子的位置,輸出是什麼?輸出是機器下一步應該落子的位置。假設你可以找到一個函式,這個函式的輸入就是棋盤上黑子跟白子的位置,輸出就是下一步應該落子的位置。那我們就可以讓機器做自動下圍棋這件事,就可以做一個 AlphaGo

\qquad 那隨著我們要找的函式不同,機器學習有不同的類別,那這邊介紹幾個專有名詞給大家認識一下。第一個專有名詞叫作 RegressionRegression 的意思是說假設我們今天要找的函式他的輸出是一個數值,他的輸出是一個 scalar,那這樣子的機器學習的任務我們稱之為 Regression。那這邊舉一個 Regression 的例子,假設我們今天要機器做的事情是預測未來某一個時間的 PM2.5 的數值,你要叫機器做的事情是找一個函式,這個我們用 f 來表示,這個函式的輸出是明天中午的 PM2.5 的數值,他的輸入可能是種種跟預測 PM2.5 有關的指數,包括今天的 PM2.5 的數值、今天的平均溫度、今天平均的臭氧濃度等等,這一個函式可以拿這些數值當作輸入,輸出明天中午的 PM2.5 的數值。那這一個找這個函式的任務叫作 Regression

\qquad 那還有別的任務嗎?還有別的任務,除了 Regression 以外,另外一個大家耳熟能詳的任務叫作 Classification,那 Classification 這個任務要機器做的是選擇題。我們人類先準備好一些選項,那這些選項又叫作類別,又叫作 classes,我們現在要找的函式,它的輸出就是從我們設定好的選項裡面選擇一個當作輸出,那這個問題,這個任務就叫作 Classification。舉例來說,現在每個人都有 gmail account,那 gmail account 裡面有一個函式,這個函式可以幫我們偵測一封郵件是不是垃圾郵件,這個函式的輸入是一封電子郵件,那他的輸出是什麼呢?你要先準備好你要機器選的選項,在偵測垃圾郵件這個問題裡面可能的選項就是兩個,是垃圾郵件或不是垃圾郵件,Yes 或者是 No。那機器要從 YesNo 裡面選一個選項出來這個問題叫作 Classification

\qquad Classification 不一定只有兩個選項,也可以有多個選項,舉例來說,alpha go 本身也是一個 Classification 的問題,那只是這個 Classification 他的選項是比較多的。那如果要叫機器下圍棋,你想做一個 alpha go的話我們要給機器多少的選項呢?你就想想看,棋盤上有多少個位置?那我們知道棋盤上有 1919 個位置,那叫機器下圍棋這個問題,其實就是一個有 1919 個選項的選擇題,你要叫機器做的就是找一個函式,這個函式的輸入是棋盤上黑子跟白子的位置輸出就是從 19 19 個選項裡面選出一個正確的選項,從 1919 個可以落子的位置裡面選出下一步應該要落子的位置。那這個問題也是一個分類的問題。那其實很多教科書,在講機器學習的種種不同類型的任務的時候,往往就講到這邊,告訴你說機器學習兩大類任務,一個叫作 Regression,一個叫作 Classification,然後就結束了。但是假設你對機器學習的認知只停留在機器學習就是兩大類任務 RegressionClassification,那就好像你以為說這個世界只有五大洲一樣,你知道這個世界不是只有五大洲對不對,這個世界外面是有一個黑暗大陸的,這鬼滅之刃連載之前我們就已經出發前往黑暗大陸了,鬼滅之刃連載以後我們居然都還沒有到,可見這個黑暗大陸距離那麼遠(这段话应该是以《鬼灭之刃》漫画调侃《全职猎人》漫画托更)。那在機器學習這個領域裡面所謂的黑暗大陸是什麼呢?在 RegressionClassification 以外大家往往害怕碰觸的問題叫作 Structured Learning,也就是機器今天不只是要做選擇題,不只是輸出一個數字,還要產生一個有結構的物件。舉例來說,機器畫一張圖,寫一篇文章,這種叫機器產生有結構的東西的問題就叫作 Structured Learning。那如果要講得比較擬人化,比較潮一點,Structured Learning 你可以用擬人化的講法說,我就是要叫機器學會 “創造” 這件事情。

\qquad 好那到目前為止我們就是講了三個機器學習的任務 RegressionClassificationStructured Learning,接下來我們要講的是,那我們說機器學習就是要找一個函式,那機器怎麼找一個函式呢?那這邊要用個例子跟大家說明,說機器怎麼找一個函式。這邊的例子是什麼呢?

\qquad 這邊的例子,在講這個例子之前,先跟大家說一下說這一門課有一個 youtube 的頻道,然後這個我會把上課的錄影放到這個 youtube 的頻道上面,那這個頻道,感謝過去修過這門課的同學不嫌棄,其實也蠻多人訂閱所以我算是一個三流的 youtuber,是沒有什麼太多流量,但是這邊也是有 7 萬多訂閱。

\qquad 那為什麼突然提到這個 youtube 的頻道呢?因為我們等一下要舉的例子跟 youtube 是有關係的。那你知道身為一個 youtuberyoutuber 在意的東西是什麼呢?youtuber 在意的就是這個頻道的流量對不對?假設有一個 youtuber 是靠著 youtube 維生的,他會在意頻道有沒有流量,這樣他才會知道他可以獲利多少。所以我在想說我們有沒有可能找一個函式,這個函式他的輸入是 youtube 後台的資訊輸出是這個頻道隔天的總點閱率總共有多少。假設你自己有 youtube 頻道的話,你會知道說在 youtube 後台你可以看到很多相關的資訊,比如說每一天按讚的人數有多少、每一天訂閱的人數有多少、每一天觀看的次數有多少。我們能不能夠根據一個頻道過往所有的資訊去預測它明天有可能的觀看的次數是多少呢?我們能不能夠找一個函式這個函式的輸入是 youtube 上面 youtube 後台是我的資訊輸出就是某一天隔天這個頻道會有的總觀看的次數。有可能會說,為什麼要做這個,如果我有營利的話,我可以知道我未來可以賺到多少錢,但我其實沒有開營利,所以我也不知道我為什麼要做這個就是了,完全沒有任何管用。我單純就是想舉一個例子而已,好那接下來我們就要問怎麼找出這個函式呢?怎麼找這個函式 F,輸入是 Youtube 後台的資料,輸出是這個頻道隔天的點閱的總人數呢?

\qquad 那機器學習找這個函式的過程分成三個步驟,那我們就用 Youtube 頻道點閱人數預測這件事情來跟大家說明這三個步驟是怎麼運作的。第一個步驟是我們要寫出一個帶有未知參數的函式,簡單來說就是,我們先猜測一下我們打算找的這個函式 F 它的數學式到底長什麼樣子。舉例來說,我們這邊先做一個最初步的猜測:這個 F 長什麼樣子呢?這個輸入跟 y 之間有什麼樣的關係呢?我們寫成這個樣子,y 等於 bw 乘以 x 1 x_1 x1,這邊的每一個數值是什麼呢?這個 y 啊,就假設是今天吧,因为今天還沒有過完,所以我還不知道今天總共的點閱次數是多少,所以這件事情是我們未知的,y 是我們準備要預測的東西,我們準備要預測的是今天 226 號這個頻道總共觀看的人數。那 x 1 x_1 x1 是什麼呢? x 1 x_1 x1 是這個頻道前一天總共觀看的人數。y x 1 x_1 x1 都是數值,這個 y 是我們要準備預測的東西, x 1 x_1 x1 是我們已經知道的資訊。那 bw 是什麼呢?bw 是未知的參數,它是準備要透過資料去找出來的。我們還不知道 wb 應該是多少,我們只是隱約的猜測,但為什麼會有這個猜測呢?這個猜測往往就來自於你對這個問題本質上的了解,也就是 Domain knowledge,所以才會常常聽到有人說這個做機器學習啊,就需要一些 Domain knowledge,這個 Domain knowledge 通常是用在哪裡呢?這個 Domain knowledge 就是用在写這個帶有未知數的函數的時候。所以我們怎麼知道說這個能夠預測未來點閱次數的函式 F,它就一定是前一天的點閱次數乘上 w 再加上 b 呢?我們其实不知道,這是一個猜測,也許我們覺得說這個今天的點閱次數總是會跟昨天的點閱次數有點關聯,所以我們把昨天的點閱次數乘上一個數值,但是總是不會一模一樣,所以再加上一個 b 做修正,當作是對於 226 號點閱次數的預測。這是一個猜測,它不一定是對的,我們等一下回頭會再來修正這個猜測。好那現在總之我們就隨便猜說 y 等於 bw 乘以 x 1 x_1 x1,而 bw 是未知的。這個帶有未知的參數,這個 Parameter 中文通常翻成參數,這個帶有UnknownParameter 的這個 Function 我們就叫做 Model。所以我們常常聽到有人說模型 Model 這個東西,Model 這個東西在機器學習裡面就是一個帶有未知的ParameterFunction。好那這個 x 1 x_1 x1 啊,是這個 Function 裡面我們已知的,已經知道的東西,它是來自於 Youtube 後台的資訊,我們已經知道 225 號點閱的總人數是多少,這個東西叫做 Feature,而 wb 是我們不知道的,它是UnknownParameter,那這邊我們也給 wb 給他一個名字,這個跟 Feature 做相乘的未知的參數,這個 w 我們叫它 weight,這個沒有跟 Feature 相乘的是直接加下去的,這個我們叫它 Bias,那這個只是一些名詞的定義而已。等一下我們講課的時候,我們在稱呼模型裡面的每一個東西的時候會更為方便,好那這個是第一個步驟。

\qquad 好那第二個步驟是什麼呢?第二個步驟呢是我們要定義一個東西叫做 Loss。什麼是 Loss 呢?Loss 它也是一個 Function,那這個 Function 它的輸入是我們 Model 裡面的參數。我剛才已經把我們的 Model 寫出來了對不對,我們的 Model 叫做 y 等於 bw 乘以 x 1 x_1 x1,而 bw 是未知的,是我們準備要找出來的。那所謂的 L 啊,所謂的這個 Loss 啊,它是一個 Function。這個 Function 的輸入是什麼?這個 Function 的輸入就是 bw,所以 L 它是一個 Function,它的輸入是 Parameter model 裡面的 Parameter。那這個 Loss,這個 Function 輸出的值代表什麼呢?這個 Function 輸出的值代表說現在如果我們把這一組未知的參數設定某一個數值的時候這筆數值好還是不好

\qquad 那這樣講可能你覺得有點抽象,所以我們就舉一個具體的例子,假設現在我們給未知的參數的設定是 b 這个 bias 等於 0.5k,這個 w 呢直接等於 1。那這個 Loss 怎麼計算呢?如果我們 b0.5k,這個 w1,那我們拿來預測未來的點閱次數的函式就變成 y 等於 0.5k1 倍的 x 1 x_1 x1,那這樣子的一個函式,這個 0.5k1,他們所代表的這個函式它有多好呢?這個東西就是 Loss,那在我們的問題裡面,我們要怎麼計算這個 Loss 呢?這個我們就要從訓練資料來進行計算,在這個問題裡面,我們的訓練資料是什麼呢?我們的訓練資料是這一個頻道過去的點閱次數,舉例來說,從 2017 年到 2020 年的點閱次數,每天的這個頻道的點閱次數都知道,這邊是假的數字啦,隨便亂編的。好,那所以我們知道 201711 號到 20201231 號的點閱數字是多少,接下來我們就可以計算 Loss。怎麼計算呢?我們把 201711 號的點閱次數代入這一個函式裡面,我們已經說我們想要知道 b 設定為 0.5kw 設定為 1 的時候,這個函式有多棒。當 b 設定為 0.5kw 設定為 1 的時候,我們拿來預測的這個函數是 y 等於 0.5k 加一倍的 x 1 x_1 x1,那我們就把這個 x 1 x_1 x14.8k,看它的預測出來的結果是多少。所以,根據這一個函式,根據 b0.5kw1 的這個函式,如果 11 號是 4.8k 的點閱次數的話,那隔天應該是 4.8k10.5k,就是 5.3k 的點閱次數。那隔天實際上的點閱次數,12 號的點閱次數我們知道嗎?從後台的資訊裡面,我們是知道的,所以我們可以比對一下現在這個函式預估的結果跟真正的結果它的差距有多大,這個函式預估的結果是 5.3k,真正的結果是多少呢?真正的結果是 4.9k,它是高估了,高估了這個頻道可能的點閱人數。那就可以計算一下這個差距,計算一下估測的值跟真實的值的差距,這邊估測的值用 y 來表示,真實的值用 ŷ 來表示,你可以計算 yŷ 之間的差距,得到一個 e 1 e_1 e1 代表估測的值跟真實的值之間的差距。那計算差距其實不只一種方式,我這邊把 yŷ 相減直接取絕對值算出來的值是 0.4k。好那我們今天有的資料不是只有 11 號跟 12 號的資料,我們有 201711 號到 20201231 號總共三年的資料,那這個真實的值叫做 Label,所以常常聽到有人說機器學習都需要 LabelLabel 指的就是正確的數值,這個東西叫做 Label

\qquad 那我們不是只能用 11 號來預測 12 號的值,我們可以用 12 號的值來預測 13 號的值。如果我們現在的函式是 y 等於 0.5k 加一倍的 x 1 x_1 x1,那 12 號,根據 12 號的點閱次數預測的 13 號的點閱次數的值是多少呢?是 5.4k,以 x 1 x_1 x14.9k 進去乘 1 在加 0.5k 等於 5.4k。接下來計算這個 5.4k 跟真正的答案跟 Label 之間的差距,Label7.5k,看來是一個低估,低估了這個頻道在 13 號的時候的點閱次數,可以算出 e 2 e_2 e2,這個 e 2 e_2 e2yŷ 之間的差距,算出來是 2.1k,那同一個方法你就可以算過這三年來每一天的預測的誤差。假設我們今天的 Functiony 等於 0.5k 加一倍的 x 1 x_1 x1,這三年來每一天的誤差通通都可以算出來,每一天的誤差都可以給我們一個小 e e e

\qquad 好那接下來我們就把每一天的誤差通通加起來,加起來然後取得平均,這個大 N 代表我們的訓驗資料的個數,那我們訓練資料的個數就是三年來的訓練資料,就是 365 乘以 3,每年 365 天,三年所以 365 乘以 3。那我們算出一個 L, 我們算出一個大 L,這大 L 是每一筆訓練資料的誤差,這個 e 相加以後的結果。這個大 L 就是我們的 Loss,這個大 L 越大代表我們現在這一組參數越不好,這個大 L 越小代表現在這一組參數越好。那這個 e 啊,就是計算這個估測的值跟實際的值之間的差距,其實有不同的計算方法,在我們剛才的例子裡面我們是算 yŷ 之間絕對值的差距,這一種計算差距的方法得到的這個大 L,得到的 Lossmean absolute error,縮寫是 MAE。那在這 MSE 裡面,我們是算 yŷ 相減以後的平方,如果你今天的 e 是用相減 y 平方算出來的,這個叫 mean square error,又叫 MSE。那 MSEMAE 他們其實有非常微妙的差別,通常你要選擇用哪一種方法來衡量距離,那是看你的需求和你對這個任務的理解。那在這邊呢我們就不往下講,反正我們就是選擇 MAE 作為我們計算這個誤差的方式,把所有的誤差加起來就得到 Loss。那你要選擇 MSE 也是可以的,在作業裡面我們會用 MSE。那有一些任務如果 yŷ 它都是機率,都是機率分佈的話,在這個時候你可能會選擇 Cross-entropy,這個我們都之後再說,反正我們這邊就是選擇了 MAE,那這個是機器學習的第二步。

\qquad 那我剛才舉的那些數字不是真正的例子,但是在這一門課裡面,我在講課的時候就是要舉真正的例子給你看,所以以下的數字是真實的例子,是這個頻道真實的後台的數據所計算出來的結果。那我們可以調整不同的 w,我們可以調整不同的 b,穷举各種 w, 穷取各種 b,組合起來以後我們可以為不同的 wb 的組合都去計算它的 Loss,然後就可以畫出以下這一個等高線圖。在這個等高線圖上面,越偏紅色系代表計算出來的 Loss 越大,就代表這一組 wb 越差;如果越偏藍色系就代表 Loss 越小,就代表這一組 wb 越好。拿這一組 wb 放到我們的 Function 裡面,放到我們的 Model 裡面,那我們的預測會越精準。所以你就知道說假設 w 在負 0.25,這個 b 在負 500,就代表說呢,這個 W 在負 0.25b 在負 500,就代表說這個頻道每天看的人越來越少,而且 Loss 這麼大跟真實的狀況不太合;如果 w0.75b500,那這個正確率,這個估測會比較精準。那估測最精準的地方看起來應該是在這裡啦,如果你今天 w 代一個很接近 1 的值,b 帶一個小小的值,比如說 100 多,那這個時候估測是最精準的。那這跟大家的預期可能是比較接近的,就是你拿前一天的點閱的總次數去預測隔天的點閱的總次數,那可能前一天跟隔天的點閱的總次數其實是差不多的,所以 w1,然後 b 設一個小一點的數值,也許你的估測就會蠻精準的。那像這樣子的一個等高線圖,就是你試著試了不同的參數,然後計算它的 Loss 畫出來的這個等高線圖叫做 Error Surface,那這個是機器學習的第二步。

\qquad 接下來我們進入機器學習的第三步,那第三步要做的事情,其實是解一個最佳化的問題。如果你不知道最佳化的問題是什麼的話也沒有關係,我們今天要做的事情就是找一個 wb,把未知的參數找一個數值出來,看代那一個數值進去可以讓我們的大 L,讓我們的 Loss 的值最小,那個就是我們要找的 wb。那這個可以讓 loss 最小的 wb,我們就叫做 w*b*,代表說他們是最好的一組 wb,可以讓 loss 的值最小。那這個東西要怎麼做呢?在這一門課裡面,我們唯一會用到的 Optimization 的方法叫做 Gradient Descent

\qquad 那這個 Gradient Descent 這個方法要怎麼做呢?它是這樣做的,為了要簡化起見,我們先假設我們未知的參數只有一個就是 w,我們先假設沒有 b 那個未知的參數,只有 w 這個未知的參數。那當我們 w 代不同的數值的時候,我們就會得到不同的 Loss,這一條曲線就是 error surface,只是剛才在前一個例子裡面我們看到的 error surface 是二維的,是 2D 的,那這邊只有一個參數,所以我們看到的這個 error surface1D 的。

\qquad 那怎麼樣找一個 w 去讓這個 loss 的值最小呢?那首先你要隨機選取一個初始的點,那這個初始的點我們叫做 w 0 \pmb{w^0} w0w0w0,那這個初始的點往往真的就是隨機的,就是隨便選一個,真的都是隨機的。那在往後的課程裡面我們其實會看到也許有一些方法可以給我們一個比較好的 w 0 \pmb{w^0} w0w0w0 的值,那我們先不講這件事,我們先當作都是隨機的,隨便擲個骰子隨機決定 w 0 \pmb{w^0} w0w0w0 的值應該是多少。那假設我們隨機決定的結果是在這個地方,那接下來你就要計算說在 w 等於 w 0 \pmb{w^0} w0w0w0 的時候,w 這個參數對 loss 的微分是多少?那我假設你知道微分是什麼,這對你來說不是個問題,計算 wloss 的微分是多少。如果你不知道微分是什麼的話,那沒有關係,反正我們做的事情就是計算在這一個點,在 w 0 \pmb{w^0} w0w0w0 這個位置的這個 error surface 的切線斜率,也就是這一條藍色的虛線它的斜率。那如果這一條虛線的斜率是負的,那代表什麼意思呢?代表說左邊比較高右邊比較低,在這個位置附近左邊比較高右邊比較低。那如果左邊比較高右邊比較低的話,那我們要做什麼樣的事情呢?如果左邊比較高右邊比較低的話,我們就把 w 的值變大那我們就可以讓 loss 變小。如果算出來的斜率是正的,就代表說左邊比較低右邊比較高,是這個樣子的,左邊比較低右邊比較高。如果左邊比較低右邊比較高的話,那就代表我們把 w 變小了,w 往左邊移,我們可以讓 Loss 的值變小,那這個時候你就應該把 w 的值變小。那假設你連斜率是什麼都不知道的話也沒有關係,你就想像說有一個人站在這個地方,然後他左右環視一下,那這一個算微分這件事啊就是左右環視,它會知道左邊比較高還是右邊比較高,看哪邊比較低它就往比較低的地方跨出一步。

\qquad 那這一步要跨多大呢?這一步的步伐的大小取決於兩件事情,第一件事情是這個地方的斜率有多大,這個地方的斜率大,這個步伐就跨大一點;斜率小步伐就跨小一點。另外,除了斜率以外,就是除了微分這一項(微分這一項我們剛才說它就代表斜率),除了微分這一項以外還有另外一個東西會影響步伐大小,這個東西我們這邊用 η \pmb{\eta} ηηη 來表示,這個 η \pmb{\eta} ηηη 叫做 learning rate,叫做學習速率。這個 learning rate 它是怎麼來的呢?它是你自己設定的,你自己決定這個 η \pmb{\eta} ηηη 的大小,如果 η \pmb{\eta} ηηη 設大一點,那你每次參數 update 就會量大,你的學習可能就比較快;如果 η \pmb{\eta} ηηη 設小一點,那你參數的 update 就很慢,每次只會改變一點點參數的數值。那這種你在做機器學習需要自己設定的東西叫做 hyperparameters。這個我們剛剛講說機器學習的第一步就是訂一個有未知參數的 function,而這些參數這些未知的參數是機器自己找出來的。

\qquad 請說好,那你請說。(此处有人提问)好,這其實是一個好的問題,我複述一下這個問題,有同學問說為什麼 Loss 可以是負的呢?Loss 這個函數是自己定義的,所以在剛才我們的定義裡面,我們說 Loss 就是估測的值跟正確的值它的絕對值。那如果根據剛才 Loss 的定義,那它不可能是負的,但是 Loss 的這一個 function 是你自己決定的,你可以說我今天要決定一個 loss function 就是絕對值再減100,那你可能就有負的。所以我這邊這一個 curve,我這邊可能剛才忘了跟大家說明說這個 curve 並不是一個真實的 Loss,它是我隨便亂舉的一個例子。因為在今天我想要舉一個比較 generalcase,它並不是一個真實任務的 Error surface。所以這個 Loss 的這個 curve,這個 error surface 它可以是任何形狀,這邊沒有預設立場說它一定要是什麼形狀。但是確實在真實在剛才這一個如果 Loss 的定義就跟我剛才定的一樣是絕對值,那它就不可能是負值,但這個 Loss 這個 function 是你自己決定的所以它有可能是負的。好既然有同學在這邊問問題我們就在這邊停一下看大家有沒有問題想問的,然後助教以後會幫我看 Youtube 的直播,有人在直播上問問題嗎?如果有的話你就幫我唸一下,你先看好以後在唸給我聽,我們就先繼續講,我們講到一個段落再來要繼續回答大家的問題。再問一下現場同學有沒有同學想要問問題的?好沒有的話就請容我繼續講。

\qquad 好那剛才講到那裡呢?剛才講到 hyperparameter 這個東西,hyperparameter 是你自己設的,所以在機器學習的這整個過程中,你需要自己設定的這個東西就叫做 hyperparameter。那我們說我們要把 w 0 \pmb{w^0} w0w0w0 往右移一步,那這個新的位置就叫做 w 1 \pmb{w^1} w1w1w1,這一步的步伐是 η \pmb{\eta} ηηη 乘上微分的結果,那如果你要用數學式來表示它的話就是把 w 0 \pmb{w^0} w0w0w0 減掉 η \pmb{\eta} ηηη 乘上微分的結果得到 w 1 \pmb{w^1} w1w1w1

\qquad 那接下來你就是反覆進行剛才的操作,你就計算一下 w 1 \pmb{w^1} w1w1w1 这个微分的結果,然後再決定現在要把 w 1 \pmb{w^1} w1w1w1 移動多少,然後再移動到 w 2 \pmb{w^2} w2w2w2,然後你再繼續反覆做同樣的操作不斷的把 w \pmb{w} www 移動位置,最後你會停下來,什麼時候會停下來呢?往往有兩種狀況,第一種狀況是你失去耐心了,你一開始會設定說我今天在調整我的參數的時候,我在計算我的微分的時候,我最多計算幾次,你可能會設說我的上限就是設定 100 萬次,就我參數更新 100 萬次以後我就不再更新了。那至於要更新幾次,這個也是一個 hyperparameter,這個是你自己決定的,如果说 deadline 是明天,那你可能更新的次數就設少一點,如果 deadline 是下周,更新的次數就設多一點。那還有另外一種理想上的停下來的可能,是今天當我們不斷調整參數調整到一個地方它的微分的值就是這一項算出來正好是 0 的時候,如果這一項正好算出來是 00 乘上 learning rate —— η \pmb{\eta} ηηη 還是 0。所以你的參數就不會再移動位置,那假設我們是這個理想的狀況,我們把 w 0 \pmb{w^0} w0w0w0 更新到 w 1 \pmb{w^1} w1w1w1 再更新到 w 2 \pmb{w^2} w2w2w2,最後更新到 w T \pmb{w^T} wTwTwT w T \pmb{w^T} wTwTwT 卡住了也就是算出來這個微分的值是 0 了,那參數的位置就不會再更新。

\qquad 那講到這邊你可能會馬上發現說 Gradient Descent 這個方法有一個巨大的問題,這個巨大的問題在這一個例子裡面非常容易被看出來,就是我們沒有找到真正最好的解,我們沒有找到那個可以讓 Loss 最小的那個 w。在這個例子裡面把 w 設定在這個地方(最右边红色点)你可以讓 Loss 最小,但是如果 Gradient Descent 是從這個地方(小人所在位置)當作隨機初始的位置的話,也很有可能走到這裡( w T w^T wT)你的訓練就停住了,你就沒有辦法再移動 w 的位置。那這一個位置(最右边红色点)這個真的可以讓 Loss 最小的地方叫做 globalminima,而這個地方( w T w^T wT)叫做 localminima,它的左右兩邊都比這個地方的 loss 還要高一點,但是它不是整個 error surface 上面的最低點,這個東西叫做 local minima。所以常常可能會聽到有人講到 Gradient Descent 就會說 Gradient Descent 不是個好方法,這個方法會有 local minima 的問題,沒有辦法真的找到 global minima,但教科書常常這樣講,農場文常常這樣講。但這個其實只是幻覺而已,事實上假設你有做過深度學習相關的事情,假設你有自己訓練 network,自己做過 Gradient Descent 經驗的話,其實 local minima 是一個假問題,我們在做 Gradient Descent 的時候真正面對的難題不是 local minima,到底是什麼這個,我們之後會再講到,在這邊你就先接受先相信多數人的講法說 Gradient Descentlocal minima 的問題。在這個圖上在這個例子裡面顯然有 local minima 的問題,但之後會再告訴你說 Gradient Descent 真正的痛點到底是什麼。

\qquad 那剛才舉的是只有一個參數的例子而已,那我們實際上剛才的模型有兩個參數,有 wb,那有兩個參數的情況下怎麼用 Gradient Descent 呢?其實跟剛才一個參數沒有什麼不同,若一個參數你沒有問題的話,你可以很快的推廣到兩個參數。我們現在有兩個參數,那我們給它兩個參數都給它隨機的初始的值就是 w 0 \pmb{w^0} w0w0w0 b 0 \pmb{b^0} b0b0b0。然後接下來呢,你要計算 w \pmb{w} wwwLoss 的微分,你要計算 b \pmb{b} bbbLoss 的微分。計算是在 w \pmb{w} www 等於 w 0 \pmb{w^0} w0w0w0 的位置, b \pmb{b} bbb 等於 b 0 \pmb{b^0} b0b0b0 的位置,在 w \pmb{w} www 等於 w 0 \pmb{w^0} w0w0w0 的位置, b \pmb{b} bbb 等於 b 0 \pmb{b^0} b0b0b0 的位置,你要計算 w \pmb{w} www L \pmb{L} LLL 的微分,計算 b 0 \pmb{b^0} b0b0b0 L \pmb{L} LLL 的微分。計算完以後就根據我們剛才一個參數的時候的做法去更新 w \pmb{w} www b \pmb{b} bbb,把 w 0 \pmb{w^0} w0w0w0 減掉 learning rate 乘上微分的結果得到 w 1 \pmb{w^1} w1w1w1,把 b 0 \pmb{b^0} b0b0b0 減掉 learning rate 乘上微分的結果得到 b 1 \pmb{b^1} b1b1b1

\qquad 那有同學可能會問說這個微分這個要怎麼算啊?如果你不會算微分的話不用緊張,怎麼不用緊張呢?在 deep learningframework 裡面,或在我們作業一會用的 pytorch 裡面,算微分都是程式自動幫你算的,你就寫一行程式自動就把微分的值就算出來了,你就算完全不知道自己在幹嘛也還是可以把微分的值算出來。所以這邊如果你根本就不知道微分是什麼,不用擔心,這一步驟就是一行程式。這個等一下之後在作業一的時候大家可以自己體驗看看,那就是反覆同樣的步驟就不斷的更新 w \pmb{w} www b \pmb{b} bbb,然後期待最後你可以找到一個最好的 w \pmb{w} www w ∗ \pmb{w^*} www 跟最好的 b \pmb{b} bbb b ∗ \pmb{b^*} bbb

\qquad 那這邊呢就是舉一下例子跟大家看一下說,如果在這一個問題上它操作起來是什麼樣子?假設你隨便選一個初始的值在這個地方(图中最左侧黄点),那你就先計算一下 w \pmb{w} wwwL 的微分跟計算一下 b \pmb{b} bbbL 的微分。然後接下來你就要更新 w \pmb{w} www b \pmb{b} bbb,更新的方向就是 w \pmb{w} wwwL 的微分乘以 η \pmb{\eta} ηηη 再乘以一個負號, b \pmb{b} bbbL 的微分乘以 η \pmb{\eta} ηηη 再乘以一個負號。算出這個微分的值你就可以決定更新的方向,你就可以決定 w \pmb{w} www 要怎麼更新, b \pmb{b} bbb 要怎麼更新。那把 w \pmb{w} www b \pmb{b} bbb 更新的方向結合起來就是一個向量,就是這個紅色的箭頭,我們就從這個位置(左数第一个黄点)移到這個位置(左数第二个黄点)。然後再計算一次微分 ,然後你再決定要走什麼樣的方向,把這個微分的值乘上 learning rate 再乘上負號,你就知道紅色的箭頭要指向那裡,你就知道怎麼移動 w \pmb{w} www b \pmb{b} bbb 的位置,一直移動一直移動一直移動,期待最後可以找出一組不錯的 w \pmb{w} www b \pmb{b} bbb。那實際上真的用 Gradient Descent 進行一番計算以後,這個是真正的數據,我們算出來的最好的 w \pmb{w} www0.97,最好的 b \pmb{b} bbb0.1k,跟我們的猜測蠻接近的,因為 x 1 \pmb{x_1} x1x1x1 的值可能跟 y \pmb{y} yyy 很接近,所以這個 w \pmb{w} www 就設一個接近 1 的值, b \pmb{b} bbb 就設一個比較偏小的值。那 Loss 多大呢?Loss 算一下是 0.48k,也就是在 20172020 年的資料上如果使用這一個函式, b \pmb{b} bbb0.1k w \pmb{w} www0.97,那平均的誤差是 0.48k,也就是它的預測的觀看人數誤差大概是 500 人次左右。

\qquad 講到目前為止,我們就講了機器學習的三個步驟。第一個步驟寫出一個函式,這個函式裡面是有未知數的;第二個步驟,定義一個叫做 Lossfunction;第三個步驟解一個 Optimizationproblem,找到一組 w \pmb{w} www b \pmb{b} bbbLoss 最小。那 w \pmb{w} www b \pmb{b} bbb 的值剛才已經找出來的,那這組 w \pmb{w} www b \pmb{b} bbb 可以讓 Loss 小到 0.48k,但是這樣是一個讓人滿意或值得稱道的結果嗎?也許不是,為什麼?因為這三個步驟合起來啊叫做訓練,我們現在是在我們已經知道答案的資料上去計算 Loss20172020 年的資料我們已經知道啦,我們其實已經知道 20172020 年每天的觀看次數,所以其實我們現在其實只是在自 high 而已,就是假裝我們不知道隔天的觀看次數然後拿這一個函式來進行預測,發現誤差是 0.48k。但是我們真正要在意的是已經知道的觀看次數嗎?不是,我們真正要在意的是我們不知道的未來的觀看的次數是多少,所以我們接下來要做的事情是什麼呢?就是拿這個函式來真的預測一下未來的觀看次數,那這邊我們只有 2017 年到 2020 年的值,我們在 2020 年的最後一天跨年夜的時候找出了這個函式。接下來從 2021 年開始每一天我們都拿這個函式去預測隔天的觀看人次,我們就拿 2020 年的 1231 號的觀看人次去預測 2021 年元旦的觀看人次,用 2021 年元旦的觀看人次預測一下 2021 年元旦隔天 12 號的觀看人次,用 12 號的觀看人次去預測 13 號的觀看人次,每天都做這件事,一直做到 214 號,就做到情人節。然後得到平均的值,平均的誤差值是多少呢?這個是真實的數據的結果,在 2021 年沒有看過的資料上這個誤差值是我們這邊用 L' 來表示,它是 0.58,所以在有看過的資料上,在訓練資料上誤差值是比較小的,在沒有看過的資料上,在 2021 年的資料上看起來誤差值是比較大的。那我們每一天的平均誤差有 580 人左右,600 人左右。

\qquad 只是能不能夠做得更好呢?在做得更好之前我們先來分析一下結果,這個圖怎麼看呢?這個圖的橫軸是代表的是時間,所以 0 這個點,最左邊的點代表的是 202111 號,最右邊點代表的是 2021214 號,然後這個縱軸啊就是觀看的人次,這邊是用千人當作單位。紅色的線是什麼呢?紅色的線是真實的觀看人次,藍色的線是機器用這一個函式預測出來的觀看人次,你有發現很明顯的,這个藍色的線沒什麼神奇的地方,它幾乎就是紅色的線往右平移一天而已。它其實也沒做什麼特別厲害的預測,就把紅色的線往右平移一天,因為這很合理,因為我們覺得 x 1 \pmb{x_1} x1x1x1,也就是前一天的觀看人次跟隔天觀看人次的,要怎麼拿前一天的觀看人次去預測隔天的觀看人次呢?前一天觀看人次乘以 0.97 加上 0.1k,加上 100 就是隔天的觀看人次。所以你會發現說機器幾乎就是拿前一天的觀看人次來預測隔天的觀看人次,但是如果你仔細觀察這個圖你就會發現,這個真實的資料有一個很神奇的現象,它是有週期性的,它有神奇的週期性,你知道這個週期是什麼嗎?你知道它每隔七天就會有兩天特別低,兩天觀看的人特別少,那兩天是什麼日子呢?那我發現那兩天都固定是禮拜五跟禮拜六,禮拜五跟禮拜六我可以了解,就禮拜五週末,大家出去玩誰還要學機器學習,禮拜六誰還要學機器學習,那不知道為什麼禮拜天大家去學機器學習?這個我還沒有參透為什麼是這個樣子,也許跟 youtube 背後神奇的演算法有關係,比如說 youtube 都會推頻道的影片,也許 youtube 在推頻道的影片的時候它都選擇禮拜五禮拜六不推,只推禮拜天到禮拜四,可是為什麼推禮拜天到禮拜四呢?這個我也不了解,但是反正看出來的結果,我們看真實的數據就是這個樣子,每隔七天一個循環,每個禮拜五禮拜六看的人就是特別少。所以既然我們已經知道每隔七天就是一個循環,那這一個式子,這一個 model 顯然很爛,因為它只能夠看前一天。如果說每隔七天它一個循環,我們應該要看七天對不對?如果我們一個模型它是參考前七天的資料,把七天前的資料直接複製到拿來當作預測的結果,也許預測的會更準也說不定。

\qquad 所以我們就要修改一下我們的模型。通常一個模型的修改往往來自於你對這個問題的理解,也就是 Domain Knowledge,所以一開始我們對問題完全不理解的時候我們就胡亂寫一個 y 等於 b w x 1 \pmb{wx_1} wx1wx1wx1 並沒有做得特別好。接下來我們觀察了真實的數據以後得到一個結論是每隔七天有一個循環,所以我們應該要把前七天的觀看人次都列入考慮,所以我們寫了一個新的模型,這個模型長什麼樣子呢?這個模型就是 y 等於 b x j \pmb{x_j} xjxjxj x j \pmb{x_j} xjxjxj 代表什麼?這個下標 j 代表是幾天前,然後這個 j 等於 17,也就是從一天前、兩天前、一直考慮到七天前,那七天前的資料通通乘上不同的 weight,乘上不同的 w j \pmb{w_j} wjwjwj 加起來,再加上 bias 得到預測的結果。如果這個是我們的 model,那我們得到的結果是怎麼樣呢?我們在訓練資料上的 Loss0.38k,那因為這邊只考慮一天,這邊考慮七天,所以在訓練資料上你會得到比較低的 Loss。這邊考慮了比較多的資訊,在訓練資料上你應該要得到更好的更低的 Loss,這邊算出來是 0.38k。但它在沒有看過的資料上面做不做得好呢?在沒有看到的資料上有比較好是 0.49k,所以剛才只考慮一天是 0.58k 的誤差,考慮七天是 0.49k 的誤差,那這邊每一個 wb 我們都會用 Gradient Descent 算出它的最佳值。它的最佳值長什麼樣子呢?這邊 show 出來給你看,它的最佳值長這樣,當然機器的邏輯我是有點沒有辦法了解,我本來以為它會選七天前的數據,七天前的觀看人數直接複製過來,我看來它沒有這樣選就是了。它的邏輯是前一天跟你要預測的隔天的數值的關係很大,所以 w 1 ∗ \pmb{w^*_1} w1w1w10.79,那不知道為什麼它還考慮前三天,前三天是 0.12,然後前六天是 0.3,前七天是 0.18。不過它知道說如果是前兩天前四天前五天它的值會跟未來我們要預測的隔天的值是成反比的,所以 w 2 ∗ \pmb{w^*_2} w2w2w2 w 4 ∗ \pmb{w^*_4} w4w4w4 w 5 ∗ \pmb{w^*_5} w5w5w5 它們最佳的值(讓 Loss 可以在訓練資料上是 0.38k 的值)是負的,但是 w 1 ∗ \pmb{w^*_1} w1w1w1 w 3 ∗ \pmb{w^*_3} w3w3w3 w 6 ∗ \pmb{w^*_6} w6w6w6 w 7 ∗ \pmb{w^*_7} w7w7w7 是正的。我們考慮前 7 天的值,那你可能會問說能不能夠考慮更多天呢?可以,那這個輕易的改考慮更多天,本來是考慮前 7 天然後考慮 28 天會怎麼樣呢?28 天就一個月,考慮前一個月每一天的觀看人次去預測隔天的觀看人次,預測出來結果怎樣呢?訓練資料上是 0.33k,那在 2021 年的資料上,在沒有看過的資料上是 0.46k,看起來又更好一點。好 28 天,好那接下來考慮 56 天會怎麼樣呢?在訓練資料上是稍微再好一點是 0.32k,在沒看過的資料上還是 0.46k,看起來考慮更多天沒有辦法再更進步了,看來考慮天數這件事也許已經到了一個極限。好那這邊這些模型它們都是把輸入的這個 x \pmb{x} xxx,這個 x \pmb{x} xxx 還記得它叫什麼嗎?它叫做 feature,把 feature 乘上一個 weight 再加上一個 bias 就得到預測的結果這樣的模型有一個共同的名字叫做 Linear model,那我們接下來會看怎麼把 Linear model 做得更好。

猜你喜欢

转载自blog.csdn.net/m0_52650517/article/details/121567940