Correct §3.7 baselines, held-out count, and steering-strength units - #42
Open
amhw460 wants to merge 1 commit into
Open
Conversation
Measure the unsteered baseline probabilities instead of relying on the
hardcoded ones. The `baseline_p` field in cross_prompt_results.json was
never measured — it was a literal in the PROMPTS table of
cross_prompt_validation.py (lines 55-60) copied verbatim into the output
JSON, which made it look like a result. It disagreed with the
`first_default_logprob` the API returned on the same runs.
remeasure_baselines.py re-measures all five directly. Note that /steer
returns HTTP 500 on an empty feature list (which is why the dedicated
baseline call in results.json is an HTTP 500), so it sends one feature at
strength 0 and reads the DEFAULT branch, asserting default == steered to
confirm the no-op. Four of five hardcoded values were wrong:
Berlin 0.958 -> 0.9584
Rome 0.974 -> 0.9584
Tokyo 0.990 -> 0.9820
teacher 0.486 -> 0.5631
bird 0.117 -> 0.0759
§3.7.1's table already used the measured numbers; the §3.7.2 caption and
§3.7.4 used the hardcoded ones. All three now agree. The re-run also shows
" air" is only marginally the argmax on the bird prompt, effectively tied
with " ____", so §3.7.4 says so.
Other corrections:
- Drop the Bee/ant held-out row. The recorded baseline_text is "?" — the
model never produced "colony"; that was the expected label, not an
output. Four held-out prompts becomes three throughout.
- Fix steering-strength units in §3.7.2. The titration sweeps per-feature
strength -2..-40, which the x4 multiplier makes -8..-160; the text
compared these against "-20" and then concluded the effect was not a
product of "-80". Both scales are now stated explicitly. Also note that
an identical 97% at -8 and at -160 indicates the readout saturates well
below -80, rather than reading that flatness as robustness.
- Abstract said the circuit spans all 26 transformer layers; the
180-feature set touches 21 (nothing at L16, L17, L19, L21, L23). The
graphs span 26, which §3.1 already states correctly.
- Cite the §3.7.3 source data, which lives under graph-analysis/anish/
rather than experiments/, and note that the ":" row is real degenerate
output rather than a placeholder.
- Remove the "218 experiments" framing from the abstract, intro, and §4
synthesis (left in §2.7, which is not this branch's to change).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Corrections to §3.7 and the abstract, found while auditing the section against the result JSONs. Everything here is either a re-measurement or a text fix — no analysis is re-run or re-interpreted, and the matched-null argument is untouched.
The hardcoded baseline
baseline_pincross_prompt_results.jsonwas never measured. It's a literal in the PROMPTS table ofcross_prompt_validation.py:55-60, copied verbatim into the output JSON, which made it look like a result. It disagrees with thefirst_default_logprobthe API actually returned on the same runs.remeasure_baselines.py(added) measures all five directly./steerreturns HTTP 500 on an empty feature list — which is why the dedicated baseline call inresults.jsonis itself an HTTP 500, and likely why a literal was used in the first place — so it sends one feature at strength 0 and reads the DEFAULT branch, assertingdefault == steeredto confirm the no-op. It held on all five.Only Berlin was right. §3.7.1's table already used the measured numbers; the §3.7.2 caption and §3.7.4 used the hardcoded ones. All three now agree.
Two incidental findings: Rome and Berlin genuinely both sit at 0.9584 (real coincidence, independently reproduced — not a copy-paste). And on the bird prompt
" air"is only marginally the argmax, effectively tied with" ____"at 0.0759 — the model is guessing among blank-fillers rather than weakly completing the analogy. §3.7.4 now says so, which strengthens a hedge that was already there.Other fixes
baseline_textis"?"— the model never produced "colony"; that was the expected label, not an output. The row couldn't show a circuit destroying an answer that was never given. Four held-out prompts becomes three throughout. The other three are unaffected.strength−2…−40, which the ×4 multiplier makes −8…−160, but the text compared these against "−20" and then concluded the effect was not a product of "−80". Both scales are now explicit. Also reframed the conclusion: an identical 97% at −8 and at −160 indicates the readout saturates well below −80, which is worth stating plainly rather than reading the flatness as robustness.graph-analysis/anish/exp7_remaining_analogy_validation/while the rest of §3.7 comes fromexperiments/exp8_.../, so it looks unsourced. Added a caption citing it, and noting the:row is genuine degenerate output rather than a placeholder.Two things deliberately left alone
§2.7 still says "218 individual steering API calls." I count ~280 across the committed JSONs, so the number likely needs revisiting — but §2.7 isn't mine, so I only removed the framing from the sections that are.
§2.3's selection criterion doesn't match the data file, and I didn't touch it.
analogical_circuit_180features.jsonrecordscounting_method: "total_instances", threshold 5 — i.e. ≥5 node instances summed across the graphs, where one graph can contribute several. §2.3's formula defines the threshold as a count of graphs. These select different sets: by the file's owndistinct_graphsfield, 119 of the 180 appear in all five graphs, 16 in four, 42 in three, and 3 in only two.Likely cause: the file also carries an
out_of_graphsfield that is hardcoded to5for every feature — it's the denominator, not a count — which reads as "in 5 graphs" at a glance.This PR updates the abstract and the §3.2 table labels to match the file, but leaves §2.3 as-is, so §2.3 now disagrees with both. Flagging for whoever owns chapter 2 rather than fixing it here. Note also that I couldn't reproduce the 510/277 figures from the five graph JSONs under either rule (I get 516/236/145 by graph count, 536/303/206 by instances), and no script in the repo generates that file — so it's worth confirming those two rows came from the same criterion as the 180.
🤖 Generated with Claude Code