自2006年深度學(xué)習(xí)概念被提出以來(lái),20年快過(guò)去了,深度學(xué)習(xí)作為人工智能領(lǐng)域的一場(chǎng)革命,已經(jīng)催生了許多具有影響力的算法。那么,你所認(rèn)為深度學(xué)習(xí)的top10算法有哪些呢?
以下是我心目中深度學(xué)習(xí)的頂尖算法,它們?cè)趧?chuàng)新性、應(yīng)用價(jià)值和影響力方面都占據(jù)重要地位。
背景:深度神經(jīng)網(wǎng)絡(luò)(DNN)也叫多層感知機(jī),是最普遍的深度學(xué)習(xí)算法,發(fā)明之初由于算力瓶頸而飽受質(zhì)疑,直到近些年算力、數(shù)據(jù)的爆發(fā)才迎來(lái)突破。
DNN是一種神經(jīng)網(wǎng)絡(luò)模型,它包含多個(gè)隱藏層。在該模型中,每一層將輸入傳遞給下一層,并利用非線性激活函數(shù)引入學(xué)習(xí)的非線性特性。通過(guò)疊加這些非線性變換,DNN可以學(xué)習(xí)輸入數(shù)據(jù)的復(fù)雜特征表示。
模型訓(xùn)練涉及使用反向傳播算法和梯度下降優(yōu)化算法來(lái)不斷調(diào)整權(quán)重。在訓(xùn)練中,通過(guò)計(jì)算損失函數(shù)對(duì)權(quán)重的梯度,然后利用梯度下降或其他優(yōu)化算法來(lái)更新權(quán)重,以使損失函數(shù)最小化。
優(yōu)點(diǎn):能夠?qū)W習(xí)輸入數(shù)據(jù)的復(fù)雜特征,并捕獲非線性關(guān)系。具有強(qiáng)大的特征學(xué)習(xí)和表示能力。
網(wǎng)絡(luò)深度增加會(huì)導(dǎo)致梯度消失問(wèn)題加劇,訓(xùn)練不穩(wěn)定。此外,模型容易陷入局部最小值,需要復(fù)雜的初始化策略和正則化技術(shù)。
使用場(chǎng)景:圖像分類(lèi)、語(yǔ)音識(shí)別、自然語(yǔ)言處理、推薦系統(tǒng)等。
Python示例代碼:
import numpy as npfrom keras.models import Sequentialfrom keras.layers import Dense# 假設(shè)有10個(gè)輸入特征和3個(gè)輸出類(lèi)別input_dim = 10num_classes = 3# 創(chuàng)建DNN模型model = Sequential()model.add(Dense(64, activatinotallow='relu', input_shape=(input_dim,)))model.add(Dense(32, activatinotallow='relu'))model.add(Dense(num_classes, activatinotallow='softmax'))# 編譯模型,選擇優(yōu)化器和損失函數(shù)model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 假設(shè)有100個(gè)樣本的訓(xùn)練數(shù)據(jù)和標(biāo)簽X_train = np.random.rand(100, input_dim)y_train = np.random.randint(0, 2, size=(100, num_classes))# 訓(xùn)練模型model.fit(X_train, y_train, epochs=10)
模型原理:卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一種專(zhuān)門(mén)為處理圖像數(shù)據(jù)而設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò),由Lechun大佬設(shè)計(jì)的Lenet是CNN的開(kāi)山之作。CNN通過(guò)使用卷積層來(lái)捕獲局部特征,并通過(guò)池化層來(lái)降低數(shù)據(jù)的維度。卷積層對(duì)輸入數(shù)據(jù)進(jìn)行局部卷積操作,并使用參數(shù)共享機(jī)制來(lái)減少模型的參數(shù)數(shù)量。池化層則對(duì)卷積層的輸出進(jìn)行下采樣,以降低數(shù)據(jù)的維度和計(jì)算復(fù)雜度。這種結(jié)構(gòu)特別適合處理圖像數(shù)據(jù)。
模型訓(xùn)練涉及使用反向傳播算法和梯度下降優(yōu)化算法來(lái)不斷調(diào)整權(quán)重。在訓(xùn)練中,通過(guò)計(jì)算損失函數(shù)對(duì)權(quán)重的梯度,然后利用梯度下降或其他優(yōu)化算法來(lái)更新權(quán)重,以使損失函數(shù)最小化。
優(yōu)點(diǎn):能夠有效地處理圖像數(shù)據(jù),并捕獲局部特征。具有較少的參數(shù)數(shù)量,降低了過(guò)擬合的風(fēng)險(xiǎn)。
缺點(diǎn):對(duì)于序列數(shù)據(jù)或長(zhǎng)距離依賴關(guān)系可能不太適用??赡苄枰獙?duì)輸入數(shù)據(jù)進(jìn)行復(fù)雜的預(yù)處理。
使用場(chǎng)景:圖像分類(lèi)、目標(biāo)檢測(cè)、語(yǔ)義分割等。
Python示例代碼
from keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense# 假設(shè)輸入圖像的形狀是64x64像素,有3個(gè)顏色通道input_shape = (64, 64, 3)# 創(chuàng)建CNN模型model = Sequential()model.add(Conv2D(32, (3, 3), activatinotallow='relu', input_shape=input_shape))model.add(MaxPooling2D((2, 2)))model.add(Conv2D(64, (3, 3), activatinotallow='relu'))model.add(Flatten())model.add(Dense(128, activatinotallow='relu'))model.add(Dense(num_classes, activatinotallow='softmax'))# 編譯模型,選擇優(yōu)化器和損失函數(shù)model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 假設(shè)有100個(gè)樣本的訓(xùn)練數(shù)據(jù)和標(biāo)簽X_train = np.random.rand(100, *input_shape)y_train = np.random.randint(0, 2, size=(100, num_classes))# 訓(xùn)練模型model.fit(X_train, y_train, epochs=10)
隨著深度學(xué)習(xí)的快速發(fā)展,深度神經(jīng)網(wǎng)絡(luò)在多個(gè)領(lǐng)域取得了顯著的成功。然而,深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練面臨著梯度消失和模型退化等問(wèn)題,這限制了網(wǎng)絡(luò)的深度和性能。為了解決這些問(wèn)題,殘差網(wǎng)絡(luò)(ResNet)被提出。
模型原理:
ResNet通過(guò)引入“殘差塊”來(lái)解決深度神經(jīng)網(wǎng)絡(luò)中的梯度消失和模型退化問(wèn)題。殘差塊由一個(gè)“跳躍連接”和一個(gè)或多個(gè)非線性層組成,使得梯度可以直接從后面的層反向傳播到前面的層,從而更好地訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。通過(guò)這種方式,ResNet能夠構(gòu)建非常深的網(wǎng)絡(luò)結(jié)構(gòu),并在多個(gè)任務(wù)上取得了優(yōu)異的性能。
模型訓(xùn)練:
ResNet的訓(xùn)練通常使用反向傳播算法和優(yōu)化算法(如隨機(jī)梯度下降)。在訓(xùn)練過(guò)程中,通過(guò)計(jì)算損失函數(shù)關(guān)于權(quán)重的梯度,并使用優(yōu)化算法更新權(quán)重,以最小化損失函數(shù)。此外,為了加速訓(xùn)練過(guò)程和提高模型的泛化能力,還可以采用正則化技術(shù)、集成學(xué)習(xí)等方法。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
ResNet在計(jì)算機(jī)視覺(jué)領(lǐng)域有著廣泛的應(yīng)用場(chǎng)景,如圖像分類(lèi)、目標(biāo)檢測(cè)、人臉識(shí)別等。此外,ResNet還可以用于自然語(yǔ)言處理、語(yǔ)音識(shí)別等領(lǐng)域。
Python示例代碼(簡(jiǎn)化版):
在這個(gè)簡(jiǎn)化版的示例中,我們將演示如何使用Keras庫(kù)構(gòu)建一個(gè)簡(jiǎn)單的ResNet模型。
from keras.models import Sequentialfrom keras.layers import Conv2D, Add, Activation, BatchNormalization, Shortcutdef residual_block(input, filters):x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(input)x = BatchNormalization()(x)x = Activation('relu')(x)x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)return x
在處理序列數(shù)據(jù)時(shí),傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)面臨著梯度消失和模型退化等問(wèn)題,這限制了網(wǎng)絡(luò)的深度和性能。為了解決這些問(wèn)題,LSTM被提出。
模型原理:
LSTM通過(guò)引入“門(mén)控”機(jī)制來(lái)控制信息的流動(dòng),從而解決梯度消失和模型退化問(wèn)題。LSTM有三個(gè)門(mén)控機(jī)制:輸入門(mén)、遺忘門(mén)和輸出門(mén)。輸入門(mén)決定了新信息的進(jìn)入,遺忘門(mén)決定了舊信息的遺忘,輸出門(mén)決定最終輸出的信息。通過(guò)這些門(mén)控機(jī)制,LSTM能夠在長(zhǎng)期依賴問(wèn)題上表現(xiàn)得更好。
模型訓(xùn)練:
LSTM的訓(xùn)練通常使用反向傳播算法和優(yōu)化算法(如隨機(jī)梯度下降)。在訓(xùn)練過(guò)程中,通過(guò)計(jì)算損失函數(shù)關(guān)于權(quán)重的梯度,并使用優(yōu)化算法更新權(quán)重,以最小化損失函數(shù)。此外,為了加速訓(xùn)練過(guò)程和提高模型的泛化能力,還可以采用正則化技術(shù)、集成學(xué)習(xí)等方法。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
LSTM在自然語(yǔ)言處理領(lǐng)域有著廣泛的應(yīng)用場(chǎng)景,如文本生成、機(jī)器翻譯、語(yǔ)音識(shí)別等。此外,LSTM還可以用于時(shí)間序列分析、推薦系統(tǒng)等領(lǐng)域。
Python示例代碼(簡(jiǎn)化版):
from keras.models import Sequentialfrom keras.layers import LSTM, Densedef lstm_model(input_shape, num_classes):model = Sequential()model.add(LSTM(units=128, input_shape=input_shape))# 添加一個(gè)LSTM層model.add(Dense(units=num_classes, activatinotallow='softmax'))# 添加一個(gè)全連接層return model
Word2Vec模型是表征學(xué)習(xí)的開(kāi)山之作。由Google的科學(xué)家們開(kāi)發(fā)的一種用于自然語(yǔ)言處理的(淺層)神經(jīng)網(wǎng)絡(luò)模型。Word2Vec模型的目標(biāo)是將每個(gè)詞向量化為一個(gè)固定大小的向量,這樣相似的詞就可以被映射到相近的向量空間中。
模型原理
Word2Vec模型基于神經(jīng)網(wǎng)絡(luò),利用輸入的詞預(yù)測(cè)其上下文詞。在訓(xùn)練過(guò)程中,模型嘗試學(xué)習(xí)到每個(gè)詞的向量表示,使得在給定上下文中出現(xiàn)的詞與目標(biāo)詞的向量表示盡可能接近。這種訓(xùn)練方式稱(chēng)為“Skip-gram”或“Continuous Bag of Words”(CBOW)。
模型訓(xùn)練
訓(xùn)練Word2Vec模型需要大量的文本數(shù)據(jù)。首先,將文本數(shù)據(jù)預(yù)處理為一系列的詞或n-gram。然后,使用神經(jīng)網(wǎng)絡(luò)訓(xùn)練這些詞或n-gram的上下文。在訓(xùn)練過(guò)程中,模型會(huì)不斷地調(diào)整詞的向量表示,以最小化預(yù)測(cè)誤差。
優(yōu)點(diǎn)
缺點(diǎn)
使用場(chǎng)景
Word2Vec被廣泛應(yīng)用于各種自然語(yǔ)言處理任務(wù),如文本分類(lèi)、情感分析、信息提取等。例如,可以使用Word2Vec來(lái)識(shí)別新聞報(bào)道的情感傾向(正面或負(fù)面),或者從大量文本中提取關(guān)鍵實(shí)體或概念。
Python示例代碼
from gensim.models import Word2Vecfrom nltk.tokenize import word_tokenizefrom nltk.corpus import abcimport nltk# 下載和加載abc語(yǔ)料庫(kù)nltk.download('abc')corpus = abc.sents()# 將語(yǔ)料庫(kù)分詞并轉(zhuǎn)換為小寫(xiě)sentences = [[word.lower() for word in word_tokenize(text)] for text in corpus]# 訓(xùn)練Word2Vec模型model = Word2Vec(sentences, vector_size=100, window=5, min_count=5, workers=4)# 查找詞"the"的向量表示vector = model.wv['the']# 計(jì)算與其他詞的相似度similarity = model.wv.similarity('the', 'of')# 打印相似度值print(similarity)
背景:
在深度學(xué)習(xí)的早期階段,卷積神經(jīng)網(wǎng)絡(luò)(CNN)在圖像識(shí)別和自然語(yǔ)言處理領(lǐng)域取得了顯著的成功。然而,隨著任務(wù)復(fù)雜度的增加,序列到序列(Seq2Seq)模型和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)成為處理序列數(shù)據(jù)的常用方法。盡管RNN及其變體在某些任務(wù)上表現(xiàn)良好,但它們?cè)谔幚黹L(zhǎng)序列時(shí)容易遇到梯度消失和模型退化問(wèn)題。為了解決這些問(wèn)題,Transformer模型被提出。而后的GPT、Bert等大模型都是基于Transformer實(shí)現(xiàn)了卓越的性能!
模型原理:
Transformer模型主要由兩部分組成:編碼器和解碼器。每個(gè)部分都由多個(gè)相同的“層”組成。每一層包含兩個(gè)子層:自注意力子層和線性前饋神經(jīng)網(wǎng)絡(luò)子層。自注意力子層利用點(diǎn)積注意力機(jī)制計(jì)算輸入序列中每個(gè)位置的表示,而線性前饋神經(jīng)網(wǎng)絡(luò)子層則將自注意力層的輸出作為輸入,并產(chǎn)生一個(gè)輸出表示。此外,編碼器和解碼器都包含一個(gè)位置編碼層,用于捕獲輸入序列中的位置信息。
模型訓(xùn)練:
Transformer模型的訓(xùn)練通常使用反向傳播算法和優(yōu)化算法(如隨機(jī)梯度下降)。在訓(xùn)練過(guò)程中,通過(guò)計(jì)算損失函數(shù)關(guān)于權(quán)重的梯度,并使用優(yōu)化算法更新權(quán)重,以最小化損失函數(shù)。此外,為了加速訓(xùn)練過(guò)程和提高模型的泛化能力,還可以采用正則化技術(shù)、集成學(xué)習(xí)等方法。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
Transformer模型在自然語(yǔ)言處理領(lǐng)域有著廣泛的應(yīng)用場(chǎng)景,如機(jī)器翻譯、文本分類(lèi)、文本生成等。此外,Transformer模型還可以用于圖像識(shí)別、語(yǔ)音識(shí)別等領(lǐng)域。
Python示例代碼(簡(jiǎn)化版):
import torchimport torch.nn as nnimport torch.nn.functional as Fclass TransformerModel(nn.Module):def __init__(self, vocab_size, embedding_dim, num_heads, num_layers, dropout_rate=0.5):super(TransformerModel, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.transformer = nn.Transformer(d_model=embedding_dim, nhead=num_heads, num_encoder_layers=num_layers, num_decoder_layers=num_layers, dropout=dropout_rate)self.fc = nn.Linear(embedding_dim, vocab_size)def forward(self, src, tgt):embedded = self.embedding(src)output = self.transformer(embedded)output = self.fc(output)return output pip install transformers
GAN的思想源于博弈論中的零和游戲,其中一個(gè)玩家試圖生成最逼真的假數(shù)據(jù),而另一個(gè)玩家則嘗試區(qū)分真實(shí)數(shù)據(jù)與假數(shù)據(jù)。GAN由蒙提霍爾問(wèn)題(一種生成模型與判別模型組合的問(wèn)題)演變而來(lái),但與蒙提霍爾問(wèn)題不同,GAN不強(qiáng)調(diào)逼近某些概率分布或生成某種樣本,而是直接使用生成模型與判別模型進(jìn)行對(duì)抗。
模型原理:
GAN由兩部分組成:生成器(Generator)和判別器(Discriminator)。生成器的任務(wù)是生成假數(shù)據(jù),而判別器的任務(wù)是判斷輸入的數(shù)據(jù)是來(lái)自真實(shí)數(shù)據(jù)集還是生成器生成的假數(shù)據(jù)。在訓(xùn)練過(guò)程中,生成器和判別器進(jìn)行對(duì)抗,不斷調(diào)整參數(shù),直到達(dá)到一個(gè)平衡狀態(tài)。此時(shí),生成器生成的假數(shù)據(jù)足夠逼真,使得判別器無(wú)法區(qū)分真實(shí)數(shù)據(jù)與假數(shù)據(jù)。
模型訓(xùn)練:
GAN的訓(xùn)練過(guò)程是一個(gè)優(yōu)化問(wèn)題。在每個(gè)訓(xùn)練步驟中,首先使用當(dāng)前參數(shù)下的生成器生成假數(shù)據(jù),然后使用判別器判斷這些數(shù)據(jù)是真實(shí)的還是生成的。接著,根據(jù)這個(gè)判斷結(jié)果更新判別器的參數(shù)。同時(shí),為了防止判別器過(guò)擬合,還需要對(duì)生成器進(jìn)行訓(xùn)練,使得生成的假數(shù)據(jù)能夠欺騙判別器。這個(gè)過(guò)程反復(fù)進(jìn)行,直到達(dá)到平衡狀態(tài)。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
簡(jiǎn)單的Python示例代碼:
以下是一個(gè)簡(jiǎn)單的GAN示例代碼,使用PyTorch實(shí)現(xiàn):
import torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as F# 定義生成器和判別器網(wǎng)絡(luò)結(jié)構(gòu)class Generator(nn.Module):def __init__(self, input_dim, output_dim):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 128),nn.ReLU(),nn.Linear(128, output_dim),nn.Sigmoid())def forward(self, x):return self.model(x)class Discriminator(nn.Module):def __init__(self, input_dim):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 128),nn.ReLU(),nn.Linear(128, 1),nn.Sigmoid())def forward(self, x):return self.model(x)# 實(shí)例化生成器和判別器對(duì)象input_dim = 100# 輸入維度可根據(jù)實(shí)際需求調(diào)整output_dim = 784# 對(duì)于MNIST數(shù)據(jù)集,輸出維度為28*28=784gen = Generator(input_dim, output_dim)disc = Discriminator(output_dim)# 定義損失函數(shù)和優(yōu)化器criterion = nn.BCELoss()# 二分類(lèi)交叉熵?fù)p失函數(shù)適用于GAN的判別器部分和生成器的logistic損失部分。但是,通常更常見(jiàn)的選擇是采用二元交叉熵?fù)p失函數(shù)(binary cross
Diffusion模型是一種基于深度學(xué)習(xí)的生成模型,它主要用于生成連續(xù)數(shù)據(jù),如圖像、音頻等。Diffusion模型的核心思想是通過(guò)逐步添加噪聲來(lái)將復(fù)雜數(shù)據(jù)分布轉(zhuǎn)化為簡(jiǎn)單的高斯分布,然后再通過(guò)逐步去除噪聲來(lái)從簡(jiǎn)單分布中生成數(shù)據(jù)。
模型原理
Diffusion模型包含兩個(gè)主要過(guò)程:前向擴(kuò)散過(guò)程和反向擴(kuò)散過(guò)程。
前向擴(kuò)散過(guò)程:
反向擴(kuò)散過(guò)程(也稱(chēng)為去噪過(guò)程):
模型訓(xùn)練
訓(xùn)練Diffusion模型通常涉及以下步驟:
優(yōu)點(diǎn)
缺點(diǎn)
使用場(chǎng)景
Diffusion模型適用于需要生成連續(xù)數(shù)據(jù)的場(chǎng)景,如圖像生成、音頻生成、視頻生成等。此外,由于模型具有漸進(jìn)式生成的特點(diǎn),它還可以用于數(shù)據(jù)插值、風(fēng)格遷移等任務(wù)。
Python示例代碼
下面是一個(gè)簡(jiǎn)化的Diffusion模型訓(xùn)練的示例代碼,使用了PyTorch庫(kù):
import torchimport torch.nn as nnimport torch.optim as optim# 假設(shè)我們有一個(gè)簡(jiǎn)單的Diffusion模型class DiffusionModel(nn.Module):def __init__(self, input_dim, hidden_dim, num_timesteps):super(DiffusionModel, self).__init__()self.num_timesteps = num_timestepsself.noises = nn.ModuleList([nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, input_dim)] for _ in range(num_timesteps))def forward(self, x, t):noise_prediction = self.noises[t](x)return noise_prediction# 設(shè)置模型參數(shù)input_dim = 784# 假設(shè)輸入是28x28的灰度圖像hidden_dim = 128num_timesteps = 1000# 初始化模型model = DiffusionModel(input_dim, hidden_dim, num_timesteps)# 定義損失函數(shù)和優(yōu)化器criterion = nn.MSELoss()optimizer = optim.Adam(model.parameters(), lr=1e-3)
圖神經(jīng)網(wǎng)絡(luò)(Graph Neural Networks,簡(jiǎn)稱(chēng)GNN)是一種專(zhuān)門(mén)用于處理圖結(jié)構(gòu)數(shù)據(jù)的深度學(xué)習(xí)模型。在現(xiàn)實(shí)世界中,許多復(fù)雜系統(tǒng)都可以用圖來(lái)表示,例如社交網(wǎng)絡(luò)、分子結(jié)構(gòu)、交通網(wǎng)絡(luò)等。傳統(tǒng)的機(jī)器學(xué)習(xí)模型在處理這些圖結(jié)構(gòu)數(shù)據(jù)時(shí)面臨諸多挑戰(zhàn),而圖神經(jīng)網(wǎng)絡(luò)則為這些問(wèn)題的解決提供了新的思路。
模型原理:
圖神經(jīng)網(wǎng)絡(luò)的核心思想是通過(guò)神經(jīng)網(wǎng)絡(luò)對(duì)圖中的節(jié)點(diǎn)進(jìn)行特征表示學(xué)習(xí),同時(shí)考慮節(jié)點(diǎn)間的關(guān)系。具體來(lái)說(shuō),GNN通過(guò)迭代地傳遞鄰居信息來(lái)更新節(jié)點(diǎn)的表示,使得相同的社區(qū)或相近的節(jié)點(diǎn)具有相近的表示。在每一層,節(jié)點(diǎn)會(huì)根據(jù)其鄰居節(jié)點(diǎn)的信息來(lái)更新自己的表示,從而捕捉到圖中的復(fù)雜模式。
模型訓(xùn)練:
訓(xùn)練圖神經(jīng)網(wǎng)絡(luò)通常采用基于梯度的優(yōu)化算法,如隨機(jī)梯度下降(SGD)。訓(xùn)練過(guò)程中,通過(guò)反向傳播算法計(jì)算損失函數(shù)的梯度,并更新神經(jīng)網(wǎng)絡(luò)的權(quán)重。常用的損失函數(shù)包括節(jié)點(diǎn)分類(lèi)的交叉熵?fù)p失、鏈接預(yù)測(cè)的二元交叉熵?fù)p失等。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
簡(jiǎn)單的Python示例代碼:
import torchfrom torch_geometric.datasets import Planetoidfrom torch_geometric.nn import GCNConvfrom torch_geometric.data import DataLoaderimport time# 加載Cora數(shù)據(jù)集dataset = Planetoid(root='/tmp/Cora', name='Cora')# 定義GNN模型class GNN(torch.nn.Module):def __init__(self, in_channels, hidden_channels, out_channels):super(GNN, self).__init__()self.conv1 = GCNConv(in_channels, hidden_channels)self.conv2 = GCNConv(hidden_channels, out_channels)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = F.dropout(x, training=self.training)x = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)# 定義超參數(shù)和模型訓(xùn)練過(guò)程num_epochs = 1000lr = 0.01hidden_channels = 16out_channels = dataset.num_classesdata = dataset[0]# 使用數(shù)據(jù)集中的第一個(gè)數(shù)據(jù)作為示例數(shù)據(jù)model = GNN(dataset.num_features, hidden_channels, out_channels)optimizer = torch.optim.Adam(model.parameters(), lr=lr)data = DataLoader([data], batch_size=1)# 將數(shù)據(jù)集轉(zhuǎn)換為DataLoader對(duì)象,以支持批量訓(xùn)練和評(píng)估m(xù)odel.train()# 設(shè)置模型為訓(xùn)練模式for epoch in range(num_epochs):for data in data:# 在每個(gè)epoch中遍歷整個(gè)數(shù)據(jù)集一次optimizer.zero_grad()# 清零梯度out = model(data)# 前向傳播,計(jì)算輸出和損失函數(shù)值loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])# 計(jì)算損失函數(shù)值,這里使用負(fù)對(duì)數(shù)似然損失函數(shù)作為示例損失函數(shù)loss.backward()# 反向傳播,計(jì)算梯度optimizer.step()# 更新權(quán)重參數(shù)
在傳統(tǒng)的強(qiáng)化學(xué)習(xí)算法中,智能體使用一個(gè)Q表來(lái)存儲(chǔ)狀態(tài)-動(dòng)作值函數(shù)的估計(jì)。然而,這種方法在處理高維度狀態(tài)和動(dòng)作空間時(shí)遇到限制。為了解決這個(gè)問(wèn)題,DQN是種深度強(qiáng)化學(xué)習(xí)算法,引入了深度學(xué)習(xí)技術(shù)來(lái)學(xué)習(xí)狀態(tài)-動(dòng)作值函數(shù)的逼近,從而能夠處理更復(fù)雜的問(wèn)題。
模型原理:
DQN使用一個(gè)神經(jīng)網(wǎng)絡(luò)(稱(chēng)為深度Q網(wǎng)絡(luò))來(lái)逼近狀態(tài)-動(dòng)作值函數(shù)。該神經(jīng)網(wǎng)絡(luò)接受當(dāng)前狀態(tài)作為輸入,并輸出每個(gè)動(dòng)作的Q值。在訓(xùn)練過(guò)程中,智能體通過(guò)不斷與環(huán)境交互來(lái)更新神經(jīng)網(wǎng)絡(luò)的權(quán)重,以逐漸逼近最優(yōu)的Q值函數(shù)。
模型訓(xùn)練:
DQN的訓(xùn)練過(guò)程包括兩個(gè)階段:離線階段和在線階段。在離線階段,智能體從經(jīng)驗(yàn)回放緩沖區(qū)中隨機(jī)采樣一批經(jīng)驗(yàn)(即狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)和下一個(gè)狀態(tài)),并使用這些經(jīng)驗(yàn)來(lái)更新深度Q網(wǎng)絡(luò)。在線階段,智能體使用當(dāng)前的狀態(tài)和深度Q網(wǎng)絡(luò)來(lái)選擇和執(zhí)行最佳的行動(dòng),并將新的經(jīng)驗(yàn)存儲(chǔ)在經(jīng)驗(yàn)回放緩沖區(qū)中。
優(yōu)點(diǎn):
缺點(diǎn):
使用場(chǎng)景:
DQN已被廣泛應(yīng)用于各種游戲AI任務(wù),如圍棋、紙牌游戲等。此外,它還被應(yīng)用于其他領(lǐng)域,如機(jī)器人控制、自然語(yǔ)言處理和自動(dòng)駕駛等。
pythonimport numpy as npimport tensorflow as tffrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropoutclass DQN:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.memory = np.zeros((MEM_CAPACITY, state_size * 2 + 2))self.gamma = 0.95self.epsilon = 1.0self.epsilon_min = 0.01self.epsilon_decay = 0.995self.learning_rate = 0.005self.model = self.create_model()def create_model(self):model = Sequential()model.add(Dense(24, input_dim=self.state_size, activation='relu'))model.add(Dense(24, activation='relu'))model.add(Dense(self.action_size, activation='linear'))model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=self.learning_rate))return modeldef remember(self, state, action, reward, next_state, done):self.memory[self.memory_counter % MEM_CAPACITY, :] = [state, action, reward, next_state, done]self.memory_counter += 1def act(self, state):if np.random.rand() <= self.epsilon:return np.random.randint(self.action_size)act_values = self.model.predict(state)return np.argmax(act_values[0])def replay(self):batch_size = 32start = np.random.randint(0, self.memory_counter - batch_size, batch_size)sample = self.memory[start:start + batch_size]states = np.array([s[0] for s in sample])actions = np.array([s[1] for s in sample])rewards = np.array([s[2] for s in sample])next_states = np.array([s[3] for s in sample])done = np.array([s[4] for s in sample])target = self.model.predict(next_states)target_q = rewards + (1 - done) * self.gamma * np.max(target, axis=1)target_q = np.asarray([target_q[i] for i in range(batch_size)])target = self.model.predict(states)indices = np.arange(batch_size)for i in range(batch_size):if done[i]: continue# no GAE calc for terminal states (if you want to include terminal states see line 84)target[indices[i]] = rewards[i] + self.gamma * target_q[indices[i]]# GAE formula line 84 (https://arxiv.org/pdf/1506.02438v5) instead of line 85 (https://arxiv.org/pdf/1506.02438v5) (if you want to include terminal states see line 84)indices[i] += batch_size# resets the indices for the next iteration (https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail/blob/master/a2c.py#L173) (if you want to include terminal states see line 84)target[indices[i]] = target[indices[i]]# resets the indices for the next iteration (https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail/blob/master/a2c.py#L173) (if you want to include terminal states see line 84) (https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail/blob/master/a2c.py#L173)
以上就是超強(qiáng)!深度學(xué)習(xí)Top10算法!的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)