Add literature review protocol, searches and first snowball round

Six seeds snowballed (Semantic Scholar) plus logged keyword searches
(OpenAlex, arXiv): 2,127 unique records, 480 title/abstract screened.
AI first-pass suggestions are in their own column; decisions are pending.

Claude-Session: https://claude.ai/code/session_01S8KN7NuUCm8nXLmy6eDuVv
This commit is contained in:
Cormac Shannon committed 2026-10-28 18:00:06 +00:00
1 parent 4369bcefa8
commit 95b5857189
28 files changed
+5547

No files matched your search

+139
View File
@@ -0,0 +1,139 @@
#!/usr/bin/env python3
"""Record the AI first-pass screening suggestions in ../search/screening.csv.
These are SUGGESTIONS from a title/abstract read by Claude (28/10/2026), not
decisions. The `decision` column is left for Cormac. Codes are defined in
protocol.md section 5. A '*' in the code marks a paper whose question looks
close to the thesis RQ (needs a "how we differ" note in the extraction table).
Matching is by arXiv id / DOI / title fragment. Re-runnable: it only writes
the ai_proposal column (and reason, if empty).
"""
import csv
import os
HERE = os.path.dirname(os.path.abspath(__file__))
SHEET = os.path.normpath(os.path.join(HERE, "..", "search", "screening.csv"))
# (match, proposal, code, note)
P = [
# --- seeds -------------------------------------------------------------
("2010.04245", "include", "SEED", "origin of QK-norm (small NMT models)"),
("findings-emnlp.379", "include", "SEED", "origin of QK-norm (ACL anthology copy of 2010.04245)"),
("2302.05442", "include", "SEED", "QK-norm popularised to stop logit growth at 22B"),
("2303.06296", "include", "SEED", "attention entropy collapse <-> instability"),
("2309.14322", "include", "SEED*", "LR-sensitivity metric; qk-layernorm at small scale"),
("2602.02522", "include", "SEED*", "QK-norm largest win at 70M, bundled with muP"),
("2410.16682", "include", "IC*", "QK-norm + softcap -> 1.5x LR before divergence, 830M"),
# --- core: evaluates QK-norm / logit control on stability or LR ---------
("2511.21377", "include", "IC*", "QK-norm vs alternatives for logit control; LR ablations"),
("2607.18363", "include", "IC*", "QK-norm keeps 48-layer stacks trainable: depth evidence (H3)"),
("2610.34582", "include", "IS*", "single-variable ablations at 130M incl. QK-norm (HobbyLM)"),
("zenodo.20803082", "include", "IS*", "29-36M, QK-norm x depth x 3 seeds sweep; Zenodo preprint, check quality"),
("2610.17969", "include", "IA*", "compares vs QK-Norm across 16x LR range at 124M"),
("2606.16310", "include", "IC", "QK-norm permits higher LR; high-LR stress test vs QK-clip"),
("2603.02170", "include", "IC", "QK-norm necessary for stable low-bit training at large tokens/step"),
("2603.11611", "maybe", "IC", "NoPE loss spikes mitigated by QK-norm (side finding)"),
("2602.05006", "include", "IC", "Lp-norm generalisation of QKNorm (variant)"),
("2602.01212", "include", "IA", "SimpleGPT normalisation vs LLaMA2+QKNorm, LR ablations"),
("2505.22014", "maybe", "IA", "approx. normalised transformer vs GPT+QK-norm convergence"),
("2601.02031", "maybe", "IA", "output-logit divergence; z-loss / softcap context"),
("2501.18795", "maybe", "IC", "RoPE/NoPE/QK-norm attention patterns, long context focus"),
("2507.13338", "maybe", "IA", "Lipschitz transformers trained without QK-norm/softcap"),
("Kimi K2", "include", "IA", "MuonClip/QK-clip: alternative fix for attention-logit explosion"),
("2502.02732", "include", "IA", "Peri-LN: normalisation placement neighbour"),
("2503.04598", "include", "IA", "HybridNorm: normalisation placement neighbour"),
("2110.09456", "include", "IA", "NormFormer: extra normalisation"),
("Spike No More", "include", "IA", "pretraining loss-spike mitigation"),
("Stable and low-precision training for large-scale vision", "include", "IM", "Wortsman et al. follow-up on instability"),
("On Layer Normalization in the Transformer Architecture", "include", "BG", "Pre-LN vs Post-LN, warmup and LR (2020)"),
("Transformers without Normalization", "maybe", "IA", "DyT replaces norm layers"),
("Qwen3.8-Next", "maybe", "IC", "industry architecture study incl. training stability"),
# --- mechanism: why logits grow / why QK-norm works ---------------------
("2505.15548", "include", "IM", "dense local dependencies -> attention-logit explosion"),
("2505.21910", "include", "IM", "W_q^T W_k spectral concentration -> entropy collapse, warmup"),
("2501.12352", "maybe", "IM", "theory justifying QK-norm (test-time regression view)"),
("2402.02098", "include", "IM", "QK eigenspectrum concentration and entropy collapse"),
("2505.24333", "include", "IM", "rank vs entropy collapse in deep transformers (depth)"),
("nht8-e622", "include", "IM", "variance sensitivity -> attention entropy collapse"),
("2608.02091", "maybe", "IM", "low-precision attention collapse; QK-norm disrupts it"),
("2609.34272", "maybe", "IM", "BF16 attention gradients; logit growth late in training"),
("2608.14712", "include", "IM", "how to measure attention entropy properly (metric choice)"),
("2502.00919", "maybe", "IM", "attention sinks persist with QK-norm"),
("2410.10781", "include", "IM", "when attention sinks emerge (seed paper ref)"),
("2402.17762", "include", "IM", "massive activations -> attention sinks"),
("Efficient Streaming Language Models with Attention Sinks", "maybe", "IM", "attention sinks (inference paper, mechanism background)"),
("The Curse of Depth", "include", "IM", "depth effects in LLMs (H3 context)"),
("2601.22966", "maybe", "IM", "attention + residual sinks, outlier rescaling"),
("Exact Attention Sensitivity", "maybe", "IM", "attention sensitivity and stability geometry"),
("Normalization in Attention Dynamics", "maybe", "IM", "normalisation in attention dynamics"),
("Active-Dormant Attention Heads", "maybe", "IM", "extreme-token phenomena mechanism"),
("Mechanism-Aligned Observability", "maybe", "IM", "instability diagnostics; possible metrics"),
# --- method / scale / confounds ----------------------------------------
("2203.03466", "include", "BG", "muP: the confound held OFF"),
("PolyPythias", "include", "IS", "stability across 50 small-model seeds: seed-variance precedent"),
("Weight Decay may matter more than muP", "maybe", "BG", "LR transfer without muP"),
("CompleteP", "maybe", "BG", "depth-wise parametrisation, LR across depth"),
("Effective Learning Rate Governs Loss Dynamics", "maybe", "BG", "effective LR view of loss dynamics"),
("How to set AdamW's weight decay", "maybe", "BG", "AdamW hyperparameters vs scale"),
("Deconstructing What Makes a Good Optimizer", "maybe", "BG", "LR stability across optimisers, small LMs"),
("2609.14715", "maybe", "IS", "sub-150M depth study (QK-norm fixed, not varied)"),
("zenodo.18924690", "maybe", "IS", "GPT-2-scale modernisation incl. QK-norm; Zenodo, check quality"),
("Cerebras-GPT", "maybe", "BG", "muP in small open models"),
# --- duplicates / fragments --------------------------------------------
("variancesensitivityinducesattentionentropycollapseintransformers", "exclude", "E4", "duplicate record"),
("Intriguing", "exclude", "E4", "earlier title / duplicate of Wortsman et al. 2309.14322"),
("2022resultstoprobe", "exclude", "E4", "citation-context fragment, not a paper"),
("canrecoverfrom", "exclude", "E4", "citation-context fragment, not a paper"),
("wealsoobserved", "exclude", "E4", "citation-context fragment, not a paper"),
("Duality, Weight Decay, and Metrized", "exclude", "E4", "near-duplicate of 2507.13338"),
# --- LLMs for literature search (supervisor: 'find a paper that backs it up')
("Preliminary Guidelines for Using and Evaluating GenAI", "include", "LLM*", "Kitchenham et al. GUEST guidelines for GenAI in SLRs (SE)"),
("3674805.3686666", "include", "LLM", "ChatGPT for SLR selection in SE: accuracy evaluation"),
("wsese66602.2025.00010", "include", "LLM", "difficulties replicating LLM-supported SLRs in SE"),
("3539618.3591703", "include", "LLM", "ChatGPT writing Boolean search queries (SIGIR)"),
("jrsm.1715", "include", "LLM", "GPT-4 vs humans across SR stages; pre-registered; caution"),
("j.jclinepi.2025.111746", "include", "LLM", "scoping review: LLMs for SRs 'not yet ready'"),
("s10515-026-00629-6", "maybe", "LLM", "GPT-4o on SLR sub-tasks (SE)"),
("s13643-024-02575-4", "maybe", "LLM", "LLM title/abstract screening (biomedical)"),
("2196/48996", "maybe", "LLM", "automated screening with LLMs (clinical)"),
("jamanetworkopen.2024.20496", "maybe", "LLM", "LLM citation screening performance"),
("ocaf063", "maybe", "LLM", "LLMs as literature-review tools: review"),
("pnas.2411962122", "maybe", "LLM", "LLMs in literature screening (PNAS perspective)"),
]
DOMAIN = ("E1", "applies a transformer in another domain; QK-norm/logit control incidental")
def main():
rows = list(csv.DictReader(open(SHEET)))
hits = {m: 0 for m, *_ in P}
for r in rows:
if r["auto_stage"] != "SCREEN":
continue
hay = f"{r['key']} {r['title']}".lower()
for m, prop, code, note in P:
if m.lower() in hay:
r["ai_proposal"] = f"{prop} [{code}] {note}"
hits[m] += 1
break
else:
lit = r["found_by"].startswith("L") and ";" not in r["found_by"]
if lit:
r["ai_proposal"] = "exclude [E6] uses LLMs as a research subject, not as a review tool"
else:
r["ai_proposal"] = "exclude [E5] title/abstract: not about attention-logit control or LM training stability"
with open(SHEET, "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(rows[0]))
w.writeheader()
w.writerows(rows)
missing = [m for m, n in hits.items() if n == 0]
from collections import Counter
c = Counter(r["ai_proposal"].split(" ")[0] for r in rows if r["auto_stage"] == "SCREEN")
print("proposals:", dict(c))
if missing:
print("patterns that matched nothing:", missing)
if __name__ == "__main__":
main()