一:原理

在此仅仅是简单介绍,还需要读者对self-attention、Transformer、GPT有一定的知识储备。

原始的 transformer 论文引入了两种类型的 transformer 模块,分别是:编码器模块和解码器模块。原始 transformer 论文中的编码器模块可以接受长度不超过最大序列长度(如 512 个单词)的输入。如果序列长度小于该限制,我们就在其后填入预先定义的空白单词(如<pad>)。解码器模块,它与编码器模块在架构上有一点小差异——加入了一层使得它可以重点关注编码器输出的某一片段,也就是下图中的编码器-解码器自注意力(encoder-decoder self-attention)层。

解码器在自注意力(self-attention)层上还有一个关键的差异:它将后面的单词掩盖掉了。但并不像 BERT 一样将它们替换成特殊定义的单词<mask>,而是在自注意力计算的时候屏蔽了来自当前计算位置右边所有单词的信息。GPT-2 使用的带掩模的自注意力(masked self-attention)模块很重要。普通的自注意力模块允许一个位置看到它右侧单词的信息(如下左图),而带掩模的自注意力模块则不允许这么做(如下右图)。

GPT2模型就用了这种只包含编码器(decoder-only)的模块。想要运行一个训练好的 GPT-2 模型,最简单的方法就是让它自己随机工作(从技术上说,叫做生成无条件样本)。换句话说,我们也可以给它一点提示,让它说一些关于特定主题的话(即生成交互式条件样本)。

在随机情况下,我们只简单地提供一个预先定义好的起始单词(训练好的模型使用「|endoftext|」作为它的起始单词,不妨将其称为<s>),然后让它自己生成文字。此时,模型的输入只有一个单词,所以只有这个单词的路径是活跃的。单词经过层层处理,最终得到一个向量。向量可以对于词汇表的每个单词计算一个概率(词汇表是模型能「说出」的所有单词,GPT-2 的词汇表中有 50000 个单词)。在本例中,我们选择概率最高的单词「The」作为下一个单词。但有时这样会出问题——就像如果我们持续点击输入法推荐单词的第一个,它可能会陷入推荐同一个词的循环中,只有你点击第二或第三个推荐词,才能跳出这种循环。同样的,GPT-2 也有一个叫做「top-k」的参数,模型会从概率前 k 大的单词中抽样选取下一个单词。显然,在之前的情况下,top-k = 1。

接下来,我们将输出的单词添加在输入序列的尾部构建新的输入序列,让模型进行下一步的预测:

请注意,第二个单词的路径是当前唯一活跃的路径了。GPT-2 的每一层都保留了它们对第一个单词的解释,并且将运用这些信息处理第二个单词(具体将在下面一节对自注意力机制的讲解中详述),GPT-2 不会根据第二个单词重新解释第一个单词。

输入数据是莎士比亚全集

二:python实现

import random
#导入随机函数,用于从预测结果中随机选取概率较大的前k个作为预测结果
def select_top_k(predictions, k=10):predicted_index = random.choice(predictions[0, -1, :].sort(descending=True)[1][:10]).item()return predicted_index
#定义函数select_top_k,从预测结果中选取概率较大的前k个# 过滤警告信息
import warnings
warnings.filterwarnings('ignore')
#进行日志记录
import logging
logging.basicConfig(level=logging.INFO)import torch
from transformers import GPT2Tokenizer
# 载入预训练模型的分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')#载入预训练模型的分词器
# 使用 GPT2Tokenizer 对输入进行编码
text = "From fairest creatures we desire increase,That thereby beauty’s rose might never die,But as the riper should by time decease,His tender heir might bear his memory:But thou contracted to thine own bright eyes,Feed’st thy light’s flame with self-substantial fuel,Making a famine where abundance lies,Thyself thy foe, to thy sweet self too cruel:hou that art now the world’s fresh ornament,And only herald to the gaudy spring,Within thine own bud buriest thy content,And, tender churl, mak’st waste in niggarding:Pity the world, or else this glutton be,To eat the world’s due, by the grave and thee."
# with open('莎士比亚.txt','r',encoding='utf-8') as f:
#     text=f.read()indexed_tokens = tokenizer.encode(text)
tokens_tensor = torch.tensor([indexed_tokens])
tokens_tensor.shape
from transformers import AutoTokenizer,AutoModelWithLMHead
tokenizer=AutoTokenizer.from_pretrained('gpt2')
mmodel=AutoModelWithLMHead.from_pretrained('gpt2')from transformers import GPT2LMHeadModel
# 读取 GPT-2 预训练模型
model = GPT2LMHeadModel.from_pretrained("./gpt2")
model.eval()
total_predicted_text = text
n = 100 # 预测过程的循环次数
for _ in range(n):with torch.no_grad():outputs = model(tokens_tensor)predictions = outputs[0]predicted_index = select_top_k(predictions, k=10)predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])total_predicted_text += tokenizer.decode(predicted_index)if '<|endoftext|>' in total_predicted_text:# 如果出现文本结束标志,就结束文本生成breakindexed_tokens += [predicted_index]tokens_tensor = torch.tensor([indexed_tokens])
print('生成:::',total_predicted_text)

看看生成的结果:

利用GPT2生成莎士比亚写作风格的文本(python实现)相关推荐

  1. 利用莎士比亚数据集进行RNN文本生成的训练

    利用莎士比亚数据集进行RNN文本生成的训练 import tensorflow as tf import numpy as np from tensorflow import keras import ...

  2. 基于tflearn的RNN模仿莎士比亚写作

    生成类似莎士比亚写作的文章 1.安装准备: 安装tflearn,是一个封装高的TensorFlow高层框架 pip install -I tflearn 2.实现过程 第一步:下载莎士比亚写作文本 i ...

  3. 如何用RNN生成莎士比亚风格的句子?(文末赠书)

    作者 | 李理,环信人工智能研发中心vp,十多年自然语言处理和人工智能研发经验.主持研发过多款智能硬件的问答和对话系统,负责环信中文语义分析开放平台和环信智能机器人的设计与研发. 来源 | <深 ...

  4. tensorflow循环神经网络(RNN)文本生成莎士比亚剧集

    tensorflow循环神经网络(RNN)文本生成莎士比亚剧集 我们将使用 Andrej Karpathy 在<循环神经网络不合理的有效性>一文中提供的莎士比亚作品数据集.给定此数据中的一 ...

  5. GRU网络生成莎士比亚小说

    介绍 本文我们将使用GRU网络来学习莎士比亚小说,模型通过学习可以生成与小说风格相似的文本,如图所示: 虽然有些句子并没有实际的意思(目前我们的模型是基于概率,并不是理解语义),但是大多数单词都是有效 ...

  6. 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白

    目录 设置TensorFlow.js代码 小莎士比亚数据集 通用句子编码器 莎士比亚独白在行动 终点线 总结 下载项目代码-9.9 MB TensorFlow+JavaScript.现在,最流行.最先 ...

  7. Tensorflow2.0之文本生成莎士比亚作品

    文章目录 1.导入数据 2.创建模型 3.训练 3.1 编译模型 3.2 配置检查点 3.3 训练模型 4.预测 4.1 重建模型 4.2 生成文本 我们将使用 Andrej Karpathy 在&l ...

  8. 【Github上有趣的项目】基于RNN文本生成器,自动生成莎士比亚的剧本或者shell代码(不是python的是lua的)

    文章目录 下了之后才发现不是python的尴尬得一匹,,ԾㅂԾ,, GitHub 上有哪些有趣的关于 NLP 或者 DL 的项目? - Xiaoran的回答 - 知乎 char-rnn 下了之后才发现 ...

  9. 使用LSTM进行莎士比亚风格诗句生成

    本文章跟本人前面两篇文章(文章1, 文章2)的思路大体相同,都是使用序列化的数据集来训练RNN神经网络模型,然后自动生成相关的序列化.这篇文章使用莎士比亚诗词作为训练集,使用keras和tensorf ...

最新文章

  1. iphone屏幕录制_今日应用:iPhone 不越狱也可以录制屏幕了
  2. 任务栏网速监控工具NetSpeedMonitor
  3. [Python人工智能] 二十三.基于机器学习和TFIDF的情感分类(含详细的NLP数据清洗)
  4. navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!
  5. python3 中方法各种参数和返回值
  6. 为什么不懂技术的人可以做产品经理(下)?
  7. python zipfile模块学习笔记(一)
  8. eos 钱包 nacos 安装文档
  9. 高性能服务器天梯,2019服务器CPU天梯图 多路CPU性能排名
  10. php网站挂马,网页挂马详细教程
  11. EM78P468 义隆单片机 单键触控
  12. SpringBoot的序列化和反序列化
  13. 夯实基础 js数据类型
  14. 搜索引擎技术原理及其应用
  15. 基于深度学习的YOLO目标检测研究-附Matlab代码
  16. 统计分析/机器学习吐血整理最强指南(第二版)
  17. CPU卡/CPU的分类/CPU卡标准/CPU卡生产流程
  18. sql server小型案例-自动生成销售单号的触发器
  19. Retrofit 最简单的快速入门及封装
  20. 【典型室内场景无线网络部署方案】

热门文章

  1. 达梦数据库之redo日志文件损坏修复方法
  2. TCP/IP详解 第十二章(9) TCP断开连接
  3. 安利一个惊艳的红楼梦可视化作品
  4. 2022 系列Aerial3航拍屏保下载及安装使用教程
  5. 购物车+购买样例 springmvc
  6. 【网络流量识别】【深度学习】【二】RNN和ANN—深度学习入侵检测方法:ANN和RNN在NSL-KDD上的新性能
  7. PDF怎么转换成PPT?几个步骤轻松转换
  8. Matlab App Designer自学笔记(十四):分档旋钮控件、下拉菜单控件、微调控件
  9. 猪八戒网创始人朱明跃:蛰伏9年明白三件事
  10. 修改在服务器上搭建的hexo博客的主题