Decoding silent reading from non-invasive EEG
Organizations: nubrain
Abstract
Non-invasive decoding of inner speech faces a fundamental data problem: a corpus pairing brain activity with a person's spontaneous inner monologue cannot be collected, and the available proxy paradigms (cued repetitive and retrospectively reported generative inner speech) are slow to acquire, poorly time-locked, and subject compliance is unverifiable. We therefore treat silent reading as a scalable proxy task and ask how much lexical and semantic information a contrastive decoder can extract from it. We report an open-vocabulary analysis of approximately 240,000 word presentations recorded from a single densely-sampled participant across 393 runs (ca. 49 h) of 19-channel dry-electrode EEG. Words from continuous narrative text were presented in rapid serial visual presentation, with typography randomised on every trial to partially decorrelate word identity from low-level visual form. A convolutional EEG encoder, optionally followed by a causal transformer, was trained with a CLIP-style contrastive objective to align short EEG windows with hidden-state embeddings of the presented word taken from a large language model. Decoding, evaluated as word-grouped top-10 retrieval against permutation baselines, was reliably above chance, extended to mid-frequency and rare words, and scaled log-linearly with training-data volume with no sign of saturation. Removing occipital and posterior-temporal electrodes reduced the word-level gain by roughly one third but left context tracking unchanged. Control analyses separate word-level decoding from narrative context tracking and from a non-neural positional prior introduced by the transformer's positional embedding. These results establish that open-vocabulary word-level information is recoverable from EEG during silent reading, and that decoding is data-limited rather than saturated.
Figures & tables
| Configuration | Within-run gain (pp) | Overall gain (pp) | Context-tracking gain (pp) | Context-independent gain (pp) |
| Non-contextual target, no sequence model (L0, no TF) | ||||
| Non-contextual target, transformer (L0, TF) | ||||
| Contextual target, no sequence model (L20, no TF) | ||||
| Contextual target, transformer (L20, TF) |
| Configuration | Within-run gain (pp) | Position- only (pp) | Preceding- EEG (pp) | Current- trial (pp) | Position- corrected (pp) | Dispersion |
| L0, no TF | ||||||
| L0, TF | ||||||
| L20, no TF | ||||||
| L20, TF |
| Configuration | Rare | Mid | Frequent |
| L0, no TF | |||
| L0, TF | |||
| L20, no TF | |||
| L20, TF |
| Contextual (L20 TF) | Non-contextual (L0, no TF) | |||
| Metric | Slope, pp/decade ( ) | 10% 100% (pp) | Slope, pp/decade ( ) | 10% 100% (pp) |
| Within-run gain (primary) | (0.98) | (0.99) | ||
| Overall gain | (0.96) | (0.99) | ||
| Context-tracking gain | (0.94) | (0.85) | ||
| Within-run gain, rare bin | ||||
| Within-run gain, mid bin | ||||
| Contrast | All 19 channels | O1/O2/T5/T6 removed | Relative change |
| Within-run gain (marginal) | |||
| Overall gain (marginal) | |||
| Context-tracking gain (marginal) | |||
| Position-corrected within-run gain | |||
| Within-run gain, non-contextual target | |||
| Within-run gain, contextual target |
| Factor | Level | Within-run gain (pp) | Sweep |
| Window lock | Onset | 1 | |
| Centre | 1 | ||
| Offset | 1 | ||
| Window length | 0.5 s | 3 | |
| 0.7 s | 3 | ||
| 0.9 s | 3 |
Appendix figures & tables21 assets
Supplementary material from the paper’s appendix.
Appendix
| Paper term | Pool construction | Null / baseline | What it measures |
| Overall retrieval gain | Random samples of 512 validation trials (mixes recording runs) | Permutation of predictions within the pool | Total decoding signal, including passage-level context |
| Within-run retrieval gain (primary) | Consecutive trials from a single recording run, chunked to | Permutation within the same run (within-run EEG shuffle) | Discrimination among words in the same passage; excludes cross-run topic and run-identity drift |
| Context-tracking gain | Random cross-run pools (as overall) | Each trial’s EEG prediction replaced by a run-mate’s | The passage-tracking component of the overall gain |
| Context-independent gain | n/a | n/a | Overall gain context-tracking gain |
| Headroom-normalised accuracy | as overall | as overall | (accuracy baseline) / (1 baseline) |
| Rare / mid / frequent bin gains | as parent regime | per-bin empirical permutation rate | Frequency-resolved profile |
| Factor | Levels |
| LLM embedding layer | 0, 20 |
| Window lock | onset, offset, centre |
| ISI subset | {0 ms}, {100 ms}, {0, 100 ms} |
| Sequence model | none, transformer |
| Normalisation | scale-only, baseline subtraction scale |
| Temporal-shift augmentation | 0, ms |
| Factor | Levels |
| LLM embedding layer | 0, 20 |
| Window length | 0.5, 0.7, 0.9 s |
| Temporal-shift augmentation | 0, ms |
| Channel set | all 19; O1/O2/T5/T6 removed |
| Sequence model | none, transformer |
| Batch size | 4, 8 |
| Configuration | (gain) | (abs) | Gain (pp) | norm-acc | Implied empirical chance | Implied model top-10 | (distinct words / pool) | reference |
| all fits | 576 | 576 | 11.64 | 0.1352 | 14.31% | 25.96% | 299 | 3.34% |
| noTF_L0 | 144 | 144 | 7.92 | 0.0930 | 15.09% | 23.01% | 299 | 3.34% |
| noTF_L20 | 144 | 144 | 10.95 | 0.1272 | 14.19% | 25.14% | 300 | 3.34% |
| TF_L0 | 144 | 144 | 7.90 | 0.0921 | 14.42% | 22.32% | 299 | 3.34% |
| TF_L20 | 144 | 144 | 19.81 | 0.2286 | 13.54% | 33.35% | 300 | 3.34% |
| Configuration | (gain) | (abs) | Gain (pp) | norm-acc | Implied empirical chance | Implied model top-10 | (distinct words / pool) | reference |
| all fits | 576 | 576 | 6.74 | 0.0822 | 18.30% | 25.03% | 246 | 4.07% |
| noTF_L0 | 144 | 144 | 7.48 | 0.0904 | 17.43% | 24.91% | 246 | 4.07% |
| noTF_L20 | 144 | 144 | 5.47 | 0.0677 | 19.69% | 25.16% | 246 | 4.07% |
| TF_L0 | 144 | 144 | 6.18 | 0.0740 | 16.53% | 22.71% | 246 | 4.07% |
| TF_L20 | 144 | 144 | 7.81 | 0.0965 | 19.54% | 27.35% | 246 | 4.07% |
| Configuration | (gain) | (abs) | Gain (pp) | norm-acc | Implied empirical chance | Implied model top-10 | (distinct words / pool) | reference |
| all fits | 192 | 192 | 13.54 | 0.1583 | 15.75% | 29.28% | 301 | 3.32% |
| noTF_L0 | 48 | 48 | 7.11 | 0.0857 | 17.78% | 24.89% | 301 | 3.32% |
| noTF_L20 | 48 | 48 | 13.69 | 0.1604 | 15.32% | 29.01% | 302 | 3.31% |
| TF_L0 | 48 | 48 | 7.93 | 0.0945 | 16.46% | 24.38% | 301 | 3.32% |
| TF_L20 | 48 | 48 | 25.42 | 0.2925 | 13.44% | 38.86% | 301 | 3.32% |
| all_channels | 96 | 96 | 15.24 | 0.1776 | 15.21% | 30.45% | 301 | 3.32% |
| Configuration | (gain) | (abs) | Gain (pp) | norm-acc | Implied empirical chance | Implied model top-10 | (distinct words / pool) | reference |
| all fits | 192 | 192 | 7.76 | 0.0963 | 19.96% | 27.72% | 244 | 4.09% |
| noTF_L0 | 48 | 48 | 7.37 | 0.0919 | 20.34% | 27.71% | 244 | 4.09% |
| noTF_L20 | 48 | 48 | 6.71 | 0.0839 | 20.88% | 27.59% | 245 | 4.09% |
| TF_L0 | 48 | 48 | 6.93 | 0.0849 | 18.73% | 25.66% | 244 | 4.09% |
| TF_L20 | 48 | 48 | 10.04 | 0.1244 | 19.89% | 29.93% | 244 | 4.09% |
| all_channels | 96 | 96 | 9.24 | 0.1140 | 19.39% | 28.63% | 244 | 4.09% |
| Factor | Level | Within-run gain (pp) | Overall gain (pp) | Context- tracking gain (pp) | Context- independent gain (pp) | norm-acc | val-loss |
| Embedding layer | 0 | 0.0925 | 7.645 | ||||
| 20 | 0.1779 | 6.648 | |||||
| Window lock | onset | 0.1363 | 7.138 | ||||
| offset | 0.1327 | 7.169 | |||||
| centre | 0.1367 | 7.133 | |||||
| ISI subset | 0 ms | 0.1356 | 7.162 |
| Factor | Level | Rare | Mid | Frequent |
| Embedding layer | 0 | |||
| 20 | ||||
| Window lock | onset | |||
| offset | ||||
| centre | ||||
| ISI subset | 0 ms |
| Factor | Level | Within-run gain (pp) | Overall gain (pp) | Context- tracking gain (pp) | Context- independent gain (pp) | norm-acc | val-loss |
| Embedding layer | 0 | 0.0901 | 7.969 | ||||
| 20 | 0.2264 | 7.134 | |||||
| Window length | 0.5 s | 0.1434 | 7.612 | ||||
| 0.7 s | 0.1651 | 7.542 | |||||
| 0.9 s | 0.1664 | 7.499 | |||||
| Temporal shift | 0 | 0.1625 | 7.565 |
| Factor | Level | Rare | Mid | Frequent |
| Embedding layer | 0 | |||
| 20 | ||||
| Window length | 0.5 s | |||
| 0.7 s | ||||
| 0.9 s | ||||
| Temporal shift | 0 |
| Crossed factor | Level | All 19 channels | O1/O2/T5/T6 removed |
| Embedding layer | 0 | ||
| 20 | |||
| Sequence model | none | ||
| transformer | |||
| Window length | 0.5 s | ||
| 0.7 s |
| Level | Within-run gain (pp) | Position- only (pp) | Preceding- EEG (pp) | Current- trial (pp) | Position- corrected (pp) | Dispersion | |
| all fits | 576 | 6.74 | 0.70 | 0.49 | 5.55 | 6.04 | 0.0645 |
| no transformer | 288 | 6.48 | 0.00 | 0.00 | 6.48 | 6.48 | 0.0000 |
| transformer | 288 | 7.00 | 1.40 | 0.98 | 4.62 | 5.60 | 0.1290 |
| Level | Rare | Mid | Frequent | |
| all fits | 576 | 3.20 | 3.24 | 6.46 |
| L0, no TF | 144 | 3.22 | 3.17 | 8.12 |
| L20, no TF | 144 | 3.51 | 3.64 | 5.75 |
| L0, TF | 144 | 2.40 | 2.42 | 6.69 |
| L20, TF | 144 | 3.69 | 3.72 | 5.26 |
| Level | Within-run gain (pp) | Position- only (pp) | Preceding- EEG (pp) | Current- trial (pp) | Position- corrected (pp) | Dispersion | |
| all fits | 192 | 7.76 | 0.73 | 0.58 | 6.46 | 7.03 | 0.0642 |
| L0, no TF | 48 | 7.37 | 0.00 | 0.00 | 7.37 | 7.37 | 0.0000 |
| L20, no TF | 48 | 6.71 | 0.00 | 0.00 | 6.71 | 6.71 | 0.0000 |
| L0, TF | 48 | 6.93 | 0.07 | 6.88 | 6.86 | 0.1495 | |
| L20, TF | 48 | 10.04 | 2.85 | 2.34 | 4.86 | 7.20 | 0.1071 |
| Level | Within-run gain (pp) | Position- only (pp) | Preceding- EEG (pp) | Current- trial (pp) | Position- corrected (pp) | Dispersion | |
| all 19 channels | 96 | 9.24 | 0.77 | 0.56 | 7.92 | 8.48 | 0.0659 |
| O1/O2/T5/T6 removed | 96 | 6.28 | 0.69 | 0.60 | 4.99 | 5.59 | 0.0624 |
| Level | Rare | Mid | Frequent | |
| all fits | 192 | 4.67 | 4.66 | 7.34 |
| L0, no TF | 48 | 3.63 | 3.82 | 7.84 |
| L20, no TF | 48 | 5.24 | 5.17 | 6.91 |
| L0, TF | 48 | 3.19 | 3.20 | 7.33 |
| L20, TF | 48 | 6.62 | 6.46 | 7.28 |
| all 19 channels | 96 | 5.53 | 5.58 | 8.85 |
| Crossed factor | Level | Masking off | Masking on |
| Embedding layer | 0 | ||
| 20 | |||
| Sequence model | none | ||
| transformer | |||
| Temporal shift | 0 | ||
| ms |
| Factor | Level | Fits | Presented | Included | Excluded | Inclusion rate | Sweep |
| Window lock | onset | 64 | 240,141 | 220,787 (218,530–223,044) | 19,354 | 91.0–92.9% | Sweep 1 |
| centre | 64 | 240,141 | 221,334 (219,018–223,651) | 18,806 | 91.2–93.1% | Sweep 1 | |
| offset | 64 | 240,141 | 221,832 (219,670–223,995) | 18,308 | 91.5–93.3% | Sweep 1 | |
| Temporal shift | 0 | 96 | 240,141 | 223,563 (223,044–223,995) | 16,578 | 92.9–93.3% | Sweep 1 |
| ms | 96 | 240,141 | 219,073 (218,530–219,670) | 21,068 | 91.0–91.5% | Sweep 1 | |
| Window length | 0.5 s | 64 | 240,141 | 222,157 (220,498–223,790) | 17,984 | 91.8–93.2% | Sweep 3 |
EEG Decoding
Electroencephalography (EEG) decoding maps brain-signal patterns to mental states, stimuli, speech, or intended actions.
See all 198 papers