今天的東西,第一次聽卡住很正常。
有任何聽不懂的地方,隨時舉手打斷我。
「這個詞沒聽過」「這張圖在畫什麼」「太快了,再講一次」,都是舉手的好理由。
你卡住的地方,旁邊的人多半也卡住了。
餵進去的是一排數字。
[5.1, 3.5, 1.4, 0.2]
花瓣長度、寬度,本來就是數字。
餵進去的是一句話。
「今天天氣真好」
模型看不懂字,得先把字變成數字。
差的那一步,就是把文字變成數字。
句子有無限多種,沒辦法一句一句對應到數字。
先把句子切成一小塊一小塊,這些小塊就叫 token。
塊的種類是有限的,每一塊才能在詞表裡有自己的編號。
負責切塊的工具,就叫 tokenizer,下一站就去玩它。
輸入任意文字,切換切分方式(字元/詞/BPE),看同一句話切出不同的 token 與編號
換一種切法,同一句話就變成不同數量、不同邊界的 token。
我按過三種切法,看到同一句話的 token 數和切分邊界都不一樣。
🛠 講師畫面/各組電腦已開好 · /tokenizer
所以在模型眼中,只有 token 和它的編號。
「貓」是 3711 號、「狗」是 890 號、「桌子」是 12690 號。
只看號碼回答:哪兩個比較像?
號碼只回答「是哪個字」,沒回答「跟哪些字像」。
聽說有人把幾萬個字,搬進了同一張地圖,每個字有自己的位置。
照什麼規則排,這張地圖才有用?
想像一下:「貓」隔壁會住誰? 英文的 cat 會住哪裡? 「蘋果」的鄰居又是誰?
打一個詞去搜,切平面/立體地圖(2D/3D),調 Top K 看誰住它隔壁
有的字擠成一團、有的字離得老遠;擠在一起的字,意思好像都有關係。
我驗完了自己的三個猜想,還能用一句話說出這張地圖排位置的規則。
🛠 講師畫面/各組電腦已開好 · /embedding
規則只有一條:意思像的字,住得近。
把字變成住址的這個做法,就叫 embedding。
沒有人動手排。位置是模型在海量文字上玩「猜字遊戲」玩出來的。
能在同一種句子裡互換的字,遊戲玩久了,就會被搬到隔壁:貓和狗就是這樣變成鄰居的。
那……就能餵給上一堂的 MLP 了嗎?
MLP:上一堂教的網路,一疊會學習的神經元,把一排數字變成答案
今天早上,你們親手訓練了一顆 MLP 認 CIFAR-10。
它拿到的不是圖:一張圖先攤平成 3,072 個數字,排成一排才餵進去。
文字也剛剛變成一排數字。先弄清楚:一排數字進去,MLP 到底「看」到什麼?
把每張圖的 1,024 顆像素全部搬家,每張圖都照同一張搬家對照表,訓練和考試都是。
你,還認得嗎?
它,還學得會嗎?
「▶ 訓練」讓兩顆一樣的 MLP 同時開練;「圖片 ‹ ›」換驗證圖;點神經元看它在找的圖案(權重樣板);按「還原排列 π⁻¹」把像素搬回家
兩條 loss 曲線疊在一起,收在同一個準度,參考曲線終點 38% 對 38%;像素搬回家之後,打亂那顆神經元在找的圖案,跟原始那顆長得一樣。
我看到打亂像素那顆 MLP,學得跟原始那顆一模一樣好。
🛠 講師畫面/各組電腦已開好 · /pixel-shuffle
對 MLP,位置只是編號;把編號換掉,題目沒變。
圖的排列、句子的詞序,對這種模型都只是編號。
語意天差地遠,它卻 分不出來。
準度一分都沒掉:MLP 的設計裡,根本沒有「排列有意義」這個假設。
我們需要一個 假設順序有意義 的架構 → RNN。
RNN:一次讀一個字、把記憶往後傳的網路,下一節的主角
10 分鐘後回來,準時開始 RNN。
實際回來時間由講師現場宣布。
你腦中大概已經有答案了,可能是: 好/熱/冷
前文一多,答案立刻收斂: 熱
前文視窗(context)大小:模型能看到最後幾個 token;Temperature/Top-k 是進階旋鈕,好奇再玩
前文看得越多,押得越有把握:第一名的把握變大,其他選項縮小。
我看到前文視窗放寬後,模型把把握集中到更少的字上。
🛠 講師畫面/各組電腦已開好 · /next-token
猜下一個字靠前文,可是句子會一直變長,得把前面 記住 、一路帶著走。
每讀一個字,就更新一次記憶,再把記憶傳給下一個字。
上一步傳出來的記憶,就是下一步的輸入。
拖曳滑桿逐 token 前進,看記憶(hidden state)一列列填進格子圖;也可自己打一句丟給 GPU 上的 RNN
記憶(hidden state)一格格往後填;句子一長,最早那個 token 在「影響」列幾乎歸零。
我看到長句跑到句尾時,第一個字的資訊幾乎不見了。
🛠 講師畫面/各組電腦已開好 · /rnn-viz
越長越記不住
句子一長,前面的資訊被沖淡,長句記不住開頭。
越練越亂跳
訓練時的糾正得從句尾一站一站傳回句首,站一多,不是越傳越走樣,就是傳到沒聲音。
記憶得一站一站傳,那能不能讓每個字 直接互看 ?
與其接力傳記憶,不如讓每個字直接看所有字,這就是 attention(注意力)。
用這一招疊出來的新架構,名字就叫 Transformer。
滑過注意力格子圖,看某個字把多少注意力分給另一個字;再動 Layer(第幾層)× Head(哪一種眼光)換層換頭。
每個字直接對整句算注意力,但只看得到自己左邊(右邊還沒出生),相關的字一格就連上,沒有逐站接力。
我滑到一格,就看到某個字把注意力直接分給了相關的字。
🛠 講師畫面/各組電腦已開好 · /transformer
一個頭一次只能用一種眼光看「誰看誰」,所以 Transformer 開好幾個頭,各看各的,最後再合起來;這件事還疊了很多層,每層都有自己的一組頭。
回站上獵頭:動 Layer × Head,找一個個性最明顯的頭,跟隔壁比誰找到的頭最有戲。
沒有任何順序假設,句子在它眼中只是一袋字。
假設順序有意義,用一份記憶把前文一路帶著走。
假設每個字都能直接互看,還開好幾個頭各看各的。
切塊、住址、記憶、直接互看,
這些零件拼起來,就是你正在用的大模型。
下一堂,我們拿它來玩:LoRA、生成、RL。
token 句子先切成的小塊,模型閱讀的單位。
tokenizer 負責切塊的工具。
embedding 給每個字一個地圖上的住址,意思像的住得近。
MLP 上一堂的網路,把一排數字變成答案。
RNN 一次讀一個字,把記憶往後傳。
attention 每個字直接看所有字,決定看誰、看多重。
multi-head 好幾個頭各看各的,最後合起來。
Transformer 用 attention 疊出來的架構,大模型的骨架。
接下來這幾頁課堂上不會講,
是留給想自己深挖的你,回家慢慢看。
今天所有互動站的程式碼 · github.com/Harrychangtw/sitcon-camp-2026-ml-pt2
它對順序無感,就像 Loop 1 的詞袋牆:「故事」和「事故」看起來一樣。
attention 分不出誰前誰後,補一塊 positional embedding 把「第幾個」塞回去。
想一想:如果不塞位置資訊,把句子打亂重排,attention 會不會算出一樣的結果?
網路疊得深,訓練就亂跳;補一條 residual 給資訊一條捷徑繞過層,訓練就穩。
圖示:關掉捷徑,深層訓練亂跳;補上捷徑,就穩。
一個字的問題對上哪把鑰匙,就多讀那個字的 內容。
🛠 poloclub.github.io/transformer-explainer