Transformers 4.37 中文文档(九十)(2)https://developer.aliyun.com/article/1563838
LXMERT
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/lxmert
概述
LXMERT 模型是由 Hao Tan 和 Mohit Bansal 在LXMERT: Learning Cross-Modality Encoder Representations from Transformers中提出的。它是一系列双向 Transformer 编码器(一个用于视觉模态,一个用于语言模态,然后一个用于融合两种模态),使用一种组合的方法进行预训练,包括遮蔽语言建模、视觉-语言文本对齐、ROI 特征回归、遮蔽视觉属性建模、遮蔽视觉对象建模和视觉问题回答目标。预训练包括多个多模态数据集:MSCOCO、Visual-Genome + Visual-Genome Question Answering、VQA 2.0 和 GQA。
摘要如下:
视觉与语言推理需要理解视觉概念、语言语义,最重要的是理解这两种模态之间的对齐和关系。因此,我们提出了 LXMERT(Learning Cross-Modality Encoder Representations from Transformers)框架来学习这些视觉与语言的连接。在 LXMERT 中,我们构建了一个大规模的 Transformer 模型,包括三个编码器:对象关系编码器、语言编码器和跨模态编码器。接下来,为了赋予我们的模型连接视觉和语言语义的能力,我们使用大量的图像和句子对进行预训练,通过五种不同的代表性预训练任务:遮蔽语言建模、遮蔽对象预测(特征回归和标签分类)、跨模态匹配和图像问题回答。这些任务有助于学习模态内部和模态间的关系。在从我们的预训练参数微调后,我们的模型在两个视觉问题回答数据集(即 VQA 和 GQA)上取得了最先进的结果。我们还展示了我们预训练的跨模态模型的泛化能力,通过将其适应具有挑战性的视觉推理任务 NLVR,将先前的最佳结果提高了 22%绝对值(从 54%到 76%)。最后,我们进行了详细的消融研究,证明了我们的新颖模型组件和预训练策略对我们强大结果的显著贡献;并展示了不同编码器的几个注意力可视化
此模型由eltoto1219贡献。原始代码可在此处找到。
使用提示
- 在视觉特征嵌入中不必使用边界框,任何类型的视觉空间特征都可以使用。
- LXMERT 输出的语言隐藏状态和视觉隐藏状态都经过了跨模态层,因此它们包含来自两种模态的信息。要访问仅关注自身的模态,请从元组中的第一个输入中选择视觉/语言隐藏状态。
- 双向跨模态编码器注意力仅在语言模态用作输入且视觉模态用作上下文向量时返回注意力值。此外,虽然跨模态编码器包含每个相应模态的自注意力和交叉注意力,但只返回交叉注意力,两个自注意力输出都被忽略。
资源
- 问答任务指南
LxmertConfig
class transformers.LxmertConfig
( vocab_size = 30522 hidden_size = 768 num_attention_heads = 12 num_qa_labels = 9500 num_object_labels = 1600 num_attr_labels = 400 intermediate_size = 3072 hidden_act = 'gelu' hidden_dropout_prob = 0.1 attention_probs_dropout_prob = 0.1 max_position_embeddings = 512 type_vocab_size = 2 initializer_range = 0.02 layer_norm_eps = 1e-12 l_layers = 9 x_layers = 5 r_layers = 5 visual_feat_dim = 2048 visual_pos_dim = 4 visual_loss_normalizer = 6.67 task_matched = True task_mask_lm = True task_obj_predict = True task_qa = True visual_obj_loss = True visual_attr_loss = True visual_feat_loss = True **kwargs )
参数
vocab_size
(int
, optional, defaults to 30522) — LXMERT 模型的词汇表大小。定义了在调用 LxmertModel 或 TFLxmertModel 时可以由inputs_ids
表示的不同标记数量。hidden_size
(int
, optional, defaults to 768) — 编码器层和池化器层的维度。num_attention_heads
(int
, optional, defaults to 12) — Transformer 编码器中每个注意力层的注意力头数量。num_qa_labels
(int
, optional, defaults to 9500) — 这表示不同的问题回答(QA)标签的总数。如果使用多个具有 QA 的数据集,用户需要考虑所有数据集总共拥有的标签数量。num_object_labels
(int
, optional, defaults to 1600) — 这表示 LXMERT 将能够将池化对象特征分类为所属的语义唯一对象的总数。num_attr_labels
(int
, optional, defaults to 400) — 这表示 LXMERT 将能够将池化对象特征分类为具有的语义唯一属性的总数。intermediate_size
(int
, optional, defaults to 3072) — Transformer 编码器中“中间”(通常称为前馈)层的维度。hidden_act
(str
orCallable
, optional, defaults to"gelu"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果是字符串,支持"gelu"
,"relu"
,"silu"
和"gelu_new"
。hidden_dropout_prob
(float
, optional, defaults to 0.1) — 嵌入层、编码器和池化器中所有全连接层的丢失概率。attention_probs_dropout_prob
(float
, optional, defaults to 0.1) — 注意力概率的丢失比率。max_position_embeddings
(int
, optional, defaults to 512) — 该模型可能会与的最大序列长度。通常将其设置为较大的值以防万一(例如,512、1024 或 2048)。type_vocab_size
(int
, optional, defaults to 2) — 传递给 BertModel 的 token_type_ids 的词汇表大小。initializer_range
(float
, optional, defaults to 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。layer_norm_eps
(float
, optional, defaults to 1e-12) — 层归一化层使用的 epsilon。l_layers
(int
, optional, defaults to 9) — Transformer 语言编码器中的隐藏层数量。x_layers
(int
, optional, defaults to 5) — Transformer 跨模态编码器中的隐藏层数量。r_layers
(int
, optional, defaults to 5) — Transformer 视觉编码器中的隐藏层数量。visual_feat_dim
(int
, optional, defaults to 2048) — 这表示用作模型输入的池化对象特征的最后维度,表示每个对象特征本身的大小。visual_pos_dim
(int
, optional, defaults to 4) — 这表示混合到视觉特征中的空间特征的数量。默认设置为 4,因为通常这将表示边界框的位置。即 (x, y, 宽度, 高度)visual_loss_normalizer
(float
, optional, defaults to 6.67) — 这表示如果在预训练期间决定使用多个基于视觉的损失目标进行训练,则每个视觉损失将乘以的缩放因子。task_matched
(bool
, optional, defaults toTrue
) — 该任务用于句子-图像匹配。如果句子正确描述图像,则标签为 1。如果句子未正确描述图像,则标签为 0。task_mask_lm
(bool
, optional, defaults toTrue
) — 是否添加掩码语言建模(如 BERT 中使用的)到损失目标中。task_obj_predict
(bool
, optional, defaults toTrue
) — 是否添加对象预测、属性预测和特征回归到损失目标中。task_qa
(bool
, optional, defaults toTrue
) — 是否将问答损失添加到目标中。visual_obj_loss
(bool
, optional, defaults toTrue
) — 是否计算对象预测损失目标visual_attr_loss
(bool
, optional, defaults toTrue
) — 是否计算属性预测损失目标visual_feat_loss
(bool
, optional, defaults toTrue
) — 是否计算特征回归损失目标
这是用于存储 LxmertModel 或 TFLxmertModel 配置的配置类。它用于根据指定的参数实例化一个 LXMERT 模型,定义模型架构。使用默认值实例化配置将产生与 Lxmert unc-nlp/lxmert-base-uncased架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
LxmertTokenizer
class transformers.LxmertTokenizer
( vocab_file do_lower_case = True do_basic_tokenize = True never_split = None unk_token = '[UNK]' sep_token = '[SEP]' pad_token = '[PAD]' cls_token = '[CLS]' mask_token = '[MASK]' tokenize_chinese_chars = True strip_accents = None **kwargs )
参数
vocab_file
(str
) — 包含词汇表的文件。do_lower_case
(bool
, optional, defaults toTrue
) — 在标记化时是否将输入转换为小写。do_basic_tokenize
(bool
, optional, defaults toTrue
) — 在 WordPiece 之前是否进行基本标记化。never_split
(Iterable
, optional) — 在标记化期间永远不会拆分的标记集合。仅在do_basic_tokenize=True
时有效。unk_token
(str
, optional, defaults to"[UNK]"
) — 未知标记。词汇表中不存在的标记无法转换为 ID,而是设置为此标记。sep_token
(str
, optional, defaults to"[SEP]"
) — 分隔符标记,用于从多个序列构建序列,例如用于序列分类的两个序列或用于文本和问题的问题回答。它还用作使用特殊标记构建的序列的最后一个标记。pad_token
(str
, optional, defaults to"[PAD]"
) — 用于填充的标记,例如在批处理不同长度的序列时使用。cls_token
(str
, optional, defaults to"[CLS]"
) — 用于进行序列分类(对整个序列进行分类而不是对每个标记进行分类)时使用的分类器标记。它是使用特殊标记构建的序列的第一个标记。mask_token
(str
, optional, defaults to"[MASK]"
) — 用于屏蔽值的标记。这是在使用掩码语言建模训练此模型时使用的标记。这是模型将尝试预测的标记。tokenize_chinese_chars
(bool
, optional, defaults toTrue
) — 是否对中文字符进行标记化。
这可能应该在日语中停用(请参阅此问题)。strip_accents
(bool
, optional) — 是否去除所有重音符号。如果未指定此选项,则将由lowercase
的值确定(与原始 Lxmert 中相同)。
构建一个 Lxmert 标记器。基于 WordPiece。
此标记器继承自 PreTrainedTokenizer,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
build_inputs_with_special_tokens
( token_ids_0: List token_ids_1: Optional = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — 将添加特殊标记的 ID 列表。token_ids_1
(List[int]
, 可选) — 第二个序列对的可选 ID 列表。
返回值
List[int]
带有适当特殊标记的输入 ID 列表。
通过连接和添加特殊标记构建用于序列分类任务的序列或序列对的模型输入。Lxmert 序列的格式如下:
- 单个序列:
[CLS] X [SEP]
- 序列对:
[CLS] A [SEP] B [SEP]
convert_tokens_to_string
( tokens )
将一系列标记(字符串)转换为单个字符串。
create_token_type_ids_from_sequences
( token_ids_0: List token_ids_1: Optional = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — ID 列表。token_ids_1
(List[int]
, 可选) — 第二个序列对的可选 ID 列表。
返回值
List[int]
根据给定序列的标记类型 ID 列表。
从传递的两个序列创建用于序列对分类任务的掩码。一个 Lxmert 序列
序列对掩码的格式如下:
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 | first sequence | second sequence |
如果token_ids_1
为None
,则此方法仅返回掩码的第一部分(0)。
get_special_tokens_mask
( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — ID 列表。token_ids_1
(List[int]
, 可选) — 第二个序列对的可选 ID 列表。already_has_special_tokens
(bool
, 可选, 默认为False
) — 标记列表是否已经使用特殊标记格式化。
返回值
List[int]
一个整数列表,范围为[0, 1]:1 表示特殊标记,0 表示序列标记。
从没有添加特殊标记的标记列表中检索序列 ID。在使用标记器的prepare_for_model
方法添加特殊标记时调用此方法。
LxmertTokenizerFast
class transformers.LxmertTokenizerFast
( vocab_file = None tokenizer_file = None do_lower_case = True unk_token = '[UNK]' sep_token = '[SEP]' pad_token = '[PAD]' cls_token = '[CLS]' mask_token = '[MASK]' tokenize_chinese_chars = True strip_accents = None **kwargs )
参数
vocab_file
(str
) — 包含词汇表的文件。do_lower_case
(bool
, 可选, 默认为True
) — 在标记化时是否将输入转换为小写。unk_token
(str
, 可选, 默认为"[UNK]"
) — 未知标记。词汇表中没有的标记无法转换为 ID,而是设置为此标记。sep_token
(str
, 可选, 默认为"[SEP]"
) — 分隔符标记,在构建多个序列的序列时使用,例如用于序列分类的两个序列或用于文本和问题的问题回答。它也用作使用特殊标记构建的序列的最后一个标记。pad_token
(str
, 可选, 默认为"[PAD]"
) — 用于填充的标记,例如在批处理不同长度的序列时使用。cls_token
(str
, 可选, 默认为"[CLS]"
) — 用于进行序列分类(对整个序列进行分类而不是每个标记的分类)时使用的分类器标记。当使用特殊标记构建序列时,它是序列的第一个标记。mask_token
(str
, 可选, 默认为"[MASK]"
) — 用于屏蔽值的标记。这是在使用掩码语言建模训练此模型时使用的标记。这是模型将尝试预测的标记。clean_text
(bool
, 可选, 默认为True
) — 是否在分词之前清理文本,通过删除所有控制字符并将所有空格替换为经典空格。tokenize_chinese_chars
(bool
, 可选, 默认为True
) — 是否对中文字符进行分词。这可能应该在日语中停用(参见此问题)。strip_accents
(bool
, 可选) — 是否去除所有重音符号。如果未指定此选项,则将由lowercase
的值确定(与原始 Lxmert 中一样)。wordpieces_prefix
(str
, 可选, 默认为"##"
) — 用于子词的前缀。
构建一个“快速”Lxmert 分词器(由 HuggingFace 的 tokenizers 库支持)。基于 WordPiece。
这个分词器继承自 PreTrainedTokenizerFast,其中包含大部分主要方法。用户应该参考这个超类以获取有关这些方法的更多信息。
build_inputs_with_special_tokens
( token_ids_0 token_ids_1 = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — 将添加特殊标记的 ID 列表。token_ids_1
(List[int]
,可选) — 序列对的可选第二个 ID 列表。
返回
List[int]
带有适当特殊标记的输入 ID 列表。
通过连接和添加特殊标记,为序列分类任务从序列或序列对构建模型输入。一个 Lxmert 序列的格式如下:
- 单个序列:
[CLS] X [SEP]
- 序列对:
[CLS] A [SEP] B [SEP]
create_token_type_ids_from_sequences
( token_ids_0: List token_ids_1: Optional = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — ID 列表。token_ids_1
(List[int]
,可选) — 序列对的可选第二个 ID 列表。
返回
List[int]
根据给定序列的标记类型 ID 列表。
从传递的两个序列创建一个用于序列对分类任务的掩码。一个 Lxmert 序列
序列掩码的格式如下:
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 | first sequence | second sequence |
如果token_ids_1
为None
,则此方法仅返回掩码的第一部分(0)。
Lxmert 特定输出
class transformers.models.lxmert.modeling_lxmert.LxmertModelOutput
( language_output: Optional = None vision_output: Optional = None pooled_output: Optional = None language_hidden_states: Optional = None vision_hidden_states: Optional = None language_attentions: Optional = None vision_attentions: Optional = None cross_encoder_attentions: Optional = None )
参数
language_output
(torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 语言编码器最后一层的隐藏状态序列。vision_output
(torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 视觉编码器最后一层的隐藏状态序列。pooled_output
(torch.FloatTensor
,形状为(batch_size, hidden_size)
) — 序列第一个标记(分类,CLS,标记)的最后一层隐藏状态,进一步通过线性层和 Tanh 激活函数处理。线性language_hidden_states
(tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或config.output_hidden_states=True
时返回) — 形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元组(一个用于输入特征 + 一个用于每个跨模态层的输出)。vision_hidden_states
(tuple(torch.FloatTensor)
, optional, 当output_hidden_states=True
被传递或者config.output_hidden_states=True
时返回) — 形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元组(一个用于输入特征,一个用于每个跨模态层的输出)。language_attentions
(tuple(torch.FloatTensor)
, optional, 当output_attentions=True
被传递或者config.output_attentions=True
时返回) — 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。vision_attentions
(tuple(torch.FloatTensor)
, optional, 当output_attentions=True
被传递或者config.output_attentions=True
时返回) — 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。cross_encoder_attentions
(tuple(torch.FloatTensor)
, optional, 当output_attentions=True
被传递或者config.output_attentions=True
时返回) — 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
Lxmert 的输出包含语言、视觉和跨模态编码器的最后隐藏状态、汇总输出和注意力概率。(注意:在 Lxmert 中,视觉编码器被称为“关系-ship”编码器)
class transformers.models.lxmert.modeling_lxmert.LxmertForPreTrainingOutput
( loss: Optional = None prediction_logits: Optional = None cross_relationship_score: Optional = None question_answering_score: Optional = None language_hidden_states: Optional = None vision_hidden_states: Optional = None language_attentions: Optional = None vision_attentions: Optional = None cross_encoder_attentions: Optional = None )
参数
loss
(optional, 当提供labels
时返回,形状为(1,)
的torch.FloatTensor
) — 总损失,作为掩码语言建模损失和下一个序列预测(分类)损失的总和。prediction_logits
(torch.FloatTensor
,形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前每个词汇标记的分数)。cross_relationship_score
(torch.FloatTensor
,形状为(batch_size, 2)
) — 文本匹配目标(分类)头的预测分数(SoftMax 之前的 True/False 继续分数)。question_answering_score
(torch.FloatTensor
,形状为(batch_size, n_qa_answers)
) — 问答目标(分类)的预测分数。language_hidden_states
(tuple(torch.FloatTensor)
, optional, 当output_hidden_states=True
被传递或者config.output_hidden_states=True
时返回) — 形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元组(一个用于输入特征,一个用于每个跨模态层的输出)。vision_hidden_states
(tuple(torch.FloatTensor)
, optional, 当output_hidden_states=True
被传递或者config.output_hidden_states=True
时返回) — 形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元组(一个用于输入特征,一个用于每个跨模态层的输出)。language_attentions
(tuple(torch.FloatTensor)
, optional, 当output_attentions=True
被传递或者config.output_attentions=True
时返回) — 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。vision_attentions
(tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或config.output_attentions=True
时返回)— 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。cross_encoder_attentions
(tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或config.output_attentions=True
时返回)— 形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
LxmertForPreTraining 的输出类型。
Transformers 4.37 中文文档(九十)(4)https://developer.aliyun.com/article/1563841