首页 > 其他分享 >如何生成文本: 通过 Transformers 用不同的解码方法生成文本

如何生成文本: 通过 Transformers 用不同的解码方法生成文本

时间:2023-04-24 23:48:23浏览次数:47  
标签:采样 Transformers text top dog 生成 文本 my Top

简介

近年来,随着以 OpenAI GPT2 模型 为代表的基于数百万网页数据训练的大型 Transformer 语言模型的兴起,开放域语言生成领域吸引了越来越多的关注。开放域中的条件语言生成效果令人印象深刻,典型的例子有: GPT2 在独角兽话题上的精彩续写XLNet 以及 使用 CTRL 模型生成受控文本 等。促成这些进展的除了 transformer 架构的改进和大规模无监督训练数据外,更好的解码方法 也发挥了不可或缺的作用。

本文简述了不同的解码策略,同时向读者展示了如何使用流行的 transformers 库轻松实现这些解码策略!

下文中的所有功能均可用于 自回归 语言生成任务 (点击 此处 回顾)。简单复习一下, 自回归 语言生成是基于如下假设: 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积。

$$ P(w_{1:T} | W_0 ) = \prod_{t=1}^T P(w_{t} | w_{1: t-1}, W_0) \text{ , 其中 } w_{1: 0} = \emptyset, $$

上式中,$W_0$ 是初始 上下文 单词序列。文本序列的长度 $T$ 通常时变的,并且对应于时间步 $t=T$。$P(w_{t} | w_{1: t- 1}, W_{0})$ 的词表中已包含 终止符 (End Of Sequence,EOS)。 transformers 目前已支持的自回归语言生成任务包括 GPT2XLNetOpenAi-GPTCTRLTransfoXLXLMBartT5 模型,并支持 PyTorch 和 TensorFlow (>= 2.0) 两种框架!

我们会介绍目前最常用的解码方法,主要有 贪心搜索 (Greedy search)波束搜索 (Beam search)Top-K 采样 (Top-K sampling) 以及 Top-p 采样 (Top-p sampling)

在此之前,我们先快速安装一下 transformers 并把模型加载进来。本文我们用 GPT2 模型在 TensorFlow 2.1 中进行演示,但 API 和使用 PyTorch 框架是一一对应的。

!pip install -q git+https://github.com/huggingface/transformers.git
!pip install -q tensorflow==2.1
import tensorflow as tf
from transformers import TFGPT2LMHeadModel, GPT2Tokenizer

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

# add the EOS token as PAD token to avoid warnings
model = TFGPT2LMHeadModel.from_pretrained("gpt2",pad_token_id=tokenizer.eos_token_id)

贪心搜索

贪心搜索在每个时间步 $t$ 都简单地选择概率最高的词作为当前输出词: $w_t = argmax_{w}P(w | w_{1:t-1})$ ,如下图所示。

从单词 $\text{“The”}$ 开始,算法在第一步贪心地选择条件概率最高的词 $\text{“nice”}$ 作为输出,依此往后。最终生成的单词序列为 $(\text{“The”}, \text{“nice”}, \text{“woman”})$,其联合概率为 $0.5 \times 0.4 = 0.2$。

下面,我们输入文本序列 $(\text{“I”}, \text{“enjoy”}, \text{“walking”}, \text{“with”}, \text{“my”}, \text{“cute”}, \text{“dog”})$ 给 GPT2 模型,让模型生成下文。我们以此为例看看如何在 transformers 中使用贪心搜索:

# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='tf')

# generate text until the output length (which includes the context length) reaches 50
greedy_output = model.generate(input_ids, max_length=50)

print("Output:\n" + 100 *'-')
print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))
Output:
----------------------------------------------------------------------------------------------------
I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with my dog. I'm not sure if I'll ever be able to walk with my dog.

I'm not sure if I'll

好,我们已经用 GPT2 生成了第一个短文本

标签:采样,Transformers,text,top,dog,生成,文本,my,Top
From: https://www.cnblogs.com/huggingface/p/17351307.html

相关文章

  • SQL: PL/SQL打印用户表脚本文本
    PLSQL打印用户表脚本文本环境:ORACLE19C createorreplacepackageCUX_util_pkg2is--Author:SAM--Created:2022/8/2110:20:39--Purpose:LONG_TO_CHAR--更新:2023/4/24,增加识别临时表----将ORACLELONG类型转为字符串类型FUNCTIONLON......
  • Acwing 3728-城市通电 / 最小生成树,建图,超级源点
    AcWing3728.城市通电做出来就凭之前的一句感悟:把每个动态选择变为与超级源点连的一条边,把这条边加入图里面跑最小生成树就相当于考虑了每个动态选择......
  • Unity通过PBXProject生成XCode工程
    Unity版本:2020.3.47f1首先通过PostProcessBuildAttribute监听XCode工程导出完成事件,GetUnityMainTargetGuid是获取XCode工程中"Unity-iPhone"对应的target,GetUnityFrameworkTargetGuid则对应"UnityFramework",在unity中大部分操作会是针对UnityFramework。PBXProject的很多操作都......
  • 5.Linux文本处理
    前言我们上节课学了vim文本编辑器,可以以交互的方式去编辑我们的文本,即在vim是打开文本然后通过键盘对其进行插入、删除、替换等,这节课就会大家介绍一下Linux中的文本三剑客,之前在第三课我们已经学习了grep命令,这节课我们就来学习剩下的两个,sed与awk及一些其它命令sed命令上面......
  • 获得将要生成的资源的GUID
    1)获得将要生成的资源的GUID​2)多个小资源包合并为大资源包的疑问3)模型Meta中的hasExtraRoot参数的作用和历史原因4)合批注意点这是第333篇UWA技术知识分享的推送,也是《厚积薄发|技术分享》第三回,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌......
  • nginx 按天生成日志
    月小升记得以前nginx没有办法读取日期,今天找到个办法居然可以。server{location~\.php${fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;include/etc/nginx/fastcgi_params;fastcgi_pass......
  • OpenAI的离线音频转文本模型 Whisper 的.NET封装项目
    whisper介绍OpenAI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的Whisper神经网络,且它亦支持其它98种语言的自动语音辨识。Whisper系统所提供的自动语音辨识(AutomaticSpeechRecognition,ASR)模型是被训练来运行语音辨识与翻译任务的,它们能将各种语言的语音变成文......
  • 记录在vue3项目中使用wangeditor富文本编译器以及微信小程序中的渲染
    首先,管理后台中的使用npminstallwangeditor//f封装成了组件,以下是组件中的内容<template>  <divstyle="border:1pxsolid#ccc;maxwidth:600px">   <!--工具栏-->   <Toolbar    style="border-bottom:1pxsolid#ccc"    :......
  • Python 实时生成曲线的两种方法-Matplotlib/Pyqtgraph
    前言Matplotlib更倾向于制作出版质量的图形,对matlab程序员来说更直观。pyqtgraph不像matplotlib那样完整/成熟,但运行速度要快得多,而且pyqtgraph旨在用于数据采集和分析应用程序,对于python/qt程序员来说更直观。Matplotlib(据我所知)不包括许多pyqtgraph的功能,例如图像......
  • P4180 [BJWC2010] 严格次小生成树
    P4180[BJWC2010]严格次小生成树/*建立一个最小生成树维护最大值和严格次小值然后直接查询就可以了56121132243354343456*/#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingpii=pair<int,int>;constintN=1e......