L4.0 什麼都能擬合,那為什麼還需要別的架構?
本篇重用M0.0霧中下山:Gradient 與方向·M0.3漂流的溫度計:全導數、微分穿過積分與 JVP
起點:一台夠多層的計算機
L0 到 L2 一路上,「模型」都只是「有參數可以調的東西」——多項式基底、或一個兩層的 網路。它長什麼樣子從來沒被問過。
而確實有一個定理讓人覺得不必問。universal approximation(Cybenko 1989)說:只要一個隱藏層、夠多的單元、一個非線性的激發函數,就能把任何定義在有界區域上的連續函數逼近到任意精度。
這句話讀起來像是把問題關掉了:既然一種架構什麼都能做,剩下的就只是把它放大。
但真實世界完全不是這樣走的。過去十幾年真正推動進展的幾乎都是架構——卷積、殘差、注意力——而不是「把 MLP 加寬」。如果 MLP 什麼都能擬合,這些東西在買什麼?
一個夠寬的 MLP 能逼近任何函數,
那為什麼幾乎沒有人拿純 MLP 去做影像?
那個定理少講了什麼?
課堂提問Q1
把 universal approximation 寫清楚:它到底保證了什麼?把它和我們真正要的東西逐項對照——哪幾件事它沒說?
先想一想,再展開看整理後的答案
定理說的。 對任何連續的 與任何 ,存在一個寬度 與一組參數 ,使得
注意那兩個字:存在。它是一個關於假設空間 有多大的敘述——用 房仲怎麼估價:從例子學規則 的語言,它說的是 approximation error 可以被壓到任意小。
它沒說的三件事,剛好就是 L0 到 L2 整段的內容。
- 要多寬。 定理不給 的上界。對某些函數(例如高頻振盪的),需要的寬度隨精度指數成長。「存在一個網路」和「存在一個你負擔得起的網路」是兩回事。
- 學不學得到。 定理是一個存在性敘述,它不說梯度下降會不會找到那組參數。同一張地圖從不同地方出發:損失曲面與初始化 已經看過:能表示不等於能走到。本篇會把這個缺口量出來——同一個網路、同一組超參數,只換目標的頻率,訓練 MSE 從 變成 。
- 泛不泛化。 就算學到了,那也只是在訓練點上。十個房仲各看一百間房:Bias 與 Variance 說 approximation error 壓到零的代價是 variance——本篇的寬度掃描會看到訓練誤差一路降而真實風險反而上升。
所以定理關掉的只是三個問題裡的第一個。 而架構真正在做的事,是把後兩個變容易——它不是在擴大 ,多半是在縮小它,只是縮得剛好把真相留在裡面。
架構就是一個先驗
把架構想成一句話:「我事先相信答案長這樣。」
- MLP:我什麼都不相信。任何一個輸入座標和任何一個其他座標的關係,一開始都一樣可能。
- 卷積:我相信「局部」與「平移之後還是同一件事」。
- 注意力:我相信「哪些位置彼此相關,要由內容決定」。
- 殘差:我相信「這一層多半只需要對前一層做小修正」。
這些相信是有代價的:相信錯了,真相就不在 裡(bias 變大)。相信對了,回報很大——同樣的資料量能學到的東西多得多,因為候選函數少了,資料就更能把它們區分開(背考古題的學生:過擬合與欠擬合 說過那正是過擬合的來源)。
MLP 在這個座標上是一個端點:它的先驗幾乎是空的。而「幾乎沒有先驗」聽起來很中立,其實不是——本篇最後會看到它其實內建了一個相當強的先驗(對頻率的偏好),只是那個先驗和影像、語言的結構沒什麼關係。
加寬買到什麼、付出什麼
先把 universal approximation 的第一個缺口量掉:加寬到底買到多少 approximation error?
共用 toy()、 的 網路、Adam 跑 4000 步,每個寬度 5 個 seed 取中位數:
h= 2 參數 13 訓練 0.0140 真實風險 0.0285
h= 4 參數 33 訓練 0.0132 真實風險 0.0286
h= 8 參數 97 訓練 0.0084 真實風險 0.0443
h= 16 參數 321 訓練 0.0039 真實風險 0.0447
h= 32 參數 1153 訓練 0.0033 真實風險 0.0454
h= 64 參數 4353 訓練 0.0030 真實風險 0.0478
h= 128 參數 16897 訓練 0.0026 真實風險 0.0440
訓練誤差單調下降(),真實風險在 之後就開始變差()。而且 的真實風險 已經很接近不可約誤差 ——兩個參數的隱藏層就夠了,再加寬買到的全是 variance。
這正是 背考古題的學生:過擬合與欠擬合 的 U 形,只是旋鈕從多項式次數換成網路寬度。universal approximation 保證的那個「夠寬」,在只有 30 筆資料的時候是一個你不會想去的地方。
定理管的是 approximation error,而它從來不是實務上的瓶頸。
補充為什麼「一層就夠」的定理在實務上沒有人用一層
Cybenko 的定理只需要一個隱藏層。但實務上幾乎所有網路都是深的,理由不在表達力而在效率:有一類函數,用深度 的網路需要 個單元,用一層則需要 個。深度讓「組合」變便宜——每一層可以重用前一層算好的中間結果。
這件事的一般形狀在 L4 會反覆出現:同樣一個函數,不同的寫法所需要的參數量差好幾個數量級,而架構的工作就是挑一種對你的資料便宜的寫法。卷積是「重用同一組權重掃過所有位置」,注意力是「重用同一組投影處理所有 token」,都是同一種便宜。
同一個網路,換一個頻率就學不到了
第二個缺口——學不學得到——需要一個能把「表達力」與「可學性」分開的實驗。做法是固定網路與超參數,只換目標函數。
目標取 , 是週期數。三件事要先講清楚:資料是無噪聲的( 均勻取樣), 的函數對一個 的網路來說表達力綽綽有餘(它有 4353 個參數),而 是「輸出恆為零」的 MSE——也就是完全沒學到的水準。
同一個 64×64 網路、同一組超參數,只換目標的頻率(2 seed 中位數)
k 200 步 1,000 步 5,000 步
1 0.0100 0.0000 0.0000
4 0.4630 0.0003 0.0004
16 0.4962 0.4717 0.0015
32 0.4972 0.4960 0.3875
橫著讀是時間,直著讀是難度。 在 200 步就幾乎學完; 要 1000 步; 要 5000 步; 跑完 5000 步仍然停在 ——離「什麼都沒學到」()比離「學會了」近得多。
這不是容量問題(同一個網路),不是資料問題(無噪聲、),也不是最佳化器沒調(同一組超參數、 時完美)。它是 MLP 自己的偏好:低頻的成分先被學到,高頻的成分學得慢、甚至在合理的預算內學不到。 這個現象叫 spectral bias(參考文獻 2)。
「什麼都能擬合」與「在你的預算內學得到」之間,隔著一個和目標長什麼樣子有關的鴻溝。
值得停一下的是:這本身就是一個先驗。MLP 並不是「沒有偏見」的——它偏好平滑、低頻的解。在很多任務上這個偏好剛好是對的(真實世界的函數多半平滑),這也解釋了為什麼 MLP 在表格資料上還是很有用。它壞在那個偏好和影像、語言的結構無關,下一節就是這件事。
回到情境:MLP 對「哪些像素相鄰」一無所知
系列的第二個 toy。 L4 的三篇架構筆記需要一個有空間結構的資料。原本的計畫是用 MNIST 的子集,但那需要下載;改用一個自己造的小影像 toy,好處是結構完全已知、完全可重現,而且我們可以隨意控制「線出現在哪裡」——那正是要量的東西。
IMG = 12
def toy_img(n=600, size=IMG, noise=0.15, seed=0, x_range=(0, 1.0)):
"""size×size 的二元影像分類:class 0 = 一條橫線,class 1 = 一條直線。
線的位置隨機;x_range 限制線的中心可以落在畫面的哪一段。"""
rng = np.random.default_rng(seed)
X = np.zeros((n, size, size)); y = np.zeros(n, dtype=int)
lo, hi = x_range
for i in range(n):
cls = i % 2; y[i] = cls
L = 6
c = int(rng.uniform(lo, hi) * (size - L)) # 沿著線的方向的位置
r = rng.integers(0, size) # 另一個方向的位置
if cls == 0: X[i, r, c:c+L] = 1.0 # 橫線
else: X[i, c:c+L, r] = 1.0 # 直線
X += noise * rng.standard_normal(X.shape)
return X.reshape(n, -1), y*2 - 1 # 標籤是 ±1
任務是「這張圖裡的線是橫的還是直的」。人類看一眼就知道,而且換一個位置完全不影響判斷——這正是要檢驗的性質。模型是 的 MLP,Adam 訓 3000 步,三個 seed 取中位數。
第一段:先確認它學得會。
訓練 1.000 測試 0.968
沒問題。 千多個參數、600 筆資料,MLP 把這個任務做得很好。
第二段:只在左半邊訓練,測右半邊。
訓練(左) 1.000 測試(右) 0.625
訓練集上完美,換一個位置就掉到 (亂猜是 )。同樣是「橫線 vs 直線」,只是線出現在畫面的另一半,模型就幾乎不會了。
原因很直接:MLP 的第一層是 個獨立的權重連到每個隱藏單元。它學到的是「第 37 號與第 38 號像素同時亮」這種和位置綁死的規則。右半邊的像素編號它從來沒有學過,那裡的權重還停在初始值。「線」這個概念從來沒有被學到,被學到的是「某些編號的像素會一起亮」。
第三段:刻意違反——把像素順序整個打亂。
取一個固定的隨機排列,套在所有影像上(訓練與測試都用同一個),再重跑第一段:
訓練 1.000 測試 0.975
和沒有打亂時一模一樣( 對 ,差在 seed 的抖動裡)。把一張圖剪成 144 塊、按同一個亂序重排,人類完全認不出那是什麼,MLP 卻毫無感覺。
理由是一行代數:打亂像素順序等於把第一層的權重矩陣乘上一個置換矩陣,而那只是把參數重新編號——同一個假設空間。MLP 對「輸入座標的順序」是不變的,所以它從一開始就不知道有「相鄰」這件事。
MLP 不是「還沒學到局部結構」,是它的假設空間裡根本沒有這個概念。
這三個數字合起來就是整個 L4 的動機。後面每一個架構都是在把某一個「人類早就知道的結構」寫進假設空間裡:卷積寫進局部與平移(它會讓第二段的 變高,而且會讓第三段的打亂真的造成傷害——那才是「模型看得到結構」的證據);注意力寫進「由內容決定要看誰」;殘差寫進「每一層只做小修正」。
加寬、換頻率、打亂像素:三個把定理掏空的實驗
互動 demo:同一個網路、同樣的步數,目標從 1 個週期換到 32 個,訓練誤差差好幾個數量級。
先消化一下
參考文獻
- Cybenko, G. Approximation by Superpositions of a Sigmoidal Function. Mathematics of Control, Signals and Systems 1989.(universal approximation 的原始論文;注意它的敘述是存在性的。)
- Rahaman, N. et al. On the Spectral Bias of Neural Networks. ICML 2019.(低頻先被學到的系統性實驗與理論分析,本篇頻率實驗的原型。)
- Bronstein, M., Bruna, J., Cohen, T., Veličković, P. Geometric Deep Learning. 2021.(把「架構=寫進假設空間的對稱性」當成統一框架;本篇「架構是一個先驗」那一節的來源。)