<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>陈文杰 · 写作</title><description>关于生物 AI、评估和可解释性的研究笔记。</description><link>https://www.witcwj.xyz/</link><language>zh-CN</language><item><title>如何设计结构化零假设？</title><link>https://www.witcwj.xyz/writing/structured-null-design/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/structured-null-design/</guid><description>随机打乱标签往往太弱。本文讨论如何在保留生物结构的同时，破坏我们声称检测到的信号。</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多表征探针使用的“对照”太容易被击败。随机打乱标签会破坏所有信息，包括探针本来可以合理利用的结构。因此，优于这种对照并不能证明太多。&lt;/p&gt;
&lt;h2 id=&quot;简单置乱的问题&quot;&gt;简单置乱的问题&lt;/h2&gt;
&lt;p&gt;当我们说模型“编码”了某种残基级属性时，隐含的比较对象应当是一个无法从序列恢复该属性的世界。但同一家族中的序列会共享统计特征。探针可能只是识别了蛋白质家族，而不是真正找到了残基级信号。&lt;/p&gt;
&lt;h2 id=&quot;一个可用的定义&quot;&gt;一个可用的定义&lt;/h2&gt;
&lt;p&gt;结构化零假设应满足以下条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;保留整体序列统计特征，例如长度、组成和家族结构。&lt;/li&gt;
&lt;li&gt;保留标签的边际分布。&lt;/li&gt;
&lt;li&gt;破坏我们声称模型捕获到的特定“序列 → 标签”关系。&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;在家族内置乱标签，同时保留家族层面的基础比例。&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;尚未解决的问题&quot;&gt;尚未解决的问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;零假设需要有多强的对抗性？是否要保留基序？&lt;/li&gt;
&lt;li&gt;不同注释类型是否需要分别设计零假设？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是一篇持续更新的研究笔记。我会随着 SAE-DISTILL 的零假设测试逐步稳定而继续修订。&lt;/p&gt;</content:encoded><category>评估</category><category>统计学</category><category>蛋白质语言模型</category></item><item><title>如何解释蛋白质语言模型特征</title><link>https://www.witcwj.xyz/writing/interpreting-plm-features/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/interpreting-plm-features/</guid><description>与直接分析单个神经元相比，稀疏自编码器能为 PLM 嵌入分析带来什么，又有哪些问题仍然无法回答。</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;蛋白质语言模型中的单个神经元通常具有多义性：同一维度可能同时响应疏水性、二级结构和蛋白质家族特征。稀疏自编码器（SAE）希望得到含义更单一的特征，但这种含义仍然需要严格检验。&lt;/p&gt;
&lt;h2 id=&quot;为什么不用原始维度而使用-sae&quot;&gt;为什么不用原始维度，而使用 SAE&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;叠加表示&lt;/strong&gt;：PLM 需要在有限维度中容纳更多概念，SAE 可以扩展表示基。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;便于比较&lt;/strong&gt;：特征更容易在不同层和不同检查点之间对齐。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合作为探针目标&lt;/strong&gt;：稀疏特征通常比原始维度更适合做可恢复性测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;最小训练示例&quot;&gt;最小训练示例&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;真正困难的部分不在损失函数，而在于如何评估这些特征到底表示什么。&lt;/p&gt;
&lt;h2 id=&quot;sae-无法直接告诉我们什么&quot;&gt;SAE 无法直接告诉我们什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一个特征是否真正被下游任务使用，还是只是存在于表征中。&lt;/li&gt;
&lt;li&gt;特征与标签之间的相关性，能否通过家族留出评估。&lt;/li&gt;
&lt;li&gt;学到的特征字典在不同随机种子下是否稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题需要各自独立的实验。没有结构化评估的可解释性结果，只能作为假设，不能直接当作结论。&lt;/p&gt;</content:encoded><category>稀疏自编码器</category><category>可解释性</category><category>蛋白质语言模型</category></item><item><title>什么样的生物 AI 结果才可信？</title><link>https://www.witcwj.xyz/writing/convincing-biological-ai/</link><guid isPermaLink="true">https://www.witcwj.xyz/writing/convincing-biological-ai/</guid><description>我的检查清单：外部验证、校准、数据泄漏审计和论断边界——这些决定了一个模型只是演示，还是能真正使用的工具。</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;做过计算病理和抗毒力候选物筛选后，我逐渐整理出一份简短的检查清单，用来判断自己是否应该相信一个结果。&lt;/p&gt;
&lt;h2 id=&quot;1-数据划分要接近真实使用场景&quot;&gt;1. 数据划分要接近真实使用场景&lt;/h2&gt;
&lt;p&gt;随机划分天然容易得到乐观结果。蛋白质任务应考虑家族留出，临床数据应使用外部队列。数据划分要尽量模拟现实中最困难的使用情况。&lt;/p&gt;
&lt;h2 id=&quot;2-必须报告校准而不是默认模型可靠&quot;&gt;2. 必须报告校准，而不是默认模型可靠&lt;/h2&gt;
&lt;p&gt;在生物医学任务中，只有准确率而没有校准是不够的。可靠性图和预期校准误差（ECE）的计算成本不高，却能暴露很多问题。&lt;/p&gt;
&lt;h2 id=&quot;3-要主动寻找数据泄漏&quot;&gt;3. 要主动寻找数据泄漏&lt;/h2&gt;
&lt;p&gt;仅按完全相同的样本去重远远不够。近重复样本、共享分子骨架和批次效应都需要单独检查。&lt;/p&gt;
&lt;h2 id=&quot;4-写作时要限制论断强度&quot;&gt;4. 写作时要限制论断强度&lt;/h2&gt;
&lt;p&gt;稿件中的每个强论断都应对应具体实验，每个实验也应说明可能的失效模式。如果一个论断无法通过结构化零假设检验，就不应该写出来。&lt;/p&gt;
&lt;h2 id=&quot;5-失败结果也应当可以复现&quot;&gt;5. 失败结果也应当可以复现&lt;/h2&gt;
&lt;p&gt;可复现性也包括阴性结果。只能复现成功案例的流程，并不是真正可复现的流程。&lt;/p&gt;
&lt;p&gt;这份清单故意保持简短，因为完成这些检查的成本，通常远低于错误结论带来的代价。&lt;/p&gt;</content:encoded><category>评估</category><category>生物医学 AI</category><category>研究方法</category></item></channel></rss>