赞
踩
GPT(Generative Pre-trained Transformer)是由OpenAI提出的一种预训练语言模型,应用广泛,包括自动问答、对话生成、文本摘要等任务。本文将详细介绍如何使用Python搭建GPT模型。
要训练GPT模型,首先需要准备数据。数据可以是任何文本数据,比如新闻、小说、博客等。在这里,我们使用了一个著名的小说数据集:Gutenberg语料库。
Gutenberg语料库是一个免费的电子书存储库,包含超过6万本免费电子书。从Gutenberg语料库中下载的电子书是.txt文件格式,我们可以直接使用Python读取这些文件。
以下是准备数据集的代码:
- import os
- import requests
- import zipfile
-
- # 下载数据集
- url = "http://www.gutenberg.org/files/11/11-0.txt"
- path = "data/11-0.txt"
- if not os.path.exists(path):
- r = requests.get(url)
- with open(path, "wb") as f:
- f.write(r.content)
-
- # 读取数据集
- with open(path, "r", encoding="utf-8") as f:
- data = f.read().lower()
-
- # 预处理数据集
- data = data.replace("\n", " ") # 去除换行符
- data = data.replace("\r", "") # 去除回车符
-
- print("数据集大小:", len(data))

数据预处理是GPT模型的一个重要步骤。在这个过程中,我们需要将文本转换为数字,以便模型能够处理。
我们使用Tokenizer类来处理数据。Tokenizer类将文本转换成数字,并将数字转换回文本。
以下是数据预处理的代码:
- import torch
- from pytorch_pretrained_bert import GPT2Tokenizer
-
- # 初始化tokenizer
- tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
-
- # 将文本转换为数字
- tokens = tokenizer.tokenize(data)
- ids = tokenizer.convert_tokens_to_ids(tokens)
-
- # 将数字转换为张量
- data_tensor = torch.tensor(ids)
-
- print("数据集大小:", len(data_tensor))
接下来,我们开始构建模型。为了训练GPT模型,我们需要使用PyTorch框架。
以下是构建模型的代码:
- import torch.nn as nn
- from pytorch_pretrained_bert import GPT2LMHeadModel
-
- # 初始化模型
- model = GPT2LMHeadModel.from_pretrained('gpt2')
-
- # 将数据集分成多个batch
- batch_size = 32
- examples = data_tensor.size(0) // batch_size * batch_size
- inputs = data_tensor[:examples].view(batch_size, -1).contiguous()
- targets = inputs.clone().detach()
- targets[:, :-1] = inputs[:, 1:].clone()
- targets[:, -1] = inputs[:, 0].clone()
-
- # 定义损失函数和优化器
- criterion = nn.CrossEntropyLoss()
- optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
-
- # 训练模型
- for epoch in range(100):
- total_loss = 0
- model.train()
- for i in range(inputs.size(1)):
- input_ids = inputs[:, i].cuda()
- target_ids = targets[:, i].cuda()
- output = model(input_ids)[0]
- loss = criterion(output.view(-1, output.size(-1)), target_ids.view(-1))
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
- total_loss += loss.item()
- print(f"Epoch {epoch+1} loss: {total_loss/inputs.size(1)}")

训练完成之后,我们可以使用训练好的模型来生成新的文本。
以下是生成文本的代码:
- import random
-
- # 使用模型生成文本
- model.eval()
- temperature = 0.7 # 控制生成文本的多样性
- n = 1000 # 生成文本的长度
- generated = []
- with torch.no_grad():
- context = inputs[:, :1].cuda()
- for i in range(n):
- output = model(context)[0][:, -1, :]
- token = torch.argmax(output / temperature, dim=-1).cpu().item()
- context = torch.cat([context, torch.tensor([[token]]).cuda()], dim=-1)
- generated.append(token)
-
- # 将数字转换为文本
- generated_text = tokenizer.decode(generated)
-
- # 打印生成的文本
- print(generated_text)

这样,我们就成功地使用Python搭建了一个GPT模型。我们可以使用这个模型来生成新的文本,这对于自然语言处理任务非常有用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。