wikillm

Paper · 2022-10-14 · cs.LG, cs.SI

Revisiting Heterophily For Graph Neural Networks

Adaptive Channel Mixing (ACM) gives each node a learned mix of three channels inside a GNN layer: low-pass aggregation, high-pass neighbour differences and the node's own features. It also proposes homophily metrics based on post-aggregation similarity. Author-reported: ACM-GCN reaches 94.75% on Cornell and 90.66% on PubMed (random 60/20/20 splits).

Graph neural networkGeneralized PageRank propagationSpectral methodsheterophilyhomophilynode-classificationgraph-filterschannel-mixinggraph-convolution

arXivPDFCodeMarkdown18 min read

AI-compiled by claude-haiku-5-5 on 2026-11-01, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

Most graph neural networks work by letting each node average the features of its neighbours. That works well when neighbours tend to share a label. On graphs where neighbours tend to differ, plain averaging blurs the nodes together and the model loses accuracy. The paper asks when this blurring really hurts, and proposes a way to measure it that looks at the neighbourhood after averaging, not only at how often neighbours share labels.

The method is a layer that keeps three views of each node side by side: the average of its neighbours, the difference between the node and its neighbours, and the node's own features. A small learned gate then decides, separately for each node, how much of each view to use. Nodes that need smoothing get more averaging, nodes that need to stand out from their neighbours get more difference, and the rest keep their own features. The layer can be dropped into standard GNN layers. On ten node-classification benchmarks, some with and some without many different-label neighbours, the authors report that adding it to baseline GNNs gives clear gains.

TL;DR

  • Standard GNN aggregation can erase the difference between nodes whose neighbours disagree with them. The paper defines homophily metrics from post-aggregation similarity and reports that they track GNN accuracy better than the usual edge, node and class homophily §3.1 §3.2 fig. 2.
  • The proposed ACM layer runs three channels in parallel (low-pass, high-pass, identity) and mixes them with node-wise weights §4.2.
  • Author-reported results on ten benchmarks with 60/20/20 random splits: ACM-GCN reaches 94.75% on Cornell and 90.66% on PubMed app. A.1.
  • The official code (MIT, author's repository) is close to the paper but differs in several details. Read "Paper vs code" before reimplementing.

Problem

Message passing averages neighbour features. Averaging helps when neighbours share labels (homophily). When neighbours have different labels (heterophily), the averaged features can mix classes and become hard to separate §1 §2.2. The usual homophily measures count label agreement across edges, but they ignore the features and the aggregation operator. The paper shows cases where they give a low score even though nodes remain separable after aggregation, such as a bipartite example where nodes swap colours §3.1 fig. 1.

Existing uni-channel GNNs use only a low-pass filter (averaging) or only a high-pass filter. Each keeps only part of the input signal §4.2. The paper argues that the best channel differs per node §4.2 fig. 4.

Method

Notation: graph with N nodes, adjacency A, one-hot labels Z (N x C), features X (N x F). The renormalised random-walk matrix is Â_rw = D̃⁻¹Ã with à = A + I. The low-pass operator is Â_rw and the high-pass operator is I − Â_rw §2.1.

  1. Two graph-signal filters. The affinity matrices act as low-pass filters, and their complements I − Â_rw act as high-pass filters. In its experiments the paper uses Â_rw as the low-pass operator and I − Â_rw as the high-pass operator §2.1 §6.2.

  2. Post-aggregation similarity. Define S(Â, X) = ÂX (ÂX)ᵀ. The aggregation similarity score counts nodes whose mean similarity to their own class is at least their mean similarity to other classes eq. 4 §3.1. The paper rescales it to [0, 1] with max(2 S_agg − 1, 0) eq. 8. The label-only version, H_agg^M, replaces X with Z eq. 9. The derivation of the gradient link is in eq. 5 and eq. 6 §3.1.

  3. Diversification. The high-pass operator I −  can separate some nodes that aggregation cannot. The paper defines a diversification-distinguishability score eq. 10 eq. 11 §4.1. For two classes, with X = Z and  = Â_rw, every node is diversification-distinguishable §4.1, Theorem 1.

  4. ACM channels (option 1, called "ACM"). For each layer, compute three channels: low-pass H_L = ReLU(Â_rw H W_L), high-pass H_H = ReLU((I − Â_rw) H W_H), and identity H_I = ReLU(H W_I). Option 2 ("ACMII") puts the ReLU before propagation instead §4.2, unnumbered display. The paper says the same framework can be combined with many other GNN layers in a similar way §4.2.

  5. Node-wise weights. Each channel gets a per-node score σ(H_c w_c), where w_c has size F_out x 1. The three scores are divided by a temperature T and multiplied by a learned 3 x 3 matrix W_Mix. A row-wise softmax gives the weights α_L, α_H, α_I §4.2.

  6. Mixing. The layer output is H = ReLU(diag(α_L) H_L + diag(α_H) H_H + diag(α_I) H_I) §4.2, unnumbered display. The paper's count of layer parameters is 3 F_{l−1}(F_l + 1) + 9, against F_{l−1} F_l for GCN. Its cost is about twice a GCN layer in the reported timings §4.2 tab. 1.

  7. Variants. ACM-GCN+ adds a structure channel H_A = ReLU(A W_A), with W_A of size N x F_l, and a fourth weight. ACM-GCN++ also adds a residual H_X = ReLU(X W_X). Both use layer normalisation before the scores in the paper's notation app. B. The code does not apply that normalisation (see "Paper vs code").

  8. Experiments. Ten benchmark datasets: Cornell, Wisconsin, Texas, Film, Chameleon, Squirrel, Deezer-Europe, Cora, CiteSeer, PubMed §6.2 app. A.1.

Key equation for the mixing step, as written in the paper (§4.2, unnumbered):

H^{l} = \mathrm{ReLU}\big(\mathrm{diag}(\alpha_L^{l}) H_L^{l} + \mathrm{diag}(\alpha_H^{l}) H_H^{l} + \mathrm{diag}(\alpha_I^{l}) H_I^{l}\big)

Pseudocode for one ACM layer (option 1), following the paper's Section 4.2 display. The paper's temperature T is set in the appendix app. B:

Pseudocode
# One ACM layer, option 1 ("ACM")  [§4.2]
# H_prev: (N, F_in); A_lp = D~^-1 (I + A) (N, N); A_hp = I - A_lp
# Returns H: (N, F_out)

def acm_layer(H_prev, A_lp, A_hp, params, T):
    # Feature extraction: propagate, then ReLU  [§4.2]
    H_low = relu(A_lp @ (H_prev @ params.W_low))     # (N, F_out)
    H_high = relu(A_hp @ (H_prev @ params.W_high))   # (N, F_out)
    H_id = relu(H_prev @ params.W_id)                # (N, F_out)
    # Per-node score for each channel  [§4.2]
    s_low = sigmoid(H_low @ params.v_low)            # (N, 1)
    s_high = sigmoid(H_high @ params.v_high)         # (N, 1)
    s_id = sigmoid(H_id @ params.v_id)               # (N, 1)
    # Row-wise softmax over the 3 channels, temperature T  [§4.2]
    scores = concat([s_low, s_high, s_id], axis=1)   # (N, 3)
    alpha = softmax((scores / T) @ params.W_mix, axis=1)  # (N, 3)
    # Node-wise weighted sum, then ReLU  [§4.2]
    mixed = (alpha[:, 0:1] * H_low
             + alpha[:, 1:2] * H_high
             + alpha[:, 2:3] * H_id)
    # Official code multiplies this sum by 3 (see Paper vs code)
    # [code: ACM-Pytorch/models/layers.py#L200]
    return relu(mixed)

The two-layer model used by the official code, with dropout placement from the code (the paper does not state it):

Pseudocode
# ACM-GCN forward, 2 layers  [§4.2] [app. C]
# Dropout placement is taken from the code, not the paper.

def acm_gcn_forward(X, A_lp, A_hp, p_drop, training):
    # Dropout on the input  [code: ACM-Pytorch/models/models.py#L116]
    H0 = dropout(X, p_drop, training)
    # First ACM layer, T = 3  [app. B] [code: ACM-Pytorch/models/layers.py#L95]
    H1 = acm_layer(H0, A_lp, A_hp, params_1, T=3)
    # Dropout between layers  [code: ACM-Pytorch/models/models.py#L160]
    H1 = dropout(H1, p_drop, training)
    # Output layer, same form with F_out = number of classes  [§4.2]
    logits = acm_layer(H1, A_lp, A_hp, params_2, T=3)
    # Log-softmax, then negative log-likelihood  [code: ACM-Pytorch/train.py#L118]
    return log_softmax(logits, axis=1)

Pseudocode for the modified aggregation homophily H_agg^M (label-only):

Pseudocode
# Modified aggregation homophily H_agg^M  [§3.1] [eq. 7] [eq. 8] [eq. 9]
# A_hat: (N, N) aggregation operator; Z: (N, C) one-hot labels

def h_agg_modified(A_hat, Z):
    # Post-aggregation similarity, with labels in place of features  [eq. 9]
    AZ = A_hat @ Z                                   # (N, C)
    S = AZ @ AZ.T                                    # (N, N)
    # True where two nodes share a label, self included  [eq. 7]
    same = (Z @ Z.T) > 0                             # (N, N) bool
    count = 0
    for v in nodes:
        # Mean similarity to v's class, v included  [eq. 7]
        mean_same = mean(S[v, same[v]])
        # Mean similarity to all other classes  [eq. 7]
        mean_other = mean(S[v, ~same[v]])
        if mean_same >= mean_other:
            count = count + 1
    S_agg = count / N                                # [eq. 7]
    # Rescale to [0, 1]  [eq. 8]
    return max(2 * S_agg - 1, 0)                     # H_agg^M  [eq. 9]

Hyperparameters

NameValueWhereNotes
OptimiserAdam§6.2 train.pyDeezer-Europe uses AdamW in the code train.py
Learning rateper dataset (table below)app. CCode default 0.05 arg_parser.py
Weight decayper dataset (table below)app. CCode default 1e-3, applied as L2 to all parameters arg_parser.py train.py
Dropoutper dataset (table below)app. CCode default 0 arg_parser.py
Hidden units64app. C
Layers2 for ACM-GCN§4.2 app. CCode always builds 2 layers; --layers has no effect here models.py
Temperature T3 (three channels), 4 (with structure channel)app. BCode: layers.py, layers.py
Splits and runsrandom 60/20/20, 10 runs; Deezer-Europe 50/25/25, 5 runs§6.2 app. A.1Split sizes are not exact in the code (see Pitfalls)
Early stopping"same as GPRGNN"; number not stated§6.2Code: patience 200, cap 5000 epochs arg_parser.py arg_parser.py
Random seednot statedCode: 42 arg_parser.py
HardwareNVIDIA V100, 16 or 32 GBapp. B

Optimal ACM-GCN settings on random 60/20/20 splits app. C (2 layers, hidden 64 throughout):

Datasetlrweight decaydropout
Cornell0.051e-20.2
Wisconsin0.15e-30
Texas0.051e-20.6
Film0.15e-40.5
Chameleon0.015e-50.8
Squirrel0.055e-60.6
Cora0.15e-30.5
CiteSeer0.055e-30.7
PubMed0.15e-40.2
Deezer-Europe0.0025e-40.5

Optimal ACM-GCN+ settings on random splits app. C. "With A" marks whether the structure channel is on:

Datasetlrweight decaydropoutwith A
Cornell0.051e-20.1Y
Wisconsin0.051e-20.3Y
Texas0.051e-30.3N
Film0.011e-30.8N
Chameleon0.0021e-30.4Y
Squirrel0.011e-40.6Y
Cora0.15e-30.3Y
CiteSeer0.11e-50.5N
PubMed0.11e-40.1N
Deezer-Europe0.0021e-60.7N

The fixed-split runs use a script with per-dataset settings for ACM-GCN+ and ACMII-GCN+ acmgcnp_reproduce_fixed_splits.sh. I did not check those values line by line against the appendix table for fixed splits.

Results

Author-reported, mean ± standard deviation of test accuracy (%). Setup: ten benchmark datasets, random 60/20/20 splits, 10 runs (Deezer-Europe: 50/25/25, 5 runs), Adam §6.2 app. A.1. Rows are a subset of the paper's table. Omitted rows (GAT, APPNP, GCN+JK, GAT+JK, MixHop, FAGCN, GraphSAGE, Geom-GCN, GCNII, SGC-2, Snowball-3, ACM-SGC-2, ACM-GCNII, ACM-GCNII*, ACM-Snowball-2/3, ACMII-Snowball-2/3) are in app. A.1. In the paper, some baseline rows are copied from earlier papers. The GCNII* in the table is a model variant, not a marker. NA means not reported, OOM means out of memory.

ModelCornellWisconsinTexasFilmChameleonSquirrelDeezer-EuropeCoraCiteSeerPubMedRank
MLP-291.30 ± 0.7093.87 ± 3.3392.26 ± 0.7138.58 ± 0.2546.72 ± 0.4631.28 ± 0.2766.55 ± 0.7276.44 ± 0.3076.25 ± 0.2886.43 ± 0.1323.40
GCN82.46 ± 3.1175.50 ± 2.9283.11 ± 3.2035.51 ± 0.9964.18 ± 2.6244.76 ± 1.3962.23 ± 0.5387.78 ± 0.9681.39 ± 1.2388.90 ± 0.3220.90
SGC-170.98 ± 8.3970.38 ± 2.8583.28 ± 5.4325.26 ± 1.1864.86 ± 1.8147.62 ± 1.2759.73 ± 0.1285.12 ± 1.6479.66 ± 0.7585.50 ± 0.7624.90
GCNII*90.49 ± 4.4589.12 ± 3.0688.52 ± 3.0241.54 ± 0.9962.80 ± 2.8738.31 ± 1.3066.42 ± 0.5688.93 ± 1.3781.83 ± 1.7889.98 ± 0.5216.40
Snowball-282.62 ± 2.3474.88 ± 3.4283.11 ± 3.2035.97 ± 0.6664.99 ± 2.3947.88 ± 1.23OOM88.64 ± 1.1581.53 ± 1.7189.04 ± 0.4919.78
H2GCN86.23 ± 4.7187.50 ± 1.7785.90 ± 3.5338.85 ± 1.1752.30 ± 0.4830.39 ± 1.2267.22 ± 0.9087.52 ± 0.6179.97 ± 0.6987.78 ± 0.2821.80
GPRGNN91.36 ± 0.7093.75 ± 2.3792.92 ± 0.6139.30 ± 0.2767.48 ± 0.4049.93 ± 0.5366.90 ± 0.5079.51 ± 0.3667.63 ± 0.3885.07 ± 0.0919.20
BernNet92.13 ± 1.64NA93.12 ± 0.6541.79 ± 1.0168.29 ± 1.5851.35 ± 0.73NA88.52 ± 0.9580.09 ± 0.7988.48 ± 0.4114.75
ACM-SGC-193.77 ± 1.9193.25 ± 2.9293.61 ± 1.5539.33 ± 1.2563.68 ± 1.6246.40 ± 1.1366.67 ± 0.5686.63 ± 1.1380.96 ± 0.9387.75 ± 0.8817.00
ACM-GCN94.75 ± 3.8095.75 ± 2.0394.92 ± 2.8841.62 ± 1.1569.04 ± 1.7458.02 ± 1.8667.01 ± 0.3888.62 ± 1.2281.68 ± 0.9790.66 ± 0.477.90
ACM-GCN+94.92 ± 2.7996.50 ± 2.0894.92 ± 2.7941.79 ± 1.0176.08 ± 2.1369.26 ± 1.1167.40 ± 0.4489.75 ± 1.1681.65 ± 1.4890.46 ± 0.694.90
ACM-GCN++93.93 ± 1.0597.50 ± 1.2596.56 ± 2.0041.86 ± 1.4875.23 ± 1.7268.56 ± 1.3367.30 ± 0.4889.33 ± 0.8181.83 ± 1.6590.39 ± 0.334.30
ACMII-GCN95.90 ± 1.8396.62 ± 2.4495.08 ± 2.0741.84 ± 1.1568.38 ± 1.3654.53 ± 2.0967.15 ± 0.4189.00 ± 0.7281.79 ± 0.9590.74 ± 0.505.90
ACMII-GCN+93.93 ± 3.0396.75 ± 1.7995.41 ± 2.8241.50 ± 1.5475.51 ± 1.5869.81 ± 1.1167.44 ± 0.3189.18 ± 1.1181.87 ± 1.3890.96 ± 0.624.40
ACMII-GCN++92.62 ± 2.5797.13 ± 1.6894.75 ± 2.9141.66 ± 1.4275.93 ± 1.7169.98 ± 1.5367.50 ± 0.5389.47 ± 1.0881.76 ± 1.2590.63 ± 0.565.10

Fixed 48/32/20 splits from Geom-GCN, nine datasets (no Deezer-Europe) app. A.2. Subset of rows:

ModelCornellWisconsinTexasFilmChameleonSquirrelCoraCiteSeerPubMedRank
H2GCN82.70 ± 5.2887.65 ± 4.9884.86 ± 7.2335.70 ± 1.0060.11 ± 2.1536.48 ± 1.8687.87 ± 1.2077.11 ± 1.5789.49 ± 0.3815.11
GGCN85.68 ± 6.6386.86 ± 3.2984.86 ± 4.5537.54 ± 1.5671.14 ± 1.8455.17 ± 1.5887.95 ± 1.0577.14 ± 1.4589.15 ± 0.3710.22
GloGNN++85.95 ± 5.1088.04 ± 3.2284.05 ± 4.9037.70 ± 1.4071.21 ± 1.8457.88 ± 1.7688.33 ± 1.0977.22 ± 1.7889.24 ± 0.397.33
ACM-SGC-182.43 ± 5.4486.47 ± 3.7781.89 ± 4.5335.49 ± 1.0663.99 ± 1.6645.00 ± 1.4086.90 ± 1.3876.73 ± 1.5988.49 ± 0.5117.56
ACM-GCN85.14 ± 6.0788.43 ± 3.2287.84 ± 4.4036.63 ± 0.8469.14 ± 1.9155.19 ± 1.4987.91 ± 0.9577.32 ± 1.7090.00 ± 0.528.11
ACMII-GCN85.95 ± 5.6487.45 ± 3.7486.76 ± 4.7536.31 ± 1.2068.46 ± 1.7051.80 ± 1.5088.01 ± 1.0877.15 ± 1.4589.89 ± 0.439.33
ACM-GCN+85.68 ± 4.8488.43 ± 2.3988.38 ± 3.6436.26 ± 1.3474.47 ± 1.8466.98 ± 1.7188.05 ± 0.9977.67 ± 1.1989.82 ± 0.415.33
ACMII-GCN+85.41 ± 5.3088.04 ± 3.6688.11 ± 3.2436.14 ± 1.4474.56 ± 2.0867.07 ± 1.6588.19 ± 1.1777.20 ± 1.6189.78 ± 0.496.78
ACM-GCN++85.68 ± 5.8088.24 ± 3.1688.38 ± 3.4337.31 ± 1.0974.41 ± 1.4967.06 ± 1.6688.11 ± 0.9677.46 ± 1.6589.65 ± 0.585.33
ACMII-GCN++86.49 ± 6.7388.43 ± 3.6688.38 ± 3.4337.09 ± 1.3274.76 ± 2.2067.40 ± 2.2188.25 ± 0.9677.12 ± 1.5889.71 ± 0.484.78

Dataset statistics as reported app. A.1. H_agg^M is the paper's label-only aggregation homophily eq. 9:

DatasetCornellWisconsinTexasFilmChameleonSquirrelDeezer-EuropeCoraCiteSeerPubMed
Nodes1832511837,6002,2775,20128,2812,7083,32719,717
Edges29549930933,54436,101217,07392,7525,4294,73244,338
Features1,7031,7031,7039312,3252,08931,2411,4333,703500
Classes5555552763
H_edge0.56690.44800.41060.37500.27950.24160.52510.81000.73620.8024
H_node0.38550.14980.09680.22100.24700.21560.52990.82520.71750.7924
H_class0.04680.09410.00130.01100.06200.02540.03040.76570.62700.6641
H_agg^M0.80320.77680.69400.68220.61000.35660.57900.99040.98260.9432

Ablation on nine datasets, ACM-GCN block only tab. 1, §6.1. ✓ marks a component on. The paper's ACM-SGC-1 and ACMII-GCN blocks are in the same table. Rank is the paper's average rank:

LPHPIdentityMixingCornellWisconsinTexasFilmChameleonSquirrelCoraCiteSeerPubMedRank
✓82.46 ± 3.1175.50 ± 2.9283.11 ± 3.2035.51 ± 0.9964.18 ± 2.6244.76 ± 1.3987.78 ± 0.9681.39 ± 1.2388.90 ± 0.3211.44
✓✓✓82.13 ± 2.5986.62 ± 4.6189.19 ± 3.0438.06 ± 1.3569.21 ± 1.6857.20 ± 1.0188.93 ± 1.5581.96 ± 0.9190.01 ± 0.807.22
✓✓✓94.26 ± 2.2396.13 ± 2.2094.10 ± 2.9541.51 ± 0.9967.44 ± 2.1453.97 ± 1.3988.95 ± 0.9081.72 ± 1.2290.88 ± 0.554.44
✓✓✓91.64 ± 2.0095.37 ± 3.3195.25 ± 2.3740.47 ± 1.4968.93 ± 2.0454.78 ± 1.2789.13 ± 1.7781.96 ± 2.0391.01 ± 0.703.11
✓✓✓✓94.75 ± 2.6296.75 ± 1.6095.08 ± 3.2041.62 ± 1.1569.04 ± 1.7458.02 ± 1.8688.95 ± 1.3081.80 ± 1.2690.69 ± 0.532.78

Paper's efficiency claim: running time per epoch roughly doubles relative to the base model §6.1. For ACM-GCN on Cornell the table gives 8.25 ms per epoch against 3.67 ms for GCN tab. 1.

Paper vs code

Official code: SitaoLuan/ACM-GNN at 75b4853f29b2ce0844283e4a64c4b1120feb295c (MIT). The repository's own PDF is named ..._updated.pdf, so the code may match a later version than arXiv v1, which this card cites. I checked the PyTorch implementation in ACM-Pytorch/. Differences:

  • Layer count. The paper describes an L-layer model §4.2. The code always builds two graph layers for acmgcn, acmgcnp and acmgcnpp models.py. The --layers flag has no effect on these models arg_parser.py.
  • Output scale. The paper's mixing step has no constant §4.2. The code multiplies the three-channel mix by 3 layers.py layers.py, and the structure version multiplies by 1 layers.py. The constant scales the layer output, so it interacts with the learning rate and weight decay.
  • Layer normalisation in ACM+ and ACM++. The appendix puts layer normalisation before the channel scores app. B. The code tests model_type == "acmgcn+" or "acmgcn++" layers.py layers.py. The model names passed in are acmgcnp and acmgcnpp arg_parser.py, so the normalisation is never applied in the shipped code.
  • Residual in ACM++. The paper adds H_X = ReLU(X W_X) to every layer output app. B. The code adds a dropout-applied ReLU(Linear(X)) once, to the input of the second layer models.py models.py models.py.
  • Structure channel. The code uses a learned N x F embedding multiplied by the raw adjacency A, which has no self-loops and is not normalised layers.py layers.py utils.py. The paper writes H_A = ReLU(A W_A) without saying which A app. B.
  • Feature normalisation. The code row-normalises X, except for acmgcnp with structure channel on utils.py. The paper does not state feature preprocessing §6.2.
  • Propagation operators. Match: the low-pass operator is row-normalised I + A, and the high-pass operator is I minus it utils.py utils.py.
  • Option 1 and option 2. Match: the default ACM uses ReLU after propagation, and the variant flag, which gives ACMII, applies ReLU before propagation layers.py.
  • Random splits. The paper says 60/20/20 random splits §6.2. The code takes round(0.6 · N / C) training nodes per class, round(0.2 · N) validation nodes and the rest as test utils.py utils.py.
  • Model selection. The code records test accuracy at the epoch with the lowest validation loss, not the highest validation accuracy train.py. Early stopping compares the current validation loss with the mean of the previous 200 epochs train.py. The paper says only "same as GPRGNN" §6.2.
  • Deezer-Europe. The code uses AdamW, 500 epochs and validation-accuracy selection train.py train.py. The paper says Adam with the protocol of another paper §6.2.
  • Weight decay. The code applies weight decay to every parameter, including the mixing matrix and channel vectors train.py. The paper does not say.
  • Ablation variants. The paper's ablation includes a "no mixing" variant that adds the three channels §6.1. The shipped code has no switch for disabling a channel or the mixing layers.py, so these rows cannot be reproduced from it.
  • GCNII variants. ACM-GCNII and ACM-GCNII* are reported §6.2. The model module has no branch for them models.py.
  • SGC-2. For two hops the code uses Â_rw² as the low-pass operator but keeps I − Â_rw (one hop) as the high-pass operator utils.py utils.py. The paper states "the corresponding HP filter is I − Â_rw" §6.2 and does not define SGC-2 separately.
  • Aggregation homophily. The helper in the synthetic code takes the argmax over class means and ignores its modified argument. It does not apply the paper's same-versus-other comparison or the 2S − 1 rescaling homophily.py eq. 7 eq. 8. Nothing in the repository calls it.
  • Fixed-split settings. Per-dataset settings are in a shell script acmgcnp_reproduce_fixed_splits.sh. I did not check them against the appendix table.
  • Table and text inconsistencies in the paper. The text names ACMII-GCN+ as best by average rank with 4.40 app. A.1, but the same table gives ACM-GCN++ 4.30. The optimal-hyperparameter table lists ACM-GCN results of 68.18 on Chameleon and 90.54 on PubMed app. C, against 69.04 and 90.66 in the main table. The ablation's full ACM-GCN row also differs from the main table, for example Wisconsin 96.75 against 95.75 and Cora 88.95 against 88.62 tab. 1 app. A.1.

Pitfalls

  • Scale factor. The ×3 in the code is not in the paper. If you copy the paper's equation, the effective learning rate and the weight-decay strength will differ from the released results.
  • Layer normalisation. The appendix describes it for the ACM+ and ACM++ variants. The released code never applies it, so implementing the appendix literally gives a different model from the one that produced the reported numbers.
  • Two-layer fixed. Setting --layers does nothing for ACM-GCN. Do not expect a depth sweep to change anything in the shipped code.
  • Splits are not exactly 60%. Training takes a fixed count per class utils.py, capped by the class size. With unequal class sizes the training fraction can fall below 60% (inference from the code, not measured). Compare results only under the same split procedure.
  • Model selection. The paper does not state the selection rule. The code reports test accuracy at the minimum-validation-loss epoch, not at the best validation accuracy train.py. The reported standard deviations are 0.3 to 4 points, so a different rule could shift results by a similar amount (inference, not tested).
  • Small datasets. Cornell, Wisconsin and Texas have 183 to 251 nodes app. A.1. A difference of one to two points between top models is within one standard deviation.
  • Undefined means. H_agg^M takes means over sets that can be empty, for example when a node is the only member of its class. The paper does not say how to handle this eq. 7.
  • Cost. The paper reports about twice the per-epoch time of the base layer tab. 1. On Deezer-Europe the appendix lists about 136 ms per epoch for ACM-GCN and about 282 ms for ACM-GCN+ app. C.
  • Dropout placement. The paper gives dropout values but not where dropout is applied. The code applies it to the input and after the first layer models.py models.py.
  • Not run. I did not run the code. The results above are as reported in the paper.

Lineage

  • Builds on: GCN, Kipf and Welling [arXiv:1609.02907] §2.1 eq. 1; SGC, Wu et al. [arXiv:1902.07153] §3.1. Both are the baselines the analysis uses.
  • Uses ideas from earlier work: the filterbank view from graph signal processing §4.2, and learned signed weights in GPRGNN (Chien et al., 2021) §5.
  • Compared against: MLP-2, GAT, APPNP, GPRGNN, H2GCN, MixHop, GCN+JK, GAT+JK, FAGCN, GraphSAGE, Geom-GCN, BernNet, GCNII, Snowball networks §6.2 app. A.1. Fixed-split comparison adds GGCN, GloGNN and GloGNN++ app. A.2.

Source and license

Adapted from “Revisiting Heterophily For Graph Neural Networks” by Sitao Luan, Chenqing Hua, Qincheng Lu, Jiaqi Zhu, Mingde Zhao, Shuyuan Zhang, Xiao-Wen Chang, Doina Precup (arXiv:2210.07606), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/SitaoLuan/ACM-GNN at commit 75b4853f29b2 (MIT). Any quoted code is shown under that license.