wikillm

Paper · 2022-06-27 · cs.LG, q-bio.QM

ProGen2: Exploring the Boundaries of Protein Language Models

Next-token transformers for protein sequences, from 151M to 6.4B parameters, trained on UniRef90, BFD, metagenomic and antibody (OAS) sequences. Larger models lower held-out perplexity, but zero-shot fitness ranking peaks at 764M. Generated sequences are often predicted to fold like natural proteins at low sequence identity. Author-reported.

Language model pretrainingNeural scaling lawsNucleus (top-p) samplingproteinprotein-designlanguage-modelautoregressivescalingzero-shot

arXivPDFCodeMarkdown18 min read

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

In plain words

A protein is a long string of letters, one per building block. This work treats those strings the way large language models treat text: train a model to guess the next letter, feed it a very large pile of real protein sequences, and make the model bigger. Once trained, the same model can write new sequences and can score how plausible a given sequence looks.

The authors build a family of such models, from a small one to one with 6.4 billion parameters. The training data mixes sequences from several databases, including antibody sequences from immune repertoires. They ask three questions: how well the models predict held-out natural sequences, whether the sequences they write are new yet look like real proteins, and whether their scores predict how well a protein variant works in a lab measurement.

The most interesting answer concerns the third question. The biggest model is not the best at ranking variants of lab-measured proteins; a mid-sized model does better there. The authors read this as a sign that the data a model learns from matters as much as its size.

TL;DR

ProGen2 is a family of decoder-only transformers trained with next-token prediction on protein sequences, from 151M to 6.4B parameters §3.1 tab. 1. Larger models give lower held-out perplexity §4.1 tab. 2, but zero-shot fitness ranking peaks at 764M parameters and does not improve with size in general §4.3 tab. 3. Generated sequences are often predicted to fold like natural proteins, usually at low sequence identity §4.2 fig. 1. The official repository is BSD-3 licensed and contains inference and likelihood code, but not the training code or the training data README.md. All numbers are author-reported.

Problem

Engineering a protein usually means directed evolution: mutate a starting sequence, measure each variant, and repeat §1. Models that help choose variants have been either family-specific or universal. Family-specific models depend on alignments, which are shallow for proteins with few relatives, hard to align for families such as antibodies, and need new sequences aligned to the training set §2. Transformer models trained on unaligned sequences avoid these problems, and autoregressive ones had already been applied to fitness prediction §2.

The paper asks what happens when model size and data are both scaled up, and it measures three things: how well the model captures the distribution of natural sequences, how well it generates novel sequences, and how well its likelihood ranks experimentally measured variants without fine-tuning on those variants §1 §4.

Method

ProGen2 models are autoregressive transformers trained with a next-token language-modelling loss. The family is trained at 151M, 764M, 2.7B and 6.4B parameters §3.1. The architecture is a standard decoder with left-to-right causal masking, rotary positional encodings, and an attention block and a feed-forward block that run in parallel on the same normalised input §3.1. The paper states the residual update as x(t+1) = x(t) + attn(ln(x(t))) + mlp(ln(x(t))), in place of the sequential form §3.1.

Pretraining data is a mixture of UniRef90 and BFD30 for the standard models; a second variant mixes UniRef90 with representative clusters from UniProtKB, Metaclust, SRC and MERC, and is called BFD90 §3.2. The antibody model is trained on 554M antibody sequences from the Observed Antibody Space, clustered at 85% identity §3.2. Each sequence is wrapped in a one- or two-character terminal token at each end, then provided "as-is and flipped" §3.2. Proteins are packed into a batch until the maximum token length is filled §3.2.

Steps, as the paper describes them:

  1. Wrap each protein with a 1- or 2-character terminal token at each end §3.2.
  2. Provide the sequence as-is and flipped. The paper does not say how the two orientations are weighted §3.2.
  3. Pack several proteins to fill the maximum context length §3.2.
  4. Pretrain with Adam and gradient-norm clipping. Learning rate, clipping and length come from tab. 1 §3.3.
  5. Watch the global gradient norm. The paper treats a rising norm as a sign of divergence from the expected power-law trend. Lowering the learning rate, raising weight decay and lowering the clipping threshold kept the norm near constant §3.3.
  6. Fine-tune on a narrow family: re-initialise both Adam moment estimates, cut the initial learning rate by a factor of 5, and train for at most two epochs §3.3.
  7. Generate with temperature and nucleus sampling, then cut each sample at the first terminal token §3.4.
  8. Score a sequence by its average log-likelihood under the model for zero-shot fitness §4.3.

The perplexity used in the language-modelling evaluation is stated inline, with no equation number:

ppl(x) = \exp\left(-\frac{1}{n} \sum_{i=1}^{n} \ln p(x_i)\right) §4.1

The paper gives no numbered equations and no algorithm blocks. The pseudocode below is a reading of the code, cited to the repository; it is not a copy of it.

Pseudocode
# One ProGen2 decoder block: attention and MLP share one normed input
# [§3.1] [code: progen2/models/progen/modeling_progen.py#L261-L275]
def block(hidden):
    # One pre-norm; both branches read this normalised copy  [§3.1]
    normed = layer_norm(hidden)
    # Parallel residual: x + attn(ln(x)) + mlp(ln(x))  [§3.1]
    hidden = hidden + attention(normed) + mlp(normed)
    return hidden
Pseudocode
# Causal multi-head attention, partial rotary embedding
# [§3.1] [code: progen2/models/progen/modeling_progen.py#L147-L222]
def attention(normed):
    # One fused projection without bias; split order is query, value, key
    # [code: progen2/models/progen/modeling_progen.py#L157-L164]
    fused = linear_no_bias(normed)            # (B, N, 3d)
    query, value, key = split_heads(fused)    # (B, H, N, d_head) each
    # Rotary embedding on the first rotary_dim dims of each head, base 10000
    # [code: progen2/models/progen/modeling_progen.py#L38-L44, #L178-L190]
    query = rotate_first_dims(query, rotary_dim)
    key = rotate_first_dims(key, rotary_dim)
    # Scaled dot product with causal mask; scores kept in float32
    # [code: progen2/models/progen/modeling_progen.py#L122-L135]
    scores = query @ transpose(key) / sqrt(d_head)
    scores = mask_future_positions(scores)    # fill with -1e9
    weights = softmax(scores)
    # Output projection without bias  [code: ...modeling_progen.py#L215]
    return linear_no_bias(weights @ value)
Pseudocode
# Sample a continuation with temperature and nucleus (top-p) sampling
# [§3.4] [code: progen2/sample.py#L69-L75]
def generate(context, temperature, top_p, max_length):
    # Encode the context; the default context is the token "1"
    # [code: progen2/sample.py#L121]
    tokens = encode(context)
    # Sample each next token from the temperature-scaled distribution,
    # restricted to the smallest set whose probability reaches top_p
    tokens = sample_nucleus(tokens, temperature, top_p, max_length)
    # Cut after the first terminal tag after position 0
    # [code: progen2/sample.py#L78-L87, #L194]
    return truncate(decode(tokens), terminals=["1", "2"])
Pseudocode
# Zero-shot score: average log-likelihood over both reading directions
# [§4.3] [code: progen2/likelihood.py#L285-L296]
def fitness_score(sequence):
    # Mean log-likelihood of the sequence read left to right
    forward = mean_log_likelihood(sequence)
    # Same score on the reversed string, tags included  [likelihood.py#L287]
    backward = mean_log_likelihood(reverse(sequence))
    # The code averages the two directions  [likelihood.py#L296]
    return 0.5 * (forward + backward)
Pseudocode
# Mean log-likelihood with the softmax restricted to letter tokens
# [code: progen2/likelihood.py#L174-L200]
def mean_log_likelihood(sequence):
    # Next-token logits and targets, shifted by one position  [§4.1]
    logits, targets = next_token_pairs(sequence)
    # Drop a trailing BOS/EOS id, then keep only ids 5..29
    # [code: progen2/likelihood.py#L184-L195]
    logits, targets = restrict_to_letters(logits, targets, 5, 29)
    return -cross_entropy(logits, targets, reduction="mean")

Hyperparameters

Complete model and optimiser table, as printed in the paper. Values are copied from the table; the unit of batch size is not stated tab. 1.

Hyper-parameterProGen2-smallProGen2-mediumProGen2-baseProGen2-largeProGen2-xlarge
Number of params151M764M764M2.7B6.4B
Number of layers1227273232
Number of heads1616163216
Head dimensions64969680256
Context length1,0241,0242,0481,0241,024
Batch size500k500k500k500k1M
Learning rate6.0e-42.5e-42.0e-40.8e-40.1e-4
Weight decay0.10.10.10.10.1
Grad norm clip1.01.00.80.80.8
Warm-up steps3,0003,00010,00010,00010,000
Total steps350,000350,000400,000400,000350,000

Derived, not stated: heads multiplied by head dimension gives a model width of 1024 (small), 1536 (medium and base), 2560 (large) and 4096 (xlarge) tab. 1.

Other settings, from the text and from the paper's evaluation section:

NameValueWhereNotes
OptimiserAdam, beta1 0.9, beta2 0.999, epsilon 1e-8§3.3Whether weight decay is decoupled (AdamW) is not stated.
Learning-rate scheduleWarm-up, then cosine annealing, after GPT-3§3.3Warm-up shape and final learning rate are not stated.
Hardware and parallelismTPU-v3, JAX, pjit, data and model parallelism§3.3Number of chips and training time are not stated.
Fine-tuningAdam moments reset; initial learning rate divided by 5; at most 2 epochs§3.3Base learning rate for fine-tuning is not stated.
Large-model fine-tune1M sequences from Gene3D and CATH (CATH 3.30)§4.2Two epochs; checkpoints after epoch 1 and epoch 2 compared.
OAS clustering554M sequences after Linclust at 85% identity, cov-mode 1§3.2Other Linclust parameters are defaults, as the paper says.
Test setsTest-max90 and Test-max50, held-out clusters at 90% and 50% identity§3.4Clusters from the Uniref90+BFD30 set.
Universal samplingTemperature {0.2, 0.4, 0.6, 0.8, 1.0} x top-p {0.5, 0.7, 0.9, 1.0}; 5,000 sequences from xlarge§3.4 §4.2Whether 5,000 is the total or per setting is not stated.
Fine-tune samplingTemperature {0.2 ... 1.0} x top-p {0.7, 0.9, 1.0}; 10,000 sequences per checkpoint§3.4 §4.2Per-checkpoint count derived from the "20,000 sequences" total in §4.2.
Antibody sampling52K unprompted and 470K prompted (EVQ start), temperature and top-p grids§3.4 §4.2Prompted sets use temperature {0.2 ... 1.0} x top-p {0.5, 0.7, 0.9, 1.0}.
Structure predictionAlphaFold2, single-sequence input, PDB templates; 3 recycles (universal), 1 recycle (fine-tuned); 5-model pTM ensemble§3.4Recycle count differs by experiment.
Antibody structureIgFold, 4-model ensemble, PyRosetta refinement§3.4
DevelopabilitySAP score; CamSol-intrinsic web server§3.4Solubility computed from sequence.
Sequence identityMMseqs2§3.4
Structural similarityTM-score via Foldseek§3.4
Default sampling in codeTemperature 0.2, top-p 0.95, max length 256, seed 42sample.pyNot the paper's settings; see Paper vs code.
Default architecture in codeVocabulary 50400, context 2048, width 4096, 28 layers, 16 heads, rotary_dim 64, GELU (gelu_new), LayerNorm eps 1e-5, dropout 0, init std 0.02configuration_progen.pyDefaults, not per-checkpoint values.
Terminal tokens"1" and "2"sample.pyBos/eos ids 3 and 4, letter ids 5 to 29 likelihood.py.

Results

Author-reported. Setup, in short: language modelling on held-out Test-max90 and Test-max50 sets §3.4 tab. 2; generation of 5,000 sequences from ProGen2-xlarge, with structures predicted and compared with the PDB §4.2; zero-shot Spearman correlation on narrow and wide fitness landscapes and on antibody landscapes §3.4 §4.3.

Headline results:

  • Perplexity falls as models grow. Test-max90 goes from 12.9 (151M) to 9.9 (6.4B) tab. 2.
  • Narrow landscapes, average Spearman rho: ProGen2-base 0.505 is the best single ProGen2 size; an ensemble column reaches 0.518; ProGen2-small 0.456 is above RITA-XL at 0.443 tab. 3.
  • Across 5,000 xlarge-generated sequences, the paper reports a median TM-score of 0.89 and median pLDDT of 73.7 §4.2.
  • Antibody landscapes: ProGen2-small has the best binding average (0.44); ProGen2-xlarge has the best general-property average (0.74) tab. 5.

Table 2: Perplexity of held-out sequences tab. 2.

ModelParameters (N)Test-max90 (ppl)Test-max50 (ppl)
ProGen2-small151M12.915.0
ProGen2-medium764M11.214.3
ProGen2-large2.7B11.114.4
ProGen2-xlarge6.4B9.913.9

Table 3: Zero-shot fitness, narrow landscapes, average Spearman rho. Bold marks are as printed in the paper. Baseline values are taken from Hesslow et al. (RITA) according to the caption tab. 3.

ModelAverage rho
ProGen2-small0.456
ProGen2-base0.505
ProGen2-large0.485
ProGen2-xlarge0.476
ProGen2-ensemble0.518
RITA-XL0.443
EVE0.511
Tranception (no retrieval)0.447
Tranception (retrieval)0.503
MSA Transformer0.476
ESM-1v (single)0.475

Table 4: Zero-shot fitness, wide landscapes tab. 4.

Dataset [metric]ProGen2-smallProGen2-baseProGen2-largeProGen2-xlarge
AAV [AUC]0.590.620.650.68
GFP [AUC]0.510.640.840.84
CM [AUC]0.680.720.660.64
GB1 [top100avg]0.010.010.240.85

Table 5: Zero-shot fitness, antibody landscapes, averaged tab. 5.

Antibody propertyProGen2-smallProGen2-baseProGen2-largeProGen2-xlargeProGen2-OAS
binding [avg rho]0.440.410.420.400.37
general [avg rho]0.610.730.730.740.66

Table 6: Zero-shot fitness on indel datasets, from Notin et al. (Tranception) tab. 6, appendix A.

DatasetProGen2-baseTranceptionTranception (retrieval)WaveNet
A0A1J4YT16_9PROT_Davidi_20200.1950.1780.1910.117
B1LPA6_ECOSM_Russ_20200.4050.3210.4150.385
BLAT_ECOLX_indels0.6640.2960.3570.546
PTEN_HUMAN_Mighell_2018_deletions0.6410.5630.5980.699
CAPSD_AAV2S_Sinai_2021_indels0.3920.5490.5860.457
HIS7_YEAST_Pokusaeva_2019_indels0.7020.7070.6920.68
P53_HUMAN_Kotler_2018_deletions0.3980.3950.4010.001
AVERAGE0.4850.4300.4630.412

Table 7: Full antibody results tab. 7, appendix A.

PropertyProGen2-smallProGen2-baseProGen2-largeProGen2-xlargeProGen2-OAS
g6_bind0.1640.1530.1520.1350.032
g6_exp0.4110.3860.3680.3520.184
d44_bind0.2900.4260.4210.3660.260
C143_Kd0.1620.1970.1320.0850.006
C143_Tm1.0001.0001.0001.0001.000
MEDI8852UCA_Kd0.4660.9130.9160.9020.798
MEDI8852UCA_Tm0.3140.8290.8290.8290.771
MEDI8852_Kd0.5040.0070.0210.0430.157
MEDI8852_Tm1.0001.0001.0001.0001.000
REGN10987_Kd0.5200.3270.3770.4620.396
REGN10987_Tm0.2380.8100.7620.6670.667
S309_Kd0.7280.5260.5860.5810.600
S309_Tm0.8300.7700.7580.7940.794
mAb114-mAb114UCA_Kd0.6580.7690.7270.6580.738
mAb114-mAb114UCA_Tm0.5000.3330.3830.5170.200
AVERAGE0.5190.5630.5620.5590.507

Table 8: Two 2.7B models trained on different metagenomic mixes tab. 8, appendix A.

MetricUniref90+BFD30Uniref90+BFD90
test set [ppl]12.712.6
antibody binding [rho]0.420.38
antibody general [rho]0.730.76
narrow landscape avg [rho]0.490.50
AAV [auc]0.650.67
GFP [auc]0.840.79
CM [auc]0.660.65
GB1 [top100avg]0.240.33

Table 9: Full narrow-landscape results, Spearman rho per dataset tab. 9, appendix A. The average row matches Table 3. Bold marks appear only in the average row of the source.

DatasetsmallbaselargexlargeensembleRITA-XLEVETranceptionTranception (retrieval)MSA Transf.ESM-1v (single)
A0A192B1T2 Haddox 20180.4870.4410.4830.4600.4900.5000.5100.5100.5090.5100.490
A0A2Z5U3Z0 9INFA Doud 20160.4860.5730.5550.5630.5840.5400.5340.5390.5490.1600.510
AMIE PSEAE Wrenbeck 20170.5840.5580.5800.5490.5930.5600.5580.5010.5850.6100.610
B3VI55 LIPST Klesmith 20150.4250.5840.5380.5960.5910.4500.4360.4910.4680.5300.480
BLAT ECOLX Deng 20120.4510.5330.4800.4390.5290.4000.5060.3810.4800.5600.530
BLAT ECOLX Firnberg 20140.6060.6840.6020.5050.6720.5600.7410.5210.6780.7400.680
BLAT ECOLX Jacquier 20130.5640.6360.5740.4780.6470.5600.7420.5390.6830.7000.680
BLAT ECOLX Stiffler 20150.5860.6660.5690.4700.6510.5700.7400.5180.6670.7300.690
BRCA1 HUMAN Findlay 20180.2450.4410.4250.4550.4600.0700.3220.5380.5740.4000.440
CALM1 HUMAN Weile 20170.2920.3310.3490.3540.3560.2700.2440.3060.2830.2540.246
DLG4 RAT McLaughlin 20120.4400.4560.3640.3510.4170.3700.5230.3040.4460.5070.565
GAL4 YEAST Kitzman 20150.3490.4660.4370.5690.5170.3500.5110.3260.5260.5830.441
HSP82 YEAST Mishra 20160.5280.5590.4990.4940.5360.5300.5370.5030.5300.4820.568
IF1 ECOLI Kelsic 20160.4850.5130.4770.4920.5220.4200.5250.5480.5090.2270.538
KKA2 KLEPN Melnikov 20140.3230.5380.5340.5840.5930.5600.5970.5840.5840.5760.614
MK01 HUMAN Brenan 20160.1820.0570.0760.0680.0480.0500.2510.0340.1390.1530.183
MTH3 HAEAE Rockah 20150.4790.7110.6840.7100.7170.6800.7100.6730.6550.6870.701
P84126 THETH Chan 20170.5010.5730.5600.6570.6350.5500.5670.5330.5410.6310.546
PABP YEAST Melamed 20130.5550.6330.6390.6440.6540.6800.6390.6410.6890.6620.665
PA I34A1 Wu 20150.3010.5720.5640.5690.5720.5400.5390.5410.5720.3830.054
POLG HCVJF Qi 20140.5240.5220.5130.5890.5620.4400.6140.5250.5770.6000.605
Q2N0S5 9HIV1 Haddox 20180.5100.3720.4230.3190.4120.3500.4960.4120.4920.4900.496
Q59976 STRSQ Romero 20150.7080.7590.7560.7560.7710.6500.6470.6450.6590.6740.506
RASH HUMAN Bandaru 20170.4290.4100.3750.3190.4080.4000.4540.3770.4470.4150.359
RL401 YEAST Mavor 20160.4820.4540.4780.4600.4860.4300.3640.3310.3680.3780.297
RL401 YEAST Roscoe 20130.5520.5470.5490.5390.5660.4900.4210.3920.4190.4340.314
RL401 YEAST Roscoe 20140.4260.3990.3790.3640.4080.3900.4010.3430.4040.3650.254
SUMO1 HUMAN Weile 20170.5320.5360.5130.4340.5130.3900.5310.4240.4880.4230.430
TPK1 HUMAN Weile 20170.1810.3600.3350.3820.3800.2900.2300.3130.3140.2680.284
TPMT HUMAN Matreyek 20180.4510.4940.4780.4410.5130.5100.5480.4450.5220.5080.540
TRPC SACS2 Chan 20170.5030.5590.5250.5170.5730.5700.5770.5510.5850.6290.606
TRPC THEMA Chan 20170.4750.3770.4150.4740.4250.4500.4200.4530.4360.4740.472
UBC9 HUMAN Weile 20170.4810.5250.5070.4990.5240.4500.5380.4330.4850.5030.479
UBE4B MOUSE Starita 20130.4520.4290.4100.2920.4200.3000.4760.2560.3880.3470.462
YAP1 HUMAN Araya 20120.3680.4040.3440.2810.3860.1900.4380.2180.3590.0710.281
AVERAGE0.4560.5050.4850.4760.5180.4430.5110.4470.5030.4760.475

Figures, described in words because images are not supported yet:

  • fig. 1: Universal generations from ProGen2-xlarge §4.2. Panel A plots AlphaFold2 confidence (pLDDT) against structural similarity to the nearest PDB protein (TM-score). Panels B to D show three generated structures: a solenoid fold with 11.2% identity to its nearest PDB homologue; a multi-domain alpha+beta fold with no structural homologue above a low TM-score (0.283, 11.1% identity); and a beta-roll fold resembling the RTX domain (TM-score 0.374, 30.3% identity) §4.2.
  • fig. 2: ProGen2-large fine-tuned on two-layer sandwich proteins (CATH 3.30), after one and after two epochs §4.1 §4.2. Panels A and B show that more fine-tuning gives generations closer to natural sequences, and that higher temperature or top-p gives more sequence diversity. Panels C and D show that more restrictive sampling gives structures closer to PDB proteins. Panels E to G show that structural novelty concentrates in ligand-binding regions.
  • fig. 3: Antibody generation from ProGen2-OAS §4.2. Unprompted and EVQ-prompted generations are compared on sequence identity to the training set, on aggregation propensity (SAP score) and on solubility (CamSol-intrinsic), across temperature and top-p. Less restrictive sampling gives lower aggregation and higher solubility. Re-ranking with ProGen2-base improves solubility for the top 50% but does not significantly reduce aggregation fig. 3.

Paper vs code

Checked at commit c27a419c234a0997923761e1fe7daffcebf0eaf5. The repository holds inference and likelihood code (progen2/sample.py, progen2/likelihood.py), a PyTorch model and configuration, a tokenizer file, and a README. It does not contain training code, training data, or the per-checkpoint configuration files that the README downloads README.md.

  • Layer counts. The paper gives 12, 27, 27, 32 and 32 layers tab. 1. The code default is 28 layers configuration_progen.py, which matches no row. The per-checkpoint value lives in the downloaded checkpoints, which were not fetched here, so the paper's Table 1 is the only stated source.
  • Heads and width. The code default of 16 heads and width 4096 configuration_progen.py matches the paper's xlarge row for heads and head dimension (16 and 256) tab. 1.
  • Parallel block. The code uses one normalisation for both branches and sums attention, MLP and residual modeling_progen.py. This agrees with the residual form in §3.1.
  • Rotary embedding. The paper does not give a rotary dimension. The code applies rotary embedding to the first rotary_dim dimensions of each head, with a default of 64, base 10000, and interleaved pairs modeling_progen.py configuration_progen.py.
  • Fused projection order. The code splits the fused projection into query, value and key, in that order modeling_progen.py. The paper does not describe this layout. The code also hard-codes a logical split of 8 groups, with a TODO comment about it modeling_progen.py.
  • Sampling defaults. The code defaults to temperature 0.2, top-p 0.95 and max length 256 sample.py. The README example uses temperature 0.8, top-p 0.9 and max length 1024 README.md. The paper reports sweeps over temperature and top-p, not one headline setting §3.4.
  • Scoring. The paper defines perplexity but not the zero-shot score used in Tables 3, 4 and 9 §4.1 §4.3. The code's likelihood.py averages the forward and reversed scores and can return sum or mean likelihood.py. The paper does not say whether this produced its tables.
  • Softmax normalisation. The sanity check in sample.py uses the full-vocabulary cross entropy sample.py. The scoring in likelihood.py restricts the softmax to 25 letter tokens (ids 5 to 29) likelihood.py. The paper's perplexity formula does not say which is used §4.1.
  • Sequence orientation. The code's sanity sequences show both orders: one starts with the tag "2" and ends with "1", and two start with "1" and end with "2" sample.py. The default generation context is "1" sample.py. The paper does not assign the tags to N- or C-terminal positions.
  • Oracle values. The code's own sanity check requires the cross entropy of a fixed sequence to be within 0.1 of a per-checkpoint value. On the UniRef-style sequence: small 2.4, medium 1.9, base 1.9, large 1.8, xlarge 1.0. On the OAS sequence the OAS model gives 0.3, and on the BFD sequence the BFD90 model gives 1.3 sample.py. These values are not in the paper and can serve as a check for a re-implementation.
  • Model naming. The code's checkpoint names map to the paper's models: progen2-small, -medium, -base, -large, -xlarge, -oas and -BFD90 sample.py. The code's size grouping (151M, 754M, 2B, 6B) differs slightly from the paper's rounding.
  • License. The repository is BSD-3-Clause LICENSE.txt. Two model files are adapted from HuggingFace transformers code under Apache-2.0 modeling_progen.py. The README states that code and models are BSD-3 licensed README.md.

Pitfalls

  • Layer count is not in the code. Use Table 1 for the paper's sizes tab. 1, and read config.json from the checkpoint before building a model. The code default of 28 layers is not any paper size.
  • Training is not reproducible from this repository. No training loop, data pipeline or data-mixing script is included. Learning-rate warm-up shape, final learning rate, weight-decay style, batch-size unit and the number of accelerators are not stated §3.3 tab. 1.
  • Fused projection layout. A re-implementation must split the fused query/value/key projection in the same order as the code to load the weights modeling_progen.py.
  • Activation and MLP width. The paper does not name its activation or MLP width. The code defaults to GELU (gelu_new) and to four times the width configuration_progen.py modeling_progen.py.
  • Attention numerics. Attention scores are computed in float32 and scaled by the square root of the head dimension. The causal mask fills with -1e9, and the padding mask adds -10000 modeling_progen.py. The paper does not mention these choices.
  • Scoring ambiguity. The zero-shot score is undefined in the paper: sum or mean, which direction, whether tags are scored, and whether the softmax is restricted. The code makes choices that the paper does not state likelihood.py.
  • Orientation and augmentation. The paper says sequences are used "as-is and flipped" but not how often each orientation is seen in training §3.2.
  • Sampling counts. "5,000 sequences" for the universal experiment is not clearly per setting or in total §3.4 §4.2. Fine-tuned generation gives 10,000 per checkpoint, derived from the 20,000 total §4.2.
  • Non-monotone table. Test-max50 perplexity is 14.3 for medium and 14.4 for large tab. 2. The text says larger models yield "substantially lower" perplexities §4.1.
  • Ensemble column. Table 3 reports an ensemble at 0.518 tab. 3. The paper does not define how the ensemble is formed. The text says ProGen2-base is "the best performing ProGen2 size" and that the best model "outperforms or matches" the baselines §4.3 tab. 3.
  • Antibody claim. The text says the OAS model "performs poorly" §4.3. On the general-property average, OAS (0.66) beats ProGen2-small (0.61), and it is below the three larger universal models tab. 5.
  • Single-landscape emergence claim. The "emergent behavior" on GB1 rests on one landscape, where the top-100 average jumps from 0.24 (large) to 0.85 (xlarge) §4.3 tab. 4. Treat it as an observation, not a general result.
  • Baselines are copied. The baseline numbers in Table 3 and Table 9 are taken from Hesslow et al. (RITA), as the caption says tab. 3. They were not re-run here.
  • Unexplained baseline. The WaveNet column in Table 6 is not described in the text tab. 6.
  • Structure metrics depend on settings. Generation is scored with AlphaFold2 using single-sequence input and one or three recycles, and with TM-score via Foldseek §3.4. Changing those choices changes the reported medians.
  • Table and figure numbers are counted in LaTeX source order, because the compiled PDF was not read. Check them against the PDF if numbers disagree.

Lineage

  • Builds on: the authors' earlier ProGen model, which is fine-tuned on lysozyme families §2. The architecture follows GPT-3 hyperparameter choices §3.1 §3.3, the GPT-J parallel attention and MLP layout §3.1, and rotary positional encodings §3.1.
  • Compared against: RITA-XL, EVE, Tranception (with and without retrieval), MSA Transformer and ESM-1v on zero-shot fitness tab. 3 tab. 9; Tranception and WaveNet on indels tab. 6; IgLM is discussed for antibody generation §2.
  • Superseded by: not stated in this card.

Source and license

Adapted from “ProGen2: Exploring the Boundaries of Protein Language Models” by Erik Nijkamp, Jeffrey Ruffolo, Eli N. Weinstein, Nikhil Naik, Ali Madani (arXiv:2206.13517), 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/salesforce/progen at commit c27a419c234a (BSD-3-Clause). Any quoted code is shown under that license.