LLM(大语言模型)解码时是怎么生成文本的?
transformers==4.28.1
源码地址:transformers/configuration_utils.py at v4.28.1 · huggingface/transformers (github.com)
【资料图】
文档地址:Generation (huggingface.co)
对于生成任务而言:text-decoder, text-to-text, speech-to-text, and vision-to-text models,有以下几种生成的方法:
~generation.GenerationMixin.greedy_search] if num_beams=1anddo_sample=False~generation.GenerationMixin.contrastive_search] if penalty_alpha>0.and top_k>1~generation.GenerationMixin.sample] if num_beams=1anddo_sample=True~generation.GenerationMixin.beam_search] if num_beams>1anddo_sample=False~generation.GenerationMixin.beam_sample] ifnum_beams>1and do_sample=True~generation.GenerationMixin.group_beam_search], ifnum_beams>1and num_beam_groups>1~generation.GenerationMixin.constrained_beam_search], ifconstraints!=Noneor force_words_ids!=None具体有以下参数可供选择:
(1)控制输出长度的参数
num_beams个句子后停止 beam search,默认是False。(2)控制输出策略的参数
do_sample (bool, optional, defaults to False) - 是否使用采样,否则使用贪婪解码 。
num_beams (int, optional, defaults to 1) - 集束搜索的集束数量。1意味着没有集束搜索 。
num_beam_groups (int, optional, defaults to 1) - 将num_beam分成的组数,以确保不同组的beams的多样性。https://arxiv.org/pdf/1610.02424.pdf
penalty_alpha (float, optional) - 平衡模型置信度和对比搜索解码中的退化惩罚的数值。
use_cache (bool, optional, defaults to True) - 模型是否应该使用过去最后的键/值注意力(如果适用于模型)来加速解码。
(3)控制模型输出Logits的参数
(4)定义generate输出变量的参数
(5)可在生成时使用的特殊参数
(6)编码器-解码器模型独有的生成参数
encoder_no_repeat_ngram_size (int, optional, defaults to 0) - 如果设置为int > 0,所有出现在encoder_input_ids中的该大小的ngrams都不能出现在decoder_input_ids中 。
decoder_start_token_id (int, optional) - 如果一个编码器-解码器模型以不同于bos的 token开始解码,则这就是该token的id。
我们可以这么使用、保存预训练模型已经定义好的参数:
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,GenerationConfigmodel_name_or_path="uer/gpt2-chinese-cluecorpussmall"tokenizer=AutoTokenizer.from_pretrained(model_name_or_path)model=AutoModelForCausalLM.from_pretrained(model_name_or_path)generation_config=model.generation_configgeneration_config_dict=generation_config.to_dict()generation_config_dict["num_beams"]=2generation_config=GenerationConfig.from_dict(generation_config_dict)print(generation_config)generation_config.save_pretrained("./")"""{"_from_model_config":true,"bos_token_id":50256,"eos_token_id":50256,"num_beams":2,"transformers_version":"4.28.1"}"""需要注意的是,如果参数是默认的值得话,则不会显示出来。另外,GenerationConfig类里面有许多可用的方法,具体可以去看看源代码。
2一般使用方法在定义好config之后,我们可以这么使用:
fromtransformersimportAutoModelForSeq2SeqLM,AutoTokenizer,GenerationConfigtokenizer=AutoTokenizer.from_pretrained("t5-small")model=AutoModelForSeq2SeqLM.from_pretrained("t5-small")translation_generation_config=GenerationConfig(num_beams=4,early_stopping=True,decoder_start_token_id=0,eos_token_id=model.config.eos_token_id,pad_token=model.config.pad_token_id,)translation_generation_config.save_pretrained("t5-small","translation_generation_config.json",push_to_hub=True)#Youcouldthenusethenamedgenerationconfigfiletoparameterizegeneration#可以加载我们自己本地保存的generation_configgeneration_config=GenerationConfig.from_pretrained("t5-small","translation_generation_config.json")inputs=tokenizer("translateEnglishtoFrench:Configurationfilesareeasytouse!",return_tensors="pt")outputs=model.generate(**inputs,generation_config=generation_config)print(tokenizer.batch_decode(outputs,skip_special_tokens=True))Part3生成结果使用transformers库的生成模型生成结果有三种方式,暂时不要在意参数:
3pipeline指定为text-generation
fromtransformersimportpipelinegenerator=pipeline("text-generation",model="uer/gpt2-chinese-cluecorpussmall",)text_inputs=["昨天已经过去,"]generator(text_inputs,max_length=100)4TextGenerationPipelinefromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipelinetokenizer=AutoTokenizer.from_pretrained("uer/gpt2-chinese-cluecorpussmall")model=AutoModelForCausalLM.from_pretrained("uer/gpt2-chinese-cluecorpussmall")text_generator=TextGenerationPipeline(model,tokenizer)text_inputs=["昨天已经过去,"]text_generator(text_inputs,max_length=100)5model.generate()fromtransformersimportAutoTokenizer,AutoModelForCausalLMimporttorch,ostokenizer=AutoTokenizer.from_pretrained("uer/gpt2-chinese-cluecorpussmall")model=AutoModelForCausalLM.from_pretrained("uer/gpt2-chinese-cluecorpussmall")device="cuda"iftorch.cuda.is_available()else"cpu"model=model.to(device)texts=["昨天已经过去,"]#用batch输入的时候一定要设置paddingencoding=tokenizer(texts,return_tensors="pt",padding=True).to(device)model.eval()withtorch.no_grad():generated_ids=model.generate(**encoding,max_length=100)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)fortextingenerated_texts:print(text)我们捋一捋它们之间的关系:最基础的还是model.generate(),而TextGenerationPipeline在_forward里面调用了model.generate(),pipeline实际上是对TextGenerationPipeline的进一步封装:
"text-generation":{"impl":TextGenerationPipeline,"tf":TFAutoModelForCausalLMifis_tf_available()elseNone,"pt":AutoModelForCausalLMifis_torch_available()elseNone,"default":{"model":{"pt":"gpt2","tf":"gpt2"}},},6流式打印在介绍不同的生成方法之前,先介绍下流式打印。使用过ChatGPT的玩家都知道,在生成结果的时候,它是一部分一部分的返回生成的文本并展示的,transformers该版本也有这个功能,我们接下来看。
fromtransformersimportAutoModelForCausalLM,AutoTokenizer,TextStreamertokenizer=AutoTokenizer.from_pretrained("uer/gpt2-chinese-cluecorpussmall")model=AutoModelForCausalLM.from_pretrained("uer/gpt2-chinese-cluecorpussmall")input_text="昨天已经过去,"inputs=tokenizer([input_text],return_tensors="pt",add_special_tokens=False)streamer=TextStreamer(tokenizer)#Despitereturningtheusualoutput,thestreamerwillalsoprintthegeneratedtexttostdout._=model.generate(**inputs,streamer=streamer,max_new_tokens=86)如果想要一次性返回结果再打印,则是这样的:
fromtransformersimportAutoModelForCausalLM,AutoTokenizer,TextIteratorStreamerfromthreadingimportThreadtokenizer=AutoTokenizer.from_pretrained("uer/gpt2-chinese-cluecorpussmall")model=AutoModelForCausalLM.from_pretrained("uer/gpt2-chinese-cluecorpussmall")input_text="昨天已经过去,"inputs=tokenizer([input_text],return_tensors="pt",add_special_tokens=False)streamer=TextIteratorStreamer(tokenizer)#Runthegenerationinaseparatethread,sothatwecanfetchthegeneratedtextinanon-blockingway.generation_kwargs=dict(inputs,streamer=streamer,max_new_tokens=100)thread=Thread(target=model.generate,kwargs=generation_kwargs)thread.start()generated_text=""fornew_textinstreamer:generated_text+=new_textgenerated_textPart4多种生成方式接下来将以之前训练好的观点评论生成的GPT来生成不同的结果,我们每次都使用三种方式对比看看结果。
7Greedy Searchgenerate默认使用贪婪的搜索解码,所以你不需要传递任何参数来启用它。这意味着参数num_beams被设置为1,do_sample=False。
如图上所属,每次选择概率值最高的词。贪心搜索的主要缺点是它错过了隐藏在低概率词后面的高概率词,比如has=0.9不会被选择到。
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,num_beams=1,do_sample=False)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=1,do_sample=False,pad_token_id=0))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":1,"do_sample":False,}print(generator(input_text,**generation_config))"""虽然说是4星级,不过["虽然说是4星级,不过感觉和3星没什么两样,只是服务水准差了点而已"][{"generated_text":"虽然说是4星级,不过感觉和3星没什么两样,只是服务水准差了点而已"}][{"generated_text":"虽然说是4星级,不过感觉和3星没什么两样,只是服务水准差了点而已"}]"""答案是一致的,和我们之前的推测一样,但需要注意的是model.gneerate()对单条预测的时候我们在tokenizer的时候设置padding为False了,如果设置为True,则得不到相同的结果。
8Contrastive search对比搜索解码策略是在2022年的论文A Contrastive Framework for Neural Text Generation https://arxiv.org/abs/2202.06417中提出的。它展示了生成非重复但连贯的长输出的优越结果。要了解对比性搜索的工作原理,请查看这篇博文https://huggingface.co/blog/introducing-csearch。启用和控制对比性搜索行为的两个主要参数是punice_alpha和top_k:
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])#text=dataset["train"][0]text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,do_sample=False,num_beams=1,penalty_alpha=0.6,top_k=4)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=1,do_sample=False,pad_token_id=0,penalty_alpha=0.6,top_k=4))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":1,"do_sample":False,#"penalty_alpha":0.6,#"top_k":4,}print(generator(input_text,**generation_config))"""["极差!停车收十元钱!穷则思变!房间潮湿得不得了,晚上居然停了一个多小时,上网一会有信号一会没有。电视遥控器不管用,打电话给客房中心,得到的回复居然是坏的房间在维修,不知道"][{"generated_text":"极差!停车收十元钱!穷则思变!房间潮湿得不得了,晚上居然停了一个多小时,上网一会有信号一会没有。电视遥控器不管用,打电话给客房中心,得到的回复居然是坏的房间在维修,不知道"}][{"generated_text":"极差!停车收十元钱!穷则思变!房间设施差就一个招待所,最多三星级!"}]"""可以对比和贪婪解码看一下结果。
9Multinomial sampling与总是选择概率最高的标记作为下一个标记的贪婪搜索相反,多项式抽样(也称为祖先抽样)根据模型给出的整个词汇的概率分布来随机选择下一个标记。每个概率不为零的符号都有机会被选中,从而减少了重复的风险。
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])#text=dataset["train"][0]text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,do_sample=True,num_beams=1,)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=1,do_sample=True,pad_token_id=0,))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":1,"do_sample":True,}print(generator(input_text,**generation_config))"""["房间:建筑风格比较独特,但不显现空间特色。地理位置不是很好,离九华山比较远,出租车还比较难找。门童服务蛮好,门口迎宾也很热情。房间设施:住9楼标房,朝西,马路上的喧嚣比较"][{"generated_text":"房间:建筑风格比较独特,墙壁由黑色为主,给人一种温馨的感觉,房间内少点什么装饰,总体还算可以。交通:订一辆出租车,一天之内送完了,一天后再打车,车子要走到春熙路,十分方便"}][{"generated_text":"房间:建筑风格比较独特,比较特别的是窗外的自然环境,很漂亮,房间内的设施也不错,有独立的阳台,所谓的山景房看风景也能看到大草坪和远处的大海。服务:因为我和的朋友预定的是山"}]"""10Beam-search decoding与贪婪搜索不同的是,集束搜索解码在每个时间步骤中保留几个假设,并最终选择对整个序列具有最高概率的假设。这具有识别高概率序列的优势,这些序列从较低概率的初始标记开始,会被贪婪搜索所忽略。
要启用这种解码策略,需要指定num_beams(又称要跟踪的假说数量)大于1。集束搜索通过在每个时间步保留最可能的 num_beams个词,并从中最终选择出概率最高的序列来降低丢失潜在的高概率序列的风险。以 num_beams=2为例:
最终得到:the dog has (0.4+0.9) > the nice woman (0.5+0.4)。
缺点:虽然结果比贪心搜索更流畅,但输出中仍然包含重复。
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])#text=dataset["train"][0]text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,do_sample=False,num_beams=4,)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=4,do_sample=False,pad_token_id=0,))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":4,"do_sample":False,}print(generator(input_text,**generation_config))"""酒店的整体服务意识相["酒店的整体服务意识相当好,对于未按照预订时间到达的客户,还能够保留预订,但是沟通技巧不是很好,还有对于未按预订时间到达的客户,还要给携程的工作带来很大麻烦。"][{"generated_text":"酒店的整体服务意识相当好,对于未按照预订时间到达的客户,还能够保留预订,但是沟通技巧不是很好,还有对于未按预订时间到达的客户,还要给携程的工作带来很大麻烦。"}][{"generated_text":"酒店的整体服务意识相当好,对于未按照预订时间到达的客户,还能够保留预订,但是沟通技巧不是很好,还有对于未按预订时间到达的客户,还要给携程的工作带来很大麻烦。"}]"""11Beam-search multinomial sampling顾名思义,这种解码策略结合了集束搜索和多指标采样。你需要指定num_beams大于1,并设置do_sample=True来使用这种解码策略。
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])#text=dataset["train"][0]text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,do_sample=True,num_beams=4,)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=4,do_sample=True,pad_token_id=0,))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":4,"do_sample":True,}print(generator(input_text,**generation_config))"""["酒店在肇庆闹市区,但交通非常方便,酒店服务员态度非常好,酒店硬件条件还可以,就是房间隔音效果非常不好,隔壁的电视声音、走廊人说话声等清清楚楚,住在一楼还能听到隔壁房间的电"][{"generated_text":"酒店在肇庆闹市区,但交通非常方便,酒店服务态度很好,房间干净整洁,下次去肇庆还会选择该酒店。"}][{"generated_text":"酒店在肇庆闹市区,但交通非常方便,酒店环境不错,房间比较干净,服务员态度也很好,总的来说是一家不错的酒店。"}]"""12Diverse beam search decoding多样化集束搜索解码策略是对集束搜索策略的扩展,可以生成更多样化的集束序列供人们选择。要了解它的工作原理,请参考《多样化集束搜索》https://arxiv.org/pdf/1610.02424.pdf: 从神经序列模型解码多样化的解决方案。这种方法有两个主要参数:num_beams和num_beam_groups。组的选择是为了确保它们与其他组相比有足够的区别,并在每个组内使用常规集束搜索。
fromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextGenerationPipeline,pipelinetokenizer=AutoTokenizer.from_pretrained("./gpt2-chinese")model=AutoModelForCausalLM.from_pretrained("./gpt2-chinese")fromdatasetsimportload_datasetdata_file="./ChnSentiCorp_htl_all.csv"dataset=load_dataset("csv",data_files=data_file)dataset=dataset.filter(lambdax:x["review"]isnotNone)dataset=dataset["train"].train_test_split(0.2,seed=123)importrandomexample=random.choice(dataset["train"])#text=dataset["train"][0]text=example["review"]input_text=text[:10]print(input_text)#greedysearchmodel.eval()withtorch.no_grad():encoding=tokenizer(input_text,return_tensors="pt",padding=False,add_special_tokens=False,return_token_type_ids=False,return_attention_mask=False,)generated_ids=model.generate(**encoding,max_length=100,eos_token_id=0,pad_token_id=0,do_sample=False,num_beams=4,num_beam_groups=4,)generated_texts=tokenizer.batch_decode(generated_ids,skip_special_tokens=True)print(generated_texts)text_generator=TextGenerationPipeline(model,tokenizer)print(text_generator(input_text,max_length=100,eos_token_id=0,num_beams=4,do_sample=False,pad_token_id=0,num_beam_groups=4,))generator=pipeline("text-generation",model=model,tokenizer=tokenizer)generation_config={"max_length":100,"eos_token_id":0,"pad_token_id":0,"num_beams":4,"do_sample":False,"num_beam_groups":4,}print(generator(input_text,**generation_config))"""住过如此之多的如家酒["住过如此之多的如家酒店,这一家是最差的,服务差,房间老旧,而且价格还不低。下次不会再住了。"][{"generated_text":"住过如此之多的如家酒店,这一家是最差的,服务差,房间老旧,而且价格还不低。下次不会再住了。"}][{"generated_text":"住过如此之多的如家酒店,这一家是最差的,服务差,房间老旧,而且价格还不低。下次不会再住了。"}]"""Part5补充13常用的一些参数:num_return_sequences <= num_beams采样意味着根据当前条件概率分布随机选择输出词 ,使用采样方法时文本生成本身不再是确定性的。对单词序列进行采样时的大问题: 模型通常会产生不连贯的乱码。可以设置top_k=0关闭采样。缓解这一问题的一个技巧是通过降低所谓的 softmax的“温度”使分布 更陡峭。而降低“温度”,本质上是增加高概率单词的似然并降低低概率单词的似然。
将温度应用到于我们的例子中后,结果如下图所示。
时刻单词的条件分布变得更加陡峭,几乎没有机会选择单词 “car” 了。虽然温度可以使分布的随机性降低,但极限条件下,当“温度”设置为 0 时,温度缩放采样就退化成贪心解码了,因此会遇到与贪心解码相同的问题。
15Top-K采样在 Top-K采样中,概率最大的 K个词会被选出,然后这 K个词的概率会被重新归一化,最后就在这重新被归一化概率后的 K个词中采样。 GPT2 采用了这种采样方案,这也是它在故事生成这样的任务上取得成功的原因之一。
假设:top_k=6
输入:the, the的下一个词从概率最大的top6里面采样到car,the car的下一个词从概率最大的top6里面采样。可以看到后面一些奇怪的词就可以被忽略掉。
16Top-P采样在 Top-p中,采样不只是在最有可能的 K个单词中进行,而是在累积概率超过概率 p的最小单词集中进行。然后在这组词中重新分配概率质量。这样,词集的大小 (又名集合中的词数) 可以根据下一个词的概率分布动态增加和减少。好吧,说的很啰嗦,一图胜千言。
假设 p=0.92 , Top-p采样对单词概率进行降序排列并累加,然后选择概率和首次超过 p=0.92 的单词集作为采样池,可以看出,在单词比较不可预测时,它保留了更多的候选词。而当单词似乎更容易预测时,只保留了几个候选词。
一般而言,结合top_k和top_p会有不错的效果。
Part6参考Text generation strategies (huggingface.co)
transformers/configuration_utils.py at v4.28.1 · huggingface/transformers · GitHub
transformers/text_generation.py at v4.28.1 · huggingface/transformers · GitHub
基于 transformers 的 generate() 方法实现多样化文本生成:参数含义和算法原理解读_transformers generate_木尧大兄弟的博客-CSDN博客
https://zhuanlan.zhihu.com/p/624636122
文中部分文字和图摘自上述文章。
标签:
-
2023-04-20 17:22:26
河南又一4A级旅游景区揭牌!仰韶仙门山正式开园迎宾!<
陶醉山水间,仰韶仙门山。4月20日上午10:00,仰韶酒庄·仙门山开园盛典暨国家AAAA级旅游景区揭牌仪式在仰韶酒庄·仙门山景区隆重举办!相
-
2023-04-15 17:20:36
荣获“河南省省长质量奖”,仰韶交出“高质量”答卷!<
近日,2020-2021年河南省省长质量奖获奖名单正式公布,仰韶酒业集团强势上榜,成为河南唯一一家获奖的酒企。河南省省长质量奖是河南省人民
-
2022-02-07 14:57:45
奇迹!绝杀!女足亚洲杯逆转夺冠!<
刚刚,中国女足上演逆转绝杀奇迹!她们在亚洲杯决赛中3:2力克韩国队,时隔16年再夺亚洲杯冠军!
-
2022-02-07 14:57:45
中国政府与阿根廷共和国政府签署共建“一带一路”谅解备忘录<
新华社北京2月6日电(记者安蓓)国家发展改革委6日称,国家发展改革委主任何立峰与阿根廷外交、国际贸易和宗教事
-
2022-02-07 14:57:43
中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明(全文)<
新华社北京2月6日电中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明一、应中方邀请,阿根廷
-
2023-04-25 17:44:39
LLM(大语言模型)解码时是怎么生成文本的?
Part1配置及参数transformers==4 28 1源码地址:transformers configuration_utils pyatv4 28 1& 183;huggingfa
-
2023-04-25 17:23:38
滚动:就市论市丨“光 锂”等赛道股全线重挫 “锂”亏还能追“光”吗?
今天A股继续调整,值得一提的是,由于业绩表现不佳,锂电板块下跌,另一方面,光伏龙头业绩大增,抛出大手
-
2023-04-25 17:01:25
澄海玩具_关于澄海玩具介绍
1、玩具礼品业是澄海最具活力、最具特色的支柱产业。2、澄海区自2003年4月被中国轻工业联合会授予“中国玩
-
2023-04-25 16:08:09
Steam中国玩家数第二!PS港服、国服玩家仅3.6% 前沿资讯
今日,外媒Newsletter通过统计数以百万计的玩家公开资料和游戏评分 评级信息,统计出了PlayStation、Xbox和
-
2023-04-25 15:56:54
Live11在RAM中运行的Windows11LiveDisk可供下载 当前最新
我们中有些人还记得以前每个操作系统都是从软盘启动的。然而,几十年来,几乎每台计算机都将其操作系统存储
-
2023-04-25 15:28:25
富士胶片Instax Mini 12在推出
富士胶片在推出了一款新的即时相机。最新的产品是InstaxMini12,它是InstaxMini11的继任者。该设备还具有实
-
2023-04-25 15:01:31
每日动态!山东舰怒杀回马枪,台方发布其最新画面,距台岛最南端约120海里
台防务部门24日称,发现山东舰航母编队目前正在西太平洋训练,距鹅銮鼻东南方约120海里(约等于222 24公里
-
2023-04-25 14:05:47
4月25日利华益异辛醇价格暂稳
4月25日,山东利华益集团股份有限公司异辛醇装置运行正常。出厂价格9250元 吨,报价暂稳,实际成交价以协商
-
2023-04-25 13:53:44
苹果手机丢失怎么定位找回
1、如果丢失的苹果手机开启了”查找我的iPhone "功能,则可以用另一部手机来对丢失的手机进行定位,定位手
-
2023-04-25 13:45:30
徐小明:跌速快风险大
徐小明:跌速快风险大今天上午部分指数的跌速过快,跌速快风险大,这么跌问题还是很大的。首先日线就算有底
-
2023-04-25 13:15:17
热门:中山公用股东户数增加397户,户均持股22.03万元
中山公用最新股东户数4 08万户,呈现连续4期上升,高于行业平均水平。公司户均持有流通股份3 07万股;户均
-
2023-04-25 12:46:30
13度穿什么衣服_13度穿什么衣服合适|环球精选
欢迎观看本篇文章,小勉来为大家解答以上问题。13度穿什么衣服,13度穿什么衣服合适很多人还不知道,现在让
-
2023-04-25 12:17:31
财产保全的执行时间是多久
财产保全的执行时间是需要根据实际情况决定,若冻结被执行人的银行存款及其他资金,执行时间不可以超过六个
-
2023-04-25 12:17:47
点外卖竟然是警察来送餐?警察:外卖员被我抓了! 每日视讯
近日,北京一外卖小哥看路边一辆电动车电瓶不错,便动起了歪念,尝试多次后将其偷走。北京朝阳小红门派出所
-
2023-04-25 12:26:11
新北当铺被扫射51枪案再有8人被逮捕,幕后主使已潜逃吉隆坡
【环球网报道】据台湾中时新闻网25日报道,日前发生在新北市土城区的当铺枪击案,引起岛内关注,新北市警方
-
2023-04-25 12:22:41
世界快讯:杜润旺遗憾不是尽头而是开始 巴特勒56分字母哥26+10+12热火逆转雄鹿(今日/头条)
一、杜润旺遗憾不是尽头而是开始直播吧4月25日讯今天,广东球员杜润旺今天凌晨更新微博回顾了整个赛季。他
-
2023-04-25 12:09:46
麦捷科技:公司BAW滤波器目前可用在4G/5G的发射端模组方案|全球微动态
麦捷科技(300319)04月25日在投资者互动平台表示:您好,公司BAW滤波器目前可用在4G 5G的发射端模组方案,
-
2023-04-25 11:53:41
全球热头条丨特斯拉面向其他部分非特斯拉新能源车辆试点开放充电网络
特斯拉表示,在中国大陆地区,特斯拉面向其他部分非特斯拉新能源车辆试点开放充电网络,首批试点开放10座特
-
2023-04-25 11:52:14
【环球新要闻】2023年保荐代表人考试《投资银行业务》章节练习题精选0425_保荐代表人考试
2023年保荐代表人考试《投资银行业务》考试共120题,分为选择题和组合型选择题。小编为您整理第三章股本融
-
2023-04-25 11:37:46
中旗新材:公司可转债于2023年4月25日上市 环球新要闻
中旗新材(001212)04月25日在投资者互动平台表示:尊敬的投资者您好!公司可转债于2023年4月25日上市,谢谢!
-
2023-04-25 11:27:49
全球热门:2019年至今水费未交,补交了水费3000元后,又说偷水,部分水没有过表
2019年至今水费未交,补交了水费3000元后,又说偷水,部分水没有过表
-
2023-04-25 11:09:12
多地将用数字人民币发工资 许多网友好奇是什么体验?|每日热点
【多地“尝鲜”用数字人民币发工资,是什么体验?有何不同?】 多地将用数字人民币发工资 近日,“一地用数
-
2023-04-25 11:01:19
环球视点!一季度国内旅游人次收入同比大幅增长
4月21日,文化和旅游部公布2023年一季度国内旅游数据情况。数据显示,2023年一季度国内旅游总人次、旅游收
-
2023-04-25 11:05:54
特一药业(002728):该股换手率大于8%(04-25)_今日播报
摘要:2023年04月25日特一药业(002728)换手率大于8%,主力资金净流出6475 73万元。换手率大于8%说明了该
-
2023-04-25 10:38:50
保护知识产权特别报道|说说保护知识产权的那些事儿
知识产权是建设创新型国家的重要支撑。在鼓励社会创新的同时,也要保护创新者的知识产权,营造良好的公平竞争
-
2023-04-25 10:45:16
Snapchat 将 My AI 开放给所有用户免费使用 却招致大量一星差评-全球快资讯
编程客栈()4月25日消息:上周,Snapchat宣布将其「MyAI」助手的可用性扩大到所有用户,而最初只有高级用户可
-
2023-04-25 10:24:36
朔城区四中第五届校园读书周开幕|每日精选
黄河新闻网朔州讯(记者李一凡)为推动朔城区四中读书活动,在校园内形成爱读书、读好书、会读书的良好风气
-
2023-04-25 10:30:38
巨婴何时能长大?家长雨天抱儿子被喷,网友:是妈妈的好“大”儿
小时候最开心的就是下雨天了,小学生们比农民伯伯都盼着下雨,因为到了下雨天,就能穿上新买的雨鞋雨衣,打
-
2023-04-25 10:14:56
23年中级会计报名入口:全国会计资格评价网-天天百事通
23年中级会计报名入口:全国会计资格评价网由会计职称考试栏目提供,查找更多考试报名资讯、准考证打印、成
-
2023-04-25 10:21:25
世界观速讯丨银行股异动拉升 中信银行涨超5%
南方财经4月25日电,银行股异动拉升,中信银行涨超5%,兰州银行、宁波银行、成都银行、平安银行、无锡银行