第 1 講・互動版

機器學習到底在幹嘛?

一言以蔽之:機器學習其實就是在找一個函式而已。

好,各位同學大家好啊,那我們就開始來上課吧。

今天要跟大家分享的東西,是整個 AI 領域最底層的那塊地基。你之後聽到的 ChatGPT、Diffusion、AI Agent,全部都是蓋在今天這堂課上面的。

但我先講一句你可能不太相信的話:機器學習沒有你想的那麼神奇。它其實就是在找一個函式而已。今天上完這堂課,你就會知道我為什麼敢這樣講。

今天的 Roadmap

這堂課我們分成四段:

  1. 先給你一個你真的會遇到的問題,然後我們一起想辦法解它
  2. 拆解機器學習的三個步驟(這三步之後每一堂課都會再出現)
  3. 你自己動手調參數,體會一下這件事有多難
  4. 然後把工作交給機器,看它怎麼自己走下山——最後看看我們的 model 哪裡爛掉了,把它修好

需要的先備知識:會加減乘除,知道什麼叫「斜率」。真的就這樣。

這一版是互動的。每一個滑桿你都可以拉、每一個點都可以拖,圖會馬上重畫。請務必動手——這堂課有一半的東西是動手才會懂的。

先講一個問題,不要急著講方法

假設你今天是一個 YouTuber。你今天下午三點,手上有一支剪到一半的影片。你在猶豫:今天要不要熬夜把它剪完?

熬夜的代價很具體喔——你明天早上八點有課,熬夜代表你明天整天是廢的,而且你這禮拜已經熬兩次了。所以這個決定不是隨便做的。

那你怎麼決定呢?你會想知道一件事:明天大概有多少人會看我的影片?如果明天一萬個人會看,那熬夜就熬了,值得。如果明天只有兩百個人,你不如去睡覺。

好,那問題來了。你要怎麼知道明天有多少人看?

先看資料長什麼樣子

講方法之前,先看資料。這是做機器學習永遠的第一步——很多人跳過這步直接開始 train,然後 train 出一堆莫名其妙的東西。下面是這個頻道三年份的「每日觀看人數」。

動手玩 ①

看上面那張圖,你會發現兩件事:

  1. 長期來看它是往上的——頻道有在成長,還不錯
  2. 短期來看它在抖——而且不是亂抖,切到「前 28 天」看看,它有一個規律的起伏

第二點先記著,我們等一下會回來算帳。這個地方之後會變成整堂課的轉折點。

你腦中其實已經有一個 model 了

好,現在回到原本的問題:明天有多少人看?你不用學機器學習,你現在馬上就可以猜一個。你會怎麼猜?

你八成會想說:「呃……大概跟今天差不多吧?」

停。你剛剛做的事情,就是機器學習。你腦中剛剛建立了一個函式:。「明天的人數」等於「今天的人數」。只是這個 model 太笨了一點,所以我們把它寫得有彈性一點:

其中 是今天的觀看數, 是我們猜的明天觀看數。 是兩個我們還不知道的數字

這種帶有未知數的函式,我們叫它 model。那 這種未知數,我們叫它參數(parameter)。所謂的機器學習,其實就是讓機器自己去把 w 跟 b 找出來而已。

你可能會想說:「這樣就叫學習喔?」對,就這樣而已。ChatGPT 也是一樣的事情,只是它的 有幾千億個。原理完全一樣。

機器學習的三個步驟

這三個步驟你今天記起來,之後每一堂課都會用到。每一堂。

步驟
在幹嘛
白話文
1. 定義 Model
寫一個有未知參數的函式
決定要猜什麼形狀的答案
2. 定義 Loss
一個函式,用來評分參數好不好
決定怎麼打分數
3. Optimization
找出讓 Loss 最小的參數
想辦法考高分

第一步我們剛剛做完了:。接下來是第二步。

第二步:Loss —— 怎麼幫參數打分數

假設我現在隨便猜 。這組參數好不好?你要回答「好不好」,就得有個評分標準。這個評分標準就叫 Loss

Loss 的做法很直覺:拿這組參數去預測每一天,看你錯多少。比如說第 1 天有 1200 人看,你的 model 猜第 2 天也是 1200 人,但實際上第 2 天有 1500 人。那你這天就錯了 300。把每一天的錯誤加起來平均,就是 Loss:

是真正的答案(我們叫它 label), 是我們猜的。這裡用絕對值(叫 MAE),因為它的單位就是「平均猜錯幾個人」,很好懂。

注意一件事:Loss 是「參數」的函式,不是「資料」的函式。你餵不同的 進去,會得到不同的分數。這件事很多人第一次學會搞混,你先記著——等一下有一題小測驗會考你。

好,與其用講的,不如你自己來。下面這張圖,橫軸是「今天的觀看數」,縱軸是「明天的觀看數」,每個點是真實資料裡的一天。你來調 w 跟 b,看你能把 Loss 壓到多低。而且這些資料點是可以拖的——拖拖看,你會發現 Loss 跟最佳直線都跟著動。

動手玩 ②・你來當 optimizer
1.00
0
Loss = (平均猜錯 個人)  · 你目前的最佳紀錄:

調了幾下,有沒有一種感覺:欸,好像永遠可以再低一點點,但你不知道還要調多久?

而且注意喔,這才兩個參數而已。那問題就來了:我總不能一組一組手動試吧?對,這就是為什麼需要第三步。

把 Loss 畫出來看

在講怎麼找之前,我們先做一件事——把 Loss 長什麼樣子畫出來。因為 有兩個,我們可以畫一張等高線圖:橫軸是 w、縱軸是 b,每一個點就是一組參數,顏色越深的地方 Loss 越小,也就是參數越好。這張圖有個名字,叫 error surface(誤差曲面)。

但你要注意,畫這張圖的代價是把 120 × 120 = 14400 組參數全部算過一遍。兩個參數我還算得動。那 ChatGPT 有幾千億個參數呢?如果每個參數試 120 個值,那是 種組合。宇宙裡的原子大概 個——你把每一顆原子都拿來當電腦,從大爆炸算到現在,連零頭都算不完。

所以這條路是死的。怎麼辦呢?

第三步:Gradient Descent

好,那神奇的地方來了。我們換個想法。我們不要看整張地圖,我們只看腳下。

假設你現在人在山上,而且起大霧,你只看得到腳邊一公尺。你要走到山谷最低的地方,你會怎麼走?你會用腳去感覺一下:欸,左邊比較低。那就往左走一步。走完再感覺一次:欸,現在前面比較低。那就往前走一步。一直重複,你就會慢慢走到谷底。就這樣而已。

這個「用腳感覺哪邊比較低」,數學上就是微分(算斜率)。這整套方法就叫 gradient descent(梯度下降)。寫成式子是這樣:

learning rate 是你自己要決定的,機器不會幫你決定。這種「要人自己調」的參數,我們叫它 hyperparameter(超參數)

下面就是那張 error surface。點圖上任何一個地方當起點,按「讓機器走下山」,你會看到它自己一步一步走到谷底。然後一定要做一件事:把 learning rate 切到 500 跟 0.01 各跑一次,你會看到兩種你之後 train 東西時天天會遇到的典型失敗。

動手玩 ③・讓機器自己走下山
learning rate(b 的步伐):
error surface(顏色越深 Loss 越小)・點一下換起點
learning curve:Loss 隨步數的變化

用 learning rate = 1 跑,你會發現一件事:機器一開始衝很快,因為那邊很陡;接近谷底以後就慢下來了,因為那邊很平。它不是我們教它這樣做的,這是 gradient descent 自己就會有的行為——斜率小,步伐就自然小。

那另外兩個呢?500 是衝過頭在震盪,0.01 是慢到像沒在動。這兩種失敗你之後天天會遇到,今天先認得它們的長相。

到這邊,你已經學完機器學習最核心的骨架了。真的,就結束了。剩下的所有東西——CNN、Transformer、GPT——都只是把第一步那個 model 換掉而已。第二步跟第三步幾乎不會變。

但是。我們的 model 其實爛掉了

好,那我們現在來看一下它預測得怎麼樣。機器自己找到的參數是 w = ,b = ,在沒看過的測試資料上平均猜錯 個人。

但光看 Loss 這個數字是不夠的,你一定要把預測結果畫出來看。這是我今天要給你最實用的一個建議。下面是測試集前 60 天,藍色是真實、橘色是預測。仔細看,有沒有覺得哪裡怪怪的?看不出來的話,把那顆開關打開。

動手玩 ④・抓包

有沒有看出來?橘色那條線,長得跟藍色那條一模一樣,只是往右邊平移了一天。

你想想看這代表什麼。這代表我們的 model 根本沒有在「預測」。它學到的策略是:「明天大概跟今天差不多」。它只是把今天的答案抄過去,然後交卷。

這個結果其實一點都不意外——因為我們的 model 就只給它看了「昨天」一個數字啊。它手上只有這一張牌,它還能怎麼打?這是機器學習裡面一個很重要的觀念:model 只能從你給它的東西裡面學。你沒給的,它變不出來。

那怎麼辦呢?

給它更多資訊:從 1 天變成 7 天

回想一下我們最前面看資料的時候,那個「一週的規律」。週末看的人多,平日看的人少。這個資訊,光看昨天一天是看不出來的。所以我們把 model 改一下——讓它一次看過去好幾天

注意喔,我們只改了第一步。Loss 沒變,optimization 也沒變。這就是我剛剛講的:三步驟裡面,通常只有第一步在動。

下面你可以自己選要讓它看幾天。每一組都是真的在你的瀏覽器裡 train 出來的,不是預先算好的表演。

動手玩 ⑤・要看幾天?
訓練 Loss(考古題)vs 測試 Loss(沒看過的考卷)
訓練中……

這組實驗有三段很不一樣的故事:

  1. 1 天 → 3 天:幾乎沒進步,甚至還小輸。欸,多給了兩天的資訊,結果居然沒有比較好?
  2. 3 天 → 7 天:Loss 大幅下降。這是整組實驗最大的一跳——前面怎麼加都沒用,到這裡突然就通了。
  3. 7 天 → 14 天 → 28 天:只剩零頭。再加下去也就那樣了。

眼睛很利的同學可能會發現:這裡「看 1 天」的測試 Loss,跟「動手玩 ④」上面那個數字對不起來。為什麼呢?因為這組實驗多做了標準化,gradient descent 最後停的位置就不太一樣。這不是 bug——同一個 model、同一份資料,換個訓練方式,結果就是會有差。所以之後看到別人報告一個數字,要問的不只是「他用什麼 model」,還有「他怎麼 train 的」。

為什麼跳躍剛好發生在 7?因為這個頻道的規律就是一週一循環。看 3 天,你根本看不到完整的一圈,多出來的那兩天講不出任何新的事情——但 model 卻因此多了兩個參數要估。沒有帶進新資訊、卻讓 model 變複雜,測試分數就會像這樣不進反退。看滿 7 天,整個週期才第一次進到 model 眼裡。

這件事情很值得你記起來:不是資料餵越多越好,是餵「對的東西」才有用。而且這個「對的東西」是多少,往往就藏在資料本身的規律裡。

然後右邊那張權重圖,是今天最漂亮的地方。你一定要看懂它。我們從頭到尾沒有告訴機器「一週有七天」這件事。我們只是把七個數字丟給它,然後硬 train 一發。結果你看它自己學到什麼——站最高的兩根,一根是「7 天前」,一根是「1 天前」。

講到這裡,你可能會想說:「等一下,我看那張圖,『6 天前』那根也很高啊,幾乎跟『1 天前』一樣高。你怎麼只挑 1 天前講?」

你沒看錯,而且它們本來就應該差不多高。你想想看:一個禮拜是一個圈。假設我們要猜的是禮拜天的觀看數,那「7 天前」就是上一個禮拜天——整整繞完一圈,剛好對齊。而「1 天前」是禮拜六、「6 天前」是禮拜一:一個站在禮拜天的前一格,一個站在後一格,離目標一樣近,只是分在兩邊而已。所以這兩根差不多高,不是機器 train 壞掉,也不是巧合,是這個圈本來就對稱。至於「1 天前」為什麼還是稍微贏一點點——因為它多了一個「6 天前」沒有的好處:它離今天最近,所以除了週期以外,它還額外抓得到最近的趨勢。

看懂這件事,你就知道這張圖真正的重點在哪了:不是「哪兩根最高」,而是「7 天前」那一根自己站得最高。只有它是完整繞一圈、完全對齊的那一格——那才是「這份資料有一週的週期」真正的證據。

我們沒教它任何一條。它是從 800 天的數字裡自己挖出來的。這就是機器學習真正厲害的地方——你不用把規律告訴它,你只要給它足夠的資訊,加上一個評分標準,它會自己把規律挖出來。

大家最常搞錯的一件事

很多人剛開始學,會盯著 training loss 看,越低越開心。千萬不要這樣。training loss 低,只代表你的 model 把考古題背熟了。

你想想看,如果有一個學生把歷屆考題全部背起來,考古題他 100 分。那他真的懂嗎?不知道。你要給他一份沒看過的考卷,才知道他到底行不行。所以我們前面才要切出 test set——那就是那份沒看過的考卷。

這件事在 AI 領域嚴重到什麼程度?現在很多模型「號稱」在某個 benchmark 上拿到多高的分數,但那個 benchmark 的題目早就在它的訓練資料裡面了。這個問題叫做 benchmark contamination,白話文就是考題外流。上面「動手玩 ⑤」左邊那張圖,兩根長條永遠要一起看,就是這個意思。

隨堂小測驗

三題,選了馬上告訴你對不對。

換你動手:三個練習

光看是學不會的,你一定要自己改改看。

  1. 練習 1(暖身):回到「動手玩 ③」,把 learning rate 切成 500 跟 0.01 各跑一次,看 learning curve 變怎樣。兩種很典型的失敗——一種是衝過頭在震盪,一種是慢到像沒在動。
  2. 練習 2(核心):目前的 model 只用了「過去幾天的觀看數」。試著多加一個 feature:今天是星期幾。加了以後 Loss 有變好嗎?為什麼?這題要寫程式,打開 notebooks/01_機器學習就是找一個函式.ipynb 的練習區做。
  3. 練習 3(想一想,不用寫程式):我們的 model 是一條直線。假設觀看數跟「影片長度」的關係是——太短沒人看,太長也沒人看,中間剛好最好。這種倒 U 形的關係,直線 model 有辦法學會嗎?

練習 3 就是下一堂課的入口。想不出來沒關係,那正是重點。

好,那我們來複習一下今天講了什麼

  1. 機器學習就是找一個函式。有未知參數的函式叫 model,找參數的過程就叫「學習」。ChatGPT 也是同一件事,只是參數多了幾千億個而已。
  2. 三個步驟:定 model → 定 Loss → optimization。之後每一堂課都會再出現,而且通常只有第一步在換。
  3. Gradient descent 就是在大霧裡下山。看腳下哪邊低,往那邊走一步,重複。沒有更玄的東西了。

然後有兩個很重要的教訓:model 只能從你給它的資訊裡學training loss 低不代表厲害,一定要看沒看過的資料。

最後留一個問題給你,這也是下一堂課的主題:我們今天的 model 從頭到尾都是一條直線。加了七個 feature 以後,它變成一個高維度的平面,但本質上還是「直的」。可是這個世界很多事情不是直的啊。那,怎麼辦呢?

這個我們下一堂課再跟大家講。

以上就是我今天想跟大家分享的內容。