習(xí)模型泛化與正則化實(shí)戰(zhàn):從過(guò)擬合到調(diào)參避坑指南)
一直以為書(shū)架里那本翻得起了毛邊的深度學(xué)習(xí)教材最值錢(qián)的部分藏在偏后的模型優(yōu)化章節(jié)直到我在整理舊筆記時(shí)重新看到deeplearningbook_035-2這個(gè)編號(hào)。035是我給“泛化與正則化”這一節(jié)編的頁(yè)碼序號(hào)-2則代表這一節(jié)里關(guān)于“為什么模型在訓(xùn)練集上生龍活虎一到新數(shù)據(jù)就露怯”的那段思考。說(shuō)來(lái)也怪當(dāng)年課堂上、視頻里我看過(guò)無(wú)數(shù)遍的結(jié)論遠(yuǎn)沒(méi)有這頁(yè)紙加上幾次真實(shí)項(xiàng)目踩坑后給我的觸動(dòng)大。如果你最近也剛好在為“訓(xùn)練損失降得挺漂亮一換場(chǎng)景效果就稀碎”發(fā)愁這篇文章應(yīng)該能幫你把線(xiàn)頭捋清楚。先說(shuō)清楚這篇文章要解決什么。它不是某個(gè)比賽冠軍方案的精讀也不是某庫(kù)API的逐行解釋而是一份圍繞“深度模型泛化能力”的實(shí)戰(zhàn)記錄。我會(huì)用我實(shí)際做圖像分類(lèi)項(xiàng)目時(shí)的一組調(diào)參日志作為線(xiàn)索把權(quán)重衰減、Dropout、數(shù)據(jù)增強(qiáng)、早停這些看起來(lái)誰(shuí)都會(huì)用的手段放到真實(shí)過(guò)擬合場(chǎng)景里重新講一遍它們各自在什么時(shí)候管用、什么時(shí)候添亂、怎么組合才不容易翻車(chē)。適合誰(shuí)看剛把模型跑通但不太清楚為什么別人的正則化設(shè)置隨便抄都能用的初學(xué)者以及有一定經(jīng)驗(yàn)但想補(bǔ)一補(bǔ)系統(tǒng)性排查思路的從業(yè)者應(yīng)該都能在這篇里找到自己需要的東西。1. 這頁(yè)筆記背后的核心問(wèn)題模型在測(cè)試集上為什么失效先把這個(gè)最讓人頭疼的現(xiàn)象剝離出來(lái)看。訓(xùn)練集上準(zhǔn)確率能沖到98%驗(yàn)證集上也有94%你滿(mǎn)心歡喜地把模型接到新數(shù)據(jù)上結(jié)果準(zhǔn)確率掉到70%出頭。這種落差不是玄學(xué)而是典型的泛化失敗也就是過(guò)擬合。深度學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)在這件事上的表現(xiàn)差異非常大根源在于深度網(wǎng)絡(luò)參數(shù)規(guī)模龐大逼近訓(xùn)練集“每一個(gè)角落”的能力太強(qiáng)了。你可以把模型想象成一個(gè)記憶力超常的學(xué)生他不僅能記住知識(shí)點(diǎn)的推導(dǎo)過(guò)程連帶教材里的印刷錯(cuò)誤、老師口頭禪的停頓節(jié)奏都一并背下來(lái)了??荚嚂r(shí)題目只要和課本原文不一樣他就抓瞎。導(dǎo)致過(guò)擬合的具體原因通常是三類(lèi)。第一類(lèi)是模型的容量和任務(wù)的復(fù)雜度不匹配明明只需要幾百個(gè)參數(shù)就能描述的數(shù)據(jù)規(guī)律你偏用幾百萬(wàn)參數(shù)的模型去擬合模型自然會(huì)去“記憶”而不是“歸納”。第二類(lèi)是訓(xùn)練數(shù)據(jù)量和有效信息量不足數(shù)據(jù)少、標(biāo)注噪聲大、類(lèi)別的樣本分布嚴(yán)重不均衡都會(huì)讓模型在局部細(xì)節(jié)上鉆牛角尖。第三類(lèi)是訓(xùn)練過(guò)程缺乏約束信號(hào)沒(méi)有對(duì)模型復(fù)雜度做任何限制優(yōu)化器就會(huì)肆無(wú)忌憚地往極端方向走。在很多項(xiàng)目里大家習(xí)慣性認(rèn)為“只要數(shù)據(jù)夠多、訓(xùn)練夠久模型自然就能學(xué)好”但我在實(shí)際項(xiàng)目里吃過(guò)虧以后才慢慢意識(shí)到正則化不是可有可無(wú)的附加項(xiàng)它本質(zhì)上是在訓(xùn)練過(guò)程中“持續(xù)提醒”模型不要把全部賭注押在訓(xùn)練集的局部模式上。這一頁(yè)筆記最后給我留下的結(jié)論是過(guò)擬合不是某個(gè)時(shí)刻突然發(fā)生的災(zāi)難而是一個(gè)從訓(xùn)練剛開(kāi)始就逐漸累積的過(guò)程差別只在于你什么時(shí)候注意到它。所以后續(xù)所有正則化手段都可以看作是在回答同一個(gè)問(wèn)題如何在不過(guò)分犧牲模型表達(dá)能力的前提下降低它對(duì)訓(xùn)練集特有模式的敏感度下面幾個(gè)小節(jié)里討論的每一項(xiàng)技術(shù)都是針對(duì)這個(gè)問(wèn)題的不同角度給出的答案只不過(guò)有些回答看起來(lái)簡(jiǎn)單實(shí)際上暗含了很多適用前提。2. 把正則化講清楚從直觀(guān)實(shí)驗(yàn)看權(quán)重衰減與Dropout的邊界很多教程喜歡把正則化列舉成一條一條的“技巧菜單”但這容易誤導(dǎo)人。我先從兩個(gè)最常用的手段說(shuō)起重點(diǎn)不是背公式而是理解它們到底在限制模型的什么行為。2.1 權(quán)重衰減小權(quán)值假設(shè)為什么有效權(quán)重衰減Weight Decay的寫(xiě)法很簡(jiǎn)單一般就在優(yōu)化器里加一個(gè)參數(shù)比如PyTorch里Adam的weight_decay。它的原理是在原始損失函數(shù)后面加上所有權(quán)重的平方和懲罰項(xiàng)優(yōu)化器在降低訓(xùn)練損失的同時(shí)也要把權(quán)重的絕對(duì)值往零的方向壓一壓。為什么權(quán)重?cái)?shù)值小就能提升泛化能力因?yàn)樯窠?jīng)網(wǎng)絡(luò)的每一層輸出都是上一層的加權(quán)和權(quán)重值越小輸出對(duì)輸入的小幅擾動(dòng)就越不敏感。換句話(huà)說(shuō)模型學(xué)到的函數(shù)會(huì)變得更加平滑不會(huì)在某個(gè)數(shù)據(jù)點(diǎn)附近發(fā)生劇烈震蕩。我在一個(gè)早期項(xiàng)目里做過(guò)簡(jiǎn)單的對(duì)照實(shí)驗(yàn)同樣的模型結(jié)構(gòu)一個(gè)完全關(guān)閉權(quán)重衰減另一個(gè)設(shè)置weight_decay1e-4。從訓(xùn)練曲線(xiàn)上看前者的訓(xùn)練損失可以降到更低但這部分優(yōu)勢(shì)完全是“背題”背出來(lái)的它在驗(yàn)證集上的表現(xiàn)到后期反而出現(xiàn)明顯波動(dòng)而加了權(quán)重衰減的模型雖然訓(xùn)練損失下降得慢一點(diǎn)驗(yàn)證曲線(xiàn)卻平穩(wěn)得多。這個(gè)現(xiàn)象背后的道理是懲罰項(xiàng)限制了有效參數(shù)空間的范圍讓優(yōu)化器無(wú)法找到一個(gè)只對(duì)訓(xùn)練集有效的極端解。當(dāng)然權(quán)重衰減也不是越小越好。我在實(shí)驗(yàn)中發(fā)現(xiàn)設(shè)置太小時(shí)它約等于沒(méi)有設(shè)置太大時(shí)模型會(huì)變得“過(guò)于保守”連訓(xùn)練集上的基本規(guī)律都學(xué)不動(dòng)。一般圖像模型從1e-4到5e-4開(kāi)始試純文本模型有時(shí)需要調(diào)大一個(gè)量級(jí)但更穩(wěn)妥的做法還是先跑一小組網(wǎng)格搜索觀(guān)察不同強(qiáng)度下訓(xùn)練損失和驗(yàn)證損失的距離。2.2 Dropout隨機(jī)失活并非簡(jiǎn)單的數(shù)據(jù)增廣替代Dropout的原理大家應(yīng)該都聽(tīng)過(guò)訓(xùn)練時(shí)以一定概率隨機(jī)把一部分神經(jīng)元的輸出置零讓模型不能依賴(lài)某一個(gè)或某幾個(gè)神經(jīng)元的固定組合。它經(jīng)常被誤認(rèn)為“窮人的數(shù)據(jù)增廣”但這個(gè)類(lèi)比并不完全對(duì)。數(shù)據(jù)增廣改變的是輸入數(shù)據(jù)本身而Dropout改變的是模型內(nèi)部的協(xié)同適應(yīng)模式它逼迫網(wǎng)絡(luò)學(xué)到更魯棒的冗余表達(dá)。這里有一個(gè)經(jīng)常踩的坑很多人到了測(cè)試階段忘了關(guān)閉Dropout或者錯(cuò)誤地在BatchNorm前面加Dropout導(dǎo)致分布被擾動(dòng)。正確的做法通常是訓(xùn)練時(shí)啟用Dropout并且用model.eval()或者model.train()這樣的切換機(jī)制來(lái)確保推理階段不再隨機(jī)失活。我見(jiàn)過(guò)不止一個(gè)同學(xué)在測(cè)試階段拿到一個(gè)“不穩(wěn)定”的結(jié)果上下浮動(dòng)好幾個(gè)點(diǎn)查了半天才發(fā)現(xiàn)是Dropout在推送前沒(méi)有關(guān)掉。Dropout的強(qiáng)度選擇也很講究。設(shè)置太小比如p0.1對(duì)容量極大的網(wǎng)絡(luò)幾乎沒(méi)什么約束力設(shè)置太大比如p0.5小數(shù)據(jù)集上的表現(xiàn)反而可能斷崖式下跌因?yàn)槟P驮谟?xùn)練階段獲取的信息太稀疏根本學(xué)不到東西。我在實(shí)際圖像項(xiàng)目里更傾向于把Dropout看作一個(gè)“容量調(diào)節(jié)旋鈕”模型越大、數(shù)據(jù)越少這個(gè)旋鈕就擰得越緊但它始終不是替代數(shù)據(jù)增強(qiáng)的第一選擇。2.3 數(shù)據(jù)增強(qiáng)最容易被低估的正則化手段如果說(shuō)權(quán)重衰減和Dropout是從模型內(nèi)部“做減法”數(shù)據(jù)增強(qiáng)就是從源頭“做加法”。它通過(guò)對(duì)原始訓(xùn)練樣本進(jìn)行不改變語(yǔ)義的變換比如圖像上的隨機(jī)裁剪、翻轉(zhuǎn)、色彩擾動(dòng)或者文本里的同義詞替換、EDA方法來(lái)擴(kuò)大訓(xùn)練分布的覆蓋范圍。數(shù)據(jù)增強(qiáng)之所以是效果最自然的正則化是因?yàn)樗](méi)有給模型施加額外限制而是讓模型看到了更多樣的“合法樣本”。我在動(dòng)手做細(xì)粒度圖像分類(lèi)時(shí)發(fā)現(xiàn)數(shù)據(jù)增強(qiáng)帶來(lái)的收益經(jīng)常比調(diào)半天Dropout和權(quán)重衰減還明顯。一個(gè)很典型的例子原始訓(xùn)練集里所有“窗戶(hù)”的照片都出現(xiàn)在畫(huà)面左側(cè)模型很容易學(xué)到“看到窗戶(hù)就等同于左邊有窗戶(hù)”這種偽規(guī)律。一旦測(cè)試數(shù)據(jù)里窗戶(hù)出現(xiàn)在右邊模型準(zhǔn)確率立刻崩掉。而隨機(jī)水平翻轉(zhuǎn)的增強(qiáng)策略雖然只是簡(jiǎn)簡(jiǎn)單單改變圖片方向卻能讓模型不再依賴(lài)這種位置信息。不過(guò)數(shù)據(jù)增強(qiáng)有一個(gè)隱蔽的坑它改變了訓(xùn)練分布的形態(tài)如果增強(qiáng)得太激進(jìn)比如把物體裁得只剩下20%的區(qū)域模型會(huì)把大量注意力放在學(xué)習(xí)更難的樣本上導(dǎo)致欠擬合或訓(xùn)練不穩(wěn)定。我在調(diào)參時(shí)習(xí)慣先固定一個(gè)合理的增強(qiáng)范圍跑通基線(xiàn)之后再逐步增強(qiáng)強(qiáng)度同時(shí)盯著訓(xùn)練集和驗(yàn)證集的差距變化而不是盲目認(rèn)為增強(qiáng)越猛越好。3. 實(shí)戰(zhàn)調(diào)參記錄某圖像分類(lèi)項(xiàng)目里的正則化組合理論說(shuō)太多容易飄下面用一段真實(shí)的調(diào)參日志來(lái)說(shuō)明。當(dāng)時(shí)我手頭接到一個(gè)圖像分類(lèi)小項(xiàng)目目標(biāo)是對(duì)某類(lèi)工業(yè)零件做缺陷識(shí)別判斷零件是否存在表面劃痕或裂紋。由于這一類(lèi)缺陷樣本本身就少能用來(lái)做訓(xùn)練的有效圖片只有幾千張而分類(lèi)類(lèi)別有十幾類(lèi)屬于典型的小樣本細(xì)粒度分類(lèi)任務(wù)。3.1 問(wèn)題背景與初始模型表現(xiàn)我一開(kāi)始直接搬了一個(gè)預(yù)訓(xùn)練特征提取模型凍結(jié)前幾層只對(duì)后半部分進(jìn)行微調(diào)優(yōu)化器選了Adam。初始配置里沒(méi)有加任何額外的正則化唯一沾點(diǎn)邊的是預(yù)訓(xùn)練模型自帶的權(quán)重初始化。這個(gè)基線(xiàn)跑下來(lái)訓(xùn)練集準(zhǔn)確率沖到97.4%但驗(yàn)證集只有84.6%。差距超過(guò)12個(gè)百分點(diǎn)效果就是典型的過(guò)擬合模型幾乎把訓(xùn)練樣本的特征細(xì)節(jié)都記住了。當(dāng)時(shí)記錄下來(lái)的訓(xùn)練曲線(xiàn)有幾個(gè)容易忽略的細(xì)節(jié)訓(xùn)練損失在第12個(gè)epoch之后還在緩慢下降而驗(yàn)證損失從第8個(gè)epoch就開(kāi)始反彈權(quán)重的L2范數(shù)在訓(xùn)練中后期快速增長(zhǎng)說(shuō)明某些層的參數(shù)被優(yōu)化器推到比較大的范圍同時(shí)模型對(duì)輸入圖像上的微小噪點(diǎn)非常敏感稍微改一下亮度就能讓預(yù)測(cè)結(jié)果翻轉(zhuǎn)。這些跡象都指向同一個(gè)結(jié)論模型容量超出了數(shù)據(jù)能支撐的信息量必須引入外部約束。3.2 逐項(xiàng)加入正則化后的驗(yàn)證集變化于是我開(kāi)始按順序逐項(xiàng)加正則化并在每次只改變一個(gè)變量的前提下記錄指標(biāo)變化。這是調(diào)參最基本的一個(gè)習(xí)慣一次只動(dòng)一個(gè)旋鈕不然出了問(wèn)題你根本不知道是誰(shuí)惹的禍。配置方案訓(xùn)練準(zhǔn)確率驗(yàn)證準(zhǔn)確率訓(xùn)練與驗(yàn)證差距基線(xiàn)無(wú)額外正則化97.4%84.6%12.8%增加權(quán)重衰減1e-495.8%87.3%8.5%繼續(xù)增加Dropoutp0.393.6%89.2%4.4%疊加隨機(jī)裁剪翻轉(zhuǎn)增強(qiáng)91.2%91.7%-0.5%同時(shí)配合早?;隍?yàn)證損失90.5%92.1%-1.6%這張表里很有意思的是最后一步的驗(yàn)證準(zhǔn)確率反超訓(xùn)練準(zhǔn)確率這在小數(shù)據(jù)集上并不罕見(jiàn)因?yàn)轵?yàn)證集相對(duì)更容易或者訓(xùn)練階段的數(shù)據(jù)增強(qiáng)給訓(xùn)練樣本人為增加了難度。但重點(diǎn)不是數(shù)值高低而是每一步之間“訓(xùn)練準(zhǔn)確率和驗(yàn)證準(zhǔn)確率的距離”在穩(wěn)步縮小。這說(shuō)明模型不再把能量集中在死記硬背上而是學(xué)會(huì)了真正區(qū)分缺陷存在的關(guān)鍵模式。3.3 值得記錄的失敗嘗試調(diào)參過(guò)程并不只有成功的操作有幾輪失敗的嘗試我認(rèn)為更值得反思。第一輪失敗是我把Dropout強(qiáng)度直接拉到0.5期望一步到位減少過(guò)擬合結(jié)果驗(yàn)證準(zhǔn)確率不升反降跌到86%附近。原因是這個(gè)項(xiàng)目本身的訓(xùn)練樣本量不夠大過(guò)高的隨機(jī)失活使得模型在訓(xùn)練階段得不到足夠穩(wěn)定的梯度信號(hào)局部特征也學(xué)不完整。第二輪失敗是我嘗試在訓(xùn)練集上把增強(qiáng)強(qiáng)度拉滿(mǎn)包括大幅度隨機(jī)擦除和夸張的顏色抖動(dòng)。結(jié)果模型在驗(yàn)證集上震蕩得很厲害準(zhǔn)確率忽高忽低我后來(lái)把單次增強(qiáng)的幅度調(diào)回去又逐一觀(guān)察哪個(gè)變換對(duì)指標(biāo)影響最大才定位到那條過(guò)于夸張的變換在制造和真實(shí)缺陷無(wú)關(guān)的偽紋路。第三輪失敗是我試圖用更復(fù)雜的正則化方式比如譜歸一化強(qiáng)行套到整個(gè)主干網(wǎng)絡(luò)上。譜歸一化本身對(duì)生成式模型比較友好但放在這個(gè)分類(lèi)任務(wù)里不僅拖慢了訓(xùn)練速度還讓收斂變得不穩(wěn)定。最后我放棄了這個(gè)方案重新回到基礎(chǔ)組合上。這件事給到我的教訓(xùn)是不要為了“看起來(lái)高級(jí)”去追逐新興的正則化技巧先把手邊最常用的工具用到極致收益往往更高。4. 訓(xùn)練監(jiān)控別讓驗(yàn)證集成為你唯一的情報(bào)來(lái)源我剛接觸深度學(xué)習(xí)時(shí)判斷模型好壞的方式異常簡(jiǎn)單粗暴看驗(yàn)證集準(zhǔn)確率高就是好低就是壞。但做了幾個(gè)項(xiàng)目之后我發(fā)現(xiàn)如果只盯驗(yàn)證集上的單一數(shù)字你會(huì)失去很多診斷問(wèn)題的窗口等發(fā)現(xiàn)不對(duì)勁的時(shí)候已經(jīng)浪費(fèi)了好幾輪訓(xùn)練。4.1 訓(xùn)練集誤差與驗(yàn)證集誤差的差距變化最基礎(chǔ)的監(jiān)控方法是把訓(xùn)練誤差和驗(yàn)證誤差放到同一張圖里持續(xù)觀(guān)察兩條曲線(xiàn)的距離。如果訓(xùn)練誤差持續(xù)下降驗(yàn)證誤差卻在某個(gè)點(diǎn)開(kāi)始上揚(yáng)這就是典型的過(guò)擬合信號(hào)這時(shí)候早停比繼續(xù)訓(xùn)練更有價(jià)值。但如果兩條線(xiàn)都高高在上差距不大那問(wèn)題就不是過(guò)擬合而是欠擬合或者模型結(jié)構(gòu)設(shè)計(jì)本身有缺陷。我習(xí)慣在訓(xùn)練腳本里把每一輪的訓(xùn)練損失和驗(yàn)證損失都記錄下來(lái)并且寫(xiě)一個(gè)簡(jiǎn)單的判斷規(guī)則如果連續(xù)若干個(gè)epoch驗(yàn)證損失都沒(méi)有刷新最低值就觸發(fā)早停。這個(gè)規(guī)則看似簡(jiǎn)單卻能省下大量反復(fù)試錯(cuò)的時(shí)間。另一個(gè)細(xì)節(jié)是驗(yàn)證頻率不要太低小數(shù)據(jù)集上每隔一兩個(gè)epoch就應(yīng)該看一次否則你很難定位驗(yàn)證損失反彈的精確位置。4.2 權(quán)重的數(shù)值分布檢查有時(shí)候光看損失曲線(xiàn)還不夠。我在某次實(shí)驗(yàn)里遇到一種怪現(xiàn)象驗(yàn)證準(zhǔn)確率一直上不去訓(xùn)練損失卻在下降看起來(lái)像過(guò)擬合但加了正則化之后一點(diǎn)用都沒(méi)有。后來(lái)我把每一層權(quán)重的數(shù)值分布打印出來(lái)發(fā)現(xiàn)網(wǎng)絡(luò)后半部分的權(quán)重已經(jīng)膨脹到非常大同時(shí)梯度已經(jīng)小到近乎消失。這其實(shí)是優(yōu)化過(guò)程出了問(wèn)題單純靠加正則化根本救不回來(lái)必須調(diào)整學(xué)習(xí)率或者檢查特征提取層的歸一化方式。權(quán)重?cái)?shù)值分布檢查是很容易被忽視的手段它能幫你判斷疊加的正則化到底有沒(méi)有真正生效。比如你開(kāi)了權(quán)重衰減就可以隔一段時(shí)間統(tǒng)計(jì)一下權(quán)重范數(shù)如果發(fā)現(xiàn)范數(shù)沒(méi)有發(fā)生任何趨勢(shì)性變化說(shuō)明權(quán)重衰減的設(shè)置大概率被某個(gè)遮蔽點(diǎn)繞過(guò)去了比如某些庫(kù)默認(rèn)不作用于特定參數(shù)組或者你在混合精度訓(xùn)練里漏掉了相關(guān)配置。4.3 學(xué)習(xí)率與正則化強(qiáng)度的聯(lián)動(dòng)這一點(diǎn)我想特別提一下學(xué)習(xí)率和正則化強(qiáng)度不是兩個(gè)完全獨(dú)立的超參數(shù)。學(xué)習(xí)率偏大時(shí)模型參數(shù)更新步長(zhǎng)也大同等強(qiáng)度的權(quán)重衰減所產(chǎn)生的約束效果會(huì)被放大可能導(dǎo)致模型還沒(méi)充分探索就被“壓”住了學(xué)習(xí)率偏小時(shí)權(quán)重衰減有一定概率作用被減弱因?yàn)槊恳徊降母路榷己苄土P項(xiàng)帶來(lái)的梯度貢獻(xiàn)也相應(yīng)變小。我在調(diào)這個(gè)工業(yè)缺陷識(shí)別項(xiàng)目時(shí)就發(fā)現(xiàn)這么一個(gè)問(wèn)題把學(xué)習(xí)率從默認(rèn)的3e-4降到1e-4之后原本合適的最佳權(quán)重衰減強(qiáng)度變得“太輕了”驗(yàn)證準(zhǔn)確率掉了一些反過(guò)來(lái)提高學(xué)習(xí)率并同步增大一點(diǎn)權(quán)重衰減反而把最佳驗(yàn)證準(zhǔn)確率又往上推了一截。這種聯(lián)動(dòng)效應(yīng)在超參數(shù)搜索時(shí)比單獨(dú)調(diào)每個(gè)參數(shù)更值得留意很多自動(dòng)調(diào)參工具之所以給出的組合看起來(lái)違反直覺(jué)就是因?yàn)樗鼈兺瑫r(shí)考慮了這種交互作用。5. 我踩過(guò)的三個(gè)坑和對(duì)應(yīng)的排查思路如果只聊原理和成功日志這篇筆記的價(jià)值就少了一半。下面這幾個(gè)坑是我和周?chē)笥言趯?shí)操過(guò)程中真實(shí)踩到過(guò)的每一個(gè)都花了不少時(shí)間去排查希望你能繞開(kāi)。5.1 坑一驗(yàn)證集連續(xù)提升但測(cè)試集崩掉有一次我在一個(gè)新任務(wù)上做實(shí)驗(yàn)驗(yàn)證集上的準(zhǔn)確率連續(xù)五個(gè)epoch穩(wěn)步上升我心想這波穩(wěn)了結(jié)果把最終模型放到留出的測(cè)試集上一測(cè)效果比驗(yàn)證結(jié)果低了將近10個(gè)百分點(diǎn)。一開(kāi)始我懷疑是測(cè)試代碼有Bug反復(fù)檢查之后發(fā)現(xiàn)代碼沒(méi)問(wèn)題真正的原因出在驗(yàn)證集本身它太小了而且是從同一個(gè)批次采集的數(shù)據(jù)里切出來(lái)的與訓(xùn)練集存在一定的數(shù)據(jù)泄漏。排查思路是這樣的先檢查驗(yàn)證集和訓(xùn)練集的樣本來(lái)源有沒(méi)有重疊或高度相似的樣本然后看驗(yàn)證集的樣本量如果只有幾十張圖準(zhǔn)確率的置信區(qū)間會(huì)非常大一次波動(dòng)擺個(gè)十個(gè)百分點(diǎn)都很正常最后用K折交叉驗(yàn)證去替換單次劃分觀(guān)察指標(biāo)是否穩(wěn)定。那次之后我再也不敢只用單一固定驗(yàn)證集做重要決策了至少會(huì)額外留一份從不同來(lái)源收集的測(cè)試集來(lái)兜底。5.2 坑二Dropout加太猛導(dǎo)致欠擬合另一個(gè)高頻問(wèn)題就是前面提過(guò)的Dropout強(qiáng)度一上來(lái)反而把模型從過(guò)擬合推到欠擬合的狀態(tài)。表面上驗(yàn)證集和訓(xùn)練集的準(zhǔn)確率差距確實(shí)縮小了但兩者都在低位徘徊整體效果比不加Dropout還差。我當(dāng)時(shí)的排查過(guò)程是先看訓(xùn)練損失有沒(méi)有下降如果訓(xùn)練損失本身就很高說(shuō)明模型在訓(xùn)練階段就沒(méi)有擬合到足夠好的程度這時(shí)候優(yōu)先需要減少Dropout強(qiáng)度或者增加模型容量而不是繼續(xù)加大正則化。把Dropout當(dāng)成“容量調(diào)節(jié)器”來(lái)理解排查就容易很多。當(dāng)發(fā)現(xiàn)模型欠擬合時(shí)第一件要做的事不是堆更多數(shù)據(jù)增強(qiáng)而是把Dropout關(guān)掉或者調(diào)低讓模型有足夠的表達(dá)空間等到訓(xùn)練損失能夠降下來(lái)、驗(yàn)證差距拉大時(shí)再一點(diǎn)點(diǎn)把Dropout加回去。這個(gè)先后順序在我后面的項(xiàng)目中幾乎每次都管用。5.3 坑三把正則化參數(shù)寫(xiě)死在全流程里第三個(gè)坑是我自己最常犯的把一組正則在某個(gè)數(shù)據(jù)集上調(diào)好的參數(shù)直接復(fù)制到新項(xiàng)目里以為一勞永逸。正則化的最優(yōu)強(qiáng)度高度依賴(lài)數(shù)據(jù)規(guī)模、類(lèi)別數(shù)、模型結(jié)構(gòu)和訓(xùn)練時(shí)長(zhǎng)在一項(xiàng)目里堪稱(chēng)完美的設(shè)置換一個(gè)數(shù)據(jù)量差幾倍的任務(wù)時(shí)可能完全不適用。我現(xiàn)在會(huì)在每個(gè)新項(xiàng)目的初期都強(qiáng)制自己跑一個(gè)小網(wǎng)格搜索哪怕只是兩三個(gè)固定檔位比如權(quán)重衰減分別試1e-4、3e-4、1e-3Dropout分別試0.2、0.3、0.4把結(jié)果記錄到表格里再做決策。這個(gè)流程看起來(lái)繁瑣但能幫你快速建立對(duì)“當(dāng)前任務(wù)正則化敏感度”的感覺(jué)比盲目沿用舊配置更可靠。6. 最后想補(bǔ)充的幾點(diǎn)經(jīng)驗(yàn)做了這么多輪實(shí)驗(yàn)之后再回頭看deeplearningbook_035-2這頁(yè)筆記我更傾向于把正則化和泛化看成同一個(gè)問(wèn)題的兩面模型在訓(xùn)練集上表現(xiàn)得越“輕松”越要警惕它是否在偷懶地記住答案而泛化能力強(qiáng)的模型往往在訓(xùn)練過(guò)程中看起來(lái)并不是最耀眼的那個(gè)。我個(gè)人經(jīng)驗(yàn)里價(jià)值最高的一個(gè)習(xí)慣是每次調(diào)正則化之前先在筆記本上寫(xiě)下當(dāng)前模型的過(guò)擬合證據(jù)比如訓(xùn)練和驗(yàn)證的差距、權(quán)重范數(shù)的變化趨勢(shì)、增強(qiáng)前后的性能波動(dòng)然后再?zèng)Q定動(dòng)哪個(gè)旋鈕。盲目調(diào)參不是勤奮而是偷懶。另外一個(gè)小技巧是盡量把正則化的選擇記錄成一張可復(fù)用的實(shí)驗(yàn)清單包括數(shù)據(jù)集規(guī)模區(qū)間、模型結(jié)構(gòu)特征、建議的初始范圍以及出現(xiàn)過(guò)問(wèn)題的組合。下次接到新任務(wù)時(shí)先翻一眼這張表能省掉不少在黑暗中試探的時(shí)間。代碼實(shí)現(xiàn)層面其實(shí)都很直接花更多精力去理解“為什么這個(gè)設(shè)置管用那個(gè)設(shè)置為什么翻車(chē)”才是長(zhǎng)期提升項(xiàng)目能力的真正捷徑。