Research log Small Model Experimentation
GitHub

Counterfactual ICL Public Multiseed Gate

Cheap example drills triple accuracy; twist adds nothing

The one idea you need

The training puzzles follow invented rules that contradict anything memorized — like a cipher whose key changes every round. The only way to solve one is to decode the worked examples shown in the prompt, forcing the model to read them instead of recalling a familiar format.

The question

Can cheap made-up puzzles that force a small model to copy its examples teach it to follow examples on real tasks — and is the special recipe why it works?

What we found

Yes, but not for the reason expected. Tuning tripled whole-task accuracy on real text tasks, from 20% to about 61%, stable across three training runs — and the model genuinely reads its examples: remove them and it collapses to under 2%. But plain tuning on ordinary made-up puzzles reached 64%, so the clever counterintuitive twist added nothing. The lift is generic synthetic tuning.

Why it matters

Before crediting a clever data recipe for a small model's gains, run two cheap controls: tune on plain synthetic puzzles, and strip the examples at test time. Here both showed the win was generic synthetic tuning, not the advertised mechanism.

Public accuracy, before vs after tuning20% → 61%whole-task exact match on unseen real text-transformation tasks
Clever recipe vs plain synthetic tuning61% vs 64%counterfactual tuning tied ordinary tuning, so the special ingredient is not isolated
Accuracy with the examples removed61% → 1.5%the tuned model collapses without in-context support examples
Public tasks improved vs worsened18–20 helped, 1 hurtof 45 tasks per seed; exactly 1 hurt in every seed
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Question
    2. Headline
    3. Aggregate Metrics
    4. Seed-Level Normal-Support Metrics
    5. Interpretation
    6. Charts
    7. Public Task Flips Versus Base
    8. Public Family Breakdown
    9. Public Error Sample
    10. Artifacts
    11. Limitations
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 7

Public accuracy: untuned model versus three tuned adapters

How to read

Bars give whole-task exact-match accuracy on public text tasks with examples intact; left to right: untuned base, the counterfactual adapter (mean of three seeds), the plain-synthetic adapter, and the shuffled-label adapter. Taller is better.

0%20%40%60%80%base (no tuning)base (no tuning)20%counterfactual adapter (3 seeds)counterfactual adapter (3 seeds)60.7%ordinary adapterordinary adapter64.4%shuffled-label adaptershuffled-label adapter62.2%

Takeaway → All three tuned bars cluster near 60 to 64%, roughly tripling the untuned 20% and indistinguishable from each other, so the clever counterfactual ingredient adds nothing visible.

Data table
training armfull-task exact (public PROSE, intact support)
base (no tuning)20%
counterfactual adapter (3 seeds)60.7%
ordinary adapter64.4%
shuffled-label adapter62.2%

Numbers from reports/qwen_counterfactual_icl_public_multiseed_report.md table (analysis/aggregate_summary.csv)

Technical framing

Public text-transformation accuracy: base model vs LoRA-tuned adapters — Synthetic ICL-style LoRA tuning triples public accuracy, but the ordinary and shuffled-label controls match it — the counterfactual ingredient isn't isolated.

Accuracy depends on the examples in the prompt

How to read

For each adapter, bars show public whole-task accuracy under intact, shuffled, and removed support examples; colors mark the counterfactual, ordinary, and shuffled-label-trained adapters; higher is better.

0%20%40%60%80%intact supportintact support60.7%64.4%62.2%shuffled supportshuffled support28.1%26.7%51.1%no supportno support1.5%0%2.2%

Takeaway → Every adapter collapses to near zero once examples are removed, proving they read them, but the shuffled-label adapter still scores 51% on shuffled examples, hinting at learned formatting.

Data table
support condition at evalcounterfactual adapterordinary adaptershuffled-label-trained adapter
intact support60.7%64.4%62.2%
shuffled support28.1%26.7%51.1%
no support1.5%0%2.2%

Numbers from reports/qwen_counterfactual_icl_public_multiseed_report.md table (analysis/aggregate_summary.csv)

Technical framing

Adapter accuracy depends on the in-context support examples — Corrupting or removing support examples collapses performance, so adapters do read the examples — but shuffled-label training still yields high shuffled-support accuracy.

Do the training gains reach unseen public tasks?

How to read

Two evaluation splits — the synthetic training-style tasks and the unseen public tasks; two bars each, untuned base versus the counterfactual adapter, both with intact examples; higher is better.

0%25%50%75%100%synthetic counterfactual splitsynthetic counterfactual split38.3%92.8%public PROSE splitpublic PROSE split20%60.7%

Takeaway → The adapter lifts both splits, from 38% to 93% on synthetic and 20% to 61% on public, so the skill transfers to genuinely unseen tasks, not just the generator.

Data table
evaluation splitbasecounterfactual adapter (mean of 3 seeds)
synthetic counterfactual split38.3%92.8%
public PROSE split20%60.7%

Numbers from reports/qwen_counterfactual_icl_public_multiseed_report.md table (analysis/aggregate_summary.csv)

Technical framing

Synthetic training gains transfer to the public benchmark — Training only on synthetic episodes with answer-only supervision lifts unseen public tasks by 40.7 points, not just the synthetic generator.

Improvement holds across three training runs

How to read

For each of three training seeds, one bar counts public tasks that improved and one counts those that worsened versus the untuned base, out of 45; more helped and fewer hurt is better.

05101520181seed 1201seed 2201seed 3

Takeaway → Every seed improves about 20 of 45 tasks and worsens only one, so the gain is a stable effect rather than one lucky run.

Data table
training seedtasks helpedtasks hurt
seed 1181
seed 2201
seed 3201

Numbers from reports/qwen_counterfactual_icl_public_multiseed_report.md 'Public Task Flips Versus Base' table

Technical framing

Per-seed public task flips versus base (45 tasks) — The gain is consistent across seeds: about 20 of 45 public tasks improve while only 1 regresses in every seed.

Which kinds of public task the tuning fixes

How to read

Ten public task families across the axis; paired bars give untuned base versus counterfactual-adapter whole-task accuracy; higher is better.

0%25%50%75%100%ColumnColumn0%100%CurrencyCurrency0%100%EmergencyCallEmergencyCall0%100%FilePathFilePath0%100%ShippingCodeShippingCode0%88.9%NumberNumber10%63.3%NameName0%53.3%PhonePhone66.7%100%DateTimeDateTime20%44.4%AddressAddress100%0%

Takeaway → Structured formats like codes, file paths and currency jump to 100%, dates stay hardest, and the single address task actually regresses to zero.

Data table
Public task familyBase modelCounterfactual adapter
Column0%100%
Currency0%100%
EmergencyCall0%100%
FilePath0%100%
ShippingCode0%88.9%
Number10%63.3%
Name0%53.3%
Phone66.7%100%
DateTime20%44.4%
Address100%0%

Numbers from experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md (Public Family Breakdown table)

Technical framing

Which public task families the adapter fixes — Gains span structured families (codes, paths, currency); DateTime stays hardest and the single Address task regresses to 0%.

The shuffled-label adapter ignores whether examples are right

How to read

Four arms on the synthetic split — base and the counterfactual, ordinary, and shuffled-label adapters; two bars each for normal versus shuffled support examples; higher is better.

0%25%50%75%100%BaseBase38.3%16.7%Counterfactual adapterCounterfactual adapter92.8%51.1%Ordinary adapterOrdinary adapter95%46.7%Shuffled-label adapterShuffled-label adapter95%91.7%

Takeaway → Most arms roughly halve under shuffled examples, but the shuffled-label adapter holds 92%, evidence it learned output formatting rather than truly reading the examples.

Data table
Model arm (synthetic counterfactual split)Normal support examplesShuffled support examples
Base38.3%16.7%
Counterfactual adapter92.8%51.1%
Ordinary adapter95%46.7%
Shuffled-label adapter95%91.7%

Numbers from experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md (Aggregate Metrics table)

Technical framing

Shuffled-label training control still tolerates shuffled support — The adapter trained on shuffled labels keeps 91.7% under shuffled support, so a formatting explanation for the gains remains plausible.

Strict whole-task scoring lowers every arm's score

How to read

Four arms on the public split — base and the three adapters; two bars each, lenient per-row scoring versus strict whole-task scoring where every row must match; higher is better.

0%20%40%60%80%BaseBase37%20%Counterfactual adapterCounterfactual adapter70.6%60.7%Ordinary adapterOrdinary adapter74.1%64.4%Shuffled-label adapterShuffled-label adapter74.1%62.2%

Takeaway → Requiring every row to match costs the adapters about 10 points but nearly halves the base model, so strict scoring widens the tuned-versus-untuned gap.

Data table
Model arm (public split, normal support)Per-row exactAll rows in task exact
Base37%20%
Counterfactual adapter70.6%60.7%
Ordinary adapter74.1%64.4%
Shuffled-label adapter74.1%62.2%

Numbers from experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md (Aggregate Metrics table)

Technical framing

Strict whole-task scoring costs every arm on the public benchmark — Requiring every row of a task to match costs adapters about 10 points but nearly halves the base model's score.

In the author’s words from the Report · “Interpretation”

The synthetic counterfactual split shows the intended training effect: the adapter improves strict task consistency, and that improvement depends on intact support examples. The public split shows positive transfer from synthetic counterfactual episodes to unseen public text-transformation tasks. The public gain is support-sensitive: corrupting the support examples removes a material fraction of the effect. The ordinary synthetic control is close enough that the counterfactual ingredient is not isolated. The shuffled-label training control is close enough that a formatting explanation remains plausible.

Overview

Standalone experiment testing whether counterfactual episodic LoRA posttraining improves example-conditioned public text transformation accuracy across seeds.

Large artifacts, checkpoints, and the benchmark mirror live under /workspace/large_artifacts/qwen_counterfactual_icl_public_multiseed.

Planned Main Arms

  • cf_s1, cf_s2, cf_s3: counterfactual synthetic few-shot curriculum, three seeds.
  • ordinary_s1: ordinary synthetic few-shot curriculum control.
  • shuffled_train_s1: counterfactual input distribution with shuffled support labels during training.

All arms use the same synthetic/public evaluation seed. The final report is generated by src/aggregate_multiseed.py and includes both Markdown and HTML.

Final Read

The counterfactual adapter result is stable over three seeds: public full-task exact is 60.7% ± 2.6% versus 20.0% for base on the fixed public sample. It is also support-sensitive: shuffled support drops to 28.1% and no support drops to 1.5%.

The attribution is not clean. The ordinary synthetic-training control reaches 64.4%, and the shuffled-label training control reaches 62.2% with high shuffled-support performance. This supports a real public improvement from synthetic ICL-style LoRA tuning, but not a uniquely counterfactual support-induction mechanism.

Reports:

  • Markdown: reports/qwen_counterfactual_icl_public_multiseed_report.md
  • HTML: reports/qwen_counterfactual_icl_public_multiseed_report.html

Report

Rendered from reports/qwen_counterfactual_icl_public_multiseed_report.md

Question

Can LoRA posttraining on counterfactual few-shot episodes make Qwen3-4B rely more on the support examples of a text-transformation task, and does that transfer to a public benchmark rather than only to the synthetic generator?

The training signal is answer-only. No public benchmark labels are used for training. The controls test whether the effect survives support shuffling, no-support prompts, ordinary synthetic training, and deliberately shuffled training support labels.

Headline

  • Public PROSE full-task exact: base 20.0%; counterfactual adapter mean 60.7% with seed spread 2.6%; delta 40.7%.
  • Synthetic counterfactual full-task exact: base 38.3%; counterfactual adapter mean 92.8%.
  • Public support controls for the counterfactual adapter: normal 60.7%, shuffled 28.1%, no support 1.5%.
  • Ordinary synthetic-training control on public PROSE: 64.4%.
  • Shuffled-label training control on public PROSE: 62.2%.

Aggregate Metrics

armsplitsupport_moderunstasksrowsrow_exact_meanrow_exact_stdfull_task_exact_meanfull_task_exact_std
basepublic_prosenormal14513537.0%0.0%20.0%0.0%
basepublic_proseshuffled14513511.1%0.0%2.2%0.0%
counterfactual_adapterpublic_prosenone3451353.7%0.7%1.5%1.3%
counterfactual_adapterpublic_prosenormal34513570.6%1.5%60.7%2.6%
counterfactual_adapterpublic_proseshuffled34513545.4%3.7%28.1%2.6%
ordinary_adapterpublic_prosenone1451355.2%0.0%0.0%0.0%
ordinary_adapterpublic_prosenormal14513574.1%0.0%64.4%0.0%
ordinary_adapterpublic_proseshuffled14513548.9%0.0%26.7%0.0%
shuffled_label_adapterpublic_prosenone1451354.4%0.0%2.2%0.0%
shuffled_label_adapterpublic_prosenormal14513574.1%0.0%62.2%0.0%
shuffled_label_adapterpublic_proseshuffled14513564.4%0.0%51.1%0.0%
basesynthetic_counterfactualnormal16012053.3%0.0%38.3%0.0%
basesynthetic_counterfactualshuffled16012020.8%0.0%16.7%0.0%
counterfactual_adaptersynthetic_counterfactualnone3601205.3%3.4%2.8%1.9%
counterfactual_adaptersynthetic_counterfactualnormal36012096.1%0.5%92.8%1.9%
counterfactual_adaptersynthetic_counterfactualshuffled36012060.3%2.9%51.1%2.5%
ordinary_adaptersynthetic_counterfactualnone1601202.5%0.0%0.0%0.0%
ordinary_adaptersynthetic_counterfactualnormal16012096.7%0.0%95.0%0.0%
ordinary_adaptersynthetic_counterfactualshuffled16012058.3%0.0%46.7%0.0%
shuffled_label_adaptersynthetic_counterfactualnone1601200.8%0.0%0.0%0.0%
shuffled_label_adaptersynthetic_counterfactualnormal16012097.5%0.0%95.0%0.0%
shuffled_label_adaptersynthetic_counterfactualshuffled16012095.8%0.0%91.7%0.0%

Seed-Level Normal-Support Metrics

run_nameseedarmsplittasksrowsrow_exactfull_task_exact
cf_s120260628basepublic_prose4513537.0%20.0%
cf_s120260628basesynthetic_counterfactual6012053.3%38.3%
cf_s120260628counterfactual_adapterpublic_prose4513568.9%57.8%
cf_s120260628counterfactual_adaptersynthetic_counterfactual6012095.8%91.7%
cf_s220260629counterfactual_adapterpublic_prose4513571.1%62.2%
cf_s220260629counterfactual_adaptersynthetic_counterfactual6012096.7%95.0%
cf_s320260630counterfactual_adapterpublic_prose4513571.9%62.2%
cf_s320260630counterfactual_adaptersynthetic_counterfactual6012095.8%91.7%
ordinary_s120260628ordinary_adapterpublic_prose4513574.1%64.4%
ordinary_s120260628ordinary_adaptersynthetic_counterfactual6012096.7%95.0%
shuffled_train_s120260628shuffled_label_adapterpublic_prose4513574.1%62.2%
shuffled_train_s120260628shuffled_label_adaptersynthetic_counterfactual6012097.5%95.0%

Interpretation

The synthetic counterfactual split shows the intended training effect: the adapter improves strict task consistency, and that improvement depends on intact support examples. The public split shows positive transfer from synthetic counterfactual episodes to unseen public text-transformation tasks. The public gain is support-sensitive: corrupting the support examples removes a material fraction of the effect. The ordinary synthetic control is close enough that the counterfactual ingredient is not isolated. The shuffled-label training control is close enough that a formatting explanation remains plausible.

Charts

Normal-support full-task exact across runs

Synthetic learning versus public transfer

Support-dependence controls

Public task flips versus base

Training loss by run

Public Task Flips Versus Base

run_nameseedhelpedhurttiedtasks
cf_s1202606281812645
cf_s2202606292012445
cf_s3202606302012445

Public Family Breakdown

familytasks_basetasks_counterfactual_adapterfull_task_exact_basefull_task_exact_counterfactual_adapterrow_exact_baserow_exact_counterfactual_adapterdelta
Column110.0%100.0%0.0%100.0%100.0%
Currency110.0%100.0%66.7%100.0%100.0%
EmergencyCall110.0%100.0%0.0%100.0%100.0%
FilePath110.0%100.0%0.0%100.0%100.0%
ShippingCode330.0%88.9%33.3%92.6%88.9%
Number101010.0%63.3%30.0%72.2%53.3%
Name550.0%53.3%20.0%68.9%53.3%
Phone3366.7%100.0%66.7%100.0%33.3%
DateTime151520.0%44.4%35.6%53.3%24.4%
Meteorite110.0%0.0%0.0%0.0%0.0%
Email2250.0%50.0%83.3%83.3%0.0%
Song11100.0%100.0%100.0%100.0%0.0%
Address11100.0%0.0%100.0%66.7%-100.0%

Public Error Sample

run_nametask_idfamilyinputtargetprediction
cf_s1Address.000013AddressOne Main Parkway, Allentown, ND 41230nanOne
cf_s1DateTime.000016DateTimeJan 10 1975Fri W2Wed W1
cf_s1DateTime.000016DateTime1 Feb 2013Fri W5Wed W5
cf_s1DateTime.000016DateTime12 Dec 2002Thu W50Wed W46
cf_s1DateTime.000017DateTime0330224130/3/22413/3/2241
cf_s1DateTime.000029DateTime03302241TuesdayMonday
cf_s1DateTime.000029DateTime02-Aug-2160SaturdayMonday
cf_s1DateTime.000029DateTime23 May 1984WednesdayThursday
cf_s1DateTime.000032DateTime09:539:53 AM09:53 AM
cf_s1DateTime.000032DateTime1956-12-16 20:188:18 PMDecember 16, 1956 at 8:18 PM
cf_s1DateTime.000041DateTime4.2.17432/4/17434.2.1743
cf_s1DateTime.000081DateTime11:48PM11:45PM-12:15AM11:15PM-11:45PM
cf_s1DateTime.000084DateTime3/30/2241 16:15Tue 4:30 PMFri 16:15
cf_s1DateTime.000084DateTime8/2/2160 23:48Sat 12:00 AMWed 12:00 AM
cf_s1DateTime.000084DateTime5/23/1984 22:24Wed 10:30 PMThu 10:00 PM
cf_s1DateTime.000086DateTime16:15:084:00PM4:15PM
cf_s1DateTime.000086DateTime23:48:2011:30PM11:48PM
cf_s1DateTime.000086DateTime22:24:5910:00PM10:24PM
cf_s1DateTime.000109DateTime21-Jan-1985 05:44:43Monday, January 21, 1985Wednesday, January 21, 1985
cf_s1DateTime.000109DateTime16-Aug-1985 01:11:56Friday, August 16, 1985Wednesday, August 16, 1985
cf_s1DateTime.000109DateTime20-Dec-2033 18:36:29Tuesday, December 20, 2033Friday, December 20, 2033
cf_s1DateTime.000115DateTime21-Jan-1985 05:44:4340-600-20
cf_s1DateTime.000115DateTime16-Aug-1985 01:11:5640-600-20
cf_s1DateTime.000115DateTime20-Dec-2033 18:36:2920-400-20
cf_s1Email.000006Emailiñakiiñaki@proseware.comiñaki@contoso.com
cf_s1Meteorite.000001MeteoriteZunyi6822243-10-11 11:33:09
cf_s1Meteorite.000001MeteoriteElgin536482139-04-25 19:02:49
cf_s1Meteorite.000001MeteoriteNew Haven0662041-05-26 22:15:47
cf_s1Name.000023NameCecep SutresnaSutrSutre
cf_s1Name.000023NameMilica ZujovicZujoZujovic
cf_s1Name.000037NameMarcela Kubatovananova
cf_s1Name.000037NameMr. Hadar CaspitnanMr.
cf_s1Number.000008Number-13578-135.78-13.578
cf_s1Number.000008Number-1961.1180-19.611180-19.6118
cf_s1Number.000047Number1284.421285.001280.00
cf_s1Number.000047Number23224.9823225.0023220.00
cf_s1Number.000047Number1024.211025.001020.00
cf_s1Number.000069Number1202.343312001202
cf_s1Number.000069Number23224.12322523224
cf_s1Number.000069Number-23224.1-23225-23224
cf_s1ShippingCode.000002ShippingCode1Z I81 6QF 90 9601 169 46QFI81
cf_s1ShippingCode.000002ShippingCode1Z O63 B7Z 35 2550 248 6B7ZO63
cf_s2Address.000013AddressOne Main Parkway, Allentown, ND 41230nanOne
cf_s2DateTime.000016DateTimeJan 10 1975Fri W2Wed W52
cf_s2DateTime.000016DateTime12 Dec 2002Thu W50Thu W49
cf_s2DateTime.000029DateTime03302241TuesdayMonday
cf_s2DateTime.000029DateTime02-Aug-2160SaturdayMonday
cf_s2DateTime.000029DateTime23 May 1984WednesdayMonday
cf_s2DateTime.000081DateTime4:15PM4:15PM-4:45PM4:00PM-4:30PM
cf_s2DateTime.000081DateTime11:48PM11:45PM-12:15AM11:15PM-11:45PM
cf_s2DateTime.000084DateTime3/30/2241 16:15Tue 4:30 PMFri 4:00 PM
cf_s2DateTime.000084DateTime8/2/2160 23:48Sat 12:00 AMWed 12:00 AM
cf_s2DateTime.000084DateTime5/23/1984 22:24Wed 10:30 PMTue 10:00 PM
cf_s2DateTime.000086DateTime16:15:084:00PM4:15PM
cf_s2DateTime.000086DateTime23:48:2011:30PM11:40PM
cf_s2DateTime.000086DateTime22:24:5910:00PM10:15PM
cf_s2DateTime.000109DateTime21-Jan-1985 05:44:43Monday, January 21, 1985Wednesday, January 21, 1985
cf_s2DateTime.000109DateTime16-Aug-1985 01:11:56Friday, August 16, 1985Monday, August 16, 1985
cf_s2DateTime.000109DateTime20-Dec-2033 18:36:29Tuesday, December 20, 2033Monday, December 20, 2033
cf_s2DateTime.000115DateTime21-Jan-1985 05:44:4340-600-20

Artifacts

Limitations

The public evaluation is capped for runtime, and exact-match scoring is strict. The main counterfactual arm is multiseed; ordinary and shuffled-label controls are single-seed controls in this run. The experiment tests transfer from a synthetic counterfactual training distribution, not broad open-ended transformation ability.

Experiment log 9

Show the running log (9 entries)

Setup

  • Created fresh standalone experiment directory: /workspace/experiments/qwen_counterfactual_icl_public_multiseed.
  • Large artifacts directory: /workspace/large_artifacts/qwen_counterfactual_icl_public_multiseed.
  • Public benchmark mirror copied under the large-artifact directory.
  • Primary question: does counterfactual episodic LoRA posttraining improve support-conditioned public text transformation accuracy across seeds, beyond output-format or generic synthetic-training effects?

Run smoke_cf

  • Time UTC: 2026-06-28T05:50:51.863838+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 2, "log_every": 1, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 2, "query_n": 2, "run_name": "smoke_cf", "seed": 20260628, "skip_base_eval": false, "smoke": true, "support_n": 4, "synthetic_eval_pairs": 2, "train_episodes": 16, "train_mode": "counterfactual", "train_rows_per_episode": 2, "train_steps": 2, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 80.8
  • Synthetic adapter full-task exact: 25.0%
  • Public adapter full-task exact: 0.0%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Aggregation Harness

  • Added src/aggregate_multiseed.py.
  • Compile check passed for the training and aggregate scripts.
  • Smoke aggregation passed against smoke_cf.
  • Main gate plan: three counterfactual seeds plus ordinary-training and shuffled-label controls, all with fixed public/synthetic eval seed.

Main Gate Results

  • Completed cf_s1, cf_s2, cf_s3, ordinary_s1, and shuffled_train_s1.
  • Fixed eval set: 60 synthetic counterfactual tasks and 45 public PROSE tasks.
  • Base public full-task exact: 20.0%.
  • Counterfactual adapter public full-task exact: mean 60.7%, std 2.6% over 3 seeds.
  • Counterfactual adapter public controls: shuffled support 28.1%, no support 1.5%.
  • Ordinary synthetic-training control public full-task exact: 64.4%.
  • Shuffled-label training control public full-task exact: 62.2%; shuffled support remains high at 51.1%.
  • Main read: the public improvement is stable, but it is not uniquely explained by counterfactual support-induction training. Generic synthetic ICL tuning and even corrupted-support training reproduce much of the public gain, so the effect is likely a broader prompt-format/task-family adaptation plus some support sensitivity.
  • Final Markdown report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md
  • Final HTML report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.html

Run cf_s1

  • Time UTC: 2026-06-28T05:56:28.260234+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 4, "log_every": 10, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 45, "query_n": 2, "run_name": "cf_s1", "seed": 20260628, "skip_base_eval": false, "smoke": false, "support_n": 4, "synthetic_eval_pairs": 30, "train_episodes": 800, "train_mode": "counterfactual", "train_rows_per_episode": 2, "train_steps": 100, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 729.1
  • Synthetic adapter full-task exact: 91.7%
  • Public adapter full-task exact: 57.8%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Run cf_s2

  • Time UTC: 2026-06-28T06:08:54.410400+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 4, "log_every": 10, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 45, "query_n": 2, "run_name": "cf_s2", "seed": 20260629, "skip_base_eval": true, "smoke": false, "support_n": 4, "synthetic_eval_pairs": 30, "train_episodes": 800, "train_mode": "counterfactual", "train_rows_per_episode": 2, "train_steps": 100, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 409.3
  • Synthetic adapter full-task exact: 95.0%
  • Public adapter full-task exact: 62.2%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Run cf_s3

  • Time UTC: 2026-06-28T06:16:00.820755+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 4, "log_every": 10, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 45, "query_n": 2, "run_name": "cf_s3", "seed": 20260630, "skip_base_eval": true, "smoke": false, "support_n": 4, "synthetic_eval_pairs": 30, "train_episodes": 800, "train_mode": "counterfactual", "train_rows_per_episode": 2, "train_steps": 100, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 404.6
  • Synthetic adapter full-task exact: 91.7%
  • Public adapter full-task exact: 62.2%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Run ordinary_s1

  • Time UTC: 2026-06-28T06:22:59.909062+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 4, "log_every": 10, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 45, "query_n": 2, "run_name": "ordinary_s1", "seed": 20260628, "skip_base_eval": true, "smoke": false, "support_n": 4, "synthetic_eval_pairs": 30, "train_episodes": 800, "train_mode": "ordinary", "train_rows_per_episode": 2, "train_steps": 100, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 408.6
  • Synthetic adapter full-task exact: 95.0%
  • Public adapter full-task exact: 64.4%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Run shuffled_train_s1

  • Time UTC: 2026-06-28T06:30:03.483561+00:00
  • Config: {"batch_size": 1, "eval_seed": 20260701, "grad_accum": 4, "log_every": 10, "lora_alpha": 32, "lora_dropout": 0.05, "lora_r": 16, "lr": 0.0002, "max_grad_norm": 1.0, "max_length": 768, "max_new_tokens": 24, "model": "Qwen/Qwen3-4B", "no_train": false, "public_heldout_n": 3, "public_task_limit": 45, "query_n": 2, "run_name": "shuffled_train_s1", "seed": 20260628, "skip_base_eval": true, "smoke": false, "support_n": 4, "synthetic_eval_pairs": 30, "train_episodes": 800, "train_mode": "shuffled_labels", "train_rows_per_episode": 2, "train_steps": 100, "warmup_steps": 20, "weight_decay": 0.0}
  • Elapsed seconds: 371.2
  • Synthetic adapter full-task exact: 95.0%
  • Public adapter full-task exact: 62.2%
  • Report: /workspace/experiments/qwen_counterfactual_icl_public_multiseed/reports/qwen_counterfactual_icl_public_multiseed_report.md

Figures 9

adapter task flips
adapter task flips · analysis/figures/
aggregate full task exact
aggregate full task exact · analysis/figures/
aggregate training loss
aggregate training loss · analysis/figures/
full task exact by method
full task exact by method · analysis/figures/
public task flips by seed
public task flips by seed · analysis/figures/
row vs full task
row vs full task · analysis/figures/
support dependence
support dependence · analysis/figures/
synthetic vs public transfer
synthetic vs public transfer · analysis/figures/
training loss
training loss · analysis/figures/

Data files 20

Result tables and metrics copied from the experiment folder — preview inline or open the raw file.

Reproduce

The run commands are documented inside the experiment folder (see the README).

Browse the experiment folder on GitHub ↗