這是 Stanford CS124 導讀的第 3 週。上一週把文字切成 token、學會數次數;這一週要對整段文字下判斷:這則影評是正面還是負面?這封信是不是垃圾信?
用的模型是邏輯迴歸。投影片給了三個學它的理由:它是社會科學與醫學研究裡分析二元結果的標準工具,是監督式分類的基準模型,也是神經網路的基本單位。第 6 週的神經網路就是把很多個邏輯迴歸疊起來。
本週材料:Logistic Regression 投影片、實作課二的導引投影片、實作課二題目與解答、PA2。指定閱讀是教科書 2025 年 8 月版的第 4 章。預錄影片在 Canvas,本文依投影片與教科書整理。
分類器的四個零件
投影片把一個機器學習分類器拆成四個部分,這一週就照這個順序講:
- 特徵表示:把輸入變成一串數字 x。
- 分類函數:從 x 算出預測的機率 ŷ,這裡用 sigmoid。
- 目標函數:量預測和正確答案差多少,這裡用 cross-entropy loss。
- 最佳化演算法:調整參數讓 loss 變小,這裡用隨機梯度下降。
從文字到機率
特徵
投影片的例子是一則影評,要判斷它是正面(y = 1)還是負面(y = 0)。先人工定義六個特徵:
| 特徵 | 定義 | 這則影評的值 |
|---|---|---|
| x₁ | 正面詞出現幾個 | 3 |
| x₂ | 負面詞出現幾個 | 2 |
| x₃ | 有沒有出現「no」 | 1 |
| x₄ | 第一、二人稱代名詞出現幾個 | 3 |
| x₅ | 有沒有驚嘆號 | 0 |
| x₆ | 總詞數取自然對數 | ln(66) = 4.19 |
特徵決定了模型看得到什麼。這六個特徵完全不管詞的順序,「不好看」的「不」如果沒有被某個特徵抓到,模型就無從得知。
加權總和與 sigmoid
每個特徵有一個權重 w,另外有一個偏差項 b。先算加權總和:
z = w·x + b
假設模型已經學到這組權重:w = [2.5, −5.0, −1.2, 0.5, 2.0, 0.7],b = 0.1。權重的正負號說明這個特徵把結果往哪邊推:正面詞的權重是 2.5,往正面推;負面詞是 −5.0,往負面推,而且推得更用力。
代入這則影評:
z = 2.5×3 + (−5.0)×2 + (−1.2)×1 + 0.5×3 + 2.0×0 + 0.7×4.19 + 0.1 = 0.833
z 可以是任何實數,還不是機率。sigmoid 函數把它壓到 0 和 1 之間:
σ(z) = 1 / (1 + e⁻ᶻ)
σ(0.833) ≈ 0.70。模型認為這則影評有七成機率是正面,三成是負面。
sigmoid 的形狀是一條 S 形曲線:z = 0 時輸出 0.5,z 越大越接近 1,越小越接近 0,而且兩端會變平。實作課二給了幾個參考值:σ(2) ≈ 0.88、σ(4) ≈ 0.98。z 從 2 加到 4 多了一倍,機率只從 0.88 升到 0.98。分數已經很高的時候,再加碼對機率影響不大。
下決定
有了機率,再定一個門檻。預設是 0.5:機率超過 0.5 就判成正面。0.70 > 0.5,所以這則影評判成正面。
量錯多少:cross-entropy loss
訓練需要一個數字告訴我們預測有多差。邏輯迴歸用的是 cross-entropy loss:
L = −[ y·ln(ŷ) + (1 − y)·ln(1 − ŷ) ]
式子看起來複雜,其實 y 不是 1 就是 0,兩項裡永遠只有一項會留下來:
- 正確答案是正面(y = 1):L = −ln(ŷ),也就是「模型給正確答案的機率」取負對數。
- 正確答案是負面(y = 0):L = −ln(1 − ŷ)。
拿剛才的影評算,ŷ = 0.70:
| 正確答案 | loss | |
|---|---|---|
| 正面(y = 1) | −ln(0.70) = 0.36 | 模型猜對方向,loss 小 |
| 負面(y = 0) | −ln(0.30) = 1.20 | 模型猜錯方向,loss 大 |
負對數有一個重要的性質:模型越有把握卻猜錯,罰得越重。如果模型給正確答案的機率只有 0.01,loss 是 −ln(0.01) = 4.6;機率趨近 0 時 loss 趨近無限大。
修權重:隨機梯度下降
目標是找到讓整份訓練資料的 loss 最小的 w 和 b。做法是算出 loss 對每個權重的梯度(往哪個方向調、loss 會上升最快),然後往反方向走一小步:
w ← w − η × 梯度
η 是學習率,決定一步走多大。太大會跨過最低點,太小則學得很慢。
邏輯迴歸的梯度形式很簡單:
∂L/∂wⱼ = (ŷ − y) × xⱼ
也就是「預測值減正確答案」乘上「那個特徵的值」。預測得越離譜,(ŷ − y) 越大,修得越多;某個特徵的值是 0,它的權重這一步就不動。偏差項 b 的梯度是 (ŷ − y)。
手算一步
投影片用一個只有兩個特徵的迷你例子走了一步。一則正面影評(y = 1),x₁ = 3(正面詞數)、x₂ = 2(負面詞數)。初始權重和偏差都是 0,學習率 η = 0.1。
第一步,算預測。 z = 0×3 + 0×2 + 0 = 0,ŷ = σ(0) = 0.5。模型什麼都還沒學,所以猜一半一半。
第二步,算梯度。 ŷ − y = 0.5 − 1 = −0.5。
| 參數 | 梯度 |
|---|---|
| w₁ | −0.5 × 3 = −1.5 |
| w₂ | −0.5 × 2 = −1.0 |
| b | −0.5 |
第三步,更新。 新的值 = 舊的值 − 0.1 × 梯度。
| 參數 | 更新前 | 更新後 |
|---|---|---|
| w₁ | 0 | 0 − 0.1×(−1.5) = 0.15 |
| w₂ | 0 | 0 − 0.1×(−1.0) = 0.10 |
| b | 0 | 0 − 0.1×(−0.5) = 0.05 |
可以自己驗算有沒有變好:用新的權重再算一次,z = 0.15×3 + 0.10×2 + 0.05 = 0.70,ŷ = σ(0.70) ≈ 0.67。loss 從 −ln(0.5) = 0.69 降到 −ln(0.67) ≈ 0.40。
這個例子有一個不合直覺的地方:負面詞數的權重 w₂ 也變成正的。因為模型只看過這一則影評,而這則正面影評裡剛好有兩個負面詞,它就學到「有負面詞是正面的訊號」。只看一筆資料的更新會受那筆資料的偶然特性影響,要看過很多則正面和負面影評之後,w₂ 才會被拉成負的。
一次看幾筆
「隨機」梯度下降的意思是每次隨機挑一筆資料算梯度。另一個極端是每次看完全部資料再更新一次,方向比較準,但很慢。實務上取中間:mini-batch,每次看一小批(投影片舉的數字是 512 或 1024 筆),把這一批的梯度平均後更新。一批資料可以排成矩陣,每一列是一筆資料,用矩陣乘法一次算完,這也是第 6 週之後所有神經網路的訓練方式。
怎麼評估:為什麼不看準確率
投影片用一個例子說明準確率的問題。假設一家派店想從一百萬則貼文裡找出在談論他們的貼文,實際上只有 100 則是。一個「全部都說不是」的分類器,準確率是 99.99%,卻一則都沒找到。
類別不平衡時要改看另外兩個數字。先把結果分成四格:
| 實際是正類 | 實際是負類 | |
|---|---|---|
| 模型說是正類 | true positive(tp) | false positive(fp) |
| 模型說是負類 | false negative(fn) | true negative(tn) |
- Precision = tp ÷ (tp + fp):模型說「是」的裡面,有多少真的是。
- Recall = tp ÷ (tp + fn):真的「是」的裡面,模型找到多少。
那個全部都說不是的分類器,recall 是 0。
兩者通常此消彼長:把門檻調低,模型會抓出更多正類(recall 上升),但也會誤判更多(precision 下降)。要用一個數字總結時,用 F1,也就是兩者的調和平均:
F1 = 2 × P × R ÷ (P + R)
本文自擬一組數字:模型說 10 則是正類,其中 8 則對、2 則錯;另外有 8 則正類它沒抓到。Precision = 8/10 = 0.8,recall = 8/16 = 0.5,F1 = 2×0.8×0.5 ÷ 1.3 ≈ 0.62。調和平均會偏向比較低的那個數字,所以 F1 比算術平均 0.65 低。
類別超過兩種時(例如緊急、一般、垃圾信三類),每一類各算一組 precision 和 recall,再合併。合併有兩種方式:macroaverage 把每一類的分數直接平均,每一類的份量相同;microaverage 把所有類別的 tp、fp、fn 加總後再算,資料多的類別份量比較重。
分類器可能造成的傷害
投影片最後一節不是數學。它列了三種文字分類器已經被觀察到的問題:
- 再現刻板印象。 一份 2018 年的研究測了 200 個情感分析系統,給它們只有名字不同的句子(例如「我昨天跟 Shaniqua 聊過」與「我昨天跟 Stephanie 聊過」)。結果是,帶有常見非裔美國人名字的句子被判成比較負面。
- 過度審查。 偵測惡意言論的分類器會把只是提到少數族群身分的句子(出現 blind、gay 這類詞)誤判成惡意。後果是這些群體談論自己的貼文比較容易被移除。
- 表現落差。 分類器在資料少的語言上表現比較差,在英文的不同變體上也是。
這些問題有一部分可以回到前面的機制理解。模型學的是訓練資料裡特徵和標籤的統計關聯。如果資料裡某個名字或某個詞剛好常和負面標籤一起出現,它就會得到一個負的權重,不管兩者有沒有因果關係。邏輯迴歸的好處是權重可以直接攤開來看,這類問題比較容易被發現。
實作課二與 PA2
實作課二是分組的紙筆練習,題目和解答都公開。第一部分練 sigmoid 的直覺,例如給 z = 0.2、2、6 三個分數,要你不用計算機、只看曲線形狀排出機率大小,並回答哪兩個的機率比較接近。其中一題預告了之後會用到的「溫度」:把 z 除以一個介於 0 和 1 之間的數再丟進 sigmoid,機率會變得更極端。第 6 週講語言模型怎麼取樣時會再遇到它,第 7 週的 PA6a 會實際調這個參數。
PA2 的題目叫 Triage,就是第 1 週預告過的災難簡訊分類。在 notebook 裡依序自己寫出 sigmoid、loss、梯度下降和分類器,再做評估,最後有一組倫理題。每一步都對應上面的一節。
自我檢查
- 用影評例子那組權重,如果這則影評多一個驚嘆號(x₅ 從 0 變 1),z 變成多少?模型更傾向正面還是負面?答案:x₅ 的權重是 2.0,z 從 0.833 變成 2.833,σ(2.833) ≈ 0.94,更傾向正面。
- 模型對一則正面影評輸出 ŷ = 0.9,另一個模型輸出 ŷ = 0.1。兩者的 loss 各是多少?答案:−ln(0.9) ≈ 0.11 和 −ln(0.1) ≈ 2.30。後者是前者的二十倍以上。
- 手算例子裡,如果那則影評的正確答案是負面(y = 0),第一步更新後的 w₁ 是多少?答案:ŷ − y = 0.5 − 0 = 0.5,梯度是 0.5×3 = 1.5,w₁ = 0 − 0.1×1.5 = −0.15。方向反過來了。
- 一個垃圾信分類器把門檻從 0.5 調到 0.9,precision 和 recall 各會怎麼變?答案:要更有把握才判成垃圾信,所以判成垃圾信的更少、更準,precision 上升;漏掉的垃圾信變多,recall 下降。
這週和後面的關係
- 第 6 週的神經元就是這週的 z = w·x + b 再過一個非線性函數,差別只在中間多了幾層。
- 類別超過兩個時,sigmoid 換成 softmax,loss 仍然是「正確答案的機率取負對數」。語言模型每預測一個 token,就是做一次類別數等於詞彙表大小的分類。
- precision 和 recall 下一週會直接拿來評估搜尋結果。
系列導覽:上一篇 第 2 週:Words, Tokens, Edit Distance, and N-grams|下一篇 第 4 週:Information Retrieval
更新紀錄
- 2026-10-13:依公開投影片重寫。補上影評例子的預測與 loss 計算、一步梯度下降的手算、precision/recall/F1 的例子與自我檢查;新增投影片裡分類器傷害的一節;移除投影片沒有涵蓋的延伸內容。
參考資料
- CS124 Winter 2026 課程網站與課表
- Logistic Regression 投影片 — 分類器的四個部分、影評例子、梯度下降手算、派店例子、分類器的傷害
- 實作課二導引投影片 — 學邏輯迴歸的三個理由
- CS124 實作課二與解答
- CS124 PA2
- Speech and Language Processing 2025 年 8 月版第 4 章
Loading...