Transformers documentation
Splinter
该模型于 2021-01-02 在 HF papers 上发布,并于 2021-08-17 贡献给 Hugging Face Transformers。
Splinter
概述
Splinter 模型由 Ori Ram、Yuval Kirstain、Jonathan Berant、Amir Globerson 和 Omer Levy 在 Few-Shot Question Answering by Pretraining Span Selection 中提出。Splinter 是一个仅包含编码器的 transformer(类似于 BERT),通过在包含 Wikipedia 和 Toronto Book Corpus 的大型语料库上使用循环 span 选择任务进行预训练。
该论文的摘要如下:
在多个问答基准测试中,预训练模型通过在约 100,000 个标注问题和答案上进行微调,已达到人类水平。我们探索了更具现实意义的少样本场景,即仅有数百个训练样本可用,并观察到标准模型表现不佳,这凸显了当前预训练目标与问答任务之间的差异。我们提出了一种专为问答定制的预训练方案:重复片段选择。给定一个包含多组重复片段的段落,我们在每组中屏蔽除一个之外的所有重复片段,并要求模型为每个被屏蔽的片段在段落中选择正确的片段。被屏蔽的片段会被替换为一个特殊标记,该标记被视为问题表示,并在后续微调中用于选择答案片段。所得模型在多个基准测试上取得了令人惊讶的良好结果(例如,仅使用 128 个训练样本在 SQuAD 上达到 72.7 F1),同时在高资源设置下保持了具有竞争力的性能。
该模型由 yuvalkirstain 和 oriram 贡献。原始代码可在此处找到。
使用技巧
- Splinter 经过训练,以特殊的 [QUESTION] 标记为条件来预测答案片段。这些标记将上下文关联到问题表示,并用于预测答案。该层称为 QASS,是 SplinterForQuestionAnswering 类的默认行为。因此:
- 请使用 SplinterTokenizer(而非 BertTokenizer),因为它已经包含此特殊标记。此外,当提供两个序列时,其默认行为就是使用该标记。
- 请记住问题标记 - 它对于模型的成功可能至关重要,尤其是在少样本设置中。
- 请注意,每个尺寸的 Splinter 都有两个不同的检查点。两者基本相同,区别在于其中一个还包含 QASS 层的预训练权重(tau/splinter-base-qass 和 tau/splinter-large-qass),而另一个则不包含(tau/splinter-base 和 tau/splinter-large)。这样做的目的是支持在微调时对该层进行随机初始化,因为论文表明在某些情况下这样做能取得更好的效果。
资源
SplinterConfig
class transformers.SplinterConfig
< 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 = Nonequestion_token_id: int = 104 )
参数
- 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。 - question_token_id (
int,可选,默认为 104) —[QUESTION]标记的 id。
这是用于存储 SplinterModel 配置的类。它根据指定的参数实例化 Splinter 模型,并定义模型架构。使用默认值实例化配置将得到与 tau/splinter-base 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
示例:
>>> from transformers import SplinterModel, SplinterConfig
>>> # Initializing a Splinter tau/splinter-base style configuration
>>> configuration = SplinterConfig()
>>> # Initializing a model from the tau/splinter-base style configuration
>>> model = SplinterModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configSplinterTokenizer
类 transformers.SplinterTokenizer
< 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]'question_token: str = '[QUESTION]'tokenize_chinese_chars: bool = Truestrip_accents: bool | None = None**kwargs )
参数
- vocab_file (
str, 可选) — 词汇表文件的路径。 - tokenizer_file (
str, 可选) — 指向包含分词器序列化内容的 tokenizers JSON 文件的路径。 - do_lower_case (
bool,可选,默认为True) — 在分词时是否将输入转换为小写。 - unk_token (
str,可选,默认为"[UNK]") — 未知标记。不在词汇表中的标记无法转换为 ID,因此会被设置为此标记。 - sep_token (
str,可选,默认为"[SEP]") — 分隔符 token,用于将多个序列组合成一个序列时。 - pad_token (
str,可选,默认为"[PAD]") — 用于填充的标记,例如在对长度不同的序列进行批处理时。 - cls_token (
str,可选,默认为"[CLS]") — 用于执行序列分类任务时的分类器标记。 - mask_token (
str,可选,默认为"[MASK]") — 用于掩码值的标记。 - question_token (
str,可选,默认为"[QUESTION]") — 用于构建问题表示的标记。 - tokenize_chinese_chars (
bool,可选,默认为True) — 是否对汉字进行分词。 - strip_accents (
bool,可选) — 是否去除所有重音符号。如果未指定此选项,则将根据lowercase的值来确定。 - vocab (
str、dict或list,可选) — 自定义词汇表。如果未提供,将创建一个最小词汇表。
构建一个 Splinter 分词器(基于 HuggingFace 的 tokenizers 库)。基于 WordPiece。
该分词器继承自 TokenizersBackend,其中包含了大部分主要方法。用户应参考该父类以获取有关这些方法的更多信息。
get_special_tokens_mask
< source >( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]
从未添加特殊标记的标记列表中检索序列 ID。
对于快速分词器,数据整理器会传入 already_has_special_tokens=True 来调用此方法,以在已格式化的序列上构建掩码。在这种情况下,我们通过检查元素是否属于 all_special_ids 来计算掩码。
SplinterModel
class transformers.SplinterModel
< source >( config: SplinterConfig )
参数
- config (SplinterConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
未添加任何特定头部的裸 Splinter 模型,直接输出原始隐藏状态。
该模型继承自 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] = Noneposition_ids: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → BaseModelOutput or tuple(torch.Tensor)
参数
- input_ids (
torch.Tensor形状为(batch_size, sequence_length), 可选) — 输入序列中各 token 在词表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- token_type_ids (
torch.LongTensor形状为batch_size, sequence_length, 可选) — 用于指示输入中第一和第二部分的片段 token 索引。索引取值范围为[0, 1]:- 0 对应 sentence A 标记,
- 1 对应于 sentence B 标记。
- position_ids (
torch.LongTensor形状为batch_size, sequence_length, 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.max_position_embeddings - 1]. - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。
返回值
BaseModelOutput 或 tuple(torch.Tensor)
一个 BaseModelOutput 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(SplinterConfig)和输入。
SplinterModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 模型最后一层输出的隐藏状态序列。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 之后的权重,用于在自注意力头中计算加权平均值。
SplinterForQuestionAnswering
class transformers.SplinterForQuestionAnswering
< source >( config: SplinterConfig )
参数
- config (SplinterConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
用于抽取式问答任务(如 SQuAD)的 Splinter 转换器,其顶部带有一个跨度分类头(在隐藏状态输出之上添加一个线性层,用于计算 span start logits 和 span end logits)。
该模型继承自 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] = Noneposition_ids: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonestart_positions: typing.Optional[torch.LongTensor] = Noneend_positions: typing.Optional[torch.LongTensor] = Nonequestion_positions: typing.Optional[torch.LongTensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → QuestionAnsweringModelOutput or tuple(torch.Tensor)
参数
- input_ids (
torch.Tensor形状为(batch_size, sequence_length), 可选) — 输入序列中各 token 在词表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- token_type_ids (
torch.LongTensor形状为batch_size, sequence_length, 可选) — 用于指示输入中第一和第二部分的片段 token 索引。索引取值范围为[0, 1]:- 0 对应 sentence A 标记,
- 1 对应于 sentence B 标记。
- position_ids (
torch.LongTensor形状为batch_size, sequence_length, 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.max_position_embeddings - 1]. - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - start_positions (
torch.LongTensor,形状为(batch_size,),可选) — 用于计算 token 分类损失的标注片段起始位置(索引)的标签。 位置会被截断到序列长度(sequence_length)。序列之外的位置在计算损失时不予考虑。 - end_positions (
torch.LongTensor,形状为(batch_size,),可选) — 用于计算 token 分类损失的标注片段结束位置(索引)的标签。 位置会被截断到序列长度(sequence_length)。序列之外的位置在计算损失时不予考虑。 - question_positions(形状为
(batch_size, num_questions)的torch.LongTensor,可选) — 所有问题 token 的位置。如果提供该参数,start_logits 和 end_logits 的形状将为(batch_size, num_questions, sequence_length)。如果为 None,则仅针对批处理中每个序列的第一个问题 token 计算 start_logits 和 end_logits,且它们的形状将为(batch_size, sequence_length)。
返回值
QuestionAnsweringModelOutput 或 tuple(torch.Tensor)
一个 QuestionAnsweringModelOutput 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(SplinterConfig)和输入。
SplinterForQuestionAnswering 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(1,),可选,当提供labels时返回) — 总跨度提取损失是起始位置和结束位置的交叉熵之和。start_logits(形状为
(batch_size, sequence_length)的torch.Tensor)— 跨度起始分数(SoftMax 之前)。end_logits(形状为
(batch_size, sequence_length)的torch.Tensor)— 跨度结束分数(SoftMax 之前)。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 AutoTokenizer, SplinterForQuestionAnswering
>>> import torch
>>> tokenizer = AutoTokenizer.from_pretrained("tau/splinter-base")
>>> model = SplinterForQuestionAnswering.from_pretrained("tau/splinter-base")
>>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
>>> inputs = tokenizer(question, text, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> answer_start_index = outputs.start_logits.argmax()
>>> answer_end_index = outputs.end_logits.argmax()
>>> predict_answer_tokens = inputs.input_ids[0, answer_start_index : answer_end_index + 1]
>>> tokenizer.decode(predict_answer_tokens, skip_special_tokens=True)
...
>>> # target is "nice puppet"
>>> target_start_index = torch.tensor([14])
>>> target_end_index = torch.tensor([15])
>>> outputs = model(**inputs, start_positions=target_start_index, end_positions=target_end_index)
>>> loss = outputs.loss
>>> round(loss.item(), 2)
...SplinterForPreTraining
class transformers.SplinterForPreTraining
< source >( config: SplinterConfig )
参数
- config (SplinterConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
用于重复片段选择任务的 Splinter 模型,该任务在预训练阶段执行。与 QA 任务不同的是,这里没有单一的问题,而是使用多个问题标记来替代重复片段出现的位置。
该模型继承自 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] = Noneposition_ids: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonestart_positions: typing.Optional[torch.LongTensor] = Noneend_positions: typing.Optional[torch.LongTensor] = Nonequestion_positions: typing.Optional[torch.LongTensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → SplinterForPreTrainingOutput or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, num_questions, sequence_length)) — 输入序列中各 token 在词表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- token_type_ids (
torch.LongTensor形状为batch_size, num_questions, sequence_length, 可选) — 用于指示输入中第一和第二部分的片段 token 索引。索引取自[0, 1]:- 0 对应 sentence A 标记,
- 1 对应于 sentence B 标记。
- position_ids (
torch.LongTensor形状为batch_size, num_questions, sequence_length, 可选) — 每个输入序列中各 token 在位置嵌入中的位置索引。取值范围为[0, config.max_position_embeddings - 1]. - inputs_embeds (
torch.Tensor,形状为(batch_size, num_questions, sequence_length, hidden_size),可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对 input_ids 索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - start_positions (
torch.LongTensor,形状为(batch_size, num_questions),可选) — 用于计算 token 分类损失的标注片段起始位置(索引)的标签。 位置会被截断至序列长度(sequence_length)。序列之外的位置在计算损失时不予考虑。 - end_positions (
torch.LongTensor,形状为(batch_size, num_questions),可选) — 用于计算 token 分类损失的标注片段结束位置(索引)的标签。 位置会被截断到序列长度(sequence_length)。序列之外的位置在计算损失时不予考虑。 - question_positions(形状为
(batch_size, num_questions)的torch.LongTensor,可选) — 所有问题 token 的位置。如果提供该参数,start_logits 和 end_logits 的形状将为(batch_size, num_questions, sequence_length)。如果为 None,则仅针对批处理中每个序列的第一个问题 token 计算 start_logits 和 end_logits,且它们的形状将为(batch_size, sequence_length)。
返回值
SplinterForPreTrainingOutput 或 tuple(torch.Tensor)
SplinterForPreTrainingOutput 或 torch.Tensor 元组(如果传入 return_dict=False 或 config.return_dict=False),包含根据配置(SplinterConfig)和输入而定的各种元素。
SplinterForPreTraining 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(1,),可选,在提供起始和结束位置时返回) — 总跨度提取损失是起始位置和结束位置的交叉熵之和。start_logits(形状为
(batch_size, num_questions, sequence_length)的torch.Tensor)— 跨度起始分数(SoftMax 之前)。end_logits(形状为
(batch_size, num_questions, sequence_length)的torch.Tensor)— 跨度结束分数(SoftMax 之前)。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 之后的权重,用于在自注意力头中计算加权平均值。