Q&A — How JEPA chooses its prediction targets, and whether they cover the whole input¶
Origin. This note expands one sentence in Part 7a §2 — "the held-out target is a masked region of the same input." That phrasing is a deliberate simplification to keep the main argument moving; the full story is collected here so the tutorial flow stays uncluttered. No new prerequisites — if you have read Part 7a §1 (the two streams) you have everything you need.
The question¶
When JEPA trains, it splits an input into a part the encoder sees and a part it must predict. Three natural questions follow, and they are easy to get subtly wrong:
- Does JEPA predict a single held-out patch, or a set of them — and if a set, is it just a random pick?
- What is the right name for the patches the encoder is given (versus the ones held out)?
- Do the "given" and "held-out" sets together make up the whole input, or can some patches be left over, belonging to neither?
We take a \(14 \times 14\) patchified image as a running example: \(14 \times 14 = 196\) patches total, each a token the encoder can ingest.
1. Two named sets: context and target¶
First, the vocabulary, because the loose word "visible" hides a precise split. Every patch in a given training step plays one of two roles:
- Context (the visible set) — the patches fed to the online encoder \(f_\theta\). Call this set \(C\).
- Target (the held-out set) — the patches held back, whose representations the model must predict. Call this set \(T\). Their representations are produced by the EMA target encoder \(f_{\bar\theta}\), and the predictor must reproduce them from the context alone.
So both sets are part of training — they are not "train versus test." They are two roles within one step: \(C\) is what the online stream sees, \(T\) is the goalpost the target stream provides (Part 7a §1). The loss pulls the predicted target representations toward the EMA target's, in latent space:
Here \(g_\phi\) is the predictor, "positions of \(T\)" is the query telling it where to predict, and \(\mathrm{sg}\) is the stop-gradient that freezes the target as a fixed goalpost. Your understanding is correct: a subset is encoded, another subset is held out, and the held-out subset's predicted embeddings should match the target branch's embeddings for those same patches. The one refinement is the naming — context and target, both inside training.
2. Not one patch — usually several, and how they are chosen matters¶
The held-out set \(T\) is almost never a single patch. In the canonical image recipe — I-JEPA (Assran et al., 2023) — the targets are multiple contiguous blocks, typically about four, each a rectangular region of many patches (a random scale of roughly 15–20% of the image, a random aspect ratio). The context \(C\) is then one large block (scale roughly 85–100%) with any patches that overlap a target block removed, so \(C\) and \(T\) never share a patch.
So on our \(14 \times 14\) image, a single target block at ~17% scale is on the order of ~30 patches, and with several such blocks the held-out set is a sizable minority of the 196; the context is most of what remains. "Predict one random patch" is not the picture — it is "predict a handful of held-out blocks from one large context."
Is the pick random? Yes — but the geometry of the randomness is a real design choice, not a throwaway detail:
- Block (contiguous) masking, as in I-JEPA: hold out whole regions. This forces semantic prediction — to fill a contiguous hole you must infer content, not interpolate neighboring texture. I-JEPA's own ablations show this matters a great deal for images.
- Scattered (per-patch) masking: hold out individual patches at random. Easier, and weaker for images — a missing patch can often be guessed from its immediate neighbors.
Which is right is modality-dependent. Blocks make sense only when tokens have neighborhood structure (image patches, video tubelets). For tokens with no spatial adjacency — for instance gene-group tokens in the single-cell setting, where each token is an arbitrary group of genes — there are no blocks to form, so scattered per-token masking is the natural choice. This is why the number and shape of targets is a knob, not a constant.
In this project's code. The minimal implementation here uses scattered masking: a random permutation of the tokens, the first
n_targetof them held out as \(T\), the rest as \(C\), one shared split per batch. It is the stripped-down cousin of I-JEPA's block masking — appropriate because the project's bio tokens are non-spatial, and clean enough to read in a few lines.
3. Do context and target cover the whole input?¶
Now the sharp question, and the answer is two-part.
They are always disjoint. A patch is either encoded as context or held out as a target, never both — JEPA explicitly removes any target patch from the context (otherwise the model could see the answer it is meant to predict). So \(C \cap T = \varnothing\), always.
Their union may or may not be the whole image — it depends on the scheme.
- Exact-partition masking (this project's per-token split): every token is assigned to exactly one of \(C\) or \(T\), so \(C \cup T\) is all 196 patches. No leftovers. With
n_target = 12out of, say, 50 tokens, that is 12 held out and 38 as context, covering everything. - Canonical I-JEPA (large context block + several target blocks): the context is a single rectangle at 85–100% scale, not "all patches except the targets." So a patch that lies outside the context block and outside every target block is simply unused that step — a genuine leftover. With context scale exactly 1.0 there are no leftovers; with scale below 1.0 there generally are.
So, to your question directly: the two sets do not have to tile the whole image. They are guaranteed disjoint, but whether they are also exhaustive is a property of the masking scheme — exhaustive in the simple per-token partition, generally not exhaustive in I-JEPA, where leftover patches are normal.
flowchart LR
subgraph IMG["the 196 patches"]
C["context C<br/>(encoded by f_θ)"]
T["target T<br/>(held out, encoded by f_θ̄)"]
L["leftover<br/>(unused this step)"]
end
note["disjoint always (C ∩ T = ∅);<br/>exhaustive only in per-token partition —<br/>I-JEPA leaves a leftover region"]
classDef io fill:#f8fafc,stroke:#94a3b8,color:#0f172a;
classDef accent fill:#eef2ff,stroke:#6366f1,color:#1e1b4b;
class C,T io;
class L accent;
4. Settled versus open¶
To separate what is fixed from what is a tunable lever:
- Settled (the JEPA template): there are usually several held-out targets, chosen randomly, held out from the context, with their target representations coming from the EMA encoder over the input. Context and target are disjoint by construction.
- A real design lever (modality-dependent, still tuned per task): how many targets, how large, block versus scattered, the context scale, and therefore whether leftovers exist. These genuinely move JEPA's representation quality — which is exactly why an implementation exposes them as parameters rather than baking in one choice.
One-line answer. JEPA predicts several held-out regions, not one; the split into context (visible) and target (held-out) is always disjoint but not necessarily exhaustive — the simple per-token partition covers every patch, while the canonical I-JEPA block scheme leaves some patches unused each step.
Back to the tutorial: Part 7a — JEPA from scratch, rebuilt for Route B. Symbols: the notation reference.