生成
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/main_classes/text_generation
每个框架都有一个用于文本生成的GenerationMixin
类中实现的生成方法:
- PyTorch 的 generate()在 GenerationMixin 中实现。
- TensorFlow 的 generate()在 TFGenerationMixin 中实现。
- Flax/JAX 的 generate()在 FlaxGenerationMixin 中实现。
无论您选择哪个框架,您都可以使用 GenerationConfig 类实例对生成方法进行参数化。请参考此类以获取完整的生成参数列表,这些参数控制生成方法的行为。
要了解如何检查模型的生成配置,了解默认值,如何临时更改参数以及如何创建和保存自定义生成配置,请参考文本生成策略指南。该指南还解释了如何使用相关功能,如标记流。
GenerationConfig
class transformers.GenerationConfig
( **kwargs )
控制输出长度的参数
max_length
(int
,可选,默认为 20)— 生成的标记可以具有的最大长度。对应于输入提示的长度+max_new_tokens
。如果也设置了max_new_tokens
,则其效果将被覆盖。max_new_tokens
(int
,可选)— 生成的最大标记数,忽略提示中的标记数。min_length
(int
,可选,默认为 0)— 要生成的序列的最小长度。对应于输入提示的长度+min_new_tokens
。如果也设置了min_new_tokens
,则其效果将被覆盖。min_new_tokens
(int
,可选)— 生成的最小标记数,忽略提示中的标记数。early_stopping
(bool
或str
,可选,默认为False
)— 控制基于束搜索的方法的停止条件,如束搜索。它接受以下值:True
,表示一旦有num_beams
个完整候选项就停止生成;False
,应用启发式方法,当很难找到更好的候选项时停止生成;"never"
,束搜索过程仅在不能有更好的候选项时停止(经典的束搜索算法)。max_time(float,
可选) — 允许计算运行的最长时间(以秒为单位)。在分配的时间已过后,生成仍将完成当前传递。
控制生成策略使用的参数
do_sample
(bool
,可选,默认为False
)— 是否使用采样;否则使用贪婪解码。num_beams
(int
,可选,默认为 1)— 用于束搜索的束数。1 表示不进行束搜索。num_beam_groups
(int
,可选,默认为 1)— 将num_beams
分成多个组以确保不同组的束之间的多样性。有关更多详细信息,请参阅此论文。penalty_alpha
(float
, optional) — 这些值平衡了对比搜索解码中模型置信度和退化惩罚。use_cache
(bool
, optional, defaults toTrue
) — 模型是否应使用过去的最后键/值注意力(如果适用于模型)来加快解码速度。
用于操纵模型输出 logits 的参数
temperature
(float
, optional, defaults to 1.0) — 用于调节下一个标记概率的值。top_k
(int
, optional, defaults to 50) — 要保留的最高概率词汇标记的数量,用于进行 top-k 过滤。top_p
(float
, optional, defaults to 1.0) — 如果设置为小于 1 的浮点数,则仅保留概率加起来达到top_p
或更高的最可能标记集合以进行生成。typical_p
(float
, optional, defaults to 1.0) — 本地典型性衡量了预测下一个目标标记的条件概率与预测随机下一个标记的条件概率之间的相似程度,给定已生成的部分文本。如果设置为小于 1 的浮点数,则保留概率加起来达到typical_p
或更高的最典型标记集合以进行生成。有关更多详细信息,请参见此论文。epsilon_cutoff
(float
, optional, defaults to 0.0) — 如果设置为 0 和 1 之间的浮点数,只有条件概率大于epsilon_cutoff
的标记才会被采样。在论文中,建议的值范围从 3e-4 到 9e-4,取决于模型的大小。有关更多详细信息,请参见截断采样作为语言模型去平滑。eta_cutoff
(float
, optional, defaults to 0.0) — Eta 采样是局部典型采样和 epsilon 采样的混合。如果设置为 0 和 1 之间的浮点数,仅当一个标记大于eta_cutoff
或sqrt(eta_cutoff) * exp(-entropy(softmax(next_token_logits))
时才考虑。后一项直观上是下一个标记概率的期望,乘以sqrt(eta_cutoff)
。在论文中,建议的值范围从 3e-4 到 2e-3,取决于模型的大小。有关更多详细信息,请参见截断采样作为语言模型去平滑。diversity_penalty
(float
, optional, defaults to 0.0) — 如果一个 beam 在特定时间生成与其他组中的任何 beam 相同的标记,则从该 beam 的得分中减去此值。请注意,只有在启用group beam search
时,diversity_penalty
才有效。repetition_penalty
(float
, optional, defaults to 1.0) — 重复惩罚的参数。1.0 表示没有惩罚。有关更多详细信息,请参见此论文。encoder_repetition_penalty
(float
, optional, defaults to 1.0) — 编码器重复惩罚的参数。对于不在原始输入中的序列施加指数惩罚。1.0 表示没有惩罚。length_penalty
(float
, optional, defaults to 1.0) — 用于基于 beam 的生成的长度的指数惩罚。它作为指数应用于序列长度,然后用于分割序列的得分。由于得分是序列的对数似然(即负数),length_penalty
> 0.0 会促进更长的序列,而length_penalty
< 0.0 会鼓励更短的序列。no_repeat_ngram_size
(int
, optional, defaults to 0) — 如果设置为大于 0 的整数,那么该大小的所有 ngram 只能出现一次。bad_words_ids(List[List[int]],
optional) — 不允许生成的标记 id 列表。查看 NoBadWordsLogitsProcessor 以获取更多文档和示例。force_words_ids(List[List[int]]
或List[List[List[int]]]
, optional) — 必须生成的标记 id 列表。如果给定List[List[int]]
,则将其视为必须包含的简单单词列表,与bad_words_ids
相反。如果给定List[List[List[int]]]
,这将触发一个分离约束,其中可以允许每个单词的不同形式。renormalize_logits
(bool
, optional, 默认为False
) — 在应用所有标记处理器或包装器(包括自定义的)后是否重新归一化标记。强烈建议将此标志设置为True
,因为搜索算法假定得分标记已归一化,但某些标记处理器或包装器会破坏归一化。constraints
(List[Constraint]
, optional) — 可以添加到生成中的自定义约束,以确保输出将包含由Constraint
对象定义的某些标记的使用,以最合理的方式。forced_bos_token_id
(int
, optional, 默认为model.config.forced_bos_token_id
) — 在decoder_start_token_id
后强制作为第一个生成的标记的标记 id。对于像 mBART 这样的多语言模型很有用,其中第一个生成的标记需要是目标语言标记。forced_eos_token_id
(Union[int, List[int]]
, optional, 默认为model.config.forced_eos_token_id
) — 当达到max_length
时,强制作为最后生成的标记的标记 id。可选择使用列表设置多个 end-of-sequence 标记。remove_invalid_values
(bool
, optional, 默认为model.config.remove_invalid_values
) — 是否删除模型可能的 nan 和 inf 输出,以防止生成方法崩溃。请注意,使用remove_invalid_values
可以减慢生成速度。exponential_decay_length_penalty
(tuple(int, float)
, optional) — 此元组在生成一定数量的标记后添加指数增长的长度惩罚。元组应包含:(start_index, decay_factor)
,其中start_index
表示惩罚开始的位置,decay_factor
表示指数衰减的因子。suppress_tokens
(List[int]
, optional) — 生成时将被抑制的标记列表。SupressTokens
标记处理器将将它们的对数概率设置为-inf
,以便它们不被抽样。begin_suppress_tokens
(List[int]
, optional) — 生成开始时将被抑制的标记列表。SupressBeginTokens
标记处理器将将它们的对数概率设置为-inf
,以便它们不被抽样。forced_decoder_ids
(List[List[int]]
, optional) — 一对整数的列表,指示在抽样之前将强制执行的生成索引到标记索引的映射。例如,[[1, 123]]
表示第二个生成的标记将始终是索引为 123 的标记。sequence_bias
(Dict[Tuple[int], float]
, optional)) — 将标记序列映射到其偏差项的字典。正偏差增加选择该序列的几率,而负偏差则相反。查看 SequenceBiasLogitsProcessor 以获取更多文档和示例。guidance_scale
(float
, optional) — 分类器自由引导(CFG)的引导比例。通过设置guidance_scale > 1
启用 CFG。更高的引导比例鼓励模型生成与输入提示更紧密相关的样本,通常以牺牲质量为代价。low_memory
(bool
, optional) — 用于对比搜索的顺序 topk 开关,以减少内存峰值。与对比搜索一起使用。
generate
输出变量的定义参数
num_return_sequences(int,
optional, 默认为 1) — 每个批次中每个元素独立计算返回序列的数量。output_attentions
(bool
, optional, defaults toFalse
) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量中的attentions
。output_hidden_states
(bool
, optional, defaults toFalse
) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states
。output_scores
(bool
, optional, defaults toFalse
) — 是否返回预测分数。有关更多详细信息,请参阅返回张量中的scores
。return_dict_in_generate
(bool
, optional, defaults toFalse
) — 是否返回 ModelOutput 而不是普通元组。
可在生成时使用的特殊标记
pad_token_id
(int
, optional) — 填充标记的 id。bos_token_id
(int
, optional) — 序列开始标记的 id。eos_token_id
(Union[int, List[int]]
, optional) — 序列结束标记的 id。可选择使用列表设置多个序列结束标记。
专属于编码器-解码器模型的生成参数
encoder_no_repeat_ngram_size
(int
, optional, defaults to 0) — 如果设置为大于 0 的整数,则在encoder_input_ids
中出现的该大小的所有 n 元组不能出现在decoder_input_ids
中。decoder_start_token_id
(int
, optional) — 如果编码器-解码器模型开始解码时使用与 bos 不同的标记,则为该标记的 id。
专属于 助手生成 — 定义助手模型在每次迭代之前生成的推测标记数量。num_assistant_tokens
的值越高,生成的推测性越强:如果助手模型表现良好,可以实现更大的加速,如果助手模型需要大量修正,则实现的加速度较低。
num_assistant_tokens_schedule
(str
, optional, defaults to"heuristic"
) — 定义推断期间最大助手标记应该如何更改的计划。
"_heuristic_
: 当所有推测标记都正确时,将num_assistant_tokens
增加 2,否则减少 1"constant"
: 在生成期间num_assistant_tokens
保持不变
通配符
用于生成任务配置的类。generate
调用支持以下文本解码器、文本到文本、语音到文本和视觉到文本模型的生成方法:
- 通过调用 greedy_search() 实现贪婪解码,如果
num_beams=1
且do_sample=False
- 通过调用 contrastive_search() 实现对比搜索,如果
penalty_alpha>0.
且top_k>1
- 通过调用 sample() 实现多项式采样,如果
num_beams=1
且do_sample=True
- 通过调用 beam_search() 实现束搜索解码,如果
num_beams>1
且do_sample=False
- 通过调用 beam_sample() 实现束搜索多项式采样,如果
num_beams>1
且do_sample=True
- 通过调用 group_beam_search() 实现多样束搜索解码,如果
num_beams>1
且num_beam_groups>1
- 通过调用 constrained_beam_search() 实现受限束搜索解码,如果
constraints!=None
或force_words_ids!=None
- 通过将
assistant_model
传递给.generate()
来进行辅助解码调用assisted_decoding()
。
您不需要直接调用上述任何方法。将自定义参数值传递给‘.generate()‘。要了解更多关于解码策略的信息,请参考文本生成策略指南。
这些标志中的大部分控制生成的对数或停止标准。确保您查看生成相关类以获取可能操作的完整描述,以及它们用法的示例。
from_pretrained
( pretrained_model_name: Union config_file_name: Union = None cache_dir: Union = None force_download: bool = False local_files_only: bool = False token: Union = None revision: str = 'main' **kwargs ) → export const metadata = 'undefined';GenerationConfig
参数
pretrained_model_name
(str
或os.PathLike
) — 这可以是:
- 一个字符串,预训练模型配置的模型 ID,托管在 huggingface.co 模型存储库中。有效的模型 ID 可以位于根级别,如
bert-base-uncased
,或命名空间在用户或组织名称下,如dbmdz/bert-base-german-cased
。 - 一个目录的路径,其中包含使用 save_pretrained()方法保存的配置文件,例如,
./my_model_directory/
。
config_file_name
(str
或os.PathLike
,可选,默认为"generation_config.json"
) — 要从pretrained_model_name
加载的生成配置 JSON 文件的名称。cache_dir
(str
或os.PathLike
,可选) — 下载预训练模型配置文件时应缓存的目录路径,如果不应使用标准缓存。force_download
(bool
,可选,默认为False
) — 是否强制(重新)下载配置文件并覆盖缓存版本(如果存在)。resume_download
(bool
,可选,默认为False
) — 是否删除接收不完整的文件。如果存在这样的文件,则尝试恢复下载。proxies
(Dict[str, str]
,可选) — 一个按协议或端点使用的代理服务器字典,例如,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}
。代理服务器在每个请求上使用。token
(str
或bool
,可选) — 用作远程文件的 HTTP 令牌的令牌。如果为True
,或未指定,将使用运行huggingface-cli login
时生成的令牌(存储在~/.huggingface
中)。revision
(str
,可选,默认为"main"
) — 要使用的特定模型版本。它可以是分支名称、标签名称或提交 ID,因为我们在 huggingface.co 上使用基于 git 的系统来存储模型和其他工件,所以revision
可以是 git 允许的任何标识符。
要测试您在 Hub 上提交的拉取请求,可以传递`revision=“refs/pr/“。return_unused_kwargs
(bool
,可选,默认为False
) — 如果为False
,则此函数仅返回最终的配置对象。
如果为True
,则此函数返回一个Tuple(config, unused_kwargs)
,其中unused_kwargs是一个字典,其中键/值对的键不是配置属性:即,未使用来更新config
的kwargs
的部分,否则将被忽略。subfolder
(str
,可选,默认为""
) — 如果相关文件位于 huggingface.co 模型存储库的子文件夹中,您可以在此处指定文件夹名称。kwargs
(Dict[str, Any]
,可选) — 任何键的 kwargs 值,这些键是配置属性,将用于覆盖加载的值。关于键/值对的行为,其键不是配置属性,由return_unused_kwargs
关键字参数控制。
返回
GenerationConfig
从这个预训练模型实例化的配置对象。
从生成配置文件实例化 GenerationConfig。
示例:
>>> from transformers import GenerationConfig >>> # Download configuration from huggingface.co and cache. >>> generation_config = GenerationConfig.from_pretrained("gpt2") >>> # E.g. config was saved using *save_pretrained('./test/saved_model/')* >>> generation_config.save_pretrained("./test/saved_model/") >>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/") >>> # You can also specify configuration names to your generation configuration file >>> generation_config.save_pretrained("./test/saved_model/", config_file_name="my_configuration.json") >>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/", "my_configuration.json") >>> # If you'd like to try a minor variation to an existing configuration, you can also pass generation >>> # arguments to `.from_pretrained()`. Be mindful that typos and unused arguments will be ignored >>> generation_config, unused_kwargs = GenerationConfig.from_pretrained( ... "gpt2", top_k=1, foo=False, do_sample=True, return_unused_kwargs=True ... ) >>> generation_config.top_k 1 >>> unused_kwargs {'foo': False}
from_model_config
( model_config: PretrainedConfig ) → export const metadata = 'undefined';GenerationConfig
参数
model_config
(PretrainedConfig
) — 将用于实例化生成配置的模型配置。
返回
GenerationConfig
从这些参数实例化的配置对象。
从 PretrainedConfig 实例化 GenerationConfig。此函数可用于将可能包含生成参数的旧 PretrainedConfig 对象转换为独立的 GenerationConfig。
save_pretrained
( save_directory: Union config_file_name: Union = None push_to_hub: bool = False **kwargs )
参数
save_directory
(str
或os.PathLike
) — 将保存配置 JSON 文件的目录(如果不存在,将创建)。config_file_name
(str
或os.PathLike
, 可选, 默认为"generation_config.json"
) — 要保存在save_directory
中的生成配置 JSON 文件的名称。push_to_hub
(bool
, 可选, 默认为False
) — 在保存模型后是否将其推送到 Hugging Face 模型中心。您可以使用repo_id
指定要推送到的存储库(将默认为您的命名空间中的save_directory
的名称)。kwargs
(Dict[str, Any]
, 可选) — 传递给 push_to_hub()方法的额外关键字参数。
将生成配置对象保存到目录save_directory
,以便可以使用 from_pretrained()类方法重新加载它。
GenerationMixin
class transformers.GenerationMixin
( )
一个包含自回归文本生成所有函数的类,可作为 PreTrainedModel 中的混合类使用。
该类公开 generate(),可用于:
- 通过调用 greedy_search()实现贪婪解码,如果
num_beams=1
且do_sample=False
- 通过调用 contrastive_search()实现对比搜索,如果
penalty_alpha>0
且top_k>1
- 通过调用 sample()实现多项式采样,如果
num_beams=1
且do_sample=True
- 通过调用 beam_search()实现束搜索解码,如果
num_beams>1
且do_sample=False
- 通过调用 beam_sample()实现束搜索多项式采样,如果
num_beams>1
且do_sample=True
- 通过调用 group_beam_search()实现多样化的束搜索解码,如果
num_beams>1
且num_beam_groups>1
- 通过调用 constrained_beam_search()实现受限束搜索解码,如果
constraints!=None
或force_words_ids!=None
您不需要直接调用上述任何方法。而是将自定义参数值传递给“generate”。要了解更多有关解码策略的信息,请参考文本生成策略指南。
generate
( inputs: Optional = None generation_config: Optional = None logits_processor: Optional = None stopping_criteria: Optional = None prefix_allowed_tokens_fn: Optional = None synced_gpus: Optional = None assistant_model: Optional = None streamer: Optional = None negative_prompt_ids: Optional = None negative_prompt_attention_mask: Optional = None **kwargs ) → export const metadata = 'undefined';ModelOutput or torch.LongTensor
参数
inputs
(根据模态性质变化的torch.Tensor
,可选)— 用作生成提示或模型输入到编码器的序列。如果为None
,则该方法将使用bos_token_id
和批量大小为 1 进行初始化。对于仅解码器模型,inputs
应该是input_ids
格式。对于编码器-解码器模型,inputs可以表示任何input_ids
、input_values
、input_features
或pixel_values
之一。generation_config
(~generation.GenerationConfig
,可选)— 用作生成调用的基本参数化的生成配置。传递给 generate 的**kwargs
与generation_config
的属性匹配将覆盖它们。如果未提供generation_config
,将使用默认值,其加载优先级如下:1)从generation_config.json
模型文件中,如果存在;2)从模型配置中。请注意,未指定的参数将继承 GenerationConfig 的默认值,应检查其文档以参数化生成。logits_processor
(LogitsProcessorList
,可选)— 自定义 logits 处理器,用于补充从参数和生成配置构建的默认 logits 处理器。如果传递了已经使用参数或生成配置创建的 logit 处理器,则会引发错误。此功能适用于高级用户。stopping_criteria
(StoppingCriteriaList
,可选)— 自定义停止标准,用于补充从参数和生成配置构建的默认停止标准。如果传递了已经使用参数或生成配置创建的停止标准,则会引发错误。如果您的停止标准取决于scores
输入,请确保将return_dict_in_generate=True, output_scores=True
传递给generate
。此功能适用于高级用户。prefix_allowed_tokens_fn
(Callable[[int, torch.Tensor], List[int]]
,可选)— 如果提供了此函数,则将束搜索限制为每个步骤仅允许的令牌。如果未提供,则不应用任何约束。此函数接受 2 个参数:批次 IDbatch_id
和input_ids
。它必须返回一个列表,其中包含下一代步骤的允许令牌,条件是批次 IDbatch_id
和先前生成的令牌inputs_ids
。此参数对于基于前缀的受限生成很有用,如自回归实体检索中所述。synced_gpus
(bool
,可选)— 是否继续运行 while 循环直到 max_length。除非被覆盖,否则在 DeepSpeed ZeRO Stage 3 多 GPU 环境下,此标志将设置为True
,以避免在其他 GPU 生成之前一个 GPU 完成生成时挂起。否则将设置为False
。assistant_model
(PreTrainedModel
,可选)— 一个可以用来加速生成的助手模型。助手模型必须具有完全相同的分词器。当使用助手模型预测候选令牌比使用您调用 generate 的模型进行生成要快得多时,加速就会实现。因此,助手模型应该要小得多。streamer
(BaseStreamer
,可选)— 将用于流式传输生成的序列的 Streamer 对象。生成的令牌通过streamer.put(token_ids)
传递,Streamer 负责任何进一步的处理。negative_prompt_ids
(torch.LongTensor
,形状为(batch_size, sequence_length)
,可选)— 一些处理器(如 CFG)需要的负提示。批量大小必须与输入批量大小匹配。这是一个实验性功能,可能在未来版本中会有破坏性的 API 更改。negative_prompt_attention_mask
(torch.LongTensor
,形状为(batch_size, sequence_length)
,可选)— 用于negative_prompt_ids
的 Attention_mask。kwargs
(Dict[str, Any]
,可选)—generate_config
的特定参数化和/或将转发到模型的forward
函数的其他模型特定 kwargs。如果模型是编码器-解码器模型,则编码器特定的 kwargs 不应该有前缀,解码器特定的 kwargs 应该以*decoder_*为前缀。
返回
ModelOutput 或torch.LongTensor
一个 ModelOutput(如果return_dict_in_generate=True
或当config.return_dict_in_generate=True
时)或一个torch.FloatTensor
。
如果模型不是编码器-解码器模型(model.config.is_encoder_decoder=False
),可能的 ModelOutput 类型有:
- GenerateDecoderOnlyOutput
- GenerateBeamDecoderOnlyOutput
如果模型是一个编码器-解码器模型(model.config.is_encoder_decoder=True
),可能的 ModelOutput 类型有:
- GenerateEncoderDecoderOutput,
- GenerateBeamEncoderDecoderOutput
为具有语言建模头的模型生成令牌 id 序列。
大多数控制生成的参数都在generation_config
中设置,如果未传递,则将设置为模型的默认生成配置。您可以通过将相应的参数传递给 generate()来覆盖任何generation_config
,例如.generate(inputs, num_beams=4, do_sample=True)
。
有关生成策略和代码示例的概述,请查看以下指南。
compute_transition_scores
( sequences: Tensor scores: Tuple beam_indices: Optional = None normalize_logits: bool = False ) → export const metadata = 'undefined';torch.Tensor
参数
sequences
(torch.LongTensor
)— 生成的序列。第二维(sequence_length)要么等于max_length
,要么如果所有批次由于eos_token_id
而提前完成,则较短。scores
(tuple(torch.FloatTensor)
)— 每个生成步骤中每个词汇令牌的转移分数。由条件于先前生成令牌的对数 softmax 的令牌的对数概率组成的波束转移分数元组,其中每个张量的形状为(batch_size*num_beams, config.vocab_size)
,最多有max_new_tokens
个元素(每个生成的令牌一个元素)。beam_indices
(torch.LongTensor
,可选)— 在每个生成步骤生成的标记 id 的波束索引。形状为(batch_size*num_return_sequences, sequence_length)
的torch.LongTensor
。仅在生成时num_beams>1
时需要。normalize_logits
(bool
,可选,默认为False
)— 是否对 logits 进行归一化(由于历史原因,可能未归一化)。
返回
torch.Tensor
形状为(batch_size*num_return_sequences, sequence_length)
的torch.Tensor
,包含转换分数(logits)
计算给定生成分数的序列的转换分数(如果使用波束搜索,则还有波束索引)。这是一种方便的方法,在生成时快速获取所选标记的分数。
示例:
>>> from transformers import GPT2Tokenizer, AutoModelForCausalLM >>> import numpy as np >>> tokenizer = GPT2Tokenizer.from_pretrained("gpt2") >>> model = AutoModelForCausalLM.from_pretrained("gpt2") >>> tokenizer.pad_token_id = tokenizer.eos_token_id >>> inputs = tokenizer(["Today is"], return_tensors="pt") >>> # Example 1: Print the scores for each token generated with Greedy Search >>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True) >>> transition_scores = model.compute_transition_scores( ... outputs.sequences, outputs.scores, normalize_logits=True ... ) >>> # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for >>> # encoder-decoder models, like BART or T5. >>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1] >>> generated_tokens = outputs.sequences[:, input_length:] >>> for tok, score in zip(generated_tokens[0], transition_scores[0]): ... # | token | token string | logits | probability ... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}") | 262 | the | -1.414 | 24.33% | 1110 | day | -2.609 | 7.36% | 618 | when | -2.010 | 13.40% | 356 | we | -1.859 | 15.58% | 460 | can | -2.508 | 8.14% >>> # Example 2: Reconstruct the sequence scores from Beam Search >>> outputs = model.generate( ... **inputs, ... max_new_tokens=5, ... num_beams=4, ... num_return_sequences=4, ... return_dict_in_generate=True, ... output_scores=True, ... ) >>> transition_scores = model.compute_transition_scores( ... outputs.sequences, outputs.scores, outputs.beam_indices, normalize_logits=False ... ) >>> # If you sum the generated tokens' scores and apply the length penalty, you'll get the sequence scores. >>> # Tip 1: recomputing the scores is only guaranteed to match with `normalize_logits=False`. Depending on the >>> # use case, you might want to recompute it with `normalize_logits=True`. >>> # Tip 2: the output length does NOT include the input length >>> output_length = np.sum(transition_scores.numpy() < 0, axis=1) >>> length_penalty = model.generation_config.length_penalty >>> reconstructed_scores = transition_scores.sum(axis=1) / (output_length**length_penalty) >>> print(np.allclose(outputs.sequences_scores, reconstructed_scores)) True
Transformers 4.37 中文文档(十五)(2)https://developer.aliyun.com/article/1564965