日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

神经网络调参经验大汇总

發布時間:2025/3/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络调参经验大汇总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:Andrej Karpathy,翻譯:杰少 @大野人007

今天看到一篇非常非常棒的調節NN的文章,作者是特斯拉高級總監Andrej Karpathy,就翻譯過來和大家一起分享,難免翻譯有問題,有興趣的朋友可以去引文閱讀原文。

為了能更好地訓練NN,karpathy為自己定制了一套具體的流程。在每次用NN處理一個新問題的時候,都會按照這套流程來,該流程的核心主要有兩步驟。

  • 從簡單到復雜,每一步我們都會對將要發生的事情做出具體的假設,然后通過實驗驗證這些假設,或者進行研究,直到我們發現一些問題。我們努力防止的是一次引入大量“未經驗證”的復雜假設,這必然會引入錯誤/錯誤配置,這將需要花費很長時間才能找到(如果有的話)。
  • 編寫你的神經網絡代碼并訓練一個,可以使用一個非常小的學習率和猜測,然后在每次迭代后評估完整的測試集。

訓練神經網絡的第一步是不接觸任何神經網絡代碼,而是從檢查數據開始。

這一步至關重要。我喜歡花大量的時間(以小時為單位)瀏覽數千個示例,了解它們的分布并尋找模式。幸運的是,你的大腦在這方面很在行。有一次,我發現數據中包含重復的樣本。另一次我發現損壞的圖像/標簽。我尋找數據不平衡和Bias。我通常還會注意我自己對數據進行分類的過程,這暗示了我們將最終探索的體系結構類型。例如,

  • 非常局部的特征是否足夠?
  • 或者我們是否需要全局上下文的信息?
  • 有多少變化,它采取什么形式?
  • 什么變化是虛假的,是否可以被預處理掉?
  • 空間位置重要嗎?還是我們想把它平均化?
  • 細節有多重要?我們能承受多大程度的減少圖像采樣?
  • 標簽存在多少噪音?

此外,神經網絡實際上是數據集的壓縮/編譯版本,您將能夠查看網絡(mis)預測并了解它們可能來自何處。如果你的網絡給了你一些與你在數據中看到的不一致的預測,那么就有問題了。

一旦你有了一個定性的感覺,寫一些簡單的代碼來搜索/過濾/排序你能想到的任何東西(例如標簽的類型、注釋的大小、注釋的數量等),并可視化它們的分布和任何軸上的異常值也是一個好主意。異常值幾乎總是會暴露出數據質量或預處理中的一些缺陷。

在我們了解我們數據之后,下一步任務便是建立一個完整的**“訓練+評估”**框架,并通過一系列實驗獲得對其正確性。在這個階段,最好選擇一些比較擅長的簡單模型,例如線性分類器,或者較小的卷積網絡等。之后我們便可以進行訓練,可視化損失函數,評估指標(如準確性)等,在進行模型預測,并在過程中使用明確的假設進行消融實驗。

這一步的核心技巧有:

  • 固定隨機種子。始終使用固定的隨機種子,以確保當您運行代碼兩次時,將得到相同的結果。
  • 盡可能簡單,確保禁用任何不必要的假設。在此階段,請務必關閉任何數據擴充的策略。
    • 數據擴充是一種正則化策略,我們以后可能會采用這種策略,但剛開始就引入則經常會犯一些愚蠢的錯誤。
    • 在評估中添加重要的數字。繪制測試損失圖時,對整個(大型)測試集運行評估。不要只繪制批次的測試損失圖,然后依靠在Tensorboard中平滑它們。我們追求正確,非常愿意為了保持理智而放棄時間。
    • 驗證損失@init。確保loss從正確的損失值開始。例如,如果正確初始化最后一層,則應在初始化時在softmax上測量-log(1/n_class)。對于L2回歸、Huber損失等,可以導出相同的默認值。
    • init well。正確初始化最終層的權重。例如,如果您對一些平均值為50的值進行回歸,則將最終偏差初始化為50。如果您有一個正:負比率為1:10的不平衡數據集,則在您的登logits上設置偏差,以便網絡在初始化時預測概率為0.1。正確設置這些參數將加快收斂速度并消除“hockey stick”損失曲線,在最初的幾次迭代中,您的網絡基本上只是在學習偏差。
    • human基線。監控除損失以外的人類可解釋和可檢查的指標(例如準確性)。盡可能評估自己(人類)的準確性并與之進行比較。或者,對測試數據進行兩次注釋,對于每個示例,將一次注釋視為預測,第二次注釋視為基本真理。
    • 輸入相關的基線。訓練輸入獨立的基線(例如,最簡單的方法是將所有輸入設置為零)。這應該比實際插入數據而不將其歸零的情況更糟糕。即:您的模型是否學習從輸入中提取任何信息?
    • 過擬合一個batch。使用少數幾個樣本(例如,僅兩三個樣本)對單個批次進行過擬合。為此,我們增加了模型的容量(例如添加層或filters),并驗證我們可以達到最低的可實現損耗(例如零)。我還喜歡在同一個圖中可視化標簽和預測,并確保一旦我們達到最小損失,它們最終會完美對齊。如果他們不這樣做,那么肯定在某個地方存在一個bug,我們無法繼續下一階段。
    • 驗證是否減少了訓練loss,在這個階段,我們更加希望看到在數據集上欠擬合,因為你正在使用一個玩具模型。試著稍微增加它的容量。你的訓練損失有沒有像應該的那樣減少?
    • 在net之前可視化,可視化數據的明確正確位置就在y_hat=model(x)(或sess.run in tf)之前。也就是說,您希望準確地可視化進入網絡的內容,將數據和標簽的原始張量解碼為可視化。這是唯一的“真理之源”。我無法計算這節省了我多少時間,并暴露了數據預處理和擴充方面的問題。
    • 可視化預測動態。在訓練過程中,我喜歡在固定的測試批次上可視化模型的預測。這些預測的“動態”會讓你對訓練的進展有非常好的直覺。很多時候,如果網絡以某種方式擺動過多,暴露出不穩定性,人們可能會感覺到網絡在努力適應數據。非常低或非常高的學習率在抖動量上也很容易被注意到。
    • 使用backprop來圖表來依賴關系。深度學習代碼通常會包含復雜的、矢量化的和廣播式的操作。我曾經遇到過的一個相對常見的錯誤是,人們錯誤地理解了這一點(例如,他們在某處使用視圖而不是轉置/置換),無意中在批處理維度中混合了信息。這是一個令人沮喪的事實,您的網絡通常仍能正常訓練,因為它將學會忽略其他樣本中的數據。調試此問題(以及其他相關問題)的一種方法是將損耗設置為微不足道的值,如樣本的所有輸出之和,運行反向傳遞到輸入,并確保僅在第個輸入上獲得非零梯度。例如,可以使用相同的策略來確保時間t時的自回歸模型僅取決于。更一般地說,梯度為您提供了有關網絡中哪些依賴于哪些的信息,這對于調試非常有用。
    • 泛化一個特例。這更像是一個通用的編碼技巧,從頭開始編寫一個相對通用的功能。我喜歡為我現在正在做的事情編寫一個非常具體的函數,讓它工作起來。

    在這一步,我們應該對數據集有很好的理解,并且我們有完整的訓練+評估流程。

    對于任何給定的模型,我們都可以(重復地)計算出我們信任的度量。我們還擁有獨立于輸入的基線的表現,一些愚蠢基線的性能(我們最好擊敗這些基線),我們對人類的表現有一個粗略的感覺(我們希望達到這一點)。現在可以在一個好的模型上進行迭代了。

    我喜歡采用的尋找一個好模型的方法有兩個階段:

    • 首先獲得一個足夠大的模型,使其能夠過擬合(即,關注訓練損失),然后適當地調整它(放棄一些訓練損失以改善驗證損失)。

    我喜歡這兩個階段的原因是,如果我們在任何模型上都無法達到低錯誤率,那么這可能再次表明一些問題、bug或錯誤配置。

    這一步的一些建議:

  • 選擇模型。要達到良好的訓練效果,您需要為數據選擇合適的結構。在選擇這個問題上,我的第一條建議是:不要做英雄。我見過很多人,他們熱衷于瘋狂和創造性地將神經網絡工具箱中的樂高積木堆積在各種對他們認為有意義的結構中。在項目的早期階段強烈抵制這種誘惑。我總是建議人們簡單地找到最相關的論文,然后復制粘貼他們最簡單的體系結構,以獲得良好的性能。例如,如果您正在對圖像進行分類,請不要成為英雄,只需在第一次運行時復制粘貼ResNet-50即可。你可以在以后做一些更習慣的事情,并戰勝它;
  • Adam會相對安全。在設定基線的早期階段,我喜歡使用學習率為3e-4的Adam。根據我的經驗,Adam對超參數(包括糟糕的學習率)更為寬容。對于ConvNets,經過良好調整的SGD幾乎總是略優于Adam,但最佳學習速率區域要窄得多,且針對具體問題(注意:如果您使用RNN和相關序列模型,Adam則更常用。在項目的初始階段,再次強調,不要做英雄,而要遵循最相關的論文。)
  • 一次只復雜化一個。如果您有多個信號要插入分類器,我建議您一個接一個地插入它們,每次都要確保獲得預期的性能提升。不要一開始就把廚房的水槽扔向你的模型。還有其他增加復雜性的方法-例如,您可以嘗試先插入較小的圖像,然后再將其放大,等等。
  • 不要相信學習速率衰減默認值。如果您打算從其他領域重新編寫代碼,請務必非常小心使用學習率衰減。您不僅希望針對不同的問題使用不同的衰減計劃,而且更糟糕的是,在典型schedule實現中,該計劃將基于當前epoch,而當前epoch數僅取決于數據集的大小,可能會有很大的變化。例如,ImageNet將在第30 epoch時衰減10。如果您不訓練ImageNet,那么您幾乎肯定不希望這樣。如果您不小心,您的代碼可能會過早地秘密地將您的學習率降至零,從而導致您的模型無法收斂。在我自己的工作中,我總是禁用學習速率完全衰減(我使用一個常數LR),并在最后一直調整它。
  • 理想情況下,我們現在所處的位置是,我們有一個至少擬合訓練集的大模型。現在需要對其進行正則化,并通過放棄一些訓練精度來獲得更好的驗證精度。這邊有一些技巧:

    • 獲取更多數據。首先,到目前為止,在任何實際環境中正華化模型的最佳和首選方法是添加更多真實的訓練數據。當您可以收集更多數據時,花費大量的工程周期試圖從一個小數據集中榨取數據,這是一個非常常見的錯誤。據我所知,添加更多數據幾乎是單調地提高配置良好的神經網絡幾乎無限期性能的唯一保證。另一種可能是集成(如果你能負擔得起的話),但在5個模型之后,這種繼承就最為流行了。
    • 數據擴充。與真實數據相比,下一個最好的方法是半假數據——嘗試更激進的數據擴充。
    • 創造性的數據增加。如果有一半的假數據不起作用,假數據也可能起到作用。人們正在尋找擴展數據集的創造性方法;例如,域隨機化、模擬的使用、巧妙的混合,例如將(可能模擬的)數據插入場景,甚至是GANs。
    • 預訓練:如果可以的話,即使你有足夠的數據,使用預先訓練好的網絡也不會有什么壞處。
    • 堅持監督學習。不要對無監督的預訓練過度興奮。據我所知,與2008年的那篇博文所告訴你的不同,目前還沒有一個版本的NLP在現代計算機視覺方面取得了很好的效果(盡管這段時間來使用BERT處理NLP問題非常好,很可能是因為文本到特殊性質,以及更高的信噪比)。
    • 較小的輸入維度。刪除可能包含虛假信號的功能。如果您的數據集很小,任何添加的虛假輸入都只是另一個過擬合的機會。同樣,如果低級細節無關緊要,請嘗試輸入較小的圖像。
    • 更小的模型size。在許多情況下,您可以使用網絡上的領域知識約束來減小其大小。例如,過去流行在ImageNet主干的頂部使用完全連接的層,但后來這些層被簡單的平均池所取代,從而消除了過程中的大量參數。
    • 減少batch大小。由于batch范數內的標準化,較小的batch大小在某種程度上對應于更強的正則化。這是因為batch經驗平均值/std是完整平均值/std的更近似版本,因此比例和偏移量會使批次更容易“擺動”。
    • 加上drop。將dropout2d(空間dropout)用于CONVnet。謹慎使用此選項,因為輟學似乎不能很好地處理批處理規范化。
    • 權重衰減。增加weight衰減懲罰。
    • 早停。根據驗證損失停止訓練,以便在模型即將過度擬合時捕捉模型。
    • 試試大一點的模型。我最后一次提到這一點,而且是在提前停止之后,但我發現在過去的幾次中,大型車型當然最終會過度擬合,但它們的“提前停止”性能通常會比小型車型好得多。

    最后,為了使您的網絡成為一個合理的分類器,我喜歡可視化網絡的第一層權重,并確保獲得有意義的好邊。如果您的第一層過濾器看起來像噪音,那么可能會有問題。類似地,網絡內部的激活有時會顯示奇怪的工件并提示問題。

    現在,您應該“in the loop”使用數據集,為達到低驗證損失的結構需要探索更廣闊的模型空間。此步驟的一些提示和技巧:

    • 隨機網格搜索。為了同時調整多個超參數,使用網格搜索來確保覆蓋所有的設置聽起來很誘人,但請記住,最好使用隨機搜索。直覺上,這是因為神經網絡通常比其他網絡對某些參數更敏感。在極限情況下,如果參數a很重要,但更改b沒有效果,那么您寧愿更全面地對a進行采樣,而不是多次在幾個固定點進行采樣。
    • 超參數優化。目前有大量fancy的貝葉斯超參數優化工具箱,我的一些朋友也說出了他們的成功,但我個人的經驗是,探索模型和超參數的美好和廣闊空間的最先進方法是使用實習生:)。只是開玩笑......

    一旦您找到了最佳的結構和超參數,仍然可以使用更多的技巧從結果中榨出最后的汁液:

    • 集成。模型集成是一種幾乎可以保證在任何情況下獲得2%準確率的方法。如果您在測試時負擔不起計算,請考慮使用暗知識將您的集成提取到網絡中。
    • 留著訓練。我經常看到人們試圖在驗證損失趨于平穩時停止模型培訓。根據我的經驗,網絡會持續很長時間的訓練。有一次,我在寒假期間不小心離開了,留著一個模特訓練,當我在一月份回來的時候,那是SOTA。

    結論

    一旦你來到這里,你將擁有成功的所有要素:你對技術、數據集和問題有著深刻的理解,你建立了整個訓練/評估結構,對其準確性有著高度的信心,你探索了越來越復雜的模型,通過預測每一步的方式獲得性能改進。您現在已經準備好閱讀大量論文,嘗試大量實驗,并獲得SOTA結果。祝你好運!

    參考文獻

    A Recipe for Training Neural Networks

    總結

    以上是生活随笔為你收集整理的神经网络调参经验大汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。