Graphormer
이 모델은 유지 보수 모드로만 운영되며, 코드를 변경하는 새로운 PR(Pull Request)은 받지 않습니다.
이 모델을 실행하는 데 문제가 발생한다면, 이 모델을 지원하는 마지막 버전인 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가 제안한 트랜스포머가 그래프 표현에 있어서 정말 약할까? 라는 논문에서 소개되었습니다. Graphormer는 그래프 트랜스포머 모델입니다. 텍스트 시퀀스 대신 그래프에서 계산을 수행할 수 있도록 수정되었으며, 전처리와 병합 과정에서 임베딩과 관심 특성을 생성한 후 수정된 어텐션을 사용합니다.
해당 논문의 초록입니다:
트랜스포머 아키텍처는 자연어 처리와 컴퓨터 비전 등 많은 분야에서 지배적인 선택을 받고 있는 아키텍처 입니다. 그러나 그래프 수준 예측 리더보드 상에서는 주류 GNN 변형모델들에 비해 경쟁력 있는 성능을 달성하지 못했습니다. 따라서 트랜스포머가 그래프 표현 학습에서 어떻게 잘 수행될 수 있을지는 여전히 미스터리였습니다. 본 논문에서는 Graphormer를 제시함으로써 이 미스터리를 해결합니다. Graphormer는 표준 트랜스포머 아키텍처를 기반으로 구축되었으며, 특히 최근의 OpenGraphBenchmark Large-Scale Challenge(OGB-LSC)의 광범위한 그래프 표현 학습 작업에서 탁월한 결과를 얻을 수 있었습니다. 그래프에서 트랜스포머를 활용하는데 핵심은 그래프의 구조적 정보를 모델에 효과적으로 인코딩하는 것입니다. 이를 위해 우리는 Graphormer가 그래프 구조 데이터를 더 잘 모델링할 수 있도록 돕는 몇 가지 간단하면서도 효과적인 구조적 인코딩 방법을 제안합니다. 또한, 우리는 Graphormer의 표현을 수학적으로 특성화하고, 그래프의 구조적 정보를 인코딩하는 우리의 방식으로 많은 인기 있는 GNN 변형모델들이 Graphormer의 특수한 경우로 포함될 수 있음을 보여줍니다.
이 모델은 clefourrier가 기여했습니다. 원본 코드는 이곳에서 확인할 수 있습니다.
사용 팁
이 모델은 큰 그래프(100개 이상의 노드개수/엣지개수)에서는 메모리 사용량이 폭발적으로 증가하므로 잘 작동하지 않습니다. 대안으로 배치 크기를 줄이거나, RAM을 늘리거나 또는 algos_graphormer.pyx 파일의 UNREACHABLE_NODE_DISTANCE
매개변수를 줄이는 방법도 있지만, 700개 이상의 노드개수/엣지개수를 처리하기에는 여전히 어려울 것입니다.
이 모델은 토크나이저를 사용하지 않고, 대신 훈련 중에 특별한 콜레이터(collator)를 사용합니다.
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 )
Parameters
- num_classes (
int
, optional, defaults to 1) — Number of target classes or labels, set to n for binary classification of n tasks. - num_atoms (
int
, optional, defaults to 512*9) — Number of node types in the graphs. - num_edges (
int
, optional, defaults to 512*3) — Number of edges types in the graph. - num_in_degree (
int
, optional, defaults to 512) — Number of in degrees types in the input graphs. - num_out_degree (
int
, optional, defaults to 512) — Number of out degrees types in the input graphs. - num_edge_dis (
int
, optional, defaults to 128) — Number of edge dis in the input graphs. - multi_hop_max_dist (
int
, optional, defaults to 20) — Maximum distance of multi hop edges between two nodes. - spatial_pos_max (
int
, optional, defaults to 1024) — Maximum distance between nodes in the graph attention bias matrices, used during preprocessing and collation. - edge_type (
str
, optional, defaults to multihop) — Type of edge relation chosen. - max_nodes (
int
, optional, defaults to 512) — Maximum number of nodes which can be parsed for the input graphs. - share_input_output_embed (
bool
, optional, defaults toFalse
) — Shares the embedding layer between encoder and decoder - careful, True is not implemented. - num_layers (
int
, optional, defaults to 12) — Number of layers. - embedding_dim (
int
, optional, defaults to 768) — Dimension of the embedding layer in encoder. - ffn_embedding_dim (
int
, optional, defaults to 768) — Dimension of the “intermediate” (often named feed-forward) layer in encoder. - num_attention_heads (
int
, optional, defaults to 32) — Number of attention heads in the encoder. - self_attention (
bool
, optional, defaults toTrue
) — Model is self attentive (False not implemented). - activation_function (
str
orfunction
, optional, defaults to"gelu"
) — The non-linear activation function (function or string) in the encoder and pooler. If string,"gelu"
,"relu"
,"silu"
and"gelu_new"
are supported. - dropout (
float
, optional, defaults to 0.1) — The dropout probability for all fully connected layers in the embeddings, encoder, and pooler. - attention_dropout (
float
, optional, defaults to 0.1) — The dropout probability for the attention weights. - activation_dropout (
float
, optional, defaults to 0.1) — The dropout probability for the activation of the linear transformer layer. - layerdrop (
float
, optional, defaults to 0.0) — The LayerDrop probability for the encoder. See the [LayerDrop paper](see https://arxiv.org/abs/1909.11556) for more details. - bias (
bool
, optional, defaults toTrue
) — Uses bias in the attention module - unsupported at the moment. - embed_scale(
float
, optional, defaults to None) — Scaling factor for the node embeddings. - num_trans_layers_to_freeze (
int
, optional, defaults to 0) — Number of transformer layers to freeze. - encoder_normalize_before (
bool
, optional, defaults toFalse
) — Normalize features before encoding the graph. - pre_layernorm (
bool
, optional, defaults toFalse
) — Apply layernorm before self attention and the feed forward network. Without this, post layernorm will be used. - apply_graphormer_init (
bool
, optional, defaults toFalse
) — Apply a custom graphormer initialisation to the model before training. - freeze_embeddings (
bool
, optional, defaults toFalse
) — Freeze the embedding layer, or train it along the model. - encoder_normalize_before (
bool
, optional, defaults toFalse
) — Apply the layer norm before each encoder block. - q_noise (
float
, optional, defaults to 0.0) — Amount of quantization noise (see “Training with Quantization Noise for Extreme Model Compression”). (For more detail, see fairseq’s documentation on quant_noise). - qn_block_size (
int
, optional, defaults to 8) — Size of the blocks for subsequent quantization with iPQ (see q_noise). - kdim (
int
, optional, defaults to None) — Dimension of the key in the attention, if different from the other values. - vdim (
int
, optional, defaults to None) — Dimension of the value in the attention, if different from the other values. - use_cache (
bool
, optional, defaults toTrue
) — Whether or not the model should return the last key/values attentions (not used by all models). - traceable (
bool
, optional, defaults toFalse
) — Changes return value of the encoder’s inner_state to stacked tensors.Example —
This is the configuration class to store the configuration of a ~GraphormerModel. It is used to instantiate an Graphormer model according to the specified arguments, defining the model architecture. Instantiating a configuration with the defaults will yield a similar configuration to that of the Graphormer graphormer-base-pcqm4mv1 architecture.
Configuration objects inherit from PretrainedConfig and can be used to control the model outputs. Read the documentation from PretrainedConfig for more information.
GraphormerModel
The Graphormer model is a graph-encoder model.
It goes from a graph to its representation. If you want to use the model for a downstream classification task, use GraphormerForGraphClassification instead. For any other downstream task, feel free to add a new class, or combine this model with a downstream model of your choice, following the example in 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 )
GraphormerForGraphClassification
This model can be used for graph-level classification or regression tasks.
It can be trained on
- regression (by setting config.num_classes to 1); there should be one float-type label per graph
- one task classification (by setting config.num_classes to the number of classes); there should be one integer label per graph
- binary multi-task classification (by setting config.num_classes to the number of labels); there should be a list of integer labels for each graph.
forward
< source >( 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 )