summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/blog-jlens-frequency.md29
-rw-r--r--results.md23
2 files changed, 37 insertions, 15 deletions
diff --git a/docs/blog-jlens-frequency.md b/docs/blog-jlens-frequency.md
index 3d68759..23529de 100644
--- a/docs/blog-jlens-frequency.md
+++ b/docs/blog-jlens-frequency.md
@@ -267,18 +267,31 @@ The predictable token scores **~1.4-1.5x higher** than the noise token at
identical frequency, in every layer of every seed. Middle-layer ratio across
the three seeds: 1.47 ± 0.09, bootstrap 95% CI [1.37, 1.53] — entirely above
1. So the lens is not a pure frequency meter: at equal frequency, the two
-tokens differ in norm. Whether that difference is specifically *conditional
-predictability* (what "verbalizable" should mean) depends on a control that is
-still running — see the caveat below.
+tokens differ in norm.
One caveat, found by a reviewer: the noise token '#' was inserted at random
character positions, which slices through the middle of a word 58% of the time
(th#e, ki#ng — letter on both sides), while '@' always sits at a clean word
-boundary after "the ". Predictability is therefore not perfectly isolated from
-n-gram corruption. We are running a clean-boundary control (noise token
-inserted after random word boundaries — 0% word-slicing, still unpredictable)
-to rule it out; the numbers above should be read with that caveat until the
-control lands.
+boundary after "the ". That confounds predictability with n-gram corruption —
+so we ran the control that isolates them: '#' inserted at random *word
+boundaries* (0% word-slicing, still unpredictable), same 0.0998% frequency,
+three fresh seeds.
+
+The control is done, and it is the honest kind of result — partly confirming,
+partly correcting:
+
+```
+ placement of '#' middle-layer ratio @/# bootstrap 95% CI
+ random (58% slicing) 1.47 ± 0.09 [1.37, 1.53]
+ clean boundary (0%) 1.31 ± 0.08 [1.26, 1.40]
+```
+
+The corruption confound was real: it inflated the estimate by about 12%. But
+it was not the whole story. At identical frequency, with clean boundaries and
+nothing sliced, the predictable token still scores ~1.3x higher than the
+unpredictable one, and the CI stays entirely above 1 in every seed. The
+conditional-predictability signal — the thing "verbalizable" should mean —
+survives the control, modestly smaller than our first estimate.
## 8. The causal test: what actually happened
diff --git a/results.md b/results.md
index 4225e39..c9e0c23 100644
--- a/results.md
+++ b/results.md
@@ -126,13 +126,22 @@ Middle-layer ratio across seeds: 1.47 +/- 0.09 (SD), bootstrap 95% CI
[1.37, 1.53]. The frequency anti-correlation holds, but the lens also carries
genuine conditional-predictability signal.
-CAVEAT (from adversarial review): '#' was inserted at uniform random character
-positions, which slices through the middle of a word 58% of the time (letter
-on both sides: th#e, ki#ng); '@' always sits at a clean word boundary after
-"the ". Predictability is therefore not perfectly isolated from n-gram
-corruption. A clean-boundary control (noise token after random word
-boundaries, 0% word-slicing) is running; the numbers above should be read with
-that caveat until it lands.
+CAVEAT + CONTROL (resolved): '#' was originally inserted at uniform random
+character positions, which slices through the middle of a word 58% of the time
+(letter on both sides: th#e, ki#ng); '@' always sits at a clean word boundary
+after "the ". A clean-boundary control (noise token after random word
+boundaries, 0% word-slicing, same frequency) was run with three fresh seeds:
+
+```
+ placement of '#' middle-layer ratio @/# bootstrap 95% CI
+ random (58% slicing) 1.471 +/- 0.090 [1.368, 1.529]
+ clean boundary (0%) 1.311 +/- 0.079 [1.258, 1.402]
+```
+
+Reading: the corruption confound was real (inflated the ratio by ~12%) but not
+the whole story — the structure signal survives at clean boundaries, CI
+entirely above 1 in every seed. Original run: outputs/synth_pair/seed{s}/;
+control run: outputs/synth_pair_clean/seed{s}/.
## 3. Loss-reweighting causal test (`src/loss_reweight.py`)