第4章 用GPT-2生成文本

BERT 是基于双向 Transformer 结构构建,而 GPT-2 是基于单向 Transformer,这里的双向与单向,是指在进行注意力计算时,BERT会同时考虑被遮蔽词左右的词对其的影响,融合了双向上下文信息,它比较适合于文本生成类任务。而 GPT-2 只会考虑在待预测词位置左侧的词对待预测词的影响,GPT-2模型比较适合文本生成类任务,因此本章将使用GPT-2模型来完成中文新闻文本生成任务。      

4.1 GPT-2概述

       GPT-2 就是一个语言模型,能够根据上文预测下一个单词,所以它就可以利用预训练已经学到的知识来生成文本,如生成新闻。也可以使用另一些数据进行微调,生成有特定格式或者主题的文本,如诗歌、戏剧。所以接下来,我们会用 GPT-2 模型进行一个文本生成。

       GPT -2在做下游无监督任务的时候,不改变模型结构,也不更新权重参数,而是通过修改输入方式来实现。对于不同类型的输入,加入一些引导字符,引导GPT-2正确地预测目标,比如如果做摘要,在输入时候加入“TL:DR”引导字符串;做翻译任务时,如法语翻译成英语,把数据做成 french sentence = english sentence,语言模型遇到=的时候,就能推断出接下来是翻译任务。

这里例举几个典型案例,更多实例可参考OpenAI官网:

https://openai.com/blog/better-language-models/#sample1

例1.根据提示生成对应文本

In a shocking finding, scientist discovered a herd of unicorns living in a

remote, previously unexplored valley, in the Andes Mountains. Even more

surprising to the researchers was the fact that the unicorns spoke perfect English.

【科学家们有个令人震惊的发现,在安第斯山脉一个偏远且没被开发过的山谷里,

生活着一群独角兽。更加让人讶异的是,这些独角兽说着完美的英文。】

The  scientist named the population, after their distinctive horn, Ovid’s Unicorn.

These four-horned, silver-white unicorns were previously unknown to science.

Now, after almost two centuries, the mystery of what sparked this

odd phenomenon is finally solved.

..............................

【这些生物有着独特的角,科学家们就以此为它们命名,叫Ovid’s Unicorn。长着四只角的银白色生物,在这之前并不为科学界所知。

现在,过了近两个世纪,这个奇异的现象到底是怎么发现的,谜底终于解开了。】

..................

例2.常识推理:

阅读下面句子,回答“它”指代的部分

The trophy doesn’t fit into the brown suitcase because it is too large.

【奖杯放不进棕色旅行箱,因为它太大了】

GPT-2给出的答案:

it = trophy

[与正确答案一致]

The trophy doesn’t fit into the brown suitcase because it is too small.

【奖杯放不进棕色手提箱,因为它太小了】

GPT-2给出的答案:

it = suitcase

[与正确答案一致]

GPT-2 是如何实现的?接下来我们通过使用GPT-2生成新闻的实例,进行详细说明。

4.2 用GPT-2生成新闻

       想要直接运行一个预训练好的 GPT-2 模型,最简单的方法是让它自由工作,即随机生成文本。换句话说,在开始时,我们给它一点提示,即一个预定好的起始单词,然后让它自行地随机生成后续的文本。

       但这样有时可能会出现问题,例如模型陷入一个循环,不断生成同一个单词。为了避免这种情况, GPT-2 设置了一个 top-k 参数,这样模型就会从概率前 k 大的单词中随机选取一个单词,作为下一个单词。下面是选择 top-k 的函数的实现。

4.2.1 定义随机选择函数

1.定义随机选择函数

import random

def select_top_k(predictions, k=10):
    predicted_index = random.choice(
        predictions[0, -1, :].sort(descending=True)[1][:10]).item()
    return predicted_index

2.导入分词库等 

#过滤警告信息
import warnings
warnings.filterwarnings('ignore')
import logging
logging.basicConfig(level=logging.INFO)

import torch
from transformers import GPT2Tokenizer
# 载入预训练模型的分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

3.测试GPT2Tokenizer

# 使用 GPT2Tokenizer 对输入进行编码
text = "Yesterday, a man named Jack said he saw an alien,"
indexed_tokens = tokenizer.encode(text)
tokens_tensor = torch.tensor([indexed_tokens])
tokens_tensor.shape

4.2.2预训练模型生成新闻

       接下来使用 GPT2LMHeadModel() 建立模型,并将模型模式设为验证模式。由于预训练模型参数体积很大,这里把相关模块先下载,然后放在本地的gpt目录下。下载GPT-2预训练模型。具体下载方法如下:

1.打开huggingface官网

https://huggingface.co/models

2.选择预训练模型

 3.点击list all files in model,进入下载文件界面:

 这里使用PyTorch,所以选择pytorch_model.bin。如果使用TensorFlow平台,则选择tf_model.h5,其它一样。

对给定的text生成新闻。

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:
        # 如果出现文本结束标志,就结束文本生成
        break

    indexed_tokens += [predicted_index]
    tokens_tensor = torch.tensor([indexed_tokens])

print(total_predicted_text)

运行结果:

Yesterday, a man named Jack said he saw an alien, who was flying in midstream in an airplane over North Korea's border and he called in an air support aircraft in his helicopter so as to take down the pilot and get out the other side of his ship to prevent any possible casualties and prevent anyone from going overboard." The UAS, according to Mr, has no record of a pilot flying within 500 km in that time range," the BBC report stated on the official site for Pyongyang. It did mention "an unidentified aircraft flying around in that air base

从结果来看,好像是一段正常的文本,不过,仔细看就会发现语句中的还存在一些不足之处。

       除了直接利用预训练模型生成文本,我们还可以使用微调的方法使 GPT-2 模型生成有特定风格和格式的文本。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值