<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>南冥鹏影</title><link>https://fupcode.com/blog/</link><description>南冥鹏影</description><generator>Hugo 0.168.0 &amp; FixIt v1.0.0-beta.4</generator><language>zh-CN</language><lastBuildDate>Fri, 16 Oct 2026 00:14:07 +0800</lastBuildDate><atom:link href="https://fupcode.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>《GEB》随笔：信息的三个层面</title><link>https://fupcode.com/blog/posts/book-notes/geb-notes-message/</link><pubDate>Thu, 15 Oct 2026 22:15:49 +0800</pubDate><guid>https://fupcode.com/blog/posts/book-notes/geb-notes-message/</guid><category domain="https://fupcode.com/blog/categories/%E9%9A%8F%E7%AC%94/">随笔</category><description>&lt;!--post--&gt;&#13;&#10;&lt;p&gt;《哥德尔、艾舍尔、巴赫》（GEB）中写道，信号分三个层面：（1）框架消息、（2）外在消息、（3）内在消息。原文对三者的概述为：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;这当中我们最熟悉的是（3），即内在消息，它也就是预定要传送的消息：在音乐中是情感体验，在遗传学中是表现型，在书板上是古代文明的王权与礼仪，如此等等。&lt;/p&gt;&#10;&lt;p&gt;理解内在消息就是抽取出发送人所要传递的意义。&lt;/p&gt;&#10;&lt;p&gt;框架消息是这样一种消息：“我是一条消息，你有本事就来解译我！”它是由信息携带者总体的结构特征隐含地传递的。&lt;/p&gt;&#10;&lt;p&gt;理解框架消息就是确认需要一种解码机制。&lt;/p&gt;&#10;&lt;p&gt;如果确认了这样的框架消息，那么人们的注意力就会转到第2层：外在消息。这是由消息中符号的模式及结构隐含地携带的信息，说明如何去解译内在消息。&lt;/p&gt;&#10;&lt;p&gt;理解外在消息就是建造——或知道如何建造——能正确解译内在消息的解码机制。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;作者给出了三个非形式化、感性的层面，却让我不由得联想一些形式化的东西。&lt;/p&gt;&#10;&lt;p&gt;框架消息让我首先想到信号的熵和自信息量。在信息学中，熵是描述了一个随机变量的不确定度，而自信息量描述这个随机变量取值有多罕见，或者说，出乎意料。但事实上，假设正在接受无线电信号，噪声的自信息量是比人声高的，因为人声是有规律的，更可以预测。这说明，框架消息并不能简单地用自信息量来描述，我们推断一个信号是否要解读，应该还是经过了一番贝叶斯推断的。无规律的信号我们会认为是噪声，过于规律的信号可解读的信息又不多，我觉得，对人类而言，既具有一定规律、又包含变化的信号，往往更容易引发持续解读的兴趣。&lt;/p&gt;&#10;&lt;p&gt;这个发现让我很沮丧，这样的话，我们如何发出一个信号，使另一个智慧文明能够首先接收到框架消息，认为这是一个消息呢？这就不能形式化地求解出一个最佳答案。一个经典答案是数列，斐波拉契数列或者质数数列，因为我们推断另一个智慧文明也极大可能掌握了相同的数学。不过这里好像脱离了讨论框架信息的范围，数学数列还承载了外在消息和内在消息。让掌握无线电的外星文明接受到框架消息应该是很简单的，只要让他在特定频段接收到不是宇宙噪声的信号就行，就像你在安静环境对任何一个有耳朵的动物大叫一声，它都会听到，并尝试寻找你。然而，当接收者的感知机制、先验知识和搜索策略完全未知时，我们无法定义一个普遍适用的最优目标。&lt;/p&gt;&#10;&lt;p&gt;对于外在消息，作者立了一个很有趣的靶子。我们接收到一个中文消息，它的外在消息就是“我是中文消息，用中文解读我吧”，如果你发中文消息给一个不会中文，甚至不知道中文概念的外国人，即使你用中文写上“这是一条中文消息”，也于事无补，仅仅在消息内部声明它应该如何被解读，并不能保证一个尚未掌握解码机制的接收者理解这项声明。就像是原文中说的：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;在你理解任何一条消息之前，你必须有另一条消息来告诉你如何理解这条消息；换句话说，存在一个具有无穷多层次的消息体系，这就阻止了对任何消息的理解。&lt;/p&gt;&#10;&lt;p&gt;但是，我们都知道这些悖论是无效的，因为规则的确是在被使用，而消息也的确是在被理解。这是怎么回事呢？&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;作者同样做出了很好的解释&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;我们大脑的结构是漫长的进化过程的结果，它们的运行是受物理规律控制的。既然它们是物理实体，我们的大脑在运行时无需被告知如何运行。就是在这一层次上，物理规律产生出思维，因而卡罗尔的规则悖论被打破了。与此相类似，在大脑把输入数据解释成消息的那个层次上，消息悖论被打破了。似乎大脑原本就配备着一些“硬件”来识别哪些东西是消息，而且能对这些消息进行解码。就是这种最低限度的抽取内在意义的天生能力使得高度递归的、滚雪球式的语言习得过程得以发生。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;最近玩完了《底特律：变人》，不禁让我联想到，人工智能与人类在接收和理解消息的底层机制上，或许存在着某种根本性的差异。&lt;/p&gt;&#10;&lt;p&gt;我们当然可以让机器在特定场景下表现出与人类相似的共情反应，但这种相似终究只是我们观察到的结果。人与人之间的共情则有所不同。我们之所以容易被他人的情绪打动，不仅是因为能够理解对方的表达，更是因为我们知道，彼此拥有相似的生理结构，以及由漫长的演化过程塑造出的情绪反应机制。正是这种底层机制的共通性，使我们能够从他人的情绪反应中推及自身，进而相信彼此在某些感受上是相通的。&lt;/p&gt;&#10;&lt;p&gt;然而，面对机器时，这种信任似乎就不那么容易建立了。即使我们观察到机器在某些场景中表现出与人类相同的情绪反应，又如何确信它在其他场景中也会如此？倘若某些情境从未被开发者考虑，也未曾出现在训练过程中，机器还能表现出同样的共情吗？&lt;/p&gt;&#10;&lt;p&gt;这是我第一次在博客上写读书随笔，我的讨论也可能有诸多谬误，但我觉得我还是得把想法写下来，总之先放这里吧。&lt;/p&gt;&#10;</description></item><item><title>REDIAL (2026)：从 Embedding 扰动看 RNA 语言模型学到了什么</title><link>https://fupcode.com/blog/posts/research-notes/paper-review-redial/</link><pubDate>Thu, 17 Sep 2026 17:00:00 +0800</pubDate><guid>https://fupcode.com/blog/posts/research-notes/paper-review-redial/</guid><category domain="https://fupcode.com/blog/categories/%E7%A7%91%E7%A0%94%E7%AC%94%E8%AE%B0/">科研笔记</category><description>&lt;p&gt;REDIAL 核心方法：&lt;strong&gt;突变一个碱基，观察其他位置的 embedding 怎么变&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这篇文章主要回答两个问题：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;不训练下游预测器，能不能直接读出 RNA 语言模型中的结构信息？&lt;/li&gt;&#10;&lt;li&gt;一个 12 层的 RNA 语言模型，每一层都有必要吗？&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;本文基于作者于 2026 年 5 月 12 日发布的 bioRxiv 预印本版本。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 class="heading-element" id="评价基础模型依赖下游结构预测"&gt;&lt;span&gt;评价基础模型依赖下游结构预测&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%af%84%e4%bb%b7%e5%9f%ba%e7%a1%80%e6%a8%a1%e5%9e%8b%e4%be%9d%e8%b5%96%e4%b8%8b%e6%b8%b8%e7%bb%93%e6%9e%84%e9%a2%84%e6%b5%8b" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;评价基础模型如 RNA-FM时，主要关注的是 RNA-FM 提取 embedding 后，如何通过下游模块生成三维结构。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;RNA 序列 → 预训练语言模型 → embedding → 下游结构模块 → 3D 结构&#13;&#10; ↑ ↑&#13;&#10; 预训练学到的信息 结构训练集、模型先验等&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;下游模型可以从结构训练数据中补充信息，也可能记住某些常见结构。因此，最终预测准确，不足以单独证明基础模型学到了可泛化的结构规律。&lt;/p&gt;&#10;&lt;p&gt;这篇文章希望绕开下游训练，直接检查预训练模型的表征。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="redial从单点突变到-coupling-map"&gt;&lt;span&gt;REDIAL：从单点突变到 coupling map&lt;/span&gt;&#13;&#10; &lt;a href="#redial%e4%bb%8e%e5%8d%95%e7%82%b9%e7%aa%81%e5%8f%98%e5%88%b0-coupling-map" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img loading="lazy" src='https://img.fupcode.com/images/landscape/webp/20260917_102125_628.webp' alt="REDIAL 与 Categorical Jacobian 的读取位置"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;原文 Fig. 1：REDIAL 观察各层 embedding；Categorical Jacobian 观察 LM-head 输出的 logits。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="核心思路"&gt;&lt;span&gt;核心思路&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%a0%b8%e5%bf%83%e6%80%9d%e8%b7%af" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;如果位置 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6595em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 与位置 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.854em;vertical-align:-0.1944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 存在结构或序列依赖，改变 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6595em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的碱基，可能影响模型对 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.854em;vertical-align:-0.1944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的表示。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="计算过程"&gt;&lt;span&gt;计算过程&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;对长度为 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 RNA，模型输出 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L\times c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.4306em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 embedding，其中 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.4306em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是 hidden dimension。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;按通道标准化&lt;/strong&gt;：让各通道均值为 0、方差为 1，避免少数高幅度通道主导结果。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;逐位置突变&lt;/strong&gt;：每个位置枚举 A、C、G、U，包含原始碱基，共 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;4L&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个组合。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;计算扰动&lt;/strong&gt;：将突变序列与原序列的标准化 embedding 相减。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;聚合并去背景&lt;/strong&gt;：得到位置之间的 coupling map。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;用 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\tilde z&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6679em;"&gt;&lt;/span&gt;&lt;span class="mord katex-accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6679em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.044em;"&gt;z&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.35em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.1944em;"&gt;&lt;span class="mord"&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 表示标准化后的 embedding，扰动张量为：&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;J&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mspace width="2em"/&gt;&lt;mi&gt;J&lt;/mi&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;msup&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10;J_{iajk}=\tilde z_{jk}(x^{i\to a})-\tilde z_{jk}(x),&#13;&#10;\qquad J\in\mathbb{R}^{L\times4\times L\times c}.&#13;&#10;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0962em;"&gt;J&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0962em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;iaj&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:1.1608em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord katex-accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6679em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.044em;"&gt;z&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.35em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.1944em;"&gt;&lt;span class="mord"&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8747em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;→&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:1.0361em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord katex-accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6679em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.044em;"&gt;z&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.35em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.1944em;"&gt;&lt;span class="mord"&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:2em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0962em;"&gt;J&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.8913em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8913em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;L&lt;/span&gt;&lt;span class="mbin mtight"&gt;×&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mbin mtight"&gt;×&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;L&lt;/span&gt;&lt;span class="mbin mtight"&gt;×&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;其中，&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6595em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是突变位置，&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.4306em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是替换碱基，&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.854em;vertical-align:-0.1944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是被观察的位置，&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是 embedding 通道。&lt;/p&gt;&#10;&lt;p&gt;按原文 Methods 的公式，对碱基和通道维度取 Frobenius 范数的平方：&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;munder&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;/munder&gt;&lt;msubsup&gt;&lt;mi&gt;J&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10;C_{ij}=\sum_{a,k}J_{iajk}^{2}.&#13;&#10;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0715em;"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:2.4882em;vertical-align:-1.4382em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.05em;"&gt;&lt;span style="top:-1.8479em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.05em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.4382em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0962em;"&gt;J&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8641em;"&gt;&lt;span style="top:-2.453em;margin-left:-0.0962em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;iaj&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3831em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;随后对称化，并做 Average Product Correction（APC）：&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mspace width="2em"/&gt;&lt;msub&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;munder&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/munder&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;munder&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/munder&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;munder&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/munder&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10;S_{ij}=\frac{C_{ij}+C_{ji}}{2},\qquad&#13;&#10;M_{ij}=S_{ij}-\frac{\left(\sum_t S_{it}\right)\left(\sum_s S_{sj}\right)}{\sum_{s,t}S_{st}}.&#13;&#10;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0576em;"&gt;S&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:2.0463em;vertical-align:-0.686em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.3603em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0715em;"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0715em;"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:2em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.109em;"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0576em;"&gt;S&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:2.5615em;vertical-align:-1.1218em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.4397em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:0em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1308em;"&gt;&lt;span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4358em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0576em;"&gt;S&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2806em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.6897em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;(&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:0em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1308em;"&gt;&lt;span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2997em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0576em;"&gt;S&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;(&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:0em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.0017em;"&gt;&lt;span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2997em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal" style="margin-right:0.0576em;"&gt;S&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.1218em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;APC 用于扣除整体背景效应。最终的 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;M&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.109em;"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是一个 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L\times L&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的耦合分数矩阵，分数高表示模型对这两个位置的关联更敏感。。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="结构引导预训练确实改善了可读出的信号"&gt;&lt;span&gt;结构引导预训练确实改善了可读出的信号&lt;/span&gt;&#13;&#10; &lt;a href="#%e7%bb%93%e6%9e%84%e5%bc%95%e5%af%bc%e9%a2%84%e8%ae%ad%e7%bb%83%e7%a1%ae%e5%ae%9e%e6%94%b9%e5%96%84%e4%ba%86%e5%8f%af%e8%af%bb%e5%87%ba%e7%9a%84%e4%bf%a1%e5%8f%b7" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="数据与评价指标"&gt;&lt;span&gt;数据与评价指标&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%95%b0%e6%8d%ae%e4%b8%8e%e8%af%84%e4%bb%b7%e6%8c%87%e6%a0%87" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;从 NAKB 筛选单链、无蛋白质或小分子等其他组分的 RNA 结构，并进行清理。&lt;/li&gt;&#10;&lt;li&gt;主比较使用 &lt;strong&gt;533 个结构–序列对&lt;/strong&gt;，长度 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;512&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L\leq512&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.8193em;vertical-align:-0.136em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≤&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;512&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/li&gt;&#10;&lt;li&gt;参考接触由 &lt;strong&gt;Barnaba 的碱基相互作用注释&lt;/strong&gt;构建，排除无法归类的 XXX 相互作用。&lt;/li&gt;&#10;&lt;li&gt;评分取矩阵上三角，并排除自身及序列相邻位置。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;接触对通常比非接触对少，而且比例随序列长度变化，因此作者使用经过基线校正的 PR-AUC：&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;A&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;U&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;a&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;j&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;u&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;s&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;t&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;e&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;A&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;U&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;r&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;a&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;w&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10;\mathrm{AUC}_{\mathrm{adjusted}}=\frac{\mathrm{AUC}_{\mathrm{raw}}-p}{1-p},&#13;&#10;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;AUC&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361em;"&gt;&lt;span style="top:-2.55em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathrm mtight"&gt;adjusted&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:2.2408em;vertical-align:-0.8804em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.3603em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;AUC&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1514em;"&gt;&lt;span style="top:-2.55em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathrm mtight" style="margin-right:0.0139em;"&gt;raw&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8804em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;其中 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是参与评价的位置对中真实接触的比例。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;随机基线约为 0，完美预测为 1，也可能出现负值。&lt;/strong&gt; 这里不能把普通 PR-AUC 的随机基线也理解为 0。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="结果"&gt;&lt;span&gt;结果&lt;/span&gt;&#13;&#10; &lt;a href="#%e7%bb%93%e6%9e%9c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img loading="lazy" src='https://img.fupcode.com/images/landscape/webp/20260917_102125_3845.webp' alt="StructRFM 与 RNA-FM 的接触预测比较"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;原文 Fig. 4：散点横轴为 RNA-FM，纵轴为 StructRFM；多数点在对角线上方。右侧展示 hairpin 与 tRNA 的具体例子。&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;部分短 RNA&lt;/strong&gt;：RNA-FM 几乎没有读出有效接触，StructRFM 能恢复茎区及 bulge 导致的配对偏移。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;部分 tRNA&lt;/strong&gt;：两个模型都能读出接触，但 StructRFM 的背景更干净。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;长 RNA 仍然困难&lt;/strong&gt;：结构引导没有解决所有问题，补充图 S5 中长度大于 100 的序列仍是两个模型的难点。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="12-层-transformer-都在学结构吗"&gt;&lt;span&gt;12 层 Transformer 都在学结构吗？&lt;/span&gt;&#13;&#10; &lt;a href="#12-%e5%b1%82-transformer-%e9%83%bd%e5%9c%a8%e5%ad%a6%e7%bb%93%e6%9e%84%e5%90%97" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img loading="lazy" src='https://img.fupcode.com/images/landscape/webp/20260917_102125_4834.webp' alt="各层 embedding 的接触分数及跳层后的 perplexity"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;原文 Fig. 5：(a) 比较逐层接触分数; (b) 跳层后的序列恢复表现；(c) 展示 StructRFM 各层读出的 coupling map。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;作者做了两类实验：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;读取中间层&lt;/strong&gt;：对每层 embedding 分别运行 REDIAL，看结构信号在哪里出现。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;跳过部分层&lt;/strong&gt;：将保留下来的表示送入后续模块和原 LM-head，检查 perplexity 等指标。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这两个实验回答的问题不同：前者看结构耦合能否被读出，后者看被跳过的计算是否影响输出。&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;模型&lt;/th&gt;&#13;&#10; &lt;th&gt;逐层观察&lt;/th&gt;&#13;&#10; &lt;th&gt;作者的解释&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;StructRFM&lt;/td&gt;&#13;&#10; &lt;td&gt;总体上前 10 层接触信号较弱，最后两层明显增强；部分 tRNA 更早出现信号&lt;/td&gt;&#13;&#10; &lt;td&gt;结构信息集中在后部&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;RNA-FM&lt;/td&gt;&#13;&#10; &lt;td&gt;前约 6 层获得主要接触信号，之后提升有限&lt;/td&gt;&#13;&#10; &lt;td&gt;后续层对结构耦合的贡献较少&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;&lt;h3 class="heading-element" id="更直接的证据删除-structrfm-前-6-层"&gt;&lt;span&gt;更直接的证据：删除 StructRFM 前 6 层&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9b%b4%e7%9b%b4%e6%8e%a5%e7%9a%84%e8%af%81%e6%8d%ae%e5%88%a0%e9%99%a4-structrfm-%e5%89%8d-6-%e5%b1%82" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img loading="lazy" src='https://img.fupcode.com/images/landscape/webp/20260917_102125_2393.webp' alt="StructRFM 层消融及 RNA-FM 的逐层 logits"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;原文 Fig. 6：(a) StructRFM保留 L7–L12 的模型与完整模型比较; (b) RNA-FM 在不同深度输出的 logits。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;StructRFM 仅保留 L7–L12 时，接触预测和序列恢复表现整体仍较接近完整模型，但并非完全无损。进一步缩到 5 层，接触预测能力明显下降。&lt;/p&gt;&#10;&lt;p&gt;RNA-FM 则呈现另一种现象：前几层已基本确定碱基身份，后面更多是在压低罕见或辅助 token 的概率，使输出分布更尖锐。作者据此提出，词表设计可能影响参数利用效率；这仍需要重新训练不同词表的模型来做因果验证。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;我的理解&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这些结果表现出了模型对于 REDIAL 这个任务的冗余，但要区分：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;REDIAL 读不出来，不代表该层完全没有有用信息。&lt;/li&gt;&#10;&lt;li&gt;删层后接触分数接近，不代表所有下游任务都不受影响。&lt;/li&gt;&#10;&lt;li&gt;参数冗余与过拟合不是同一个概念，后者还需要训练分布与独立测试分布之间的泛化证据。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="思考启发"&gt;&lt;span&gt;思考启发&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%80%9d%e8%80%83%e5%90%af%e5%8f%91" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;提供了一种不借助下游任务，直接比较基础模型的方法&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;减小模型参数量的思路&lt;/strong&gt;：直接看各层的 coupling map 的变化&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 class="heading-element" id="参考文献"&gt;&lt;span&gt;参考文献&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;Teng, D., Qiu, Y., Sakthivel, G., Aranganathan, A., Herron, L. &amp;amp; Tiwary, P. &lt;em&gt;Detecting and quantifying overparametrization in RNA language models with REDIAL&lt;/em&gt;. bioRxiv，2026-05-12 版本。&lt;a href="https://doi.org/10.64898/2026.05.11.724344" target="_blank" rel="external nofollow noopener noreferrer"&gt;DOI: 10.64898/2026.05.11.724344&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>Systemd + Uvicorn + FastAPI 部署</title><link>https://fupcode.com/blog/posts/devops/systemd-uvicorn-fastapi/</link><pubDate>Sat, 05 Sep 2026 18:19:11 +0800</pubDate><guid>https://fupcode.com/blog/posts/devops/systemd-uvicorn-fastapi/</guid><category domain="https://fupcode.com/blog/categories/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/">开发运维</category><description>&lt;p&gt;使用 Uvicorn 运行 FastAPI，由 systemd 管理服务的启动、停止和异常重启，NGINX 负责对外提供反向代理。&lt;/p&gt;&#10;&lt;p&gt;下面以使用 systemd 的 Ubuntu / Debian 服务器为例，应用目录为 &lt;code&gt;/home/fastapi-user/fastapi-app&lt;/code&gt;，入口为 &lt;code&gt;server.py&lt;/code&gt; 中的 &lt;code&gt;app&lt;/code&gt; 实例。部署已有项目时，需要按实际情况修改路径和入口。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="设置-fastapi-应用程序"&gt;&lt;span&gt;设置 FastAPI 应用程序&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%ae%be%e7%bd%ae-fastapi-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;一般本机开发，远程使用 &lt;code&gt;git&lt;/code&gt; 拉取代码，并配置环境&lt;/p&gt;&#10;&lt;h5 class="heading-element" id="原生-python"&gt;&lt;span&gt;原生 python&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%8e%9f%e7%94%9f-python" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;python3 -m venv .venv&#13;&#10;source .venv/bin/activate&#13;&#10;python -m pip install --upgrade pip&#13;&#10;python -m pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;&lt;h5 class="heading-element" id="uv-管理"&gt;&lt;span&gt;UV 管理&lt;/span&gt;&#13;&#10; &lt;a href="#uv-%e7%ae%a1%e7%90%86" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;uv sync&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="配置-systemd"&gt;&lt;span&gt;配置 systemd&lt;/span&gt;&#13;&#10; &lt;a href="#%e9%85%8d%e7%bd%ae-systemd" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h5 class="heading-element" id="创建服务文件"&gt;&lt;span&gt;创建服务文件&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%88%9b%e5%bb%ba%e6%9c%8d%e5%8a%a1%e6%96%87%e4%bb%b6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;sudo vim /etc/systemd/system/fastapi-app.service&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;添加以下内容：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[Unit]&#13;&#10;Description=FastAPI application served by Uvicorn&#13;&#10;After=network.target&#13;&#10;&#13;&#10;[Service]&#13;&#10;Type=simple&#13;&#10;User=fastapi-user&#13;&#10;Group=fastapi-user&#13;&#10;WorkingDirectory=/home/fastapi-user/fastapi-app&#13;&#10;Environment=&amp;#34;PYTHONUNBUFFERED=1&amp;#34;&#13;&#10;ExecStart=/home/fastapi-user/fastapi-app/.venv/bin/python -m uvicorn server:app --host 127.0.0.1 --port 8000 --workers 1 --proxy-headers --forwarded-allow-ips=127.0.0.1 --timeout-graceful-shutdown 30&#13;&#10;Restart=on-failure&#13;&#10;RestartSec=5&#13;&#10;KillMode=mixed&#13;&#10;TimeoutStopSec=60&#13;&#10;StandardOutput=journal&#13;&#10;StandardError=journal&#13;&#10;SyslogIdentifier=fastapi-app&#13;&#10;&#13;&#10;[Install]&#13;&#10;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主要配置说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;User&lt;/code&gt;、&lt;code&gt;Group&lt;/code&gt;：运行应用的用户和用户组。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WorkingDirectory&lt;/code&gt;：应用工作目录，&lt;code&gt;server.py&lt;/code&gt; 位于此目录下。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ExecStart&lt;/code&gt;：直接使用虚拟环境中的 Python 启动 Uvicorn，无需执行 &lt;code&gt;source activate&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Restart=on-failure&lt;/code&gt;：进程异常退出时自动重启；通过 &lt;code&gt;systemctl stop&lt;/code&gt; 主动停止服务不会触发重启。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;KillMode=mixed&lt;/code&gt;：停止时先向主进程发送终止信号，让它协调 worker 退出；超时后清理剩余进程。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;TimeoutStopSec&lt;/code&gt;：systemd 等待服务停止的时间，给 Uvicorn 的优雅退出留出余量。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;StandardOutput&lt;/code&gt;、&lt;code&gt;StandardError&lt;/code&gt;：将标准输出和错误输出交给 journal 收集。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;systemd 的重启与停止行为可参考 &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html" target="_blank" rel="external nofollow noopener noreferrer"&gt;systemd.service&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 和 &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.kill.html" target="_blank" rel="external nofollow noopener noreferrer"&gt;systemd.kill&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;。&lt;/p&gt;&#10;&lt;p&gt;Uvicorn 参数说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;server:app&lt;/code&gt;：表示导入 &lt;code&gt;server.py&lt;/code&gt; 中的 &lt;code&gt;app&lt;/code&gt;；如果入口是 &lt;code&gt;app/main.py&lt;/code&gt;，通常改为 &lt;code&gt;app.main:app&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--workers 1&lt;/code&gt;：启动一个工作进程，可根据内存和负载调整。使用多 worker 时，各进程的内存相互独立，应用启动逻辑也会在各 worker 中分别执行。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--reload&lt;/code&gt;：生产环境不要加此参数，它与 &lt;code&gt;--workers&lt;/code&gt; 不能同时使用。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--proxy-headers&lt;/code&gt; 配合 &lt;code&gt;--forwarded-allow-ips=127.0.0.1&lt;/code&gt;：只信任本机代理转发的客户端地址和协议头。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;参数含义见 &lt;a href="https://www.uvicorn.org/settings/" target="_blank" rel="external nofollow noopener noreferrer"&gt;Uvicorn Settings&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h5 class="heading-element" id="启动服务并设置开机启动"&gt;&lt;span&gt;启动服务并设置开机启动&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%90%af%e5%8a%a8%e6%9c%8d%e5%8a%a1%e5%b9%b6%e8%ae%be%e7%bd%ae%e5%bc%80%e6%9c%ba%e5%90%af%e5%8a%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload&#13;&#10;sudo systemctl enable --now fastapi-app&#13;&#10;sudo systemctl status fastapi-app --no-pager&#13;&#10;curl http://127.0.0.1:8000/health&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;active (running)&lt;/code&gt; 表示服务进程正在运行，还需要通过 HTTP 请求确认应用已经正常提供服务。&lt;/p&gt;&#10;&lt;h5 class="heading-element" id="查看日志"&gt;&lt;span&gt;查看日志&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9f%a5%e7%9c%8b%e6%97%a5%e5%bf%97" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;# 查看最近 100 行日志&#13;&#10;sudo journalctl -u fastapi-app -n 100 --no-pager&#13;&#10;&#13;&#10;# 实时查看日志&#13;&#10;sudo journalctl -u fastapi-app -f&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="nginx-中的配置"&gt;&lt;span&gt;NGINX 中的配置&lt;/span&gt;&#13;&#10; &lt;a href="#nginx-%e4%b8%ad%e7%9a%84%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;创建站点配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/fastapi-app.conf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;添加以下内容，将 &lt;code&gt;api.example.com&lt;/code&gt; 替换为实际域名，并将域名解析到服务器：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;server {&#13;&#10; listen 80;&#13;&#10; server_name api.example.com;&#13;&#10;&#13;&#10; location / {&#13;&#10; proxy_pass http://127.0.0.1:8000;&#13;&#10; proxy_set_header Host $host;&#13;&#10; proxy_set_header X-Real-IP $remote_addr;&#13;&#10; proxy_set_header X-Forwarded-For $remote_addr;&#13;&#10; proxy_set_header X-Forwarded-Proto $scheme;&#13;&#10; proxy_redirect off;&#13;&#10; }&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里按 NGINX 直接面向客户端的单层代理配置，覆盖客户端传入的 &lt;code&gt;X-Forwarded-For&lt;/code&gt;。如果前面还有 CDN 或负载均衡，需要额外配置可信代理与真实客户端 IP。&lt;/p&gt;&#10;&lt;p&gt;启用站点并检查配置，下面的软链接命令只需首次执行：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/fastapi-app /etc/nginx/sites-enabled/fastapi-app&#13;&#10;sudo nginx -t&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检查通过后启动 NGINX 并重新加载配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now nginx&#13;&#10;sudo systemctl reload nginx&#13;&#10;curl -H &amp;#39;Host: api.example.com&amp;#39; http://127.0.0.1/health&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;此时可以通过 &lt;code&gt;http://api.example.com/docs&lt;/code&gt; 访问 FastAPI 的接口文档。服务器安全组或防火墙需要允许 HTTP 的 80 端口；Uvicorn 仅监听本机地址，无需开放 8000 端口。对外正式使用时应进一步配置 HTTPS。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="更新与维护"&gt;&lt;span&gt;更新与维护&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9b%b4%e6%96%b0%e4%b8%8e%e7%bb%b4%e6%8a%a4" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h5 class="heading-element" id="更新应用"&gt;&lt;span&gt;更新应用&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9b%b4%e6%96%b0%e5%ba%94%e7%94%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;p&gt;更新项目代码和依赖时，使用 &lt;code&gt;fastapi-user&lt;/code&gt; 执行&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo -iu fastapi-user&#13;&#10;cd /home/fastapi-user/fastapi-app&#13;&#10;git pull&#13;&#10;exit&#13;&#10;sudo systemctl restart fastapi-app&#13;&#10;curl http://127.0.0.1:8000/health&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;按实际项目选择依赖安装命令。如果只使用本文的最小示例，修改 &lt;code&gt;server.py&lt;/code&gt; 后重启服务即可。&lt;code&gt;restart&lt;/code&gt; 会有短暂服务中断，请求检查若遇到应用尚未启动完成，可以查看日志后重试。&lt;/p&gt;&#10;&lt;p&gt;修改 &lt;code&gt;.service&lt;/code&gt; 文件后，需要重新加载 systemd 配置并重启：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload&#13;&#10;sudo systemctl restart fastapi-app&lt;/code&gt;&lt;/pre&gt;&lt;h5 class="heading-element" id="常用管理命令"&gt;&lt;span&gt;常用管理命令&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%b8%b8%e7%94%a8%e7%ae%a1%e7%90%86%e5%91%bd%e4%bb%a4" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;sudo systemctl start fastapi-app&#13;&#10;sudo systemctl stop fastapi-app&#13;&#10;sudo systemctl restart fastapi-app&#13;&#10;sudo systemctl status fastapi-app --no-pager&#13;&#10;&#13;&#10;sudo nginx -t&#13;&#10;sudo nginx -s reload&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果服务启动失败，先通过 &lt;code&gt;journalctl&lt;/code&gt; 查看错误，重点检查虚拟环境路径、应用入口、文件权限以及端口占用。NGINX 返回 &lt;code&gt;502&lt;/code&gt; 时，先在服务器执行 &lt;code&gt;curl http://127.0.0.1:8000/health&lt;/code&gt;，确认后端是否正常，再检查 NGINX 配置和 &lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;。&lt;/p&gt;&#10;</description></item><item><title>Windows 接入 OCuLink eGPU 后任务栏消失：通过禁用 NVIDIA 显示音频驱动解决</title><link>https://fupcode.com/blog/posts/egpu/egpu-audio-problem/</link><pubDate>Tue, 25 Aug 2026 16:04:48 +0800</pubDate><guid>https://fupcode.com/blog/posts/egpu/egpu-audio-problem/</guid><category domain="https://fupcode.com/blog/categories/%E5%A4%96%E6%8E%A5%E6%98%BE%E5%8D%A1/">外接显卡</category><description>&lt;!--post--&gt;&#13;&#10;&lt;h2 class="heading-element" id="故障环境"&gt;&lt;span&gt;故障环境&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%95%85%e9%9a%9c%e7%8e%af%e5%a2%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;操作系统：Windows 11 25H2，Build 26200.9168&lt;/li&gt;&#10;&lt;li&gt;核显：Intel Iris Xe Graphics&lt;/li&gt;&#10;&lt;li&gt;eGPU：NVIDIA GeForce RTX 5070 Ti&lt;/li&gt;&#10;&lt;li&gt;连接方式：OCuLink（PCIe 直连）&lt;/li&gt;&#10;&lt;li&gt;无线网卡：Intel Wi-Fi 6E AX211&lt;/li&gt;&#10;&lt;li&gt;本机音频：Intel Smart Sound Technology / Realtek Audio&lt;/li&gt;&#10;&lt;li&gt;其他音频端点：USB DAC、蓝牙耳机、VB-Audio、NVIDIA 虚拟音频等&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="故障现象"&gt;&lt;span&gt;故障现象&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;接入 OCuLink eGPU 冷启动 Windows 后，故障并不是每次都会发生，但出现时非常有规律：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;登录桌面后，右下角的 Wi-Fi、音量等图标和系统托盘没有正常出现。&lt;/li&gt;&#10;&lt;li&gt;开始菜单或任务栏可能反应迟钝。&lt;/li&gt;&#10;&lt;li&gt;重启 Windows 资源管理器后，任务栏和托盘恢复正常。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;一开始很容易怀疑是 Wi-Fi 驱动、Explorer 本身或任务栏缓存损坏。但“重启 Explorer 能恢复”只说明 Shell 被卡住了，并不等于故障源就在 Explorer。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="关键排查结果"&gt;&lt;span&gt;关键排查结果&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%85%b3%e9%94%ae%e6%8e%92%e6%9f%a5%e7%bb%93%e6%9e%9c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;设备状态检查显示：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel AX211 无线网卡处于 &lt;code&gt;Started&lt;/code&gt; 状态。&lt;/li&gt;&#10;&lt;li&gt;WLAN AutoConfig 服务正在运行。&lt;/li&gt;&#10;&lt;li&gt;RTX 5070 Ti、Intel 核显和各音频设备均能被系统枚举。&lt;/li&gt;&#10;&lt;li&gt;系统中同时存在 &lt;code&gt;NVIDIA High Definition Audio&lt;/code&gt; 和 &lt;code&gt;NVIDIA Virtual Audio Device (Wave Extensible) (WDM)&lt;/code&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;真正有价值的线索来自 Windows 事件日志和错误报告。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="1-windows-audio-先失去响应"&gt;&lt;span&gt;1. Windows Audio 先失去响应&lt;/span&gt;&#13;&#10; &lt;a href="#1-windows-audio-%e5%85%88%e5%a4%b1%e5%8e%bb%e5%93%8d%e5%ba%94" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;系统日志出现 Service Control Manager 事件 7031：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Windows Audio 服务意外地终止。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Windows 错误报告进一步显示：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;事件名称: AppHangB1&#13;&#10;程序: svchost.exe_Audiosrv&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;也就是说，承载 Windows Audio 服务的 &lt;code&gt;svchost.exe&lt;/code&gt; 确实发生了挂起，而不是简单的音量图标未刷新。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="2-explorer-被-audioclientrpc-拖住"&gt;&lt;span&gt;2. Explorer 被 AudioClientRpc 拖住&lt;/span&gt;&#13;&#10; &lt;a href="#2-explorer-%e8%a2%ab-audioclientrpc-%e6%8b%96%e4%bd%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;紧接着出现 Explorer 无响应事件：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;事件名称: AppHangXProcB1&#13;&#10;程序: explorer.exe&#13;&#10;相关进程: svchost.exe:AudioClientRpc&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这条记录把两件看似无关的事情连接了起来：Explorer 正在通过 &lt;code&gt;AudioClientRpc&lt;/code&gt; 查询系统音频状态，而 Windows Audio 已经卡住，于是 Explorer 也被跨进程调用拖住。&lt;/p&gt;&#10;&lt;p&gt;Windows 11 的网络、音量、电池等状态区域属于同一个系统托盘。音频查询阻塞时，消失的不一定只有音量图标，Wi-Fi 图标和整个托盘都可能无法正常初始化。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="3-开机阶段存在音频设备初始化异常"&gt;&lt;span&gt;3. 开机阶段存在音频设备初始化异常&lt;/span&gt;&#13;&#10; &lt;a href="#3-%e5%bc%80%e6%9c%ba%e9%98%b6%e6%ae%b5%e5%ad%98%e5%9c%a8%e9%9f%b3%e9%a2%91%e8%ae%be%e5%a4%87%e5%88%9d%e5%a7%8b%e5%8c%96%e5%bc%82%e5%b8%b8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;每次故障附近还反复出现 Kernel-PnP 事件 219：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;驱动程序 \Driver\WUDFRd 加载失败&#13;&#10;设备: INTELAUDIO\...\DetectionVerification&#13;&#10;状态: 0xC0000365&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;系统中还有虚拟显示设备的同类警告。单独一个事件 219 不一定意味着严重故障，但它说明开机时多个音频与显示端点的初始化并不顺畅。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="最终解决办法"&gt;&lt;span&gt;最终解决办法&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9c%80%e7%bb%88%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;在设备管理器中禁用：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;声音、视频和游戏控制器&#13;&#10; └─ NVIDIA High Definition Audio&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;操作步骤：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;右键单击开始按钮，打开“设备管理器”。&lt;/li&gt;&#10;&lt;li&gt;展开“声音、视频和游戏控制器”。&lt;/li&gt;&#10;&lt;li&gt;找到 &lt;code&gt;NVIDIA High Definition Audio&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;右键选择“禁用设备”。&lt;/li&gt;&#10;&lt;li&gt;重启电脑并进行多次冷启动验证。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;不要误禁用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;NVIDIA GeForce RTX 5070 Ti&lt;/code&gt; 显示适配器；&lt;/li&gt;&#10;&lt;li&gt;Intel/Realtek 本机音频设备；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;NVIDIA Virtual Audio Device&lt;/code&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;禁用后，本机不再出现开机托盘丢失和显示器音频导致的视频卡死，验证了故障与 OCuLink - NVIDIA HD Audio - DP 音频路径存在直接关系，根本问题可能出在OCuLink这一部分。&lt;/p&gt;&#10;</description></item><item><title>通过 NVIDIA 独显状态控制 Wallpaper Engine 开机启动</title><link>https://fupcode.com/blog/posts/egpu/wallpaper-engine-smart-start/</link><pubDate>Fri, 21 Aug 2026 18:00:33 +0800</pubDate><guid>https://fupcode.com/blog/posts/egpu/wallpaper-engine-smart-start/</guid><category domain="https://fupcode.com/blog/categories/%E5%A4%96%E6%8E%A5%E6%98%BE%E5%8D%A1/">外接显卡</category><description>&lt;!--post--&gt;&#13;&#10;&lt;h2 class="heading-element" id="背景"&gt;&lt;span&gt;背景&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%83%8c%e6%99%af" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;家里使用外接显卡（eGPU）连接大屏幕时，希望 Wallpaper Engine 自动启动显示动态壁纸。&lt;/p&gt;&#10;&lt;p&gt;但外出使用笔记本时，没有外接显卡，不希望壁纸程序开机启动，避免浪费资源。&lt;/p&gt;&#10;&lt;p&gt;因此通过 Windows 计划任务，在登录时检测 NVIDIA GPU 状态，只有 &lt;code&gt;nvidia-smi&lt;/code&gt; 检测成功时才启动 Wallpaper Engine。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="1-关闭-wallpaper-engine-自启动"&gt;&lt;span&gt;1. 关闭 Wallpaper Engine 自启动&lt;/span&gt;&#13;&#10; &lt;a href="#1-%e5%85%b3%e9%97%ad-wallpaper-engine-%e8%87%aa%e5%90%af%e5%8a%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;先关闭 Wallpaper Engine 自带的开机启动：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Wallpaper Engine&#13;&#10;→ 设置&#13;&#10;→ 常规&#13;&#10;→ Windows 启动时运行&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;取消勾选。&lt;/p&gt;&#10;&lt;p&gt;避免它绕过检测直接启动。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="2-创建检测脚本"&gt;&lt;span&gt;2. 创建检测脚本&lt;/span&gt;&#13;&#10; &lt;a href="#2-%e5%88%9b%e5%bb%ba%e6%a3%80%e6%b5%8b%e8%84%9a%e6%9c%ac" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;创建目录：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;mkdir C:\Scripts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;C:\Scripts\start-wallpaper.vbs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;内容：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Set WshShell = CreateObject(&amp;#34;WScript.Shell&amp;#34;)&#13;&#10;&#13;&#10;ret = WshShell.Run(&amp;#34;nvidia-smi&amp;#34;, 0, True)&#13;&#10;&#13;&#10;If ret = 0 Then&#13;&#10;&#13;&#10; WshShell.Run &amp;#34;&amp;#34;&amp;#34;C:\Program Files (x86)\Steam\steamapps\common\wallpaper_engine\wallpaper64.exe&amp;#34;&amp;#34;&amp;#34;, 0, False&#13;&#10;&#13;&#10;End If&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;逻辑：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; 返回码为 &lt;code&gt;0&lt;/code&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;NVIDIA 显卡可用&lt;/li&gt;&#10;&lt;li&gt;启动 Wallpaper Engine&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;返回非 &lt;code&gt;0&lt;/code&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;没有可用 NVIDIA GPU&lt;/li&gt;&#10;&lt;li&gt;不启动&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="3-测试脚本"&gt;&lt;span&gt;3. 测试脚本&lt;/span&gt;&#13;&#10; &lt;a href="#3-%e6%b5%8b%e8%af%95%e8%84%9a%e6%9c%ac" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;手动运行：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;wscript &amp;#34;C:\Scripts\start-wallpaper.vbs&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;连接 eGPU 时：应该启动 Wallpaper Engine。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;未连接 eGPU 时：应该无任何动作。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="4-创建-windows-计划任务"&gt;&lt;span&gt;4. 创建 Windows 计划任务&lt;/span&gt;&#13;&#10; &lt;a href="#4-%e5%88%9b%e5%bb%ba-windows-%e8%ae%a1%e5%88%92%e4%bb%bb%e5%8a%a1" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;打开：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Win &amp;#43; R&#13;&#10;taskschd.msc&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;选择「创建任务」&lt;/p&gt;&#10;&lt;p&gt;不要选择「创建基本任务」。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 class="heading-element" id="常规"&gt;&lt;span&gt;常规&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%b8%b8%e8%a7%84" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;名称：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Start Wallpaper When NVIDIA Available&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;勾选：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;使用最高权限运行&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为 &lt;code&gt;nvidia-smi&lt;/code&gt; 需要管理员权限。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 class="heading-element" id="触发器"&gt;&lt;span&gt;触发器&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%a7%a6%e5%8f%91%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;新建：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;登录时&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;高级设置&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;延迟任务：30 秒&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h3 class="heading-element" id="操作"&gt;&lt;span&gt;操作&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%93%8d%e4%bd%9c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;程序：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;wscript&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参数：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;&amp;#34;C:\Scripts\start-wallpaper.vbs&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="最终效果"&gt;&lt;span&gt;最终效果&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9c%80%e7%bb%88%e6%95%88%e6%9e%9c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="家里"&gt;&lt;span&gt;家里&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%ae%b6%e9%87%8c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;连接 eGPU&#13;&#10; ↓&#13;&#10;Windows 登录&#13;&#10; ↓&#13;&#10;计划任务等待 30 秒&#13;&#10; ↓&#13;&#10;执行 nvidia-smi&#13;&#10; ↓&#13;&#10;检测成功&#13;&#10; ↓&#13;&#10;启动 Wallpaper Engine&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="外出"&gt;&lt;span&gt;外出&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%a4%96%e5%87%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;无 eGPU&#13;&#10; ↓&#13;&#10;Windows 登录&#13;&#10; ↓&#13;&#10;计划任务等待 30 秒&#13;&#10; ↓&#13;&#10;执行 nvidia-smi&#13;&#10; ↓&#13;&#10;检测失败&#13;&#10; ↓&#13;&#10;不启动 Wallpaper Engine&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样可以让壁纸程序根据实际硬件环境自动启停。&lt;/p&gt;&#10;</description></item><item><title>动态集合取最值优化：Heap</title><link>https://fupcode.com/blog/posts/algorithm/perf-dict-with-heap/</link><pubDate>Thu, 06 Aug 2026 13:15:48 +0800</pubDate><guid>https://fupcode.com/blog/posts/algorithm/perf-dict-with-heap/</guid><category domain="https://fupcode.com/blog/categories/%E7%AE%97%E6%B3%95/">算法</category><description>&lt;!--post--&gt;&#13;&#10;&lt;h2 class="heading-element" id="问题模式"&gt;&lt;span&gt;问题模式&lt;/span&gt;&#13;&#10; &lt;a href="#%e9%97%ae%e9%a2%98%e6%a8%a1%e5%bc%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;维护一个动态字典：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;state = {&#13;&#10; item: value&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;循环执行：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;获取 value 最大/最小的 item&lt;/li&gt;&#10;&lt;li&gt;修改 state&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;朴素实现：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;max(state, key=state.get)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每次扫描复杂度为 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0278em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.109em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="优化heap--hashmap"&gt;&lt;span&gt;优化：Heap + HashMap&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%bc%98%e5%8c%96heap--hashmap" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;维护两个结构：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;HashMap：保存真实状态&lt;/li&gt;&#10;&lt;li&gt;Heap：快速获取候选最值&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;复杂度：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;操作&lt;/th&gt;&#13;&#10; &lt;th&gt;复杂度&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;heap push&lt;/td&gt;&#13;&#10; &lt;td&gt;O(logN)&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;heap pop&lt;/td&gt;&#13;&#10; &lt;td&gt;O(logN)&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;查找最值&lt;/td&gt;&#13;&#10; &lt;td&gt;O(1)（取堆顶）&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="lazy-deletion惰性删除"&gt;&lt;span&gt;Lazy Deletion（惰性删除）&lt;/span&gt;&#13;&#10; &lt;a href="#lazy-deletion%e6%83%b0%e6%80%a7%e5%88%a0%e9%99%a4" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;Heap 不支持高效修改已有元素。&lt;/p&gt;&#10;&lt;p&gt;因此：&lt;/p&gt;&#10;&lt;p&gt;更新状态时：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;修改 HashMap&lt;/li&gt;&#10;&lt;li&gt;新值重新 push 到 heap&lt;/li&gt;&#10;&lt;li&gt;弹出时检查是否过期&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;state[&amp;#34;a&amp;#34;] = 100&#13;&#10;&#13;&#10;heap:&#13;&#10;(-100, &amp;#34;a&amp;#34;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;更新后：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;state[&amp;#34;a&amp;#34;] = 20&#13;&#10;&#13;&#10;heap:&#13;&#10;(-100, &amp;#34;a&amp;#34;) # stale&#13;&#10;(-20, &amp;#34;a&amp;#34;) # valid&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;取值：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;while heap:&#13;&#10; value, item = heappop(heap)&#13;&#10;&#13;&#10; if value == current_state[item]:&#13;&#10; use(item)&#13;&#10; break&lt;/code&gt;&lt;/pre&gt;&lt;div class="alert alert-note"&gt;&lt;p class="alert-title"&gt;&lt;i class="octicon-info-16 me-2" aria-hidden="true"&gt;&lt;/i&gt;注意&lt;/p&gt;&lt;p&gt;Python 中使用 heapq 库时，如果要支持自定义类排序，需要实现类的 &lt;code&gt;__lt__&lt;/code&gt; 和 &lt;code&gt;__eq__&lt;/code&gt; 魔术方法。&lt;/p&gt;&lt;/div&gt;</description></item><item><title>Docker 容器时区问题：UTC 导致的自然日业务刷新异常</title><link>https://fupcode.com/blog/posts/devops/problem-docker-timezone/</link><pubDate>Tue, 19 May 2026 17:38:41 +0800</pubDate><guid>https://fupcode.com/blog/posts/devops/problem-docker-timezone/</guid><category domain="https://fupcode.com/blog/categories/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/">开发运维</category><description>&lt;p&gt;最近将微信小程序后端迁移到 Docker 后，出现了“每日刷新”相关 Bug，例如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;每日广告次数未刷新&lt;/li&gt;&#10;&lt;li&gt;次日仍然沿用前一天状态&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;排查后发现，问题并不在业务逻辑，而是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 容器默认使用 UTC 时区。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;而业务中的“每日刷新”逻辑实际上是基于东八区自然日实现的。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;if user.last_ad_time != today:&#13;&#10; user.today_ad_views = 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当中国时间已经进入第二天时：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;中国时间&lt;/th&gt;&#13;&#10; &lt;th&gt;UTC 时间&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;2026-05-19 00:30&lt;/td&gt;&#13;&#10; &lt;td&gt;2026-05-18 16:30&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;&lt;p&gt;后端仍然认为“还是昨天”，从而导致自然日逻辑整体延迟 8 小时。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="最终方案"&gt;&lt;span&gt;最终方案&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%9c%80%e7%bb%88%e6%96%b9%e6%a1%88" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="数据库存储统一使用-utc"&gt;&lt;span&gt;数据库存储统一使用 UTC&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%95%b0%e6%8d%ae%e5%ba%93%e5%ad%98%e5%82%a8%e7%bb%9f%e4%b8%80%e4%bd%bf%e7%94%a8-utc" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;数据库中的 datetime / timestamp 统一存 UTC。&lt;/p&gt;&#10;&lt;p&gt;优点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;避免时区混乱&lt;/li&gt;&#10;&lt;li&gt;避免夏令时问题&lt;/li&gt;&#10;&lt;li&gt;多服务容易统一&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h3 class="heading-element" id="前端负责本地化显示"&gt;&lt;span&gt;前端负责本地化显示&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%89%8d%e7%ab%af%e8%b4%9f%e8%b4%a3%e6%9c%ac%e5%9c%b0%e5%8c%96%e6%98%be%e7%a4%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;后端返回 UTC：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;{&#13;&#10; &amp;#34;created_at&amp;#34;: &amp;#34;2026-05-18T16:30:00Z&amp;#34;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;前端按用户本地时区格式化：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;new Date(utcTime).toLocaleString()&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h3 class="heading-element" id="自然日业务明确业务时区"&gt;&lt;span&gt;自然日业务明确业务时区&lt;/span&gt;&#13;&#10; &lt;a href="#%e8%87%aa%e7%84%b6%e6%97%a5%e4%b8%9a%e5%8a%a1%e6%98%8e%e7%a1%ae%e4%b8%9a%e5%8a%a1%e6%97%b6%e5%8c%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;像：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;每日限额&lt;/li&gt;&#10;&lt;li&gt;定时刷新&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这类逻辑本质上依赖“业务时区”。&lt;/p&gt;&#10;&lt;p&gt;对于面向中国用户的服务，直接统一：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ENV TZ=Asia/Shanghai&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通常是最简单稳定的方案。&lt;/p&gt;&#10;&lt;h5 class="heading-element" id="精简镜像中的-tzdata-问题"&gt;&lt;span&gt;&lt;strong&gt;精简镜像中的 tzdata 问题&lt;/strong&gt;&lt;/span&gt;&#13;&#10; &lt;a href="#%e7%b2%be%e7%ae%80%e9%95%9c%e5%83%8f%e4%b8%ad%e7%9a%84-tzdata-%e9%97%ae%e9%a2%98" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h5&gt;&lt;p&gt;如果使用 Alpine / slim 等精简镜像：&lt;/p&gt;&#10;&lt;p&gt;则可能需要额外安装：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;RUN apk add --no-cache tzdata ca-certificates&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="总结"&gt;&lt;span&gt;总结&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%80%bb%e7%bb%93" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;目前采用的时间处理策略：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;层级&lt;/th&gt;&#13;&#10; &lt;th&gt;策略&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;数据库存储&lt;/td&gt;&#13;&#10; &lt;td&gt;UTC&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;前端显示&lt;/td&gt;&#13;&#10; &lt;td&gt;用户本地时区&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;后端 Docker 容器&lt;/td&gt;&#13;&#10; &lt;td&gt;&lt;code&gt;TZ=Asia/Shanghai&lt;/code&gt;&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;</description></item><item><title>使用 Certbot --webroot 模式为 Nginx 配置 HTTPS</title><link>https://fupcode.com/blog/posts/devops/certbot-webroot/</link><pubDate>Tue, 19 May 2026 03:04:28 +0800</pubDate><guid>https://fupcode.com/blog/posts/devops/certbot-webroot/</guid><category domain="https://fupcode.com/blog/categories/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/">开发运维</category><description>&lt;p&gt;之前我一直使用：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;certbot --nginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;来自动申请和配置 HTTPS 证书。&lt;/p&gt;&#10;&lt;p&gt;这种方法虽然方便，但在实际使用中，我遇到了比较严重的问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;certbot 会自动修改 nginx 配置&lt;/li&gt;&#10;&lt;li&gt;certbot 会自动 reload/restart nginx，导致systemd 状态与 nginx 实际状态脱节，出现“游离 nginx”，然后第一个证书成功、后面失败&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最终决定迁移到：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;certbot --webroot&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这种模式下：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;certbot 不再接管 nginx&lt;/li&gt;&#10;&lt;li&gt;不再自动修改 nginx 配置&lt;/li&gt;&#10;&lt;li&gt;不再 reload/restart nginx&lt;/li&gt;&#10;&lt;li&gt;nginx 完全手动管理&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="一安装-certbot"&gt;&lt;span&gt;一、安装 certbot&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%b8%80%e5%ae%89%e8%a3%85-certbot" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;Ubuntu：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo apt update&#13;&#10;sudo apt install certbot&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="二创建-challenge-目录"&gt;&lt;span&gt;二、创建 challenge 目录&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%ba%8c%e5%88%9b%e5%bb%ba-challenge-%e7%9b%ae%e5%bd%95" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;统一使用：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;mkdir -p /var/www/.letsencrypt/.well-known/acme-challenge&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;certbot 以 root 身份运行，因此无需 &lt;code&gt;www-data&lt;/code&gt; 写权限&lt;/li&gt;&#10;&lt;li&gt;nginx 只需要可读权限&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="三配置-nginx-challenge-路由"&gt;&lt;span&gt;三、配置 nginx challenge 路由&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%b8%89%e9%85%8d%e7%bd%ae-nginx-challenge-%e8%b7%af%e7%94%b1" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;在所有 80 端口 server 中加入：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;location /.well-known/acme-challenge/ {&#13;&#10; root /var/www/.letsencrypt;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;server {&#13;&#10; listen 80;&#13;&#10; server_name fupcode.com www.fupcode.com;&#13;&#10;&#13;&#10; location /.well-known/acme-challenge/ {&#13;&#10; root /var/www/.letsencrypt;&#13;&#10; }&#13;&#10;&#13;&#10; location / {&#13;&#10; return 301 https://$host$request_uri;&#13;&#10; }&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="四申请证书"&gt;&lt;span&gt;四、申请证书&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%9b%9b%e7%94%b3%e8%af%b7%e8%af%81%e4%b9%a6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;certbot certonly --webroot -w /var/www/.letsencrypt -d fupcode.com&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;参数&lt;/th&gt;&#13;&#10; &lt;th&gt;含义&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;certonly&lt;/td&gt;&#13;&#10; &lt;td&gt;只申请证书，不修改 nginx&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&amp;ndash;webroot&lt;/td&gt;&#13;&#10; &lt;td&gt;使用 webroot challenge&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&amp;ndash;cert-name&lt;/td&gt;&#13;&#10; &lt;td&gt;指定证书名称，可选，默认为域名&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;-w&lt;/td&gt;&#13;&#10; &lt;td&gt;challenge 根目录&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;-d&lt;/td&gt;&#13;&#10; &lt;td&gt;域名，可多个&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="五查看证书"&gt;&lt;span&gt;五、查看证书&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%ba%94%e6%9f%a5%e7%9c%8b%e8%af%81%e4%b9%a6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;certbot certificates&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;证书通常位于：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;/etc/letsencrypt/live/fupcode.com/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;/etc/letsencrypt/live/fupcode.com/fullchain.pem&#13;&#10;/etc/letsencrypt/live/fupcode.com/privkey.pem&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="六配置-nginx-https"&gt;&lt;span&gt;六、配置 nginx HTTPS&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%85%ad%e9%85%8d%e7%bd%ae-nginx-https" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;在 nginx 中手动配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ssl_certificate /etc/letsencrypt/live/fupcode.com/fullchain.pem;&#13;&#10;ssl_certificate_key /etc/letsencrypt/live/fupcode.com/privkey.pem;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;server {&#13;&#10; listen 443 ssl http2;&#13;&#10; server_name fupcode.com www.fupcode.com;&#13;&#10;&#13;&#10; ssl_certificate /etc/letsencrypt/live/fupcode.com/fullchain.pem;&#13;&#10; ssl_certificate_key /etc/letsencrypt/live/fupcode.com/privkey.pem;&#13;&#10;&#13;&#10; location / {&#13;&#10; proxy_pass http://127.0.0.1:8000;&#13;&#10; }&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="七nginx-重载"&gt;&lt;span&gt;七、nginx 重载&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%b8%83nginx-%e9%87%8d%e8%bd%bd" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;nginx -t&#13;&#10;nginx -s reload&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="八配置-deploy-hook"&gt;&lt;span&gt;八、配置 deploy-hook&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%85%ab%e9%85%8d%e7%bd%ae-deploy-hook" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;mkdir -p /etc/letsencrypt/renewal-hooks/deploy&#13;&#10;&#13;&#10;cat &amp;gt;/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#13;&#10;#!/bin/sh&#13;&#10;nginx -s reload&#13;&#10;EOF&#13;&#10;&#13;&#10;chmod &amp;#43;x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="九测试续期"&gt;&lt;span&gt;九、测试续期&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%b9%9d%e6%b5%8b%e8%af%95%e7%bb%ad%e6%9c%9f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;certbot renew --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果成功，说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;challenge 正常&lt;/li&gt;&#10;&lt;li&gt;续期流程正常&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>trRNA2 (2026)：将 Secondary Structure 引入 Attention 并驱动 RNA 构象建模</title><link>https://fupcode.com/blog/posts/research-notes/paper-review-trrna2/</link><pubDate>Thu, 30 Apr 2026 17:05:46 +0800</pubDate><guid>https://fupcode.com/blog/posts/research-notes/paper-review-trrna2/</guid><category domain="https://fupcode.com/blog/categories/%E7%A7%91%E7%A0%94%E7%AC%94%E8%AE%B0/">科研笔记</category><description>&lt;p&gt;trRosettaRNA2 利用二级结构 (SS) 做了两件很有意思的工作&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;让SS加权于attention&lt;/li&gt;&#10;&lt;li&gt;通过多 SS 条件输入实现 RNA 构象分布&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 class="heading-element" id="ss加权于attention"&gt;&lt;span&gt;SS加权于attention&lt;/span&gt;&#13;&#10; &lt;a href="#ss%e5%8a%a0%e6%9d%83%e4%ba%8eattention" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img loading="lazy" src='https://media.springernature.com/full/springer-static/image/art%3A10.1038%2Fs42256-026-01223-x/MediaObjects/42256_2026_1223_Fig1_HTML.png?as=webp' alt="ss"&gt;&lt;/p&gt;&#10;&lt;p&gt;trRosettaRNA2 除了将ss作为一层feature，还在 structure module 中引入 &lt;strong&gt;SS-aware attention&lt;/strong&gt;，其核心是对 attention softmax 的重加权：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;标准 attention&#10;&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10; a_{ij} = \frac{\exp\left(\frac{q_i k_j}{\sqrt{d}}\right)}{\sum_{l=1}^{L} \exp\left(\frac{q_i k_l}{\sqrt{d}}\right)}&#13;&#10; &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7167em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:3.88em;vertical-align:-1.69em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.19em;"&gt;&lt;span style="top:-2.11em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:0em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9812em;"&gt;&lt;span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0197em;"&gt;l&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2997em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9322em;"&gt;&lt;span style="top:-2.5335em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord sqrt mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9378em;"&gt;&lt;span class="svg-align" style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mtight" style="padding-left:0.833em;"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8978em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"&gt;&lt;path d="M95,702&#10;c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14&#10;c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54&#10;c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10&#10;s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429&#10;c69,-144,104.5,-217.7,106.5,-221&#10;l0 -0&#10;c5.3,-9.3,12,-14,20,-14&#10;H400000v40H845.2724&#10;s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7&#10;c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z&#10;M834 80h400000v40h-400000z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1022em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.4461em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0359em;"&gt;q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0359em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3488em;margin-left:-0.0315em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0197em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1512em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.538em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.38em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.19em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9934em;"&gt;&lt;span style="top:-2.5335em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord sqrt mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9378em;"&gt;&lt;span class="svg-align" style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mtight" style="padding-left:0.833em;"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8978em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"&gt;&lt;path d="M95,702&#10;c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14&#10;c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54&#10;c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10&#10;s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429&#10;c69,-144,104.5,-217.7,106.5,-221&#10;l0 -0&#10;c5.3,-9.3,12,-14,20,-14&#10;H400000v40H845.2724&#10;s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7&#10;c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z&#10;M834 80h400000v40h-400000z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1022em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.5073em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0359em;"&gt;q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0359em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0315em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2819em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.538em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;SS-aware attention&#10;&lt;/p&gt;&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.99&lt;/mn&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/munderover&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.99&lt;/mn&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;&#13;&#10; a_{ij} = \frac{\left(\exp\left(\frac{p_{ij}}{T}\right) - 0.99\right)\exp\left(\frac{q_i k_j}{\sqrt{d}}\right)}{\sum_{l=1}^{L} \left(\exp\left(\frac{p_{il}}{T}\right) - 0.99\right)\exp\left(\frac{q_i k_l}{\sqrt{d}}\right)}&#13;&#10; &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7167em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:3.88em;vertical-align:-1.69em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.19em;"&gt;&lt;span style="top:-2.11em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:0em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9812em;"&gt;&lt;span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0197em;"&gt;l&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2997em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7475em;"&gt;&lt;span style="top:-2.655em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.4461em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0197em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1512em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.99&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9322em;"&gt;&lt;span style="top:-2.5335em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord sqrt mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9378em;"&gt;&lt;span class="svg-align" style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mtight" style="padding-left:0.833em;"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8978em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"&gt;&lt;path d="M95,702&#10;c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14&#10;c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54&#10;c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10&#10;s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429&#10;c69,-144,104.5,-217.7,106.5,-221&#10;l0 -0&#10;c5.3,-9.3,12,-14,20,-14&#10;H400000v40H845.2724&#10;s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7&#10;c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z&#10;M834 80h400000v40h-400000z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1022em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.4461em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0359em;"&gt;q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0359em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3488em;margin-left:-0.0315em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0197em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1512em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.538em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.38em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.19em;"&gt;&lt;span class="pstrut" style="height:3.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8087em;"&gt;&lt;span style="top:-2.655em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.5073em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2819em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.99&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9934em;"&gt;&lt;span style="top:-2.5335em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord sqrt mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9378em;"&gt;&lt;span class="svg-align" style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mtight" style="padding-left:0.833em;"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8978em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"&gt;&lt;path d="M95,702&#10;c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14&#10;c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54&#10;c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10&#10;s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429&#10;c69,-144,104.5,-217.7,106.5,-221&#10;l0 -0&#10;c5.3,-9.3,12,-14,20,-14&#10;H400000v40H845.2724&#10;s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7&#10;c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z&#10;M834 80h400000v40h-400000z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1022em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.5073em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0359em;"&gt;q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0359em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0315em;"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3281em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.0315em;margin-right:0.0714em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2819em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.538em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;其中，&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p_{ij}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7167em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 表示由二级结构预测模型给出的第 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i,j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.854em;vertical-align:-0.1944em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.1667em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0572em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个核苷酸形成碱基配对的概率&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是 &lt;strong&gt;SS temperature&lt;/strong&gt;，用于控制二级结构先验对 attention 的影响强度。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;当 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 较小时，&#10;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\exp(p_{ij}/T)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:1.0361em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;对 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p_{ij}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7167em;vertical-align:-0.2861em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3117em;"&gt;&lt;span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="katex-sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight" style="margin-right:0.0572em;"&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2861em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 更敏感，SS 对 attention 的影响更强；&lt;/li&gt;&#10;&lt;li&gt;当 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.6833em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.1389em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 较大时，权重差异变小，模型更多依赖自身学习到的几何和 pair 表征。&lt;/li&gt;&#10;&lt;li&gt;在代码中，StructureModule 默认使用逐层递增的温度，在结构生成早期强烈注入二级结构约束，在后期逐渐放松。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;我的理解&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;传统的方法是把ss作为pair representation的一层feature，这种方式也许学习效果不佳&lt;/li&gt;&#10;&lt;li&gt;加权attention从而让模型不容易忽略长程相互作用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="多-ss--构象分布"&gt;&lt;span&gt;多 SS → 构象分布&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%a4%9a-ss--%e6%9e%84%e8%b1%a1%e5%88%86%e5%b8%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="核心思路"&gt;&lt;span&gt;核心思路&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%a0%b8%e5%bf%83%e6%80%9d%e8%b7%af" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;RNA 往往具有显著的构象灵活性&lt;/p&gt;&#10;&lt;p&gt;trRosettaRNA2 的做法是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;构造多个 SS（来自不同预测器或模型）&lt;/li&gt;&#10;&lt;li&gt;对每个 SS 独立进行 3D 预测&lt;/li&gt;&#10;&lt;li&gt;聚合得到结构集合（ensemble）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="实现细节"&gt;&lt;span&gt;实现细节&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%ae%9e%e7%8e%b0%e7%bb%86%e8%8a%82" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;使用 &lt;strong&gt;11 种不同 SS 来源&lt;/strong&gt;（如 trRNA2-SS、SPOT-RNA、RNAfold 等）&lt;/li&gt;&#10;&lt;li&gt;每个 SS 输入下：&#10;&lt;ul&gt;&#10;&lt;li&gt;运行模型多个 recycling（4 次）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;最终得到：&#10;&lt;ul&gt;&#10;&lt;li&gt;共 44 个结构（11 SS × 4 次）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="对比alphafold3-的做法"&gt;&lt;span&gt;对比：AlphaFold3 的做法&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%af%b9%e6%af%94alphafold3-%e7%9a%84%e5%81%9a%e6%b3%95" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;作为对照，AlphaFold3 并不显式使用 SS 作为条件变量，而是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;固定输入（sequence + MSA）&lt;/li&gt;&#10;&lt;li&gt;通过 &lt;strong&gt;不同随机种子（random seeds）&lt;/strong&gt; 进行多次推理&lt;/li&gt;&#10;&lt;li&gt;共生成约 100 个结构&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="结果"&gt;&lt;span&gt;结果&lt;/span&gt;&#13;&#10; &lt;a href="#%e7%bb%93%e6%9e%9c" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img loading="lazy" src='https://media.springernature.com/full/springer-static/image/art%3A10.1038%2Fs42256-026-01223-x/MediaObjects/42256_2026_1223_Fig4_HTML.png?as=webp' alt="multi-ss"&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;trRosettaRNA2 能生成与实验接近的构象分布&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;AlphaFold3 更接近单一结构预测器&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="参考文献"&gt;&lt;span&gt;参考文献&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;Wang, W., Peng, Z. &amp;amp; Yang, J. Predicting RNA 3D structure and conformers using a pre-trained secondary structure model and structure-aware attention. Nat Mach Intell (2026). &lt;a href="https://doi.org/10.1038/s42256-026-01223-x" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://doi.org/10.1038/s42256-026-01223-x&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>Docker 挂载单个文件的一个隐蔽 Bug：修改后容器和宿主机会“分离”</title><link>https://fupcode.com/blog/posts/devops/problem-docker-volume-edit-bug/</link><pubDate>Thu, 12 Mar 2026 19:11:13 +0800</pubDate><guid>https://fupcode.com/blog/posts/devops/problem-docker-volume-edit-bug/</guid><category domain="https://fupcode.com/blog/categories/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/">开发运维</category><description>&lt;h2 class="heading-element" id="问题背景"&gt;&lt;span&gt;问题背景&lt;/span&gt;&#13;&#10; &lt;a href="#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;Docker Compose 里经常会把单个配置文件 bind mount 到容器中：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;services:&#13;&#10; web:&#13;&#10; image: my-app&#13;&#10; volumes:&#13;&#10; - ./config.json:/app/config.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样写很方便：宿主机改配置，容器里也能读到新内容，不需要重新构建镜像。但它有个隐蔽问题：&lt;strong&gt;某些编辑方式会让宿主机文件和容器内文件断开同步&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="现象"&gt;&lt;span&gt;现象&lt;/span&gt;&#13;&#10; &lt;a href="#%e7%8e%b0%e8%b1%a1" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;容器启动后，最开始一切正常。后来你用 &lt;code&gt;vim&lt;/code&gt;、VSCode 或 &lt;code&gt;sed -i&lt;/code&gt; 修改 &lt;code&gt;config.json&lt;/code&gt;，可能会发现：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;宿主机上的 &lt;code&gt;config.json&lt;/code&gt; 已经更新&lt;/li&gt;&#10;&lt;li&gt;容器里的 &lt;code&gt;/app/config.json&lt;/code&gt; 仍然是旧内容&lt;/li&gt;&#10;&lt;li&gt;容器继续使用旧配置&lt;/li&gt;&#10;&lt;li&gt;两边对这个文件的修改不再互相可见&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这个问题看起来像同步失效，但本质上是挂载点还指向旧文件。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="原因"&gt;&lt;span&gt;原因&lt;/span&gt;&#13;&#10; &lt;a href="#%e5%8e%9f%e5%9b%a0" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;单文件 bind mount 的关键点是：Docker 挂载的是当时那个文件对象，而不是永远跟随这个文件名。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;./config.json inode A -&amp;gt; /app/config.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;很多编辑器保存文件时，并不是直接在原文件上修改，而是走类似这样的流程：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;写入 config.json.tmp&#13;&#10;rename(config.json.tmp, config.json)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;保存完成后，宿主机路径 &lt;code&gt;config.json&lt;/code&gt; 指向了新的 inode：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;宿主机: ./config.json -&amp;gt; inode B&#13;&#10;容器内: /app/config.json -&amp;gt; inode A&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;容器仍然挂着旧文件对象，于是宿主机和容器里的文件就“分离”了。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="为什么隐蔽"&gt;&lt;span&gt;为什么隐蔽&lt;/span&gt;&#13;&#10; &lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9a%90%e8%94%bd" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;它不是每次修改都会触发，而是取决于工具的保存方式：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#13;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;th&gt;操作&lt;/th&gt;&#13;&#10; &lt;th&gt;是否可能更换 inode&lt;/th&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/thead&gt;&#13;&#10; &lt;tbody&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&lt;code&gt;vim&lt;/code&gt; 保存&lt;/td&gt;&#13;&#10; &lt;td&gt;可能&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;VSCode 保存&lt;/td&gt;&#13;&#10; &lt;td&gt;可能&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&lt;code&gt;sed -i&lt;/code&gt;&lt;/td&gt;&#13;&#10; &lt;td&gt;可能&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&lt;code&gt;cp&lt;/code&gt; 覆盖&lt;/td&gt;&#13;&#10; &lt;td&gt;可能&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;tr&gt;&#13;&#10; &lt;td&gt;&lt;code&gt;echo &amp;gt;&amp;gt; file&lt;/code&gt;&lt;/td&gt;&#13;&#10; &lt;td&gt;通常不会&lt;/td&gt;&#13;&#10; &lt;/tr&gt;&#13;&#10; &lt;/tbody&gt;&#13;&#10; &lt;/table&gt;&#13;&#10;&lt;/div&gt;&lt;p&gt;所以它经常表现成“之前都正常，某次修改后突然不生效”。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="推荐做法"&gt;&lt;span&gt;推荐做法&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%8e%a8%e8%8d%90%e5%81%9a%e6%b3%95" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;不要挂载单个文件：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;volumes:&#13;&#10; - ./config.json:/app/config.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;推荐把配置放进目录，挂载整个目录：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;volumes:&#13;&#10; - ./data:/app/data&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;项目结构可以这样放：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;project/&#13;&#10; docker-compose.yml&#13;&#10; data/&#13;&#10; config.json&#13;&#10; logs/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;程序读取：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;/app/data/config.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样即使 &lt;code&gt;data/config.json&lt;/code&gt; 被编辑器替换成新 inode，容器看到的仍然是同一个挂载目录下的新文件。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="compose-示例"&gt;&lt;span&gt;Compose 示例&lt;/span&gt;&#13;&#10; &lt;a href="#compose-%e7%a4%ba%e4%be%8b" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;services:&#13;&#10; web:&#13;&#10; image: my-app&#13;&#10; volumes:&#13;&#10; - ./data:/app/data&#13;&#10; - ./logs:/app/logs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置、日志、运行数据都按目录挂载，后续新增文件也不需要再改 compose。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="总结"&gt;&lt;span&gt;总结&lt;/span&gt;&#13;&#10; &lt;a href="#%e6%80%bb%e7%bb%93" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#13;&#10;&lt;/h2&gt;&lt;p&gt;单文件 bind mount 的坑在于：文件名没变，不代表底层文件对象没变。编辑器或命令一旦用 rename 覆盖原文件，容器可能还挂着旧 inode，导致宿主机和容器内的文件不再同步。&lt;/p&gt;&#10;&lt;p&gt;实际项目里，优先挂载目录：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;不推荐: ./config.json:/app/config.json&#13;&#10;推荐: ./data:/app/data&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;单文件挂载只适合非常明确、不会被运行时频繁编辑替换的场景。&lt;/p&gt;&#10;</description></item></channel></rss>