🌏 English version
影片狀態:已附影片。 這篇依 Stanford Online 公開的 Spring 2026 第 3 堂錄影的英文字幕寫成,公式記號對照 2026 主講義第 1 章 1.3 節與第 2 章;我沒看到板書與投影片畫面,所以公式的寫法以講義為準。
上一堂 把線性迴歸寫成「讓平方誤差總和最小」,但沒有回答為什麼是平方。這一堂由 Chris Ré 授課,先補上這個理由:只要假設誤差是零均值、獨立同分布的高斯雜訊,最小平方就是最大概似估計。接著把同一套做法搬到分類問題,推出邏輯斯迴歸(logistic regression),最後簡短介紹 Newton 法。整門課的位置見課程總覽 。
先備是上一堂的 J ( θ ) J(\theta) J ( θ ) 與梯度下降、常態分布的密度函數、對數與偏微分。讀完之後,你應該能自己從機率假設推出最小平方,寫出邏輯斯迴歸的對數概似與梯度,並且說得出 Newton 法為什麼步數少、卻沒有成為機器學習的主力。
先講一件會讓人困惑的事:這支影片在 YouTube 上的標題是「Weighted Least Squares」,但整堂課沒有講加權最小平方,也沒有講講義 1.4 節的局部加權線性迴歸。實際內容是下面這四段。
YouTube:Stanford CS229 Machine Learning | Spring 2026 | Lecture 3: Weighted Least Squares
這堂課的主線:一套會重複用好幾週的做法
(錄影 00:05–03:05)
Ré 開場先交代這堂要帶走的東西是一個框架,叫最大概似(maximum likelihood)。做法分三步:
寫一個機率模型,描述你認為資料是怎麼產生的。他稱之為 forward model。
把「這組參數讓觀察到的資料有多可能」寫成函數,取 log,變成一個加總。
用上一堂的梯度方法把它最大化。
線性迴歸和邏輯斯迴歸只是這套做法的兩個例子,下一堂的廣義線性模型是第三個。他也順帶說明邏輯斯迴歸的地位(01:05):
"logistic regression is the last layer of every model that you've probably interacted with."
意思是現在的文字與程式碼模型,最後一層做的事就是 softmax,也就是多類別版的邏輯斯迴歸。
線性迴歸的機率解釋:誤差從哪裡來
(錄影 03:05–23:35)
資料的產生方式
上一堂的設定不變:每筆輸入 x ( i ) ∈ R d + 1 x^{(i)} \in \mathbb{R}^{d+1} x ( i ) ∈ R d + 1 (多出來的一維固定是 1,用來吸收截距),標籤 y ( i ) ∈ R y^{(i)} \in \mathbb{R} y ( i ) ∈ R ,要找的是
θ = arg min θ 1 2 ∑ i = 1 n ( y ( i ) − θ ⊤ x ( i ) ) 2 \theta = \arg\min_\theta \frac{1}{2}\sum_{i=1}^{n}\left(y^{(i)} - \theta^\top x^{(i)}\right)^2 θ = arg θ min 2 1 i = 1 ∑ n ( y ( i ) − θ ⊤ x ( i ) ) 2
這堂課加上一個假設:世界上存在一個我們看不到的真實 θ \theta θ ,每筆標籤是它的預測加上一個誤差項。
y ( i ) = θ ⊤ x ( i ) + ϵ ( i ) y^{(i)} = \theta^\top x^{(i)} + \epsilon^{(i)} y ( i ) = θ ⊤ x ( i ) + ϵ ( i )
ϵ ( i ) \epsilon^{(i)} ϵ ( i ) 同樣看不到。Ré 給了兩種理解方式(06:06)。一種是字面上的量測雜訊,例如儀器抖動。另一種是他比較喜歡的講法:誤差是「我們決定不去建模的部分」。有些誤差來源你其實知道,只是不想把模型做到那麼細,就把它們全部收進 ϵ \epsilon ϵ 。所以問一個模型「是不是真的」沒有意義,他引了統計課必引的那句話:
"All models are wrong. Some models are useful."
對誤差的三個假設
Ré 口頭列出的假設有三個,下面的式子是我依他的敘述還原的(08:09–10:16):
零均值。 E [ ϵ ( i ) ] = 0 \mathbb{E}[\epsilon^{(i)}] = 0 E [ ϵ ( i ) ] = 0 ,誤差沒有系統性偏向。如果有,就代表資料裡藏著一個我們不知道的固定偏移,迴歸不可能找回真正的 θ \theta θ 。這個假設幾乎是不得不做的。
獨立同分布(IID)。 每個誤差彼此獨立,而且來自同一個分布。獨立的意思是期望值可以拆開:i ≠ j i \neq j i = j 時 E [ ϵ ( i ) ϵ ( j ) ] = E [ ϵ ( i ) ] E [ ϵ ( j ) ] \mathbb{E}[\epsilon^{(i)}\epsilon^{(j)}] = \mathbb{E}[\epsilon^{(i)}]\,\mathbb{E}[\epsilon^{(j)}] E [ ϵ ( i ) ϵ ( j ) ] = E [ ϵ ( i ) ] E [ ϵ ( j ) ] 。這條式子只是獨立的一個推論;完整的獨立是聯合機率可以拆成各自機率的乘積,後面寫概似函數時用的是那個版本。Ré 直說這是很強的假設,主要是為了讓後面的計算做得下去。他舉的反例是資料來自 A、B 兩個量測站,兩邊的誤差變異數不同;把兩邊資料混在一起,這個模型會直接忽略這個差別。
只管變異數。 E [ ( ϵ ( i ) ) 2 ] = σ 2 \mathbb{E}[(\epsilon^{(i)})^2] = \sigma^2 E [( ϵ ( i ) ) 2 ] = σ 2 。因為均值是零,這個量就是變異數,用來描述資料有多吵。更高階的動差(三次、四次)都不建模。
接著他說這組設定正好會導出高斯分布(11:16),理由是高斯只靠均值與變異數就能完整描述;他還補了一句,想多記幾階動差的「更好的模型」並不存在。這段話適合讀成選模型的理由:如果只打算用均值和變異數兩個量來描述雜訊,高斯就是剛好由這兩個量決定的那一族分布。
反過來的推論則不成立,這一點課堂上沒有分開講。誤差滿足零均值、IID、變異數固定,並不代表它就是高斯:均勻分布、自我檢查第 1 題的 Laplace 分布,都可以調成零均值、變異數 σ 2 \sigma^2 σ 2 。所以後面的推導還需要多一個假設,講義直接把它寫出來:ϵ ( i ) ∼ N ( 0 , σ 2 ) \epsilon^{(i)} \sim \mathcal{N}(0, \sigma^2) ϵ ( i ) ∼ N ( 0 , σ 2 ) 。本文後面照講義,把「誤差是高斯」當成第四個假設。
Ré 對這個假設的態度更值得記:不要問資料「是不是」高斯,要問高斯模型對你在意的事夠不夠好,這是程度問題。他也順口提到大數法則與中央極限定理(12:16),當作高斯常常是個不錯起點的理由,沒有展開。
高斯密度裡每一塊在做什麼
z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}(\mu, \sigma^2) z ∼ N ( μ , σ 2 ) 讀作「z z z 服從均值 μ \mu μ 、變異數 σ 2 \sigma^2 σ 2 的常態分布」,密度函數是
p ( z ) = 1 2 π σ exp ( − ( z − μ ) 2 2 σ 2 ) p(z) = \frac{1}{\sqrt{2\pi}\,\sigma}\exp\left(-\frac{(z-\mu)^2}{2\sigma^2}\right) p ( z ) = 2 π σ 1 exp ( − 2 σ 2 ( z − μ ) 2 )
Ré 把它拆成三塊(14:20–16:23):
前面的 1 2 π σ \frac{1}{\sqrt{2\pi}\sigma} 2 π σ 1 是正規化常數,讓整條曲線底下的面積等於 1。他說這是整條式子最不重要的部分,等一下取 log、求最大值時它會自己消失。
指數裡的 ( z − μ ) 2 (z-\mu)^2 ( z − μ ) 2 是到均值的距離平方。平方誤差就是從這裡進來的。
分母的 σ 2 \sigma^2 σ 2 把距離換成「幾個標準差」的單位。σ \sigma σ 接近 0 時曲線又尖又窄,σ \sigma σ 大時又扁又寬。三個標準差內涵蓋 99.7% 的機率。
有學生問高斯能不能描述不對稱或多個峰的分布(17:27)。單一高斯不行:它對均值左右對稱,只有一個峰。多個峰要用後面會教的高斯混合模型。
從誤差的分布到標籤的分布
把 ϵ ( i ) = y ( i ) − θ ⊤ x ( i ) \epsilon^{(i)} = y^{(i)} - \theta^\top x^{(i)} ϵ ( i ) = y ( i ) − θ ⊤ x ( i ) 代進去。給定 x ( i ) x^{(i)} x ( i ) 之後,θ ⊤ x ( i ) \theta^\top x^{(i)} θ ⊤ x ( i ) 是一個固定的數,y ( i ) y^{(i)} y ( i ) 只是把高斯誤差平移了這麼多,所以
y ( i ) ∣ x ( i ) ; θ ∼ N ( θ ⊤ x ( i ) , σ 2 ) y^{(i)} \mid x^{(i)};\theta \sim \mathcal{N}\left(\theta^\top x^{(i)},\ \sigma^2\right) y ( i ) ∣ x ( i ) ; θ ∼ N ( θ ⊤ x ( i ) , σ 2 )
p ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ exp ( − ( y ( i ) − θ ⊤ x ( i ) ) 2 2 σ 2 ) p\left(y^{(i)} \mid x^{(i)};\theta\right) = \frac{1}{\sqrt{2\pi}\,\sigma}\exp\left(-\frac{\left(y^{(i)}-\theta^\top x^{(i)}\right)^2}{2\sigma^2}\right) p ( y ( i ) ∣ x ( i ) ; θ ) = 2 π σ 1 exp ( − 2 σ 2 ( y ( i ) − θ ⊤ x ( i ) ) 2 )
變異數為什麼可以原封不動搬過來?Ré 特別提醒這不是自動成立的(20:31):加上一個常數只會平移分布,不改變寬度;如果模型裡是把 ϵ \epsilon ϵ 乘上 10,變異數就會變成 100 倍,得另外追蹤。
這條式子有兩個符號,後面整門課都會用:
直線 ∣ \mid ∣ 是「以什麼為條件」。x ( i ) x^{(i)} x ( i ) 是我們看得到的資料,看到它之後分布的均值就定下來了。
分號 ; ; ; 是「以什麼為參數」。θ \theta θ 不是隨機變數,不是一個可以拿來當條件的事件。每個 θ \theta θ 對應一個不同的分布,我們要做的是在這一整族分布裡挑一個。
有學生問參數不只一組怎麼辦(23:33),答案是全部列在分號後面,或者包成一個符號。
最大概似:為什麼會回到最小平方
(錄影 23:35–34:30)
概似函數
固定一個 θ \theta θ ,就能算出每筆資料在這個模型下的密度值。把 n n n 筆乘起來,得到概似函數(likelihood):
L ( θ ) = ∏ i = 1 n p ( y ( i ) ∣ x ( i ) ; θ ) L(\theta) = \prod_{i=1}^{n} p\left(y^{(i)} \mid x^{(i)};\theta\right) L ( θ ) = i = 1 ∏ n p ( y ( i ) ∣ x ( i ) ; θ )
為什麼是相乘?Ré 反問全班這裡用到哪個假設(24:36)。答案是 IID。原本要寫的是「所有 y y y 同時出現」的聯合機率,那是一個同時牽涉全部資料的巨大函數;獨立的定義就是聯合機率可以拆成各自機率的乘積。
L ( θ ) L(\theta) L ( θ ) 是給每個 θ \theta θ 打的分數。分數愈高,代表這個 θ \theta θ 愈能解釋手上的資料。最大概似原則就是挑分數最高的那個。
取 log,把連乘變成加總
每個因子都是正數,所以可以取 log。log 是嚴格遞增函數,讓 L L L 最大的 θ \theta θ 也讓 log L \log L log L 最大。好處是連乘變加總,數值上也穩定得多。記 ℓ ( θ ) = log L ( θ ) \ell(\theta) = \log L(\theta) ℓ ( θ ) = log L ( θ ) ,一步一步展開:
ℓ ( θ ) = ∑ i = 1 n log [ 1 2 π σ exp ( − ( y ( i ) − θ ⊤ x ( i ) ) 2 2 σ 2 ) ] \ell(\theta) = \sum_{i=1}^{n}\log\left[\frac{1}{\sqrt{2\pi}\,\sigma}\exp\left(-\frac{\left(y^{(i)}-\theta^\top x^{(i)}\right)^2}{2\sigma^2}\right)\right] ℓ ( θ ) = i = 1 ∑ n log [ 2 π σ 1 exp ( − 2 σ 2 ( y ( i ) − θ ⊤ x ( i ) ) 2 ) ]
log 把乘積拆成兩項相加,而 log exp ( a ) = a \log\exp(a) = a log exp ( a ) = a :
ℓ ( θ ) = ∑ i = 1 n [ log 1 2 π σ − ( y ( i ) − θ ⊤ x ( i ) ) 2 2 σ 2 ] \ell(\theta) = \sum_{i=1}^{n}\left[\log\frac{1}{\sqrt{2\pi}\,\sigma} - \frac{\left(y^{(i)}-\theta^\top x^{(i)}\right)^2}{2\sigma^2}\right] ℓ ( θ ) = i = 1 ∑ n [ log 2 π σ 1 − 2 σ 2 ( y ( i ) − θ ⊤ x ( i ) ) 2 ]
第一項跟 i i i 無關,加 n n n 次;第二項把 1 σ 2 \frac{1}{\sigma^2} σ 2 1 提出來:
ℓ ( θ ) = n log 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ i = 1 n ( y ( i ) − θ ⊤ x ( i ) ) 2 ⏟ J ( θ ) \ell(\theta) = n\log\frac{1}{\sqrt{2\pi}\,\sigma} - \frac{1}{\sigma^2}\cdot\underbrace{\frac{1}{2}\sum_{i=1}^{n}\left(y^{(i)}-\theta^\top x^{(i)}\right)^2}_{J(\theta)} ℓ ( θ ) = n log 2 π σ 1 − σ 2 1 ⋅ J ( θ ) 2 1 i = 1 ∑ n ( y ( i ) − θ ⊤ x ( i ) ) 2
第一項不含 θ \theta θ 。第二項是上一堂的 J ( θ ) J(\theta) J ( θ ) 乘上一個正的常數,前面帶負號。所以讓 ℓ ( θ ) \ell(\theta) ℓ ( θ ) 最大,就是讓 J ( θ ) J(\theta) J ( θ ) 最小。上一堂在最小化誤差,這一堂在最大化概似,差一個負號,是同一件事。
還有一個結論藏在式子裡:σ 2 \sigma^2 σ 2 只影響常數項和 J J J 前面的倍數,不影響哪個 θ \theta θ 最好。不知道 σ 2 \sigma^2 σ 2 也能解出 θ \theta θ 。
數值例子一:兩個 θ 的概似比較
以下是本文自擬的例子,不是課堂內容。用沒有截距的單一參數模型 y = θ x + ϵ y = \theta x + \epsilon y = θ x + ϵ ,三筆資料 ( x , y ) (x,y) ( x , y ) 是 ( 1 , 1 ) (1,1) ( 1 , 1 ) 、( 2 , 3 ) (2,3) ( 2 , 3 ) 、( 3 , 2 ) (3,2) ( 3 , 2 ) 。比較 θ = 1 \theta = 1 θ = 1 與 θ = 0.5 \theta = 0.5 θ = 0.5 。
殘差 y − θ x y - \theta x y − θ x J ( θ ) J(\theta) J ( θ ) ℓ ( θ ) \ell(\theta) ℓ ( θ ) ,σ = 1 \sigma=1 σ = 1 ℓ ( θ ) \ell(\theta) ℓ ( θ ) ,σ = 2 \sigma=2 σ = 2 θ = 1 \theta = 1 θ = 1 0 , 1 , − 1 0,\ 1,\ -1 0 , 1 , − 1 1 2 ( 0 + 1 + 1 ) = 1 \frac{1}{2}(0+1+1) = 1 2 1 ( 0 + 1 + 1 ) = 1 − 2.757 − 1 = − 3.757 -2.757 - 1 = -3.757 − 2.757 − 1 = − 3.757 − 4.836 − 0.25 = − 5.086 -4.836 - 0.25 = -5.086 − 4.836 − 0.25 = − 5.086 θ = 0.5 \theta = 0.5 θ = 0.5 0.5 , 2 , 0.5 0.5,\ 2,\ 0.5 0.5 , 2 , 0.5 1 2 ( 0.25 + 4 + 0.25 ) = 2.25 \frac{1}{2}(0.25+4+0.25) = 2.25 2 1 ( 0.25 + 4 + 0.25 ) = 2.25 − 2.757 − 2.25 = − 5.007 -2.757 - 2.25 = -5.007 − 2.757 − 2.25 = − 5.007 − 4.836 − 0.5625 = − 5.399 -4.836 - 0.5625 = -5.399 − 4.836 − 0.5625 = − 5.399
常數項怎麼算:σ = 1 \sigma=1 σ = 1 時 3 log 1 2 π = 3 × ( − 0.919 ) = − 2.757 3\log\frac{1}{\sqrt{2\pi}} = 3 \times (-0.919) = -2.757 3 log 2 π 1 = 3 × ( − 0.919 ) = − 2.757 ;σ = 2 \sigma=2 σ = 2 時每筆多一個 − log 2 = − 0.693 -\log 2 = -0.693 − log 2 = − 0.693 ,合計 − 4.836 -4.836 − 4.836 。
這張表說明兩件事。J J J 比較小的 θ = 1 \theta=1 θ = 1 ,對數概似也比較高。把 σ \sigma σ 從 1 換成 2,兩個數字都變了,排序沒變。這組資料真正的最佳解是 θ = ∑ x y ∑ x 2 = 13 14 ≈ 0.929 \theta = \frac{\sum x y}{\sum x^2} = \frac{13}{14} \approx 0.929 θ = ∑ x 2 ∑ x y = 14 13 ≈ 0.929 ,此時 J = 0.964 J = 0.964 J = 0.964 ,不論 σ \sigma σ 取多少它都是最大概似解。
兩個課堂問答
機率為什麼一定是正的? (28:40)高斯密度有指數函數,永遠大於 0,所以能放心取 log。離散分布可能在某些地方剛好是 0,那就得先確認定義域。Ré 的說法是:
"If you start taking logs of 0's, all bets are off."
σ 2 \sigma^2 σ 2 從哪來? (32:40)兩種做法:在模型之外先假設或估一個值;或者把 σ 2 \sigma^2 σ 2 也當成未知參數,一起做最大概似。他順勢給了一個判斷模型可不可信的標準:
"if your model is such that small changes in a parameter like that change your conclusions, you should be very nervous."
如果變異數在兩個數量級內掃過一輪,答案都一樣,那是好徵兆。這個例子裡 θ \theta θ 完全不受 σ 2 \sigma^2 σ 2 影響,是最理想的情況。
這堂課跟「加權最小平方」的關係
影片標題裡的 weighted least squares 沒有在課堂出現。最接近的一句是講 IID 時 A、B 兩個量測站的例子,Ré 只說這種情況可以建模,之後再談。
以下是本文的補充,不是課堂內容。把上面的推導改一個地方:誤差仍然彼此獨立、仍是零均值的高斯,但每筆資料有自己的變異數 σ i 2 \sigma_i^2 σ i 2 ,而且這些 σ i 2 \sigma_i^2 σ i 2 是已知的。這時每筆的密度變成 1 2 π σ i exp ( − ( y ( i ) − θ ⊤ x ( i ) ) 2 2 σ i 2 ) \frac{1}{\sqrt{2\pi}\,\sigma_i}\exp\left(-\frac{(y^{(i)}-\theta^\top x^{(i)})^2}{2\sigma_i^2}\right) 2 π σ i 1 exp ( − 2 σ i 2 ( y ( i ) − θ ⊤ x ( i ) ) 2 ) ,取 log 加總之後,正規化常數那一項照樣不含 θ \theta θ ,但 1 σ i 2 \frac{1}{\sigma_i^2} σ i 2 1 提不出加總符號,對數概似裡跟 θ \theta θ 有關的部分變成
− 1 2 ∑ i = 1 n 1 σ i 2 ( y ( i ) − θ ⊤ x ( i ) ) 2 -\frac{1}{2}\sum_{i=1}^{n}\frac{1}{\sigma_i^2}\left(y^{(i)}-\theta^\top x^{(i)}\right)^2 − 2 1 i = 1 ∑ n σ i 2 1 ( y ( i ) − θ ⊤ x ( i ) ) 2
每筆平方誤差前面多了權重 1 σ i 2 \frac{1}{\sigma_i^2} σ i 2 1 :愈吵的資料點權重愈低。這就是加權最小平方。講義 1.4 節的局部加權線性迴歸也是在平方誤差前面乘權重,但那裡的權重由「離查詢點多遠」決定,跟雜訊大小無關。兩者這堂都沒教。
分類:為什麼不直接拿最小平方來用
(錄影 34:30–37:44)
接下來標籤換成 y ( i ) ∈ { 0 , 1 } y^{(i)} \in \{0, 1\} y ( i ) ∈ { 0 , 1 } ,例如是不是貓。第一個該問的問題是:把 0 和 1 當成數字,直接跑最小平方,行不行?
Ré 當場畫了一張圖:沿著 x x x 軸走,先是一群標成 0 的點,再過去是一群標成 1 的點。分類只在乎兩群之間的分界在哪。但最小平方在乎每一點離直線多遠,所以遠處的點會把直線拉過去。他的說法是最小平方在找資料的「質心」,而分類要的是決策邊界,兩者目標不同。
數值例子二:一個遠處的點把分界拉歪
以下是本文自擬的例子。六筆一維資料:x = 1 , 2 , 3 x = 1, 2, 3 x = 1 , 2 , 3 標 0,x = 4 , 5 , 6 x = 4, 5, 6 x = 4 , 5 , 6 標 1。用最小平方配一條直線 h ( x ) = θ 0 + θ 1 x h(x) = \theta_0 + \theta_1 x h ( x ) = θ 0 + θ 1 x ,以 h ( x ) ≥ 0.5 h(x) \ge 0.5 h ( x ) ≥ 0.5 判為 1。
x ˉ = 3.5 \bar{x} = 3.5 x ˉ = 3.5 ,y ˉ = 0.5 \bar{y} = 0.5 y ˉ = 0.5 ,∑ ( x − x ˉ ) 2 = 17.5 \sum (x-\bar{x})^2 = 17.5 ∑ ( x − x ˉ ) 2 = 17.5 ,∑ ( x − x ˉ ) ( y − y ˉ ) = 4.5 \sum (x-\bar{x})(y-\bar{y}) = 4.5 ∑ ( x − x ˉ ) ( y − y ˉ ) = 4.5 ,所以 θ 1 = 4.5 / 17.5 = 0.2571 \theta_1 = 4.5 / 17.5 = 0.2571 θ 1 = 4.5/17.5 = 0.2571 ,θ 0 = 0.5 − 0.2571 × 3.5 = − 0.4 \theta_0 = 0.5 - 0.2571 \times 3.5 = -0.4 θ 0 = 0.5 − 0.2571 × 3.5 = − 0.4 。h ( x ) = 0.5 h(x) = 0.5 h ( x ) = 0.5 的位置是 x = 3.5 x = 3.5 x = 3.5 ,剛好在兩群正中間,六筆全對。
現在多加一筆 x = − 23 x = -23 x = − 23 、標籤 0。它離分界很遠,是一個毫無疑問的負例,照理不該影響分界。重新配適得到 θ 0 = 0.4359 \theta_0 = 0.4359 θ 0 = 0.4359 、θ 1 = 0.0256 \theta_1 = 0.0256 θ 1 = 0.0256 ,分界移到 x = ( 0.5 − 0.4359 ) / 0.0256 ≈ 2.50 x = (0.5 - 0.4359)/0.0256 \approx 2.50 x = ( 0.5 − 0.4359 ) /0.0256 ≈ 2.50 。於是 x = 3 x = 3 x = 3 的預測值變成 0.4359 + 0.0256 × 3 = 0.513 0.4359 + 0.0256 \times 3 = 0.513 0.4359 + 0.0256 × 3 = 0.513 ,被判成 1,錯了。
新加的那個點本身被分對了(預測值 − 0.153 -0.153 − 0.153 ),卻讓原本分對的點變成分錯。直線為了靠近遠處那個點而放平,分界跟著移動。
但它比你想的常常有效
Ré 沒有把話說死(36:42):
"least squares will work more often than you think."
他的理由是高維資料的行為跟低維的直覺不一樣,例如最近的點和最遠的點距離常常差不多,所以一個看起來不合適的模型有時也夠用。不過還有一個型別上的問題:答案只有是或否,模型卻可能輸出 7 或 −40,你得在外面另寫程式把它轉成 0 或 1。比較乾淨的做法是讓模型的輸出本來就落在 0 到 1 之間。
邏輯斯迴歸:把線性分數壓進 0 到 1
(錄影 37:44–47:58)
sigmoid 與機率解讀
假設函數保留線性的部分,外面再包一層非線性函數 g g g :
h θ ( x ) = g ( θ ⊤ x ) , g ( z ) = 1 1 + e − z h_\theta(x) = g(\theta^\top x), \qquad g(z) = \frac{1}{1+e^{-z}} h θ ( x ) = g ( θ ⊤ x ) , g ( z ) = 1 + e − z 1
g g g 叫 logistic 函數或 sigmoid 函數(公式取自講義,課堂上是看圖)。Ré 先問大家希望 g g g 有什麼性質:單調遞增,分數愈高輸出愈大;平滑。那為什麼不用階梯函數,過了門檻直接跳到 1?因為它不可微,數學上不方便。他補充可微並不是硬性條件,ReLU 這類函數也不是處處可微,只是這堂先用最好處理的這一個。
幾個數字感受一下:g ( 0 ) = 0.5 g(0) = 0.5 g ( 0 ) = 0.5 ,g ( 2 ) = 0.881 g(2) = 0.881 g ( 2 ) = 0.881 ,g ( − 2 ) = 0.119 g(-2) = 0.119 g ( − 2 ) = 0.119 ,g ( 100 ) g(100) g ( 100 ) 已經非常接近 1 但永遠不會剛好等於 1。θ ⊤ x \theta^\top x θ ⊤ x 這個還沒壓縮的分數,常被稱為 logit。
輸出的解讀也跟著改變。之前模型預測一個數值,現在它預測的是機率:
P ( y = 1 ∣ x ; θ ) = h θ ( x ) , P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P(y=1 \mid x;\theta) = h_\theta(x), \qquad P(y=0 \mid x;\theta) = 1 - h_\theta(x) P ( y = 1 ∣ x ; θ ) = h θ ( x ) , P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x )
一個用詞上的提醒:Ré 把 g g g 叫做 link function。講義第 3 章把 g g g 叫 response function,它的反函數 g − 1 g^{-1} g − 1 才叫 link function,並註明很多教科書的叫法剛好相反。讀到這兩個詞時先確認對方指的是哪個方向。
寫出概似
兩條機率式子可以合併成一條:
p ( y ∣ x ; θ ) = ( h θ ( x ) ) y ( 1 − h θ ( x ) ) 1 − y p(y \mid x;\theta) = \left(h_\theta(x)\right)^{y}\left(1-h_\theta(x)\right)^{1-y} p ( y ∣ x ; θ ) = ( h θ ( x ) ) y ( 1 − h θ ( x ) ) 1 − y
Ré 說這只是用指數寫的 if-then(41:53)。代 y = 1 y=1 y = 1 :第二個因子的指數是 0,變成 1,剩下 h θ ( x ) h_\theta(x) h θ ( x ) 。代 y = 0 y=0 y = 0 :第一個因子變成 1,剩下 1 − h θ ( x ) 1-h_\theta(x) 1 − h θ ( x ) 。
接下來完全照前面的流程。假設各筆資料獨立,概似是連乘:
L ( θ ) = ∏ i = 1 n ( h θ ( x ( i ) ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta) = \prod_{i=1}^{n}\left(h_\theta(x^{(i)})\right)^{y^{(i)}}\left(1-h_\theta(x^{(i)})\right)^{1-y^{(i)}} L ( θ ) = i = 1 ∏ n ( h θ ( x ( i ) ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i )
取 log,指數掉下來變成係數:
ℓ ( θ ) = ∑ i = 1 n [ y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] \ell(\theta) = \sum_{i=1}^{n}\left[y^{(i)}\log h_\theta(x^{(i)}) + \left(1-y^{(i)}\right)\log\left(1-h_\theta(x^{(i)})\right)\right] ℓ ( θ ) = i = 1 ∑ n [ y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ]
這是講義的式 (2.1)。它是一個對資料點的加總,所以上一堂的梯度下降、隨機梯度下降、小批次都能直接套用。有學生指出這裡是求最大值,應該叫梯度上升(43:56),Ré 同意:更新式的符號從減號改成加號,或者等價地對 − ℓ ( θ ) -\ell(\theta) − ℓ ( θ ) 做梯度下降。
梯度推導
課堂上這一段 Ré 只放了投影片,說是純代數,請大家課後自己做(44:56)。這裡照講義第 2.1 節把它走完。
先算 sigmoid 的導數。把 g ( z ) = ( 1 + e − z ) − 1 g(z) = (1+e^{-z})^{-1} g ( z ) = ( 1 + e − z ) − 1 用連鎖律微分:
g ′ ( z ) = e − z ( 1 + e − z ) 2 = 1 1 + e − z ⋅ e − z 1 + e − z = g ( z ) ( 1 − g ( z ) ) g'(z) = \frac{e^{-z}}{(1+e^{-z})^2} = \frac{1}{1+e^{-z}}\cdot\frac{e^{-z}}{1+e^{-z}} = g(z)\left(1-g(z)\right) g ′ ( z ) = ( 1 + e − z ) 2 e − z = 1 + e − z 1 ⋅ 1 + e − z e − z = g ( z ) ( 1 − g ( z ) )
最後一步用到 e − z 1 + e − z = 1 − 1 1 + e − z \frac{e^{-z}}{1+e^{-z}} = 1 - \frac{1}{1+e^{-z}} 1 + e − z e − z = 1 − 1 + e − z 1 。
再看單一筆資料 ( x , y ) (x, y) ( x , y ) 的對數概似,記 z = θ ⊤ x z = \theta^\top x z = θ ⊤ x 。對 θ j \theta_j θ j 微分,連鎖律有三層:log 的導數、g g g 的導數、z z z 對 θ j \theta_j θ j 的導數 x j x_j x j 。
∂ ℓ ∂ θ j = ( y g ( z ) − 1 − y 1 − g ( z ) ) g ( z ) ( 1 − g ( z ) ) x j \frac{\partial \ell}{\partial \theta_j} = \left(\frac{y}{g(z)} - \frac{1-y}{1-g(z)}\right) g(z)\left(1-g(z)\right) x_j ∂ θ j ∂ ℓ = ( g ( z ) y − 1 − g ( z ) 1 − y ) g ( z ) ( 1 − g ( z ) ) x j
把 g ( z ) ( 1 − g ( z ) ) g(z)(1-g(z)) g ( z ) ( 1 − g ( z )) 乘進括號,兩個分母各消掉一個因子:
∂ ℓ ∂ θ j = ( y ( 1 − g ( z ) ) − ( 1 − y ) g ( z ) ) x j \frac{\partial \ell}{\partial \theta_j} = \Big(y\left(1-g(z)\right) - (1-y)\,g(z)\Big)\, x_j ∂ θ j ∂ ℓ = ( y ( 1 − g ( z ) ) − ( 1 − y ) g ( z ) ) x j
展開括號,− y g ( z ) -y\,g(z) − y g ( z ) 和 + y g ( z ) +y\,g(z) + y g ( z ) 抵銷:
∂ ℓ ∂ θ j = ( y − h θ ( x ) ) x j \frac{\partial \ell}{\partial \theta_j} = \left(y - h_\theta(x)\right) x_j ∂ θ j ∂ ℓ = ( y − h θ ( x ) ) x j
這是講義的式 (2.2)。隨機梯度上升的更新式就是
θ j : = θ j + α ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) \theta_j := \theta_j + \alpha\left(y^{(i)} - h_\theta(x^{(i)})\right)x_j^{(i)} θ j := θ j + α ( y ( i ) − h θ ( x ( i ) ) ) x j ( i )
上一堂線性迴歸只看一筆資料時的更新式是 θ j : = θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha\left(h_\theta(x^{(i)}) - y^{(i)}\right)x_j^{(i)} θ j := θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) (講義稱為 LMS 規則),把負號乘進括號就是同一條式子。兩者外觀一模一樣:先預測,看差多少,再往這筆資料 x x x 的方向修正。差別只在 h θ h_\theta h θ 現在包了一層 sigmoid。Ré 說這個「誤差乘輸入」的形式並不明顯,卻是通則,這門課前段幾乎所有模型都長這樣,原因下一堂講廣義線性模型時會解釋。
數值例子三:走一步隨機梯度上升
以下是本文自擬的例子。取 θ = ( − 1 , 1 ) \theta = (-1, 1) θ = ( − 1 , 1 ) ,一筆資料 x = ( 1 , 2 ) x = (1, 2) x = ( 1 , 2 ) (第一維是固定的 1),學習率 α = 0.1 \alpha = 0.1 α = 0.1 。
z = − 1 × 1 + 1 × 2 = 1 z = -1 \times 1 + 1 \times 2 = 1 z = − 1 × 1 + 1 × 2 = 1 ,h = g ( 1 ) = 0.731 h = g(1) = 0.731 h = g ( 1 ) = 0.731 。模型認為這筆有 73.1% 的機率是正例。
這筆的對數概似 誤差 y − h y - h y − h 梯度 ( y − h ) x (y-h)\,x ( y − h ) x 更新後的 θ \theta θ 新的 h h h 真實標籤 y = 1 y = 1 y = 1 log 0.731 = − 0.313 \log 0.731 = -0.313 log 0.731 = − 0.313 0.269 0.269 0.269 ( 0.269 , 0.538 ) (0.269,\ 0.538) ( 0.269 , 0.538 ) ( − 0.973 , 1.054 ) (-0.973,\ 1.054) ( − 0.973 , 1.054 ) g ( 1.134 ) = 0.757 g(1.134) = 0.757 g ( 1.134 ) = 0.757 真實標籤 y = 0 y = 0 y = 0 log 0.269 = − 1.313 \log 0.269 = -1.313 log 0.269 = − 1.313 − 0.731 -0.731 − 0.731 ( − 0.731 , − 1.462 ) (-0.731,\ -1.462) ( − 0.731 , − 1.462 ) ( − 1.073 , 0.854 ) (-1.073,\ 0.854) ( − 1.073 , 0.854 ) g ( 0.634 ) = 0.654 g(0.634) = 0.654 g ( 0.634 ) = 0.654
猜對方向的時候(y = 1 y=1 y = 1 ),誤差小,參數只微調,機率從 0.731 升到 0.757。猜錯的時候(y = 0 y=0 y = 0 ),對數概似低了 1,誤差大了將近三倍,修正幅度也大,機率從 0.731 降到 0.654。更新量自動跟「錯多少」成正比,不需要另外設計規則。
這也回答了例子二的問題(本文補充)。假設邏輯斯迴歸已經學到 θ = ( − 7 , 2 ) \theta = (-7, 2) θ = ( − 7 , 2 ) ,分界在 x = 3.5 x = 3.5 x = 3.5 。那個遠在 x = − 23 x = -23 x = − 23 的負例,z = − 7 + 2 × ( − 23 ) = − 53 z = -7 + 2 \times (-23) = -53 z = − 7 + 2 × ( − 23 ) = − 53 ,h = g ( − 53 ) ≈ 10 − 23 h = g(-53) \approx 10^{-23} h = g ( − 53 ) ≈ 1 0 − 23 ,誤差 y − h y - h y − h 幾乎是 0,乘上 x x x 之後梯度仍然小到可以忽略。已經分對而且分得很有把握的點,對參數幾乎不出力;最小平方則因為它離直線遠而用力把線拉過去。
Newton 法:另一種求解方式
(錄影 47:58–1:02:14)
邏輯斯迴歸在 PyTorch 之前的年代
進入 Newton 法之前,Ré 講了一段歷史(47:58)。在 PyTorch、TensorFlow、JAX 出現之前,邏輯斯迴歸是機器學習最常用的模型,做法是把輸入特徵擴充到非常高的維度再丟進去。這個問題是凸的(他說課堂上不證),所以找得到最佳的 θ \theta θ 。
他也接回前面 σ 2 \sigma^2 σ 2 的話題:以前的人看到兩種求解程序給出兩個不同的 θ \theta θ 會很不安。後來機器學習領域想通了,真正在意的不是 θ \theta θ 本身,是 h θ h_\theta h θ 做出來的預測,所以現在談穩定性多半是看預測。Newton 法出自在意參數本身的那個傳統,他說介紹它主要是因為它在歷史上很重要。
一維的推導
Newton 法解的問題是:給一個函數 f f f ,找 f ( θ ) = 0 f(\theta) = 0 f ( θ ) = 0 的地方。用在最大概似時,取 f = ℓ ′ f = \ell' f = ℓ ′ ,因為最大值發生在導數為零的地方。
從猜測 θ 0 \theta_0 θ 0 出發,在這一點用切線近似 f f f ,也就是一階泰勒展開:
t ( θ ) = f ( θ 0 ) + f ′ ( θ 0 ) ( θ − θ 0 ) t(\theta) = f(\theta_0) + f'(\theta_0)\,(\theta - \theta_0) t ( θ ) = f ( θ 0 ) + f ′ ( θ 0 ) ( θ − θ 0 )
我們不知道 f f f 的零點在哪,但切線的零點算得出來。令 t ( θ ) = 0 t(\theta) = 0 t ( θ ) = 0 ,移項:
θ − θ 0 = − f ( θ 0 ) f ′ ( θ 0 ) ⟹ θ 1 = θ 0 − f ( θ 0 ) f ′ ( θ 0 ) \theta - \theta_0 = -\frac{f(\theta_0)}{f'(\theta_0)} \quad\Longrightarrow\quad \theta_1 = \theta_0 - \frac{f(\theta_0)}{f'(\theta_0)} θ − θ 0 = − f ′ ( θ 0 ) f ( θ 0 ) ⟹ θ 1 = θ 0 − f ′ ( θ 0 ) f ( θ 0 )
把 θ 1 \theta_1 θ 1 當成新的猜測,重複。代入 f = ℓ ′ f = \ell' f = ℓ ′ ,更新式是
θ : = θ − ℓ ′ ( θ ) ℓ ′ ′ ( θ ) \theta := \theta - \frac{\ell'(\theta)}{\ell''(\theta)} θ := θ − ℓ ′′ ( θ ) ℓ ′ ( θ )
Ré 強調它和梯度下降的差別(51:00):梯度下降只知道方向,走多遠要靠你給的學習率;Newton 法的切線直接告訴你走多遠。
"This is telling me exactly how far to go. So it doesn't have a step size."
多維:Hessian
θ \theta θ 是向量時,f = ∇ θ ℓ f = \nabla_\theta \ell f = ∇ θ ℓ 是一個從 R d + 1 \mathbb{R}^{d+1} R d + 1 到 R d + 1 \mathbb{R}^{d+1} R d + 1 的函數,它的導數是二階偏導數排成的方陣,叫 Hessian:
H j k = ∂ 2 ℓ ( θ ) ∂ θ j ∂ θ k , θ : = θ − H − 1 ∇ θ ℓ ( θ ) H_{jk} = \frac{\partial^2 \ell(\theta)}{\partial\theta_j\,\partial\theta_k}, \qquad \theta := \theta - H^{-1}\nabla_\theta \ell(\theta) H j k = ∂ θ j ∂ θ k ∂ 2 ℓ ( θ ) , θ := θ − H − 1 ∇ θ ℓ ( θ )
一維的「除以 ℓ ′ ′ \ell'' ℓ ′′ 」變成「乘上 H − 1 H^{-1} H − 1 」。
課堂上還岔出去談了一個更一般的情況(53:02–55:03):如果 f f f 只輸出一個純量、θ \theta θ 卻有 d d d 維,令切線為零只給你一條方程式,未知數有 d d d 個,解有無限多。這時用的是 Moore–Penrose 虛反矩陣(pseudo-inverse)。Ré 接著問方程式比未知數多的情況怎麼辦,學生答對了:做最小平方,跟上一堂是同一個演算法。這段跟邏輯斯迴歸沒有直接關係,邏輯斯迴歸的 Hessian 是方陣。
以下是本文的補充。邏輯斯迴歸的 Hessian 可以從梯度再微分一次得到。∂ ℓ ∂ θ j = ∑ i ( y ( i ) − h ( i ) ) x j ( i ) \frac{\partial \ell}{\partial\theta_j} = \sum_i (y^{(i)} - h^{(i)})\,x_j^{(i)} ∂ θ j ∂ ℓ = ∑ i ( y ( i ) − h ( i ) ) x j ( i ) 裡只有 h ( i ) = g ( θ ⊤ x ( i ) ) h^{(i)} = g(\theta^\top x^{(i)}) h ( i ) = g ( θ ⊤ x ( i ) ) 含 θ \theta θ ,用 g ′ = g ( 1 − g ) g' = g(1-g) g ′ = g ( 1 − g ) :
H j k = − ∑ i = 1 n h ( i ) ( 1 − h ( i ) ) x j ( i ) x k ( i ) H_{jk} = -\sum_{i=1}^{n} h^{(i)}\left(1-h^{(i)}\right)x_j^{(i)}x_k^{(i)} H j k = − i = 1 ∑ n h ( i ) ( 1 − h ( i ) ) x j ( i ) x k ( i )
寫成矩陣是 H = − ∑ i h ( i ) ( 1 − h ( i ) ) x ( i ) x ( i ) ⊤ H = -\sum_i h^{(i)}(1-h^{(i)})\,x^{(i)}x^{(i)\top} H = − ∑ i h ( i ) ( 1 − h ( i ) ) x ( i ) x ( i ) ⊤ ,每筆資料貢獻一個 ( d + 1 ) × ( d + 1 ) (d+1)\times(d+1) ( d + 1 ) × ( d + 1 ) 的矩陣。要判斷彎曲的方向,拿任意向量 v v v 從兩邊夾住它:
v ⊤ H v = − ∑ i = 1 n h ( i ) ( 1 − h ( i ) ) ( v ⊤ x ( i ) ) 2 ≤ 0 v^\top H v = -\sum_{i=1}^{n} h^{(i)}\left(1-h^{(i)}\right)\left(v^\top x^{(i)}\right)^2 \le 0 v ⊤ H v = − i = 1 ∑ n h ( i ) ( 1 − h ( i ) ) ( v ⊤ x ( i ) ) 2 ≤ 0
係數 h ( 1 − h ) h(1-h) h ( 1 − h ) 永遠是正的,平方項不會是負的,所以不管往哪個方向看,ℓ \ell ℓ 都是往下彎的,也就是凹函數,沒有局部最大值的陷阱。ℓ \ell ℓ 是凹的等於 − ℓ -\ell − ℓ 是凸的,Ré 說的「底下是凸的」指的就是這件事。
數值例子四:Newton 法對上梯度上升
以下是本文自擬的例子。四筆資料都只有截距項(x = 1 x = 1 x = 1 ),三筆標 1、一筆標 0,模型只有一個參數 θ \theta θ ,預測機率是 g ( θ ) g(\theta) g ( θ ) 。
ℓ ( θ ) = 3 log g ( θ ) + log ( 1 − g ( θ ) ) , ℓ ′ ( θ ) = 3 ( 1 − g ) − g = 3 − 4 g ( θ ) , ℓ ′ ′ ( θ ) = − 4 g ( θ ) ( 1 − g ( θ ) ) \ell(\theta) = 3\log g(\theta) + \log\left(1-g(\theta)\right), \quad \ell'(\theta) = 3\left(1-g\right) - g = 3 - 4g(\theta), \quad \ell''(\theta) = -4\,g(\theta)\left(1-g(\theta)\right) ℓ ( θ ) = 3 log g ( θ ) + log ( 1 − g ( θ ) ) , ℓ ′ ( θ ) = 3 ( 1 − g ) − g = 3 − 4 g ( θ ) , ℓ ′′ ( θ ) = − 4 g ( θ ) ( 1 − g ( θ ) )
令 ℓ ′ = 0 \ell' = 0 ℓ ′ = 0 得 g ( θ ) = 0.75 g(\theta) = 0.75 g ( θ ) = 0.75 ,也就是模型的機率等於資料中正例的比例,θ ∗ = ln 3 = 1.098612 \theta^\ast = \ln 3 = 1.098612 θ ∗ = ln 3 = 1.098612 。這題有解析解,正好拿來量誤差。
從 θ = 0 \theta = 0 θ = 0 開始跑 Newton 法:
步數 θ \theta θ g ( θ ) g(\theta) g ( θ ) ℓ ′ \ell' ℓ ′ ℓ ′ ′ \ell'' ℓ ′′ 與 ln 3 \ln 3 ln 3 的差 0 0 0 0 0.5 0.5 0.5 1 1 1 − 1 -1 − 1 1.10 1.10 1.10 1 1 1 1 0.7311 0.7311 0.7311 0.0758 0.0758 0.0758 − 0.7864 -0.7864 − 0.7864 9.9 × 10 − 2 9.9\times10^{-2} 9.9 × 1 0 − 2 2 1.096339 1.096339 1.096339 0.7496 0.7496 0.7496 0.0017 0.0017 0.0017 − 0.7509 -0.7509 − 0.7509 2.3 × 10 − 3 2.3\times10^{-3} 2.3 × 1 0 − 3 3 1.098611 1.098611 1.098611 0.7500 0.7500 0.7500 9.7 × 10 − 7 9.7\times10^{-7} 9.7 × 1 0 − 7 − 0.7500 -0.7500 − 0.7500 1.3 × 10 − 6 1.3\times10^{-6} 1.3 × 1 0 − 6 4 1.098612 1.098612 1.098612 0.7500 0.7500 0.7500 4 × 10 − 13 4\times10^{-13} 4 × 1 0 − 13
第一步怎麼算:θ 1 = 0 − 1 − 1 = 1 \theta_1 = 0 - \frac{1}{-1} = 1 θ 1 = 0 − − 1 1 = 1 。第二步:θ 2 = 1 − 0.0758 − 0.7864 = 1.0963 \theta_2 = 1 - \frac{0.0758}{-0.7864} = 1.0963 θ 2 = 1 − − 0.7864 0.0758 = 1.0963 。
同一題用梯度上升、學習率 0.1:第 1 步到 0.1 0.1 0.1 ,第 10 步到 0.657 0.657 0.657 ,第 100 步誤差還有 3.5 × 10 − 4 3.5\times10^{-4} 3.5 × 1 0 − 4 ,第 200 步才到 1.5 × 10 − 7 1.5\times10^{-7} 1.5 × 1 0 − 7 。Newton 法三步就到 10 − 6 10^{-6} 1 0 − 6 ,而且每一步正確的位數大約翻倍。這就是 Ré 說的(55:03):
"it gives you many digits of precision every time it runs."
那為什麼大家還是用 SGD
答案是每一步的價錢(55:03–57:05)。n n n 是資料筆數,d d d 是參數維度。下表是 Ré 給的每步計算量;梯度下降那一列他只說要看過全部資料,O ( n d ) O(nd) O ( n d ) 是本文照同樣的算法補上的:
方法 每步計算量 特性 SGD O ( d ) O(d) O ( d ) 只看一筆,方向估得很粗,要走很多步 小批次 SGD O ( B d ) O(Bd) O ( B d ) 看 B B B 筆,方向好一些 梯度下降 O ( n d ) O(nd) O ( n d ) 算出真正的梯度,但要掃過全部資料 Newton 法 O ( n d 2 + d 3 ) O(nd^2 + d^3) O ( n d 2 + d 3 ) 步數很少,每步極貴
n d 2 nd^2 n d 2 是組出 Hessian 的成本:照上面的公式,n n n 筆資料各貢獻一個 d × d d\times d d × d 矩陣。d 3 d^3 d 3 是解那個 d × d d\times d d × d 線性系統的成本,Ré 說它來自求反矩陣。
機器學習關心的是 n n n 和 d d d 都極大的情況。Ré 舉的例子是拿網路上所有文字訓練一個百億到兆級參數的模型,連算一次完整梯度都負擔不起,更別說 d 3 d^3 d 3 。所以他的結論是:
"minibatch SGD is the workhorse of ML."
他預告之後會有一份作業讓大家實際比較這幾種方法。
兩個課堂問答
Newton 法到底有沒有人用? (57:05)有,古典統計裡到處都是。特徵只有二十個到幾百個、而且你真的在意參數本身的時候,統計套件或 SciPy 用的就是 Newton 法,或是他稱為變形的 L-BFGS(省記憶體的準 Newton 法,不直接算出整個 Hessian)。Ré 說社會科學家不會想用 SGD:雜訊太大、不好調,而 Newton 法沒有學習率要調,按下去就跑完。
Hessian 有結構時能不能便宜一點? (59:08)可以。不必算出整個 Hessian,只要能算 Hessian 乘上向量就夠用;也可以假設它是對角矩陣,或對角加低秩。Ré 對 Hessian 的白話解釋是:它告訴你每個方向的步伐該信多少,變化劇烈的方向和平緩的方向不該走一樣遠。他說 AdaGrad 這類演算法用的就是對角近似的曲率資訊,現在最常用的 Adam 則是把這類想法和動量(momentum)結合起來。所以原版 Newton 法在機器學習裡少見,它背後的想法卻一直都在。
收尾
Ré 最後總結這堂的三件事:分類和迴歸的差別、最大概似這個原則、邏輯斯迴歸與 Newton 法。然後補了一句(1:01:10):
"I think I accidentally cut off and threw away the multi-class stuff, so I will make sure to bring that back."
多類別分類(softmax,講義 2.3 節)原本排在這堂,但沒講到。下一堂 進入指數族與廣義線性模型,softmax 也在那裡補上。
自我檢查
1. 如果把誤差的分布從高斯換成 Laplace,密度 p ( ϵ ) = 1 2 b exp ( − ∣ ϵ ∣ b ) p(\epsilon) = \frac{1}{2b}\exp\left(-\frac{|\epsilon|}{b}\right) p ( ϵ ) = 2 b 1 exp ( − b ∣ ϵ ∣ ) ,最大概似會導出什麼損失函數?
答案:照同樣的步驟,ℓ ( θ ) = n log 1 2 b − 1 b ∑ i ∣ y ( i ) − θ ⊤ x ( i ) ∣ \ell(\theta) = n\log\frac{1}{2b} - \frac{1}{b}\sum_i \left|y^{(i)} - \theta^\top x^{(i)}\right| ℓ ( θ ) = n log 2 b 1 − b 1 ∑ i y ( i ) − θ ⊤ x ( i ) ,最大化它等於最小化絕對誤差總和。判準:你要能指出平方是從高斯密度指數裡的 ( z − μ ) 2 (z-\mu)^2 ( z − μ ) 2 來的,換一個雜訊假設,損失函數就跟著換。
2. 例子一裡,把 σ \sigma σ 改成 10,θ = 1 \theta = 1 θ = 1 和 θ = 0.5 \theta = 0.5 θ = 0.5 的對數概似差多少?哪個比較大?
答案:常數項相同會消掉,差距是 J ( 0.5 ) − J ( 1 ) σ 2 = 2.25 − 1 100 = 0.0125 \frac{J(0.5) - J(1)}{\sigma^2} = \frac{2.25 - 1}{100} = 0.0125 σ 2 J ( 0.5 ) − J ( 1 ) = 100 2.25 − 1 = 0.0125 ,仍然是 θ = 1 \theta = 1 θ = 1 比較大。σ \sigma σ 愈大,模型愈分不出兩個 θ \theta θ 的好壞,但排序不變。
3. θ = ( 0 , 0 ) \theta = (0, 0) θ = ( 0 , 0 ) ,一筆資料 x = ( 1 , 3 ) x = (1, 3) x = ( 1 , 3 ) 、y = 1 y = 1 y = 1 ,α = 0.5 \alpha = 0.5 α = 0.5 。做一步隨機梯度上升,新的 θ \theta θ 和新的預測機率是多少?
答案:z = 0 z = 0 z = 0 ,h = 0.5 h = 0.5 h = 0.5 ,誤差 0.5 0.5 0.5 ,梯度 ( 0.5 , 1.5 ) (0.5, 1.5) ( 0.5 , 1.5 ) ,新的 θ = ( 0.25 , 0.75 ) \theta = (0.25, 0.75) θ = ( 0.25 , 0.75 ) 。新的 z = 0.25 + 2.25 = 2.5 z = 0.25 + 2.25 = 2.5 z = 0.25 + 2.25 = 2.5 ,h = g ( 2.5 ) ≈ 0.924 h = g(2.5) \approx 0.924 h = g ( 2.5 ) ≈ 0.924 。
4. 為什麼 p ( y ∣ x ; θ ) p(y \mid x;\theta) p ( y ∣ x ; θ ) 裡 x x x 前面是直線、θ \theta θ 前面是分號?
判準:答案要包含兩點。x x x 是觀察到的資料,在這個模型裡可以當作條件;θ \theta θ 不是隨機變數,它是用來標示「一族分布裡的哪一個」的參數,最大概似就是在這一族裡挑。
5. 一個模型有 d = 10 6 d = 10^6 d = 1 0 6 個參數、n = 10 8 n = 10^8 n = 1 0 8 筆資料。Newton 法每一步的計算量大約是 SGD 每一步的多少倍?
答案:SGD 是 d = 10 6 d = 10^6 d = 1 0 6 。Newton 法是 n d 2 + d 3 = 10 20 + 10 18 ≈ 10 20 nd^2 + d^3 = 10^{20} + 10^{18} \approx 10^{20} n d 2 + d 3 = 1 0 20 + 1 0 18 ≈ 1 0 20 。相差約 10 14 10^{14} 1 0 14 倍。即使 Newton 法只要十步,也遠遠划不來;光是存一個 10 6 × 10 6 10^6 \times 10^6 1 0 6 × 1 0 6 的 Hessian 就要 10 12 10^{12} 1 0 12 個數字。
對應閱讀
CS229 主講義 (2026 年 8 月版)對應這堂的部分:
第 1 章 1.3 節 Probabilistic interpretation(pp.16–18) :誤差模型、概似函數、對數概似到 J ( θ ) J(\theta) J ( θ ) 的推導。本文「最大概似」一節的式子與講義一致。
第 2 章 2.1 節 Logistic regression(pp.21–24) :sigmoid、g ′ = g ( 1 − g ) g' = g(1-g) g ′ = g ( 1 − g ) 、式 (2.1) 的對數概似、式 (2.2) 的梯度。課堂跳過的梯度代數在這裡。
第 2 章 2.4 節 Another algorithm for maximizing ℓ ( θ ) \ell(\theta) ℓ ( θ ) (pp.28–29) :Newton 法、Hessian。講義有一張三格圖畫出切線逼近的過程,並提到用在邏輯斯迴歸時又叫 Fisher scoring。
課堂和講義不同的地方:
課堂先列零均值、IID、固定變異數,再說這組設定會導出高斯;講義直接假設誤差服從 N ( 0 , σ 2 ) \mathcal{N}(0, \sigma^2) N ( 0 , σ 2 ) 。推導實際用到的是講義這個寫法。
課堂用了大量時間談建模的態度(模型是抽象、參數敏感度、機器學習在意預測而統計在意參數),講義沒有這些。
課堂談了各種最佳化方法的每步計算量、L-BFGS、AdaGrad 與 Adam 的關係,以及純量函數時的虛反矩陣;講義 2.4 節只說 Newton 法每步要求並反轉一個 Hessian,d d d 不大時整體通常比較快。
課堂把 g g g 叫 link function;講義第 3 章叫它 response function。
課堂沒講、但講義在這個範圍內有的:
1.4 節 Locally weighted linear regression(pp.18–20) :影片標題最可能指的內容,這堂沒有出現。
2.2 節感知器(pp.24–25) :課堂只提到階梯函數不可微,沒有介紹感知器演算法。
2.3 節多類別分類與 softmax(pp.25–27) :Ré 說不小心刪掉了,之後補。
Remark 2.1.1 的 logistic loss 寫法(p.24) :把負對數概似寫成 logit 的函數,第 7 章神經網路會用到。
課程影片來源
原始影片:Stanford CS229 Machine Learning | Spring 2026 | Lecture 3: Weighted Least Squares
查核日期:2026-10-12。
內容核對:已依字幕核對(2026-10-12):整份英文字幕(約 62 分鐘)逐段讀過,文中的課堂引句與時間戳都取自字幕;未看板書與投影片畫面,公式依主講義還原,課堂上只以口頭帶過的式子已在文中標明。四個數值例子都是本文自擬並另行驗算,不是課堂內容。
參考資料