File size: 18,458 Bytes
66c1e90
 
c45737f
66c1e90
 
 
 
c45737f
66c1e90
 
 
c45737f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d7d056e
c45737f
 
 
d7d056e
d48bb1e
 
c45737f
 
 
 
 
 
 
 
3f0f91a
 
d48bb1e
 
d7d056e
 
c45737f
 
 
 
 
 
 
 
 
 
 
 
d7d056e
 
 
c45737f
 
 
 
d7d056e
c45737f
 
 
 
 
 
d7d056e
 
c45737f
d7d056e
 
c45737f
 
d7d056e
c45737f
d7d056e
 
c45737f
d7d056e
 
 
 
3f0f91a
c45737f
d48bb1e
 
3f0f91a
 
 
c45737f
 
 
 
 
d48bb1e
d7d056e
3f0f91a
d7d056e
 
3f0f91a
 
 
 
 
 
 
 
 
 
 
 
d48bb1e
 
 
 
 
 
 
 
c45737f
 
 
 
 
 
3f0f91a
 
 
 
 
c45737f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66c1e90
 
 
c45737f
 
66c1e90
 
 
 
 
d7d056e
25b6967
 
 
 
 
 
 
 
 
 
 
 
 
d7d056e
25b6967
 
 
66c1e90
3213d06
 
 
 
c45737f
66c1e90
c45737f
 
 
 
 
 
 
66c1e90
c45737f
 
 
d48bb1e
 
66c1e90
c45737f
 
 
 
4115e34
 
 
 
 
 
 
 
 
 
 
66c1e90
c45737f
66c1e90
c45737f
 
 
 
 
 
 
 
66c1e90
c45737f
66c1e90
d7d056e
 
 
 
 
3213d06
 
25b6967
 
d48bb1e
3f0f91a
 
d48bb1e
 
 
 
c45737f
 
 
 
 
 
66c1e90
c45737f
66c1e90
3f0f91a
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
---
license: mit
library_name: pytorch
tags:
- steam
- game-reviews
- representation-learning
- contrastive-learning
- set-encoder
---

# I-CE checkpoints

The trained set encoders ("towers") of the paper *Invariant Game Representation Learning from
Steam Reviews* (AICCC 2026). A tower is a small attention-pooling network of about 0.36 M
parameters: a few latent queries cross-attend over the cached sentence embeddings of a game's
reviews (Qwen3-Embedding-0.6B, 1,024-d) and an MLP maps the pooled result to one L2-normalized
128-d vector per game.

- Code, appendices and supplement:
  [`Nice9Tian/I2CE-GameRepresention-by-SteamReviews`](https://github.com/Nice9Tian/I2CE-GameRepresention-by-SteamReviews)
- The tensors the towers read:
  [`chironYu/latenarray-i2ce-data`](https://huggingface.co/datasets/chironYu/latenarray-i2ce-data)

## Contents

275 checkpoints, about 593 MiB, and four JSON files that list every one of them:

| Listed in | Checkpoints | What they are |
|---|---|---|
| `rank_ckpt_plan.json` | 166 | the five-fold runs behind the paper's numbers, each at the epoch the validation rank rule of Section 5 selects. One is the DINO-style control of Table A1, trained on fold 0 only; five, CE capped at 2,048 sentences, are the partners of I-CE runs the paper prints and are not printed themselves |
| `i2bce_sel_pool.json` | 5 | I + SimCLR on the five folds (Figure 8, Appendix L), selected by the same rule |
| `fixed_split_ckpt_plan.json` | 69 | the fixed-split runs: 15 runs at their selected epochs, two of them with an earlier checkpoint kept beside the selected one, and 52 more checkpoints of two runs that the paper reads across their epochs (field `trajectory`) |
| `rank_ckpt_plan.json`, field `init_ckpt` | 5 | the BYOL checkpoints the five two-stage runs started from |
| `superseded_ckpt_plan.json` | 30 | kept for the record; no number of the paper reads them |

An entry of the three plan files gives the arm, the fold, the anchor pack, the selected epoch,
the file name and the file's SHA-256; `i2bce_sel_pool.json` is the selection as the evaluation
script wrote it, with the rank score of every checkpoint of the run. The same four files are in
`contrast_experiment/w9/eval/` of the code repository, where the evaluation script reads them.

Every tower that a number or a figure of the paper reads is here, at the checkpoint it is read
at. A run saved a checkpoint every 50 epochs and the rank rule chose among them; the ones it did
not choose are not here, except for the two runs listed under `trajectory`. The other passages
that follow runs over training quote what the workers logged at each checkpoint: the learnable
temperature and the view-count and view-size sweeps in Appendix C, and the decline of the
views-first anchors after epoch 50 in Supplement A.

## File names

    ckpt_w9cv_wcle_<arm>_fold<k><pack><suffix>_fp_ep<N>.pt     five folds, fold k is the test fold
    ckpt_w9_wcle_<arm><pack><suffix>_fp_ep<N>.pt               the fixed split

- `<arm>` is the objective, listed in the tables below.
- `<pack>` is the anchor pack the run trained with, counted in sentences with the store-page
  prefix included: nothing for 512, `_g1024`, `_g2048`, or `_gpool` for the prefix plus the game's
  whole 2,048-sentence review pool (a median of 2,068 sentences). The paper calls `_g2048` and
  `_gpool` alike its 2,048-sentence budget; the main five-fold towers are the `_gpool` runs.
- `<suffix>`: `_wllm` for LLM-rewritten documents as the document view, `_bw` for a run
  initialized from a BYOL tower, `_w<N>` for review views drawn until they hold at least N
  sentences (the recipe stops at 16), `_d512` for a run on the current 512-sentence packs (see
  below).
- `_fp`: the strong views were drawn from the full review pool. `ep<N>` is the epoch.

## The five-fold runs

Table and figure numbers are those of the paper, its appendices (Tables A1 to A19) and its
supplement (Tables S1 to S4). The last column comes from the provenance table of the code
repository, `contrast_experiment/w9/Pod/w9_profiles.py`, which cites by cell: a table named for a
row reads at least one of the row's runs. That file also names the notebook that trains each cell.

| Runs | What they are | Pack | Folds | Read by |
|---|---|---|---|---|
| `ai2ce_icetf_d512` | CE + anchor-in-I | 512 | 5 | Table 2, Section 6.2, Table A15 |
| `ce_cetf_d512`, `i2ce_icetf_d512` | CE; I-CE, the recipe | 512 | 5 | Table 2, Table A2, Table A3, Table A4, Table A5, Table A6, Table A7, Table A11, Table A15, Table A19, Table S1 |
| `d1r2_i2ce_icetf_d512`, `d1r4_i2ce_icetf_d512`, `d1r5_i2ce_icetf_d512`, `d1r5_i3ce_icetf_d512`, `d1r6_i2ce_icetf_d512` | I-CE, V = 3; I-CE, V = 5; I-CE, V = 6; I-CE, V = 6 with λ = 3; I-CE, V = 7 | 512 | 0 to 2 | Table A5 |
| `i2ce_icetf_w8_d512`, `i2ce_icetf_w32_d512`, `i2ce_icetf_w64_d512` | I-CE, review views of at least 8 sentences; of at least 32; of at least 64 | 512 | 0 to 2 | Table A6 |
| `i2ce_icetf_wllm_d512`, `nodoc_i2ce_icetf_d512` | I-CE, LLM-rewritten documents; I-CE without the document view | 512 | 5 | Table A19 |
| `i2cet05_icetf_d512`, `i2cet10_icetf_d512` | I-CE, τ = 0.05; I-CE, τ = 0.10 | 512 | 5 | Table A3 |
| `i3ce_icetf_d512`, `i4ce_icetf_d512`, `ice_icetf_d512` | I-CE, λ = 3; I-CE, λ = 4; I-CE, λ = 1 | 512 | 0 to 2 | Table A4 |
| `slot16i2cemean_icetf_d512`, `slot1i2cemean_icetf_d512`, `slot2i2cemean_icetf_d512`, `slot8i2cemean_icetf_d512` | I-CE, 16 latent queries; I-CE, 1 latent query; I-CE, 2 latent queries; I-CE, 8 latent queries | 512 | 0 to 2 | Table A7 |
| `vfai2ce_icetf_d512` | I-CE, views-first anchors | 512 | 5 | Table S1 |
| `ce_cetf_g1024`, `i2ce_icetf_g1024` | CE; I-CE, the recipe | 1,024 | 5 | Table A2, Table A11, Table A15 |
| `ce_cetf_g2048`, `i2ce_icetf_g2048` | CE; I-CE, the recipe | 2,048 | 5 | Table A3, Table A11 |
| `i2ce_icetl_g2048`, `i2cet05_icetf_g2048`, `i2cet10_icetf_g2048` | I-CE, learnable τ; I-CE, τ = 0.05; I-CE, τ = 0.10 | 2,048 | 5 | Table A3 |
| `bce_cetf_gpool`, `byol_bytf_gpool`, `epd_v20i10c20_cetf_gpool`, `mq3072i2ce_icetf_gpool` | SimCLR-style; BYOL; VICReg (batch 192); I-CE with an EMA teacher and a memory bank | pool | 5 | Figure 7, Figure 8, Table 2, Section 3.2, Table A1, Table A13, Table A16, Table A17, Table A18, Figure A2, Table S2, Table S3, Table S4 |
| `ce_cetf_gpool`, `i2ce_icetf_gpool` | CE; I-CE, the recipe | pool | 5 | Figure 7, Figure 8, Table 2, Section 6.1, Table A1, Table A2, Table A7, Table A13, Table A14, Table A15, Table A16, Table A17, Table A18, Figure A2, Table S2, Table S3, Table S4 |
| `slot8i2cemean_icetf_gpool` | I-CE, 8 latent queries | pool | 5 | Table A7 |
| `swin168step84loop2i2ce_icetf_gpool`, `swin168step84loop2i2ce_icetf_gpool_bw` | I-CE with the windowed teacher; I-CE, two-stage: BYOL warm start, then the windowed teacher | pool | 5 | Table A13, Table S2, Table S3, Table S4 |
| `dino_dntf_gpool` | DINO at its published settings, the control of Section 4.3 | pool | 0 only | Table A1 |

I + SimCLR (`i2bce_icetf`, files without a pack or a suffix, five folds) backs Figure 8 and the
five-fold readings of Appendix L. The
fold-0 run of `i2ce_icetf_g2048` also gives the game vectors of Figure 10. The DINO-style control
has one fold, so Table A1 gives its spread over the ten anchor draws; its file is 169 MiB because
it carries the two prototype heads (see Format).

## The fixed-split runs

| Runs | What they are | Pack | Folds | Read by |
|---|---|---|---|---|
| `ai25auni2_icetf_d512`, `ai2auni25_icetf_d512`, `ai4auni2_icetf_d512`, `ai6auni2_icetf_d512`, `i4uni2_icetf` | alignment + uniformity aimed at the anchor gallery, the four settings of Section 6.2 (`ai25auni2` is Table 3's a+u @ gallery row); alignment + uniformity aimed at the batch views (Table 3's a+u @ views row) | 512 | fixed split | Table 3, Section 6.2, Appendix L |
| `ai2ce_icetf_d512`, `ce_cetf_d512`, `i2ce_icetf_d512` | CE + anchor-in-I; CE; I-CE, the recipe | 512 | fixed split | Table 3, Section 6.2, Table A8 |
| `ce_cetf_g2048`, `i2ce_icetf_g2048` | CE; I-CE, the recipe | 2,048 | fixed split | Figure 9, Figure A1, Figure A3, Appendix L |
| `bce_cetf`, `i2bce_icetf`, `epd_v20i10c20_cetf` | SimCLR-style; I + SimCLR; VICReg, v/i/c = 20/10/20 (the recipe weights) | 512 | fixed split | Figure 9, Figure A3, Appendix L, Table A8 |
| `epd_v25i25c1_cetf`, `epd_v20i10c15_cetf` | VICReg, v/i/c = 25/25/1; VICReg, v/i/c = 20/10/15 | 512 | fixed split | Table A8 |

Figure 9, Figure A3 and the neighborhood statistics of Appendix L read six encoders on the fixed
split: the frozen embedder, which has no checkpoint, and five towers, namely `i2ce_icetf_g2048`
(epoch 1,750), `ce_cetf_g2048` (1,150), `bce_cetf` (1,350), `i2bce_icetf` (1,350) and
`epd_v20i10c20_cetf` (100). Two runs have more than their selected checkpoint here, listed under
`trajectory` in the plan file: all 40 checkpoints of `i2ce_icetf_g2048`, whose four latent queries
Figure A1 draws at every one, and the `bce_cetf` checkpoints from epoch 1,350 to 2,000, the span
of the test curve Appendix L describes.

Runs that read no anchor in training (`bce_cetf`, `i2bce_icetf`, `i4uni2_icetf` and the three
VICReg weightings; the 512 in their rows is only the pack their worker encoded at each
checkpoint) were selected after training: each of the run's 40 checkpoints encodes the
4,096-sentence anchor pack of the fixed split and the rank rule chooses on that.

Ten of the fifteen runs stopped at 1,000 epochs under their first schedule and were trained on to
2,000 from the weights of epoch 1,000 with a fresh optimizer: those six, CE + anchor-in-I, and
three of the gallery-aimed settings (`ai6auni2`, `ai4auni2`, `ai2auni25`). The plan entries say so
under `extended`. Two selections moved with the longer runs, CE + anchor-in-I to epoch 1,650 and
`ai4auni2` to epoch 1,250; the checkpoints selected before (epochs 1,000 and 900) are kept and
named under `previous`.

## Format

Every file holds tensors only, so `torch.load(path, weights_only=True)` reads it. Most are the
state dict of the tower itself, `SetPoolN(Q)` of `contrast_experiment/w9/Pod/w9_cv_worker.py`
(keys `q0`, `attn.*`, `head.*`; `q0` has shape `[1, Q, 128]`, Q = 4 except in the `slot<Q>` runs).
Four families wrap it: BYOL files hold `{"model", "pred", "target"}`, VICReg files
`{"model", "expander"}`, the memory-bank files `{"model", "shadow"}`, and the DINO-style file
`{"model", "student", "t_head", "s_head", "center"}`; the tower is `model`. In the DINO-style file
`model` is the teacher's tower, the one DINO evaluates and the paper reads, `student` the
student's, and the two heads hold the 65,536 prototypes.

```python
import sys, torch
sys.path[:0] = ["contrast_experiment/w9", "contrast_experiment/w9/Pod"]   # from the code repository's root
from Pod.w9_cv_worker import SetPoolN

sd = torch.load("checkpoints/ckpt_w9cv_wcle_i2ce_icetf_fold0_gpool_fp_ep2000.pt", weights_only=True)
sd = sd.get("model", sd)
sd = {k: v for k, v in sd.items() if k == "q0" or k.startswith(("attn.", "head."))}
tower = SetPoolN(sd["q0"].shape[1]); tower.load_state_dict(sd); tower.eval()

# S: [games, sentences, 1024] sentence vectors, each row standardized over its 1,024 dimensions
# pad: [games, sentences] bool, True where a row is padding
z = tower(S, pad)        # [games, 128], L2-normalized
```

## Scoring them as the paper does

The paper scores a five-fold tower against ten independent 4,096-sentence anchor packs per game
and reports the mean. From the root of the code repository, with the data folder in place:

```bash
hf download chironYu/latenarray-i2ce-checkpoints --local-dir checkpoints
export W9_DATA_DIR=/path/to/latenarray-i2ce-data
python contrast_experiment/w9/eval/k10_eval.py cells  cells.json --ckpt-dir checkpoints
python contrast_experiment/w9/eval/k10_eval.py encode cells.json draws.npz
python contrast_experiment/w9/eval/k10_eval.py score  cells.json draws.npz scores.json
python contrast_experiment/w9/eval/k10_eval.py table  scores.json
```

`cells` takes the 171 five-fold checkpoints of `rank_ckpt_plan.json` and `i2bce_sel_pool.json`;
`--only <regex>` keeps a subset, for example `--only "_d512$"` for the 512-sentence runs. In its
table the five families of the main comparison go by the paper's names (`I-CE`, `CE`, `SimCLR`,
`VICReg`, `BYOL`) and every other family by its plan key without the fold; a family with one
fold, the DINO-style control, is printed with its spread over the ten draws.

The fixed split has one command of its own:

```bash
python contrast_experiment/w9/eval/fixed_split_eval.py --ckpt-dir checkpoints
```

It reads every run of `fixed_split_ckpt_plan.json` at its selected checkpoint and prints each
reading beside the number the paper prints: Table 3, the gallery-aimed settings of Section 6.2
and Table A8 on the one 4,096-sentence anchor draw of the fixed split, the SimCLR-style test
curve of Appendix L, the latent queries of Figure A1, and, through `k10_eval.py`, the towers of
Figure 9 against the ten draws. A near tie can move a cell by one query of 204 (0.005), and the
collapsed a+u @ gallery row by about 0.01.

The figures built on these towers are drawn from the checkpoints as well:
`python figures/neighborhoods/run_all.py --ckpt-dir checkpoints --data-dir <data folder>` makes
Figures 8, 9 and A3 and the neighborhood statistics of Appendix L.

## The 512-sentence packs and the `_d512` runs

Until 2026-11-07 the 512-sentence anchor packs (`wscan_gal_rev.npz` of the dataset) carried the
store-page prefix rows without the per-row standardization every other input receives (row std
about 2.9 against 1.0), and the tower has no input normalization. Only the 512 budget was
affected; larger packs were standardized. The dataset now carries the corrected packs, and every
run whose loss reads the 512-sentence anchors was trained again on them under the paper's recipe.
Those runs are named `_d512`, and they are the ones the paper reads. The workers of the code
repository give a run on the current packs that name themselves.

Runs whose loss never reads the anchors (the SimCLR-style tower, I + SimCLR, BYOL, VICReg and
alignment plus uniformity aimed at the batch views) train the same weights on either pack, so
their checkpoints were not replaced; only readings that used the 512-sentence packs were redone.
Their files therefore carry no `_d512`: the fixed-split ones, and those of the five-fold
I + SimCLR.

Stripped hit@1 on the ten 4,096-sentence draws, five-fold mean ± std, before and after:

| Tower | on the packs as first built | on the corrected packs (`_d512`) |
|---|---|---|
| I-CE (`i2ce_icetf`) | 0.669 ± 0.031 | 0.715 ± 0.010 |
| CE (`ce_cetf`) | 0.638 ± 0.016 | 0.676 ± 0.013 |
| CE + anchor-in-I (`ai2ce_icetf`) | 0.663 ± 0.014 | 0.725 ± 0.015 |
| I-CE without the document view (`nodoc_i2ce_icetf`) | 0.650 ± 0.022 | 0.683 ± 0.025 |
| I-CE, LLM-rewritten documents (`i2ce_icetf`, `_wllm`) | 0.680 ± 0.034 | 0.711 ± 0.009 |
| I-CE, τ = 0.05 (`i2cet05_icetf`) | 0.601 ± 0.029 | 0.642 ± 0.026 |
| I-CE, τ = 0.10 (`i2cet10_icetf`) | 0.510 ± 0.022 (four folds) | 0.520 ± 0.015 |

The checkpoints behind the left column are the superseded files of the next section, except
those of CE + anchor-in-I, whose first runs were not uploaded. The other `_d512` families (the
sweeps on folds 0 to 2 and the views-first anchors) have no earlier counterpart here.

## Superseded checkpoints

`superseded_ckpt_plan.json` lists 30 files that stay here although the paper reads none of them:
the 29 five-fold runs at 512 sentences made on the packs as first built, whose names have no
`_d512` (I-CE, CE, the two document-view runs and the two temperatures), each with a note naming
the run that replaced it, and one fold of a VICReg arm that used the whole training set as its
batch, which the paper dropped. The file has
the format of a selection file, so `k10_eval.py cells` scores them when it is given the file. The
dataset keeps the first packs as `wscan_gal_rev_rawprefix.npz`; the workers read them with
`--raw-prefix` and then name the run without the tag.

## Changes

- 2026-11-12, later that day. Nine checkpoints were added, the view-size sweep of the appendix's
  new Table A6: I-CE with each review view drawn until it holds at least 8, 32 or 64 sentences
  (`i2ce_icetf_fold<k>_w<N>_d512`, folds 0 to 2). `rank_ckpt_plan.json` lists them. The new table
  moved every later appendix table one place, so the old Tables A6 to A18 are Tables A7 to A19
  in the tables above; no earlier entry changed its checkpoint.
- 2026-11-12. The code repository gained `figures/neighborhoods/`, the scripts that drew
  Figures 8, 9 and A3.
- 2026-11-11, at night. The code repository gained `fixed_split_eval.py`, which reads the
  fixed-split checkpoints as the paper does.
- 2026-11-11, later that day. 62 checkpoints were added, so that every tower the paper reads is
  here: the DINO-style control (fold 0), eight fixed-split runs at their selected epochs (CE and
  I-CE trained at 2,048 sentences, the SimCLR-style tower, I + SimCLR, a+u @ views and the three
  VICReg weightings), the 52 `trajectory` checkpoints, and epoch 1,250 of the 4:1 gallery-aimed
  run of Section 6.2 (`ai4auni2_icetf_d512`). That run's entry in `fixed_split_ckpt_plan.json`
  named epoch 900, its selection before it was trained on to 2,000 epochs; the paper reads epoch
  1,250. No other earlier entry changed its checkpoint.
- 2026-11-11. The four JSON files above replace the earlier per-campaign lists
  (`docfix512_ckpt_plan.json`, `c2_docfix512_ckpt_plan.json`, `c3_docfix512_ckpt_plan.json`,
  `q8_gpool_ckpt_plan.json`); no selection changed. The five BYOL checkpoints the two-stage runs
  started from were added. The `_gpool` files were renamed from `_g4096`, a cap the review pool
  never reached; the files are the same.
- 2026-11-07 to 2026-11-10. The `_d512` runs were added.

## Citation

Zhilong Yu et al. *Invariant Game Representation Learning from Steam Reviews.* 2026 9th Artificial
Intelligence and Cloud Computing Conference (AICCC 2026), December 18 to 21, 2026, Tokyo, Japan.

```bibtex
@inproceedings{yu2026invariant,
  author    = {Yu, Zhilong and others},
  title     = {Invariant Game Representation Learning from Steam Reviews},
  booktitle = {2026 9th Artificial Intelligence and Cloud Computing Conference (AICCC 2026)},
  address   = {Tokyo, Japan},
  year      = {2026}
}
```

Code and checkpoints are under the MIT license.