
作者 | Andrej Karpathy
編譯 | AI有道
特斯拉人工智能部門主管 Andrej Karpathy 發(fā)布新博客,介紹神經(jīng)網(wǎng)絡(luò)訓(xùn)練的技巧。
Andrej Karpathy 是深度學(xué)習(xí)計(jì)算機(jī)視覺領(lǐng)域、與領(lǐng)域的研究員。博士期間師從李飛飛。在讀博期間,兩次在谷歌實(shí)習(xí),研究在 Youtube 視頻上的大規(guī)模特征學(xué)習(xí),2015 年在 DeepMind 實(shí)習(xí),研究深度強(qiáng)化學(xué)習(xí)。畢業(yè)后,Karpathy 成為 OpenAI 的研究科學(xué)家,后于 2017 年 6 月加入特斯拉擔(dān)任人工智能與視覺總監(jiān)。
今日他發(fā)布的這篇博客能為深度學(xué)習(xí)研究者們提供極為明晰的洞見,在 Twitter 上也引發(fā)了極大的關(guān)注。
1. 誰(shuí)說(shuō)神經(jīng)網(wǎng)絡(luò)訓(xùn)練簡(jiǎn)單了?
很多人認(rèn)為開始訓(xùn)練神經(jīng)網(wǎng)絡(luò)是很容易的,大量庫(kù)和框架號(hào)稱可以用 30 行代碼段解決你的數(shù)據(jù)問(wèn)題,這就給大家留下了(錯(cuò)誤的)印象:訓(xùn)練神經(jīng)網(wǎng)絡(luò)這件事是非常簡(jiǎn)單的,不同模塊即插即用就能搭個(gè)深度模型。
簡(jiǎn)單的建模過(guò)程通常如下所示:
>>> your_data = # plug your awesome dataset here
>>> model = SuperCrossValidator(SuperDuper.fit, your_data, ResNet50, SGDOptimizer)# conquer world here
這些庫(kù)和示例令我們想起了熟悉標(biāo)準(zhǔn)軟件及模塊,標(biāo)準(zhǔn)軟件中通常可以獲取簡(jiǎn)潔的 API 和抽象。
例如 Request 庫(kù)的使用展示如下:
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code200
酷!這些庫(kù)和框架的開發(fā)者背負(fù)起理解用戶 Query 字符串、url、GET/POST 請(qǐng)求、HTTP 連接等的大量需求,將復(fù)雜度隱藏在幾行代碼后面。這就是我們熟悉與期待的。
然而,神經(jīng)網(wǎng)絡(luò)不一樣,它們并不是現(xiàn)成的技術(shù)。我在 2016 年撰寫的一篇博客中試圖說(shuō)明這一點(diǎn),在那篇文章中我認(rèn)為反向傳播是「leaky abstraction」,然而現(xiàn)在的情況似乎更加糟糕了。
Backprop + SGD 不是魔法,無(wú)法讓你的網(wǎng)絡(luò)運(yùn)行;批歸一化也無(wú)法奇跡般地使網(wǎng)絡(luò)更快收斂;RNN 也不能神奇地讓你直接處理文本。不要因?yàn)槟憧梢詫⒆约旱膯?wèn)題表示為強(qiáng)化學(xué)習(xí),就認(rèn)為你應(yīng)該這么做。如果你堅(jiān)持在不理解技術(shù)原理的情況下去使用它,那么你很可能失敗。
2. 背著我不 work 的神經(jīng)網(wǎng)絡(luò)
當(dāng)你破壞代碼或者錯(cuò)誤配置代碼時(shí),你通常會(huì)得到某種異常。你在原本應(yīng)該插入字符串的地方插入了整數(shù);導(dǎo)入出錯(cuò);該關(guān)鍵字不存在……此外,為了方便 debug,你還很可能為某個(gè)功能創(chuàng)建單元測(cè)試。
這還只是開始。訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),有可能所有代碼的句法都正確,但整個(gè)訓(xùn)練就是不對(duì)??赡軉?wèn)題出現(xiàn)在邏輯性(而不是句法),且很難通過(guò)單元測(cè)試找出來(lái)。
例如,你嘗試截?fù)p失度而不是梯度,這會(huì)導(dǎo)致訓(xùn)練期間的異常值被忽視,但語(yǔ)法或維度等檢測(cè)都不會(huì)出現(xiàn)錯(cuò)誤。又或者,你弄錯(cuò)了正則化強(qiáng)度、學(xué)習(xí)率、衰減率、模型大小等的設(shè)置,那么幸運(yùn)的話網(wǎng)絡(luò)會(huì)報(bào)錯(cuò),然而大部分時(shí)候它會(huì)繼續(xù)訓(xùn)練,并默默地變?cè)恪?/span>
因此,「快速激烈」的神經(jīng)網(wǎng)絡(luò)訓(xùn)練方式?jīng)]有用,只會(huì)導(dǎo)致困難?,F(xiàn)在,這些經(jīng)驗(yàn)性困難是使神經(jīng)網(wǎng)絡(luò)正常運(yùn)行的攔路虎,你需要更加周密詳盡地調(diào)試網(wǎng)絡(luò)才能減少困難,需要大量可視化來(lái)了解每一件事。
在我的經(jīng)驗(yàn)中,深度學(xué)習(xí)成功的重要因素是耐心和注重細(xì)節(jié)。
如何解決
基于以上兩點(diǎn)事實(shí),我開發(fā)了一套將神經(jīng)網(wǎng)絡(luò)應(yīng)用于新問(wèn)題的特定流程。該流程嚴(yán)肅地執(zhí)行了上述兩項(xiàng)原則:耐心和注重細(xì)節(jié)。
具體來(lái)說(shuō),它按照從簡(jiǎn)單到復(fù)雜的方式來(lái)構(gòu)建,我們?cè)诿恳徊蕉紝?duì)即將發(fā)生的事作出準(zhǔn)確的假設(shè),然后用實(shí)驗(yàn)來(lái)驗(yàn)證假設(shè)或者調(diào)查直到發(fā)現(xiàn)問(wèn)題。我們?cè)噲D盡力阻止大量「未經(jīng)驗(yàn)證的」復(fù)雜性一次來(lái)襲,這有可能導(dǎo)致永遠(yuǎn)也找不到的 bug/錯(cuò)誤配置。如果讓你像訓(xùn)練神經(jīng)網(wǎng)絡(luò)那樣寫它的代碼,你會(huì)想使用非常小的學(xué)習(xí)率,然后猜測(cè),再在每次迭代后評(píng)估整個(gè)測(cè)試集。
1. 梳理數(shù)據(jù)
訓(xùn)練神經(jīng)網(wǎng)絡(luò)的第一步是不要碰代碼,先徹底檢查自己的數(shù)據(jù)。這一步非常關(guān)鍵。我喜歡用大量時(shí)間瀏覽數(shù)千個(gè)樣本,理解它們的分布,尋找其中的模式。幸運(yùn)的是,人類大腦很擅長(zhǎng)做這件事。有一次,我發(fā)現(xiàn)數(shù)據(jù)中包含重復(fù)的樣本,還有一次我發(fā)現(xiàn)了損壞的圖像/標(biāo)簽。我會(huì)查找數(shù)據(jù)不均衡和偏差。我通常還會(huì)注意自己的數(shù)據(jù)分類過(guò)程,它會(huì)揭示我們最終探索的架構(gòu)。比如,只需要局部特征就夠了還是需要全局語(yǔ)境?標(biāo)簽噪聲多大?
此外,由于神經(jīng)網(wǎng)絡(luò)是數(shù)據(jù)集的壓縮/編譯版本,你能夠查看網(wǎng)絡(luò)(錯(cuò)誤)預(yù)測(cè),理解預(yù)測(cè)從哪里來(lái)。如果網(wǎng)絡(luò)預(yù)測(cè)與你在數(shù)據(jù)中發(fā)現(xiàn)的不一致,那么一定是什么地方出問(wèn)題了。
在你對(duì)數(shù)據(jù)有了一些感知之后,你可以寫一些簡(jiǎn)單的代碼來(lái)搜索/過(guò)濾/排序標(biāo)簽類型、標(biāo)注規(guī)模、標(biāo)注數(shù)量等,并沿任意軸可視化其分布和異常值。異常值通常能夠揭示數(shù)據(jù)質(zhì)量或預(yù)處理中的 bug。
2. 配置端到端訓(xùn)練/評(píng)估架構(gòu)、獲取基線結(jié)果
現(xiàn)在我們已經(jīng)理解了數(shù)據(jù),那我們就可以開始構(gòu)建高大上的多尺度 ASPP FPN ResNet 并訓(xùn)練強(qiáng)大的模型了嗎?當(dāng)然還不到時(shí)候,這是一個(gè)充滿荊棘的道路。我們下一步需要構(gòu)建一個(gè)完整的訓(xùn)練、評(píng)估架構(gòu),并通過(guò)一系列實(shí)驗(yàn)確定我們對(duì)準(zhǔn)確率的置信度。
在這個(gè)階段,你們最好選擇一些不會(huì)出錯(cuò)的簡(jiǎn)單模型,例如線性分類器或非常精簡(jiǎn)的 ConvNet 等。我們希望訓(xùn)練這些模型,并可視化訓(xùn)練損失、模型預(yù)測(cè)和其它度量指標(biāo)(例如準(zhǔn)確率)。當(dāng)然在這個(gè)過(guò)程中,我們還需要基于一些明確假設(shè),從而執(zhí)行一系列對(duì)照實(shí)驗(yàn)(ablation experiments)。
該階段的一些技巧與注意事項(xiàng):
3. 過(guò)擬合
到了這個(gè)階段,我們應(yīng)該對(duì)數(shù)據(jù)集有所了解了,而且有了完整的訓(xùn)練+評(píng)估流程。對(duì)于任何給定的模型,我們可以計(jì)算出我們信任的度量。而且還為獨(dú)立于輸入的基線準(zhǔn)備了性能,一些 dumb 基線的性能(最好超過(guò)這些),我們?nèi)祟惖谋憩F(xiàn)有大致的了解(并希望達(dá)到這一點(diǎn))。現(xiàn)在,我們已經(jīng)為迭代一個(gè)好的模型做好了準(zhǔn)備。
我準(zhǔn)備用來(lái)尋找好模型的方法有兩個(gè)階段:首先獲得足夠大的模型,這樣它能夠過(guò)擬合(即關(guān)注訓(xùn)練損失),然后對(duì)其進(jìn)行適當(dāng)?shù)恼齽t化(棄掉一些訓(xùn)練損失以改進(jìn)驗(yàn)證損失)。我喜歡這兩個(gè)階段的原因是,如果我們不能用任何模型實(shí)現(xiàn)較低的誤差率,則可能再次表明一些問(wèn)題、bug 和配置錯(cuò)誤。
該階段的一些技巧與注意事項(xiàng):
4. 正則化
理想情況下,我們現(xiàn)在至少有了一個(gè)擬合訓(xùn)練集的大模型?,F(xiàn)在是時(shí)候?qū)λM(jìn)行正則化,并通過(guò)放棄一些訓(xùn)練準(zhǔn)確率來(lái)提升驗(yàn)證準(zhǔn)確率了。技巧包括:
最后,為了更加確保網(wǎng)絡(luò)是個(gè)合理的分類器,我喜歡可視化網(wǎng)絡(luò)第一層的權(quán)重,確保自己獲得了有意義的邊緣。如果第一層的濾波器看起來(lái)像噪聲,那需要去掉些東西。類似地,網(wǎng)絡(luò)內(nèi)的激活函數(shù)有時(shí)候也會(huì)揭示出一些問(wèn)題。
5. 精調(diào)
現(xiàn)在你應(yīng)該位于數(shù)據(jù)集一環(huán),探索取得較低驗(yàn)證損失的架構(gòu)模型空間。這一步的一些技巧包括:
6. 最后的壓榨
一旦你找到最好的架構(gòu)類型和超參數(shù),依然可以使用更多的技巧讓系統(tǒng)變得更好:
結(jié)論
一旦你做到了這些,你就具備了成功的所有要素:對(duì)神經(jīng)網(wǎng)絡(luò)、數(shù)據(jù)集和問(wèn)題有了足夠深的了解,配置好了完整的訓(xùn)練/評(píng)估體系,取得高置信度的準(zhǔn)確率,逐漸探索更復(fù)雜的模型,提升每一步的表現(xiàn)。現(xiàn)在萬(wàn)事俱備,就可以去讀大量論文,嘗試大量實(shí)驗(yàn)并取得 SOTA 結(jié)果了。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03