深度学习模型一览:RNN、CNN、Transformer、BERT与GPT

一文概览五大深度学习模型:RNN、CNN、Transformer、BERT、GPT,解析其关键技术、数据处理及应用场景。

原文标题:一网打尽!5大深度学习模型!RNN、CNN、Transformer、BERT、GPT

原文作者:数据派THU

冷月清谈:

本文对五种主流深度学习模型:RNN、CNN、Transformer、BERT和GPT进行了简要介绍,从关键技术、数据处理方式、应用场景和经典案例四个维度展开。RNN擅长处理时间序列数据,核心在于循环结构与记忆单元,常用于自然语言处理和语音识别;CNN通过卷积和池化操作提取图像局部特征,适用于计算机视觉任务;Transformer依赖自注意力机制处理长序列数据,在机器翻译和文本生成上表现出色;BERT使用双向Transformer编码器,能更好理解上下文信息,常用于文本分类和情感分析;GPT则使用单向Transformer,擅长生成连贯的文本,可用于摘要提取等任务。每种模型都附带了Python代码示例,方便读者理解。

怜星夜思:

1、在实际应用中,如何选择合适的深度学习模型?除了文章中提到的,还有哪些因素需要考虑?
2、文章提到了各种模型的经典案例,如果让你用这些模型解决一个你感兴趣的现实问题,你会选择哪个模型,为什么?
3、这些模型都是基于大量数据训练的,那么在数据量不足的情况下,有没有什么方法可以提高模型的性能?

原文内容

本文约3600字,建议阅读5分钟

本文介绍了5大深度学习模型。


深度学习,在人工智能领域不断取得了发展成就。其中,RNN、CNN、Transformer、BERT以及GPT五种深度学习模型,凭借其独特的优势,在计算机视觉、自然语言处理等诸多领域实现了重要突破。


本文将从四大维度——关键技术、数据处理、应用场景以及经典案例,对这五种模型进行简要介绍。首先,在关键技术方面,这五种模型各具特色,它们通过不同的算法和结构来提取数据中的深层信息,实现了高效的特征学习和模式识别。

1、RNN(循环神经网络)


时间:起始于20世纪90年代
关键技术:依托独特的循环结构与记忆单元
处理数据:尤其擅长应对时间序列数据的处理
应用场景:广泛应用于自然语言处理、语音识别、时间序列预测等诸多领域

RNN,作为一种高效的神经网络模型,其核心架构呈现为独特的循环体形式,使之能够有效应对序列数据的处理需求。其最显著的特点在于,RNN在处理当前输入信息的同时,亦能够将之前的信息有效储存于记忆单元之中,进而形成持续性的记忆能力。这种设计赋予了RNN在处理具有时序关系的数据时得天独厚的优势,因此,在自然语言处理、语音识别等任务中,RNN均展现出了卓越的性能与广泛的应用前景。

经典案例:RNN文本分类Python代码示例

import torchimport torch.nn as nnimport torch.optim as optimfrom torchtext.legacy import data, datasetsfrom 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 = 100HIDDEN_DIM = 256OUTPUT_DIM = 1model = 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 = 0for 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 = 5for 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)


编辑:王菁



关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。



新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU

数据量少确实头疼。我了解的几个方法:一是数据增强,像图像可以旋转、裁剪,文本可以同义词替换。二是迁移学习,用在大数据集上预训练好的模型,然后在小数据集上微调。三是使用更简单的模型,避免过拟合。四是用正则化方法,限制模型的复杂度。当然,最根本的还是要想办法搞到更多数据!

我最近对AI绘画挺感兴趣的,想用GPT来生成一些绘画prompt(提示词)。现在AI绘画对prompt的质量要求很高,好的prompt能生成更棒的画。GPT强大的文本生成能力,可以帮助我根据想要的风格、内容,自动生成一些高质量的prompt,这样我就可以更轻松地创作出想要的画作啦!

如果让我选,我可能会尝试用BERT做个智能客服。现在客服回复要么慢要么答非所问,用BERT可以理解用户的问题,然后从知识库里找到最相关的答案。虽然可能需要大量数据训练,但如果能提高客服效率和用户体验,想想就觉得很有潜力!

小样本学习(Few-shot learning)也是个思路。它模仿人类“一见钟情”的能力,旨在仅用几个样本就能让模型学会识别新的类别。元学习(Meta-learning)是小样本学习中的一种常用方法,它让模型学习如何学习,从而提高模型在新任务上的泛化能力。不过,小样本学习的理论和实践都还在发展中,需要根据具体的应用场景进行探索。

身为一个吃货,我打算用CNN来做一个美食推荐系统!用户上传一张菜的照片,系统就能识别出菜品,然后推荐相关的店铺或者菜谱。想想以后再也不用为吃什么发愁了,随时随地都有美食推荐,简直是吃货的福音!

谢邀,结合个人经验,补充几点。除了文章里说的任务类型和数据类型外,模型的可解释性也很重要。有时候我们需要知道模型为什么做出这样的决策,这时候像决策树这种可解释性强的模型可能更合适。还有,模型的部署和维护成本也得考虑,如果模型太复杂,部署和维护起来很麻烦,可能就需要选择一个相对简单但效果也不错的模型。最后,别忘了评估指标的选择,不同的评估指标可能会影响模型的选择。

可以考虑使用半监督学习。简单来说,就是利用少量有标签的数据和大量无标签的数据一起训练模型。通过让模型学习无标签数据的内在结构,可以有效地提高模型的泛化能力。当然,半监督学习也存在一些挑战,例如如何有效地利用无标签数据,以及如何避免模型被噪声数据误导。

抛开业务场景谈模型选择都是耍流氓!模型不是越复杂越好,关键在于解决实际问题。例如,在计算资源有限的嵌入式设备上部署模型,必须考虑模型的体积和推理速度。另外,如果对模型的能耗有严格要求,也需要选择能效比更高的模型。总而言之,在满足业务需求的前提下,选择最简单、最经济的模型才是王道。

选择模型啊,感觉得看你的具体任务吧。像图像处理肯定首选CNN,文本处理RNN、Transformer、BERT、GPT都行,但可能要考虑数据量和计算资源。如果数据量不大,预训练模型BERT、GPT可能效果更好,但如果需要自己训练,还得看硬件条件。另外,模型的复杂度也得考虑,复杂的模型可能效果好,但也更容易过拟合。总的来说,没有万能的模型,得根据实际情况来选择。