Graphormer
此模型仅处于维护模式,我们不接受任何更改其代码的新 PR。如果您在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.40.2。您可以通过运行以下命令来执行此操作:pip install -U transformers==4.40.2
。
概述
Graphormer 模型由 Chengxuan Ying、Tianle Cai、Shengjie Luo、Shuxin Zheng、Guolin Ke、Di He、Yanming Shen 和 Tie-Yan Liu 在 Do Transformers Really Perform Bad for Graph Representation? 中提出。它是一种图 Transformer 模型,通过在预处理和整理期间生成嵌入和感兴趣的特征,然后使用修改后的注意力机制,对其进行了修改,以便能够在图而不是文本序列上进行计算。
该论文的摘要是这样的
Transformer 架构已成为许多领域的优势选择,例如自然语言处理和计算机视觉。然而,与主流的 GNN 变体相比,它在图级预测的流行排行榜上还没有取得有竞争力的性能。因此,Transformer 如何在图表示学习中表现良好仍然是一个谜。在本文中,我们通过介绍 Graphormer 来解开这个谜团,它是建立在标准 Transformer 架构之上的,并且可以在广泛的图表示学习任务上获得优异的结果,特别是在最近的 OGB 大规模挑战赛中。我们在图中利用 Transformer 的关键见解是,必须将图的结构信息有效地编码到模型中。为此,我们提出了几种简单但有效的结构编码方法,以帮助 Graphormer 更好地建模图结构化数据。此外,我们从数学上刻画了 Graphormer 的表达能力,并展示了通过我们编码图结构信息的方式,许多流行的 GNN 变体可以作为 Graphormer 的特例来涵盖。
此模型由 clefourrier 贡献。原始代码可以在 此处 找到。
使用提示
此模型不适用于大型图(超过 100 个节点/边),因为它会导致内存爆炸。您可以减小批大小、增加 RAM 或减小 algos_graphormer.pyx 中的 UNREACHABLE_NODE_DISTANCE
参数,但很难超过 700 个节点/边。
此模型不使用分词器,而是在训练期间使用特殊的整理器。
GraphormerConfig
class transformers.GraphormerConfig
< source >( num_classes: int = 1 num_atoms: int = 4608 num_edges: int = 1536 num_in_degree: int = 512 num_out_degree: int = 512 num_spatial: int = 512 num_edge_dis: int = 128 multi_hop_max_dist: int = 5 spatial_pos_max: int = 1024 edge_type: str = 'multi_hop' max_nodes: int = 512 share_input_output_embed: bool = False num_hidden_layers: int = 12 embedding_dim: int = 768 ffn_embedding_dim: int = 768 num_attention_heads: int = 32 dropout: float = 0.1 attention_dropout: float = 0.1 activation_dropout: float = 0.1 layerdrop: float = 0.0 encoder_normalize_before: bool = False pre_layernorm: bool = False apply_graphormer_init: bool = False activation_fn: str = 'gelu' embed_scale: float = None freeze_embeddings: bool = False num_trans_layers_to_freeze: int = 0 traceable: bool = False q_noise: float = 0.0 qn_block_size: int = 8 kdim: int = None vdim: int = None bias: bool = True self_attention: bool = True pad_token_id = 0 bos_token_id = 1 eos_token_id = 2 **kwargs )
参数
- num_classes (
int
, 可选, 默认值: 1) — 目标类别或标签的数量,对于 n 个任务的二元分类,设置为 n。 - num_atoms (
int
, 可选, 默认值: 512*9) — 图中节点类型的数量。 - num_edges (
int
,可选,默认为 512*3) — 图中的边类型数量。 - num_in_degree (
int
,可选,默认为 512) — 输入图中的入度类型数量。 - num_out_degree (
int
,可选,默认为 512) — 输入图中的出度类型数量。 - num_edge_dis (
int
,可选,默认为 128) — 输入图中的边距离数量。 - multi_hop_max_dist (
int
,可选,默认为 20) — 两个节点之间多跳边的最大距离。 - spatial_pos_max (
int
,可选,默认为 1024) — 图注意力偏差矩阵中节点之间的最大距离,用于预处理和排序。 - edge_type (
str
,可选,默认为 multihop) — 选择的边关系类型。 - max_nodes (
int
,可选,默认为 512) — 可以为输入图解析的最大节点数。 - share_input_output_embed (
bool
, *可选*, 默认值为False
) — 在编码器和解码器之间共享嵌入层 - 注意,True 尚未实现。 - num_layers (
int
, *可选*, 默认值为 12) — 层数。 - embedding_dim (
int
, *可选*, 默认值为 768) — 编码器中嵌入层的维度。 - ffn_embedding_dim (
int
, *可选*, 默认值为 768) — 编码器中“中间”(通常称为前馈)层的维度。 - num_attention_heads (
int
, *可选*, 默认值为 32) — 编码器中注意力头的数量。 - self_attention (
bool
, *可选*, 默认值为True
) — 模型是自注意力的 (False 尚未实现)。 - activation_function (
str
或function
, *可选*, 默认值为"gelu"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"
、"relu"
、"silu"
和"gelu_new"
。 - dropout (
float
, 可选, 默认值为 0.1) — 嵌入、编码器和池化器中所有全连接层的 dropout 概率。 - attention_dropout (
float
, 可选, 默认值为 0.1) — 注意力权重的 dropout 概率。 - activation_dropout (
float
, 可选, 默认值为 0.1) — 线性 Transformer 层激活函数的 dropout 概率。 - layerdrop (
float
, 可选, 默认值为 0.0) — 编码器的 LayerDrop 概率。有关更多详细信息,请参阅 [LayerDrop 论文](请参阅 https://arxiv.org/abs/1909.11556)。 - bias (
bool
, 可选, 默认值为True
) — 在注意力模块中使用偏差 - 目前不支持。 - embed_scale(
float
, 可选, 默认值为 None) — 节点嵌入的缩放因子。 - num_trans_layers_to_freeze (
int
, 可选, 默认值为 0) — 要冻结的 Transformer 层数。 - encoder_normalize_before (
bool
, 可选, 默认值为False
) — 在对图进行编码之前对特征进行归一化。 - **pre_layernorm** (``bool``, *可选*, 默认值: ``False``) — 在自注意力和前馈网络之前应用层归一化。 如果没有这个,则使用后层归一化。
- **apply_graphormer_init** (``bool``, *可选*, 默认值: ``False``) — 在训练之前对模型应用自定义 graphormer 初始化。
- **freeze_embeddings** (``bool``, *可选*, 默认值: ``False``) — 冻结嵌入层,或将其与模型一起训练。
- **encoder_normalize_before** (``bool``, *可选*, 默认值: ``False``) — 在每个编码器块之前应用层归一化。
- **q_noise** (``float``, *可选*, 默认值: 0.0) — 量化噪声的数量(参见“使用量化噪声进行极端模型压缩训练”)。(有关更多详细信息,请参阅 fairseq 关于 quant_noise 的文档)。
- **qn_block_size** (``int``, *可选*, 默认值: 8) — 使用 iPQ 进行后续量化的块大小(请参阅 q_noise)。
- **kdim** (``int``, *可选*, 默认值: ``None``) — 注意力中键的维度,如果与其他值不同。
- vdim (
int
, 可选, 默认值: None) — 注意力中值的维度,如果与其他值不同。 - use_cache (
bool
, 可选, 默认值:True
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。 - traceable (
bool
, 可选, 默认值:False
) — 将编码器的 inner_state 的返回值更改为堆叠张量。示例 —
这是用于存储 ~GraphormerModel 配置的配置类。它用于根据指定的参数实例化 Graphormer 模型,定义模型架构。使用默认值实例化配置将产生与 Graphormer graphormer-base-pcqm4mv1 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
GraphormerModel
Graphormer 模型是一个图编码器模型。
它将图转换为其表示形式。如果要将模型用于下游分类任务,请改用 GraphormerForGraphClassification。对于任何其他下游任务,请随意添加新类,或将此模型与您选择的下游模型组合,请遵循 GraphormerForGraphClassification 中的示例。
forward
< source >( input_nodes: LongTensor input_edges: LongTensor attn_bias: Tensor in_degree: LongTensor out_degree: LongTensor spatial_pos: LongTensor attn_edge_type: LongTensor perturb: Optional = None masked_tokens: None = None return_dict: Optional = None **unused )
用于图分类的 Graphormer
此模型可用于图级分类或回归任务。
它可以训练用于
- 回归(通过将 config.num_classes 设置为 1);每个图应该有一个浮点型标签
- 单任务分类(通过将 config.num_classes 设置为类别数量);每个图应该有一个整数标签
- 二元多任务分类(通过将 config.num_classes 设置为标签数量);每个图应该有一个整数标签列表。
forward
< 源代码 >( input_nodes: LongTensor input_edges: LongTensor attn_bias: Tensor in_degree: LongTensor out_degree: LongTensor spatial_pos: LongTensor attn_edge_type: LongTensor labels: Optional = None return_dict: Optional = None **unused )