Transformers documentation
DPR
该模型于 2020-04-10 在 HF papers 上发布,并于 2020-11-16 贡献给 Hugging Face Transformers。
DPR
概述
Dense Passage Retrieval (DPR) 是一组用于最先进开放域问答研究的工具和模型。它由 Vladimir Karpukhin、Barlas Oğuz、Sewon Min、Patrick Lewis、Ledell Wu、Sergey Edunov、Danqi Chen 和 Wen-tau Yih 在 Dense Passage Retrieval for Open-Domain Question Answering 中提出。
该论文的摘要如下:
开放域问答依赖于高效的段落检索来选取候选上下文,其中传统的稀疏向量空间模型(如 TF-IDF 或 BM25)是事实上的标准方法。在本工作中,我们表明,仅使用稠密表示即可在实践中实现检索,其中嵌入是通过一个简单的双编码器框架,从少量问题和段落中学习得到的。在广泛的开放域 QA 数据集上进行评估时,我们的稠密检索器在 top-20 段落检索准确率上,大幅超越了一个强大的 Lucene-BM25 系统,绝对提升达 9%-19%,并帮助我们的端到端 QA 系统在多个开放域 QA 基准上取得了新的最先进水平。
使用技巧
DPR 由三个模型组成:
- 问题编码器:将问题编码为向量
- 上下文编码器:将上下文编码为向量
- Reader:从检索到的上下文中提取问题的答案,并附带一个相关性分数(如果推断出的片段确实回答了问题,则分数较高)。
DPRConfig
class transformers.DPRConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 30522hidden_size: int = 768num_hidden_layers: int = 12num_attention_heads: int = 12intermediate_size: int = 3072hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.1attention_probs_dropout_prob: float | int = 0.1max_position_embeddings: int = 512type_vocab_size: int = 2initializer_range: float = 0.02layer_norm_eps: float = 1e-12pad_token_id: int | None = 0bos_token_id: int | None = Noneeos_token_id: int | list[int] | None = Noneprojection_dim: int = 0is_decoder: bool = Falseadd_cross_attention: bool = False )
参数
- vocab_size (
int,可选,默认为30522) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 数量。 - hidden_size (
int,可选,默认为768) — 隐藏表示的维度。 - num_hidden_layers (
int, 可选, 默认为12) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为12) — Transformer 解码器中每个注意力层的注意力头数量。 - intermediate_size (
int,可选,默认为3072) — MLP 表示的维度。 - hidden_act (
str,可选,默认为gelu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - hidden_dropout_prob (
Union[float, int],可选,默认为0.1) — 嵌入层、编码器和池化层中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
Union[float, int],可选,默认为0.1) — 注意力概率的 dropout 比率。 - max_position_embeddings (
int,可选,默认为512) — 该模型可能使用的最大序列长度。 - type_vocab_size (
int,可选,默认为2) —token_type_ids的词汇表大小。 - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layer_norm_eps (
float,可选,默认为1e-12) — 层归一化层所使用的 epsilon 值。 - pad_token_id (
int, 可选,默认为0) — 词表中用于填充的 token id。 - bos_token_id (
int, 可选) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
Union[int, list[int]], 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。 - projection_dim (
int,可选,默认为0) — 文本和视觉投影层的维度。 - is_decoder (
bool,可选,默认为False) — 指示该模型是否用作解码器。如果为False,则模型用作编码器。 - add_cross_attention (
bool,可选,默认为False) — 是否应在模型中添加交叉注意力层。
这是用于存储 DPRQuestionEncoder 配置的类。它根据指定的参数实例化 Dpr 模型,并定义模型架构。使用默认值实例化配置将得到与 facebook/dpr-ctx_encoder-single-nq-base 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
示例:
>>> from transformers import DPRConfig, DPRContextEncoder
>>> # Initializing a DPR facebook/dpr-ctx_encoder-single-nq-base style configuration
>>> configuration = DPRConfig()
>>> # Initializing a model (with random weights) from the facebook/dpr-ctx_encoder-single-nq-base style configuration
>>> model = DPRContextEncoder(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configDPRContextEncoderTokenizer
构建 DPRContextEncoder 分词器。
DPRContextEncoderTokenizer 与 BertTokenizer 完全相同,并执行端到端的分词:标点符号拆分和 wordpiece。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
DPRContextEncoderTokenizerFast
class transformers.DPRContextEncoderTokenizerFast
< source >( vocab: str | dict[str, int] | None = Nonedo_lower_case: bool = Trueunk_token: str = '[UNK]'sep_token: str = '[SEP]'pad_token: str = '[PAD]'cls_token: str = '[CLS]'mask_token: str = '[MASK]'tokenize_chinese_chars: bool = Truestrip_accents: bool | None = None**kwargs )
构建一个“快速”的 DPRContextEncoder 分词器(基于 HuggingFace 的 tokenizers 库)。
DPRContextEncoderTokenizerFast 与 BertTokenizer 完全相同,并执行端到端的分词:标点符号拆分和 WordPiece。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
DPRQuestionEncoderTokenizer
构建 DPRQuestionEncoder 分词器。
DPRQuestionEncoderTokenizer 与 BertTokenizer 完全相同,并执行端到端的分词:标点符号拆分和 wordpiece。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
DPRQuestionEncoderTokenizerFast
class transformers.DPRQuestionEncoderTokenizerFast
< source >( vocab: str | dict[str, int] | None = Nonedo_lower_case: bool = Trueunk_token: str = '[UNK]'sep_token: str = '[SEP]'pad_token: str = '[PAD]'cls_token: str = '[CLS]'mask_token: str = '[MASK]'tokenize_chinese_chars: bool = Truestrip_accents: bool | None = None**kwargs )
构建一个“快速”的 DPRQuestionEncoder 分词器(由 HuggingFace 的 tokenizers 库提供支持)。
DPRQuestionEncoderTokenizerFast 与 BertTokenizer 完全相同,并执行端到端的分词:标点拆分和 wordpiece。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
DPRReaderTokenizer
class transformers.DPRReaderTokenizer
< source >( *argsdo_lower_case = False**kwargs ) → dict[str, list[list[int]]]
参数
- questions (
str或list[str]) — 要编码的问题。您可以为多个段落指定一个问题。在这种情况下,问题将按[questions] * n_passages进行重复。否则,您需要指定与titles或texts中数量相同的问题。 - titles (
str或list[str]) — 要编码的段落标题。如果存在多个段落,则可以是字符串或字符串列表。 - texts (
str或list[str]) — 要编码的段落文本。如果存在多个段落,则可以是字符串或字符串列表。 - padding (
bool,str或 PaddingStrategy, 可选, 默认值为False) — 启用并控制填充。接受以下值:True或'longest':填充至批次中最长的序列(如果仅提供单个序列,则不进行填充)。'max_length':填充至由参数max_length指定的最大长度;若未提供该参数,则填充至模型可接受的最大输入长度。False或'do_not_pad'(默认值):不进行填充(即可以输出包含不同长度序列的批次)。
- truncation (
bool,str或 TruncationStrategy, ,可选, ,默认为False) — 启用并控制截断。接受以下值:True或'longest_first':截断至由参数max_length指定的最大长度,或者如果未提供该参数,则截断至模型可接受的最大输入长度。这将逐个 token 进行截断,如果提供了一对序列(或一批序列对),则会从该对中最长的序列中移除一个 token。'only_first':截断至由参数max_length指定的最大长度;若未提供该参数,则截断至模型可接受的最大输入长度。当提供序列对(或序列对批次)时,此选项仅截断其中的第一个序列。'only_second':截断至由参数max_length指定的最大长度,或者在未提供该参数时,截断至模型可接受的最大输入长度。如果提供了序列对(或序列对批次),则仅截断其中的第二个序列。False或'do_not_truncate'(默认值):不进行截断(即,可以输出序列长度大于模型最大可接受输入大小的批次)。
- max_length (
int, 可选) — 控制截断/填充参数之一所使用的最大长度。如果未设置或设置为 None,则当截断/填充参数需要最大长度时,将使用预定义的最大模型长度。如果模型没有特定的最大输入长度(如 XLNet),则禁用截断/填充到最大长度的功能。如果未设置或设置为
None,当截断/填充参数需要最大长度时,将使用预定义的最大模型长度。如果模型没有特定的最大输入长度(例如 XLNet),则禁用截断/填充至最大长度的功能。 - return_tensors (
str或 TensorType, 可选) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:'pt':返回 PyTorchtorch.Tensor对象。'np':返回 Numpynp.ndarray对象。
- return_attention_mask (
bool, 可选) — 是否返回注意力掩码。如果未设置,将根据特定分词器的默认值返回注意力掩码,该默认值由return_outputs属性定义。
返回值
dict[str, list[list[int]]]
一个包含以下键的字典:
input_ids:要输入模型的 token id 列表。attention_mask:一个索引列表,指定模型应关注哪些 token。
构建 DPRReader 分词器。
DPRReaderTokenizer 与 BertTokenizer 几乎完全相同,并执行端到端的分词:标点符号拆分和 wordpiece。区别在于它有三个输入字符串:question、titles 和 texts,它们会被组合起来并输入到 DPRReader 模型中。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
返回一个字典,其中包含输入字符串的 token id 以及传递给 .decode_best_spans 所需的其他信息。
它使用分词器和词汇表,将问题和不同段落(标题和正文)的字符串转换为 ID(整数)序列。
生成的 input_ids 是一个大小为 (n_passages, sequence_length) 的矩阵
DPRReaderTokenizerFast
class transformers.DPRReaderTokenizerFast
< source >( vocab: str | dict[str, int] | None = Nonedo_lower_case: bool = Trueunk_token: str = '[UNK]'sep_token: str = '[SEP]'pad_token: str = '[PAD]'cls_token: str = '[CLS]'mask_token: str = '[MASK]'tokenize_chinese_chars: bool = Truestrip_accents: bool | None = None**kwargs ) → dict[str, list[list[int]]]
参数
- questions (
str或list[str]) — 要编码的问题。您可以为多个段落指定一个问题。在这种情况下,问题将按[questions] * n_passages进行重复。否则,您需要指定与titles或texts中数量相同的问题。 - titles (
str或list[str]) — 要编码的段落标题。如果存在多个段落,则可以是字符串或字符串列表。 - texts (
str或list[str]) — 要编码的段落文本。如果存在多个段落,则可以是字符串或字符串列表。 - padding (
bool,str或 PaddingStrategy, 可选, 默认值为False) — 启用并控制填充。接受以下值:True或'longest':填充至批次中最长的序列(如果仅提供单个序列,则不进行填充)。'max_length':填充至由参数max_length指定的最大长度;若未提供该参数,则填充至模型可接受的最大输入长度。False或'do_not_pad'(默认值):不进行填充(即可以输出包含不同长度序列的批次)。
- truncation (
bool,str或 TruncationStrategy, ,可选, ,默认为False) — 启用并控制截断。接受以下值:True或'longest_first':截断至由参数max_length指定的最大长度,或者如果未提供该参数,则截断至模型可接受的最大输入长度。这将逐个 token 进行截断,如果提供了一对序列(或一批序列对),则会从该对中最长的序列中移除一个 token。'only_first':截断至由参数max_length指定的最大长度;若未提供该参数,则截断至模型可接受的最大输入长度。当提供序列对(或序列对批次)时,此选项仅截断其中的第一个序列。'only_second':截断至由参数max_length指定的最大长度,或者在未提供该参数时,截断至模型可接受的最大输入长度。如果提供了序列对(或序列对批次),则仅截断其中的第二个序列。False或'do_not_truncate'(默认值):不进行截断(即,可以输出序列长度大于模型最大可接受输入大小的批次)。
- max_length (
int, 可选) — 控制截断/填充参数之一所使用的最大长度。如果未设置或设置为 None,则当截断/填充参数需要最大长度时,将使用预定义的最大模型长度。如果模型没有特定的最大输入长度(如 XLNet),则禁用截断/填充到最大长度的功能。如果未设置或设置为
None,当截断/填充参数需要最大长度时,将使用预定义的最大模型长度。如果模型没有特定的最大输入长度(例如 XLNet),则禁用截断/填充至最大长度的功能。 - return_tensors (
str或 TensorType, 可选) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:'pt':返回 PyTorchtorch.Tensor对象。'np':返回 Numpynp.ndarray对象。
- return_attention_mask (
bool, 可选) — 是否返回注意力掩码。如果未设置,将根据特定分词器的默认值返回注意力掩码,该默认值由return_outputs属性定义。
返回值
dict[str, list[list[int]]]
一个包含以下键的字典:
input_ids:要输入模型的 token id 列表。attention_mask:一个索引列表,指定模型应关注哪些 token。
构建一个“快速”的 DPRReader 分词器(由 HuggingFace 的 tokenizers 库提供支持)。
DPRReaderTokenizerFast 与 BertTokenizer 几乎完全相同,并执行端到端的分词:标点符号拆分和 WordPiece。不同之处在于它有三个输入字符串:question、titles 和 texts,这些字符串会被组合起来并输入到 DPRReader 模型中。
有关参数用法示例和文档,请参阅父类 BertTokenizer。
返回一个字典,其中包含输入字符串的 token id 以及传递给 .decode_best_spans 所需的其他信息。
它使用分词器和词汇表,将问题和不同段落(标题和正文)的字符串转换为 ID(整数)序列。
生成的 input_ids 是一个大小为 (n_passages, sequence_length) 的矩阵,其格式如下:
[CLS] <question token ids> [SEP] <titles ids> [SEP] <texts ids>
DPR 特定输出
class transformers.models.dpr.modeling_dpr.DPRContextEncoderOutput
< source >( pooler_output: Tensorhidden_states: tuple[torch.Tensor, ...] | None = Noneattentions: tuple[torch.Tensor, ...] | None = None )
参数
- pooler_output (
torch.Tensor,形状为(batch_size, embeddings_size)) — DPR 编码器输出与上下文表示相对应的 pooler_output。它是序列中第一个 token(分类 token)的最后一层隐藏状态,并经过一个 Linear 层进一步处理。此输出用于嵌入上下文,以便使用问题嵌入进行最近邻查询。 - hidden_states (
tuple[torch.Tensor, ...], 可选, 在传入output_hidden_states=True或config.output_hidden_states=True) — 的元组torch.Tensor((如果模型有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size).模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
- attentions (
tuple[torch.Tensor, ...], 可选, 在传入output_attentions=True或config.output_attentions=True) — 的元组torch.Tensor((每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length).注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
DPRQuestionEncoder 的输出类。
class transformers.models.dpr.modeling_dpr.DPRQuestionEncoderOutput
< source >( pooler_output: Tensorhidden_states: tuple[torch.Tensor, ...] | None = Noneattentions: tuple[torch.Tensor, ...] | None = None )
参数
- pooler_output (
torch.Tensor,形状为(batch_size, embeddings_size)) — DPR 编码器输出与问题表示相对应的 pooler_output。它是序列中第一个 token(分类 token)的最后一层隐藏状态,并经过一个 Linear 层进一步处理。此输出用于嵌入问题,以便与上下文嵌入进行最近邻查询。 - hidden_states (
tuple[torch.Tensor, ...], 可选, 在传入output_hidden_states=True或config.output_hidden_states=True) — 的元组torch.Tensor((如果模型有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size).模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
- attentions (
tuple[torch.Tensor, ...], 可选, 在传入output_attentions=True或config.output_attentions=True) — 的元组torch.Tensor((每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length).注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
DPRQuestionEncoder 的输出类。
class transformers.DPRReaderOutput
< source >( start_logits: Tensorend_logits: typing.Optional[torch.Tensor] = Nonerelevance_logits: typing.Optional[torch.Tensor] = Nonehidden_states: tuple[torch.Tensor, ...] | None = Noneattentions: tuple[torch.Tensor, ...] | None = None )
参数
- start_logits(形状为
(n_passages, sequence_length)的torch.Tensor)— 每个段落中片段起始索引的 logits。 - end_logits(形状为
(n_passages, sequence_length)的torch.Tensor)— 每个段落中 span 结束索引的 logits。 - relevance_logits(形状为
(n_passages, )的torch.Tensor)— DPRReader 中 QA 分类器的输出,对应于每个段落回答该问题的得分,与其他所有段落相比。 - hidden_states (
tuple[torch.Tensor, ...], 可选, 在传入output_hidden_states=True或config.output_hidden_states=True) — 的元组torch.Tensor((如果模型有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size).模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
- attentions (
tuple[torch.Tensor, ...], 可选, 在传入output_attentions=True或config.output_attentions=True) — 的元组torch.Tensor((每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length).注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
DPRQuestionEncoder 的输出类。
DPRContextEncoder
class transformers.DPRContextEncoder
< source >( config: DPRConfig )
参数
- config (DPRConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
输出池化器输出作为上下文表示的裸 DPRContextEncoder 转换器。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Nonetoken_type_ids: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DPRContextEncoderOutput or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。为了与预训练保持一致,DPR 的输入序列应使用 [CLS] 和 [SEP] token 按以下格式进行组织:(a) 对于序列对(例如标题+文本对):
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- token_type_ids (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于指示输入中第一和第二部分的片段标记索引。索引取自[0, 1]:- 0 对应 sentence A 标记,
- 1 对应于 sentence B 标记。
- inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量中的attentions。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
DPRContextEncoderOutput 或 tuple(torch.Tensor)
一个 DPRContextEncoderOutput 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(DPRConfig)和输入。
DPRContextEncoder 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
pooler_output(形状为
(batch_size, embeddings_size)的torch.Tensor)— DPR 编码器输出与上下文表示相对应的 pooler_output。它是序列中第一个 token(分类 token)的最后一层隐藏状态,并经过一个 Linear 层进一步处理。此输出用于嵌入上下文,以便使用问题嵌入进行最近邻查询。hidden_states (
tuple[torch.Tensor, ...],可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple[torch.Tensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP]
token_type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1DPR 是一个使用绝对位置嵌入的模型,因此通常建议在右侧而非左侧填充输入。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
示例:
>>> from transformers import DPRContextEncoder, DPRContextEncoderTokenizer
>>> tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
>>> model = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
>>> input_ids = tokenizer("Hello, is my dog cute ?", return_tensors="pt")["input_ids"]
>>> embeddings = model(input_ids).pooler_outputDPRQuestionEncoder
class transformers.DPRQuestionEncoder
< source >( config: DPRConfig )
参数
- config (DPRConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
原始的 DPRQuestionEncoder 转换器,其池化器输出作为问题表示。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Nonetoken_type_ids: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DPRQuestionEncoderOutput or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。为了与预训练保持一致,DPR 的输入序列应使用 [CLS] 和 [SEP] token 按以下格式进行组织:(a) 对于序列对(例如标题+文本对):
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- token_type_ids (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于指示输入中第一和第二部分的片段标记索引。索引取自[0, 1]:- 0 对应 sentence A 标记,
- 1 对应于 sentence B 标记。
- inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量中的attentions。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
DPRQuestionEncoderOutput 或 tuple(torch.Tensor)
一个 DPRQuestionEncoderOutput 或 torch.Tensor 元组(当传入 return_dict=False 或 config.return_dict=False 时),其包含的元素取决于配置(DPRConfig)和输入。
DPRQuestionEncoder 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
pooler_output(形状为
(batch_size, embeddings_size)的torch.Tensor)— DPR 编码器输出与问题表示相对应的 pooler_output。它是序列中第一个 token(分类 token)的最后一层隐藏状态,并经过一个 Linear 层进一步处理。此输出用于嵌入问题,以便与上下文嵌入进行最近邻查询。hidden_states (
tuple[torch.Tensor, ...],可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple[torch.Tensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP]
token_type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1DPR 是一个使用绝对位置嵌入的模型,因此通常建议在右侧而非左侧填充输入。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
示例:
>>> from transformers import DPRQuestionEncoder, DPRQuestionEncoderTokenizer
>>> tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
>>> model = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
>>> input_ids = tokenizer("Hello, is my dog cute ?", return_tensors="pt")["input_ids"]
>>> embeddings = model(input_ids).pooler_outputDPRReader
class transformers.DPRReader
< source >( config: DPRConfig )
参数
- config (DPRConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
输出跨度预测的裸 DPRReader 转换器。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DPRReaderOutput or tuple(torch.Tensor)
参数
- input_ids (
tuple[torch.LongTensor]形状为(n_passages, sequence_length)) — 输入序列中各 token 在词汇表中的索引。它必须是一个三元组序列,包含 1) 问题、2) 段落标题和 3) 段落正文。为了与预训练保持一致,DPRinput_ids序列应使用 [CLS] 和 [SEP] 进行格式化,格式如下:[CLS] <question token ids> [SEP] <titles ids> [SEP] <texts ids>DPR 是一个使用绝对位置嵌入的模型,因此通常建议在右侧而非左侧填充输入。
可以使用 DPRReaderTokenizer 获取索引。有关更多详细信息,请参阅该类的文档。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- inputs_embeds (
torch.Tensor,形状为(n_passages, sequence_length, hidden_size),可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相关向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量中的attentions。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
DPRReaderOutput 或 tuple(torch.Tensor)
一个 DPRReaderOutput 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(DPRConfig)和输入。
DPRReader 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
start_logits(形状为
(n_passages, sequence_length)的torch.Tensor)— 每个段落中片段起始索引的 logits。end_logits(形状为
(n_passages, sequence_length)的torch.Tensor)— 每个段落中跨度结束索引的 logits。relevance_logits(形状为
(n_passages, )的torch.Tensor)— DPRReader 中 QA 分类器的输出,表示每个段落回答该问题的得分,与其他所有段落相比。hidden_states (
tuple[torch.Tensor, ...],可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple[torch.Tensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
示例:
>>> from transformers import DPRReader, DPRReaderTokenizer
>>> tokenizer = DPRReaderTokenizer.from_pretrained("facebook/dpr-reader-single-nq-base")
>>> model = DPRReader.from_pretrained("facebook/dpr-reader-single-nq-base")
>>> encoded_inputs = tokenizer(
... questions=["What is love ?"],
... titles=["Haddaway"],
... texts=["'What Is Love' is a song recorded by the artist Haddaway"],
... return_tensors="pt",
... )
>>> outputs = model(**encoded_inputs)
>>> start_logits = outputs.start_logits
>>> end_logits = outputs.end_logits
>>> relevance_logits = outputs.relevance_logits