類
類名 | 簡單說明 |
---|---|
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