类
类名 | 简单说明 |
---|---|
GenerateDecoderOnlyOutput | 继承自 ModelOutput ,适用于非束搜索方法的解码器-only模型输出类。 |
GenerateEncoderDecoderOutput | 继承自 ModelOutput ,适用于非束搜索方法的编码器-解码器模型输出类。 |
GenerateBeamDecoderOnlyOutput | 继承自 ModelOutput ,适用于束搜索方法的解码器-only模型输出类。 |
GenerateBeamEncoderDecoderOutput | 继承自 ModelOutput ,适用于束搜索方法的编码器-解码器模型输出类。 |
GreedySearchDecoderOnlyOutput | 与 GenerateDecoderOnlyOutput 相同,保留用于向后兼容的别名。 |
ContrastiveSearchDecoderOnlyOutput | 与 GenerateDecoderOnlyOutput 相同,保留用于向后兼容的别名。 |
SampleDecoderOnlyOutput | 与 GenerateDecoderOnlyOutput 相同,保留用于向后兼容的别名。 |
GreedySearchEncoderDecoderOutput | 与 GenerateEncoderDecoderOutput 相同,保留用于向后兼容的别名。 |
ContrastiveSearchEncoderDecoderOutput | 与 GenerateEncoderDecoderOutput 相同,保留用于向后兼容的别名。 |
SampleEncoderDecoderOutput | 与 GenerateEncoderDecoderOutput 相同,保留用于向后兼容的别名。 |
BeamSearchDecoderOnlyOutput | 与 GenerateBeamDecoderOnlyOutput 相同,保留用于向后兼容的别名。 |
BeamSampleDecoderOnlyOutput | 与 GenerateBeamDecoderOnlyOutput 相同,保留用于向后兼容的别名。 |
BeamSearchEncoderDecoderOutput | 与 GenerateBeamEncoderDecoderOutput 相同,保留用于向后兼容的别名。 |
BeamSampleEncoderDecoderOutput | 与 GenerateBeamEncoderDecoderOutput 相同,保留用于向后兼容的别名。 |
GreedySearchOutput | GreedySearchEncoderDecoderOutput 和 GreedySearchDecoderOnlyOutput 的联合类型。 |
SampleOutput | SampleEncoderDecoderOutput 和 SampleDecoderOnlyOutput 的联合类型。 |
BeamSearchOutput | BeamSearchEncoderDecoderOutput 和 BeamSearchDecoderOnlyOutput 的联合类型。 |
BeamSampleOutput | BeamSampleEncoderDecoderOutput 和 BeamSampleDecoderOnlyOutput 的联合类型。 |
ContrastiveSearchOutput | ContrastiveSearchEncoderDecoderOutput 和 ContrastiveSearchDecoderOnlyOutput 的联合类型。 |
GenerateNonBeamOutput | GenerateDecoderOnlyOutput 和 GenerateEncoderDecoderOutput 的联合类型。 |
GenerateBeamOutput | GenerateBeamDecoderOnlyOutput 和 GenerateBeamEncoderDecoderOutput 的联合类型。 |
GenerateOutput | GenerateNonBeamOutput 和 GenerateBeamOutput 的联合类型。 |
GenerationMixin | 包含自动回归文本生成所有功能的类,可作为 PreTrainedModel 的 mixin 使用。 |
-
定义了多个数据类(
@dataclass
),这些类继承自ModelOutput
,用于表示生成模型在不同情况下的输出结果。
Python:@dataclass装饰器 -
定义了一些等价的类和类型简写(typing shortcuts),主要是为了兼容旧版本的代码,也方便在代码中进行类型提示。
重点解释以下三个类:
-
GenerateDecoderOnlyOutput
-
GenerateEncoderDecoderOutput
-
GenerateNonBeamOutput
1. GenerateDecoderOnlyOutput
描述:
GenerateDecoderOnlyOutput
是一个数据类,用于表示 仅解码器模型(decoder-only models) 在使用 非束搜索方法(non-beam methods) 进行生成时的输出结果。
主要用途:
此类主要用于像 GPT-2、GPT-3 等仅包含解码器的模型,当它们使用贪婪搜索(Greedy Search)、随机采样(Sampling)、对比搜索(Contrastive Search)等非束搜索方法进行文本生成时,封装和返回生成的结果。
2. GenerateEncoderDecoderOutput
描述:
GenerateEncoderDecoderOutput
是一个数据类,用于表示 编码器-解码器模型(encoder-decoder models) 在使用 非束搜索方法(non-beam methods) 进行生成时的输出结果。
主要用途:
此类主要用于像 BART、T5 等包含编码器和解码器的模型,当它们使用贪婪搜索、随机采样、对比搜索等非束搜索方法进行文本生成时,封装和返回生成的结果。
GenerateDecoderOnlyOutput
与 GenerateEncoderDecoderOutput
字段名 | GenerateDecoderOnlyOutput | GenerateEncoderDecoderOutput |
---|---|---|
sequences | 必填torch.LongTensor 形状:(batch_size, sequence_length) 生成的序列。 | 必填torch.LongTensor 形状:(batch_size * num_return_sequences, sequence_length) 生成的序列。 |
scores | 可选Optional[Tuple[torch.FloatTensor]] 当 output_scores=True 时返回。处理后的预测分数(每步)。 | 可选Optional[Tuple[torch.FloatTensor]] 同左。 |
logits | 可选Optional[Tuple[torch.FloatTensor]] 当 output_logits=True 时返回。未经处理的预测分数(每步)。 | 可选Optional[Tuple[torch.FloatTensor]] 同左。 |
attentions | 可选Optional[Tuple[Tuple[torch.FloatTensor]]] 当 output_attentions=True 时返回。解码器每层的注意力权重。 | 名称不同 在 GenerateEncoderDecoderOutput 中,该字段为 decoder_attentions 。 |
hidden_states | 可选Optional[Tuple[Tuple[torch.FloatTensor]]] 当 output_hidden_states=True 时返回。解码器每层的隐藏状态。 | 名称不同 在 GenerateEncoderDecoderOutput 中,该字段为 decoder_hidden_states 。 |
past_key_values | 可选Optional[Tuple[Tuple[Tuple[torch.FloatTensor]]]] 当 use_cache=True 时返回。模型的缓存状态。 | 可选Optional[Tuple[Tuple[Tuple[torch.FloatTensor]]]] 同左。 |
encoder_attentions | 无此字段 | 可选Optional[Tuple[torch.FloatTensor]] 当 output_attentions=True 时返回。编码器每层的注意力权重。 |
encoder_hidden_states | 无此字段 | 可选Optional[Tuple[torch.FloatTensor]] 当 output_hidden_states=True 时返回。编码器每层的隐藏状态。 |
decoder_attentions | 无此字段 对应于 attentions 字段。 | 可选Optional[Tuple[Tuple[torch.FloatTensor]]] 解码器每层的注意力权重。 |
decoder_hidden_states | 无此字段 对应于 hidden_states 字段。 | 可选Optional[Tuple[Tuple[torch.FloatTensor]]] 解码器每层的隐藏状态。 |
cross_attentions | 无此字段 | 可选Optional[Tuple[Tuple[torch.FloatTensor]]] 当 output_attentions=True 时返回。解码器每层的跨注意力权重。 |
字段详解
共有字段
-
sequences
- 描述:生成的序列。
- GenerateDecoderOnlyOutput:形状为
(batch_size, sequence_length)
。 - GenerateEncoderDecoderOutput:形状为
(batch_size * num_return_sequences, sequence_length)
。
-
scores
- 描述:处理后的预测分数(即在 SoftMax 之前的 logits),每步生成一个。
- 类型:
Optional[Tuple[torch.FloatTensor]]
。 - 返回条件:
output_scores=True
。
-
logits
- 描述:未经处理的预测分数(logits),每步生成一个。
- 类型:
Optional[Tuple[torch.FloatTensor]]
。 - 返回条件:
output_logits=True
。
-
past_key_values
- 描述:模型的缓存状态,用于加速解码。
- 类型:
Optional[Tuple[Tuple[Tuple[torch.FloatTensor]]]]
。 - 返回条件:
use_cache=True
。
仅在 GenerateDecoderOnlyOutput
中
-
attentions
- 描述:解码器的注意力权重。
- 类型:
Optional[Tuple[Tuple[torch.FloatTensor]]]
。 - 返回条件:
output_attentions=True
。
-
hidden_states
- 描述:解码器的隐藏状态。
- 类型:
Optional[Tuple[Tuple[torch.FloatTensor]]]
。 - 返回条件:
output_hidden_states=True
。
仅在 GenerateEncoderDecoderOutput
中
-
encoder_attentions
- 描述:编码器的注意力权重。
- 类型:
Optional[Tuple[torch.FloatTensor]]
。 - 返回条件:
output_attentions=True
。
-
encoder_hidden_states
- 描述:编码器的隐藏状态。
- 类型:
Optional[Tuple[torch.FloatTensor]]
。 - 返回条件:
output_hidden_states=True
。
-
decoder_attentions
- 描述:解码器的注意力权重(相当于
GenerateDecoderOnlyOutput
中的attentions
)。 - 类型:
Optional[Tuple[Tuple[torch.FloatTensor]]]
。 - 返回条件:
output_attentions=True
。
- 描述:解码器的注意力权重(相当于
-
decoder_hidden_states
- 描述:解码器的隐藏状态(相当于
GenerateDecoderOnlyOutput
中的hidden_states
)。 - 类型:
Optional[Tuple[Tuple[torch.FloatTensor]]]
。 - 返回条件:
output_hidden_states=True
。
- 描述:解码器的隐藏状态(相当于
-
cross_attentions
- 描述:解码器的跨注意力权重(解码器与编码器之间的注意力)。
- 类型:
Optional[Tuple[Tuple[torch.FloatTensor]]]
。 - 返回条件:
output_attentions=True
。
3. GenerateNonBeamOutput
描述:
GenerateNonBeamOutput
是一个类型别名,用于表示在使用 非束搜索方法(non-beam methods) 进行生成时,模型的输出结果。
定义:
GenerateNonBeamOutput = Union[GenerateDecoderOnlyOutput, GenerateEncoderDecoderOutput]
含义:
-
它可以是
GenerateDecoderOnlyOutput
类型,也可以是GenerateEncoderDecoderOutput
类型。 -
这个类型别名的存在,使得在处理非束搜索生成输出时,可以统一处理,不用区分模型是仅解码器模型还是编码器-解码器模型。
附加说明:
-
非束搜索方法(Non-beam methods):
指在生成文本时,不使用束搜索(Beam Search)算法的生成方法,例如贪婪搜索、随机采样、对比搜索等。这些方法通常速度更快,但可能生成的结果质量不如束搜索。
-
缓存机制(Past Key Values):
在生成长序列时,模型可以缓存之前计算的键和值,以避免重复计算,提高生成效率。缓存的内容和格式因模型而异。
GenerationMixin
以下是对 GenerationMixin
类中各个方法和属性的整理,包括分类和功能描述:
类别 | 名称 | 功能描述 |
---|---|---|
静态方法 | _expand_inputs_for_generation | 扩展输入以用于生成,将张量从 [batch_size, ...] 扩展为 [batch_size * expand_size, ...] 。 |
实例方法 | prepare_inputs_for_generation | 准备生成所需的模型输入,包括计算注意力掩码或根据缓存裁剪输入等操作。 |
实例方法 | _prepare_model_inputs | 提取用于生成的模型特定输入。 |
实例方法 | _maybe_initialize_input_ids_for_generation | 在必要时初始化用于生成的 input_ids 。 |
实例方法 | _prepare_attention_mask_for_generation | 为生成准备注意力掩码。 |
实例方法 | _prepare_encoder_decoder_kwargs_for_generation | 在生成期间为编码器-解码器模型准备 kwargs 。 |
实例方法 | _prepare_decoder_input_ids_for_generation | 为编码器-解码器模型准备用于生成的 decoder_input_ids 。 |
实例方法 | _update_model_kwargs_for_generation | 更新下一步生成所需的 model_kwargs 。 |
实例方法 | _reorder_cache | 重新排序缓存,需要在子类中实现,以适应 beam search 等方法。 |
实例方法 | _get_candidate_generator | 返回在辅助生成中使用的候选生成器。 |
实例方法 | _get_logits_processor | 返回一个 LogitsProcessorList ,其中包含所有用于修改分数的相关 LogitsProcessor 实例。 |
实例方法 | _get_stopping_criteria | 返回用于生成的 StoppingCriteriaList ,包括各种停止条件。 |
实例方法 | _merge_criteria_processor_list | 合并默认和自定义的 criteria 或 processor 列表。 |
实例方法 | compute_transition_scores | 根据生成的得分计算序列的转移得分。 |
实例方法 | _validate_model_class | 验证模型类是否兼容生成操作。 |
实例方法 | _validate_assistant | 验证辅助模型(如果提供)是否兼容和正确配置。 |
实例方法 | _validate_model_kwargs | 验证用于生成的 model_kwargs 参数。 |
实例方法 | _validate_generated_length | 执行与生成长度相关的验证,确保参数设置正确。 |
实例方法 | _prepare_generated_length | 在生成配置中准备最大和最小长度,避免参数冲突。 |
实例方法 | _prepare_generation_config | 准备基础的生成配置,并应用来自 kwargs 的任何选项。 |
实例方法 | _get_initial_cache_position | 计算预填充阶段的 cache_position 。 |
实例方法 | _get_cache | 根据参数为生成设置缓存。 |
实例方法 | _supports_default_dynamic_cache | 返回模型是否支持将 DynamicCache 实例作为 past_key_values 。 |
实例方法 | _prepare_cache_for_generation | 为生成准备缓存,并将其写入 model_kwargs 。 |
实例方法 | _supports_logits_to_keep | 返回模型是否支持 logits_to_keep 参数,用于节省内存。 |
实例方法 | _prepare_special_tokens | 为生成准备特殊的 tokens,如 bos_token_id 、eos_token_id 等。 |
实例方法 | generate | 为具有语言模型头的模型生成 token 序列,是生成过程的主要入口方法。 |
实例方法 | _has_unfinished_sequences | 检查设备中是否仍然存在未完成的序列,用于确定是否继续生成循环。 |
实例方法 | heal_tokens | 生成 token 序列,其中每个序列的尾部 token 替换为适当的扩展,用于修复不完整的 token。 |
实例方法 | _dola_decoding | 使用 DoLa 解码生成序列,一种改进生成质量的解码策略。 |
实例方法 | _contrastive_search | 使用对比搜索生成序列,旨在改善生成文本的质量和多样性。 |
实例方法 | _sample | 使用多项式采样生成序列,可以实现随机性和多样性。 |
实例方法 | _temporary_reorder_cache | 临时函数,用于处理不同类型的缓存重新排序。 |
实例方法 | _beam_search | 使用 beam search 解码生成序列,支持高质量的序列生成。 |
实例方法 | _group_beam_search | 使用分组 beam search 解码生成序列,引入多样性。 |
实例方法 | _constrained_beam_search | 使用受限 beam search 解码生成序列,支持强制包含特定词语等约束。 |
实例方法 | _assisted_decoding | 使用辅助解码生成序列,利用辅助模型加速和改善生成过程。 |
GenerationMixin中最核心的方法是generate方法,其它方法都是generate方法的辅助方法:
GenerationMixin:generate