programming
Alphafold2
MSA (evolutionary information)
    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ROW ATTENTION               β”‚  "Which residues interact?"
β”‚  β€’ Find local patterns       β”‚
β”‚  β€’ Secondary structure       β”‚
β”‚  β€’ Functional motifs         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  COLUMN ATTENTION            β”‚  "How does each position evolve?"
β”‚  β€’ Conservation              β”‚
β”‚  β€’ Functional importance     β”‚
β”‚  β€’ Allowed mutations         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  OUTER PRODUCT MEAN          β”‚  "Which pairs co-evolve?"
β”‚  β€’ Contacts                  β”‚
β”‚  β€’ Correlated mutations      β”‚
β”‚  β€’ MSA β†’ Pair transfer       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ↓
Pair (pairwise features)
    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  TRIANGLE ATTENTION          β”‚  "Is this geometrically valid?"
β”‚  β€’ 3D consistency            β”‚
β”‚  β€’ Triangle inequality       β”‚
β”‚  β€’ Error correction          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ↓
Refined Pair β†’ Structure Prediction

EXample : Enzyme Active site

Catalytic triad (Serine protease):
  His 57, Asp 102, Ser 195

ROW ATTENTION:
  "These three residues are spatially close"

COLUMN ATTENTION:
  His 57:  100% conserved (critical!)
  Asp 102: 100% conserved (critical!)
  Ser 195: 100% conserved (critical!)

OUTER PRODUCT:
  His-Asp: Strong correlation (must maintain charge)
  His-Ser: Strong correlation (hydrogen bond)
  Asp-Ser: Strong correlation (catalytic mechanism)

TRIANGLE ATTENTION:
  His-Asp: 10Γ…
  His-Ser: 8Γ…
  Asp-Ser: 12Γ…
  β†’ Geometrically consistent! βœ“

Example 2:Disulfide Bond

Cys 20 - Cys 80 (disulfide bond)

ROW ATTENTION:
  "Cys 20 and Cys 80 are in same sequence"

COLUMN ATTENTION:
  Cys 20: Highly conserved (structural)
  Cys 80: Highly conserved (structural)

OUTER PRODUCT:
  Cys 20 - Cys 80: VERY strong correlation
  "If one mutates, other must too!"

TRIANGLE ATTENTION:
  Cys 20 - Cys 80: ~2Γ… (disulfide bond length)
  Enforces: "Must be exactly this distance!"

Example Alpha-helix

Helix: residues 10-20

ROW ATTENTION:
  "Residues 10-20 form local pattern"
  "i, i+3, i+4 spacing"

COLUMN ATTENTION:
  Position 10: Hydrophobic (buried)
  Position 14: Hydrophobic (buried)
  Position 18: Hydrophobic (buried)

OUTER PRODUCT:
  10-14: Close (helix turn)
  14-18: Close (helix turn)

TRIANGLE ATTENTION:
  10-14: 5.4Γ… (helix pitch)
  14-18: 5.4Γ… (helix pitch)
  10-18: 10.8Γ… (consistent!)

Why all four?

  • Evolution (column) + Structure (row) + Contacts (outer product) + Geometry (triangle)
  • Each provides unique information
  • Combining them = accurate structure prediction!

hwo many types of mask are there

  • msa_mask
msa_mask = np.ones((10, 110), dtype=np.float32)
# Example:
# [[1, 1, 1, ..., 1],  ← All valid
#  [1, 1, 1, ..., 1],
#  ...]
  • seq_mask
seq_mask = np.ones(110, dtype=np.float32)
# Example: [1, 1, 1, 1, 1, ..., 1]
  • pair_mask
pair_mask = np.ones((110, 110), dtype=np.float32)
# Example:
# [[1, 1, 1, ..., 1],
#  [1, 1, 1, ..., 1],
#  ...]
  • bert_mask
bert_mask = (np.random.uniform((10, 110)) < 0.15).astype(np.float32)
# Example:
# [[0, 0, 1, 0, 0, ..., 0],  ← Random 15%
#  [0, 1, 0, 0, 0, ..., 1],
#  ...]
  • cluster_bias_mask
cluster_bias_mask = np.ones(10, dtype=np.float32)
# Example: [1.0, 1.0, 0.5, 1.0, 0.5, ...]
#                    ↑         ↑
#           Downweighted duplicates

AlphaFold2 Complete Pipeline: From MSA to Structure

Pipeline Overview with Mask Creation and Usage

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    PREPROCESSING PHASE                               β”‚
β”‚                    (Happens ONCE per protein)                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 1: Load Raw MSA (A3M format)
═══════════════════════════════════
Input: alignend_10_Seq.a3m (10 sequences, 1739 positions each)

>sp|P01308|INS_HUMAN
---MALWMR----LLPLL-----ALLALWGPDPAAAFVNQHLCG...
>sp|P01315|INS_PIG  
---MALWTR----LLPLL-----ALLALWAPAPAQAFVNQHLCG...
...

                    ↓

Step 2: Remove Gaps & Create Deletion Matrix
═════════════════════════════════════════════
Query (no gaps): MALWMRLLPLLALLALWGPDPAAAFVNQHLCG...
Length: 110 residues (after removing gaps)

Deletion Matrix [10, 110]:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Seq 0: [3, 0, 0, 0, 0, 0, 4, 0, 0, ...] β”‚  ← 3 gaps before M, 4 before L
β”‚ Seq 1: [3, 0, 0, 0, 0, 0, 4, 0, 0, ...] β”‚
β”‚ Seq 2: [3, 0, 0, 0, 0, 0, 4, 0, 0, ...] β”‚
β”‚ ...                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    ↓

Step 3: Integer Encode MSA
═══════════════════════════
MSA [10, 110]:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ [12, 0, 10, 17, 12, 1, 10, 10, ...] β”‚  ← M=12, A=0, L=10, W=17, etc.
β”‚ [12, 0, 10, 17, 16, 1, 10, 10, ...] β”‚
β”‚ ...                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    ↓

Step 4: CREATE MASKS (Static - Never Updated!)
═══════════════════════════════════════════════

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MSA Mask [10, 110]                                       β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚ β”‚ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1, 1, 1]  β”‚  ← All 1s (all valid)
β”‚ β”‚ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1, 1, 1]  β”‚       β”‚
β”‚ β”‚ ...                                             β”‚       β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ Purpose: Mask padding (none in this case)                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Seq Mask [110]                                           β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚ β”‚ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1, 1, 1]  β”‚  ← All 1s
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ Purpose: Mask invalid residues                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Pair Mask [110, 110]                                     β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚ β”‚ [[1, 1, 1, ..., 1],                            β”‚       β”‚
β”‚ β”‚  [1, 1, 1, ..., 1],                            β”‚  ← All 1s
β”‚ β”‚  ...                                            β”‚       β”‚
β”‚ β”‚  [1, 1, 1, ..., 1]]                            β”‚       β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ Purpose: Mask invalid residue pairs                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ BERT Mask [10, 110] (Training Only!)                     β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚ β”‚ [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, ..., 0, 1, 0]  β”‚  ← 15% are 1s
β”‚ β”‚ [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, ..., 0, 0, 0]  β”‚  (randomly masked)
β”‚ β”‚ ...                                             β”‚       β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ Purpose: Masked language modeling loss                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Cluster Bias Mask [10]                                   β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚ β”‚ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, ...]  β”‚  ← Equal weights
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ Purpose: Weight sequences (downweight duplicates)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    ↓

Step 5: Initialize Pair Representation
═══════════════════════════════════════
Pair [110, 110, 128]:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Relative position encoding (65 features)β”‚
β”‚ Separation encoding (7 features)        β”‚
β”‚ Residue type pairs (40 features)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    ↓

Step 6: Save All Features
══════════════════════════
Output: alphafold2_ready.npz
  βœ“ aatype [110]
  βœ“ msa [10, 110]
  βœ“ deletion_matrix [10, 110]
  βœ“ deletion_mean [110]
  βœ“ pair [110, 110, 128]
  βœ“ msa_mask [10, 110]        ← CREATED HERE
  βœ“ seq_mask [110]            ← CREATED HERE
  βœ“ pair_mask [110, 110]      ← CREATED HERE
  βœ“ bert_mask [10, 110]       ← CREATED HERE (training)
  βœ“ cluster_bias_mask [10]    ← CREATED HERE


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    TRAINING/INFERENCE PHASE                          β”‚
β”‚                    (Masks are USED, not modified)                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 7: Load Features
══════════════════════
features = np.load('alphafold2_ready.npz')
msa = features['msa']                # [10, 110]
pair = features['pair']              # [110, 110, 128]
msa_mask = features['msa_mask']      # [10, 110] ← LOADED
pair_mask = features['pair_mask']    # [110, 110] ← LOADED

                    ↓

Step 8: Evoformer (48 blocks)
══════════════════════════════

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Block 1 of 48                                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ MSA Row Attention                      β”‚             β”‚
β”‚  β”‚   Input: msa [10, 110, 256]            β”‚             β”‚
β”‚  β”‚   Mask:  msa_mask [10, 110] ← USED!    β”‚             β”‚
β”‚  β”‚   ────────────────────────────         β”‚             β”‚
β”‚  β”‚   attention = softmax(QK^T / √d)       β”‚             β”‚
β”‚  β”‚   attention = attention * msa_mask     β”‚  ← Masks padding!
β”‚  β”‚   output = attention @ V               β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ MSA Column Attention                   β”‚             β”‚
β”‚  β”‚   Input: msa [10, 110, 256]            β”‚             β”‚
β”‚  β”‚   Mask:  msa_mask [10, 110] ← USED!    β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ Outer Product Mean                     β”‚             β”‚
β”‚  β”‚   msa β†’ pair update                    β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ Triangle Attention (Starting)          β”‚             β”‚
β”‚  β”‚   Input: pair [110, 110, 128]          β”‚             β”‚
β”‚  β”‚   Mask:  pair_mask [110, 110] ← USED!  β”‚             β”‚
β”‚  β”‚   ────────────────────────────         β”‚             β”‚
β”‚  β”‚   attention = attention * pair_mask    β”‚  ← Masks invalid pairs!
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ Triangle Attention (Ending)            β”‚             β”‚
β”‚  β”‚   Mask:  pair_mask [110, 110] ← USED!  β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ Triangle Multiplication (Outgoing)     β”‚             β”‚
β”‚  β”‚   Mask:  pair_mask [110, 110] ← USED!  β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                    ↓                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚ Triangle Multiplication (Incoming)     β”‚             β”‚
β”‚  β”‚   Mask:  pair_mask [110, 110] ← USED!  β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
         (Repeat 47 more times)
                    ↓

Step 9: Structure Module (8 IPA blocks)
════════════════════════════════════════
Input: refined_pair [110, 110, 128]
Mask:  seq_mask [110] ← USED!

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ IPA Block 1 of 8                        β”‚
β”‚   Invariant Point Attention             β”‚
β”‚   Mask: seq_mask [110] ← USED!          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
         (Repeat 7 more times)
                    ↓

Step 10: Output 3D Structure
═════════════════════════════
Output: atom_positions [110, 37, 3]
        (110 residues, 37 atoms each, xyz coordinates)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    TRAINING LOSS COMPUTATION                         β”‚
β”‚                    (BERT mask used here!)                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 11: Masked MSA Loss (Training Only)
═════════════════════════════════════════

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Predict masked positions                           β”‚
β”‚   predicted_msa = model_output['msa']              β”‚
β”‚   true_msa = batch['true_msa']                     β”‚
β”‚   bert_mask = batch['bert_mask']  ← USED!          β”‚
β”‚                                                     β”‚
β”‚   errors = cross_entropy(predicted, true)          β”‚
β”‚   loss = sum(errors * bert_mask) / sum(bert_mask)  β”‚  ← Only masked positions!
β”‚          ─────────────────────────                 β”‚
β”‚          Only compute loss where bert_mask = 1     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Example with Your Data

Input MSA (alignend_10_Seq.a3m)

10 sequences Γ— 1739 positions (with gaps)
↓ Remove gaps
10 sequences Γ— 110 residues (no gaps)

Deletion Matrix Example

Position:     0   1   2   3   4   5   6   7   8   9  10  11
Sequence 0:  [3,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0, ...]
             ↑                       ↑
             3 gaps before 'M'       4 gaps before 'L'

From: ---MALWMR----LLPLL...
      ^^^      ^^^^
      3 gaps   4 gaps

MSA Mask Example

All positions valid (no padding):
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1],  ← Sequence 0
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1],  ← Sequence 1
 ...
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1]]  ← Sequence 9

If we had padding:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 0],  ← Last position padded
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 0],
 ...]

BERT Mask Example (Training)

Random 15% of positions masked:
[[0, 0, 1, 0, 0, 0, 0, 1, 0, 0, ..., 0],  ← Positions 2 and 7 masked
 [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, ..., 1],  ← Positions 1, 5, and 109 masked
 ...]

Model predicts: What amino acid is at masked positions?
Loss computed: Only at positions where bert_mask = 1

Key Takeaways

  1. Masks are CREATED once during preprocessing
  2. Masks are USED throughout training/inference
  3. Masks are NEVER UPDATED - they're static binary indicators
  4. Purpose: Tell the model which data is real vs padding/masked

Mask Usage Summary

MaskCreatedUsed InPurpose
msa_maskPreprocessingMSA attention (Evoformer)Mask padding
pair_maskPreprocessingTriangle attention (Evoformer)Mask invalid pairs
seq_maskPreprocessingIPA (Structure Module)Mask padding
bert_maskTraining data augLoss computationMasked LM loss
cluster_bias_maskPreprocessingMSA weightingDownweight duplicates