<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Chen Wenjie · Writing</title><description>Research notes on AI for biology, evaluation, and interpretability.</description><link>https://www.witcwj.xyz/</link><language>en</language><item><title>How Should We Design a Structured Null?</title><link>https://www.witcwj.xyz/writing/structured-null-design/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/structured-null-design/</guid><description>Random label shuffles are too weak. Notes on building null distributions that preserve biological structure while destroying the signal you claim to detect.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most “controls” in representation probing are too easy to beat. A random label shuffle destroys everything — including the structure your probe might legitimately exploit — so surviving it proves almost nothing.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-with-naive-shuffles&quot;&gt;The problem with naive shuffles&lt;/h2&gt;
&lt;p&gt;When we claim a model “encodes” a residue-level property, the implicit comparison is against a world where the property cannot be recovered from sequence. But sequences in the same family share statistical texture. A probe can succeed by exploiting family membership rather than residue signal.&lt;/p&gt;
&lt;h2 id=&quot;a-working-definition&quot;&gt;A working definition&lt;/h2&gt;
&lt;p&gt;A structured null should:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Preserve global sequence statistics (length, composition, family structure).&lt;/li&gt;
&lt;li&gt;Preserve the label’s marginal distribution.&lt;/li&gt;
&lt;li&gt;Destroy the specific sequence→label coupling you claim the model captures.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; structured_null&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(seq_labels, family_ids, rng):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;    &quot;&quot;&quot;Shuffle labels within family, preserving family-level base rates.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    out &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; fam &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(family_ids):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        idx &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; [i &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; i, f &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; enumerate&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(family_ids) &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; f &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; fam]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        perm &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; rng.permutation(idx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; a, b &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; zip&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(idx, perm):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            out[a] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; seq_labels[b]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;open-questions&quot;&gt;Open questions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How adversarial should the null be? (Motif-preserving shuffles?)&lt;/li&gt;
&lt;li&gt;Should the null be matched to each annotation type separately?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an ongoing note; I will update it as the SAE-DISTILL null battery stabilizes.&lt;/p&gt;</content:encoded><category>evaluation</category><category>statistics</category><category>protein-language-models</category></item><item><title>Interpreting Protein Language Model Features</title><link>https://www.witcwj.xyz/writing/interpreting-plm-features/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/interpreting-plm-features/</guid><description>What sparse autoencoders give us over raw neurons when analyzing PLM embeddings — and what they still cannot tell us.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Raw neurons in protein language models are polysemantic: a single dimension responds to hydrophobicity, secondary structure, and family artifacts at once. Sparse autoencoders (SAEs) promise monosemantic features — but the promise needs auditing.&lt;/p&gt;
&lt;h2 id=&quot;why-saes-over-raw-dimensions&quot;&gt;Why SAEs over raw dimensions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Superposition&lt;/strong&gt;: PLMs pack more concepts than dimensions. SAEs expand the basis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparability&lt;/strong&gt;: features are easier to align across layers and checkpoints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Probe targets&lt;/strong&gt;: a sparse feature is a cleaner unit for recoverability tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;a-minimal-training-sketch&quot;&gt;A minimal training sketch&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;loss &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; mse(x, decode(features)) &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; l1 &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; features.abs().mean()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The real work is not the loss — it is the evaluation of what the features mean.&lt;/p&gt;
&lt;h2 id=&quot;what-saes-cannot-tell-you&quot;&gt;What SAEs cannot tell you&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Whether a feature is &lt;em&gt;used&lt;/em&gt; downstream, or merely present.&lt;/li&gt;
&lt;li&gt;Whether feature–label correlation survives family-held-out splits.&lt;/li&gt;
&lt;li&gt;Whether the dictionary is stable across seeds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these needs its own experiment. Interpretability findings without structured evaluation are hypotheses, not conclusions.&lt;/p&gt;</content:encoded><category>sparse-autoencoders</category><category>interpretability</category><category>protein-language-models</category></item><item><title>What Makes a Biological AI Result Convincing?</title><link>https://www.witcwj.xyz/writing/convincing-biological-ai/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/convincing-biological-ai/</guid><description>A personal checklist: external validation, calibration, leakage audits, and claim boundaries — the difference between a demo and a tool.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After working on computational pathology and anti-virulence discovery, I have converged on a short checklist for whether I believe my own results.&lt;/p&gt;
&lt;h2 id=&quot;1-the-split-reflects-deployment&quot;&gt;1. The split reflects deployment&lt;/h2&gt;
&lt;p&gt;Random splits are optimistic by construction. Family-held-out for proteins, external cohorts for clinical data — the split must simulate the hardest realistic use.&lt;/p&gt;
&lt;h2 id=&quot;2-calibration-is-reported-not-assumed&quot;&gt;2. Calibration is reported, not assumed&lt;/h2&gt;
&lt;p&gt;Accuracy without calibration is a liability in biomedicine. Reliability diagrams and ECE cost little and reveal a lot.&lt;/p&gt;
&lt;h2 id=&quot;3-leakage-has-been-actively-hunted&quot;&gt;3. Leakage has been actively hunted&lt;/h2&gt;
&lt;p&gt;Dedup by identity is not enough. Near-duplicates, shared scaffolds, batch effects — each needs a specific audit.&lt;/p&gt;
&lt;h2 id=&quot;4-claims-are-bounded-in-writing&quot;&gt;4. Claims are bounded in writing&lt;/h2&gt;
&lt;p&gt;Every strong sentence in the manuscript should map to a specific experiment, and every experiment should have a stated failure mode. If a claim cannot survive a structured null, it should not be made.&lt;/p&gt;
&lt;h2 id=&quot;5-someone-could-reproduce-the-disappointment&quot;&gt;5. Someone could reproduce the disappointment&lt;/h2&gt;
&lt;p&gt;Reproducibility includes the negative results. A pipeline that can only reproduce successes is not reproducible.&lt;/p&gt;
&lt;p&gt;This list is short on purpose. Each item is cheap compared to the cost of being wrong.&lt;/p&gt;</content:encoded><category>evaluation</category><category>biomedical-ai</category><category>research-methodology</category></item></channel></rss>