下面 12 個橘點是從一條平滑的曲線抽出來、再加上雜訊。多項式的次數越高,曲線越能彎來彎去穿過每一個點,train error 可以變成 0,但它穿過的是雜訊。藍色空心點是模型沒看過的 held-out 資料,用來量「換一批資料還準不準」。L2 regularization 在 loss 後面加一項 λ‖w‖²:權重越大罰越多。把 λ 從 0 往右拉,看曲線怎麼變平。
定義:講義的說法是「對學習演算法做的修改,目的是降低 generalization error,而不是 training error,通常代價是 training error 變高」。另一種說法:加上一些刻意「不幫忙擬合訓練集」的限制。過參數化的模型有很多 training loss 接近 0 的解,regularization 幫你在裡面挑比較平滑的那個。
Regularization 可以作用在 4 個層次(講義第 3 頁):
L2 在整個訓練過程做了什麼:講義用二次近似(Hessian 的特徵分解)說明。沿著「對降低 loss 很有貢獻」的方向(特徵值遠大於懲罰強度),權重幾乎不動;沿著「沒什麼貢獻」的方向(特徵值遠小於懲罰強度),權重被持續衰減掉。所以 L2 是有選擇地縮小不重要的方向,不是把所有權重均勻縮小。直觀上它重罰「集中在少數幾維的尖峰型權重」,偏好「分散的權重」。
L1 的結果是稀疏:同樣的分析會發現,最佳解裡有更多分量剛好等於 0。這相當於一種隱式的特徵選擇。Probe A 切到 L1 就看得到。
AdamW:Adam 加 L2 penalty 和「把 weight decay 跟梯度更新分開」(decoupled weight decay)不是同一件事,後者實務上比較穩(A3 講過 AdamW)。講義的用法:bias 和 normalization 的參數不做 decay,其他層設 0.01 到 0.1,依模型和資料量調;太大會欠擬合。
Label smoothing:把 one-hot 標籤變得稍軟,例如正確類 0.9、其他類平分 0.1。降低過度自信、改善校準;代價是會削弱知識蒸餾的效果。ImageNet 上常見設定是 K = 1000 類、ε = 0.1(講義 3-3 附錄)。
λ 怎麼挑:cross-validation,由粗到細(講義 3-3 附錄)。第一階段每組參數只跑幾個 epoch,大略看哪個範圍可行;第二階段跑久一點、搜細一點,必要時重複。小技巧:cost 一旦超過原本的 3 倍,就提早中斷這一組。最值得調的是網路架構(容量)、learning rate(講義說最重要,含 decay schedule 和 update type)、regularization 強度(L2、dropout)。
Grid search vs random search:講義的建議是實務上用 random search,而且在 log 空間取樣(像 Probe A 的 λ 是 0.0001、0.001、0.01 這樣跳)。理由:通常只有少數幾個超參數真正重要,grid 在重要的那一維只試到幾個值,random 每一次都試到不同的值。資源少就一次跑一個模型、依序搜尋;資源多就平行跑很多個。
每一次 forward,隨機把一部分神經元的輸出設成 0,關掉的機率 p 是超參數,講義說 0.5 很常見。網路不能依賴任何一個神經元,因為它隨時可能不在,講義叫這個「抑制 co-adaptation」(神經元彼此依賴)。只在訓練時這樣做,推論時全部打開。問題來了:推論時打開的神經元比訓練時多,輸出不會變大嗎?
Test time:有 dropout 的網路輸出是隨機的,推論時要的是「對所有 mask 取平均」的結果。直接算太貴,近似做法是全部打開、再乘上保留機率。講義說更常見的是 inverted dropout:把縮放挪到訓練時,推論的 forward 不用動,推論更快,也更容易決定 dropout 開或不開、放哪裡。注意講義引用的程式碼裡 p 是「保留」的機率,這頁的 p 是「關掉」的機率,所以這裡寫成 1/(1−p)。
放哪裡:conv 層或 FC 層的 activation 之後。常見設定:FC 層 p = 0.5 或 0.4;conv 層 0.1 或 0.2(原始論文在 conv 層用的是保留機率 0.7)。用 PyTorch 或 TensorFlow 一定要切換 training / test 模式(PyTorch 的 model.train() / model.eval()),Keras 看起來會自動處理。講義也提到 Curriculum Dropout:p 隨訓練慢慢變大。
為什麼 conv 層少用:conv 層參數少,本來就不太需要 regularization;而且梯度會在整張 feature map 上平均,相鄰位置高度相關,丟掉一個點,旁邊的點還保有幾乎一樣的資訊。所以影像上的變體大多改成「整塊丟」。
Regime 很重要:小到中型資料、fine-tuning 時,dropout 常常有效;用上兆 token 做大規模預訓練的語言模型,資料本身已經夠多樣,常用很低或 0 的 dropout。講義特別說:這是 regime 的差異,不是 dropout「過時」。
共同機制:訓練時的隨機性、推論時的確定性平均。Dropout、Batch Norm、data augmentation、DropConnect、fractional max pooling、stochastic depth 做法各不相同,但都是「訓練時加入某種隨機雜訊,測試時把雜訊平均掉(marginalize)」。講義的速查表:
Model ensembles:訓練好幾個獨立的模型,推論時平均它們的結果,講義說大約可以多 2% 的表現,競賽常用。模型越多通常越好但效益遞減,彼此越不一樣效果越明顯。不想訓練很多個獨立模型時的做法:同一個模型不同初始化(差異只來自初始化)、cross-validation 裡表現最好的前幾個、同一個模型訓練過程中的不同 checkpoint(便宜)、訓練中參數的移動平均(便宜)。
Snapshot ensembles:搭配循環的 learning rate(每次降到底再跳回高點),每個低點存一份,「訓練一個,免費得到 M 個」。Polyak averaging:最佳化可能在山谷兩側跳來跳去,從沒走到谷底;但兩側位置的平均會很接近谷底。所以推論時不用最後一組權重,而用權重的指數移動平均。SWA:訓練後期用循環或較高的固定 learning rate,把多個權重快照平均成一組。它偏好比較平坦的解,幾乎不用改程式,PyTorch 1.6 之後內建。和 ensemble 不同,最後只有一個模型,推論成本不變。
講義把 data augmentation 的本質寫成一句話:把「哪些變化不該改 label」寫進資料。翻轉的貓還是貓,變暗的貓還是貓。Mixup 和 CutMix 更進一步:把兩張不同類別的圖混在一起,標籤也照比例混。下面是 A1 那兩隻 8×8 的貓和狗,標籤是三類(貓、狗、船)的向量。
三種增強(講義第 37 頁):
ImageNet 的增強:隨機裁切與縮放、水平翻轉、color jitter。簡單版是隨機調對比和亮度;複雜版是對整個訓練集的 RGB 像素做 PCA,沿主成分方向抽一個「顏色偏移」,加到整張圖的每個像素上(AlexNet 2012、ResNet 都這樣做)。講義 3-3 附錄的 baseline 配方:訓練時隨機裁出面積 8% 到 100%、長寬比 3/4 到 4/3 的區塊並縮成 224×224;0.5 的機率水平翻轉;亮度、飽和度、對比乘上 0.6 到 1.4 的係數;加 N(0, 0.1) 的 PCA 雜訊;減均值、除標準差。推論時把短邊縮到 256、從中央裁 224×224。
加雜訊也是增強:雜訊可以加在輸入、hidden units、輸出、甚至權重上,但雜訊量要小心。這類方法對分類最好用,因為 label 不用變;像 density estimation 這種任務就不容易套。
方向盤角度的例子(講義第 38 頁):自駕車從影像預測方向盤角度。用左右兩側的鏡頭、水平翻轉、垂直平移、隨機加陰影,一筆資料變 16 筆。講義說像 steering angle regression 這類任務,要靠資料增強才做得好。
Mixup 的兩種讀法:一種說它是資料增強,用不同類別之間的線性插值造新樣本,讓模型看到類別之間的過渡地帶;另一種說它主要是 regularization,訓練出來的網路 loss 地景較平。優點是降低尖銳的決策邊界、提升 robustness;代價是像分割、定位這類 dense prediction,線性混合的語意不一定合理。它也不是在每個資料集都穩定有效。小提醒:PyTorch 的 target 通常不是 one-hot,要自己轉;或者不混標籤,改成對兩個原標籤各算一次 cross-entropy 再按比例加權,兩者等價。
CutMix:混的是區域,不是整張圖的線性疊加。標籤依區塊面積比例混合。比 Mixup 自然(Mixup 的疊影有時不像真實照片),又比 Cutout 保留更多資訊(Cutout 那塊直接變黑);同時逼模型看完整的物體,而不是只盯最有辨識度的一小塊。
AugMix:不混兩張不同的圖,而是對同一張圖套好幾條隨機增強鏈,把結果混起來,再加一個一致性 loss,要求模型對同一張圖的不同版本給出相近的預測。結果比 CutMix、Mixup 自然,對影像損壞(corruption)和分佈偏移比較有韌性。只是把很多增強串在一起的話,圖會偏離原圖很遠、變得失真。自動化的路線:AutoAugment(要花時間搜尋策略)→ RandAugment(2 個參數)→ TrivialAugment(幾乎免調)。偵測與分割有 Mosaic、Copy-Paste;近年也有用 diffusion 模型生成或編輯樣本的做法,但要小心標籤歧義和偽影。
其他模態:NLP 有 EDA(同義詞替換、插入、對調、刪除)、back-translation(翻成另一種語言再翻回來),以及用 LLM 生成指令資料(如 Self-Instruct);語音辨識有 SpecAugment,對梅爾頻譜做時間和頻率的遮罩與扭曲。
什麼時候少用:醫學影像,或任何幾何、亮度帶有物理意義的任務,過強的變形會破壞真相;偵測任務裡,如果標註(例如關鍵點座標)沒有跟著圖一起變換,增強反而會製造錯的標籤。
自監督學習是增強思路的延伸:第一階段在不需要人工標籤的「代理任務」(pretext task)上訓練,第二階段用學到的特徵、配少量標籤訓練真正的分類器。例子一:rotation prediction,把圖轉 0、90、180、270 度,讓網路猜轉了多少,看似無關,卻逼它學到物體結構和方向的特徵。例子二:用 IMU(慣性感測器)訊號設計代理任務,說明這個想法可以延伸到影像以外。
Test Time Augmentation(TTA):推論時也做增強,對同一張輸入做好幾種變換(例如翻轉、不同裁切),把預測平均起來。可以改善長尾、分佈偏移時的表現和不確定性估計,代價是推論變慢好幾倍。
兩個最便宜的工具。Early stopping:一邊訓練一邊看 validation loss,它一段時間不再變好就停,拿回最好的那份權重。講義的標題是「把訓多久也當成 regularizer」。Transfer learning:資料不夠時不從零開始,借一個在大資料集上訓練好的網路,只重新訓練其中一部分。
怎麼做 early stopping:訓練時同時輸出 validation error;每次它變好,就存一份權重;一段時間(patience)沒有改善就停。優點:有效率(只多存一份權重)、簡單(模型和演算法都不用改)。缺點:要切一份 validation 資料出來,不能拿去訓練。
把 validation 資料要回來:第一次 early stop 之後再訓練第二次。做法一:從頭開始,用 train + validation 一起訓練,訓練到上一次的 epoch 數。做法二:從第一次的權重接著訓練,用 train + validation,直到 validation loss 低於第一次停下時的 training loss。
不同 regime:小資料時 validation 不再改善就停,避免後期 overfit;fine-tuning 比 pretraining 更需要挑 checkpoint;大規模預訓練更常用固定的 token 預算加 annealing,而不是傳統的 early stop。
Transfer learning 的兩種:任務遷移,資料可以一樣,但任務不同,例如影像分類到影像分割、機器翻譯到情緒分析、時間序列預測到時間序列分類。資料遷移,任務一樣,資料領域不同,例如日常物品照片到醫學影像、中文到英文、一個病人的生理訊號到另一個病人。理由都一樣:相似的特徵在不同任務、或不同但相關的資料之間仍然有用。講義的實務建議:資料少於一百萬張,先在一個內容相似的大資料集上訓練大的 ConvNet(或直接用框架提供的 Model Zoo),再遷移到自己的資料上。
Taskonomy:系統性地量了 26 個電腦視覺任務兩兩之間的遷移效率,做成一張關聯矩陣,再求解「預算有限時,哪些任務從零訓練、其他靠遷移」。結論是遷移路徑差很多,挑對來源任務能省大量資料;講義備註提到,要有效率地解 10 個任務,照它的策略可以少用約 2/3 的訓練資料。
Multi-task learning:把多個任務的樣本放在一起學來改善泛化。結構分兩部分:共用的 shared layers,加上每個任務自己的 task-specific layers。
LLM 時代:PEFT(Parameter-Efficient Fine-Tuning)只新增很少的參數,例如 Adapters、LoRA、Prefix / Prompt Tuning、BitFit,大幅降低記憶體和算力需求。LoRA(low rank adaptation)把大模型的權重凍結,旁邊放一個小模型;forward 時把兩邊的輸出合併,backward 時只算小模型的梯度。講義備註說,因為小模型要「很努力」才改變得了大模型,LoRA 的 learning rate 通常可以設高一點。
Domain adaptation vs domain generalization:兩者都在處理分佈偏移(distribution shift)。Domain adaptation 訓練時同時用來源資料和(沒有標籤的)目標資料,縮小兩個領域的差距;domain generalization 訓練時完全看不到目標資料,要靠學到跨領域都成立的東西。另外還有 source-free adaptation,以及 test-time adaptation:推論時邊看資料邊調整,例如 TENT 用熵最小化只更新 normalization(像 BN)的參數。
Adversarial training:網路可以被刻意構造的樣本(adversarial examples)騙過,人看起來一樣,模型卻答錯。Adversarial training 把這些樣本放進訓練,等於明確加上「輸入附近,輸出應該不變」的先驗,壓制過度敏感的線性行為。
Bag of tricks(講義 3-3 附錄):模型架構(input stem、downsample)、data augmentation、mixup、label smoothing、learning rate schedule(cosine decay、warmup)。Efficient training:large-batch training、linear scaling learning rate(batch 放大 k 倍,learning rate 也乘 k,兩者的更新會很接近)、learning rate warmup、把 residual block 裡第二個 BN 的 γ 設成 0(剛開始等於恆等映射,比較好訓練)、bias 不做 decay、低精度訓練。Training refinements:cosine learning rate decay(一開始降得慢、中間近似線性、最後又變慢)、knowledge distillation、mixup、label smoothing。
trick 不是穩賺:講義列了一個逐項疊加的實驗,VGG16 在 CUB-200-2011 上從零訓練(沒有 ImageNet 預訓練,lr 0.01、batch 64):baseline 64.60% → 加 xavier init 和 warmup 66.07% → 加 no bias decay 70.14% → 加 label smoothing 71.20% → 加 linear scaling 71.21%。但 random erasing 掉了約 4 個百分點,cutout 和 cosine decay 各掉約 1 點。同一招換一個資料集,可能有害,要在自己的 validation 上驗。
講義的 TL;DR,最常用的 regularization:L2、Dropout、Early stopping、Ensemble、Data augmentation(如果知道該用哪些變換、也容易實作)。
這個模組最常被講錯的幾句話。