柚子快報邀請碼778899分享:神經(jīng)網(wǎng)絡(luò)超參數(shù)優(yōu)化
柚子快報邀請碼778899分享:神經(jīng)網(wǎng)絡(luò)超參數(shù)優(yōu)化
遺傳算法與深度學(xué)習(xí)實戰(zhàn)(16)——神經(jīng)網(wǎng)絡(luò)超參數(shù)優(yōu)化
0. 前言1. 深度學(xué)習(xí)基礎(chǔ)1.1 傳統(tǒng)機(jī)器學(xué)習(xí)1.2 深度學(xué)習(xí)
2. 神經(jīng)網(wǎng)絡(luò)超參數(shù)調(diào)整2.1 超參數(shù)調(diào)整策略2.2 超參數(shù)調(diào)整對神經(jīng)網(wǎng)絡(luò)影響
3. 超參數(shù)調(diào)整規(guī)則小結(jié)系列鏈接
0. 前言
我們已經(jīng)學(xué)習(xí)了多種形式的進(jìn)化計算,從遺傳算法到粒子群優(yōu)化,以及進(jìn)化策略和差分進(jìn)化等高級方法。在之后的學(xué)習(xí)中,我們將使用這些進(jìn)化計算 (Evolutionary Computation, EC) 方法來改進(jìn)深度學(xué)習(xí) ( Deep learning, DL),通常稱為進(jìn)化深度學(xué)習(xí) (Evolutionary Deep Learning, EDL)。 然而,在構(gòu)建用于解決 DL 問題的 EDL 解決方案之前,我們必須了解要解決的問題以及如何在沒有 EC 的情況下解決它們,畢竟 EC 只是用來改進(jìn) DL 的工具。因此,在應(yīng)用 EC 方法于超參數(shù)優(yōu)化 (Hyperparameter Optimization, HPO) 之前,我們首先介紹超參數(shù)優(yōu)化的重要性和一些手動調(diào)整策略。
1. 深度學(xué)習(xí)基礎(chǔ)
1.1 傳統(tǒng)機(jī)器學(xué)習(xí)
傳統(tǒng)應(yīng)用程序中,系統(tǒng)是通過使用程序員編寫的復(fù)雜算法來實現(xiàn)智能化的。例如,假設(shè)我們希望識別照片中是否包含狗。在傳統(tǒng)的機(jī)器學(xué)習(xí) (Machine Learning, ML) 中,需要機(jī)器學(xué)習(xí)研究人員首先確定需要從圖像中提取的特征,然后提取這些特征并將它們作為輸入傳遞給復(fù)雜算法,算法解析給定特征以判斷圖像中是否包含狗:
然而,如果要為多種類別圖像分類手動提取特征,其數(shù)量可能是指數(shù)級的,因此,傳統(tǒng)方法在受限環(huán)境中效果很好(例如,識別證件照片),而在不受限制的環(huán)境中效果不佳,因為每張圖像之間都有較大差異。 我們可以將相同的思想擴(kuò)展到其他領(lǐng)域,例如文本或結(jié)構(gòu)化數(shù)據(jù)。過去,如果希望通過編程來解決現(xiàn)實世界的任務(wù),就必須了解有關(guān)輸入數(shù)據(jù)的所有內(nèi)容并編寫盡可能多的規(guī)則來涵蓋所有場景,并且不能保證所有新場景都會遵循已有規(guī)則。 傳統(tǒng)機(jī)器學(xué)習(xí)的主要特點是以有限的特征集和顯式規(guī)則為基礎(chǔ),從大量數(shù)據(jù)中學(xué)習(xí)模型,并利用學(xué)習(xí)到的模型對新數(shù)據(jù)進(jìn)行預(yù)測或分類;主要方法包括:決策樹、樸素貝葉斯分類、支持向量機(jī)、最近鄰分類、線性回歸、邏輯回歸等,這些方法通常需要經(jīng)過數(shù)據(jù)預(yù)處理、特征選擇、模型訓(xùn)練和模型評估等一系列步驟,以達(dá)到更好的分類或預(yù)測效果。 傳統(tǒng)機(jī)器學(xué)習(xí)的優(yōu)點在于它們的理論基礎(chǔ)比較成熟,訓(xùn)練和推理速度相對較快,并且可以適用于各種類型的數(shù)據(jù),此外,對于一些小規(guī)模的數(shù)據(jù)集,傳統(tǒng)機(jī)器學(xué)習(xí)方法的效果也相對不錯。然而,傳統(tǒng)機(jī)器學(xué)習(xí)方法也有相當(dāng)明顯的局限性,例如,由于傳統(tǒng)機(jī)器學(xué)習(xí)方法依賴于手動選擇的特征,因此難以捕捉數(shù)據(jù)中的復(fù)雜非線性關(guān)系;同時,這些方法通常不具備自適應(yīng)學(xué)習(xí)能力,需要人工干預(yù)來調(diào)整模型。
1.2 深度學(xué)習(xí)
神經(jīng)網(wǎng)絡(luò)內(nèi)含了特征提取的過程,并將這些特征用于分類/回歸,幾乎不需要手動特征工程,只需要標(biāo)記數(shù)據(jù)(例如,哪些圖片是狗,哪些圖片不是狗)和神經(jīng)網(wǎng)絡(luò)架構(gòu),不需要手動提出規(guī)則來對圖像進(jìn)行分類,這減輕了傳統(tǒng)機(jī)器學(xué)習(xí)技術(shù)強加給程序員的大部分負(fù)擔(dān)。 訓(xùn)練神經(jīng)網(wǎng)絡(luò)需要提供大量樣本數(shù)據(jù)。例如,在前面的例子中,我們需要為模型提供大量的狗和非狗圖片,以便它學(xué)習(xí)特征。神經(jīng)網(wǎng)絡(luò)用于分類任務(wù)的流程如下,其訓(xùn)練與測試是端到端 (end-to-end) 的:
深度學(xué)習(xí)(Deep Learning, DL)是一類基于神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)算法,其主要特點是使用多層神經(jīng)元構(gòu)成的深度神經(jīng)網(wǎng)絡(luò),通過大規(guī)模數(shù)據(jù)訓(xùn)練模型并自動地提取、分析、抽象出高級別的特征,經(jīng)典的深度神經(jīng)網(wǎng)絡(luò)架構(gòu)示例如下所示:
深度學(xué)習(xí)的優(yōu)勢在于它可以自動地從大量非結(jié)構(gòu)化或半結(jié)構(gòu)化的數(shù)據(jù)中學(xué)習(xí),同時可以發(fā)現(xiàn)數(shù)據(jù)之間的隱含關(guān)系和規(guī)律,有效地處理語音、圖像、自然語言等復(fù)雜的數(shù)據(jù)。常用的神經(jīng)網(wǎng)絡(luò)模型包括多層感知機(jī) (Multilayer Perceptron, MLP)、卷積神經(jīng)網(wǎng)絡(luò) (Convolutional Neural Network, CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò) (Recurrent Neural Network, RNN) 等。 深度學(xué)習(xí)目前已經(jīng)廣泛應(yīng)用于圖像識別、語音識別、自然語言處理等領(lǐng)域,如人臉識別、自動駕駛、智能客服、機(jī)器翻譯等。雖然深度學(xué)習(xí)在很多領(lǐng)域取得了出色的成果,但是深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和優(yōu)化也存在一些難點和挑戰(zhàn),如梯度消失和梯度爆炸等問題,需要使用一系列優(yōu)化算法和技巧來解決。
2. 神經(jīng)網(wǎng)絡(luò)超參數(shù)調(diào)整
深度學(xué)習(xí)模型面臨的困難之一是如何調(diào)整模型選項和超參數(shù)來改進(jìn)模型。DL 模型中通常都會涉及許多選項和超參數(shù),但通常缺乏詳細(xì)說明調(diào)整的效果,通常研究者僅僅展示最先進(jìn)模型的效果,經(jīng)常忽略模型達(dá)到最優(yōu)性能所需的大量調(diào)整工作。 通常,學(xué)習(xí)如何使用不同選項和調(diào)整超參數(shù)需要大量的建模經(jīng)驗。如果沒有進(jìn)行調(diào)整,許多模型可能無法達(dá)到最優(yōu)性能。這不僅是一個經(jīng)驗問題,而且也是 DL 領(lǐng)域本身的一個問題。我們首先學(xué)習(xí)使用 PyTorch 構(gòu)建一個基礎(chǔ)深度學(xué)習(xí)模型,用于逼近給定函數(shù)。
2.1 超參數(shù)調(diào)整策略
在本節(jié)中,我們將介紹一些模型選項和調(diào)整 DL 模型超參數(shù)的技巧和策略。其中一些技巧是根據(jù)大量模型訓(xùn)練經(jīng)驗獲得的,但這些策略也是需要不斷發(fā)展的,隨著 DL 的不斷發(fā)展,模型選項也在不斷的擴(kuò)充。 接下來,我們介紹如何使用超參數(shù)和其他選項。添加超參數(shù):batch_size 和 data_step。超參數(shù) batch_size 用于確定每次前向傳遞中輸入到網(wǎng)絡(luò)的數(shù)據(jù)樣本數(shù)量;超參數(shù) data_step 用于控制生成的訓(xùn)練數(shù)據(jù)量:
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
#plotting
from matplotlib import pyplot as plt
from IPython.display import clear_output
#for performance timing
import time
results = []
hp_test = "lr = 3.5e-01" #@param {type:"string"}
learning_rate = 3.5e-01
epochs = 500
middle_layer = 16
batch_size = 25
data_step = .5
data_min = -5
data_max = 5
def function(x):
return (2*x + 3*x**2 + 4*x**3 + 5*x**4 + 6*x**5 + 10)
Xi = np.reshape(np.arange(data_min,data_max, data_step), (-1, 1))
yi = function(Xi)
inputs = Xi.shape[1]
yi = yi.reshape(-1, 1)
plt.plot(Xi, yi, 'o', color='black')
plt.plot(Xi,yi, color="red")
tensor_x = torch.Tensor(Xi) # transform to torch tensor
tensor_y = torch.Tensor(yi)
dataset = TensorDataset(tensor_x,tensor_y) # create your datset
dataloader = DataLoader(dataset, batch_size= batch_size, shuffle=True) # create your dataloader
class Net(nn.Module):
def __init__(self, inputs, middle):
super().__init__()
self.fc1 = nn.Linear(inputs,middle)
self.fc2 = nn.Linear(middle,middle)
self.out = nn.Linear(middle,1)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.out(x)
return x
model = Net(inputs, middle_layer)
print(model)
loss_fn = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
epoch_report = 25
history = []
start = time.time()
for i in range(epochs):
for X, y in iter(dataloader):
# wrap the data in variables
x_batch = Variable(torch.Tensor(X))
y_batch = Variable(torch.Tensor(y))
# forward pass
y_pred = model(x_batch)
# compute and print loss
loss = loss_fn(y_pred, y_batch)
history.append(loss.data/batch_size)
# reset gradients
optimizer.zero_grad()
# backwards pass
loss.backward()
# step the optimizer - update the weights
optimizer.step()
if (i+1) % epoch_report == 0:
clear_output()
y_ = model(tensor_x)
plt.plot(Xi, yi, 'o', color='black')
plt.plot(Xi,y_.detach().numpy(), 'r')
plt.show()
print(f"[{i}] Loss = {loss.data}")
time.sleep(1)
plt.plot(history)
end = time.time() - start
X_a = torch.rand(100,1).clone() * 10 - 5
y_a = model(X_a)
y_a = y_a.detach().numpy()
results.append([hp_test,end, X_a, y_a])
fig = plt.figure()
ax1 = fig.add_subplot(111)
for test,t,x,y in results:
ax1.scatter(x, y, s=10, marker="s", label=f"{test} in {t:0.1f}s")
plt.legend(loc='upper left')
plt.plot(Xi, yi, 'o', color='black')
plt.show()
2.2 超參數(shù)調(diào)整對神經(jīng)網(wǎng)絡(luò)影響
將 middle_layer 的值由 5 修改為 25,運行代碼后,觀察兩次測試的預(yù)測輸出,可以看到 middle_layer 為 25 時的模型性能更好。同時可以看到,模型的訓(xùn)練模型的時間略有不同,這是由于更大的模型需要更長的訓(xùn)練時間。
可以修改超參數(shù) batch_size 和 data_step,觀察不同超參數(shù)對模型性能的影響。但需要注意的是,這些值是相互關(guān)聯(lián)的,如果通過將 data_step 減小到 0.1 來增加數(shù)據(jù)量,則同樣需要增加 batch_size。 下圖展示了在增加數(shù)據(jù)量時改變和不改變批大小的結(jié)果,可以看到,訓(xùn)練 500 個 epoch 所需的訓(xùn)練時間差異明顯。
繼續(xù)修改其它超參數(shù),將 learning_rate 從 3.5e-06 修改為 3.5e-01,在調(diào)整超參數(shù)時,總體目標(biāo)是創(chuàng)建一個能夠快速訓(xùn)練并產(chǎn)生最佳結(jié)果的最小(參數(shù)量)模型。
3. 超參數(shù)調(diào)整規(guī)則
即使本節(jié)中僅僅只有五個超參數(shù),超參數(shù)的調(diào)整仍然可能遇到困難,因此一個簡單的方法是按照以下步驟進(jìn)行操作:
設(shè)置網(wǎng)絡(luò)大小 - 在本節(jié)中,通過修改 middle_layer 的值實現(xiàn),通常,首先調(diào)整網(wǎng)絡(luò)大小或?qū)訑?shù)。但需要注意的是,增加線性層數(shù)通常并不如增加層內(nèi)網(wǎng)絡(luò)節(jié)點數(shù)量有效 超參數(shù)訓(xùn)練規(guī)則#1:網(wǎng)絡(luò)大小——增加網(wǎng)絡(luò)層數(shù)能夠從數(shù)據(jù)中提取更多特征,擴(kuò)展或減小模型寬度(節(jié)點數(shù))能夠調(diào)整模型的擬合程度控制數(shù)據(jù)變化性 – 通常認(rèn)為深度學(xué)習(xí)模型訓(xùn)練需要大量的數(shù)據(jù),雖然深度學(xué)習(xí)模型可能會從更多的數(shù)據(jù)中獲益,但這更多依賴于數(shù)據(jù)集中的變化性,在本節(jié)中,我們使用 data_step 值來控制數(shù)據(jù)的變化性,但通常情況下我們無法控制數(shù)據(jù)的變化性。因此,如果數(shù)據(jù)集包含較大的變化性,則很可能相應(yīng)的需要增加模型的層數(shù)和寬度。與 MNIST 數(shù)據(jù)集中的手寫數(shù)字圖片相比,F(xiàn)ashion-MNIST 數(shù)據(jù)集中服飾圖片的變化性要小得多 超參數(shù)訓(xùn)練規(guī)則#2:數(shù)據(jù)變化性——更具變化性的數(shù)據(jù)集需要更大的模型,以提取更多特征并學(xué)習(xí)更復(fù)雜的解決方案選擇批大小 - 調(diào)整模型的批大小可以顯著提高訓(xùn)練效率,然而,批大小并不能解決訓(xùn)練性能問題,增加批大小可能對降低最終模型性能,批大小需要基于輸入數(shù)據(jù)的變化性進(jìn)行調(diào)優(yōu),輸入數(shù)據(jù)變化性較大時,較小的批大小通常更有益(范圍通常在 16-64 之間),而變化性較小的數(shù)據(jù)可能需要較大的批大小(范圍通常在 64-256 之間,甚至更高) 超參數(shù)訓(xùn)練規(guī)則#3:批大小——如果輸入數(shù)據(jù)變化性較大,則減小批大小,對于變化較小且更統(tǒng)一的數(shù)據(jù)集,增加批大小調(diào)整學(xué)習(xí)率 - 學(xué)習(xí)率控制模型學(xué)習(xí)的速度,學(xué)習(xí)率與模型的復(fù)雜性相關(guān),由輸入數(shù)據(jù)的變化性驅(qū)動,數(shù)據(jù)變化性較高時,需要較小的學(xué)習(xí)率,而更均勻的數(shù)據(jù)可以采用較高的學(xué)習(xí)率,調(diào)整模型大小可能也可能需要調(diào)整學(xué)習(xí)率,因為模型復(fù)雜性發(fā)生了變化 超參數(shù)訓(xùn)練規(guī)則#4:學(xué)習(xí)率——調(diào)整學(xué)習(xí)率以適應(yīng)輸入數(shù)據(jù)的變化性,如果需要增加模型的大小,通常也需要減小學(xué)習(xí)率調(diào)整訓(xùn)練迭代次數(shù) - 處理較小規(guī)模的數(shù)據(jù)集時,模型通常會快速收斂到某個基準(zhǔn)解,因此,可以簡單地減少模型的 epochs (訓(xùn)練迭代次數(shù)),但是,如果模型較復(fù)雜且訓(xùn)練時間較長,則確定總的訓(xùn)練迭代次數(shù)可能更為困難。但多數(shù)深度學(xué)習(xí)框架提供了提前停止機(jī)制,它通過監(jiān)視指定損失值,并在損失值不再變化時自動停止訓(xùn)練,因此,通??梢赃x擇可能需要的最大訓(xùn)練迭代次數(shù),另一種策略是定期保存模型的權(quán)重,然后在需要時,可以重新加載保存的模型權(quán)重并繼續(xù)訓(xùn)練 超參數(shù)訓(xùn)練規(guī)則#5:訓(xùn)練迭代次數(shù)——使用可能需要的最大訓(xùn)練迭代次數(shù),使用提前停止等技術(shù)來減少訓(xùn)練迭代次數(shù)
使用以上五條策略能夠更好的調(diào)整超參數(shù),但這些技術(shù)只是一般規(guī)則,可能會有網(wǎng)絡(luò)配置、數(shù)據(jù)集和其他因素改變這些一般規(guī)則。接下來,我們將進(jìn)一步討論構(gòu)建穩(wěn)定模型時可能需要決定的各種模型選項。 除了超參數(shù)外,模型改進(jìn)的最大動力源于模型所選用的各種選項。DL 模型提供了多種選項,具體取決于實際問題和網(wǎng)絡(luò)架構(gòu),但通常模型的細(xì)微改變就足以從根本上改變模型的擬合方式。 模型選項包括激活函數(shù)、優(yōu)化器函數(shù)、以及網(wǎng)絡(luò)層的類型和數(shù)量的選用。網(wǎng)絡(luò)層的深度通常由模型需要提取和學(xué)習(xí)的特征數(shù)量所決定,網(wǎng)絡(luò)層的類型(全連接、卷積或循環(huán)網(wǎng)絡(luò)等)通常由需要學(xué)習(xí)的特征類型決定。例如,使用卷積層來學(xué)習(xí)特征的聚類,使用循環(huán)神經(jīng)網(wǎng)絡(luò)來確定特征的出現(xiàn)順序。 因此,大多數(shù) DL 模型的網(wǎng)絡(luò)大小和層類型都受數(shù)據(jù)變化性和需要學(xué)習(xí)的特征類型的驅(qū)動。對于圖像分類問題,卷積層用于提取視覺特征,例如眼睛或嘴巴,循環(huán)神經(jīng)網(wǎng)絡(luò)層用于處理語言或時間序列數(shù)據(jù)。 大多數(shù)情況下,模型選項需要關(guān)注的包括激活、優(yōu)化器和損失函數(shù)。激活函數(shù)通常由問題類型和數(shù)據(jù)形式?jīng)Q定,避免在選項調(diào)整的最后階段修改激活函數(shù)。通常,優(yōu)化器和損失函數(shù)的選擇決定了模型訓(xùn)練的好壞。下圖顯示了使用四種不同優(yōu)化器來訓(xùn)練上一節(jié)模型得到的結(jié)果,其中超參數(shù) middle_layer 值為 25,可以看出,與 Adam 和 RMSprop 相比,隨機(jī)梯度下降 (Stochastic Gradient Descent, SGD) 和 Adagrad 表現(xiàn)較差。
損失函數(shù)同樣會對模型訓(xùn)練產(chǎn)生重大影響。在回歸問題中,我們可以使用兩個不同的損失函數(shù):均方誤差 (mean-squared error, MSE) 和平均絕對誤差 (mean absolute error, MAE),下圖顯示了使用的兩個不同損失函數(shù)的模型性能對比結(jié)果??梢钥吹?,MAE 損失函數(shù)的效果更好一些。
超參數(shù)訓(xùn)練規(guī)則#6:模型修改作為一般規(guī)則,更改模型架構(gòu)或關(guān)鍵模型選項,都需要重新調(diào)整所有超參數(shù)
事實上,我們可能需要花費數(shù)天甚至數(shù)月的時間來調(diào)整模型的超參數(shù),直到得到更好的損失和優(yōu)化函數(shù)。超參數(shù)調(diào)整和模型選項選擇并非易事,選用不合適的選項甚至得到更差的模型。在構(gòu)建有效的 DL 模型時,通常會定義模型并選擇最適合實際問題的選項。然后,通過調(diào)整各種超參數(shù)和選項優(yōu)化模型。
小結(jié)
超參數(shù)優(yōu)化的目標(biāo)是通過調(diào)整模型的超參數(shù),如學(xué)習(xí)率、正則化系數(shù)、網(wǎng)絡(luò)架構(gòu)、批大小等,來最大化模型的性能和泛化能力。選擇合適的方法取決于問題的特性、計算資源和優(yōu)化目標(biāo)的復(fù)雜性。本節(jié)中,我們介紹了一些常見模型選項和調(diào)整DL模型超參數(shù)的技巧和策略。
系列鏈接
遺傳算法與深度學(xué)習(xí)實戰(zhàn)(1)——進(jìn)化深度學(xué)習(xí) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(2)——生命模擬及其應(yīng)用 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(3)——生命模擬與進(jìn)化論 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(4)——遺傳算法(Genetic Algorithm)詳解與實現(xiàn) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(5)——遺傳算法中常用遺傳算子 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(6)——遺傳算法框架DEAP 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(7)——DEAP框架初體驗 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(8)——使用遺傳算法解決N皇后問題 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(9)——使用遺傳算法解決旅行商問題 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(10)——使用遺傳算法重建圖像 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(11)——遺傳編程詳解與實現(xiàn) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(12)——粒子群優(yōu)化詳解與實現(xiàn) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(13)——協(xié)同進(jìn)化詳解與實現(xiàn) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(14)——進(jìn)化策略詳解與實現(xiàn) 遺傳算法與深度學(xué)習(xí)實戰(zhàn)(15)——差分進(jìn)化詳解與實現(xiàn)
柚子快報邀請碼778899分享:神經(jīng)網(wǎng)絡(luò)超參數(shù)優(yōu)化
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。