โ† vibhum aggarwal

can you predict HIV neutralization from sequence?

2026 ยท results, with the data behind them

CATNAP is the public database of how well HIV antibodies neutralize different strains of the virus. the question: from sequence alone, can a model predict whether a given antibody will neutralize a given strain? it matters because measuring every pair in a lab is slow.

CATNAP, LANL release 2026-10-01 โ€” 80,340 antibody-virus pairs, 715 antibodies, 2,734 viruses. leak-free splits, seed 42. every chart below is drawn from the result files in this repo; hover any point for its numbers.

1. the strong numbers were leakage

CATNAP holds many rows per antibody. split those rows at random and the same antibodies land in both training and test, so a model scores well just by recognising ones it has already seen. hold whole antibodies out and the same fine-tuned model drops to chance. a second bug looked like a training "collapse": in fp16 the model overflowed to NaN and never trained at all. bfloat16 fixed it.

0.400.500.600.700.800.90chanceankh fine-tune ยท random split0.892ankh fine-tune ยท split by antibody0.498best leak-free model (ESM-2 + GBM)0.714
show the numbers
model / splitAUROC
ankh fine-tune ยท random split0.892
ankh fine-tune ยท split by antibody0.498
best leak-free model (ESM-2 + GBM)0.714

2. the bigger the model, the worse the part that matters

pooled scores mostly measure how broadly an antibody works and how fragile a strain is. the harder question is specificity: for one unseen antibody, which strains does it neutralize? scored that way, on novel antibodies and novel viruses, the end-to-end fine-tune lands exactly on chance, while simple interpretable features โ€” V-gene, CDR3, mutation load, Env alignment โ€” do best.

0.450.500.550.600.650.70chancegermline + alignment features (RF)0.644frozen ESM-2 650M + cross-attention0.514ESM-2 650M, LoRA fine-tuned0.500
show the numbers
approachwithin-antibody AUROC
germline + alignment features (RF)0.644
frozen ESM-2 650M + cross-attention0.514
ESM-2 650M, LoRA fine-tuned0.500

3. where added features did beat the standard recipe

on the task the field actually uses โ€” a known antibody, a new strain โ€” i compared the usual recipe (an ESM-2 embedding of Env, one random forest per antibody) against the same thing plus explicit glycan-shield and alignment features. same antibodies, same folds, same metric. it was better on 202 of 234 antibodies, median AUC 0.635 to 0.673 (Wilcoxon p = 2.4 ร— 10-31).

0.30.30.40.40.50.50.60.60.70.70.80.80.90.91.01.0no changeabove the line: your features did betterbelow: ESM-2 alone did betterAUC, ESM-2 embedding onlyAUC, with glycan + alignment features
show the numbers
antibodyepitopevirusesESM-2 onlywith featureschange
EN02_01_D03other2350.5970.781+0.185
PGT145V2 apex7520.6390.782+0.143
VRC41.01V3 glycan2020.6940.824+0.131
PG9RSH N(100f)YV2 apex1950.5870.706+0.119
EN02_05_B08other2340.6210.739+0.118
BG18V3 glycan3740.8070.923+0.116
VRC08other1960.6210.732+0.111
PC39-55Cother1230.5010.608+0.107
PC39-23Aother1230.5300.629+0.098
10-1074V3 glycan11110.8460.944+0.098
PG9V2 apex10180.7480.845+0.097
DH270.6V3 glycan2070.7500.847+0.096
DH270.1V3 glycan2230.7140.810+0.096
VRC02other2010.5740.668+0.094
8ANC195interface2440.7050.798+0.093
VRC01CD4bs17060.7880.880+0.092
PG16V2 apex7340.7040.794+0.091
EN01_007other2200.6680.758+0.090
VRC-CH31CD4bs3680.6640.752+0.088
DH270.5V3 glycan2090.7310.818+0.087
DH270min1V3 glycan2020.7120.799+0.087
N49P18.1other1130.5360.623+0.086
PGT128V3 glycan6630.7560.841+0.086
10-996other1170.8370.920+0.083
PG9RSH DU025V2 apex2020.6530.736+0.083
PC39-17Aother1220.5560.638+0.082
PGT121V3 glycan15280.8110.891+0.080
PC39-50Gother1230.5900.668+0.078
DH270min11V3 glycan2050.7490.827+0.078
PGDM1400V2 apex12580.8250.901+0.076
PGT143V2 apex1500.6000.676+0.075
PGDM12other1330.7260.799+0.073
VRC-PG04CD4bs3100.6070.681+0.073
PGT145 DU303V2 apex2020.6560.728+0.072
2411aother2020.5850.654+0.069
PC39-28Cother1230.6160.685+0.069
b13other1770.6180.686+0.068
GPZ6-a.01other2020.6550.722+0.068
PC39-39Bother1240.5700.636+0.067
PGT142V2 apex2190.5780.644+0.066
PGT130V3 glycan2260.6430.709+0.066
10E8 IgG mutant 5MPER1060.5110.577+0.066
vFP53.02fusion peptide2010.3830.448+0.065
N49P23other1130.5930.658+0.065
1C2-rabbitother1930.5750.639+0.064
4E10MPER9960.7590.822+0.063
SF5other1240.6600.722+0.062
DF1W-a.01other2000.5600.622+0.061
VRC26.25V2 apex5510.7720.833+0.061
MinVRC01CD4bs1270.5900.651+0.060
E51other1600.6230.682+0.060
PGDM21other1320.7560.814+0.059
0PV-c.01other2020.5410.599+0.058
3BNC55CD4bs1150.5360.594+0.058
IOMA-HC-DDEother1220.5300.587+0.057
3BC315other1990.5770.634+0.057
VRC24other2000.5180.575+0.057
V033-a.01other2330.6010.657+0.056
PC39-23Dother1220.6030.659+0.055
PCDN-38Bother1280.6030.659+0.055
ElsE2other1010.6470.703+0.055
PGT126V3 glycan3780.7470.802+0.055
VRC26.08V2 apex3430.7710.826+0.055
AIIMS-P01other910.7260.779+0.053
PCIN71I1aother1290.5560.608+0.052
PC39-50Kother1230.5350.586+0.051
VRC46.01other1990.7770.826+0.050
0PV-a.01other2020.4630.512+0.050
HERH-a.01other2020.6810.731+0.049
PGT135V3 glycan3100.7350.785+0.049
3BNC117CD4bs14090.8460.895+0.049
VRC42.02MPER2020.5580.607+0.049
VRC38.01V2 apex2350.5810.629+0.048
DH270min12V3 glycan2020.6290.677+0.048
0PV-b.01other2020.5560.604+0.048
GPZ6-b.01other2020.6030.651+0.048
VRC03CD4bs3590.7230.771+0.048
ACS202fusion peptide2290.6110.658+0.048
VRC18other1700.6310.678+0.047
VRC07CD4bs4770.6610.708+0.047
DJ85-a.01other2020.6410.688+0.047
vFP16.02fusion peptide1930.5080.554+0.046
DH796.1other2910.6090.655+0.045
vFP20.01fusion peptide2020.5630.608+0.045
F105other2080.5570.603+0.045
VRC07-523-LSCD4bs9020.8020.847+0.045
VRC34.01fusion peptide3400.7310.775+0.044
VRC26.03V2 apex1920.6910.734+0.044
PCDN-33Aother1280.6300.674+0.044
PGT123V3 glycan1650.7740.816+0.042
RHA1.V2.01other2020.5670.609+0.042
PCT64-35MV2 apex2280.6670.708+0.041
PCIN77Dother1290.4160.457+0.041
DH727.2other2910.5590.600+0.041
ElsE1other1010.6660.706+0.040
DFPH-a.01fusion peptide2020.7160.756+0.040
VRC34.01_mm28fusion peptide2020.6200.660+0.040
VRC43.01other2030.6810.720+0.039
PC39-28Eother1230.6530.692+0.039
PGDM11other1050.6620.700+0.039
8ANC134other1680.6440.682+0.039
LJF-0085other820.7210.760+0.038
CH103other2370.7180.756+0.038
PC39-50Iother1230.6380.676+0.038
TRNM-b.01other2020.6970.735+0.038
DFPH-a.03fusion peptide2020.6720.709+0.037
J601-1B2other2020.7600.797+0.037
PCT64-35SV2 apex1180.5670.604+0.037
LJF-0034other820.7470.784+0.036
PCDN-38Aother1280.7010.737+0.036
N49P9.1other1130.6450.680+0.035
DH851.1other1240.6760.711+0.035
RHA10.04other1210.4920.527+0.035
VRC26.09V2 apex1830.7660.801+0.035
gVRC-H1dC38/VRC01LCD4bs1490.6370.671+0.034
PCT64-35OV2 apex1170.4940.528+0.034
PC39-55Dother1240.6050.639+0.034
vFP49.02fusion peptide1990.6820.715+0.033
M1214_N2.2other1160.7620.795+0.033
PGZL1_gVmDmJother1250.6240.657+0.033
2F5MPER9280.9140.947+0.033
VRC26.26V2 apex2310.7050.738+0.033
CH03V2 apex1040.8290.861+0.032
PC39-61Aother1260.5150.547+0.032
PC39-61Bother1260.5830.616+0.032
VRC34-pI4fusion peptide2010.6160.648+0.032
CH04V2 apex1940.7110.743+0.032
PCT64-35BV2 apex1170.5740.605+0.031
447-52Dother3120.7290.760+0.031
2G12V3 glycan7740.8240.855+0.031
IOMAother2310.6260.657+0.031
VRC26.27V2 apex1920.6520.682+0.030
vFP52.02fusion peptide1990.5720.602+0.030
VRC40.02other2020.5870.616+0.029
PCT64-24FV2 apex1180.6590.688+0.029
VRC34-pI3fusion peptide2020.6790.708+0.029
M1214_N1other1160.7160.743+0.027
PCT64-24EV2 apex1150.7570.784+0.027
VRC06other1790.5380.564+0.027
PGT151interface4350.7850.811+0.026
VRC06bother2250.7150.741+0.026
VRC-PG05other2450.6500.676+0.026
ACS117other1190.6700.696+0.026
Bess4other1010.6970.723+0.025
DFPH-a.15fusion peptide2020.7120.737+0.025
G70W-2E9other2020.5870.612+0.025
V031-a.01other1220.6300.654+0.025
PGT127other1500.6040.627+0.024
PCT64-18DV2 apex1190.6310.655+0.024
12A21other1760.7670.790+0.023
PGT125V3 glycan1510.5330.556+0.023
17bother2900.7750.798+0.022
41328-a.01other1230.7160.737+0.021
CH235.12other3670.7310.752+0.021
J038other2030.5540.575+0.021
PC39-50Lother1220.5790.598+0.020
m66.6other1560.7320.752+0.019
NIH45-46CD4bs3410.6480.668+0.019
2408bother2020.5180.537+0.019
HERH-c.01other2020.6380.657+0.019
VRC34.01_Combo1fusion peptide2020.6220.640+0.018
DF1W-a.02other2020.4420.459+0.017
35O22interface3670.7400.757+0.017
PGT152other1140.6130.630+0.017
CH235.9other1930.6560.673+0.017
M4008_N1other1160.7310.747+0.017
CH01V2 apex3340.6970.713+0.016
M1214_N1.2other1160.6310.646+0.015
Z13e1other2400.7000.715+0.015
vFP48.02fusion peptide1980.5160.531+0.015
VRC23CD4bs1750.6300.644+0.015
vFP7.04fusion peptide2020.4060.420+0.015
RHA10.01other1210.4710.486+0.014
VRC44.01other2090.5800.594+0.014
VRC42.I3MPER2020.6120.626+0.014
8ANC131CD4bs1790.5640.577+0.014
PCIN71Lother1290.5100.523+0.013
HJ16other3110.5460.559+0.012
VRC01_FR3-03CD4bs2020.6410.653+0.012
Bess1other1010.6170.629+0.012
VRC-PG20other1770.6810.693+0.012
b12CD4bs7440.7070.719+0.012
DH1317.4fusion peptide1930.8670.879+0.012
IOMAexFACEminother1240.6680.679+0.011
DH851.2other1240.6760.687+0.011
VRC26.01V2 apex1860.6820.691+0.009
M1214_N2other1160.8180.826+0.008
Min12A21other1190.6350.643+0.008
44715-a.01other1200.5640.572+0.008
PGZL1other1250.5990.607+0.008
IOMAmin3other1240.5900.597+0.007
IOMAmin5other1240.5900.597+0.007
42056-a.01other1230.5390.544+0.006
VRC13CD4bs3500.6490.655+0.006
CH02V2 apex1960.7090.714+0.005
2413cother2020.5820.587+0.005
ACS114other1190.8360.840+0.004
VRC27other1740.5830.587+0.004
2413bother2020.4890.492+0.003
ACS101other1370.7140.717+0.003
PCT64-35GV2 apex1170.6130.614+0.001
PCT64-35DV2 apex1170.6040.605+0.000
DH1317.9fusion peptide1360.8350.834-0.001
VRC33.01other2020.5520.551-0.001
VRC44.02other2090.6850.683-0.002
179NC75other2120.5290.527-0.003
VRC16other2310.7420.739-0.003
NC-Cow1other1250.5520.548-0.004
N49P22other1130.6710.667-0.005
HmAb64other2030.4500.445-0.005
DH753other2910.5530.548-0.005
HGN194other900.4940.488-0.005
1B2530other2020.6360.628-0.007
DH851.3other1240.7530.745-0.008
3074other3440.5350.526-0.009
N49P19other1130.6660.656-0.010
6561-a.01other2340.7270.717-0.010
vFP7.05fusion peptide2020.2810.270-0.011
LJF-0024other820.6690.657-0.011
CH235other1980.6300.618-0.012
LJF-0087other820.6210.608-0.013
6070-a.01other1230.6860.672-0.014
vFP1.01fusion peptide2010.4960.480-0.016
VRC-PG04bCD4bs1730.6200.603-0.017
EPTC112other1180.4710.453-0.019
40591-a.01other1230.5380.519-0.019
PCIN71Gother1290.5520.533-0.020
PCIN66BCD4bs1290.6320.609-0.023
2408c.3other2020.6210.592-0.028
2413aother2020.5990.568-0.031
2219other890.6630.627-0.036
VRC26.06V2 apex1940.4220.383-0.040
10E8MPER11760.7580.697-0.061
5695-b.01other1220.5120.441-0.071

4. the gains land where the mechanism predicts

mean-pooling an ESM-2 embedding washes out the N-glycosylation sites that define several epitope classes. putting those sites back explicitly should help most on the glycan-dependent ones โ€” and it does. V3-glycan improved on every single antibody.

ESM-2 embedding onlywith glycan + alignment features
0.550.600.650.700.750.800.85V3-glycan (n=17)17/17 betterV2-apex (n=31)30/31 betterinterface (n=3)3/3 betterCD4bs (n=18)16/18 betterother (n=139)114/139 betterMPER (n=6)5/6 betterfusion peptide (n=20)17/20 better
show the numbers
epitope classantibodiesmedian, ESM-2 onlymedian, with featuresmean gainimproved
V3 glycan170.7470.818+0.07517/17
V2 apex310.6590.713+0.04530/31
interface30.7400.798+0.0453/3
CD4bs180.6450.670+0.03516/18
other1390.6210.657+0.031114/139
MPER60.6850.661+0.0275/6
fusion peptide200.6180.653+0.02717/20

what i'd claim, and what i wouldn't

predicting which strains a brand-new antibody hits, from sequence alone, is not supported by this data. across everything i tried โ€” frozen embeddings, fine-tuning, folded structure, censored IC50 regression โ€” that number sits around 0.68 at best, reached by the simplest interpretable model. scale didn't move it, and the reason is the sample size that counts: 715 antibodies, not 80,000 pairs.

what does hold up: a clean self-sourced dataset with leak-free splits, the measurement showing pooled scores track breadth rather than specificity, and a like-for-like win from glycan and alignment features on the novel-strain task.


โ† back