一網打盡!5 大深度學習模型!RNN、CNN、Transformer、BERT、GPT
深度學習,在人工智能領域不斷取得了發展成就。其中,RNN、CNN、Transformer、BERT以及GPT五種深度學習模型,憑藉其獨特的優勢,在計算機視覺、自然語言處理等諸多領域實現了重要突破。
本文將從四大維度——關鍵技術、數據處理、應用場景以及經典案例,對這五種模型進行簡要介紹。首先,在關鍵技術方面,這五種模型各具特色,它們通過不同的算法和結構來提取數據中的深層信息,實現了高效的特徵學習和模式識別。
1、RNN(循環神經網絡)

時間:起始於20世紀90年代
關鍵技術:依託獨特的循環結構與記憶單元
處理數據:尤其擅長應對時間序列數據的處理
應用場景:廣泛應用於自然語言處理、語音識別、時間序列預測等諸多領域
RNN,作為一種高效的神經網絡模型,其核心架構呈現為獨特的循環體形式,使之能夠有效應對序列數據的處理需求。其最顯著的特點在於,RNN在處理當前輸入信息的同時,亦能夠將之前的信息有效儲存於記憶單元之中,進而形成持續性的記憶能力。這種設計賦予了RNN在處理具有時序關係的數據時得天獨厚的優勢,因此,在自然語言處理、語音識別等任務中,RNN均展現出了卓越的性能與廣泛的應用前景。
經典案例:RNN文本分類Python代碼示例
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.legacy import data, datasets
from torchtext.legacy import Field
# 定義文本字段和標籤字段
TEXT = Field(tokenize='spacy', lower=True)
LABEL = Field(sequential=False, use_vocab=False)
# 定義數據集和迭代器
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
train_iterator, test_iterator = data.BucketIterator.splits(
(train_data, test_data),
batch_size=64,
device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
)
# 加載預訓練詞向量
TEXT.build_vocab(train_data, max_size=10000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
class RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):
super().__init__()
self.embedding = nn.Embedding(input_dim, embedding_dim)
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, text):
# 將文本轉化為詞嵌入
embedded = self.embedding(text)
# 對詞嵌入應用RNN
output, hidden = self.rnn(embedded)
# 取RNN的最後一個輸出
assert torch.equal(output[-1,:,:], hidden.squeeze(0))
# 通過全連接層進行分類
return self.fc(hidden.squeeze(0))
INPUT_DIM = len(TEXT.vocab)
EMBEDDING_DIM = 100
HIDDEN_DIM = 256
OUTPUT_DIM = 1
model = RNN(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM)
predictor = model.to(device)
optimizer = optim.Adam(predictor.parameters())
criterion = nn.BCEWithLogitsLoss()
def train(model, iterator, optimizer, criterion):
model.train()
epoch_loss = 0
for batch in iterator:
text, labels = batch.text.to(device), batch.label.float().unsqueeze(1).to(device)
optimizer.zero_grad()
predictions = model(text).squeeze(1)
loss = criterion(predictions, labels)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
return epoch_loss / len(iterator)
N_EPOCHS = 5
for epoch in range(N_EPOCHS):
train_loss = train(predictor, train_iterator, optimizer, criterion)
print(f'Epoch: {epoch+1:02}, Train Loss: {train_loss:.3f}')
2、CNN(卷積神經網絡)
時間:20世紀90年代末至21世紀初
關鍵技術:卷積運算與池化操作
處理數據:尤為擅長處理圖像數據
應用場景:廣泛應用於計算機視覺、圖像分類、物體檢測等領域
CNN作為一種獨特的神經網絡模型,其核心結構由多個卷積層與池化層精妙組合而成。卷積層通過精巧的計算方法,能夠有效地從圖像中提煉出各類局部特徵;而池化層則發揮著至關重要的作用,通過降低特徵數量,顯著提升了計算效率。正是這樣的結構特點,使得CNN在處理計算機視覺任務時表現出色,如圖像分類、物體檢測等任務皆能遊刃有餘。相較於RNN,CNN在處理圖像數據方面更勝一籌,它能夠自動學習圖像中的局部特徵,無需人工設計繁瑣的特徵提取器,從而實現了更高效、更精準的處理效果。
經典案例:CNN貓狗識別Python代碼示例
Python# 導入所需的庫
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
# 圖像的尺寸
img_width, img_height = 150, 150
# 設定訓練數據和驗證數據的路徑
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 2000
nb_validation_samples = 800
epochs = 50
batch_size = 16
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
# 構建CNN模型
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # 將3D特徵圖展平為1D特徵向量
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid')) # 二分類問題使用sigmoid激活函數
# 編譯模型
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# 數據增強,增加模型的泛化能力
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
# 訓練模型
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
# 評估模型
score = model.evaluate_generator(validation_generator, nb_validation_samples // batch_size)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
3、Transformer

時間:2017年
關鍵技術:自注意力機制與多頭注意力機制的完美融合
處理數據:針對長序列數據展現卓越處理能力
應用場景:廣泛應用於自然語言處理、機器翻譯、文本生成等諸多領域
Transformer,作為一種基於自注意力機制的神經網絡模型,憑藉其獨特的架構和機制,成為了深度學習領域的璀璨明星。其精妙之處在於由多個編碼器和解碼器共同構建的基本結構,編碼器負責將輸入的序列精妙地轉換為向量表示,而解碼器則負責將這一向量表示巧妙地還原為輸出序列。
Transformer的創新之處在於引入了自注意力機制,這一機制賦予了模型捕捉序列中長距離依賴關係的非凡能力。它不再局限於傳統的局部信息處理,而是能夠洞察全局,把握整體,從而在處理長序列數據時表現出色。
在自然語言處理領域,Transformer以其卓越的性能贏得了廣泛的讚譽和應用。無論是機器翻譯中的精確翻譯,還是文本生成中的流暢表達,Transformer都展現出了令人矚目的成果。它的出現,無疑為自然語言處理領域的發展注入了新的活力。
經典案例:Transformer進行文本生成的Python代碼示例
Python
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# 加載預訓練的模型和分詞器
model_name = "gpt2-medium"
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
# 輸入的文本
input_text = "The quick brown fox"
# 對輸入文本進行編碼
input_ids = tokenizer.encode(input_text, return_tensors="pt")
# 生成文本
generated = model.generate(input_ids, max_length=50, num_return_sequences=1)
# 解碼生成的文本
output_text = tokenizer.decode(generated[0], skip_special_tokens=True)
print(output_text)
4、BERT(Bidirectional Encoder Representations from Transformers)

時間:2018年
關鍵技術:雙向Transformer編碼器與預訓練微調技術
處理數據:擅長處理雙向上下文信息,為語言理解提供了強大的基礎
應用場景:自然語言處理、文本分類、情感分析等
BERT是一種基於Transformer的預訓練語言模型,其最大的創新在於引入了雙向Transformer編碼器。這一設計使得模型能夠綜合考慮輸入序列的前後上下文信息,極大地提升了語言理解的準確性。通過在海量文本數據上進行預訓練,BERT成功地捕捉並學習了豐富的語言知識。隨後,只需針對特定任務進行微調,如文本分類、情感分析等,便可輕鬆實現高效的應用。
BERT在自然語言處理領域取得了顯著的成就,並廣泛應用於各類NLP任務,成為當前自然語言處理領域的翹楚。
經典案例:
基於BERT的文本生成Python代碼示例:
Python
import torch
from transformers import BertTokenizer, BertForMaskedLM
# 初始化BERT模型和分詞器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
# 待生成文本的句子
sentence = "BERT is a powerful NLP model that can be used for a wide range of tasks, including text generation. It is based on the Transformer architecture and has been pre-trained on a large corpus of text."
# 對句子進行分詞和編碼
input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
# 選擇需要生成文本的位置,此處我們假設需要生成一個詞替換句子中的"[MASK]"
masked_index = torch.where(input_ids == tokenizer.mask_token_id)[1]
# 使用BERT模型進行預測
outputs = model(input_ids)
predictions = outputs[0]
# 獲取預測結果中概率最高的詞
predicted_token = tokenizer.convert_ids_to_tokens(torch.argmax(predictions[0, masked_index], dim=-1).tolist())
# 輸出預測結果
print(f"Predicted token: {predicted_token}")
5、GPT(Generative Pre-trained Transformer)

時間:2018年
關鍵技術:單向Transformer編碼器與預訓練微調技術
處理數據:擅長生成連貫且富有邏輯的文本
應用場景:自然語言處理、文本生成、摘要提取等
GPT,作為一種基於Transformer架構的預訓練語言模型,其獨特的創新之處在於引入了單向Transformer編碼器。這一設計使得模型能夠更精準地捕捉輸入序列的上下文信息,從而生成更為連貫的文本內容。通過在龐大的文本數據集中進行預訓練,GPT積累了豐富而深入的語言知識。之後,在針對特定任務進行微調時,GPT能夠展現出強大的適應性和靈活性,如文本生成、摘要提取等。
GPT在自然語言處理領域獲得了顯著的突破和廣泛的應用,成為眾多NLP任務中的佼佼者。無論是智能對話、內容創作還是信息提取,GPT都展現出了其卓越的性能和潛力。
GPT文本生成的Python代碼示例如下:
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# 初始化tokenizer和model
tokenizer = GPT2Tokenizer.from_pretrained('gpt2-medium')
model = GPT2LMHeadModel.from_pretrained('gpt2-medium')
# 定義想要開始文本生成的內容,並轉換為token IDs
context = "人工智能的發展給社會帶來了巨大變革,"
input_ids = tokenizer.encode(context, return_tensors='pt')
# 設置生成文本的長度
length = 100
# 設置為評估模式
model.eval()
# 生成文本
with torch.no_grad():
output = model.generate(input_ids, max_length=length+len(input_ids[0]), pad_token_id=tokenizer.eos_token_id)
# 將生成的token IDs轉換回文本
generated_text = tokenizer.decode(output[0][len(input_ids[0]):], skip_special_tokens=True)
# 打印生成的文本
print(generated_text)