正如我們?cè)谇皫渍轮兴姡疃?a href="http://www.delux-kingway.cn/tags/神經(jīng)網(wǎng)絡(luò)/" target="_blank">神經(jīng)網(wǎng)絡(luò)帶有大量在訓(xùn)練過程中學(xué)習(xí)的參數(shù)或權(quán)重。除此之外,每個(gè)神經(jīng)網(wǎng)絡(luò)都有額外的 超參數(shù)需要用戶配置。例如,為了確保隨機(jī)梯度下降收斂到訓(xùn)練損失的局部最優(yōu)(參見第 12 節(jié)),我們必須調(diào)整學(xué)習(xí)率和批量大小。為了避免在訓(xùn)練數(shù)據(jù)集上過度擬合,我們可能必須設(shè)置正則化參數(shù),例如權(quán)重衰減(參見第 3.7 節(jié))或 dropout(參見 第 5.6 節(jié))). 我們可以通過設(shè)置層數(shù)和每層單元或過濾器的數(shù)量(即權(quán)重的有效數(shù)量)來定義模型的容量和歸納偏差。
不幸的是,我們不能簡(jiǎn)單地通過最小化訓(xùn)練損失來調(diào)整這些超參數(shù),因?yàn)檫@會(huì)導(dǎo)致訓(xùn)練數(shù)據(jù)過度擬合。例如,將正則化參數(shù)(如 dropout 或權(quán)重衰減)設(shè)置為零會(huì)導(dǎo)致較小的訓(xùn)練損失,但可能會(huì)損害泛化性能。
圖 19.1.1機(jī)器學(xué)習(xí)中的典型工作流程,包括使用不同的超參數(shù)多次訓(xùn)練模型。
如果沒有不同形式的自動(dòng)化,就必須以反復(fù)試驗(yàn)的方式手動(dòng)設(shè)置超參數(shù),這相當(dāng)于機(jī)器學(xué)習(xí)工作流程中耗時(shí)且困難的部分。例如,考慮在 CIFAR-10 上訓(xùn)練 ResNet(參見第 8.6 節(jié)g4dn.xlarge),這需要在 Amazon Elastic Cloud Compute (EC2)實(shí)例上訓(xùn)練 2 個(gè)多小時(shí)。即使只是依次嘗試十個(gè)超參數(shù)配置,這也已經(jīng)花費(fèi)了我們大約一天的時(shí)間。更糟糕的是,超參數(shù)通常不能直接跨架構(gòu)和數(shù)據(jù)集傳輸 (Bardenet等人,2013 年,F(xiàn)eurer等人,2022 年,Wistuba等人,2018 年),并且需要針對(duì)每個(gè)新任務(wù)重新優(yōu)化。此外,對(duì)于大多數(shù)超參數(shù),沒有經(jīng)驗(yàn)法則,需要專業(yè)知識(shí)才能找到合理的值。
超參數(shù)優(yōu)化 (HPO)算法旨在以一種有原則的和自動(dòng)化的方式解決這個(gè)問題 (Feurer 和 Hutter,2018 年),將其定義為一個(gè)全局優(yōu)化問題。默認(rèn)目標(biāo)是保留驗(yàn)證數(shù)據(jù)集上的錯(cuò)誤,但原則上可以是任何其他業(yè)務(wù)指標(biāo)。它可以與次要目標(biāo)結(jié)合或受其約束,例如訓(xùn)練時(shí)間、推理時(shí)間或模型復(fù)雜性。
最近,超參數(shù)優(yōu)化已擴(kuò)展到神經(jīng)架構(gòu)搜索 (NAS) (Elsken等人,2018 年,Wistuba等人,2019 年),目標(biāo)是找到全新的神經(jīng)網(wǎng)絡(luò)架構(gòu)。與經(jīng)典 HPO 相比,NAS 在計(jì)算方面的成本更高,并且需要額外的努力才能在實(shí)踐中保持可行性。HPO 和 NAS 都可以被視為 AutoML 的子領(lǐng)域 ( Hutter et al. , 2019 ),旨在自動(dòng)化整個(gè) ML 管道。
在本節(jié)中,我們將介紹 HPO 并展示我們?nèi)绾巫詣?dòng)找到第 4.5 節(jié)介紹的邏輯回歸示例的最佳超參數(shù)。
19.1.1. 優(yōu)化問題
我們將從一個(gè)簡(jiǎn)單的玩具問題開始:搜索第 4.5 節(jié)SoftmaxRegression中 的多類邏輯回歸模型的學(xué)習(xí)率,以最小化 Fashion MNIST 數(shù)據(jù)集上的驗(yàn)證錯(cuò)誤。雖然批量大小或輪數(shù)等其他超參數(shù)也值得調(diào)整,但為簡(jiǎn)單起見,我們只關(guān)注學(xué)習(xí)率。
import numpy as np import torch from scipy import stats from torch import nn from d2l import torch as d2l
在運(yùn)行 HPO 之前,我們首先需要定義兩個(gè)要素:目標(biāo)函數(shù)和配置空間。
19.1.1.1。目標(biāo)函數(shù)
學(xué)習(xí)算法的性能可以看作是一個(gè)函數(shù) f:X→R從超參數(shù)空間映射x∈X到驗(yàn)證損失。對(duì)于每一個(gè)評(píng)價(jià)f(x),我們必須訓(xùn)練和驗(yàn)證我們的機(jī)器學(xué)習(xí)模型,對(duì)于在大型數(shù)據(jù)集上訓(xùn)練的深度神經(jīng)網(wǎng)絡(luò),這可能是時(shí)間和計(jì)算密集型的。鑒于我們的標(biāo)準(zhǔn)f(x)我們的目標(biāo)是找到 x?∈argminx∈Xf(x).
沒有簡(jiǎn)單的方法來計(jì)算的梯度f關(guān)于 x,因?yàn)樗枰谡麄€(gè)訓(xùn)練過程中傳播梯度。雖然最近有工作 (Franceschi等人,2017 年,Maclaurin等人,2015 年)通過近似“超梯度”驅(qū)動(dòng) HPO,但現(xiàn)有方法中沒有一種與最先進(jìn)的方法具有競(jìng)爭(zhēng)力,我們將不在這里討論它們。此外,評(píng)估的計(jì)算負(fù)擔(dān)f 要求 HPO 算法以盡可能少的樣本接近全局最優(yōu)。
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練是隨機(jī)的(例如,權(quán)重是隨機(jī)初始化的,mini-batches 是隨機(jī)采樣的),因此我們的觀察結(jié)果會(huì)很嘈雜:y~f(x)+?,我們通常假設(shè)?~N(0,σ) 觀察噪聲呈高斯分布。
面對(duì)所有這些挑戰(zhàn),我們通常會(huì)嘗試快速識(shí)別一小組性能良好的超參數(shù)配置,而不是準(zhǔn)確地達(dá)到全局最優(yōu)值。然而,由于大多數(shù)神經(jīng)網(wǎng)絡(luò)模型的大量計(jì)算需求,即使這樣也可能需要數(shù)天或數(shù)周的計(jì)算時(shí)間。我們將在19.4 節(jié)中探討如何通過分布搜索或使用目標(biāo)函數(shù)的評(píng)估成本更低的近似值來加快優(yōu)化過程。
我們從計(jì)算模型驗(yàn)證誤差的方法開始。
class HPOTrainer(d2l.Trainer): #@save def validation_error(self): self.model.eval() accuracy = 0 val_batch_idx = 0 for batch in self.val_dataloader: with torch.no_grad(): x, y = self.prepare_batch(batch) y_hat = self.model(x) accuracy += self.model.accuracy(y_hat, y) val_batch_idx += 1 return 1 - accuracy / val_batch_idx
我們優(yōu)化了關(guān)于超參數(shù)配置的驗(yàn)證錯(cuò)誤config,由learning_rate. 對(duì)于每個(gè)評(píng)估,我們訓(xùn)練我們的模型max_epochsepochs,然后計(jì)算并返回其驗(yàn)證錯(cuò)誤:
def hpo_objective_softmax_classification(config, max_epochs=8): learning_rate = config["learning_rate"] trainer = d2l.HPOTrainer(max_epochs=max_epochs) data = d2l.FashionMNIST(batch_size=16) model = d2l.SoftmaxRegression(num_outputs=10, lr=learning_rate) trainer.fit(model=model, data=data) return trainer.validation_error().detach().numpy()
19.1.1.2。配置空間
隨著目標(biāo)函數(shù)f(x),我們還需要定義可行集x∈X優(yōu)化過來,稱為配置空間或搜索空間。對(duì)于我們的邏輯回歸示例,我們將使用:
config_space = {"learning_rate": stats.loguniform(1e-4, 1)}
這里我們使用loguniformSciPy 中的對(duì)象,它表示對(duì)數(shù)空間中 -4 和 -1 之間的均勻分布。這個(gè)對(duì)象允許我們從這個(gè)分布中抽樣隨機(jī)變量。
每個(gè)超參數(shù)都有一個(gè)數(shù)據(jù)類型,例如floatfor learning_rate,以及一個(gè)封閉的有界范圍(即下限和上限)。我們通常為每個(gè)超參數(shù)分配一個(gè)先驗(yàn)分布(例如,均勻分布或?qū)?shù)均勻分布)以從中進(jìn)行采樣。一些正參數(shù)(例如learning_rate)最好用對(duì)數(shù)標(biāo)度表示,因?yàn)樽罴阎悼赡芟嗖顜讉€(gè)數(shù)量級(jí),而其他參數(shù)(例如動(dòng)量)則采用線性標(biāo)度。
下面我們展示了一個(gè)配置空間的簡(jiǎn)單示例,該配置空間由多層感知器的典型超參數(shù)組成,包括它們的類型和標(biāo)準(zhǔn)范圍。
表 19.1.1多層感知機(jī)配置空間示例
姓名 | 類型 | 超參數(shù)范圍 | 對(duì)數(shù)刻度 |
---|---|---|---|
學(xué)習(xí)率 | 漂浮 | [10?6,10?1] | 是的 |
批量大小 | 整數(shù) | [8,256] | 是的 |
勢(shì)頭 | 漂浮 | [0,0.99] | 不 |
激活函數(shù) | 明確的 | {tanh,relu} | |
單位數(shù) | 整數(shù) | [32,1024] | 是的 |
層數(shù) | 整數(shù) | [1,6] | 不 |
一般來說,配置空間的結(jié)構(gòu)X 可能很復(fù)雜,也可能與Rd. 在實(shí)踐中,一些超參數(shù)可能取決于其他超參數(shù)的值。例如,假設(shè)我們嘗試調(diào)整多層感知器的層數(shù),以及每一層的單元數(shù)。的單位數(shù)目l?th只有當(dāng)網(wǎng)絡(luò)至少有l(wèi)+1層。這些高級(jí) HPO 問題超出了本章的范圍。我們建議感興趣的讀者參閱 (Baptista 和 Poloczek,2018 年,Hutter等人,2011 年,Jenatton等人,2017 年)。
配置空間對(duì)于超參數(shù)優(yōu)化起著重要作用,因?yàn)闆]有算法可以找到不包含在配置空間中的東西。另一方面,如果范圍太大,找到性能良好的配置的計(jì)算預(yù)算可能變得不可行。
19.1.2. 隨機(jī)搜索
隨機(jī)搜索是我們將考慮的第一個(gè)超參數(shù)優(yōu)化算法。隨機(jī)搜索的主要思想是從配置空間中獨(dú)立采樣,直到用盡預(yù)定義的預(yù)算(例如最大迭代次數(shù)),并返回最佳觀察到的配置。所有評(píng)估都可以并行獨(dú)立執(zhí)行(請(qǐng)參閱第 19.3 節(jié)),但這里我們?yōu)楹?jiǎn)單起見使用順序循環(huán)。
errors, values = [], [] num_iterations = 5 for i in range(num_iterations): learning_rate = config_space["learning_rate"].rvs() print(f"Trial {i}: learning_rate = {learning_rate}") y = hpo_objective_softmax_classification({"learning_rate": learning_rate}) print(f" validation_error = {y}") values.append(learning_rate) errors.append(y)
validation_error = 0.17659997940063477
最好的學(xué)習(xí)率就是驗(yàn)證錯(cuò)誤率最低的那個(gè)。
best_idx = np.argmin(errors) print(f"optimal learning rate = {values[best_idx]}")
optimal learning rate = 0.24202220709278127
由于其簡(jiǎn)單性和通用性,隨機(jī)搜索是最常用的 HPO 算法之一。它不需要任何復(fù)雜的實(shí)現(xiàn),并且可以應(yīng)用于任何配置空間,只要我們可以為每個(gè)超參數(shù)定義一些概率分布。
不幸的是,隨機(jī)搜索也有一些缺點(diǎn)。首先,它沒有根據(jù)迄今為止收集的先前觀察結(jié)果調(diào)整抽樣分布。因此,與性能較好的配置相比,同樣可能對(duì)性能較差的配置進(jìn)行采樣。其次,所有配置都花費(fèi)了相同數(shù)量的資源,即使有些配置可能顯示出較差的初始性能并且不太可能勝過之前看到的配置。
在接下來的部分中,我們將研究更多樣本高效的超參數(shù)優(yōu)化算法,這些算法通過使用模型來指導(dǎo)搜索來克服隨機(jī)搜索的缺點(diǎn)。我們還將研究自動(dòng)停止對(duì)性能不佳配置的評(píng)估過程以加快優(yōu)化過程的算法。
19.1.3. 概括
在本節(jié)中,我們介紹了超參數(shù)優(yōu)化 (HPO) 以及如何通過定義配置空間和目標(biāo)函數(shù)將其表述為全局優(yōu)化。我們還實(shí)現(xiàn)了我們的第一個(gè) HPO 算法,隨機(jī)搜索,并將其應(yīng)用于簡(jiǎn)單的 softmax 分類問題。
雖然隨機(jī)搜索非常簡(jiǎn)單,但它是網(wǎng)格搜索的更好替代方案,后者只評(píng)估一組固定的超參數(shù)。隨機(jī)搜索在某種程度上減輕了維數(shù)災(zāi)難 ( Bellman, 1966 ),并且如果標(biāo)準(zhǔn)最強(qiáng)烈地依賴于超參數(shù)的一小部分,則它可以比網(wǎng)格搜索更有效。
19.1.4。練習(xí)
在本章中,我們優(yōu)化了在不相交的訓(xùn)練集上訓(xùn)練后模型的驗(yàn)證錯(cuò)誤。為簡(jiǎn)單起見,我們的代碼使用 Trainer.val_dataloader,它映射到 周圍的加載器 FashionMNIST.val。
說服自己(通過查看代碼)這意味著我們使用原始 FashionMNIST 訓(xùn)練集(60000 個(gè)示例)進(jìn)行訓(xùn)練,并使用原始測(cè)試集(10000 個(gè)示例)進(jìn)行驗(yàn)證。
為什么這種做法會(huì)有問題?提示:重新閱讀 第 3.6 節(jié),尤其是關(guān)于模型選擇的內(nèi)容。
我們應(yīng)該怎么做呢?
我們?cè)谏厦嬲f過,通過梯度下降進(jìn)行超參數(shù)優(yōu)化是很難做到的??紤]一個(gè)小問題,例如在 FashionMNIST 數(shù)據(jù)集(第 5.2 節(jié))上訓(xùn)練一個(gè)批量大小為 256 的雙層感知器。我們想調(diào)整 SGD 的學(xué)習(xí)率,以便在一個(gè)訓(xùn)練周期后最小化驗(yàn)證指標(biāo).
為什么我們不能為此目的使用驗(yàn)證錯(cuò)誤?您將使用驗(yàn)證集的什么指標(biāo)?
在訓(xùn)練一個(gè)時(shí)期后(粗略地)繪制驗(yàn)證指標(biāo)的計(jì)算圖。您可以假設(shè)初始權(quán)重和超參數(shù)(例如學(xué)習(xí)率)是該圖的輸入節(jié)點(diǎn)。提示:重新閱讀 第 5.3 節(jié)中有關(guān)計(jì)算圖的內(nèi)容。
粗略估計(jì)在此圖的前向傳遞過程中需要存儲(chǔ)的浮點(diǎn)值的數(shù)量。提示:FashionMNIST 有 60000 個(gè)案例。假設(shè)所需的內(nèi)存由每層之后的激活決定,并在第 5.2 節(jié)中查找層寬度。
除了需要大量的計(jì)算和存儲(chǔ)之外,基于梯度的超參數(shù)優(yōu)化還會(huì)遇到哪些其他問題?提示:重新閱讀 第 5.4 節(jié)中關(guān)于梯度消失和爆炸的內(nèi)容。
進(jìn)階:閱讀(Maclaurin等人,2015 年),了解基于梯度的 HPO 的優(yōu)雅(但仍然有些不切實(shí)際)方法。
網(wǎng)格搜索是另一個(gè) HPO 基線,我們?cè)谄渲袨槊總€(gè)超參數(shù)定義一個(gè)等距網(wǎng)格,然后迭代(組合)笛卡爾積以建議配置。
我們?cè)谏厦嬲f過,如果標(biāo)準(zhǔn)最強(qiáng)烈地依賴于超參數(shù)的一小部分,那么在大量超參數(shù)上隨機(jī)搜索比網(wǎng)格搜索 HPO 更有效。為什么是這樣?提示:閱讀 (Bergstra等人,2011 年)。
Discussions
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4785瀏覽量
101250 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13383
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Pytorch模型訓(xùn)練實(shí)用PDF教程【中文】
改善深層神經(jīng)網(wǎng)絡(luò)--超參數(shù)優(yōu)化、batch正則化和程序框架 學(xué)習(xí)總結(jié)
pytorch模型轉(zhuǎn)換需要注意的事項(xiàng)有哪些?
調(diào)參心得:如何優(yōu)化超參數(shù)的,如何證實(shí)方法是有效的
PerferredNetworks發(fā)布了其超參數(shù)優(yōu)化框架的beta版本
PyTorch教程6.2之參數(shù)管理
![<b class='flag-5'>PyTorch</b>教程6.2之<b class='flag-5'>參數(shù)</b>管理](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程12.1之優(yōu)化和深度學(xué)習(xí)
![<b class='flag-5'>PyTorch</b>教程12.1之<b class='flag-5'>優(yōu)化</b>和深度學(xué)習(xí)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程13.7之參數(shù)服務(wù)器
![<b class='flag-5'>PyTorch</b>教程13.7之<b class='flag-5'>參數(shù)</b>服務(wù)器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程19.1之什么是超參數(shù)優(yōu)化
![<b class='flag-5'>PyTorch</b>教程<b class='flag-5'>19.1</b>之什么是<b class='flag-5'>超</b><b class='flag-5'>參數(shù)</b><b class='flag-5'>優(yōu)化</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程19.2之超參數(shù)優(yōu)化API
![<b class='flag-5'>PyTorch</b>教程19.2之<b class='flag-5'>超</b><b class='flag-5'>參數(shù)</b><b class='flag-5'>優(yōu)化</b>API](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程19.4之多保真超參數(shù)優(yōu)化
![<b class='flag-5'>PyTorch</b>教程19.4之多保真超<b class='flag-5'>參數(shù)</b><b class='flag-5'>優(yōu)化</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PyTorch教程-19.2. 超參數(shù)優(yōu)化 API
PyTorch教程-19.4. 多保真超參數(shù)優(yōu)化
利用Arm Kleidi技術(shù)實(shí)現(xiàn)PyTorch優(yōu)化
![利用Arm Kleidi技術(shù)實(shí)現(xiàn)<b class='flag-5'>PyTorch</b><b class='flag-5'>優(yōu)化</b>](https://file1.elecfans.com/web3/M00/03/6B/wKgZO2dovFKAQnOqAAAaPmb4Dvo223.jpg)
評(píng)論