欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

人工智能和機器人研究院 ? 來源:未知 ? 作者:steve ? 2018-04-19 15:21 ? 次閱讀

在學(xué)習(xí)了有關(guān)深度學(xué)習(xí)的理論課程之后,很多人都會有興趣嘗試構(gòu)建一個屬于自己的項目。本文將會從第一步開始,告訴你如何解決項目開發(fā)中會遇到的各類問題。

本文由六大部分組成,涵蓋深度學(xué)習(xí) ( DL ) 項目的整個過程。我們將使用一個自動漫畫著色項目來說明深度學(xué)習(xí)的設(shè)計、程序調(diào)試和參數(shù)調(diào)整過程。

本文主題為「如何啟動一個深度學(xué)習(xí)項目?」,分為以下六個部分:

  • 第一部分:啟動一個深度學(xué)習(xí)項目

  • 第二部分:創(chuàng)建一個深度學(xué)習(xí)數(shù)據(jù)集

  • 第三部分:設(shè)計深度模型

  • 第四部分:可視化深度網(wǎng)絡(luò)模型及度量指標(biāo)

  • 第五部分:深度學(xué)習(xí)網(wǎng)絡(luò)中的調(diào)試

  • 第六部分:改善深度學(xué)習(xí)模型性能及網(wǎng)絡(luò)調(diào)參

第一部分:啟動一個深度學(xué)習(xí)項目

應(yīng)該選擇什么樣的項目?

很多人工智能項目其實并沒有那么嚴肅,做起來還很有趣。2017 年初,我著手啟動了一個為日本漫畫上色的項目,并作為我對生成對抗網(wǎng)絡(luò) ( GAN ) 研究的一部分。這個問題很難解決,但卻很吸引人,尤其是對于我這種不會畫畫的人來說!在尋找項目時,不要局限于增量性改進,去做一款適銷對路的產(chǎn)品,或者創(chuàng)建一種學(xué)習(xí)速度更快、質(zhì)量更高的新模型。

調(diào)試深度網(wǎng)絡(luò)(DN)非常棘手

訓(xùn)練深度學(xué)習(xí)模型需要數(shù)百萬次的迭代,因此查找 bug 的過程非常艱難,而且容易崩壞。因此我們要從簡單的地方著手,循序漸進,例如模型的優(yōu)化(如正則化)始終可以在代碼調(diào)試完成后進行。此外,我們還需要經(jīng)常可視化預(yù)測結(jié)果和模型度量標(biāo)準,并且我們首先需要令模型跑起來,這樣就有一個可以后退的基線。我們最好不要陷在一個很大的模型,并嘗試將所有的模塊都弄好。

度量和學(xué)習(xí)

宏偉的項目計劃可能帶慘烈的失敗。多數(shù)個人項目的第一個版本會持續(xù)兩到四個月,這個時間非常短暫,因為研究、調(diào)試和實驗都需要花費大量的時間。一般我們安排這些復(fù)雜的實驗,使其通宵運行,到第二天清晨時,我們希望得到足夠的信息來采取下一步行動。在早期階段,這些實驗不應(yīng)超過 12 小時,這是一條良好的經(jīng)驗法則。為了做到這一點,我們將漫畫上色項目范圍縮小到單個動畫人物的上色。此外,我們需要設(shè)計很多測試,因此借助它們分析模型在實驗中的不足之處。一般這些測試不要計劃得太遠,我們需要快速度量、學(xué)習(xí),并為下一步設(shè)計提供足夠的反饋。

研究與產(chǎn)品

當(dāng)我們在 2017 年春季開始討論漫畫上色項目時,Kevin Frans 有一個 Deepcolor 項目,用 GAN 為漫畫添加色彩提示。

在確定目標(biāo)時,你會花很大力氣來確保項目完成后仍然具有意義。GAN 模型相當(dāng)復(fù)雜,2017 年初還沒達到嵌入產(chǎn)品所需的質(zhì)量水準。然而,如果你把應(yīng)用范圍縮小到產(chǎn)品可以巧妙處理的程度,你就可以把質(zhì)量提高到商用水準。為此,無論著手啟動何種 DL 項目,都要把握好模型泛化、容量和準確性之間的平衡。

成本

必須使用 GPU 來訓(xùn)練實際模型。它比 CPU 快 20 到 100 倍。價格最低的亞馬遜 GPU p2.xlarge 站點實例要價 7.5 美元/天,而 8 核 GPU 的價格則高達 75 美元/天。在我們的漫畫上色項目中,一些實驗花費的時間就超過兩天,因此平均每周花費至少需要 150 美元。至于更快的 AWS 實例,花費可能高達 1500 美元/周。我們可以購買獨立計算機,而不是使用云計算。2018 年 2 月,搭載 Nvidia GeForce GTX 1080 Ti 的臺式機售價約為 2200 美元。在訓(xùn)練精調(diào)的 VGG 模型時,它比 P2 實例大約要快 5 倍。

時間線

我們將開發(fā)分為四個階段,最后三個階段在多次迭代中進行。

  • 項目研究

  • 模型設(shè)計

  • 實現(xiàn)及調(diào)試

  • 實驗及調(diào)參

項目研究

我們會先對現(xiàn)有產(chǎn)品進行研究,以探索它們的弱點。許多 GAN 類型的解決方案使用空間顏色提示,圖案有點不清晰,有時還會出現(xiàn)顏色混雜。我們?yōu)樽约旱捻椖吭O(shè)定了兩個月的時間框架,其中有兩個優(yōu)先事項:生成不帶提示的顏色及提高顏色保真度。我們的目標(biāo)是:

在單個動畫角色上為灰度漫畫著色,且不使用空間顏色提示。

站在巨人的肩膀上

接下來,我們需要了解相關(guān)的研究和開源項目,許多人在開始實踐之前至少要看幾十篇論文和項目。例如,當(dāng)我們深入研究 GAN 時,發(fā)現(xiàn)有十幾個新的 GAN 模型: DRAGAN、cGAN、LSGAN 等,閱讀研究論文可能會很痛苦,但非常有意義。

深度學(xué)習(xí) ( DL ) 代碼簡練,但很難排查缺陷,且很多研究論文常常遺漏了實現(xiàn)細節(jié)。許多項目始于開源實現(xiàn),解決的問題也很相似,因此我們可以多多搜索開源項目。因此我們在 GitHub 上查看了不同 GAN 變體的代碼實現(xiàn),并對它們進行若干次測試。

第二部分:創(chuàng)建一個深度學(xué)習(xí)數(shù)據(jù)集

深度學(xué)習(xí)項目的成功取決于數(shù)據(jù)集的質(zhì)量。在本文的第 2 部分中,我們將探討創(chuàng)建優(yōu)質(zhì)訓(xùn)練數(shù)據(jù)集的核心問題。

公開及學(xué)術(shù)數(shù)據(jù)集

對于研究項目,可以搜索已建立的公開數(shù)據(jù)集。這些數(shù)據(jù)集可以提供更整齊的樣本和基線模型性能。如果你有多個可用的公開數(shù)據(jù)集,請選擇與你的問題最相關(guān)且質(zhì)量最好的樣本。

自定義數(shù)據(jù)集

對于實際問題,我們需要來自問題領(lǐng)域的樣本。首先嘗試查找公共數(shù)據(jù)集。關(guān)于創(chuàng)建高質(zhì)量自定義數(shù)據(jù)集的研究還有所欠缺。如果沒有可用的資料,請搜尋你可以抓取數(shù)據(jù)的位置。該位置通常有很多參考,但數(shù)據(jù)質(zhì)量通常較低,還需要投入大量精力進行整理。在抓取樣本之前,要專門抽出時間評估所有選項并選擇最相關(guān)的選項。

高質(zhì)量數(shù)據(jù)集應(yīng)該包括以下特征:

  • 類別均衡

  • 數(shù)據(jù)充足

  • 數(shù)據(jù)和標(biāo)記中有高質(zhì)量信息

  • 數(shù)據(jù)和標(biāo)記錯誤非常小

  • 與你的問題相關(guān)

不要一次爬取所有數(shù)據(jù)。我們經(jīng)常借助標(biāo)簽和分類來抓取網(wǎng)站樣本,從而獲取與我們的問題相關(guān)的數(shù)據(jù)。最好的爬取方法是在你的模型中訓(xùn)練、測試少量樣本,并根據(jù)得到的經(jīng)驗教訓(xùn)改善抓取方法。

清理你抓取的數(shù)據(jù)非常重要,否則,即使最好的模型設(shè)計也達不到與人類水平相當(dāng)?shù)谋憩F(xiàn)。Danbooru 和 Safebooru 是兩個非常受歡迎的動漫人物來源,但是一些深入學(xué)習(xí)的應(yīng)用程序偏愛 Getchu,以獲得更高質(zhì)量的繪圖。我們可以使用一組標(biāo)簽從 Safebooru 下載圖像,并直觀地檢查樣本并運行測試來分析錯誤(表現(xiàn)不佳的樣本)。

模型訓(xùn)練和視覺評估都提供了進一步的信息來細化我們的標(biāo)簽選擇。隨著迭代的繼續(xù),我們將學(xué)到更多,并逐漸進行樣本積累。我們還需要使用分類器進一步過濾與問題無關(guān)的樣本,如清除所有人物過小的圖像等。與學(xué)術(shù)數(shù)據(jù)集相比,小型項目收集的樣本很少,在適當(dāng)情況下可以應(yīng)用遷移學(xué)習(xí)。

下面的左圖由 PaintsChainer 提供,右圖由最終的模型上色:

我們決定用一些訓(xùn)練樣本來對算法進行測試。結(jié)果并沒有給人驚喜,應(yīng)用的顏色較少,樣式也不正確。

由于對模型進行了一段時間的訓(xùn)練,我們知道什么樣的繪圖表現(xiàn)欠佳。正如預(yù)期的那樣,結(jié)構(gòu)錯綜復(fù)雜的繪圖更難上色。

這說明好好選擇樣本非常重要。作為一款產(chǎn)品,PaintsChainer 專注于它們擅長的線條類型,這點非常明智。這次我使用了從互聯(lián)網(wǎng)上挑選的干凈線條藝術(shù),結(jié)果再次給人驚喜。

這里有一些經(jīng)驗教訓(xùn):數(shù)據(jù)沒有好壞之分,只是有些數(shù)據(jù)不能滿足你的需求。此外,隨著樣本類別的增加,訓(xùn)練和保持輸出質(zhì)量會變得更加困難,刪除不相關(guān)的數(shù)據(jù)可以得到一個更好的模型。

在開發(fā)早期,我們認識到一些繪圖有太多錯綜復(fù)雜的結(jié)構(gòu)。在不顯著增加模型容量的情況下,這些繪圖在訓(xùn)練中產(chǎn)生的價值很小,因此最好不要使用,否則只會影響訓(xùn)練效率。

重點回顧

  • 盡可能使用公共數(shù)據(jù)集;

  • 尋找可以獲取高質(zhì)量、多樣化樣本的最佳網(wǎng)站;

  • 分析錯誤并過濾掉與實際問題無關(guān)的樣本;

  • 迭代地創(chuàng)建你的樣本;

  • 平衡每個類別的樣本數(shù);

  • 訓(xùn)練之前先整理樣本;

  • 收集足夠的樣本。如果樣本不夠,應(yīng)用遷移學(xué)習(xí)。

第三部分:深度學(xué)習(xí)設(shè)計

第三部分介紹了一些高層次的深度學(xué)習(xí)策略,接下來我們將詳細介紹最常見的設(shè)計選擇,這可能需要一些基本的 DL 背景。

簡單靈活

設(shè)計初始要簡單、小巧。在學(xué)習(xí)階段,人們腦海中會充斥大量很酷的觀念。我們傾向于一次性把所有細節(jié)都編碼進來。但這是不現(xiàn)實的,最開始就想要超越頂尖的結(jié)果并不實際。從較少網(wǎng)絡(luò)層和自定義開始設(shè)計,后面再做一些必要的超參數(shù)精調(diào)方案。這些都需要查證損失函數(shù)一直在降低,不要一開始就在較大的模型上浪費時間。

在簡短的 Debug 之后,我們的模型經(jīng)過 5000 次迭代產(chǎn)生了簡單的結(jié)果。但至少該模型所上的顏色開始限制在固定區(qū)域內(nèi),且膚色也有些顯露出來。

在模型是否開始上色上,以上結(jié)果給了我們有價值的反饋。所以不要從大模型開始,不然你會花費大量時間 Debug 和訓(xùn)練模型。

優(yōu)先性以及增量設(shè)計

首先為了創(chuàng)造簡單的設(shè)計,我們需要選出優(yōu)先項。把復(fù)雜問題分解成小問題,一步一步解決。做深度學(xué)習(xí)的正確策略是快速的執(zhí)行學(xué)到的東西。在跳到使用無暗示(no hints)模型之前,我們先使用帶有空間顏色暗示的模型。不要一步跳到「無暗示」模型設(shè)計,例如我們首先去掉暗示中的空間信息,顏色質(zhì)量會急劇下降,所以我們轉(zhuǎn)變優(yōu)先性,在做下一步前先精煉我們的模型。在設(shè)計模型的過程中,我們會遇到許多驚喜。相比于做個要不斷改變的長期計劃,還不如以優(yōu)先性驅(qū)動的計劃。使用更短、更小的設(shè)計迭代,從而保證項目可管理性。

避免隨機改進

首先分析自己模型的弱點,而不是隨意地改進,例如用雙向 LSTM 或者 PReLU。我們需要根據(jù)可視化模型誤差(表現(xiàn)極差的場景)以及性能參數(shù)來確定模型問題。隨意做改進反而適得其反,會成比例的增加訓(xùn)練成本,而回報極小。

限制

我們把限制應(yīng)用到網(wǎng)絡(luò)設(shè)計,從而保證訓(xùn)練更高效。建立深度學(xué)習(xí)并不是簡單的把網(wǎng)絡(luò)層堆在一起。增加好的限制(constraints)能使得學(xué)習(xí)更為有效,或者更智能。例如,應(yīng)用注意機制,能讓網(wǎng)絡(luò)知道注意哪里,在變分自編碼器中,我們訓(xùn)練隱藏因子使其服從正態(tài)分布。在設(shè)計中,我們應(yīng)用去噪方法通過歸零除去空間顏色暗示的大量分數(shù)。啼笑皆非的是,這使得模型能更好地學(xué)習(xí)、泛化。

設(shè)計細節(jié)

文章接下來的部分,將討論深度學(xué)習(xí)項目中會遇到的一些常見的設(shè)計選擇。

深度學(xué)習(xí)軟件框架

自谷歌 2015 年 11 月發(fā)布 TensorFlow 以來,短短 6 個月就成為了最流行的深度學(xué)習(xí)框架。雖然短期看起來難有競爭對手,但一年后 Facebook 就發(fā)布了 PyTorch,且極大的受研究社區(qū)的關(guān)注。到 2018 年,已經(jīng)有大量的深度學(xué)習(xí)平臺可供選擇,包括 TensorFlow、PyTorch、Caffe、Caffe2、MXNet、CNTK 等。

一些研究員之所以轉(zhuǎn)向 PyTorch 有一主要因素:PyTorch 設(shè)計上注重端用戶(end-user),API 簡單且直觀。錯誤信息可以直觀地理解,API 文檔也非常完整。PyTorch 中的特征,例如預(yù)訓(xùn)練模型、數(shù)據(jù)預(yù)處理、載入常用數(shù)據(jù)集都非常受歡迎。

TensorFlow 也非常棒,但目前為止它還是采用自下而上的方式,使其變得極為復(fù)雜。TensorFlow 的 API 很冗長,Debug 也不一樣,它大概有十幾種建立深度網(wǎng)絡(luò)的 API 模型。

截止到 2018 年 2 月,TensorFlow 依然獨占鰲頭。開發(fā)者社區(qū)依然是是最大的。這是非常重要的因素。如果你想要用多個機器訓(xùn)練模型,或者把推理引擎部署到移動手機上,TensorFlow 是唯一的選擇。然而,如果其他平臺變得更加專注端用戶,我們可以預(yù)見將會有更多從小項目轉(zhuǎn)向中級項目。

隨著 TensorFlow 的發(fā)展,有很多 API 可供選擇來建立深度網(wǎng)絡(luò)。最高層的 API 是提供隱式積分的評估器,而 TensorBoard 提供了性能評估。最低層的 API 非常冗長,在許多模塊中都有?,F(xiàn)在,它用封裝器 API 合并到了 tf.layers、tf.metrics 和 tf.losses 模塊,從而更容易地建立深度網(wǎng)絡(luò)層。

對想要更直觀 API 的研究者來說,還有 Keras、TFLearn、TF-Slim 等可以選擇,這些都可直接在 TensorFlow 上使用。我建議是選擇帶有所需要的預(yù)訓(xùn)練模型與工具(來下載數(shù)據(jù)集)的框架,此外在學(xué)術(shù)界,用 Keras API 做原型設(shè)計相當(dāng)流行。

遷移學(xué)習(xí)

不要做重復(fù)的工作。許多深度學(xué)習(xí)軟件平臺都有 VGG19、ResNet、Inception v3 這樣的預(yù)訓(xùn)練模型。從頭開始訓(xùn)練非常耗費時間。就像 2014 年 VGG 論文中所說的,「VGG 模型是用 4 塊英偉達 Titan Black GPU 訓(xùn)練的,根據(jù)架構(gòu)訓(xùn)練單個網(wǎng)絡(luò)需要 2-3 周的時間?!?/p>

許多預(yù)訓(xùn)練模型可用于解決深度學(xué)習(xí)難題。例如,我們使用預(yù)訓(xùn)練 VGG 模型提取圖像特征,并將這些特征反饋到 LSTM 模型來生成描述。許多預(yù)訓(xùn)練模型都用 ImageNet 數(shù)據(jù)集訓(xùn)練,如果你的目標(biāo)數(shù)據(jù)和 ImageNet 差別不大,我們將固定大部分模型參數(shù),只重新訓(xùn)練最后幾個完全連接的層。否則,我們就要使用訓(xùn)練數(shù)據(jù)集對整個網(wǎng)絡(luò)進行端到端的重訓(xùn)練。但是在這兩種情況下,由于模型已經(jīng)過預(yù)訓(xùn)練,再訓(xùn)練所需的迭代將大大減少。由于訓(xùn)練時間較短,即使訓(xùn)練數(shù)據(jù)集不夠大,也可以避免過擬合。這種遷移學(xué)習(xí)在各個學(xué)科都很有效,例如用預(yù)先訓(xùn)練好的英語模型訓(xùn)練漢語模型。

然而,這種遷移學(xué)習(xí)僅適用于需要復(fù)雜模型來提取特征的問題。在我們的項目中,我們的示例與 ImageNet 不同,我們需要對模型進行端到端的重新訓(xùn)練。然而,當(dāng)我們只需要相對簡單的潛在因素(顏色)時,來自 VGG19 的訓(xùn)練復(fù)雜度太高。因此,我們決定建立一個新的更簡單的 CNN 特征提取模型。

成本函數(shù)

并非所有的成本函數(shù)都是等價的,它會影響模型的訓(xùn)練難度。有些成本函數(shù)是相當(dāng)標(biāo)準的,但有些問題域需要仔細考慮。

  • 分類問題:交叉熵,折頁損失函數(shù)(SVM)

  • 回歸: 均方誤差(MSE)

  • 對象檢測或分割:交并比(IoU)

  • 策略優(yōu)化:KL 散度

  • 詞嵌入:噪音對比估計(NCE)

  • 詞向量:余弦相似度

在理論分析中看起來不錯的成本函數(shù)在實踐中可能不太好用。例如,GAN 中鑒別器網(wǎng)絡(luò)的成本函數(shù)采用了更為實用也更經(jīng)得起實驗考驗的方法,而不是理論分析中看起來不錯的方法。在一些問題域中,成本函數(shù)可以是部分猜測加部分實驗,也可以是幾個成本函數(shù)的組合。我們的項目始于標(biāo)準 GAN 成本函數(shù)。此外,我們還添加了使用 MSE 和其他正則化成本的重建成本。然而,如何找到更好的成本函數(shù)是我們項目中尚未解決的問題之一,我們相信它將對色彩保真度產(chǎn)生重大影響。

度量標(biāo)準

良好的度量標(biāo)準有助于更好地比較和調(diào)整模型。對于特殊問題,請查看 Kaggle 平臺,該平臺組織了許多 DL 競賽,并提供了詳細的度量標(biāo)準。不幸的是,在我們的項目中,你很難定義一個精確的公式來衡量藝術(shù)渲染的準確性。

正則化

L1 正則化和 L2 正則化都很常見,但 L2 正則化在深度學(xué)習(xí)中更受歡迎。

L1 正則化有何優(yōu)點?L1 正則化可以產(chǎn)生更加稀疏的參數(shù),這有助于解開底層表示。由于每個非零參數(shù)會往成本上添加懲罰,與 L2 正則化相比,L1 更加青睞零參數(shù),即與 L2 正則化中的許多微小參數(shù)相比,它更喜歡零參數(shù)。L1 正則化使過濾器更干凈、更易于解釋,因此是特征選擇的良好選擇。L1 對異常值的脆弱性也較低,如果數(shù)據(jù)不太干凈,運行效果會更好。然而,L2 正則化仍然更受歡迎,因為解可能更穩(wěn)定。

梯度下降

始終密切監(jiān)視梯度是否消失或爆炸,梯度下降問題有許多可能的原因,這些原因難以證實。不要跳至學(xué)習(xí)速率調(diào)整或使模型設(shè)計改變太快,小梯度可能僅僅由編程 Bug 引起,如輸入數(shù)據(jù)未正確縮放或權(quán)重全部初始化為零。

如果消除了其他可能的原因,則在梯度爆炸時應(yīng)用梯度截斷(特別是對于 NLP)。跳過連接是緩解梯度下降問題的常用技術(shù)。在 ResNet 中,殘差模塊允許輸入繞過當(dāng)前層到達下一層,這有效地增加了網(wǎng)絡(luò)的深度。

縮放

縮放輸入特征。我們通常將特征縮放為以零為均值在特定范圍內(nèi),如 [-1, 1]。特征的不適當(dāng)縮放是梯度爆炸或降低的一個最常見的原因。有時我們從訓(xùn)練數(shù)據(jù)中計算均值和方差,以使數(shù)據(jù)更接近正態(tài)分布。如果縮放驗證或測試數(shù)據(jù),要再次利用訓(xùn)練數(shù)據(jù)的均值和方差。

批歸一化和層歸一化

每層激活函數(shù)之前節(jié)點輸出的不平衡性是梯度問題的另一個主要來源,必要時需要對 CNN 應(yīng)用批量歸一化(BN)。如果適當(dāng)?shù)貥?biāo)準化(縮放)輸入數(shù)據(jù),DN 將學(xué)習(xí)得更快更好。在 BN 中,我們從每批訓(xùn)練數(shù)據(jù)中計算每個空間位置的均值和方差。例如,批大小為 16,特征圖具有 10 X10 的空間維度,我們計算 100 個平均值和 100 個方差(每個位置一個)。每個位置處的均值是來自 16 個樣本的對應(yīng)位置平均值,我們使用均值和方差來重新歸一化每個位置的節(jié)點輸出。BN 提高了準確度,同時縮短了訓(xùn)練時間。

然而,BN 對 RNN 無效,我們需要使用層歸一化。在 RNN 中,來自 BN 的均值和方差不適合用來重新歸一化 RNN 單元的輸出,這可能是因為 RNN 和共享參數(shù)的循環(huán)屬性。在層歸一化中,輸出由當(dāng)前樣本的層輸出計算的平均值和方差重新歸一化。一個含有 100 個元素的層僅使用來自當(dāng)前輸入的一個平均值方差來重新歸一化該層。

Dropout

可以將 Dropout 應(yīng)用于層以歸一化模型。2015 年批量歸一化興起之后,dropout 熱度降低。批量歸一化使用均值和標(biāo)準差重新縮放節(jié)點輸出。這就像噪聲一樣,迫使層對輸入中的變量進行更魯棒的學(xué)習(xí)。由于批量歸一化也有助于解決梯度下降問題,因此它逐漸取代了 Dropout。

結(jié)合 Dropout 和 L2 正則化的好處是領(lǐng)域特定的。通常,我們可以在調(diào)優(yōu)過程中測試 dropout,并收集經(jīng)驗數(shù)據(jù)來證明其益處。

激活函數(shù)

在 DL 中,ReLU 是最常用的非線性激活函數(shù)。如果學(xué)習(xí)速率太高,則許多節(jié)點的激活值可能會處于零值。如果改變學(xué)習(xí)速率沒有幫助,我們可以嘗試 leaky ReLU 或 PReLU。在 leaky ReLU 中,當(dāng) x < 0 時,它不輸出 0,而是具有小的預(yù)定義向下斜率(如 0.01 或由超參數(shù)設(shè)置)。參數(shù) ReLU(PReLU)往前推動一步。每個節(jié)點將具有可訓(xùn)練斜率。

拆分數(shù)據(jù)集

為了測試實際性能,我們將數(shù)據(jù)分為三部分: 70 % 用于訓(xùn)練,20 % 用于驗證,10 % 用于測試。確保樣本在每個數(shù)據(jù)集和每批訓(xùn)練樣本中被充分打亂。在訓(xùn)練過程中,我們使用訓(xùn)練數(shù)據(jù)集來構(gòu)建具有不同超參數(shù)的模型。我們使用驗證數(shù)據(jù)集來運行這些模型,并選擇精確度最高的模型。但是保險起見,我們使用 10 % 的測試數(shù)據(jù)進行最后的錯亂檢查。如果你的測試結(jié)果與驗證結(jié)果有很大差異,則應(yīng)將數(shù)據(jù)打亂地更加充分或收集更多的數(shù)據(jù)。

基線

設(shè)置基線有助于我們比較模型和 Debug,例如我們可使用 VGG19 模型作為分類問題的基線。或者,我們可以先擴展一些已建立的簡單模型來解決我們的問題。這有助于我們更好地了解問題,并建立性能基線進行比較。在我們的項目中,我們修改了已建立的 GAN 實現(xiàn)并重新設(shè)計了作為基線的生成網(wǎng)絡(luò)。

檢查點

我們定期保存模型的輸出和度量以供比較。有時,我們希望重現(xiàn)模型的結(jié)果或重新加載模型以進一步訓(xùn)練它。檢查點允許我們保存模型以便以后重新加載。但是,如果模型設(shè)計已更改,則無法加載所有舊檢查點。我們也使用 Git 標(biāo)記來跟蹤多個模型,并為特定檢查點重新加載正確的模型。我們的設(shè)計每個檢查點占用 4gb 空間。在云環(huán)境中工作時,應(yīng)相應(yīng)配置足夠的存儲。我們經(jīng)常啟動和終止 Amazon 云實例,因此我們將所有文件存儲在 Amazon EBS 中,以便于重新連接。

自定義層

深度學(xué)習(xí)軟件包中的內(nèi)建層已經(jīng)得到了更好的測試和優(yōu)化。盡管如此,如果想自定義層,你需要:

  • 用非隨機數(shù)據(jù)對前向傳播和反向傳播代碼進行模塊測試;

  • 將反向傳播結(jié)果和樸素梯度檢查進行對比;

  • 在分母中添加小量的?或用對數(shù)計算來避免 NaN 值。

歸一化

深度學(xué)習(xí)的一大挑戰(zhàn)是可復(fù)現(xiàn)性。在調(diào)試過程中,如果初始模型參數(shù)在 session 間保持變化,就很難進行調(diào)試。因此,我們明確地對所有隨機發(fā)生器初始化了種子。我們在項目中對 python、NumPy 和 TensorFlow 都初始化了種子。在精調(diào)過程中,我們我們關(guān)閉了種子初始化,從而為每次運行生成不同的模型。為了復(fù)現(xiàn)模型的結(jié)果,我們將對其進行 checkpoint,并在稍后重新加載它。

優(yōu)化器

Adam 優(yōu)化器是深度學(xué)習(xí)中最流行的優(yōu)化器之一。它適用于很多種問題,包括帶稀疏或帶噪聲梯度的模型。其易于精調(diào)的特性使得它能快速獲得很好的結(jié)果。實際上,默認的參數(shù)配置通常就能工作得很好。Adam 優(yōu)化器結(jié)合了 AdaGrad 和 RMSProp 的優(yōu)點。Adam 對每個參數(shù)使用相同的學(xué)習(xí)率,并隨著學(xué)習(xí)的進行而獨立地適應(yīng)。Adam 是基于動量的算法,利用了梯度的歷史信息。因此,梯度下降可以運行得更加平滑,并抑制了由于大梯度和大學(xué)習(xí)率導(dǎo)致的參數(shù)振蕩問題。

Adam 優(yōu)化器調(diào)整

Adam 有 4 個可配置參數(shù):

  • 學(xué)習(xí)率(默認 0.001);

  • β1:第一個矩估計的指數(shù)衰減率(默認 0.9);

  • β2:第二個矩估計的指數(shù)衰減率(默認 0.999),這個值在稀疏梯度問題中應(yīng)該被設(shè)置成接近 1;

  • ?(默認值 1e^-8)是一個用于避免除以零運算的小值。

β(動量)通過累積梯度的歷史信息來平滑化梯度下降。通常對于早期階段,默認設(shè)置已經(jīng)能工作得很好。否則,最可能需要改變的參數(shù)應(yīng)該是學(xué)習(xí)率。

總結(jié)

以下是對深度學(xué)習(xí)項目的主要步驟的簡單總結(jié):

? Define task (Object detection, Colorization of line arts)? Collect dataset (MS Coco, Public web sites) ? Searchforacademic datasetsandbaselines ? Build your own (From Twitter, News, Website,…)? Define the metrics ? Searchforestablished metrics? Cleanandpreprocess the data ? Select featuresandtransform data ? One-hot vector, bag of words, spectrogram etc... ? Bucketize, logarithm scale, spectrogram ? Remove noiseoroutliers ? Remove invalidandduplicate data ? Scaleorwhiten data? Split datasetsfortraining, validationandtesting ? Visualize data ? Validate dataset? Establish a baseline ? Compute metricsforthe baseline ? Analyze errorsforarea of improvements? Select network structure ? CNN, LSTM…? Implement a deep network ? Code debuggingandvalidation ? Parameter initialization ? Compute lossandmetrics ? Choose hyper-parameters ? Visualize, validateandsummarize result ? Analyze errors ? Add layersandnodes ? Optimization? Hyper-parameters fine tunings? Try our model variants

第四部分:可視化深度神經(jīng)網(wǎng)絡(luò)模型和指標(biāo)

在為深度神經(jīng)網(wǎng)絡(luò)排除故障方面,人們總是太快、太早地下結(jié)論了。在了解如何排除故障前,我們要先考慮要尋找什么,再花費數(shù)小時時間追蹤故障。這部分我們將討論如何可視化深度學(xué)習(xí)模型和性能指標(biāo)。

TensorBoard

在每一步追蹤每個動作、檢查結(jié)果非常重要。在預(yù)置包如 TensorBoard 的幫助下,可視化模型和性能指標(biāo)變得簡單,且獎勵幾乎是同時的。

數(shù)據(jù)可視化(輸入、輸出)

驗證模型的輸入和輸出。在向模型饋送數(shù)據(jù)之前,先保存一些訓(xùn)練和驗證樣本用于視覺驗證。取消數(shù)據(jù)預(yù)處理。將像素值重新調(diào)整回 [0, 255]。檢查多個批次,以確定我們沒有重復(fù)相同批次的數(shù)據(jù)。左下圖像是一些訓(xùn)練樣本,右下方驗證樣本。

有時,驗證輸入數(shù)據(jù)的直方圖很棒。完美情況下,它應(yīng)該是以 0 為中心的,區(qū)間在 -1 和 1 之間。如果特征在不同的尺度中,那么梯度要么下降要么爆炸(根據(jù)學(xué)習(xí)率而定)。

定期保存對應(yīng)模型的輸出,用于驗證和誤差分析。例如,驗證輸出中的顏色稍淺。

指標(biāo)(損失 & 準確率)

除了定期記錄損失和準確率之外,我們還可以記錄和繪制它們,以分析其長期趨勢。下圖是 TensorBoard 上展示的準確率和交叉熵損失。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

繪制損失圖能夠幫助我們調(diào)整學(xué)習(xí)率。損失的任意長期上升表明學(xué)習(xí)率太高了。如果學(xué)習(xí)率較低,則學(xué)習(xí)的速度變慢。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

這里是另一個學(xué)習(xí)率太高的真實樣本。我們能看到損失函數(shù)突然上升(可能由梯度突然上升引起)。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

我們使用準確率圖調(diào)整正則化因子。如果驗證和訓(xùn)練準確率之間存在很大差距,則該模型出現(xiàn)過擬合。為了緩解過擬合,我們需要提高正則化因子。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

小結(jié)

權(quán)重 & 偏置:我們緊密監(jiān)控權(quán)重和偏置。下圖是層 1 在不同訓(xùn)練迭代中的權(quán)重和偏置。出現(xiàn)大型(正/負)權(quán)重是不正常的。正態(tài)分布的權(quán)重表明訓(xùn)練過程很順利(但是也不一定)。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

激活:為了梯度下降以實現(xiàn)最佳性能,激活函數(shù)之前的節(jié)點輸出應(yīng)該呈正態(tài)分布。如果不是,那么我們可能向卷積層應(yīng)用批歸一化,或者向 RNN 層應(yīng)用層歸一化。我們還監(jiān)控激活函數(shù)之后無效節(jié)點(0 激活)的數(shù)量。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

梯度:我們監(jiān)控每一層的梯度,以確定一個最嚴肅的深度學(xué)習(xí)問題:梯度消失或爆炸。如果梯度從最右層向最左層快速下降,那么就出現(xiàn)了梯度消失問題。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

這或許不是很常見:我們可視化了 CNN 濾波器。它識別出模型提取的特征的類型。如下圖所示,前兩個卷積層在檢測邊界和顏色。

對于 CNN,我們可以看到特征圖在學(xué)習(xí)什么。下圖捕捉了特定圖中具備最高激活函數(shù)的 9 張圖(右側(cè))。它還使用解卷積網(wǎng)絡(luò)從特征圖中重建空間圖像(左圖)。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

Visualizing and Understanding Convolutional Networks, Matthew D Zeiler et al.

這種圖像重建很少進行。但是在生成模型中,我們經(jīng)常改變一個潛在因子、保持其他不變。它驗證該模型是否在智能地學(xué)習(xí)。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

Dynamic Routing Between Capsules, Sara Sabour, Nicholas Frosst, Geoffrey E Hinton

第五部分:調(diào)試深度學(xué)習(xí)網(wǎng)絡(luò)

深度學(xué)習(xí)的問題解決步驟

在前期開發(fā)中,我們會同時遇到多個問題。就像前面提到的,深度學(xué)習(xí)訓(xùn)練由數(shù)百萬次迭代組成。找到 bug 非常難,且容易崩潰。從簡單開始,漸漸做一些改變。正則化這樣的模型優(yōu)化可以在代碼 degug 后做。以功能優(yōu)先的方式檢查模型:

  • 把正則化因子設(shè)置為 0;

  • 不要其他正則化(包括 dropouts);

  • 使用默認設(shè)置的 Adam 優(yōu)化器;

  • 使用 ReLU;

  • 不要數(shù)據(jù)增強;

  • 更少的深度網(wǎng)絡(luò)層;

  • 擴大輸入數(shù)據(jù),但不要非必要預(yù)處理;

  • 不要在長時間訓(xùn)練迭代或者大 batch size 上浪費時間。

用小量的訓(xùn)練數(shù)據(jù)使模型過擬合是 debug 深度學(xué)習(xí)的最好方式。如果在數(shù)千次迭代內(nèi),損失值不下降,進一步 debgug 代碼。準確率超越瞎猜的概念,你就獲得了第一個里程碑。然后對模型做后續(xù)的修改:增加網(wǎng)絡(luò)層和自定義;開始用完整訓(xùn)練數(shù)據(jù)做訓(xùn)練;通過監(jiān)控訓(xùn)練和驗證數(shù)據(jù)集之間的準確率差別,來增加正則化控制過擬合。

如果卡住了,去掉所有東西,從更小的問題開始上手。

初始化超參數(shù)

許多超參數(shù)與模型優(yōu)化更為相關(guān)。關(guān)掉超參數(shù)或者使用缺省值。使用 Adam 優(yōu)化器,它速度快、高效且缺省學(xué)習(xí)率也很好。前期的問題主要來自于 bug,而不是模型設(shè)計和精調(diào)問題。在做微調(diào)之前,先過一遍下面的檢查列表。這些問題更常見,也容易檢查。如果損失值還沒下降,就調(diào)整學(xué)習(xí)率。如果損失值降的太慢,學(xué)習(xí)率增加 10。如果損失值上升或者梯度爆炸,學(xué)習(xí)率降低 10。重復(fù)這個過程,直到損失值逐漸下降。典型的學(xué)習(xí)率在 1 到 1e-7 之間。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

檢查列表

數(shù)據(jù):

  • 可視化并檢查輸入數(shù)據(jù)(在數(shù)據(jù)預(yù)處理之后,饋送到模型之前);

  • 檢查輸入標(biāo)簽的準確率(在數(shù)據(jù)擾動之后);

  • 不要一遍又一遍的饋送同一 batch 的數(shù)據(jù);

  • 適當(dāng)?shù)目s放輸入數(shù)據(jù)(一般可縮放到區(qū)間 (-1, 1) 之間,且具有零均值);

  • 檢查輸出的范圍(如,在區(qū)間 (-1, 1) 之間);

  • 總是使用訓(xùn)練集的平均值/方差來重新調(diào)節(jié)驗證/測試集;

  • 模型所有的輸入數(shù)據(jù)有同樣的維度;

  • 獲取數(shù)據(jù)集的整體質(zhì)量(是否有太多異常值或者壞樣本)。

模型:

  • 模型參數(shù)準確的初始化,權(quán)重不要全部設(shè)定為 0;

  • 對激活或者梯度消失/爆炸的網(wǎng)絡(luò)層做 debug(從最右邊到最左邊);

  • 對權(quán)重大部分是 0 或者權(quán)重太大的網(wǎng)絡(luò)層做 debug;

  • 檢查并測試損失函數(shù);

  • 對預(yù)訓(xùn)練模型,輸入數(shù)據(jù)范圍要匹配模型中使用的范圍;

  • 推理和測試中的 Dropout 應(yīng)該總是關(guān)掉。

權(quán)重初始化

把權(quán)重全部初始化到 0 是最常見的錯誤,深度網(wǎng)絡(luò)也學(xué)不到任何東西。權(quán)重要按照高斯分布做初始化:

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

縮放與歸一化

人們對縮放與歸一化都有很好地理解,但這仍舊是最被輕視的問題之一。如果輸入特征和節(jié)點輸出都被歸一化,就能更容易地訓(xùn)練模型。如果做的不準確,損失值就不會隨著學(xué)習(xí)率降低。我們應(yīng)該監(jiān)控輸入特征和每層節(jié)點輸出的的直方圖。要適當(dāng)?shù)目s放輸入。而對節(jié)點的輸出,完美的形狀是零均值,且值不太大(正或負)。如果不是且遇到該層有梯度問題,則在卷積層做批歸一化,在 RNN 單元上做層歸一化。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

損失函數(shù)

檢查和測試損失函數(shù)的準確性。模型的損失值一定要比隨機猜測的值低。例如,在 10 類別分類問題中,隨機猜測的的交叉熵損失是-ln(1/10)。

分析誤差

檢查表現(xiàn)不好(誤差)的地方并加以改進,且對誤差進行可視化。在我們的項目中,模型表現(xiàn)對結(jié)構(gòu)高度糾纏的圖像表現(xiàn)不好。例如,增加更多帶有更小濾波器的卷積層來解開小特征。如果有必要就增強數(shù)據(jù)或者收集更多類似的樣本來更好的訓(xùn)練模型。在一些情景下,你可能想要移除這些樣本,限制在更聚焦的模型。

正則化精調(diào)

關(guān)掉正則化(使得模型過擬合)直到做出合理的預(yù)測。

一旦模型代碼可以工作了,接下來調(diào)整的參數(shù)是正則化因子。我們需要增加訓(xùn)練數(shù)據(jù)的體量,然后增加正則化來縮小訓(xùn)練和驗證準確率之間的差別。不要做的太過分,因為我們想要稍微讓模型過擬合。密切監(jiān)測數(shù)據(jù)和正則化成本。長時間尺度下,正則化損失不應(yīng)該控制數(shù)據(jù)損失。如果用大型正則化還不能縮小兩個準確率間的差距,那先 degug 正則化代碼或者方法。

類似于學(xué)習(xí)率,我們以對數(shù)比例改變測試值,例如開始時改變 1/10。注意,每個正則化因子都可能是完全不同的數(shù)量級,我們可以反復(fù)調(diào)整這些參數(shù)。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

多個損失函數(shù)

在第一次實現(xiàn)中,避免使用多個數(shù)據(jù)損失函數(shù)。每個損失函數(shù)的權(quán)重可能有不同的數(shù)量級,也需要一些精力去調(diào)整。如果我們只有一個損失函數(shù),就可以只在意學(xué)習(xí)率了。

固定變量

當(dāng)我們使用預(yù)訓(xùn)練模型,我們可以固定特定層的模型參數(shù),從而加速計算。一定要再次檢查是否有變量固定的錯誤。

單元測試

正如極少會被談到的,我們應(yīng)該對核心模塊進行單元測試,以便于代碼改變時實現(xiàn)依舊穩(wěn)健。如果其參數(shù)用隨機發(fā)生器(randomizer)做初始化,檢查一個網(wǎng)絡(luò)層的輸出不太簡單。另外,我們可以模仿輸入數(shù)據(jù)、檢查輸出。對每個模塊(層),我們可以檢查:

  • 訓(xùn)練和推理輸出的形狀;

  • 可訓(xùn)練變量的數(shù)量(不是參數(shù)的數(shù)量)。

維度誤匹配

要一直跟蹤 Tensor(矩陣)的形狀,并將其歸檔到代碼中。對形狀是 [N, channel, W, H ] 的 Tensor,如果 W(寬)和 H(高)有同樣的維度,二者交換代碼不會出錯。因此,我們應(yīng)該用非對稱形狀做代碼單元測試。例如,我們用 [4, 3]Tensor,而非 [4, 4] 做測試。

第六部分:提升深度學(xué)習(xí)模型性能及網(wǎng)絡(luò)調(diào)參

提升模型容量

要想提升模型容量,我們可以向深度網(wǎng)絡(luò)(DN)逐漸添加層和節(jié)點。更深的層會輸出更復(fù)雜的模型。我們還可以降低濾波器大小。較小的濾波器(3×3 或 5×5)性能通常優(yōu)于較大的濾波器。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

調(diào)參過程更重實踐而非理論。我們逐漸添加層和節(jié)點,可以與模型過擬合,因為我們可以用正則化方式再將其調(diào)低。重復(fù)該迭代過程直到準確率不再提升,不再值得訓(xùn)練、計算性能的降低。

但是,GPU 的內(nèi)存是有限的。截止 2018 年初,高端顯卡 NVIDIA GeForce GTX 1080 TI 的內(nèi)存為 11GB。兩個仿射層之間隱藏節(jié)點的最大數(shù)量受內(nèi)存大小的限制。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

對于非常深層的網(wǎng)絡(luò),梯度消失問題很嚴重。我們可以添加跳躍連接(類似 ResNet 中的殘差連接)來緩解該問題。

模型 & 數(shù)據(jù)集設(shè)計變化

以下是提升性能的檢查列表:

  • 在驗證數(shù)據(jù)集中分析誤差(糟糕的預(yù)測結(jié)果);

  • 監(jiān)控激活函數(shù)。在激活函數(shù)不以零為中心或非正態(tài)分布時,考慮批歸一化或?qū)託w一化;

  • 監(jiān)控?zé)o效節(jié)點的比例;

  • 使用梯度截斷(尤其是 NLP 任務(wù)中)來控制梯度爆炸問題;

  • Shuffle 數(shù)據(jù)集(手動或通過程序);

  • 平衡數(shù)據(jù)集(每個類別具備相似數(shù)量的樣本)。

我們應(yīng)該在激活函數(shù)之前密切監(jiān)控激活直方圖。如果它們的規(guī)模差別很大,那么梯度下降將會無效。使用歸一化。如果深度網(wǎng)絡(luò)有大量無效節(jié)點,那么我們應(yīng)該進一步追蹤該問題。它可能是由 bug、權(quán)重初始化或梯度消失導(dǎo)致的。如果都不是,則試驗一些高級 ReLU 函數(shù),如 leaky ReLU。

數(shù)據(jù)集收集 & 清洗

如果你想構(gòu)建自己的數(shù)據(jù)集,那么最好的建議就是仔細研究如何收集樣本。找最優(yōu)質(zhì)的資源,過濾掉與你問題無關(guān)的所有數(shù)據(jù),分析誤差。在我們的項目中,具備高度糾纏結(jié)構(gòu)的圖像性能非常糟糕。我們可以添加卷積層和小型濾波器來改變模型。但是模型已經(jīng)很難訓(xùn)練了。我們可以添加更多糾纏樣本做進一步訓(xùn)練,但是已經(jīng)有了很多了……另一種方式:我們可以精細化項目范圍,縮小樣本范圍。

數(shù)據(jù)增強

收集有標(biāo)簽的數(shù)據(jù)是一件昂貴的工作。對于圖片來說,我們可以使用數(shù)據(jù)增強方法如旋轉(zhuǎn)、隨機剪裁、移位等方式來對已有數(shù)據(jù)進行修改,生成更多的數(shù)據(jù)。顏色失真則包括色調(diào)、飽和度和曝光偏移。

半監(jiān)督學(xué)習(xí)

我們還可以使用無標(biāo)注數(shù)據(jù)補充訓(xùn)練數(shù)據(jù)。使用模型分類數(shù)據(jù)。把具備高置信預(yù)測的樣本添加到具備對應(yīng)標(biāo)簽預(yù)測的訓(xùn)練數(shù)據(jù)集中。

調(diào)整

學(xué)習(xí)率調(diào)整

我們先簡單回顧一下如何調(diào)整學(xué)習(xí)率。在早期開發(fā)階段,我們關(guān)閉任意非關(guān)鍵超參數(shù)或設(shè)置為 0,包括正則化。在具備 Adam 優(yōu)化器的情況下,默認學(xué)習(xí)率通常性能就很好了。如果我們對自己的代碼很有信心,但是損失并沒有下降,則需要調(diào)整學(xué)習(xí)率。典型的學(xué)習(xí)率在 1 和 1e-7 之間。每次把學(xué)習(xí)率降低 10%,并在簡短迭代中進行測試,密切監(jiān)控損失。如果它持續(xù)上升,那么學(xué)習(xí)率太高了。如果它沒有下降,則學(xué)習(xí)率太低。提高學(xué)習(xí)率,直到損失提前變得平緩。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

下面是一個真實樣本,展示了學(xué)習(xí)率太高的情況,這導(dǎo)致成本突然上漲:

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

在不經(jīng)常用的實踐中,人們監(jiān)控 W ratio 的更新情況:

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

  • 如果 ratio > 1e-3,則考慮調(diào)低學(xué)習(xí)率;

  • 如果 ratio < 1e-3,則考慮提高學(xué)習(xí)率。

超參數(shù)調(diào)整

在模型設(shè)計穩(wěn)定后,我們也可以進一步調(diào)整模型。最經(jīng)常調(diào)整的超參數(shù)是:

  • mini-batch 尺寸;

  • 學(xué)習(xí)率;

  • 正則化因子;

  • 特定層的超參數(shù)(如 dropout)。

Mini-batch 尺寸

通常的批尺寸是 8、16、32 或 64。如果批尺寸太小,則梯度下降不會很順暢,模型學(xué)習(xí)的速度慢,損失可能會振蕩。如果批尺寸太大,則完成一次訓(xùn)練迭代(一輪更新)的時間太長,得到的返回結(jié)果較小。在我們的項目中,我們降低批尺寸,因為每次訓(xùn)練迭代時間太長。我們密切監(jiān)控整個學(xué)習(xí)速度和損失。如果損失振蕩劇烈,則我們會知道批尺寸降低的幅度太大了。批尺寸影響正則化因子等超參數(shù)。一旦我們確定好批尺寸,我們通常就鎖定了值。

學(xué)習(xí)率 & 正則化因子

我們可以使用上述方法進一步調(diào)整學(xué)習(xí)率和正則化因子。我們監(jiān)控損失,來控制學(xué)習(xí)率和驗證與訓(xùn)練準確率之間的差距,從而調(diào)整正則化因子。我們沒有把學(xué)習(xí)率降低 10%,而是降低 3%(精細調(diào)整中或許更?。?/p>

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

調(diào)參不是線性過程。超參數(shù)是有關(guān)聯(lián)的,我們將反復(fù)調(diào)整超參數(shù)。學(xué)習(xí)率和正則化因子高度相關(guān),有時需要一起調(diào)。不要太早進行精細調(diào)整,有可能浪費時間。設(shè)計改變的話這些努力就白費了。

Dropout

Dropout 率通常在 20% 到 50% 之間。我們先從 20% 開始。如果模型出現(xiàn)過擬合,則提高值。

其他調(diào)整

  • 稀疏度

  • 激活函數(shù)

模型參數(shù)的稀疏度能使計算優(yōu)化變得簡單,并減少能耗(這對于移動設(shè)備來說至關(guān)重要)。如果需要,我們可以用 L1 正則化替代 L2 正則化。ReLU 是最流行的激活函數(shù)。對于一些深度學(xué)習(xí)競賽,人們使用更高級的 ReLU 變體以提高準確率。在一些場景中它還可以減少無效節(jié)點。

高級調(diào)參

一些高級精細調(diào)參方法:

  • 學(xué)習(xí)率衰減調(diào)度

  • 動量(Momentum)

  • 早停

我們沒有使用固定的學(xué)習(xí)率,而是定期降低學(xué)習(xí)率。超參數(shù)包括學(xué)習(xí)率下降的頻率和幅度。例如,你可以在每十萬次迭代時減少 0.95 的學(xué)習(xí)率。要調(diào)整這些參數(shù),我們需要監(jiān)控成本,以確定參數(shù)下降地更快但又不至于過早平緩。

高級優(yōu)化器使用動量使梯度下降過程流暢進行。Adam 優(yōu)化器中存在兩種動量設(shè)置,分別控制一階(默認 0.9)和二階(默認 0.999)動量。對于具備梯度陡降的問題領(lǐng)域如 NLP,我們可以稍稍提高動量值。

當(dāng)驗證誤差持續(xù)上升時,過擬合可通過停止訓(xùn)練來緩解。

關(guān)于如何從零開始構(gòu)建深度學(xué)習(xí)項目的詳細教程

但是,這只是概念的可視化。實時誤差可能暫時上升,然后再次下降。我們可以定期檢查模型,記錄對應(yīng)的驗證誤差。稍后我們來選擇模型。

網(wǎng)格搜索

一些超參數(shù)是高度相關(guān)的。我們應(yīng)該使用對數(shù)尺度上的可能性網(wǎng)格一起調(diào)整它們。例如:對于兩個超參數(shù)λ和γ,我們從相應(yīng)的初始值開始,并在每個步驟中將其降低 10 倍:

  • (e-1, e-2, … and e-8);

  • (e-3, e-4, … and e-6)。

相應(yīng)的網(wǎng)格會是 [(e-1, e-3), (e-1, e-4), … , (e-8, e-5) 和 (e-8, e-6)]。

我們沒有使用明確的交叉點,而是稍微隨機移動了這些點。這種隨機性可能會幫助我們發(fā)現(xiàn)一些隱藏的性質(zhì)。如果最佳點位于網(wǎng)格的邊界(藍色點),我們則會在邊界區(qū)域進行重新測試。

網(wǎng)格搜索的計算量很大。對于較小的項目,它們會被零星使用。我們開始用較少的迭代來調(diào)整粗粒度參數(shù)。在后期的細調(diào)階段,我們會使用更長的迭代,并將數(shù)值調(diào)至 3(或更低)。

模型集合

機器學(xué)習(xí)中,我們可以從決策樹中投票進行預(yù)測。這種方法非常有效,因為判斷失誤通常是有局部性質(zhì)的:兩個模型發(fā)生同一個錯誤的幾率很小。在深度學(xué)習(xí)中,我們可以從隨機猜測開始訓(xùn)練(提交一個沒有明確設(shè)置的隨機種子),優(yōu)化模型也不是唯一的。我們可以使用驗證數(shù)據(jù)集測試多次選出表現(xiàn)最佳的模型,也可以讓多個模型進行內(nèi)部投票,最終輸出預(yù)測結(jié)果。這種方式需要進行多個會話,肯定非常耗費系統(tǒng)資源。我們也可以訓(xùn)練一次,檢查多個模型,隨后在這個過程中選出表現(xiàn)最佳的模型。通過集合模型,我們可以基于這些進行準確的預(yù)測:

  • 每個模型預(yù)測的「投票」;

  • 基于預(yù)測置信度進行加權(quán)投票。

模型集合在提高一些問題的預(yù)測準確率上非常有效,經(jīng)常會被深度學(xué)習(xí)數(shù)據(jù)競賽的隊伍所采用。

模型提升

在微調(diào)模型以外,我們也可以嘗試使用模型的不同變體來提升性能。例如,我們可以考慮使用色彩生成器部分或全部替代標(biāo)準 LSTM。這種概念并不陌生:我們可以分步繪制圖片。

直觀地說,在圖像生成任務(wù)中引入時間序列方法是有優(yōu)勢的,這種方法已經(jīng)在 DRAW: A Recurrent Neural Network For Image Generation 中被證明過了。

微調(diào)與模型提升

性能重大提升的背后往往是模型設(shè)計的改變。不過有些時候?qū)δP瓦M行微調(diào)也可以提升機器學(xué)習(xí)的性能。最終的判斷可能會取決于你對相應(yīng)任務(wù)的基準測試結(jié)果。

Kaggle

在開發(fā)過程中,你或許會有一些簡單的問題,如:我需要使用 Leak ReLU 嗎?。有時候問題很簡單,但你永遠無法在任何地方找到答案。在一些論文中,你會看到 Leak ReLU 的優(yōu)越性,但另一些項目的經(jīng)驗顯示并沒有性能提升。太多的項目,太多的變量都缺乏衡量多種可能性的驗證結(jié)果。Kaggle 是一個數(shù)據(jù)科學(xué)競賽的開放平臺,其中深度學(xué)習(xí)是很重要的一部分。深入觀察一些優(yōu)秀選手的方法,你或許就可以找到最為普遍的性能指標(biāo)了。而且,一些數(shù)據(jù)競賽團隊還會把自己的代碼(被稱為 kernel)上傳開源。只要留心探索,Kaggle 會是一個很棒的信息源。

實驗框架

深度學(xué)習(xí)開發(fā)需要依賴大量經(jīng)驗,調(diào)節(jié)超參數(shù)是一件非常乏味的工作。創(chuàng)建一個實驗框架可以加速這一過程。例如:一些人會開發(fā)代碼將模型定義外化為字符串以便調(diào)節(jié)。然而這些努力通常不能為小團隊帶來收益。以我的經(jīng)驗,這樣做的話代碼的簡潔性和可追溯性損失會遠比受益要大,這意味著難以對代碼進行簡單的修改。易于閱讀的代碼必然有著簡潔和靈活的特性。與此相反,很多 AI 云產(chǎn)品已經(jīng)開始提供自動調(diào)節(jié)超參數(shù)的特性。雖然目前這種技術(shù)仍處于初始階段,但無需人類自己編寫框架的流程應(yīng)該是大勢所趨,請時刻注意這一趨勢。

結(jié)論

現(xiàn)在,你已擁有了調(diào)整完畢的模型,可以正式部署了。希望這個系列教程對你有所幫助。深度學(xué)習(xí)可以幫助我們解決很多問題——其適用范圍超出你的想象。想使用深度學(xué)習(xí)代替前端設(shè)計?


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標(biāo)題:如何從零開始構(gòu)建深度學(xué)習(xí)項目?這里有一份詳細的教程

文章出處:【微信號:gh_ecbcc3b6eabf,微信公眾號:人工智能和機器人研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    深度學(xué)習(xí)入門:簡單神經(jīng)網(wǎng)絡(luò)的構(gòu)建與實現(xiàn)

    深度學(xué)習(xí)中,神經(jīng)網(wǎng)絡(luò)是核心模型。今天我們用 Python 和 NumPy 構(gòu)建一個簡單的神經(jīng)網(wǎng)絡(luò)。 神經(jīng)網(wǎng)絡(luò)由多個神經(jīng)元組成,神經(jīng)元之間通過權(quán)重連接。我們構(gòu)建一個包含輸入層、隱藏層和輸
    的頭像 發(fā)表于 01-23 13:52 ?119次閱讀

    小白學(xué)大模型:構(gòu)建LLM的關(guān)鍵步驟

    隨著大規(guī)模語言模型(LLM)在性能、成本和應(yīng)用前景上的快速發(fā)展,越來越多的團隊開始探索如何自主訓(xùn)練LLM模型。然而,是否從零開始訓(xùn)練一個LLM,并非每個組織都適合。本文將根據(jù)不同的需求與資源,幫助
    的頭像 發(fā)表于 01-09 12:12 ?454次閱讀
    小白學(xué)大模型:<b class='flag-5'>構(gòu)建</b>LLM的關(guān)鍵步驟

    從零開始訓(xùn)練一個大語言模型需要投資多少錢?

    一,前言 ? 在AI領(lǐng)域,訓(xùn)練一個大型語言模型(LLM)是一個耗時且復(fù)雜的過程。幾乎每個做大型語言模型(LLM)訓(xùn)練的人都會被問到:“從零開始,訓(xùn)練大語言模型需要多久和花多少錢?”雖然網(wǎng)上有很多關(guān)于
    的頭像 發(fā)表于 11-08 14:15 ?347次閱讀
    <b class='flag-5'>從零開始</b>訓(xùn)練一個大語言模型需要投資多少錢?

    FPGA加速深度學(xué)習(xí)模型的案例

    FPGA(現(xiàn)場可編程門陣列)加速深度學(xué)習(xí)模型是當(dāng)前硬件加速領(lǐng)域的一個熱門研究方向。以下是一些FPGA加速深度學(xué)習(xí)模型的案例: 一、基于FPGA的AlexNet卷積運算加速
    的頭像 發(fā)表于 10-25 09:22 ?368次閱讀

    使用AD8001放大一個100mv左右的信號,經(jīng)過放大的信號低電平都是三點幾伏,不能夠從零開始,為什么?

    請問,如圖我想使用AD8001放大一個100mv左右的信號,然后使用比較器輸出信號進行計數(shù),但是現(xiàn)在經(jīng)過放大的信號低電平都是三點幾伏,不能夠從零開始,請問這是什么原因呢?如圖,紅色是需要放大的信號,紫色是經(jīng)過放大的信號。
    發(fā)表于 08-20 06:17

    分享一本書 《從零開始設(shè)計 FPGA 最小系統(tǒng)》

    *附件:從零開始設(shè)計FPGA最小系統(tǒng).pdf 以下為內(nèi)容片段摘要:詳細內(nèi)容在PDF里 FPGA 最小系統(tǒng)的概念 FPGA 最小系統(tǒng)是可以使 FPGA 正常工作的最簡單的系統(tǒng)。它的外圍電路盡量最少
    發(fā)表于 07-26 07:24

    PyTorch深度學(xué)習(xí)開發(fā)環(huán)境搭建指南

    PyTorch作為一種流行的深度學(xué)習(xí)框架,其開發(fā)環(huán)境的搭建對于深度學(xué)習(xí)研究者和開發(fā)者來說至關(guān)重要。在Windows操作系統(tǒng)上搭建PyTorch環(huán)境,需要綜合考慮多個方面,包括軟件安裝、
    的頭像 發(fā)表于 07-16 18:29 ?1303次閱讀

    深度學(xué)習(xí)與nlp的區(qū)別在哪

    方法,它通過模擬人腦的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),實現(xiàn)對數(shù)據(jù)的自動特征提取和學(xué)習(xí)。深度學(xué)習(xí)的核心是構(gòu)建多層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),每一層都包含大量的神經(jīng)元,這些神經(jīng)元通過權(quán)重連接,實現(xiàn)對輸入數(shù)據(jù)的逐層抽象和
    的頭像 發(fā)表于 07-05 09:47 ?1070次閱讀

    基于深度學(xué)習(xí)的小目標(biāo)檢測

    )的廣泛應(yīng)用,小目標(biāo)檢測的性能得到了顯著提升。本文將詳細探討基于深度學(xué)習(xí)的小目標(biāo)檢測技術(shù),包括其定義、挑戰(zhàn)、常用方法以及未來發(fā)展方向。
    的頭像 發(fā)表于 07-04 17:25 ?1075次閱讀

    深度學(xué)習(xí)常用的Python庫

    深度學(xué)習(xí)常用的Python庫,包括核心庫、可視化工具、深度學(xué)習(xí)框架、自然語言處理庫以及數(shù)據(jù)抓取庫等,并詳細分析它們的功能和優(yōu)勢。
    的頭像 發(fā)表于 07-03 16:04 ?735次閱讀

    TensorFlow與PyTorch深度學(xué)習(xí)框架的比較與選擇

    深度學(xué)習(xí)作為人工智能領(lǐng)域的一個重要分支,在過去十年中取得了顯著的進展。在構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型的過程中,
    的頭像 發(fā)表于 07-02 14:04 ?1095次閱讀

    深度學(xué)習(xí)模型訓(xùn)練過程詳解

    詳細介紹深度學(xué)習(xí)模型訓(xùn)練的全過程,包括數(shù)據(jù)預(yù)處理、模型構(gòu)建、損失函數(shù)定義、優(yōu)化算法選擇、訓(xùn)練過程以及模型的評估與調(diào)優(yōu)。
    的頭像 發(fā)表于 07-01 16:13 ?1528次閱讀

    深度學(xué)習(xí)的模型優(yōu)化與調(diào)試方法

    深度學(xué)習(xí)模型在訓(xùn)練過程中,往往會遇到各種問題和挑戰(zhàn),如過擬合、欠擬合、梯度消失或爆炸等。因此,對深度學(xué)習(xí)模型進行優(yōu)化與調(diào)試是確保其性能優(yōu)越的關(guān)鍵步驟。本文將從數(shù)據(jù)預(yù)處理、模型設(shè)計、超參
    的頭像 發(fā)表于 07-01 11:41 ?1024次閱讀

    深度解析深度學(xué)習(xí)下的語義SLAM

    隨著深度學(xué)習(xí)技術(shù)的興起,計算機視覺的許多傳統(tǒng)領(lǐng)域都取得了突破性進展,例如目標(biāo)的檢測、識別和分類等領(lǐng)域。近年來,研究人員開始在視覺SLAM算法中引入深度
    發(fā)表于 04-23 17:18 ?1388次閱讀
    <b class='flag-5'>深度</b>解析<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>下的語義SLAM

    硬件測試服務(wù)項目的重要性和作用

    硬件測試服務(wù)項目是確保硬件設(shè)備性能穩(wěn)定、質(zhì)量可靠的關(guān)鍵環(huán)節(jié)。它涉及對硬件產(chǎn)品進行全面、細致的檢查和驗證,以確保其滿足設(shè)計要求并具備優(yōu)良的用戶體驗。以下是關(guān)于硬件測試服務(wù)項目的詳細介紹。
    的頭像 發(fā)表于 03-28 09:54 ?859次閱讀
    硬件測試服務(wù)<b class='flag-5'>項目的</b>重要性和作用