這段隨機遮罩程式碼實現的是哪種正則化?
附圖程式碼實現的是哪一種正則化技術?def forward(x, p, training=True):
if training:
mask = np.random.binomial(1, p, size=x.shape)
return x * mask / p
else:
return x
這段程式碼在訓練時(training=True)用隨機二元遮罩(0 或 1)乘以輸入,讓部分神經元的輸出隨機變成 0;推論時直接傳回原始輸入 x。
問你:這種「訓練時隨機讓部分神經元失效」的技術,實現的是哪一種正則化方法?
一句話總結
這段程式碼實現的是 Dropout:訓練時隨機把部分神經元的輸出設為零(用二元遮罩),推論時還原全部神經元,並用 / p 做比例補償,讓期望值在兩階段保持一致。
先感受問題:訓練時故意「關掉」部分神經元
「深智 AI」的工程師林子軒在訓練一個大型神經網路,發現訓練集準確率很高但驗證集準確率遠低,典型的過擬合症狀。他決定加入 Dropout。
Dropout 的邏輯很像「讓團隊在訓練時隨機缺席幾個人」:
推論時:所有神經元都工作,不再隨機關掉任何人
這段程式碼:
x * mask:把遮罩覆蓋到輸入上,mask=0 的位置輸出變 0
/ p:「倒置 Dropout」補償,讓留下的神經元輸出除以 p,確保期望值不變
其他三種正則化的程式碼長什麼樣?
- L1 正則化的程式碼特徵:出現在損失函數中,形如 loss += lambda * sum(abs(weights)),對權重的絕對值加懲罰。完全不涉及「遮罩」或「訓練/推論模式切換」。
- L2 正則化的程式碼特徵:出現在損失函數中,形如 loss += lambda * sum(weights ** 2),對權重的平方加懲罰。同樣不涉及遮罩,也不區分訓練/推論模式。
- Batch Normalization 的程式碼特徵:計算 batch 的均值和標準差,對輸入做標準化((x - mean) / std),再乘以可學習的 gamma 和加上 beta。程式碼包含 running_mean 和 running_var 的更新,訓練和推論模式的差別是用 batch 統計量還是全局統計量。沒有隨機遮罩。
- Dropout 的識別特徵:隨機遮罩(random.binomial 或 bernoulli 採樣)+ training 模式切換 + / p 的縮放補償,這三個特徵同時出現只有 Dropout。
- / p 這個除法的意義:這是「Inverted Dropout(倒置 Dropout)」的標誌。訓練時把神經元輸出除以保留機率 p,讓期望值保持不變(期望值 = p × (x/p) + (1-p) × 0 = x),推論時就不需要做任何縮放,直接 return x。
逐行識別 Dropout 的三個標誌
林子軒逐行分析這段程式碼:
np.random.binomial(1, p, size=x.shape) → 隨機生成 0/1 遮罩,這是 Dropout 的核心識別標誌,BN 沒有隨機遮罩
x * mask → 把輸出隨機置零,這是 Dropout 的功能定義
/ p → Inverted Dropout 的縮放補償,這是 Dropout 的第三個識別標誌
三個標誌:隨機遮罩 + 模式切換 + / p,確認這就是 Dropout。
這就是選項 C 講的:Dropout。
技術版:Inverted Dropout 的期望值分析與訓練/推論的一致性
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像一個由 100 個人組成的委員會每次開會,但每次隨機讓其中 20 個人缺席(不參與投票)。因為每次缺席的是不同的人,委員會學會了「不依賴任何特定的人」,整體判斷更穩健。最終考試時,100 人全部出席,但為了確保決策的「力道」和平時練習一樣,把每個人的影響力縮小到 80%(除以 p=0.8)。這就是 Inverted Dropout 的邏輯。
| 操作 | 說明 |
|---|---|
| 訓練時輸出 | x * mask / p(mask=1 機率為 p,mask=0 機率為 1-p) |
| 訓練時期望值 | E[x * mask / p] = x × p × (1/p) + x × 0 × (1-p) = x |
| 推論時輸出 | 直接 return x |
| 一致性 | 訓練時期望值 = x = 推論時輸出,無需推論時縮放 |
- x
- 當前層的輸入張量
- p
- 保留機率(keep probability),每個神經元被保留的機率,丟棄機率為 1-p
- mask
- 二元遮罩,每個元素獨立以機率 p 為 1、機率 1-p 為 0
- x * mask
- 隨機置零操作,mask=0 的位置輸出為 0
- / p
- Inverted Dropout 補償:讓期望值在訓練和推論時一致,推論時不需要任何縮放
輸入 x = [1.0, 2.0, 3.0, 4.0, 5.0],保留機率 p = 0.8 某次訓練的 mask = [1, 0, 1, 1, 0] (2 個神經元本次被丟棄,3 個保留) x * mask = [1.0, 0.0, 3.0, 4.0, 0.0] x * mask / p = [1.25, 0.0, 3.75, 5.0, 0.0] 期望驗證: 保留的元素 (x/p):1/0.8=1.25, 3/0.8=3.75, 4/0.8=5.0 E[輸出] = 0.8×(x/0.8) + 0.2×0 = x ✓ 推論時:直接輸出 [1.0, 2.0, 3.0, 4.0, 5.0],期望值不變
- 為什麼 Dropout 推論時不加遮罩?如果加了會怎樣?
- 如果不做 / p 的補償,推論時需要做什麼縮放?
- Dropout 的保留機率 p 一般設多少?設太高或太低各有什麼問題?
- Dropout 和 Batch Normalization 都有訓練/推論模式的差異,各自差在哪?
- Dropout 為什麼能防止過擬合?它如何讓神經網路更「穩健」?
為什麼其他選項是錯的
字面在說什麼:這段程式碼實現的是 L1 正則化(在損失函數中對權重絕對值加懲罰)。
為什麼不對:L1 正則化修改的是損失函數,在損失中加 λ × Σ|w|,不會出現「遮罩」、「training 模式」或「/ p」的操作。這段程式碼完全沒有接觸到權重(weights),只操作輸入 x。L1 在前向傳播中沒有任何特殊操作。
誰會選錯:看到「正則化技術」就想到 L1,沒有去分析程式碼的具體操作的人。
字面在說什麼:這段程式碼實現的是 L2 正則化(在損失函數中對權重平方加懲罰)。
為什麼不對:同 L1,L2 正則化作用在損失函數上(加 λ × Σw²),不在前向傳播中有特殊操作,不會有遮罩或模式切換。L2 防止過擬合的機制是約束權重大小,而非隨機置零神經元輸出。
誰會選錯:和選 A 同類型的錯誤,記憶層面的混淆而非分析程式碼的能力。
字面在說什麼:這段程式碼實現的是 Batch Normalization(批次正規化)。
為什麼不對:Batch Normalization 也有 if training 的模式切換,但其操作是「計算 batch 的均值和標準差,對輸入做標準化」,程式碼會看到 mean()、std()、gamma、beta 等操作。這段程式碼的操作是「隨機遮罩 + 置零 + / p 縮放」,完全沒有統計量計算,不可能是 BN。
誰會選錯:知道「BN 也有訓練/推論模式切換」,看到 if training 就想到 BN,忽略了 BN 和 Dropout 的程式碼特徵完全不同的人。
同個考點下次怎麼變形
直覺:如果把程式碼的 / p 移到推論時,而不是訓練時做,效果一樣嗎?
答案:效果一樣,這叫「Standard Dropout」(傳統版):訓練時直接 x * mask(不除以 p),推論時把輸出乘以 p(縮小神經元影響力,補回訓練時的期望值)。兩種方案在數學上等價,但 Inverted Dropout(除以 p 在訓練時做)在實作上更方便,推論代碼不需要修改,現代框架(PyTorch、TF)普遍採用。
直覺:Dropout 用在 CNN 卷積層和全連接層,效果一樣嗎?
答案:不一樣。在全連接層,Dropout 隨機置零每個神經元(單個值)。在 CNN 的特徵圖(feature map)上,普通 Dropout 置零單個像素效果不佳(相鄰像素相關性很高),通常改用 Spatial Dropout(置零整個 channel / feature map),這樣才能真正讓某個特徵完全不可見,增加正則效果。
直覺:Dropout 和 Batch Normalization 搭配使用時,應該注意什麼?
答案:BN 和 Dropout 在某些情況下會相互干擾。BN 在訓練時用 batch 統計量(均值/方差),Dropout 改變了每個 batch 的輸入分布(部分輸出為 0),可能讓 BN 的統計量不穩定。一般建議:如果用 BN,可以減少或取消 Dropout;如果同時用,Dropout 通常放在 BN 之後,且丟棄率設低一些。
直覺:Dropout 在 Transformer / Attention 架構中有什麼特殊應用?
答案:在 Transformer 中,Dropout 被用在:(1)注意力權重上(Attention Dropout):隨機置零部分注意力連接,讓模型不過度依賴特定 token;(2)殘差連接的輸出上(Residual Dropout):對每個子層的輸出加 Dropout 再加入殘差;(3)Embedding Dropout:隨機置零某些 token 的嵌入向量。BERT、GPT 等模型都用了這些 Dropout 策略。
直覺:怎麼知道加了 Dropout 之後過擬合真的改善了?
答案:看訓練集和驗證集損失的差距:加 Dropout 前,訓練損失低但驗證損失高(差距大);加後,差距縮小,驗證損失接近訓練損失。驗證集上的最終 Loss 或 Accuracy 是否有提升。如果加 Dropout 後訓練變慢(訓練損失下降得更慢),這是正常的,代表模型學習變困難了,需要更多 epoch 訓練。
想再往下看,這 5 個
- Dropout(隨機丟棄)本題核心:訓練時隨機讓部分神經元失效,讓網路學會冗餘表示,是深度學習中最廣泛使用的正則化技術。
- 批次正規化(Batch Normalization)另一個有訓練/推論模式差異的技術,操作對象是每層輸入的分布而非隨機置零,常與 Dropout 比較。
- 正則化(Regularization)Dropout、L1、L2 都屬於正則化技術的上層概念,目標都是防止過擬合、提升泛化能力。
- 過擬合(Overfitting)Dropout 要解決的根本問題:模型記住了訓練資料的雜訊,在新資料上表現差。
- 神經網路(Neural Network)Dropout 的應用場景:深度神經網路中每一層之間都可以插入 Dropout,是大型模型的標準訓練技巧。