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:
1 parent
4369bcefa8
commit
95b5857189
28 files changed
+5547
No files matched your search
@@ -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()
|
||||
Reference in new issue
Block a user