关于Python文本生成的Beam Search解码问题

目录

贪婪搜索是在每个时间步中选择概率最高的单词,也是我们最常用的一种方法,Beam Search不取每个标记本身的绝对概率,而是考虑每个标记的所有可能扩展。然后根据其对数概率选择最合适的标记序列。

例如令牌的概率如下所示:

例如,Pancakes + looks时间段1的概率等效于:

Pancakes looks so = log(0.2) + log(0.7)= -1.9
Pancakes looks fluffy  = log(0.2) + log(0.3)= -2.8

所以我们需要定义一个函数来完成整句的概率计算:

import torch.nn.functional as F
def log_probability_single(logits, labels):
    logp = F.log_softmax(logits, dim=-1)
    logp_label = torch.gather(logp, 2, labels.unsqueeze(2)).squeeze(-1)
    return logp_label
def sentence_logprob(model, labels, input_len=0):
    with torch.no_grad():
        result = model(labels)
        log_probability = log_probability_single(result.logits[:, :-1, :],
                                                 labels[:, 1:])
    sentence_log_prob = torch.sum(log_probability[:, input_len:])
    return sentence_log_prob.cpu().numpy()

接下来,可以将其应用于贪婪搜索解码方法生成的输出,并计算生成的序列的对数概率。

在此示例中,我将在村上春木的书中简要介绍:1Q84。

input_sentence = "A love story, a mystery, a fantasy, a novel of self-discovery, a dystopia to rival George Orwell's — 1Q84 is Haruki Murakami's most ambitious undertaking yet: an instant best seller in his native Japan, and a tremendous feat of imagination from one of our most revered contemporary writers."

max_sequence = 100
input_ids = tokenizer(input_sentence,
                      return_tensors='pt')['input_ids'].to(device)
output = model.generate(input_ids, max_length=max_sequence, do_sample=False)

greedy_search_output = sentence_logprob(model,
                                        output,
                                        input_len=len(input_ids[0]))
print(tokenizer.decode(output[0]))

我们可以看到生成的序列的对数概率为-52.31。

现在,我们将并比较通过Beam Search生成的序列的对数概率得分,得分越高潜在结果越好。

我们可以增加n-gram惩罚参数no_repeat_ngram_size,这有助于减少输出中的重复生成的序列。

beam_search_output = model.generate(input_ids,
                                    max_length=max_sequence,
                                    num_beams=5,
                                    do_sample=False,
                                    no_repeat_ngram_size=2)
beam_search_log_prob = sentence_logprob(model,
                                        beam_search_output,
                                        input_len=len(input_ids[0]))
print(tokenizer.decode(beam_search_output[0]))
print(f"\nlog_prob: {beam_search_log_prob:.2f}")

输出如下:

分时和连贯性要比贪婪的方法好很多,对吧。

到此这篇关于Python文本生成的Beam Search解码的文章就介绍到这了,更多相关Python文本生成的Beam Search内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 解码Base64 得到码流格式文本实例

    我就废话不多说了,直接上代码吧! # coding:utf8 import base64 def BaseToFlow(): while True: str = input("Please input src: ") flag = input("Please input Decode - 1 or Encode - 2: ") if str == "": str = "ApIAGBcEAAAEBO6x3nLykEEhjWMX1wHs&q

  • Python编解码问题及文本文件处理方法详解

    编解码器 在字符与字节之间的转换过程称为编解码,Python自带了超过100种编解码器,比如: ascii(英文体系) gb2312(中文体系) utf-8(全球通用) latin1 utf-16 编解码器一般有多个别名,比如utf8.utf-8.U8. 这些编解码器可以传给open().str.encode().bytes.decode()等函数的encoding参数. UnicodeEncodeError 多数非UTF编解码器(比如cp437)只能处理Unicode字符的一小部分子集.把字符

  • Python 利用base64库 解码本地txt文本字符串

    使用base64还原由图片加密而成的字符串. Raw字符串: iVBORw0KGgoAAAANSUhEUgAAAtoAAALaCAYAAAAP7vQzAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAJnjSURBVHhe7NZRiiRLDgXRt/9Nz2zgNFyQyqXwdAP7NCRXZDX93/8ej8fj8Xg8Ho9HO+8/2o/H4/F4PB6Pxx/w/qP9eDwej8fj8Xj8Ae8

  • 关于Python文本生成的Beam Search解码问题

    目录 贪婪搜索是在每个时间步中选择概率最高的单词,也是我们最常用的一种方法,Beam Search不取每个标记本身的绝对概率,而是考虑每个标记的所有可能扩展.然后根据其对数概率选择最合适的标记序列. 例如令牌的概率如下所示: 例如,Pancakes + looks时间段1的概率等效于: Pancakes looks so = log(0.2) + log(0.7)= -1.9 Pancakes looks fluffy = log(0.2) + log(0.3)= -2.8 所以我们需要定义一个

  • 分享Python文本生成二维码实例

    本文实例分享了Python文本生成二维码的详细代码,供大家参考,具体内容如下 测试一:将文本生成白底黑字的二维码图片 测试二:将文本生成带logo的二维码图片 #coding:utf-8 ''' Python生成二维码 v1.0 主要将文本生成二维码图片 测试一:将文本生成白底黑字的二维码图片 测试二:将文本生成带logo的二维码图片 ''' __author__ = 'Xue' import qrcode from PIL import Image import os #生成二维码图片 def

  • Python实现将文本生成二维码的方法示例

    本文实例讲述了Python实现将文本生成二维码的方法.分享给大家供大家参考,具体如下: #coding:utf-8 ''' Python生成二维码 v1.0 主要将文本生成二维码图片 测试一:将文本生成白底黑字的二维码图片 测试二:将文本生成带logo的二维码图片 ''' __author__ = 'Xue' import qrcode from PIL import Image import os #生成二维码图片 def make_qr(str,save): qr=qrcode.QRCode

  • python根据文本生成词云图代码实例

    这篇文章主要介绍了python根据文本生成词云图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 效果 代码 from wordcloud import WordCloud import codecs import jieba #import jieba.analyse as analyse from scipy.misc import imread import os from os import path import matplot

  • Python简单实现Base64编码和解码的方法

    本文实例讲述了Python简单实现Base64编码和解码的方法.分享给大家供大家参考,具体如下: Base64编码是一种"防君子不防小人"的编码方式.广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有"=",生成的编码都是ascii字符. 优点:速度快,ascii字符,肉眼不可理解 缺点:编码比较长,非常容易被破解,仅适用于加密非关键信息的场合 Python Base64编码和解码示例: >>> import base6

  • 详解Python文本操作相关模块

    详解Python文本操作相关模块 linecache--通过使用缓存在内部尝试优化以达到高效从任何文件中读出任何行. 主要方法: linecache.getline(filename, lineno[, module_globals]):获取指定行的内容 linecache.clearcache():清除缓存 linecache.checkcache([filename]):检查缓存的有效性 dircache--定义了一个函数,使用缓存读取目录列表.使用目录的mtime来实现缓存失效.此外还定义

  • python方法生成txt标签文件的实例代码

    1.如果想要利用代码(不论是python.c++.亦或是matlab)实现生成标签文件,首先,也是灰常重要的一件事就是你的图片集一定要是有规律的命名.数字字母顺序排开.这一点非常重要,相关重命名方法请自行百度或请教大牛. 2.如图为博主的图片集.(注意命名规律) 博主只分为猫和鸟两类. 3.看代码. 在caffe根目录下创建一个我们的工程目录my-caffe-project 创建并编辑create_db.py文件,使用如下指令: vim create_db.py 然后,代码内容就是我们的重点了.

  • python 随机生成10位数密码的实现代码

    随机生成10位数密码,字母和数字组合 import string >>> import random >>> pwd = "" >>> letters=string.ascii_letters+string.digits >>> for i in range(10): ... letter=random.choice(letters) ... pwd += letter ... >>> print

  • Python文本统计功能之西游记用字统计操作示例

    本文实例讲述了Python文本统计功能之西游记用字统计操作.分享给大家供大家参考,具体如下: 一.数据 xyj.txt,<西游记>的文本,2.2MB 致敬吴承恩大师,4020行(段) 二.目标 统计<西游记>中: 1. 共出现了多少个不同的汉字: 2. 每个汉字出现了多少次: 3. 出现得最频繁的汉字有哪些. 三.涉及内容: 1. 读文件: 2. 字典的使用: 3. 字典的排序: 4. 写文件 四.效果 五.源代码 # coding:utf8 import sys reload(s

  • 使用Python 自动生成 Word 文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档的格式(默认字体.页面边距等). 3.在文档对象中加入段落文本.表格.图像等,并指定其样式. 4.保存文档. 注:本库仅支持生成Word2007以后版本的文档类型,即扩展名为.docx 的. 下面分步介绍其基本使用方法: 步骤一: from docx import Document doc = Do

随机推荐