一言以蔽之:機器學習其實就是在找一個函式而已。
好,各位同學大家好啊,那我們就開始來上課吧。
今天要跟大家分享的東西,是整個 AI 領域最底層的那塊地基。你之後聽到的 ChatGPT、Diffusion、AI Agent,全部都是蓋在今天這堂課上面的。
但我先講一句你可能不太相信的話:機器學習沒有你想的那麼神奇。它其實就是在找一個函式而已。今天上完這堂課,你就會知道我為什麼敢這樣講。
這堂課我們分成四段:
需要的先備知識:會加減乘除,知道什麼叫「斜率」。真的就這樣。
這一版是互動的。每一個滑桿你都可以拉、每一個點都可以拖,圖會馬上重畫。請務必動手——這堂課有一半的東西是動手才會懂的。
假設你今天是一個 YouTuber。你今天下午三點,手上有一支剪到一半的影片。你在猶豫:今天要不要熬夜把它剪完?
熬夜的代價很具體喔——你明天早上八點有課,熬夜代表你明天整天是廢的,而且你這禮拜已經熬兩次了。所以這個決定不是隨便做的。
那你怎麼決定呢?你會想知道一件事:明天大概有多少人會看我的影片?如果明天一萬個人會看,那熬夜就熬了,值得。如果明天只有兩百個人,你不如去睡覺。
好,那問題來了。你要怎麼知道明天有多少人看?
講方法之前,先看資料。這是做機器學習永遠的第一步——很多人跳過這步直接開始 train,然後 train 出一堆莫名其妙的東西。下面是這個頻道三年份的「每日觀看人數」。
看上面那張圖,你會發現兩件事:
第二點先記著,我們等一下會回來算帳。這個地方之後會變成整堂課的轉折點。
好,現在回到原本的問題:明天有多少人看?你不用學機器學習,你現在馬上就可以猜一個。你會怎麼猜?
你八成會想說:「呃……大概跟今天差不多吧?」
停。你剛剛做的事情,就是機器學習。你腦中剛剛建立了一個函式:。「明天的人數」等於「今天的人數」。只是這個 model 太笨了一點,所以我們把它寫得有彈性一點:
其中 是今天的觀看數, 是我們猜的明天觀看數。 跟 是兩個我們還不知道的數字。
這種帶有未知數的函式,我們叫它 model。那 跟 這種未知數,我們叫它參數(parameter)。所謂的機器學習,其實就是讓機器自己去把 w 跟 b 找出來而已。
你可能會想說:「這樣就叫學習喔?」對,就這樣而已。ChatGPT 也是一樣的事情,只是它的 有幾千億個。原理完全一樣。
這三個步驟你今天記起來,之後每一堂課都會用到。每一堂。
第一步我們剛剛做完了:。接下來是第二步。
假設我現在隨便猜 、。這組參數好不好?你要回答「好不好」,就得有個評分標準。這個評分標準就叫 Loss。
Loss 的做法很直覺:拿這組參數去預測每一天,看你錯多少。比如說第 1 天有 1200 人看,你的 model 猜第 2 天也是 1200 人,但實際上第 2 天有 1500 人。那你這天就錯了 300。把每一天的錯誤加起來平均,就是 Loss:
是真正的答案(我們叫它 label), 是我們猜的。這裡用絕對值(叫 MAE),因為它的單位就是「平均猜錯幾個人」,很好懂。
注意一件事:Loss 是「參數」的函式,不是「資料」的函式。你餵不同的 跟 進去,會得到不同的分數。這件事很多人第一次學會搞混,你先記著——等一下有一題小測驗會考你。
好,與其用講的,不如你自己來。下面這張圖,橫軸是「今天的觀看數」,縱軸是「明天的觀看數」,每個點是真實資料裡的一天。你來調 w 跟 b,看你能把 Loss 壓到多低。而且這些資料點是可以拖的——拖拖看,你會發現 Loss 跟最佳直線都跟著動。
調了幾下,有沒有一種感覺:欸,好像永遠可以再低一點點,但你不知道還要調多久?
而且注意喔,這才兩個參數而已。那問題就來了:我總不能一組一組手動試吧?對,這就是為什麼需要第三步。
在講怎麼找之前,我們先做一件事——把 Loss 長什麼樣子畫出來。因為 跟 有兩個,我們可以畫一張等高線圖:橫軸是 w、縱軸是 b,每一個點就是一組參數,顏色越深的地方 Loss 越小,也就是參數越好。這張圖有個名字,叫 error surface(誤差曲面)。
但你要注意,畫這張圖的代價是把 120 × 120 = 14400 組參數全部算過一遍。兩個參數我還算得動。那 ChatGPT 有幾千億個參數呢?如果每個參數試 120 個值,那是 種組合。宇宙裡的原子大概 個——你把每一顆原子都拿來當電腦,從大爆炸算到現在,連零頭都算不完。
所以這條路是死的。怎麼辦呢?
好,那神奇的地方來了。我們換個想法。我們不要看整張地圖,我們只看腳下。
假設你現在人在山上,而且起大霧,你只看得到腳邊一公尺。你要走到山谷最低的地方,你會怎麼走?你會用腳去感覺一下:欸,左邊比較低。那就往左走一步。走完再感覺一次:欸,現在前面比較低。那就往前走一步。一直重複,你就會慢慢走到谷底。就這樣而已。
這個「用腳感覺哪邊比較低」,數學上就是微分(算斜率)。這整套方法就叫 gradient descent(梯度下降)。寫成式子是這樣:
learning rate 是你自己要決定的,機器不會幫你決定。這種「要人自己調」的參數,我們叫它 hyperparameter(超參數)。
下面就是那張 error surface。點圖上任何一個地方當起點,按「讓機器走下山」,你會看到它自己一步一步走到谷底。然後一定要做一件事:把 learning rate 切到 500 跟 0.01 各跑一次,你會看到兩種你之後 train 東西時天天會遇到的典型失敗。
用 learning rate = 1 跑,你會發現一件事:機器一開始衝很快,因為那邊很陡;接近谷底以後就慢下來了,因為那邊很平。它不是我們教它這樣做的,這是 gradient descent 自己就會有的行為——斜率小,步伐就自然小。
那另外兩個呢?500 是衝過頭在震盪,0.01 是慢到像沒在動。這兩種失敗你之後天天會遇到,今天先認得它們的長相。
到這邊,你已經學完機器學習最核心的骨架了。真的,就結束了。剩下的所有東西——CNN、Transformer、GPT——都只是把第一步那個 model 換掉而已。第二步跟第三步幾乎不會變。
好,那我們現在來看一下它預測得怎麼樣。機器自己找到的參數是 w = …,b = …,在沒看過的測試資料上平均猜錯 … 個人。
但光看 Loss 這個數字是不夠的,你一定要把預測結果畫出來看。這是我今天要給你最實用的一個建議。下面是測試集前 60 天,藍色是真實、橘色是預測。仔細看,有沒有覺得哪裡怪怪的?看不出來的話,把那顆開關打開。
有沒有看出來?橘色那條線,長得跟藍色那條一模一樣,只是往右邊平移了一天。
你想想看這代表什麼。這代表我們的 model 根本沒有在「預測」。它學到的策略是:「明天大概跟今天差不多」。它只是把今天的答案抄過去,然後交卷。
這個結果其實一點都不意外——因為我們的 model 就只給它看了「昨天」一個數字啊。它手上只有這一張牌,它還能怎麼打?這是機器學習裡面一個很重要的觀念:model 只能從你給它的東西裡面學。你沒給的,它變不出來。
那怎麼辦呢?
回想一下我們最前面看資料的時候,那個「一週的規律」。週末看的人多,平日看的人少。這個資訊,光看昨天一天是看不出來的。所以我們把 model 改一下——讓它一次看過去好幾天:
注意喔,我們只改了第一步。Loss 沒變,optimization 也沒變。這就是我剛剛講的:三步驟裡面,通常只有第一步在動。
下面你可以自己選要讓它看幾天。每一組都是真的在你的瀏覽器裡 train 出來的,不是預先算好的表演。
這組實驗有三段很不一樣的故事:
眼睛很利的同學可能會發現:這裡「看 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,白話文就是考題外流。上面「動手玩 ⑤」左邊那張圖,兩根長條永遠要一起看,就是這個意思。
三題,選了馬上告訴你對不對。
光看是學不會的,你一定要自己改改看。
練習 3 就是下一堂課的入口。想不出來沒關係,那正是重點。
然後有兩個很重要的教訓:model 只能從你給它的資訊裡學;training loss 低不代表厲害,一定要看沒看過的資料。
最後留一個問題給你,這也是下一堂課的主題:我們今天的 model 從頭到尾都是一條直線。加了七個 feature 以後,它變成一個高維度的平面,但本質上還是「直的」。可是這個世界很多事情不是直的啊。那,怎麼辦呢?
這個我們下一堂課再跟大家講。
以上就是我今天想跟大家分享的內容。