<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Yima Gu</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://yima-gu.github.io/</id>
  <link href="https://yima-gu.github.io/" rel="alternate"/>
  <link href="https://yima-gu.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Yima Gu</rights>
  <subtitle>计算机课程笔记与学习复盘</subtitle>
  <title>Yima Gu's Blog</title>
  <updated>2026-07-01T11:38:22.795Z</updated>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<h1>Chapter 8: Network Security (Part 2)</h1><h2 id="1-Network-Security-Attack-Events-网络安全攻击事件案例">1. Network Security Attack Events (网络安全攻击事件案例)</h2><h3 id="1-1-Stuxnet-震网-病毒">1.1 Stuxnet (&quot;震网&quot;病毒)</h3><ul><li><strong>性质</strong>: 世界上首个网络“超级破坏性武器”，专门攻击工业控制系统 (DCS, SCADA, PLC) 的蠕虫病毒。</li><li><strong>目标</strong>: 2010年攻击伊朗核设施（Natanz 铀浓缩工厂）。</li><li><strong>后果</strong>:<ul><li>摧毁了 984 台铀浓缩离心机 (Centrifuges)。</li><li>感染了 20 多万台计算机。</li><li>导致 1000 台机器物理退化，伊朗核计划倒退两年。</li></ul></li></ul><h3 id="1-2-BlackEnergy-乌克兰电网攻击">1.2 BlackEnergy (乌克兰电网攻击)</h3><ul><li><strong>性质</strong>: 具有信息战水准的网络攻击事件，主要通过木马病毒和 DDoS 插件。</li><li><strong>过程</strong>:<ul><li>最初感染 <code>.exe</code> 文件 -&gt; 释放代码 -&gt; 创建解密驱动 -&gt; 感染 <code>svchost.exe</code> -&gt; 注入 DLL -&gt; 下载 DDoS 插件。</li></ul></li><li><strong>后果</strong>:<ul><li>2015年乌克兰电网遭到 BlackEnergy 病毒的 DDoS 攻击。</li><li>导致 23 万人断电，断电时间长达 6 小时。</li><li>这是首个成功攻击电网的恶意程序。</li></ul></li></ul><h3 id="1-3-Colonial-Pipeline-Attack-Darkside-黑客团体">1.3 Colonial Pipeline Attack (Darkside 黑客团体)</h3><ul><li><strong>性质</strong>: 针对美国能源基础设施最具破坏性的网络攻击（Ransomware/勒索软件）。</li><li><strong>事件</strong>: 2021年，Darkside 黑客团体勒索科洛尼尔管道公司 (Colonial Pipeline)。</li><li><strong>后果</strong>:<ul><li>美国 18 个州因输油管停用陷入紧急状态（Gas Outages）。</li><li>公司最终支付 440 万美元赎金。</li></ul></li></ul><hr><h2 id="2-Securing-TCP-Connections-SSL-TLS">2. Securing TCP Connections: SSL/TLS</h2><h3 id="2-1-概述与历史">2.1 概述与历史</h3><ul><li><strong>SSL (Secure Sockets Layer)</strong> / <strong>TLS (Transport Layer Security)</strong> 是广泛部署的安全协议。</li><li><strong>支持</strong>: 几乎所有的浏览器和 Web 服务器 (HTTPS)。HTTP与HTTPS的核心区别在于是否使用 <strong>SSL/TLS</strong> 协议进行加密和安全保护。</li><li><strong>目标</strong>: 主要是为 Web 电子商务交易设计（加密信用卡号等），提供机密性 (Confidentiality)、完整性 (Integrity) 和认证 (Authentication)。</li><li><strong>位置</strong>: 位于<mark>应用层 (Application) 和传输层 (TCP) </mark>之间。SSL 为应用程序提供 API（通常是 C 或 Java SSL 库）。</li><li><strong>历史演变</strong>:<ul><li>1993: Netscape 设计 SSL 1.0 (未发布)。</li><li>1995: SSL 2.0 发布 (有严重漏洞)。</li><li>1996: SSL 3.0 问世，大规模应用。</li><li>1999: ISOC 发布 TLS 1.0 (SSL 的升级版)。</li><li>2006/2008/2011: TLS 1.1, 1.2 及其修订版。</li></ul></li></ul><h3 id="2-2-Toy-SSL-一个简单的安全通道模型">2.2 Toy SSL: 一个简单的安全通道模型</h3><p>为了理解 SSL，课件首先构建了一个简化的模型 (“Toy SSL”)，包含四个阶段：</p><ol><li><strong>Handshake (握手)</strong>: Alice 和 Bob 使用证书<em>certificate</em>和私钥<em>private key</em>进行身份认证，并交换共享密钥 (Shared Secret)。<ol><li><strong>打招呼与亮身份</strong>：<ul><li>Alice 先发一个“Hello”打招呼 。</li><li>Bob 回复他的<strong>证书 (Certificate)</strong> 。证书就像身份证，里面包含了 Bob 的<strong>公钥 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span>​)</strong>。Alice 通过验证证书，就能确定对方真的是 Bob，而不是冒充者 。</li></ul></li><li><strong>交换秘密 (Master Secret)</strong>：<ul><li>Alice 生成一个随机的数，称为<strong>主密钥 (Master Secret, MS)</strong> 。</li><li>为了不让别人偷看，Alice 使用 Bob 的公钥加密这个 MS，生成加密后的主密钥 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>M</mi><mi>S</mi></mrow><annotation encoding="application/x-tex">EMS</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">EMS</span></span></span></span>)，发送给 Bob 。</li><li><strong>原理</strong>：只有拥有私钥 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span>) 的 Bob 才能解开这个包裹拿到 MS。这样，双方就安全地共享了一个秘密 。</li></ul></li></ol></li><li><strong>Key Derivation (密钥派生)</strong>:<ul><li>虽然双方都有了主密钥 (MS)，但直接用这一把钥匙做所有事情（加密、校验、发数据、收数据）是不安全的。如果这把钥匙泄露，所有安全防线都会崩塌。</li><li><strong>原则</strong>：密码学中有一个重要原则，不同的操作应该使用不同的密钥 。</li><li>使用 Key Derivation Function (KDF) 从 Master Secret 派生出 4 个密钥：<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>c</mi></msub><mo separator="true">,</mo><msub><mi>K</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">K_c, K_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>: 客户端/服务端加密密钥 (Encryption Keys)。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>c</mi></msub><mo separator="true">,</mo><msub><mi>M</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">M_c, M_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>: 客户端/服务端 MAC 密钥 (MAC Keys)。</li></ul></li><li><strong>意义</strong>：将加密和完整性校验分开，也将发送和接收的方向分开，大大提高了安全性</li></ul></li><li><strong>Data Transfer (数据传输)</strong>:<ul><li>TCP 协议传输的是字节流，但为了安全校验，我们需要把数据切成块。数据流被分割成一系列的 <strong>Records (记录)</strong>。每个 Record 包含 MAC 用于完整性检查。</li></ul><ul><li><strong>Sequence Numbers (序列号)</strong>: 为了防止重放攻击 (Replay) 或重新排序，MAC 计算中包含序列号：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mi>A</mi><mi>C</mi><mo>=</mo><mi>M</mi><mi>A</mi><mi>C</mi><mo stretchy="false">(</mo><mi>M</mi><mi>x</mi><mo separator="true">,</mo><mi>s</mi><mi>e</mi><mi>q</mi><mi>u</mi><mi>e</mi><mi>n</mi><mi>c</mi><mi>e</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">MAC = MAC(Mx, sequence || data)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">se</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">ce</span><span class="mord">∣∣</span><span class="mord mathnormal">d</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span>。注意：序列号不直接在网络上传输，而是隐含的。</li></ul></li><li><strong>Connection Closure (连接关闭)</strong>:<ul><li>普通的 TCP 连接断开（FIN 报文）是不加密的，这给攻击者留下了可乘之机。</li></ul><ul><li>防止截断攻击 (Truncation Attack，即攻击者伪造 TCP FIN)。</li><li>使用 Record Types (记录类型): Type 0 表示数据，Type 1 表示关闭连接。</li></ul></li></ol><h3 id="2-3-Real-SSL-真实的-SSL-协议">2.3 Real SSL (真实的 SSL 协议)</h3><h4 id="SSL-Cipher-Suite-密码套件">SSL Cipher Suite (密码套件)</h4><p>客户端和服务端必须协商决定使用哪组加密算法：</p><ul><li><strong>Public-key algorithm</strong>: 公钥算法 (如 RSA)。</li><li><strong>Symmetric encryption algorithm</strong>: 对称加密算法 (如 DES, 3DES, RC2, RC4)。</li><li><strong>MAC algorithm</strong>: 消息认证码算法。</li></ul><h4 id="SSL-Handshake-Protocol-握手协议步骤">SSL Handshake Protocol (握手协议步骤)</h4><ol><li><strong>Client Hello</strong>: 发送支持的算法列表 + Client Nonce (随机数)。</li><li><strong>Server Hello</strong>: 选择算法 + 发送 Server Certificate + Server Nonce。</li><li><strong>Client Key Exchange</strong>: 验证证书，提取公钥，生成 <code>Pre_Master_Secret</code>，用服务器公钥加密后发送。</li><li><strong>Key Generation</strong>: 双方利用 <code>Nonces</code> 和 <code>Pre_Master_Secret</code> 独立计算出 Master Secret，进而生成加密密钥和 MAC 密钥。</li><li><strong>Finished Messages</strong>:<ul><li>Client 发送所有握手消息的 MAC。</li><li>Server 发送所有握手消息的 MAC。</li><li><em>目的</em>: 防止中间人攻击 (Man-in-the-middle) 篡改握手过程（如删除强加密算法）。</li><li><strong>结果</strong>： 由于双方计算 MAC 的输入数据不一致，计算出的 MAC 值自然不同。Server 会发现 Client 发来的 MAC 与自己算的不匹配，从而意识到握手过程被篡改，立即断开连接 。</li></ul></li></ol><p><em>注意</em>: 握手中使用 <strong>Nonces</strong> (随机数) 是为了防止重放攻击 (Replay Attack)。即使攻击者重放昨天的加密记录，由于 Nonce 改变，密钥也会改变，解密将失败。</p><h4 id="SSL-Record-Protocol-记录协议">SSL Record Protocol (记录协议)</h4><ul><li>结构: Header (Content type, Version, Length) + Data + MAC。</li><li>数据和 MAC 会被加密 (Symmetric algorithm)。</li><li>Fragment (分片) 大小通常为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>14</mn></msup></mrow><annotation encoding="application/x-tex">2^{14}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">14</span></span></span></span></span></span></span></span></span></span></span></span> bytes (~16KB)。</li></ul><hr><h3 id="3-Network-Layer-Security-IPsec">3. Network Layer Security: IPsec</h3><p>IPsec (IP Security) 是一套协议簇，旨在为网络层（IP层）通信提供安全性。由于所有互联网通信（如 TCP、UDP、ICMP）最终都要封装在 IP 数据包中传输，因此保护了 IP 层就相当于为整个网络提供了 <strong>“全面覆盖 (Blanket Coverage)”</strong> 的安全保护。</p><h4 id="3-1-概述与-VPN-Virtual-Private-Networks">3.1 概述与 VPN (Virtual Private Networks)</h4><ul><li><p><strong>设计目标</strong>：</p><ul><li>IPsec 的核心在于确保 IP 数据报 (Datagrams) 的<strong>机密性 (Confidentiality)</strong>、<strong>完整性 (Integrity)</strong> 和 <strong>源认证 (Origin Authentication)</strong>。</li><li>它可以加密数据报的 Payload（载荷），这意味着上层的 Web 浏览、E-mail、文件传输等都会自动被加密，应用程序无需修改即可受益。</li></ul></li><li><p><strong>VPN (虚拟专用网络) 的工作机制</strong>:</p><ul><li><strong>背景</strong>: 许多机构（如公司总部与分支机构）需要安全的私有网络通信。传统的做法是租用昂贵的物理专线。</li><li><strong>VPN 方案</strong>: 利用公共的、不安全的 Internet 来传输私有数据。</li><li><strong>“隧道”概念</strong>: 当位于分公司的员工发送数据给总部时，分公司的网关路由器会将数据加密，并通过 Internet 发送给总部的网关路由器。</li><li><strong>过程</strong>:<ol><li><strong>加密</strong>: 数据离开内部网络进入公共 Internet 前，被网关加密。</li><li><strong>传输</strong>: 加密后的数据像普通 IP 包一样在 Internet 上路由（虽然黑客可以截获，但无法解密）。</li><li><strong>解密</strong>: 到达目的地网关后，数据被解密并转发给内部的主机。</li></ol></li><li><strong>优势</strong>: 成本极低（使用现有的 Internet 接入），灵活性高（员工在酒店、家中也能通过 VPN 软件接入）。</li></ul></li></ul><h4 id="3-2-IPsec-的两种运行模式-Modes">3.2 IPsec 的两种运行模式 (Modes)</h4><p>IPsec 可以在两种不同的模式下运行，区别主要在于<strong>IPsec 头部插入的位置</strong>以及<strong>保护的范围</strong>。</p><p><strong>1. Transport Mode (传输模式)</strong></p><ul><li><strong>保护范围</strong>: 仅保护数据包的 <strong>Payload (载荷)</strong>，即上层协议数据（如 TCP 段、UDP 段、ICMP 消息）。<strong>原 IP 头部不被加密</strong>。</li><li><strong>报文结构</strong>:<ul><li><code>[原 IP 头部] + [IPsec 头部] + [加密的 Payload]</code></li></ul></li><li><strong>应用场景</strong>:<ul><li>主要用于<strong>端系统到端系统 (End-to-End)</strong> 的通信。</li><li>例如：两台服务器之间直接进行加密通信。</li><li>缺点：路由器仍能看到源和目的 IP，流量分析攻击可能依然有效。</li></ul></li></ul><p><strong>2. Tunnel Mode (隧道模式) —— 最常用</strong></p><ul><li><strong>保护范围</strong>: 保护<strong>整个原 IP 数据包</strong>（包括原 IP 头部和载荷）。</li><li><strong>报文结构</strong>:<ul><li>IPsec 将原来的整个 IP 包当作“数据”，对其加密，然后封装在一个<strong>新的 IP 数据包</strong>中。</li><li><code>[新 IP 头部] + [IPsec 头部] + [加密的原 IP 头部 + 原 Payload]</code></li></ul></li><li><strong>应用场景</strong>:<ul><li>主要用于<strong>网关到网关 (Gateway-to-Gateway)</strong> 或 <strong>主机到网关</strong> 的通信（即 VPN）。</li><li><strong>优势</strong>: 真正的源 IP 和目的 IP 被隐藏在加密载荷中，外部网络（Internet）只能看到新 IP 头部（通常是两个网关的地址），从而隐藏了内部网络拓扑结构。端系统（如公司内部电脑）不需要安装 IPsec 软件，由网关透明处理。</li></ul></li></ul><h4 id="3-3-IPsec-的两个核心协议">3.3 IPsec 的两个核心协议</h4><p>IPsec 定义了两个协议来提供不同的安全服务，它们可以单独使用，也可以组合使用。</p><p><strong>1. AH (Authentication Header) - 认证头部协议</strong></p><ul><li><strong>提供的服务</strong>:<ul><li><strong>源认证 (Source Authentication)</strong>: 确认发送者身份。</li><li><strong>数据完整性 (Data Integrity)</strong>: 确保数据在传输中未被篡改。</li><li><strong>防重放攻击 (Anti-Replay)</strong>。</li></ul></li><li><strong>局限性</strong>: AH <strong>不提供机密性 (Confidentiality)</strong>。也就是说，AH 不会对数据进行加密，数据依然是明文传输的，只是你无法篡改它。</li><li><strong>现状</strong>: 由于缺乏加密功能，现代安全需求中 AH 使用较少。</li></ul><p><strong>2. ESP (Encapsulation Security Payload) - 封装安全载荷协议</strong></p><ul><li><strong>提供的服务</strong>:<ul><li>包含 AH 的所有功能（源认证、数据完整性、防重放）。</li><li><strong>关键特性</strong>: 提供<strong>机密性 (Confidentiality)</strong>，即数据加密。</li></ul></li><li><strong>地位</strong>: ESP 是目前应用最广泛的协议。</li></ul><h4 id="总结：最佳实践组合">总结：最佳实践组合</h4><p><strong>Tunnel Mode with ESP (隧道模式 + ESP)</strong> 是构建 VPN 的标准配置：</p><ul><li><strong>ESP</strong> 保证了数据既不会被篡改，也不会被窃听。</li><li><strong>Tunnel Mode</strong> 允许在两个安全网关之间建立虚拟通道，隐藏了内部网络的 IP 结构，非常适合跨越公共 Internet 连接两个私有网络。</li></ul><hr><h2 id="4-Operational-Security-Firewalls-and-IDS">4. Operational Security: Firewalls and IDS</h2><h3 id="4-1-Firewalls-防火墙">4.1 Firewalls (防火墙)</h3><p>防火墙是网络安全的第一道防线，它将组织内部的“可信网络”与外部公共的“不可信 Internet”进行隔离。</p><ul><li><strong>核心功能</strong>: 通过允许某些分组通过并阻止其他分组，来控制进出网络的流量。</li><li><strong>主要防御目标 (Why Firewalls?)</strong>:<ol><li><strong>拒绝服务攻击 (DoS)</strong>: 防止攻击者通过建立大量伪造的 TCP 连接（如 SYN flooding）耗尽服务器资源，导致正常用户无法访问。</li><li><strong>非法访问与篡改</strong>: 防止攻击者修改或窃取内部敏感数据（例如，攻击者替换 CIA 主页）。</li><li><strong>访问控制</strong>: 仅允许经过身份认证的用户或主机访问内部网络。</li></ol></li></ul><h4 id="三种防火墙类型详解">三种防火墙类型详解</h4><p><strong>1. Stateless Packet Filtering (无状态包过滤)</strong></p><p>这是最基础的防火墙形式，通常集成在路由器中。</p><ul><li><strong>工作机制</strong>: 路由器独立处理每一个到达的数据包 (Packet-by-packet)，不保留任何历史记录或上下文信息。</li><li><strong>决策依据</strong>: 仅根据 IP/TCP/UDP 头部字段进行判断:<ul><li>源 IP 地址 / 目的 IP 地址。</li><li>源端口号 / 目的端口号。</li><li>协议类型 (TCP, UDP, ICMP)。</li><li>TCP 标志位 (SYN, ACK 等)。</li></ul></li><li><strong>访问控制列表 (ACL)</strong>: 管理员配置一组规则表，防火墙<strong>自上而下</strong>匹配。一旦匹配成功，即执行对应动作 (Allow/Deny)。<ul><li><em>策略示例</em>:<ul><li><strong>禁止外部 Web 访问</strong>: 丢弃所有目的端口为 80 的出站数据包。</li><li><strong>仅允许特定连接</strong>: 丢弃所有进来的 TCP SYN 包（阻止外部发起连接），但允许特定 Web 服务器除外。</li><li><strong>防 Smurf 攻击</strong>: 丢弃所有发往广播地址的 ICMP 包。</li></ul></li></ul></li></ul><p><strong>2. Stateful Packet Filtering (有状态包过滤)</strong></p><p>无状态过滤有时过于“粗暴”且不智能（例如，它无法区分一个 ACK 包是回应现有连接的，还是攻击者伪造的）。有状态过滤解决了这个问题。</p><ul><li><strong>工作机制</strong>: 防火墙维护一张 <strong>连接状态表 (Connection State Table)</strong>，跟踪每个 TCP 连接的生命周期。<ul><li>跟踪连接建立 (SYN) 和 拆除 (FIN)。</li><li>设定超时机制，自动清理非活动连接。</li></ul></li><li><strong>决策逻辑</strong>:<ul><li>不仅检查头部字段，还检查该数据包是否属于当前已存在的合法连接。</li><li><strong>示例</strong>: 如果一个进来的数据包标志位是 ACK（声称是响应），但状态表中没有对应的连接记录，防火墙会判定其“毫无意义 (make no sense)”并丢弃。</li></ul></li><li><strong>优势</strong>: 比无状态过滤更安全，能过滤掉伪造的后续数据包。</li></ul><p><strong>3. Application Gateways (应用网关)</strong></p><p>上述两种过滤只看网络层和传输层头部，应用网关则深入到<strong>应用层</strong>。</p><ul><li><strong>工作机制</strong>: 针对特定的应用（如 Telnet, FTP, HTTP）设置专门的代理服务器。</li><li><strong>流程示例 (Telnet)</strong>:<ol><li>内部用户不能直接 Telnet 到外部主机，路由器会拦截并阻断。</li><li>用户必须先 Telnet 到应用网关。</li><li>网关进行用户身份认证。</li><li>认证通过后，<strong>网关</strong>代理用户与外部主机建立连接，并在两个连接之间转发数据。</li></ol></li><li><strong>优势</strong>: 可以深入检查应用层数据内容，实现基于用户身份的精细控制。</li></ul><hr><h4 id="防火墙的局限性-Limitations">防火墙的局限性 (Limitations)</h4><p>尽管防火墙很有用，但并非万能：</p><ol><li><strong>IP Spoofing (IP 欺骗)</strong>: 路由器只能看 IP 头部，无法验证该 IP 是否真的来自声称的源头，攻击者可以伪造源 IP。</li><li><strong>可用性与复杂性</strong>: 如果要支持多种应用，需要为每个应用部署特定的网关（或复杂的代理配置）。</li><li><strong>客户端配置</strong>: 客户端软件（如浏览器）通常需要手动配置代理地址才能使用网关。</li><li><strong>UDP 处理困难</strong>: 由于 UDP 无连接，防火墙很难判断状态，往往采取“全部允许”或“全部拒绝”的策略，缺乏灵活性。</li><li><strong>内部威胁</strong>: 防火墙防外不防内，无法阻止内部员工的恶意攻击或误操作。</li><li><strong>加密流量</strong>: 如果攻击流量被封装在加密隧道（如 SSL 或 VPN）中，防火墙无法检查内容。</li></ol><hr><h3 id="4-2-Intrusion-Detection-Systems-IDS-入侵检测系统">4.2 Intrusion Detection Systems (IDS, 入侵检测系统)</h3><p>防火墙通常只检查头部 (Packet Filtering)，而 IDS 则进行更深度的分析，用于检测已穿透防火墙的攻击或内部威胁。</p><ul><li><p><strong>核心技术</strong>:</p><ol><li><strong>Deep Packet Inspection (DPI, 深度包检测)</strong>:<ul><li>IDS 不仅看头部，还深入检查数据包的<strong>载荷内容 (Contents)</strong>。</li><li><strong>特征匹配</strong>: 将包内的字符串与已知的病毒特征库、攻击代码数据库进行比对。</li></ul></li><li><strong>Correlation (关联分析)</strong>:<ul><li>不只看单个包，而是分析<strong>多个数据包</strong>或<strong>多个会话</strong>之间的关联。</li><li><strong>应用场景</strong>:<ul><li><strong>Port Scanning (端口扫描)</strong>: 检测某个源 IP 是否在短时间内尝试连接大量不同的端口。</li><li><strong>Network Mapping (网络测绘)</strong>: 检测探测网络拓扑的行为。</li><li><strong>DoS Attack</strong>: 检测流量异常峰值。</li></ul></li></ul></li></ol></li><li><p><strong>部署架构</strong>:</p><ul><li><strong>Sensors (传感器)</strong>: 分布在网络的不同关键节点。<ul><li>例如：防火墙外部、防火墙内部、<strong>DMZ (非军事化区)</strong> 区域（放置 Web/FTP/DNS 服务器的地方）。</li></ul></li><li>多点部署允许 IDS 对比不同位置的流量，从而精确定位攻击源和受影响范围。</li></ul></li></ul><hr><h2 id="5-思考题：智慧家庭安全协议设计-Thinking-Exercise">5. 思考题：智慧家庭安全协议设计 (Thinking Exercise)</h2><p>假设为智慧家庭设计通信协议，涉及：IoT 设备 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><msub><mi>D</mi><mn>1</mn></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi>I</mi><msub><mi>D</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">ID_1...ID_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)、网关 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><msub><mi>D</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">ID_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)、数据云、APP。</p><p><strong>需求</strong>: 数据安全、保密性、身份认证、抗重放攻击、轻量级。</p><h3 id="设计思路参考">设计思路参考</h3><ol><li><p><strong>密钥分配</strong>:</p><ul><li>每个设备配置唯一密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>k</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">k_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>网关 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><msub><mi>D</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">ID_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 存储所有设备的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>k</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">k_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>网关拥有自己的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>k</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">k_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，存储在云端。</li></ul></li><li><p><strong>设备到网关的认证 (Lightweight)</strong>:</p><ul><li>数据格式: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><mi>D</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><msub><mi>E</mi><mrow><mi>k</mi><mi>i</mi></mrow></msub><mo stretchy="false">(</mo><mi>I</mi><mi>D</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>D</mi><mi>a</mi><mi>t</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ID || E_{ki}(ID || Data)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord">∣∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ki</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord">∣∣</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span></li><li>网关收到后，根据明文 ID 查找 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>k</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">k_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 进行解密。</li><li>比对解密出的 ID 与明文 ID 是否一致（认证 + 完整性）。</li></ul></li><li><p><strong>网关到云端的数据上传</strong>:</p><ul><li>汇聚数据: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mi>A</mi><mi>T</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>I</mi><msub><mi>D</mi><mn>1</mn></msub><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>D</mi><mi>a</mi><mi>t</mi><msub><mi>a</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>I</mi><msub><mi>D</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>D</mi><mi>a</mi><mi>t</mi><msub><mi>a</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">DATA = (ID_1 || Data_1) + (ID_2 || Data_2)...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣∣</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣∣</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord">...</span></span></span></span></li><li>使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>E</mi><mrow><mi>k</mi><mn>0</mn></mrow></msub></mrow><annotation encoding="application/x-tex">E_{k0}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 加密传输。</li><li>引入 Timestamp 或 Nonce 防止重放。</li></ul></li></ol>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-06-Security-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-06-Security-02/"/>
    <published>2026-01-14T19:40:00.000Z</published>
    <summary>Chapter 8: Network Security (Part 2)</summary>
    <title>Network - 06.Security-02</title>
    <updated>2026-07-01T11:38:22.795Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success **本节导读：网络安全的核心逻辑与知识图谱**">            <p>本章不仅仅是介绍加密算法，而是构建一套解决网络中“信任”问题的工具箱。学习时请遵循以下<strong>层层递进</strong>的逻辑链条：</p><ol><li><strong>明确目标 (四大属性)</strong>：网络安全不只是加密（机密性），还必须保证数据的<strong>完整性</strong>（没被改过）、<strong>身份认证</strong>（你是谁）以及<strong>可用性</strong>。</li><li><strong>掌握工具 (密码学基石)</strong>：<ul><li><strong>对称加密 (DES/AES)</strong>：效率高，适合加密大数据，但面临密钥分发难题。</li><li><strong>公钥加密 (RSA)</strong>：解决了密钥分发问题，支持数字签名，但计算慢。<strong>RSA 的数学推导</strong>（模运算与欧拉定理）是理论难点。</li></ul></li><li><strong>构建机制 (防御策略)</strong>：<ul><li><strong>哈希与 MAC</strong>：解决“完整性”问题。</li><li><strong>Nonce (随机数)</strong>：解决身份认证中的 <strong>“重放攻击”</strong>。</li><li><strong>数字签名与 CA</strong>：解决 <strong>“中间人攻击”</strong> 并提供不可否认性。</li></ul></li><li><strong>综合应用 (安全电子邮件)</strong>：<ul><li>这是本章知识的<strong>集大成者</strong>。请重点理解“<strong>混合加密</strong>”（用公钥加密会话密钥 + 用会话密钥加密正文）与“<strong>数字签名</strong>”（先哈希再私钥加密）是如何结合的。</li></ul></li></ol>          </div><h2 id="第-8-章：网络安全-Chapter-8-Network-Security">第 8 章：网络安全 (Chapter 8: Network Security)</h2><h3 id="8-1-什么是网络安全？-What-is-Network-Security">8.1 什么是网络安全？(What is Network Security?)</h3><p>网络安全的核心属性包括：</p><ul><li><strong>机密性 (Confidentiality):</strong> 只有发送方和预期的接收方能够理解消息内容。<ul><li>实现方式：发送方加密 (encrypts)，接收方解密 (decrypts)。</li></ul></li><li><strong>身份认证 (Authentication):</strong> 发送方和接收方确认彼此的真实身份。</li><li><strong>消息完整性 (Message Integrity):</strong> 确保消息在传输过程中未被篡改（未被修改、删除或添加）。</li><li><strong>访问与可用性 (Access and Availability):</strong> 服务必须对授权用户是可访问和可用的。</li></ul><p><strong>网络中的角色：</strong></p><ul><li><strong>Alice &amp; Bob:</strong> 通信双方（好人）。</li><li><strong>Trudy (Intruder):</strong> 入侵者（坏人）。<ul><li><strong>攻击手段：</strong><ul><li><strong>窃听 (Eavesdrop):</strong> 拦截消息。</li><li><strong>插入 (Insert):</strong> 主动在连接中插入消息。</li><li><strong>伪装 (Impersonation):</strong> 伪造源地址或数据包字段。</li><li><strong>劫持 (Hijacking):</strong> 接管正在进行的连接。</li><li><strong>拒绝服务 (Denial of Service):</strong> 通过过载资源阻止服务。</li></ul></li></ul></li></ul><hr><h3 id="8-2-密码学原理-Principles-of-Cryptography">8.2 密码学原理 (Principles of Cryptography)</h3><h4 id="1-密码学术语">1. 密码学术语</h4><ul><li><strong>明文 (Plaintext, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>):</strong> 原始消息。</li><li><strong>密文 (Ciphertext, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>):</strong> 加密后的消息。</li><li><strong>密钥 (Key, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>):</strong> 加密和解密算法使用的参数。</li><li><strong>加密算法 (Encryption Algorithm):</strong> 将明文转换为密文。</li><li><strong>解密算法 (Decryption Algorithm):</strong> 将密文还原为明文。</li></ul><h4 id="2-传统加密方法">2. 传统加密方法</h4><ul><li><strong>替换密码 (Substitution Cipher):</strong> 将一个东西替换为另一个。<ul><li><strong>单表替换密码 (Monoalphabetic Cipher):</strong> 每个字母替换为唯一的另一个字母（例如凯撒密码）。易受<strong>统计分析 (Statistical Analysis)</strong> 攻击（根据字母频率）。</li></ul></li><li><strong>多表加密 (Polyalphabetic Encryption):</strong> 使用多个单表密码并按某种模式循环使用，以提高安全性。</li></ul><h4 id="3-对称密钥密码学-Symmetric-Key-Cryptography">3. 对称密钥密码学 (Symmetric Key Cryptography)</h4><h5 id="核心：块密码-Block-Ciphers">核心：块密码 (Block Ciphers)</h5><p>块密码是现代加密技术的基础。</p><ul><li><strong>基本原理</strong>：<ul><li>将明文消息分割成固定大小的块（例如 64 位或 128 位）。</li><li>使用 <strong>1 对 1 的映射</strong>，将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 位的明文块转换为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 位的密文块。</li><li><strong>实现机制</strong>：由于直接查表（需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>64</mn></msup></mrow><annotation encoding="application/x-tex">2^{64}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">64</span></span></span></span></span></span></span></span></span></span></span></span> 个条目）太大不可行，实际通过函数模拟随机排列。通常采用 <strong>多轮 (Rounds)</strong> 迭代结构，每一轮使用密钥的不同部分进行运算，使得输入的一个比特能影响输出的多个比特，从而充分打乱数据。</li></ul></li></ul><h5 id="A-数据加密标准-（Data-Encryption-Standard-DES）">A.  数据加密标准  （Data Encryption Standard DES）</h5><p>DES 是最著名的<strong>对称密钥块密码</strong>，虽然已被 AES 取代，但其设计思想（Feistel 结构）仍是密码学的经典教材。</p><ul><li><p><strong>核心结构：Feistel 网络</strong></p><ul><li><strong>特点</strong>：设计非常谨慎，每一轮<strong>只处理一半数据</strong>。</li><li><strong>优势</strong>：解密过程和加密过程极其相似，只需逆序使用子密钥，硬件实现极其容易。</li></ul></li><li><p><strong>输入 (Input)</strong>：64 位明文块 (Block Size)。</p></li><li><p><strong>密钥 (Key)</strong>：56 位有效密钥 (通常存储为 64 位，其中 8 位用于奇偶校验)。</p></li><li><p><strong>轮数 (Rounds)</strong>：<strong>16 轮</strong> 相同的迭代处理。</p></li></ul><p>DES 首先进行初始置换 (IP)，然后进入 16 轮迭代。每一轮主要处理<strong>右半部分 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>)</strong>，左半部分 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>) 在该轮保持静止。</p><ol><li><strong>左右切分 (Split)</strong>：<ul><li>将 64 位数据切分为左右两半：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>L</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">L_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> (32位) 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>R</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">R_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> (32位)。</li></ul></li><li><strong>轮函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span> (针对右半部分 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> )</strong>：<ul><li><strong>扩展 (Expansion)</strong>：将 32 位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> 通过扩展置换变为 <strong>48 位</strong>。<ul><li><em>目的</em>：增加雪崩效应，并匹配子密钥长度。</li></ul></li><li><strong>密钥混合 (Key Mixing)</strong>：将扩展后的 48 位数据与当轮的 <strong>48 位子密钥</strong> 进行 <strong>异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊕</mo></mrow><annotation encoding="application/x-tex">\oplus</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊕</span></span></span></span>)</strong>。</li><li><strong>替换 (Substitution) - S-盒 (S-Box)</strong>：<strong>【核心步骤】</strong><ul><li>将 48 位数据分成 8 组（每组 6 位），查 8 个不同的 S-盒表，输出 32 位（每组 4 位）。</li><li><em>目的</em>：引入<strong>非线性 (Non-linearity)</strong>。这是 DES 安全性的根本，切断了输入输出的线性联系，用于实现<strong>混淆 (Confusion)</strong>。</li></ul></li><li><strong>置换 (Permutation) - P-盒 (P-Box)</strong>：<ul><li>将 S-盒输出的 32 位数据打乱顺序。</li><li><em>目的</em>：实现<strong>扩散 (Diffusion)</strong>，让一位的变化在下一轮扩散到更多位置。</li></ul></li></ul></li><li><strong>合并与交换 (XOR &amp; Swap)</strong>：<ul><li>将轮函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span> 的输出与左半部分 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span> 进行 <strong>异或</strong>。</li><li><strong>交换</strong>：原来的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> 变成下一轮的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>，运算结果变成下一轮的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>。</li><li><em>公式</em>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>L</mi><mi>i</mi></msub><mo>=</mo><msub><mi>R</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">L_{i} = R_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>R</mi><mi>i</mi></msub><mo>=</mo><msub><mi>L</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>⊕</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>R</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>K</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R_{i} = L_{i-1} \oplus f(R_{i-1}, K_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</li></ul></li></ol><ul><li><strong>安全性较低</strong>：主要弱点是 <strong>56 位密钥空间太小</strong> (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>56</mn></msup></mrow><annotation encoding="application/x-tex">2^{56}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">56</span></span></span></span></span></span></span></span></span></span></span></span>)。<ul><li>现代算力可以通过<strong>暴力破解 (Brute-force attack)</strong> 在不到 24 小时内遍历所有密钥。</li></ul></li><li><strong>改进方案：3DES (Triple DES)</strong><ul><li><strong>原理</strong>：使用 3 个不同的密钥 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>K</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>K</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">K_1, K_2, K_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>) 进行三次操作。</li><li><strong>流程</strong>：加密 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">K_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 解密 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">K_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 加密 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">K_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)。</li><li><em>注：中间使用“解密”是为了兼容老式 DES 硬件（当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>1</mn></msub><mo>=</mo><msub><mi>K</mi><mn>2</mn></msub><mo>=</mo><msub><mi>K</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">K_1=K_2=K_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 时等同于单次 DES）。</em></li><li><strong>效果</strong>：虽然速度慢，但大幅增加了密钥空间，延长了算法寿命。</li></ul></li></ul><h5 id="B-AES-高级加密标准">B. AES (高级加密标准)</h5><ul><li><strong>地位</strong>：2001 年推出的新标准，旨在替代 DES。</li><li><strong>参数</strong>：<ul><li><strong>输入</strong>：处理 <strong>128 位</strong> 的数据块。</li><li><strong>密钥</strong>：支持 <strong>128、192 或 256 位</strong> 密钥。</li></ul></li><li><strong>加密效果与安全性</strong>：<ul><li><strong>极高安全性</strong>：相比于 DES 极易被破解，AES 的暴力破解预计需要 <strong>149 万亿年</strong>，是目前最安全的对称加密标准之一。</li></ul></li></ul><p>AES 不同于 DES 的 Feistel 结构（左右互搏），它使用 <strong>SPN (Substitution-Permutation Network)</strong> 结构。它将 128 位数据看作一个 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn><mo>×</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">4 \times 4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span> 的字节矩阵 (State)</strong>，每一轮都对所有字节进行并行处理。</p><p><strong>每一轮 (Round) 的四个标准步骤：</strong></p><ol><li>**字节代换 (SubBytes)<ul><li><strong>动作</strong>：查表（S-盒）。把矩阵中每个格子里的字节，独立替换成 S-盒中对应的另一个字节。</li><li><strong>目的</strong>：这是唯一的<strong>非线性</strong>步骤，彻底打乱数据内容，切断输入输出的线性联系。</li></ul></li><li>**行移位 (ShiftRows)<ul><li><strong>动作</strong>：每一行向左循环移动不同的偏移量（第 1 行不动，第 2 行移 1 格…）。</li><li><strong>目的</strong>：<strong>横向打乱</strong>。把原本属于某一列的数据“搬运”到其他列。</li></ul></li><li>**列混合 (MixColumns) **<ul><li><strong>动作</strong>：矩阵运算。对每一列的 4 个字节进行线性组合（混合）。</li><li><strong>目的</strong>：<strong>纵向打乱</strong>。确保输入的一个字节变化能影响到这一列的所有字节。</li><li><em>注：结合 ShiftRows，经过几轮后，1 个比特的变化就能扩散到整个矩阵。</em></li></ul></li><li>**轮密钥加 (AddRoundKey)<ul><li><strong>动作</strong>：将当前矩阵与当轮的子密钥进行 <strong>异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊕</mo></mrow><annotation encoding="application/x-tex">\oplus</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊕</span></span></span></span>)</strong>。</li><li><strong>目的</strong>：将密钥的秘密信息注入数据中。</li></ul></li></ol><h5 id="C-CBC-密码块链接模式">C. CBC (密码块链接模式)</h5><p>单纯使用块密码（ECB 模式）存在缺陷：相同的明文块会生成相同的密文块，容易被统计分析攻击。CBC 模式解决了这个问题。</p><ul><li><strong>核心机制</strong>：引入随机性与依赖性。</li><li><strong>加密流程</strong>：<ul><li>当前明文块 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">m(i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span></span></span></span> 在加密前，先与<strong>前一个密文块</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(i-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span> 进行 <strong>异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊕</mo></mrow><annotation encoding="application/x-tex">\oplus</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊕</span></span></span></span>)</strong> 运算。</li><li><strong>公式</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>K</mi><mi>s</mi></msub><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>⊕</mo><mi>c</mi><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(i) = K_s(m(i) \oplus c(i-1))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">))</span></span></span></span>。</li></ul></li><li><strong>解密流程</strong>：<ul><li>先解密当前密文块，再与前一个密文块异或恢复明文。</li><li><strong>公式</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>K</mi><mi>s</mi></msub><mo stretchy="false">(</mo><mi>c</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>⊕</mo><mi>c</mi><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">m(i) = K_s(c(i)) \oplus c(i-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><strong>初始化向量 (IV)</strong>：<ul><li>对于第一个块（没有前一个密文），使用一个随机生成的块 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(0)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span></span></span></span> 作为 <strong>IV</strong>。</li><li><strong>效果</strong>：IV 不需要保密，但必须随机。这保证了即使<strong>完全相同的消息</strong>，只要 IV 不同，每次加密生成的<strong>密文也会完全不同</strong>。</li></ul></li></ul><p>CBC (密码块链接) 的核心目的是<strong>打破明文块之间的独立性</strong>，防止同样的明文生成同样的密文（即解决 ECB 模式的缺陷）。</p><p><strong>1. 核心逻辑：连锁反应 (Chaining)</strong></p><ul><li>每一块数据的加密，都依赖于<strong>前一块的密文</strong>。这使得加密过程具有了“记忆性”。</li></ul><p><strong>2. 加密过程 (Encryption)</strong></p><ul><li><strong>公式</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub><mo>=</mo><msub><mi>E</mi><mi>K</mi></msub><mo stretchy="false">(</mo><msub><mi>P</mi><mi>i</mi></msub><mo>⊕</mo><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">C_i = E_K(P_i \oplus C_{i-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li><li><strong>步骤</strong>：<ol><li>拿到当前明文块 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">P_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>先将其与<strong>前一个密文块 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">C_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span></strong> 进行 <strong>异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊕</mo></mrow><annotation encoding="application/x-tex">\oplus</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊕</span></span></span></span>)</strong>。</li><li>将异或后的结果送入 AES/DES 进行加密，得到当前密文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li></ol></li><li><strong>第一块怎么办？</strong> 使用一个随机生成的 <strong>IV (初始化向量)</strong> 充当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">C_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li></ul><p><strong>3. 解密过程 (Decryption)</strong></p><ul><li><strong>公式</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mi>i</mi></msub><mo>=</mo><msub><mi>D</mi><mi>K</mi></msub><mo stretchy="false">(</mo><msub><mi>C</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>⊕</mo><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">P_i = D_K(C_i) \oplus C_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span></li><li><strong>步骤</strong>：<ol><li>先将当前密文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 送入 AES/DES 进行解密。</li><li>将解密出的中间结果与<strong>前一个密文块 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">C_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span></strong> 进行 <strong>异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊕</mo></mrow><annotation encoding="application/x-tex">\oplus</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊕</span></span></span></span>)</strong>。</li><li>还原出明文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">P_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li></ol></li></ul><p><strong>4. 为什么需要 IV (Initialization Vector)？</strong></p><ul><li><strong>随机化</strong>：IV 保证了即使明文完全相同（例如两次都发送 “Hello”），只要 IV 不同，生成的密文流就会<strong>截然不同</strong>。</li><li><strong>防重放</strong>：攻击者无法通过观察密文判断你是否发送了重复的消息。</li></ul><h4 id="4-公钥密码学-Public-Key-Cryptography">4. 公钥密码学 (Public Key Cryptography)</h4><p>公钥密码学（又称非对称密码学）解决了对称密钥加密中“密钥分发”的难题。</p><ul><li><p><strong>基本特点：</strong></p><ul><li><strong>密钥对 (Key Pair):</strong> 每个通信实体（例如 Bob）都拥有一对密钥，而不是一个共享密钥。<ul><li><strong>公钥 (Public Key, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span>):</strong> 公开给所有人，世界上的任何人都可以使用它来给 Bob <strong>加密</strong>消息。</li><li><strong>私钥 (Private Key, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span>):</strong> 只有 Bob 自己知道，用于<strong>解密</strong>收到的消息。</li></ul></li><li><strong>分离的加解密能力：</strong> 即使你知道加密密钥（公钥），你也无法解密消息；只有拥有私钥的人才能解密。</li></ul></li><li><p><strong>核心要求：</strong></p><ol><li><strong>可逆性：</strong> 使用公钥加密后，必须能使用私钥解密还原。即：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">K_B^-(K_B^+(m)) = m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>。</li><li><strong>计算安全性：</strong> 即使已知公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 和加密算法，在计算上应该<strong>无法推导出</strong>私钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span>。</li></ol></li></ul><h5 id="RSA-算法详解：原理与推导"><strong>RSA 算法详解：原理与推导</strong></h5><p>RSA 是目前最流行、使用最广泛的公钥算法，其安全性基于<strong>大整数分解</strong>的数学难题。</p><p><strong>1. 预备知识：模运算 (Modular Arithmetic)</strong></p><p>RSA 的核心依赖于模运算的以下性质：</p><ul><li><strong>加法与乘法封闭性：</strong> 模运算下的加减乘操作是封闭的。</li><li><strong>指数运算性质：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>a</mi><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi><msup><mo stretchy="false">)</mo><mi>d</mi></msup><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi><mo>=</mo><msup><mi>a</mi><mi>d</mi></msup><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">(a \mod n)^d \mod n = a^d \mod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:1.0991em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span></span></span></span>。</li><li><strong>欧拉定理推论 (关键事实)：</strong> 对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mi>p</mi><mi>q</mi></mrow><annotation encoding="application/x-tex">n=pq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">pq</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi><mo>=</mo><mo stretchy="false">(</mo><mi>p</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z=(p-1)(q-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>，有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mi>y</mi></msup><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi><mo>=</mo><msup><mi>x</mi><mrow><mo stretchy="false">(</mo><mi>y</mi><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>z</mi><mo stretchy="false">)</mo></mrow></msup><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">x^y \mod n = x^{(y \mod z)} \mod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">y</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">y</span><span class="mspace allowbreak mtight"></span><span class="mspace mtight" style="margin-right:0.7807em;"></span><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">mod</span></span></span><span class="mspace mtight" style="margin-right:0.1952em;"></span><span class="mspace mtight" style="margin-right:0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span></span></span></span>。</li></ul><p><strong>2. RSA 密钥生成步骤 (Key Generation)</strong></p><p>Alice 和 Bob 需要通过以下步骤生成公钥和私钥：</p><ol><li><strong>选择素数：</strong> 选择两个极大的素数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>（例如每个 1024 位）。</li><li><strong>计算模数：</strong> 计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mi>p</mi><mo>×</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">n = p \times q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>。</li><li><strong>计算欧拉函数值：</strong> 计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi><mo>=</mo><mo stretchy="false">(</mo><mi>p</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z = (p-1)(q-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>。</li><li><strong>选择公钥指数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span>：</strong> 选择一个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span>，满足 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi><mo>&lt;</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">e &lt; n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span> 与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> <strong>互质</strong>（即没有公因数）。</li><li><strong>计算私钥指数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>：</strong> 寻找一个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>，使得 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi><mo>×</mo><mi>d</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">e \times d - 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 能被 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> 整除。<ul><li>即满足同余方程：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi><mi>d</mi><mo>≡</mo><mn>1</mn><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ed \equiv 1 \pmod z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span></strong>。</li></ul></li><li><strong>结果：</strong><ul><li><strong>公钥 (Public Key)：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>e</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, e)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">e</span><span class="mclose">)</span></span></span></span></li><li><strong>私钥 (Private Key)：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>d</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, d)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">d</span><span class="mclose">)</span></span></span></span></li></ul></li></ol><p><strong>3. 加密与解密过程</strong></p><p>假设发送方要发送的消息比特模式表示为整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>（需满足 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>&lt;</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">m &lt; n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>）。</p><ul><li><strong>加密 (Encryption)：</strong> 使用接收方的公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>e</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, e)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">e</span><span class="mclose">)</span></span></span></span>。<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>c</mi><mo>=</mo><msup><mi>m</mi><mi>e</mi></msup><mspace></mspace><mspace width="1em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">c = m^e \mod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7144em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span></span></span></span></span></p></li><li><strong>解密 (Decryption)：</strong> 使用接收方的私钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>d</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, d)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">d</span><span class="mclose">)</span></span></span></span>。<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>m</mi><mo>=</mo><msup><mi>c</mi><mi>d</mi></msup><mspace></mspace><mspace width="1em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">m = c^d \mod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8991em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span></span></span></span></span></p></li></ul><p><strong>4. 正确性推导 (为什么解密能还原明文？)</strong></p><p>我们需要证明：使用私钥解密密文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>，确实能得到原始消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>。<br>即证明：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msup><mi>m</mi><mi>e</mi></msup><msup><mo stretchy="false">)</mo><mi>d</mi></msup><mspace></mspace><mspace width="0.6667em"/><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mtext> </mtext><mtext> </mtext><mi>n</mi><mo>=</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">(m^e)^d \mod n = m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0991em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.6667em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></strong>，这是由欧拉定理保证的。</p><p><div class="note note-info">            </p><p><strong>1. 定理定义</strong><br>若 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo separator="true">,</mo><mi>a</mi></mrow><annotation encoding="application/x-tex">n, a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span></span></span></span> 为正整数，且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>gcd</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>a</mi><mo separator="true">,</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\gcd(a, n) = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span style="margin-right:0.01389em;">g</span>cd</span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">a, n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span></span></span></span> 互质），则：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>a</mi><mrow><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow></msup><mo>≡</mo><mn>1</mn><mspace></mspace><mspace width="1em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">a^{\phi(n)} \equiv 1 \pmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ϕ</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">n</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></span></p><p>其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> 是欧拉函数。对于 RSA 算法中的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mi>p</mi><mo>×</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">n = p \times q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>，有 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>p</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi(n) = (p-1)(q-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></strong>。</p><p><strong>2. 在 RSA 中的推导 (通用情况: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>gcd</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>m</mi><mo separator="true">,</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\gcd(m, n) = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span style="margin-right:0.01389em;">g</span>cd</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)</strong><br>RSA 的密钥生成要求 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 满足：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi><mi>d</mi><mo>≡</mo><mn>1</mn><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ed \equiv 1 \pmod{\phi(n)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span>。<br>这意味着存在整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>，使得 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi><mi>d</mi><mo>=</mo><mi>k</mi><mo>⋅</mo><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">ed = k \cdot \phi(n) + 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></strong>。</p><p>根据欧拉定理，我们可以推导出解密的正确性：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><msup><mi>m</mi><mrow><mi>e</mi><mi>d</mi></mrow></msup><mspace></mspace><mspace width="1em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msup><mi>m</mi><mrow><mi>k</mi><mo>⋅</mo><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>+</mo><mn>1</mn></mrow></msup><mspace></mspace><mspace width="1em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">(</mo><msup><mi>m</mi><mrow><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow></msup><msup><mo stretchy="false">)</mo><mi>k</mi></msup><mo>⋅</mo><mi>m</mi><mspace></mspace><mspace width="1em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mi>k</mi></msup><mo>⋅</mo><mi>m</mi><mspace></mspace><mspace width="1em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>m</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}m^{ed} \pmod n &amp;= m^{k \cdot \phi(n) + 1} \pmod n \\&amp;= (m^{\phi(n)})^k \cdot m \pmod n \\&amp;= (1)^k \cdot m \pmod n \\&amp;= m\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.2551em;vertical-align:-2.8776em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.3776em;"><span style="top:-5.4396em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-3.8416em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.2824em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-0.7824em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.8776em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.3776em;"><span style="top:-5.4396em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mbin mtight">⋅</span><span class="mord mathnormal mtight">ϕ</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">n</span><span class="mclose mtight">)</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-3.8416em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ϕ</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">n</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">m</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-2.2824em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">m</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:1em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-0.7824em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.8776em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p><strong>3. 特殊情况说明：若 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>gcd</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>m</mi><mo separator="true">,</mo><mi>n</mi><mo stretchy="false">)</mo><mo mathvariant="normal">≠</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\gcd(m, n) \neq 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span style="margin-right:0.01389em;">g</span>cd</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 怎么办？</strong><br>标准的欧拉定理证明确实要求互质，但在 RSA 体系中（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mi>p</mi><mi>q</mi></mrow><annotation encoding="application/x-tex">n=pq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">pq</span></span></span></span>），即使 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> <strong>不互质</strong>，解密公式 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>m</mi><mrow><mi>e</mi><mi>d</mi></mrow></msup><mo>≡</mo><mi>m</mi><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">m^{ed} \equiv m \pmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> 依然成立</strong>。</p><ul><li><strong>数学保障：</strong> 通过中国剩余定理和费马小定理可以证明，分别在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>p</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pmod p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">p</span><span class="mclose">)</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pmod q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">)</span></span></span></span> 下等式恒成立，因此在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> 下也成立。</li><li><strong>安全说明</strong>：如果发现 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>gcd</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>m</mi><mo separator="true">,</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">\gcd(m, n) = d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span style="margin-right:0.01389em;">g</span>cd</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mo>&gt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">d &gt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>， 这意味着你直接<strong>分解了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></strong>。一旦 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 被分解，你就可以算出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>，进而算出私钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>。</li></ul><p>**4. 关键结论 **<br>在 RSA 的模幂运算体系中，必须区分两个“世界”：</p><ul><li><strong>底数世界 (加密/解密数据)：</strong> 所有的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 都是在 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></strong> 下运算的。</li><li><strong>指数世界 (生成密钥)：</strong> 所有的指数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 都是在 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace></mspace><mspace width="0.4444em"/><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"/><mi>ϕ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pmod{\phi(n)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal">ϕ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></strong> 下运算的。</li></ul>          </div><h5 id="RSA性质">RSA性质</h5><ul><li><p><strong>重要性质 (用于数字签名)：</strong></p><ul><li>RSA 的密钥使用顺序是可以<strong>交换</strong>的。</li><li><strong>先加密后解密：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">K_B^-(K_B^+(m)) = m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> （用于保密通信）。</li><li><strong>先解密后加密：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">K_B^+(K_B^-(m)) = m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> （用于数字签名）。</li><li>这意味着：如果你用私钥处理一个消息，任何人都可以用你的公钥“还原”它。因为只有你拥有私钥，这就证明了消息是你发送的。</li></ul></li><li><p><strong>会话密钥 (Session Keys)：</strong></p><ul><li><strong>问题：</strong> RSA 的指数运算在计算上非常昂贵，比对称加密（如 DES/AES）慢 100 到 10000 倍。</li><li><strong>解决方案：</strong> 混合使用。<ol><li>Alice 生成一个临时的、只用一次的对称密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">K_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>（称为<strong>会话密钥</strong>）。</li><li>Alice 使用 Bob 的公钥加密这个短小的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">K_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，发送给 Bob。</li><li>Bob 用私钥解密得到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">K_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>双方使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">K_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和高效的对称加密算法（如 AES）进行大量数据的传输。</li></ol></li></ul></li></ul><h3 id="8-3-消息完整性-Message-Integrity">8.3 消息完整性 (Message Integrity)</h3><p>仅有加密无法保证完整性（Trudy 可以修改密文）。需要机制来验证内容未被篡改且来源可信。</p><h4 id="1-消息摘要-Message-Digest-哈希函数-Hash-Function">1. 消息摘要 (Message Digest) / 哈希函数 (Hash Function)</h4><ul><li><strong>定义：</strong> 将任意长度的消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 映射为固定长度的字符串 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li><strong>特性：</strong><ul><li><strong>多对一：</strong> 不同的消息可能产生相同的哈希（冲突）。</li><li><strong>单向性 (Irreversibility):</strong> 无法从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span> 反推 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>。</li><li><strong>抗冲突 (Collision Resistance):</strong> 极难找到两个不同的消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo separator="true">,</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x, y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 使得 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(x) = H(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><strong>算法：</strong> MD5 (128位，已不推荐), SHA-1 (160位)。</li><li><strong>互联网校验和 (Checksum):</strong> 也是一种哈希，但安全性差，容易构造冲突。</li></ul><h4 id="2-消息认证码-MAC-Message-Authentication-Code">2. 消息认证码 (MAC - Message Authentication Code)</h4><p>仅仅使用哈希函数只能保证数据没有被意外篡改，但无法防止恶意篡改（攻击者可以修改消息并重新计算哈希）。为了同时实现<strong>完整性</strong>和<strong>发送方认证</strong>，我们需要引入一个<strong>共享秘密 (Shared Secret)</strong>。</p><ul><li><p><strong>核心定义：</strong></p><ul><li>MAC 也被称为“带密钥的哈希” (Keyed Hash)。</li><li>它不需要加密算法，而是依赖哈希函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H()</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mclose">)</span></span></span></span> 和一个只有通信双方（例如 Alice 和 Bob）知道的密钥字符串 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>。</li></ul></li><li><p><strong>工作原理：</strong></p><ol><li><strong>发送方 (Alice)：</strong><ul><li>准备好要发送的消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>。</li><li>将共享秘密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 与消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 拼接在一起，计算其哈希值：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>s</mi><mo>+</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(s + m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li>这个生成的哈希值就是 <strong>MAC</strong>（或称为消息摘要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><msub><mi>D</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">MD_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>）。</li><li>Alice 将 <strong>原始消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></strong> 和 <strong>MAC</strong> 一起发送给 Bob（通常表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>M</mi><mi>A</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">m || MAC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mord">∣∣</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span>）。</li><li><em>注意：消息本身通常是不加密的，以明文形式传输。</em></li></ul></li><li><strong>接收方 (Bob)：</strong><ul><li>收到消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>m</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">m&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 和附带的 MAC’。</li><li>由于 Bob 知道共享秘密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>，他使用本地的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 和收到的消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>m</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">m&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 进行同样的哈希计算：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>s</mi><mo>+</mo><msup><mi>m</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(s + m&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</li><li><strong>比较：</strong> Bob 将自己计算出的结果与收到的 MAC’ 进行比对。</li></ul></li><li><strong>验证结论：</strong><ul><li>如果两者<strong>一致</strong>：Bob 可以确信消息在传输过程中未被篡改（完整性），且消息一定是由知道秘密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 的人（Alice）生成的（认证）。</li><li>如果两者<strong>不一致</strong>：说明消息被篡改了，或者发送者不知道秘密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>，Bob 丢弃该消息。</li></ul></li></ol></li><li><p><strong>HMAC (Hash-based Message Authentication Code)：</strong></p><ul><li>这是目前广泛使用的 MAC 标准。</li><li><strong>背景：</strong> 简单的直接拼接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>s</mi><mo>+</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(s + m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span> 存在一些微妙的安全缺陷（如长度扩展攻击）。</li><li><strong>改进机制：</strong> HMAC 采用<strong>嵌套哈希</strong>的方式来增强安全性。<ul><li>它不只是哈希一次，而是进行两轮哈希运算。</li><li>大致逻辑：先把密钥和消息哈希一次，然后把密钥和上一步的哈希结果再哈希一次。</li><li><em>步骤简述：</em><ol><li>将密钥拼接在消息前面。</li><li>对拼接结果进行哈希。</li><li>将密钥再次拼接在上述哈希摘要的前面。</li><li>对这个新组合再次进行哈希，得到最终结果。</li></ol></li></ul></li></ul></li><li><p><strong>典型应用案例：OSPF 路由协议</strong></p><ul><li>OSPF 是自治系统内部的路由协议。为了防止恶意攻击者注入错误的路由信息（如消息插入、删除或修改），路由器之间需要验证 OSPF 更新包的真实性。</li><li><strong>实现：</strong> 路由器之间共享一个密码（Secret）。在发送 OSPF 报文时，路由器计算报文内容与密码的 MD5 哈希值，并将这个哈希值附加在 OSPF 报文的尾部。接收方路由器通过验证哈希值来确认报文确实来自可信的邻居且未被篡改。</li></ul></li></ul><h3 id="8-3-2-身份认证-Authentication">8.3.2 身份认证 (Authentication)</h3><h4 id="演进过程：">演进过程：</h4><ul><li><strong>ap1.0:</strong> “我是 Alice”。 -&gt; 失败（Trudy 也可以这么说）。</li><li><strong>ap2.0:</strong> “我是 Alice” (在 IP 包中)。 -&gt; 失败（Trudy 可以伪造 IP 源地址）。</li><li><strong>ap3.0:</strong> “我是 Alice” + 密码。 -&gt; 失败（Trudy 可以窃听密码并重放 - <strong>重放攻击 Playback Attack</strong>）。</li><li><strong>ap3.1:</strong> “我是 Alice” + 加密密码。 -&gt; 失败（Trudy 仍然可以录制加密后的密码并重放）。</li><li><strong>ap4.0:</strong> <strong>Nonce (一次性随机数)</strong>。<ul><li>Bob 发送一个随机数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> (Nonce) 给 Alice。</li><li>Alice 用共享密钥加密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> 并发回。</li><li>Bob 解密验证。防止了重放攻击（因为每次 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> 都不同）。</li></ul></li><li><strong>ap5.0:</strong> Nonce + 公钥。<ul><li>Alice 用私钥加密 Nonce。存在<strong>中间人攻击</strong>风险（如果 Bob 没有正确验证 Alice 的公钥）。</li></ul></li></ul><h4 id="3-数字签名-Digital-Signatures">3. 数字签名 (Digital Signatures)</h4><ul><li><strong>目的：</strong> 提供<strong>不可否认性 (Non-repudiation)</strong>。证明消息确实由某人发送，且只有他能发送。</li><li><strong>实现：</strong> 使用<strong>私钥加密</strong>。<ul><li>Bob 对消息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 的哈希值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span> 用自己的<strong>私钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span></strong> 进行加密，生成签名。</li><li>Alice 收到后，用 Bob 的<strong>公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span></strong> 解密签名得到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi></mrow><annotation encoding="application/x-tex">h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">h</span></span></span></span>，同时计算收到消息的哈希 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><msup><mi>m</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><msup><mi>m</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h = H(m&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">h</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，则签名有效。</li></ul></li></ul><h4 id="4-公钥认证-Public-Key-Certification">4. 公钥认证 (Public-Key Certification)</h4><ul><li><strong>问题：</strong> 即使使用了公钥，怎么知道公钥真的属于 Bob 而不是冒充者 Trudy？（中间人攻击 Man-in-the-Middle Attack）。</li><li><strong>解决方案：认证中心 (CA - Certification Authority)</strong>。<ul><li>CA 是可信赖的第三方。</li><li>CA 将实体（如 Bob）的身份与其公钥绑定，并用 <strong>CA 的私钥</strong>对这些信息进行签名，生成<strong>证书 (Certificate)</strong>。</li><li>用户通过 CA 的公钥（预装在浏览器/OS中）验证证书的合法性，从而获得可信的 Bob 公钥。</li></ul></li></ul><hr><h3 id="8-4-安全电子邮件-Securing-E-mail">8.4 安全电子邮件 (Securing E-mail)</h3><p>在实际的电子邮件安全协议（如 PGP - Pretty Good Privacy）中，为了同时实现机密性、完整性和身份认证，通常结合使用<strong>公钥加密</strong>、<strong>对称加密</strong>和<strong>哈希函数</strong>。</p><h4 id="1-机密性-Confidentiality">1. 机密性 (Confidentiality)</h4><p>为了保证邮件内容只有接收方 (Bob) 能看懂，需要对邮件进行加密。由于公钥算法（如 RSA）计算极其复杂、速度慢，不适合直接加密长邮件，因此采用<strong>混合加密机制</strong>。</p><ul><li><strong>核心思想</strong>：利用对称加密的高效率来加密正文，利用公钥加密的便捷性来分发对称密钥。</li><li><strong>具体步骤</strong>：<ol><li><strong>生成会话密钥</strong>：Alice 生成一个临时的、随机的对称会话密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> (Session Key)。</li><li><strong>加密邮件</strong>：使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 对邮件正文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 进行加密，生成密文 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K_S(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li><strong>加密密钥</strong>：使用 Bob 的公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 对这个短小的会话密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 进行加密，生成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K_B^+(K_S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</li><li><strong>发送</strong>：将“加密后的密钥”和“加密后的邮件”组合发送。</li></ol></li><li><strong>优势</strong>：既保证了安全性（只有 Bob 的私钥能解开 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>），又保证了性能（邮件正文使用高速的对称加密）。</li></ul><h4 id="2-发送方认证与完整性-Authentication-Integrity">2. 发送方认证与完整性 (Authentication &amp; Integrity)</h4><p>为了防止邮件被篡改（完整性），并确保邮件确实是 Alice 发送的（源认证），使用<strong>数字签名</strong>技术。</p><ul><li><strong>核心思想</strong>：对邮件的“指纹”（哈希摘要）进行加密，而不是对整个邮件签名，以提高效率。</li><li><strong>具体步骤</strong>：<ol><li><strong>计算摘要</strong>：Alice 使用哈希函数（如 MD5 或 SHA）对邮件 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 计算得到固定长度的报文摘要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li><strong>数字签名</strong>：Alice 使用<strong>自己的私钥</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>A</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_A^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 对摘要进行加密，生成签名 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>A</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K_A^-(H(m))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span></span></span></span>。</li><li><strong>发送</strong>：将原始邮件 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 与数字签名拼接在一起发送。</li></ol></li><li><strong>验证原理</strong>：Bob 收到后，用 Alice 的公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>A</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_A^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 解密签名得到摘要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi></mrow><annotation encoding="application/x-tex">H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span></span></span></span>，并自己计算邮件的哈希 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>H</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">H&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>。如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo>=</mo><msup><mi>H</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">H = H&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>，则证明邮件未被修改且确实来自 Alice。</li></ul><h4 id="3-综合方案：先签名，后加密-The-Combined-Scheme">3. 综合方案：先签名，后加密 (The Combined Scheme)</h4><p>在实际应用中，Alice 希望同时实现上述所有目标。通常遵循 <strong>“先签名，后加密”</strong> 的顺序。</p><p><strong>发送方 (Alice) 的操作流程：</strong></p><ol><li><strong>签名</strong>：<ul><li>计算邮件 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 的哈希 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li>用 Alice 的私钥签名：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>i</mi><mi>g</mi><mo>=</mo><msubsup><mi>K</mi><mi>A</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sig = K_A^-(H(m))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span></span></span></span>。</li><li>将签名附在邮件后，形成组合体 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>m</mi><mo>+</mo><mi>S</mi><mi>i</mi><mi>g</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[m + Sig]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mclose">]</span></span></span></span>。</li></ul></li><li><strong>加密</strong>：<ul><li>生成临时会话密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 加密整个组合体（邮件+签名）：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>D</mi><mi>a</mi><mi>t</mi><mi>a</mi><mo>=</mo><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">(</mo><mi>m</mi><mo>+</mo><mi>S</mi><mi>i</mi><mi>g</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">EncryptedData = K_S(m + Sig)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mclose">)</span></span></span></span>。</li><li>用 Bob 的公钥加密会话密钥：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>K</mi><mi>e</mi><mi>y</mi><mo>=</mo><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">EncryptedKey = K_B^+(K_S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">Key</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><strong>发送</strong>：发送 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>K</mi><mi>e</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">EncryptedKey</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">Key</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>D</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow><annotation encoding="application/x-tex">EncryptedData</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span></span></span></span>。</li></ol><p><strong>接收方 (Bob) 的操作流程：</strong></p><ol><li><strong>提取密钥</strong>：用 Bob 的私钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>B</mi><mo>−</mo></msubsup></mrow><annotation encoding="application/x-tex">K_B^-</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 解密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>K</mi><mi>e</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">EncryptedKey</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">Key</span></span></span></span>，拿到会话密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li><strong>解密数据</strong>：用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">K_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 解密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>n</mi><mi>c</mi><mi>r</mi><mi>y</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>D</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow><annotation encoding="application/x-tex">EncryptedData</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">cry</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span></span></span></span>，还原出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>m</mi><mo>+</mo><mi>S</mi><mi>i</mi><mi>g</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[m + Sig]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mclose">]</span></span></span></span>。</li><li><strong>验证签名</strong>：<ul><li>分离出邮件 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 和签名 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>i</mi><mi>g</mi></mrow><annotation encoding="application/x-tex">Sig</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span></span>。</li><li>用 Alice 的公钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>K</mi><mi>A</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">K_A^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.105em;vertical-align:-0.2935em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8115em;"><span style="top:-2.4065em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2935em;"><span></span></span></span></span></span></span></span></span></span> 解密 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>i</mi><mi>g</mi></mrow><annotation encoding="application/x-tex">Sig</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span></span>，得到原始摘要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li>对解密出的邮件 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 重新计算哈希 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>H</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H&#x27;(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>。</li><li><strong>比对</strong>：若 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo>=</mo><mo>=</mo><msup><mi>H</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(m) == H&#x27;(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">==</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span>，则所有安全目标达成。</li></ul></li></ol><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext>Alice Sends: </mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><munder><munder><mrow><msubsup><mi>K</mi><mi>B</mi><mo>+</mo></msubsup><mo stretchy="false">(</mo><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">)</mo></mrow><mo stretchy="true">⏟</mo></munder><mtext>数字信封</mtext></munder><mo>+</mo><munder><munder><mrow><msub><mi>K</mi><mi>S</mi></msub><mo stretchy="false">(</mo><mover><mover><mi>m</mi><mo stretchy="true">⏞</mo></mover><mtext>邮件</mtext></mover><mo>+</mo><mover><mover><mrow><msubsup><mi>K</mi><mi>A</mi><mo>−</mo></msubsup><mo stretchy="false">(</mo><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><mo stretchy="true">⏞</mo></mover><mtext>数字签名</mtext></mover><mo stretchy="false">)</mo></mrow><mo stretchy="true">⏟</mo></munder><mtext>加密载荷</mtext></munder></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\text{Alice Sends: } &amp; \underbrace{K_B^+(K_S)}_{\text{数字信封}} + \underbrace{K_S(\overbrace{m}^{\text{邮件}} + \overbrace{K_A^-(H(m))}^{\text{数字签名}})}_{\text{加密载荷}}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.0577em;vertical-align:-1.7788em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.2788em;"><span style="top:-4.2788em;"><span class="pstrut" style="height:4.1477em;"></span><span class="mord"><span class="mord text"><span class="mord">Alice Sends: </span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.7788em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.2788em;"><span style="top:-4.2788em;"><span class="pstrut" style="height:4.1477em;"></span><span class="mord"><span class="mord"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span style="top:-1.39em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">数字信封</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span class="svg-align" style="top:-2.0683em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span style="top:-2.4163em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2837em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9317em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.61em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1477em;"><span style="top:-2.5377em;"><span class="pstrut" style="height:4.1477em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">加密载荷</span></span></span></span></span><span style="top:-4.1477em;"><span class="pstrut" style="height:4.1477em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1477em;"><span class="svg-align" style="top:-3.216em;"><span class="pstrut" style="height:4.1477em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-4.1477em;"><span class="pstrut" style="height:4.1477em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.7569em;"><span style="top:-3.0786em;"><span class="pstrut" style="height:3.0786em;"></span><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0786em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">m</span></span></span><span class="svg-align" style="top:-3.5306em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z"/></svg></span></span></span></span></span></span></span></span><span style="top:-4.3571em;"><span class="pstrut" style="height:3.0786em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">邮件</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mover"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1477em;"><span style="top:-3.4693em;"><span class="pstrut" style="height:3.4693em;"></span><span class="mord mover"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4693em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span style="top:-2.4163em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">−</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2837em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span></span></span><span class="svg-align" style="top:-3.9213em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z"/></svg></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2837em;"><span></span></span></span></span></span></span><span style="top:-5.1387em;"><span class="pstrut" style="height:3.4693em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">数字签名</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2837em;"><span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9317em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.61em;"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.7788em;"><span></span></span></span></span></span></span></span></span></span></span></span></p>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-06-Security-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-06-Security-01/"/>
    <published>2026-01-14T19:30:00.000Z</published>
    <summary>本章不仅仅是介绍加密算法，而是构建一套解决网络中“信任”问题的工具箱。学习时请遵循以下层层递进的逻辑链条：</summary>
    <title>Network - 06.Security-01</title>
    <updated>2026-07-01T11:38:22.795Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success Motivation & Summary">            <p><strong>Motivation</strong></p><ul><li><strong>冲突的本质：</strong> 互联网最初是为<strong>数据传输</strong>（如文件、邮件）设计的，提供的是“尽力而为 (Best-Effort)”的服务——不保证时间，但保证完整。然而，<strong>多媒体应用</strong>（音频/视频）的需求恰恰相反：它们对<strong>延迟和抖动</strong>极度敏感，但对少量<strong>丢包</strong>可以容忍。</li><li><strong>核心挑战：</strong> 如何在不提供服务质量保证（无 QoS）的现有互联网架构上，让对 QoS 要求极高的多媒体应用流畅运行？</li></ul><p><strong>Content Summary</strong></p><ol><li><strong>应用分类：</strong> 区分了存储流式、直播流式和实时交互式应用的不同需求。</li><li><strong>应用层解决方案：</strong> 在网络层无法改变的情况下，利用<strong>客户端缓冲</strong>、<strong>CDN</strong>、<strong>FEC (前向纠错)</strong> 和 <strong>交织</strong> 等技术在端系统解决抖动和丢包问题。</li><li><strong>专用协议：</strong> 介绍了 <strong>RTP</strong> (传输媒体数据) 和 <strong>SIP</strong> (信令控制)。</li><li><strong>网络层演进 (QoS)：</strong> 探讨了如何通过<strong>调度算法</strong> (如 WFQ)、<strong>监管机制</strong> (令牌桶) 以及 <strong>DiffServ/IntServ</strong> 架构，让网络从“尽力而为”向“提供服务保证”演进。</li></ol>          </div><h2 id="第-7-章：多媒体网络-Chapter-7-Multimedia-Networking">第 7 章：多媒体网络 (Chapter 7: Multimedia Networking)</h2><h3 id="7-1-引言与原则-Principles">7.1 引言与原则 (Principles)</h3><ul><li><strong>多媒体应用的分类 (Classify multimedia applications):</strong><ol><li><strong>存储流式 (Stored streaming):</strong><ul><li>媒体存储在源端，传输给客户端。</li><li>客户端在所有数据到达前就开始播放 (streaming)。</li><li>关键是<strong>播放时机 (playout timing)</strong>。</li><li>具有 VCR 功能（暂停、倒带、快进），允许初始延迟。</li></ul></li><li><strong>直播流式 (Live streaming):</strong><ul><li>例如：互联网广播、体育赛事直播。</li><li>也有播放缓冲区，播放可能会滞后传输数十秒。</li><li>无法快进，但可能可以暂停或倒带。</li></ul></li><li><strong>实时交互式 (Interactive, real-time):</strong><ul><li>例如：IP 电话 (VoIP)、视频会议、分布式互动游戏。</li><li><strong>对延迟非常敏感 (Delay sensitive):</strong> 端到端延迟应小于 150ms (好) 或 400ms (可接受)。</li><li>对丢包具有一定的容忍度 (Loss tolerant)。</li></ul></li></ol></li><li><strong>网络服务需求 (Network services):</strong><ul><li>不同的应用需要不同的服务级别 (QoS)。</li><li>现有的互联网提供的是 <strong>尽力而为 (Best-effort)</strong> 服务，不保证延迟和丢包。</li></ul></li><li><strong>挑战:</strong><ul><li>尽力而为的服务模型难以满足多媒体应用对 QoS 的要求。</li><li>解决方案：<mark>应用层技术</mark> (Application-level techniques) + 网络层机制 (Network-level mechanisms)。</li></ul></li></ul><h3 id="7-2-流式存储音频和视频-Streaming-Stored-Audio-and-Video">7.2 流式存储音频和视频 (Streaming Stored Audio and Video)</h3><ul><li><strong>流式传输 (Streaming):</strong> 客户端在下载的同时播放。</li><li><strong>客户端缓冲 (Client Buffering):</strong><ul><li><strong>目的：</strong> 吸收网络延迟的抖动 (Jitter)，使播放更加平滑。</li><li><strong>机制：</strong><ul><li>填充速率 (fill rate) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> 是可变的（受网络带宽影响）。</li><li>排空速率 (drain rate) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 是恒定的（受播放速率决定）。</li><li>缓冲区在开始播放前会预存一部分数据。</li></ul></li></ul></li><li><strong>UDP vs TCP:</strong><ul><li><strong>UDP:</strong> 发送速率由服务器控制，不进行拥塞控制，适合对延迟敏感的应用。需要应用层处理丢包和重排序。</li><li><strong>TCP:</strong> 发送速率受拥塞控制影响，波动大。提供可靠传输，但重传会增加延迟。HTTP/TCP 更容易穿透防火墙。</li></ul></li><li><strong>适应不同客户端速率:</strong><ul><li>服务器存储多个不同编码速率（比特率）的视频版本（如 1.5 Mbps, 28.8 Kbps）。</li><li>根据客户端的可用带宽选择合适的版本。</li></ul></li></ul><h3 id="7-3-尽力而为服务的优化-Making-the-Best-of-Best-Effort-Service">7.3 尽力而为服务的优化 (Making the Best of Best Effort Service)</h3><p>互联网提供的“尽力而为”服务不保证带宽、延迟和丢包，为了满足多媒体应用的需求，需要在<strong>应用层</strong>采取多种机制来应对网络的不确定性。</p><h4 id="1-客户端缓冲-Client-Side-Buffering">1. 客户端缓冲 (Client-Side Buffering)</h4><p>这是流式播放中最核心的机制，用于解决<strong>网络抖动 (Jitter)</strong> 问题。</p><ul><li><strong>原理：</strong><ul><li><strong>输入速率 (Fill Rate, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span>)：</strong> 从网络接收数据的速率，由于网络拥塞等原因，是<strong>可变</strong>的。</li><li><strong>输出速率 (Drain Rate, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>)：</strong> 播放器消耗数据的速率，通常是<strong>恒定</strong>的（取决于编码比特率）。</li><li><strong>缓冲池：</strong> 在客户端内存中开辟一块区域，先将数据积累到一定程度再开始播放。</li></ul></li><li><strong>作用：</strong><ul><li><strong>平滑抖动：</strong> 缓冲区的存在吸收了数据包到达时间的不规律变化，保证播放器能以恒定速率读取数据。</li><li><strong>补偿延迟：</strong> 初始的播放延迟（Play-out delay）为暂时滞后的数据包提供了到达的时间窗口。</li></ul></li></ul><h4 id="2-传输协议的选择-UDP-vs-TCP">2. 传输协议的选择 (UDP vs TCP)</h4><p>多媒体应用需要在 UDP 和 TCP 之间根据需求做权衡。</p><h5 id="UDP-用户数据报协议"><strong>UDP (用户数据报协议)</strong></h5><ul><li><strong>特性：</strong><ul><li>发送速率由服务器控制（通常等于编码速率），<strong>不进行拥塞控制</strong>，对网络拥塞“无感知”。</li><li><strong>低延迟：</strong> 没有重传机制，播放延迟短（通常 2-5 秒）。</li></ul></li><li><strong>容错：</strong> 需要应用层自己处理丢包（如通过 FEC）和乱序。</li><li><strong>适用场景：</strong> 对实时性要求高、能容忍少量丢包的应用（如 VoIP、实时会议）。</li></ul><h5 id="TCP-传输控制协议"><strong>TCP (传输控制协议)</strong></h5><ul><li><strong>特性：</strong><ul><li><strong>发送速率波动：</strong> 受 TCP 拥塞控制机制（如慢启动、AIMD）影响，发送速率会剧烈波动（“锯齿状”）。</li><li><strong>可靠传输：</strong> 保证数据不丢失，但重传机制会引入显著的<strong>延迟</strong>。</li><li><strong>穿透性好：</strong> HTTP/TCP 更容易通过防火墙和 NAT（许多防火墙默认拦截 UDP）。</li></ul></li><li><strong>适用场景：</strong> 存储流媒体（如 YouTube, Netflix），依靠较大的客户端缓冲区来平滑 TCP 的传输波动。</li></ul><h4 id="3-适应不同客户端速率-Rate-Adaptation">3. 适应不同客户端速率 (Rate Adaptation)</h4><p>由于不同客户端的接入带宽差异巨大（如 5G vs 拨号），服务器不能以单一码率发送。</p><ul><li><strong>多重编码 (Multiple Encodings)：</strong><ul><li>服务器将同一个视频预先编码为<strong>不同比特率</strong>的多个版本（例如：1.5 Mbps, 500 Kbps, 28.8 Kbps）。</li></ul></li><li><strong>动态选择：</strong><ul><li>客户端根据当前检测到的可用带宽，请求合适版本的视频片段。</li><li><strong>DASH (Dynamic Adaptive Streaming over HTTP)</strong> 是目前主流的实现方式。</li></ul></li></ul><h4 id="4-自适应播放延迟-Adaptive-Playout-Delay">4. 自适应播放延迟 (Adaptive Playout Delay)</h4><p>针对<strong>实时交互应用</strong>（如 IP 电话），不能使用过大的缓冲区。需要在“低延迟”和“低丢包”之间寻找动态平衡。</p><h5 id="核心思想"><strong>核心思想</strong></h5><ul><li><strong>动态调整：</strong> 不是使用固定的播放延迟，而是根据网络状况动态估算延迟。</li><li><strong>调整时机：</strong> 仅在每个<strong>语音突发 (Talk Spurt)</strong> 的开始时刻调整播放时间，在突发内部保持固定的播放间隔，通过压缩或拉长静音期来实现调整。</li></ul><h5 id="算法步骤"><strong>算法步骤</strong></h5><ol><li><p><strong>估算平均网络延迟 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">d_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)：</strong><br>使用指数加权移动平均 (EWMA) 公式：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>d</mi><mi>i</mi></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>u</mi><mo stretchy="false">)</mo><mo>⋅</mo><msub><mi>d</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><mi>u</mi><mo>⋅</mo><mo stretchy="false">(</mo><msub><mi>r</mi><mi>i</mi></msub><mo>−</mo><msub><mi>t</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_i = (1-u) \cdot d_{i-1} + u \cdot (r_i - t_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">u</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord mathnormal">u</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">r_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>: 接收时间, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>t</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">t_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7651em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>: 发送时间</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span>: 权重系数 (如 0.01)</li></ul></li><li><p><strong>估算延迟偏差/抖动 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">v_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)：</strong></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>u</mi><mo stretchy="false">)</mo><mo>⋅</mo><msub><mi>v</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><mi>u</mi><mo>⋅</mo><mi mathvariant="normal">∣</mi><msub><mi>r</mi><mi>i</mi></msub><mo>−</mo><msub><mi>t</mi><mi>i</mi></msub><mo>−</mo><msub><mi>d</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">v_i = (1-u) \cdot v_{i-1} + u \cdot | r_i - t_i - d_i |</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">u</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord mathnormal">u</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7651em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span></span></span></span></span></p></li><li><p><strong>计算播放时间 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">p_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)：</strong><br>对于语音突发的第一个包：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub><mo>=</mo><msub><mi>t</mi><mi>i</mi></msub><mo>+</mo><msub><mi>d</mi><mi>i</mi></msub><mo>+</mo><mi>K</mi><mo>⋅</mo><msub><mi>v</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">p_i = t_i + d_i + K \cdot v_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7651em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>: 安全系数 (如 4)。这表示播放时间设置为“发送时间 + 平均延迟 + K倍抖动”，以覆盖绝大多数数据包的到达时间。</li></ul></li><li><p><strong>突发检测：</strong><br>通过比较连续包的时间戳和序列号来判断是否开始了新的语音突发（例如：时间戳跳变 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>&gt;</mo><mn>20</mn><mi>m</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">&gt; 20ms</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">20</span><span class="mord mathnormal">m</span><span class="mord mathnormal">s</span></span></span></span> 且序列号连续）。</p></li></ol><h4 id="5-丢包恢复机制-Recovery-from-Packet-Loss">5. 丢包恢复机制 (Recovery from Packet Loss)</h4><p>在不使用 TCP 重传（因为太慢）的情况下，应用层可以通过增加冗余来对抗丢包。</p><h5 id="A-前向纠错-FEC-Forward-Error-Correction"><strong>A. 前向纠错 (FEC - Forward Error Correction)</strong></h5><ul><li><strong>方案 1：异或冗余</strong><ul><li>每 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个原始数据块，计算生成 1 个冗余块（异或结果）。</li><li>发送 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个块。</li><li><strong>能力：</strong> 可以恢复这组中任意 <strong>1 个</strong> 丢失的包。</li><li><strong>代价：</strong> 增加了带宽消耗 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">1/n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/</span><span class="mord mathnormal">n</span></span></span></span>) 和播放延迟 (需要等一组包到齐)。</li></ul></li><li><strong>方案 2：低质量流冗余</strong><ul><li>在发送第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个高质量包时，附带第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个包的<strong>低质量版本</strong>（如低码率音频）。</li><li>如果第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个包丢失，可以使用第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个包中携带的低质量版本进行填补。</li><li><strong>优点：</strong> 延迟较低。</li></ul></li></ul><h5 id="B-交织-Interleaving"><strong>B. 交织 (Interleaving)</strong></h5><ul><li><strong>原理：</strong> 发送时不按顺序发送相邻的音频单元，而是将其打散重排。<ul><li>例如：发送顺序为 1, 5, 9… 而不是 1, 2, 3…</li></ul></li><li><strong>作用：</strong> 如果网络发生突发性丢包（连续丢一组包），在接收端还原后，这些丢包会变成<strong>分散的</strong>单个丢失单元。</li><li><strong>优势：</strong> 分散的小错误比连续的大段静音更容易被通过算法掩盖（Error Concealment）。</li><li><strong>代价：</strong> 增加了播放延迟。</li></ul><h4 id="6-内容分发网络-CDN">6. 内容分发网络 (CDN)</h4><p>解决单点服务器瓶颈和长距离传输延迟的问题。</p><ul><li><strong>核心策略：</strong> <strong>内容复制 (Content Replication)</strong>。</li><li><strong>部署：</strong> 将内容（如视频文件）预先推送到分布在全球边缘网络（靠近用户）的数百/数千台服务器上。</li><li><strong>请求路由：</strong><ul><li>当用户请求视频时，利用 <strong>DNS 重定向</strong> 技术。</li><li>权威 DNS 服务器根据用户的 IP 地址，判断其地理位置。</li><li>将请求重定向到<strong>距离用户最近</strong>（或负载最轻）的 CDN 节点。</li></ul></li><li><strong>优势：</strong> 显著降低了网络延迟，减少了骨干网流量，提高了系统的可靠性。</li></ul><h3 id="7-4-实时交互应用协议-Protocols-for-Real-Time-Interactive-Applications">7.4 实时交互应用协议 (Protocols for Real-Time Interactive Applications)</h3><ul><li><strong>RTP (Real-Time Protocol):</strong><ul><li>运行在 UDP 之上。</li><li>提供：<strong>载荷类型标识 (Payload Type)</strong>, <strong>序列号 (Sequence Number)</strong>, <strong>时间戳 (Timestamp)</strong>。</li><li><strong>不提供</strong> QoS 保证（不保证及时交付或不丢包）。</li></ul></li><li><strong>RTCP (RTP Control Protocol):</strong> 用于监控服务质量和传递会话信息。</li><li><strong>SIP (Session Initiation Protocol):</strong> 用于建立、修改和终止多媒体会话（如 VoIP 呼叫）。</li></ul><h3 id="7-5-提供多种服务等级-Providing-Multiple-Classes-of-Service">7.5 提供多种服务等级 (Providing Multiple Classes of Service)</h3><p>传统的互联网提供的是“尽力而为 (Best-Effort)”的服务，即“一刀切”的模型。为了满足多媒体应用的需求，网络需要演进为提供多种服务等级。</p><h4 id="1-核心设计原则-Design-Principles">1. 核心设计原则 (Design Principles)</h4><p>为了实现区分服务，网络架构需要遵循以下四个原则：</p><ul><li><strong>原则 1：标记 (Marking / Classification)</strong><ul><li>路由器需要能够区分不同类别的流量。</li><li><strong>方法：</strong> 在网络边缘（Edge）对数据包进行标记（例如使用 IP 头部的 ToS 字段），核心路由器根据标记处理数据包。</li></ul></li><li><strong>原则 2：隔离 (Isolation / Protection)</strong><ul><li>需要保护一个类别的流量不受其他类别（特别是行为不当的流）的影响。</li><li>例如：通过调度机制，确保音频流不会被突发的 FTP 文件传输阻塞。</li></ul></li><li><strong>原则 3：高效利用资源 (Efficiency)</strong><ul><li>虽然需要隔离，但也希望资源能被共享。</li><li>例如：如果高优先级的流量没有使用其分配的带宽，应该允许低优先级的流量使用这些空闲带宽，而不是让带宽闲置。</li></ul></li><li><strong>原则 4：呼叫接纳 (Call Admission)</strong><ul><li>物理链路的容量是有限的。如果流量需求超过了链路容量，必须拒绝新的连接请求（类似于电话忙音），以保证现有连接的服务质量。</li></ul></li></ul><h4 id="2-调度机制-Scheduling-Mechanisms">2. 调度机制 (Scheduling Mechanisms)</h4><p>调度策略决定了链路上的下一个数据包该发送队列中的哪一个。</p><h5 id="A-先入先出-FIFO"><strong>A. 先入先出 (FIFO)</strong></h5><ul><li><strong>机制：</strong> 按照数据包到达队列的顺序进行发送。</li><li><strong>丢弃策略 (Discard Policy)：</strong> 当队列满时，如何丢弃数据包？<ul><li><strong>尾部丢弃 (Tail Drop)：</strong> 丢弃新到达的数据包（最常用）。</li><li><strong>优先级丢弃 (Priority)：</strong> 根据优先级丢弃/移除数据包。</li><li><strong>随机丢弃 (Random)：</strong> 随机选择数据包丢弃（如 RED 算法）。</li></ul></li></ul><h5 id="B-优先级排队-Priority-Queuing"><strong>B. 优先级排队 (Priority Queuing)</strong></h5><ul><li><strong>机制：</strong> 维护多个优先级的队列（如高优先级、低优先级）。</li><li><strong>规则：</strong> 只要高优先级队列中有数据包，就先发送高优先级的；只有高优先级队列为空时，才发送低优先级的数据包。</li><li><strong>缺点：</strong> 可能导致低优先级流量“饥饿” (Starvation)，即永远得不到服务。</li></ul><h5 id="C-轮询-Round-Robin-RR"><strong>C. 轮询 (Round Robin - RR)</strong></h5><ul><li><strong>机制：</strong> 循环扫描各个类别的队列，如果队列非空，就发送一个数据包。</li><li><strong>特点：</strong> 提供了类之间的公平性，避免了饥饿问题。</li></ul><h5 id="D-加权公平队列-Weighted-Fair-Queuing-WFQ"><strong>D. 加权公平队列 (Weighted Fair Queuing - WFQ)</strong></h5><ul><li><strong>机制：</strong> 广义的轮询。每个类被分配一个<strong>权重 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">w_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>。</li><li><strong>规则：</strong> 在每个服务循环中，第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 类获得的服务量与其权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">w_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 成正比。</li><li><strong>优势：</strong> 既保证了每个类别的最小带宽保证，又允许在某类空闲时共享带宽。</li></ul><h4 id="3-监管机制-Policing-Mechanisms">3. 监管机制 (Policing Mechanisms)</h4><p>监管的目的是强制流量源遵守其声明的流量参数（SLA），防止恶意或错误的流量占用过多资源。</p><h5 id="三个常见的监管指标："><strong>三个常见的监管指标：</strong></h5><ol><li><strong>平均速率 (Average Rate)：</strong> 长期来看，每单位时间发送多少数据包。</li><li><strong>峰值速率 (Peak Rate)：</strong> 短期内的最高发送速率。</li><li><strong>突发大小 (Burst Size)：</strong> 允许连续发送的最大数据包数量（无需中间等待）。</li></ol><h5 id="核心实现：令牌桶-Token-Bucket"><strong>核心实现：令牌桶 (Token Bucket)</strong></h5><p>这是一种限制输入流量以满足特定突发大小和平均速率的机制。</p><ul><li><strong>参数：</strong><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span>：令牌生成速率 (tokens/sec)。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>：桶的容量 (bucket depth)，即最大令牌数。</li></ul></li><li><strong>工作原理：</strong><ul><li>令牌以速率 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span> 填入桶中。</li><li>桶满时，新令牌被丢弃（令牌数不超过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>）。</li><li>数据包要发送，必须从桶中消耗令牌。</li><li>如果桶中令牌不足，数据包必须等待或被丢弃/标记。</li></ul></li><li><strong>QoS 保证：</strong><ul><li>结合 <strong>令牌桶</strong> (限制流量) 和 <strong>WFQ</strong> (加权调度)，网络可以提供确定性的<strong>最大延迟上界</strong> (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub><mo>=</mo><mi>b</mi><mi mathvariant="normal">/</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">D_{max} = b/R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>)。</li></ul></li></ul><h4 id="4-区分服务架构-DiffServ-Architecture">4. 区分服务架构 (DiffServ Architecture)</h4><p>DiffServ 是一种通过在网络边缘进行复杂处理，而在网络核心保持简单的架构，旨在解决扩展性问题。</p><h5 id="架构组件："><strong>架构组件：</strong></h5><ol><li><p><strong>边缘路由器 (Edge Router)：</strong> <strong>复杂性所在</strong></p><ul><li><strong>分类 (Classification)：</strong> 根据源/目 IP、端口号等识别流量。</li><li><strong>标记 (Marking)：</strong> 将数据包标记为“配置内 (In-Profile)”或“配置外 (Out-Profile)”，通常修改 IP 头部的 ToS (Type of Service) 字段。</li><li><strong>监管 (Policing)：</strong> 使用令牌桶等机制限制流量速率。</li></ul></li><li><p><strong>核心路由器 (Core Router)：</strong> <strong>简单高效</strong></p><ul><li>不维护每条流的状态（Per-flow state）。</li><li>仅根据数据包的<strong>标记</strong>（类别），通过 PHB (Per-Hop Behavior) 进行相应的缓冲和调度处理。</li><li>例如：优先转发标记为“高优先级”的数据包。</li></ul></li></ol><h5 id="优势："><strong>优势：</strong></h5><ul><li><strong>可扩展性强 (Scalability)：</strong> 核心网络不需要知道具体的业务流，只处理有限的几个服务等级，因此可以支持庞大的流量。</li></ul><h3 id="7-6-提供-QoS-保证-Providing-QoS-Guarantees">7.6 提供 QoS 保证 (Providing QoS Guarantees)</h3><ul><li><strong>集成服务 (Integrated Services / IntServ):</strong><ul><li><strong>理念：</strong> 为每个应用会话预留端到端资源（带宽、缓冲）。</li><li><strong>呼叫接纳 (Call Admission):</strong> 网络根据资源情况决定是否接受新连接。</li><li><strong>缺点：</strong> 需要在路由器中维护每个流的状态，可扩展性差。</li></ul></li><li><strong>服务模型:</strong><ul><li><strong>保证服务 (Guaranteed Service):</strong> 提供确定的延迟上界。</li><li><strong>受控负载服务 (Controlled Load Service):</strong> 提供类似网络未加载时的服务质量。</li></ul></li></ul><h3 id="案例研究：无线-Mesh-网络传输视频-Wireless-Mesh-for-Video">案例研究：无线 Mesh 网络传输视频 (Wireless Mesh for Video)</h3><ul><li><strong>特点：</strong> 多跳、自组织、自愈合。</li><li><strong>优势：</strong> 高带宽（支持多路视频）、部署简单、覆盖范围广。</li><li><strong>技术：</strong><ul><li><strong>跨层设计 (Cross-layer design):</strong> 物理层、MAC 层、网络层、传输层协同工作。</li><li><strong>多优先级传输:</strong> 将视频帧分为不同优先级（I帧 &gt; P帧 &gt; B帧），映射到不同的传输队列（AC_VO, AC_VI 等）。</li><li><strong>动态数据映射:</strong> 根据网络状况动态调整数据包的映射策略。</li></ul></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-05-Multimedia/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-05-Multimedia/"/>
    <published>2026-01-14T19:20:00.000Z</published>
    <summary>* 冲突的本质： 互联网最初是为数据传输（如文件、邮件）设计的，提供的是“尽力而为 (Best-Effort)”的服务——不保证时间，但保证完整。然而，多媒体应用（音频/视频）的需求恰恰相反：它们对延迟和抖动极度敏感，但对少量丢包可以容忍。</summary>
    <title>Network - 05.Multimedia Networking</title>
    <updated>2026-07-01T11:38:22.795Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<h1>第6章：无线与移动网络 (Wireless and Mobile Networks)</h1><h2 id="6-1-引言-Introduction">6.1 引言 (Introduction)</h2><h3 id="背景">背景</h3><ul><li><strong>趋势：</strong> 无线（移动）电话用户数量已超过有线电话用户。</li><li><strong>设备：</strong> 笔记本电脑、掌上电脑、PDA、互联网手机等承诺随时随地的互联网接入。</li><li><strong>两大挑战：</strong><ol><li><strong>无线 (Wireless)：</strong> 通过无线链路进行的通信。</li><li><strong>移动性 (Mobility)：</strong> 处理移动用户改变网络接入点的情况。</li></ol></li></ul><h3 id="无线网络要素-Elements-of-a-wireless-network">无线网络要素 (Elements of a wireless network)</h3><ol><li><strong>无线主机 (Wireless hosts)：</strong><ul><li>终端设备（如笔记本、手机、IoT设备）。</li><li>运行应用程序。</li><li>可以是静止的或移动的（无线不等于移动）。</li></ul></li><li><strong>基站 (Base station)：</strong><ul><li>通常连接到有线网络。</li><li><strong>中继 (Relay)：</strong> 负责在其覆盖区域内的有线网络和无线主机之间发送数据包。</li><li>例如：蜂窝塔 (Cell towers)、802.11 接入点 (Access Points, AP)。</li></ul></li><li><strong>无线链路 (Wireless link)：</strong><ul><li>连接移动设备到基站，或作为骨干链路。</li><li>使用<strong>多路访问协议 (Multiple Access Protocol)</strong> 协调链路访问。</li><li>具有不同的数据传输速率和传输距离。</li></ul></li><li><strong>网络基础设施 (Network infrastructure)：</strong><ul><li><strong>基础设施模式 (Infrastructure mode)：</strong> 基站将移动设备连接到有线网络。涉及<strong>切换 (Handoff)</strong>（移动设备改变接入的基站）。</li><li><strong>自组网模式 (Ad hoc mode)：</strong> 无基站。节点只能向覆盖范围内的其他节点发送数据。节点自组织成网络并在彼此间路由。</li></ul></li></ol><hr><h2 id="6-2-无线链路与特性-Wireless-links-characteristics">6.2 无线链路与特性 (Wireless links, characteristics)</h2><h3 id="与有线链路的区别">与有线链路的区别</h3><ol><li><strong>信号强度衰减 (Decreased signal strength)：</strong> 无线电信号在穿过物质时会衰减（路径损耗 Path loss）。</li><li><strong>干扰 (Interference)：</strong> 标准化无线频率（如 2.4 GHz）被其他设备（如微波炉、电话、电机）共享，导致干扰。</li><li><strong>多径传播 (Multipath propagation)：</strong> 无线电信号经物体反射，导致信号在略微不同的时间到达目的地。</li></ol><h3 id="信噪比-SNR-与误码率-BER">信噪比 (SNR) 与误码率 (BER)</h3><ul><li><strong>SNR (Signal-to-Noise Ratio)：</strong> 信噪比。SNR 越大，越容易从噪声中提取信号。</li><li><strong>权衡 (Tradeoffs)：</strong><ul><li>增加功率 -&gt; 增加 SNR -&gt; 降低 BER。</li><li>给定 SNR，选择满足 BER 要求的物理层技术以获得最高吞吐量。</li><li><strong>动态适应：</strong> 随着移动导致 SNR 变化，动态调整物理层（调制技术、速率）。</li></ul></li></ul><h3 id="隐藏终端问题-Hidden-Terminal-Problem">隐藏终端问题 (Hidden Terminal Problem)</h3><ul><li>A 和 C 都在 B 的覆盖范围内，但 A 和 C 互相听不到对方。</li><li>A 和 C 可能同时向 B 发送数据，导致在 B 处发生<strong>干扰 (Interference)</strong>，但 A 和 C 却无法检测到冲突。</li></ul><h3 id="mark-CDMA-码分多址-mark"><mark>CDMA (码分多址) </mark></h3><p>CDMA 将“编码空间”作为一个全新的维度，不同于 TDMA（时间）和 FDMA（频率）。</p><ol><li><p><strong>核心概念：码片序列 (Chipping Sequence)</strong></p><ul><li>每个用户被分配一个<strong>唯一</strong>的“码”（Code）。</li><li>所有用户在<strong>同一时间</strong>使用<strong>同一频率</strong>进行传输。</li><li>依靠各自独特的码片序列来区分数据。</li></ul></li><li><p><strong>关键特性：正交性 (Orthogonality)</strong></p><ul><li>为了最小化干扰，分配给不同用户的码必须是<strong>正交</strong>的。</li><li><strong>定义：</strong> 两个不同码向量的<strong>内积 (Inner-product / Dot product)</strong> 为 0。</li><li>公式：如果用户 A 的码是向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>，用户 B 的码是向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>⋅</mo><mi>b</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">a \cdot b = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>。</li></ul></li><li><p><strong>编码与发送 (Encode)</strong></p><ul><li>发送的信号 = (原始数据位) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span> (码片序列)。</li><li>假设数据位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>。</li><li>用户 A 发送信号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Z</mi><mi>a</mi></msub><mo>=</mo><msub><mi>d</mi><mi>A</mi></msub><mo>⋅</mo><mi>a</mi></mrow><annotation encoding="application/x-tex">Z_a = d_{A} \cdot a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>。</li><li><strong>叠加 (Superposition)：</strong> 在无线信道中，多个用户的信号会线性叠加。总信号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mi>A</mi></msub><mo>⋅</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mi>B</mi></msub><mo>⋅</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S = (d_A \cdot a) + (d_B \cdot b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><p><strong>解码与抗干扰 (Decode)</strong></p><ul><li>接收方如何从叠加信号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 中提取用户 A 的数据？</li><li><strong>机制：</strong> 接收方使用用户 A 的码片序列 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 与接收到的总信号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 进行<strong>内积</strong>运算。</li><li><strong>数学推导：</strong><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>⋅</mo><mi>a</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mi>A</mi></msub><mo>⋅</mo><mi>a</mi><mo>+</mo><msub><mi>d</mi><mi>B</mi></msub><mo>⋅</mo><mi>b</mi><mo stretchy="false">)</mo><mo>⋅</mo><mi>a</mi></mrow><annotation encoding="application/x-tex">S \cdot a = (d_A \cdot a + d_B \cdot b) \cdot a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span></span></p>展开得到：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>=</mo><msub><mi>d</mi><mi>A</mi></msub><mo stretchy="false">(</mo><mi>a</mi><mo>⋅</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>d</mi><mi>B</mi></msub><mo stretchy="false">(</mo><mi>b</mi><mo>⋅</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">= d_A(a \cdot a) + d_B(b \cdot a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span></li><li><strong>消除干扰：</strong> 由于正交性，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>⋅</mo><mi>a</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">b \cdot a = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，因此用户 B 的信号项消失。</li><li><strong>结果：</strong> 剩下 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>A</mi></msub><mo stretchy="false">(</mo><mi>a</mi><mo>⋅</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_A(a \cdot a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span>。若码长为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>⋅</mo><mi>a</mi><mo>=</mo><mi>M</mi></mrow><annotation encoding="application/x-tex">a \cdot a = M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>），除以 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 即可完美还原原始数据 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">d_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li></ul></li><li><p><strong>香农定理 (Shannon Theory)</strong></p><ul><li>信道容量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><mi>W</mi><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>P</mi><mi mathvariant="normal">/</mi><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">C = W \log(1 + P/N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>。CDMA 利用宽带（W）来提升容量。</li></ul></li></ol><div class="note note-info">            <p><strong>1. CDMA 的特殊约束</strong><br>在通信工程中，为了便于数字电路实现，码向量的分量通常被限制为 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">1</span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span></strong>（而非任意实数）。</p><p><strong>2. 向量模长</strong><br>在这种限制下（分量仅为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>±</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\pm 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">±</span><span class="mord">1</span></span></span></span>），一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 维向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>c</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>c</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>c</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">v=(c_1, c_2, ..., c_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 的模长平方恒等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>。</p><ul><li><strong>推导</strong>：因为对于任意 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>，都有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>c</mi><mi>i</mi><mn>2</mn></msubsup><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">c_i^2 = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0728em;vertical-align:-0.2587em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，故 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msubsup><mi>c</mi><mi>i</mi><mn>2</mn></msubsup><mo>=</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">\sum_{i=1}^{n} c_i^2 = n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1138em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8043em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>。</li><li><strong>结论</strong>：即模长为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msqrt><mi>n</mi></msqrt></mrow><annotation encoding="application/x-tex">\sqrt{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.2397em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8003em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathnormal">n</span></span></span><span style="top:-2.7603em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2397em;"><span></span></span></span></span></span></span></span></span>。</li></ul><p><strong>3. Hadamard 矩阵</strong><br>这种由 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span> 组成且行向量相互正交的矩阵被称为 <strong>Hadamard 矩阵</strong>。</p><ul><li><strong>存在条件</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 必须是 1、2 或者是 4 的倍数。</li></ul>          </div><hr><h2 id="6-3-IEEE-802-11-无线局域网-“Wi-Fi”">6.3 IEEE 802.11 无线局域网 (“Wi-Fi”)</h2><h3 id="802-11-标准演进">802.11 标准演进</h3><ul><li><strong>802.11b:</strong> 2.4-5 GHz, 最高 11 Mbps, DSSS (直接序列扩频)。</li><li><strong>802.11a:</strong> 5-6 GHz, 最高 54 Mbps。</li><li><strong>802.11g:</strong> 2.4-5 GHz, 最高 54 Mbps。</li><li><strong>802.11n:</strong> 2.4-5 GHz, 最高 450 Mbps, 多天线 (MIMO)。</li><li><strong>802.11ac:</strong> 5 GHz, 最高 1.3 Gbps (Wave 1) / 3.4 Gbps (Wave 2)。</li><li><strong>802.11ax (Wi-Fi 6):</strong> 更高的数据率 (1024 QAM)、更低延迟、OFDMA、更好的 IoT 覆盖。</li><li><strong>共性：</strong> 都使用 <strong>CSMA/CA</strong> 进行多路访问；都有基站（基础设施）和 Ad-hoc 模式。</li></ul><h3 id="架构-Architecture">架构 (Architecture)</h3><ul><li><strong>基本服务集 (BSS, Basic Service Set)：</strong> 包含无线主机和基站（接入点 AP）。</li><li><strong>信道 (Channels)：</strong> 频谱被划分为多个信道。AP 管理员选择频率。相邻 AP 可能产生干扰。</li><li><strong>关联 (Association)：</strong><ul><li><strong>被动扫描 (Passive Scanning)：</strong> 主机监听 AP 发送的<strong>信标帧 (Beacon frames)</strong>。</li><li><strong>主动扫描 (Active Scanning)：</strong> 主机广播<strong>探测请求 (Probe Request)</strong>，AP 回复探测响应。</li><li>关联后通常运行 DHCP 获取 IP 地址。</li></ul></li></ul><h3 id="AP-与-SSID">AP 与 SSID</h3><ol><li><p><strong>接入点 (AP - Access Point)</strong></p><ul><li><strong>定义：</strong> 在基础设施模式下，AP 是无线网络中的<strong>基站 (Base Station)</strong> 。</li><li><strong>功能：</strong> 它是无线主机与有线网络之间的桥梁。所有的无线主机都必须先与 AP <strong>关联 (Associate)</strong> 才能进行通信。</li><li><strong>角色：</strong> 一个基本服务集 (BSS) 通常包含一个 AP 和若干无线主机。</li></ul></li><li><p><strong>服务集标识符 (SSID - Service Set Identifier)</strong></p><ul><li><strong>定义：</strong> 俗称“网络名称”（例如 “Tsinghua-Secure” 或 “Home-WiFi”）。它是 AP 分配给其 BSS（或扩展服务集）的一串字符标识。</li><li><strong>作用：</strong> 帮助主机识别和区分不同的无线网络。</li><li><strong>工作机制：</strong> AP 会定期广播<strong>信标帧 (Beacon frames)</strong>，其中包含了 AP 的 <strong>SSID</strong> 和 MAC 地址 。</li><li><strong>扫描：</strong> 当你的设备“搜索 Wi-Fi”时，实际上是在扫描并列出监听到的信标帧中的 SSID，供你选择关联。</li></ul></li></ol><h3 id="mark-MAC-协议：CSMA-CA-载波侦听多路访问-冲突避免-mark"><mark>MAC 协议：CSMA/CA (载波侦听多路访问/冲突避免)</mark></h3><ul><li><strong>为什么不用 CSMA/CD (冲突检测)？</strong><ul><li>无线信号衰减导致发送端很难在传输时检测到冲突（信号太弱）。发送方自己的发送信号强度远远大于它能接收到的来自远处的信号强度。</li><li>存在隐藏终端问题，无法检测所有冲突。A 和 C 都在 B 的覆盖范围内，但 A 和 C 互不可见（互为隐藏终端）。</li></ul></li><li><strong>CSMA/CA 机制：</strong><ol><li><strong>发送方：</strong><ul><li>如果侦听到信道空闲（持续 DIFS <em>Distributed Inter-Frame Space</em> 时间），则发送<strong>整个帧</strong>。</li><li>如果信道忙，则开始<strong>随机退避 (Random backoff)</strong>。信道空闲时倒计时，忙时暂停。计时器到期后发送。如果没有收到 ACK，增加退避区间并重试。</li></ul></li><li><strong>接收方：</strong><ul><li>如果正确接收帧，在 SIFS <em>Short Inter-Frame Space</em> 时间后返回 <strong>ACK</strong>。</li><li><strong>为什么必须有 ACK？</strong> 因为发送方无法自己检测冲突（如上所述），所以“没有收到 ACK”是发送方判断发生冲突或丢包的唯一依据。</li></ul></li></ol></li><li><strong>冲突避免 (RTS-CTS 交换)：</strong><ul><li><strong>思想：</strong> <strong>小包换大包</strong> ：长的数据帧一旦发生冲突，会浪费大量的信道时间。RTS/CTS 机制允许发送方先用很小的控制包“预约”信道。如果小包冲突了，损失很小；如果预约成功，大包就不会冲突 。</li><li><strong>RTS (Request-to-Send)：</strong> 发送方先发送小的 RTS 包给基站。</li><li><strong>CTS (Clear-to-Send)：</strong> 基站广播 CTS 响应。所有节点（包括隐藏终端）都能听到 CTS。</li><li><strong>结果：</strong> 发送方发送数据，其他节点推迟发送。</li></ul></li></ul><h3 id="802-11-帧结构">802.11 帧结构</h3><ul><li><strong>地址字段：</strong><ul><li><strong>Address 1:</strong> 接收端的 MAC 地址。</li><li><strong>Address 2:</strong> 发送端的 MAC 地址。</li><li><strong>Address 3:</strong> 连接 AP 的路由器接口的 MAC 地址。</li><li><strong>Address 4:</strong> 仅用于 Ad hoc 模式。</li></ul></li><li><strong>其他字段：</strong> 帧控制、持续时间 (Duration, 用于预约时间)、序列号控制、CRC。</li></ul><p>交换机是透明的，没有自己的MAC地址；但是AP不再是一个透明的设备（有自己的MAC地址）</p><h3 id="高级功能">高级功能</h3><ul><li><strong>速率自适应 (Rate Adaptation)：</strong> 根据移动性和 SNR 变化，动态改变传输速率（调制技术）。SNR 降低时降低速率以维持低误码率。</li><li><strong>电源管理 (Power Management)：</strong> 节点告知 AP “我要睡觉了”，AP 缓存该节点的数据。节点在信标帧之前唤醒查看是否有数据等待。</li></ul><hr><h2 id="6-4-蜂窝互联网接入-Cellular-Internet-Access">6.4 蜂窝互联网接入 (Cellular Internet Access)</h2><h3 id="蜂窝网络架构">蜂窝网络架构</h3><ul><li><strong>小区 (Cell)：</strong> 覆盖地理区域。</li><li><strong>基站 (Base Station, BS)：</strong> 类似于 802.11 AP，负责空中接口 (Air-interface)。</li><li><strong>MSC (Mobile Switching Center)：</strong> 移动交换中心。连接小区到广域网，管理呼叫建立和移动性。</li></ul><h3 id="第一跳：多址接入技术">第一跳：多址接入技术</h3><ul><li><strong>FDMA/TDMA：</strong> 分割频率和时隙 (如 GSM)。</li><li><strong>CDMA：</strong> 码分多址 (如 IS-95, CDMA-2000)。</li></ul><h3 id="标准演进">标准演进</h3><ul><li><strong>2G (语音)：</strong> GSM (全球最广泛), IS-136, IS-95。</li><li><strong>2.5G (语音+数据)：</strong> GPRS (GSM 演进), EDGE。</li><li><strong>3G (语音+数据)：</strong> UMTS (HSDPA/HSUPA), CDMA-2000 (EVDO)。</li><li><strong>4G (LTE)：</strong> 高速率，基于 IP。</li><li><strong>5G：</strong><ul><li><strong>特点：</strong> 高带宽 (20 Gbps 峰值)、大连接 (100万/km²)、低时延 (1ms)。</li><li><strong>关键技术：</strong> 大规模天线阵 (MIMO)、超密集组网、全频谱接入。</li><li><strong>挑战：</strong> 数据安全、工业实时通信的高可靠性需求。</li></ul></li></ul><hr><h2 id="6-5-个人局域网-PAN-与-物联网-IoT">6.5 个人局域网 (PAN) 与 物联网 (IoT)</h2><h3 id="IEEE-802-15-Bluetooth-ZigBee">IEEE 802.15 (Bluetooth / ZigBee)</h3><ul><li><strong>蓝牙 (Bluetooth)：</strong><ul><li><strong>范围：</strong> &lt; 10米，替代线缆（鼠标、耳机）。</li><li><strong>网络结构：</strong> Ad hoc，主/从模式 (Master/Slaves)。</li><li><strong>演进：</strong> BLE (低功耗), 蓝牙 5.0 (速度、范围、广播能力提升), Mesh 拓扑。</li></ul></li><li><strong>ZigBee (802.15.4)：</strong> 低功耗、低速率、用于控制网络。</li></ul><h3 id="低功耗技术对比-IoT">低功耗技术对比 (IoT)</h3><ul><li><strong>Z-Wave, ZigBee, BLE, 802.11ah (HaLow)</strong> 等技术在数据率、电池寿命、传输距离和成本上各有优劣。</li><li>IoT 使得联网设备数量激增（预计 2020 年达到 500 亿）。</li></ul><h3 id="梅特卡夫定律-Metcalfe’s-Law">梅特卡夫定律 (Metcalfe’s Law)</h3><ul><li><strong>定义：</strong> 网络的价值与用户数量的平方成正比 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo>=</mo><mi>K</mi><mo>×</mo><msup><mi>N</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">V = K \times N^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>)。</li><li><strong>验证：</strong> Facebook 和腾讯的数据验证了该定律在社交网络收益上的适用性。</li></ul><hr><h2 id="总结-Summary">总结 (Summary)</h2><ol><li><strong>无线链路特性：</strong> 信号衰减、多径传播、干扰、隐藏终端。</li><li><strong>CDMA：</strong> 通过<strong>正交码片序列</strong>实现多用户共享信道，利用内积运算消除干扰。</li><li><strong>IEEE 802.11 (Wi-Fi)：</strong> CSMA/CA 协议，RTS/CTS 避免冲突，帧结构，被动/主动扫描。</li><li><strong>蜂窝网络：</strong> 架构 (BS, MSC)，多址接入 (TDMA/FDMA/CDMA)，从 2G 到 5G 的演进。</li><li><strong>IoT 与 PAN：</strong> 低功耗、短距离通信技术的发展。</li></ol>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-04-Datalink-Layer-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-04-Datalink-Layer-02/"/>
    <published>2026-01-14T19:15:00.000Z</published>
    <summary>第6章：无线与移动网络 (Wireless and Mobile Networks)</summary>
    <title>Network - 04.Data Link Layer-02</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success **主要任务**">            <p>这一层负责在<strong>物理上相邻</strong>的两个节点之间传输数据。</p><ul><li><strong>主要任务：</strong> 将数据报（Datagram）通过<strong>单个链路</strong>（一“跳”）从一个节点（如主机）可靠地传输到下一个节点（如路由器） 。</li><li><strong>具体功能：</strong></li><li><strong>成帧 (Framing)：</strong> 将网络层的数据报封装成<strong>帧 (frame)</strong>，并添加链路层首部和尾部 。</li><li><strong>链路层寻址 (Addressing)：</strong> 使用 MAC 地址（物理地址）来标识本地网络上的源和目标接口 。</li><li><strong>多路访问控制 (Multiple Access Control)：</strong> 在共享介质（如 WiFi 或老式以太网 ）上，决定哪个节点可以发送数据，以避免<strong>碰撞 (collision)</strong> 。</li><li><strong>差错检测 (Error Detection)：</strong> 在帧中添加比特（如 CRC 或奇偶校验 ），使接收方能检测到传输错误 。如果检测到错误，该帧通常会被丢弃 。</li><li><strong>（可选）差错纠正 (Error Correction)：</strong> 接收方不仅能检测错误，还能纠正错误 。</li><li><strong>（可选）流量控制：</strong> 协调相邻发送和接收节点之间的步调</li></ul>          </div><h2 id="第-5-章：数据链路层-Chapter-5-The-Data-Link-Layer">第 5 章：数据链路层 (Chapter 5: The Data Link Layer)</h2><h3 id="5-1-简介与服务-Introduction-and-Services">5.1 简介与服务 (Introduction and Services)</h3><h4 id="1-目标">1. 目标</h4><ul><li>理解数据链路层 (data link layer) 服务的原理：<ul><li><strong>差错检测与纠正 (Error detection, correction)</strong></li><li><strong>共享广播信道 (Sharing a broadcast channel):</strong> 多路访问 (multiple access)</li><li><strong>链路层寻址 (Link layer addressing)</strong></li></ul></li><li>(可靠数据传输和流控制已在第 3 章中讨论)</li></ul><h4 id="2-链路层术语">2. 链路层术语</h4><ul><li><strong>节点 (Nodes):</strong> 主机 (hosts) 和路由器 (routers)。</li><li><strong>链路 (Links):</strong> 连接相邻节点的通信信道（如：有线链路, 无线链路, 局域网 LANs）。</li><li><strong>帧 (Frame):</strong> 第 2 层的分组 (packet)，它封装 (encapsulates) 了网络层的<strong>数据报 (datagram)</strong>。</li><li><strong>核心职责：</strong> 负责将数据报通过<strong>一条链路</strong>从一个节点传输到<strong>相邻</strong>的节点。</li></ul><h4 id="3-链路层上下文">3. 链路层上下文</h4><ul><li>一个数据报在从源到目标的路径上，可能会经过<strong>不同</strong>的链路层协议（例如，第一条链路是Ethernet，中间是 Frame Relay，最后是 WiFi）。</li><li>每一跳的链路协议可能提供不同的服务。</li></ul><blockquote><p><strong>交通类比 (Transportation Analogy):</strong></p><ul><li><strong>旅客 (Tourist)</strong> = <strong>数据报 (Datagram)</strong></li><li><strong>运输段 (Transport segment)</strong> (如 轿车, 飞机, 火车) = <strong>通信链路 (Link)</strong></li><li><strong>运输方式 (Transportation mode)</strong> (如 轿车服务, 航班, 火车服务) = <strong>链路层协议 (Link layer protocol)</strong></li><li><strong>旅行社 (Travel agent)</strong> = <strong>路由算法 (Routing algorithm)</strong></li></ul></blockquote><h4 id="4-链路层服务-Link-Layer-Services">4. 链路层服务 (Link Layer Services)</h4><ul><li><strong>成帧 (Framing):</strong><ul><li>将数据报封装成帧，添加<strong>首部 (header)</strong> 和<strong>尾部 (trailer)</strong>。</li></ul></li><li><strong>链路访问 (Link access):</strong><ul><li>如果是共享介质，需要协议来协调信道访问。</li><li>帧头部使用 <strong>MAC 地址 (MAC addresses)</strong> 来标识源和目标，这<strong>不同于 IP 地址</strong>。</li></ul></li><li><strong>可靠交付 (Reliable delivery):</strong><ul><li>在<strong>相邻节点</strong>之间提供可靠交付。</li><li>这在低比特错误率的链路（如光纤）上很少使用，但在高错误率的无线链路 (wireless links) 上很重要。</li></ul></li><li><strong>流量控制 (Flow control):</strong><ul><li>协调<strong>相邻</strong>的发送和接收节点之间的步调。</li></ul></li><li><strong>差错检测 (Error detection):</strong><ul><li>由信号衰减和噪声引起。</li><li>接收方检测到错误，可以通知发送方重传或直接丢弃该帧。</li></ul></li><li><strong>差错纠正 (Error correction):</strong><ul><li>接收方识别并纠正比特错误，而无需重传。</li></ul></li><li><strong>半/全双工 (Half/Full-duplex):</strong><ul><li><strong>半双工 (Half-duplex):</strong> 链路两端都可传输，但不能同时进行。</li><li><strong>全双工 (Full-duplex):</strong> 链路两端可同时收发。</li></ul></li></ul><h4 id="5-链路层在何处实现？">5. 链路层在何处实现？</h4><ul><li>在<strong>每个主机和路由器</strong>中实现。</li><li>链路层实现在 <strong>“适配器” (adaptor)</strong> 中，也称为<strong>网络接口卡 (Network Interface Card, NIC)</strong>（例如：以太网卡, 802.11 网卡）。</li><li>NIC 实现了链路层和物理层的功能，是硬件、软件和固件 (firmware) 的结合体。</li><li><strong>发送端适配器：</strong> 将数据报封装成帧，添加差错检测位等。</li><li><strong>接收端适配器：</strong> 检查错误，提取数据报，并将其传递给上层（网络层）。</li></ul><hr><h3 id="5-2-差错检测与纠正-Error-Detection-and-Correction">5.2 差错检测与纠正 (Error Detection and Correction)</h3><ul><li><strong>EDC (Error Detection and Correction bits):</strong> 用于差错校验的冗余位。</li><li><strong>D:</strong> 受保护的数据。</li></ul><h4 id="1-奇偶校验-Parity-Checking">1. 奇偶校验 (Parity Checking)</h4><ul><li><strong>单比特奇偶校验 (Single Bit Parity):</strong><ul><li>添加一个校验位，使数据中 “1” 的总数（数据+校验位）为奇数或偶数。</li><li>只能检测<strong>单个比特</strong>的错误。</li></ul></li><li><strong>二维奇偶校验 (Two Dimensional Bit Parity):</strong><ul><li>将数据排成二维矩阵，对每行和每列都计算奇偶校验位。</li><li>不仅可以检测错误，还可以<strong>定位并纠正单个比特</strong>的错误。</li></ul></li></ul><h4 id="2-互联网校验和-Internet-Checksum-回顾">2. 互联网校验和 (Internet Checksum) (回顾)</h4><ul><li>将数据视为 16 位整数的序列。</li><li><strong>发送方：</strong> 计算所有 16 位整数的<strong>1 的补码和 (1’s complement sum)</strong>，并将结果的<strong>反码</strong>放入校验和字段。</li><li><strong>接收方：</strong> 对收到的所有数据（包括校验和字段）计算 1 的补码和，如果结果全为 1 (或 0，取决于实现)，则未检测到错误。</li></ul><h4 id="3-循环冗余校验-Cyclic-Redundancy-Check-CRC">3. 循环冗余校验 (Cyclic Redundancy Check - CRC)</h4><ul><li>一种更强大的差错检测技术，广泛用于 Ethernet, WiFi 等。</li><li><strong>原理：</strong><ol><li>发送方和接收方协商一个 <code>r+1</code> 位的<strong>生成多项式 (Generator)</strong>, <code>G</code>。</li><li>发送方希望发送 <code>d</code> 位的数据 <code>D</code>。它会计算 <code>r</code> 位的 CRC 校验码 <code>R</code>。</li><li>计算方法是：<code>R</code> 等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>D</mi><mo>⋅</mo><msup><mn>2</mn><mi>r</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(D \cdot 2^r)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 除以 <code>G</code> 所得到的<strong>余数</strong> (使用模 2 运算)。</li><li>使得 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>D</mi><mo>⋅</mo><msup><mn>2</mn><mi>r</mi></msup><mo stretchy="false">)</mo><mtext> XOR </mtext><mi>R</mi></mrow><annotation encoding="application/x-tex">(D \cdot 2^r) \text{ XOR } R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord text"><span class="mord"> XOR </span></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>（即 &lt;D, R&gt;）能被 <code>G</code> 整除。</li><li><strong>接收方：</strong> 收到数据 <code>&lt;D', R'&gt;</code> 后，用 <code>G</code> 去除它。</li><li>如果<strong>余数非零</strong>，则检测到错误；否则，认为数据正确。</li></ol></li><li><strong>能力：</strong> 可以检测所有小于 <code>r+1</code> 位的突发错误。</li></ul><hr><h3 id="5-3-多路访问协议-Multiple-Access-Protocols">5.3 多路访问协议 (Multiple Access Protocols)</h3><h4 id="1-背景">1. 背景</h4><ul><li><strong>链路类型：</strong><ul><li><strong>点对点 (Point-to-point):</strong> 如 PPP 拨号, 交换机到主机的连接。</li><li><strong>广播 (Broadcast):</strong> <strong>共享</strong>有线或无线介质，如老式以太网、WiFi。</li></ul></li><li><strong>多路访问问题：</strong><ul><li>在广播信道上，如果两个或更多节点同时传输，会发生<strong>干扰 (interference)</strong>，导致<strong>碰撞 (collision)</strong>。</li><li><strong>多路访问协议 (Multiple Access Protocol)</strong> 是一种分布式算法，用于决定节点何时可以传输。</li></ul></li></ul><h4 id="2-MAC-协议分类">2. MAC 协议分类</h4><ol><li><strong>信道划分 (Channel Partitioning)</strong></li><li><strong>随机接入 (Random Access)</strong></li><li><strong>轮流 (Taking Turns)</strong></li></ol><h4 id="3-信道划分-Channel-Partitioning">3. 信道划分 (Channel Partitioning)</h4><ul><li>将信道资源（时间、频率）划分为小片，为节点<strong>独占式</strong>分配。</li><li><strong>TDMA (Time Division Multiple Access - 时分多路复用):</strong><ul><li>将时间划分为“轮 (rounds)”，每轮包含 N 个<strong>时隙 (slots)</strong>。</li><li>每个节点在每轮中被分配一个固定的时隙。</li><li><strong>缺点：</strong> 未使用的时隙会<strong>被浪费 (go idle)</strong>。</li></ul></li><li><strong>FDMA (Frequency Division Multiple Access - 频分多路复用):</strong><ul><li>将信道频谱划分为多个<strong>频带 (frequency bands)</strong>。</li><li>每个节点被分配一个固定的频带。</li><li><strong>缺点：</strong> 未使用的频带会被浪费。</li></ul></li></ul><h4 id="4-随机接入协议-Random-Access-Protocols">4. 随机接入协议 (Random Access Protocols)</h4><p>随机接入协议<strong>不预先划分信道</strong>（如 TDMA/FDMA），所有节点动态竞争共享信道。</p><ul><li><strong>核心特点：</strong><ol><li><strong>无划分：</strong> 任何节点都可以随时尝试发送数据。</li><li><strong>允许碰撞：</strong> 两个或多个节点同时传输会导致干扰（碰撞），数据丢失。</li><li><strong>从碰撞中恢复：</strong> 协议必须包含检测碰撞和重传的机制。</li></ol></li></ul><h5 id="1）-ALOHA-协议">1） ALOHA 协议</h5><p>ALOHA 是最早的随机接入协议，虽然简单但效率较低。</p><ul><li><p><strong>纯 ALOHA (Pure ALOHA)</strong></p><ul><li><strong>机制：</strong> 非常简单，“想发就发”。一旦节点有帧要发送，立即传输。</li><li><strong>碰撞处理：</strong> 发送后监听信道（依靠 ACK），若发生碰撞，等待一个随机时间后重传。</li><li><strong>效率分析：</strong><ul><li><strong>易受损时间 (Vulnerable period)：</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>T</mi></mrow><annotation encoding="application/x-tex">2T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 为传输一帧所需时间）。</li><li>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>t</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">t_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7651em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 时刻发送，那么在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msub><mi>t</mi><mn>0</mn></msub><mo>−</mo><mi>T</mi><mo separator="true">,</mo><msub><mi>t</mi><mn>0</mn></msub><mo>+</mo><mi>T</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[t_0-T, t_0+T]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mclose">]</span></span></span></span> 这个区间内有任何其他节点发送，都会导致碰撞。</li><li><strong>最大效率：</strong> 当网络负载 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo>=</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">G=0.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.5</span></span></span></span> 时，信道利用率达到最大值 <strong>18.4% (1/2e)</strong>。</li><li><em>评价：</em> 就像一群人在黑暗的房间里，想说话就直接喊，大部分时间都在互相打断。</li></ul></li></ul></li><li><p><strong>分槽 ALOHA (Slotted ALOHA)</strong></p><ul><li><strong>改进：</strong> 为了减少易受损时间，对时间进行<strong>分槽 (Slotting)</strong>。</li><li><strong>规则：</strong><ol><li>时间被划分为长度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 的时隙（Slot）。</li><li>节点只能在<strong>时隙的起点</strong>开始发送。</li><li>需要所有节点<strong>时钟同步</strong>。</li></ol></li><li><strong>碰撞处理：</strong> 如果发生碰撞，节点在随后的每个时隙以概率 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 重传，直到成功。</li><li><strong>效率分析：</strong><ul><li><strong>易受损时间：</strong> 缩短为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>。只有在同一个时隙起跑线同时出发才会撞。</li><li><strong>最大效率：</strong> 当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">G=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 时，最大利用率为 <strong>36.8% (1/e)</strong>。</li></ul></li><li><strong>优缺点：</strong><ul><li><em>优点：</em> 效率比纯 ALOHA 翻倍，单个节点活跃时可利用全部带宽。</li><li><em>缺点：</em> 需要同步；碰撞仍会浪费时隙；空闲时隙导致浪费。</li></ul></li></ul></li></ul><h5 id="2）CSMA-载波侦听多路访问">2）CSMA (载波侦听多路访问)</h5><p>为了避免 ALOHA 那种“鲁莽”的发送方式，引入了侦听机制。</p><ul><li><strong>核心思想：</strong> <strong>“先听后说” (Listen before Transmit)</strong>。<ul><li><strong>载波侦听 (Carrier Sense)：</strong> 发送前先检测信道上是否有能量（是否有别人在说话）。</li></ul></li><li><strong>工作流程：</strong><ol><li>如果信道<strong>空闲 (Idle)</strong>：发送帧。</li><li>如果信道<strong>忙 (Busy)</strong>：推迟发送 (Defer)，直到信道变为空闲。</li></ol></li><li><strong>为什么还会发生碰撞？</strong><ul><li><strong>传播延迟 (Propagation Delay)</strong> 是罪魁祸首。</li><li><em>场景：</em> 节点 A 开始发送，信号在介质中传播需要时间。在信号到达节点 B 之前，B 检测信道也是“空闲”的，于是 B 也开始发送。两股信号最终在链路中间相遇，发生碰撞。</li><li><strong>结论：</strong> 传播延迟越大（距离越远），CSMA 的性能越差。</li></ul></li></ul><h5 id="3）-CSMA-CD-带碰撞检测的-CSMA">3） CSMA/CD (带碰撞检测的 CSMA)</h5><p>CSMA 虽然减少了碰撞概率，但一旦碰撞，节点会把整个没用的帧发完，浪费带宽。CSMA/CD 解决了这个问题。</p><ul><li><strong>核心思想：</strong> <strong>“边说边听” (Listen while Transmit)</strong>。</li><li><strong>工作机制：</strong><ol><li><strong>侦听：</strong> 像 CSMA 一样，空闲则发送。</li><li><strong>发送并检测：</strong> 在发送数据的同时，对比接收到的信号电压与自己发送的是否一致。</li><li><strong>中断传输 (Abort)：</strong> 一旦检测到冲突，<strong>立即停止</strong>发送数据帧。</li><li><strong>发送堵塞信号 (Jam Signal)：</strong> 发送一个短的干扰信号（通常 32 或 48 比特），确保全网所有节点（包括离得远的）都能明确知道发生了碰撞。</li><li><strong>指数回退 (Binary Exponential Backoff)：</strong><ul><li>碰撞 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 次后，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{0, 1, 2, ..., 2^n-1\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span> 中随机选一个数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>。</li><li>等待 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>×</mo><mn>512</mn></mrow><annotation encoding="application/x-tex">K \times 512</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">512</span></span></span></span> 比特时间后重试。</li><li><em>目的：</em> 随着拥塞加剧，自动延长等待时间，降低再次碰撞概率。</li></ul></li></ol></li><li><strong>状态概括：</strong> 传输期、碰撞期、空闲期。</li><li><strong>应用场景：</strong><ul><li>是 <strong>有线以太网 (Ethernet, IEEE 802.3)</strong> 的基础。</li><li><em>注意：</em> <strong>无线网络 (WiFi)</strong> 无法使用 CSMA/CD，因为无线发送信号强度远大于接收信号，本地会“震耳欲聋”听不到对方的干扰（隐蔽站问题），所以 WiFi 使用 <strong>CSMA/CA (碰撞避免)</strong>。</li></ul></li></ul><h5 id="4-协议对比总结">4. 协议对比总结</h5><table><thead><tr><th style="text-align:left">协议</th><th style="text-align:left">机制口诀</th><th style="text-align:left">碰撞后处理</th><th style="text-align:left">最大效率</th><th style="text-align:left">适用场景</th></tr></thead><tbody><tr><td style="text-align:left"><strong>纯 ALOHA</strong></td><td style="text-align:left">想发就发</td><td style="text-align:left">随机重传</td><td style="text-align:left">18%</td><td style="text-align:left">极低负载</td></tr><tr><td style="text-align:left"><strong>分槽 ALOHA</strong></td><td style="text-align:left">到点再发</td><td style="text-align:left">概率重传</td><td style="text-align:left">37%</td><td style="text-align:left">需要同步</td></tr><tr><td style="text-align:left"><strong>CSMA</strong></td><td style="text-align:left">先听后说</td><td style="text-align:left">发完再重传</td><td style="text-align:left">高</td><td style="text-align:left">传播延迟小</td></tr><tr><td style="text-align:left"><strong>CSMA/CD</strong></td><td style="text-align:left">边听边说</td><td style="text-align:left">立即停止</td><td style="text-align:left">很高</td><td style="text-align:left"><strong>有线局域网</strong></td></tr></tbody></table><h4 id="5-轮流协议-Taking-Turns">5. 轮流协议 (Taking Turns)</h4><p><strong>设计动机：</strong><br>随机接入协议（如 CSMA/CD）在低负载时效率很高（延迟低），但在高负载下会因为频繁碰撞导致吞吐量急剧下降；而信道划分协议（如 TDMA）在高负载时公平且无冲突，但在低负载时会因为分配给不活跃节点的时隙被浪费而导致效率低下。<br><strong>轮流协议</strong>试图“取长补短”，结合两者的优点：<strong>既要有随机接入的灵活性，又要有信道划分的无冲突保障。</strong></p><h5 id="1）轮询协议-Polling">1）轮询协议 (Polling)</h5><p>这是一种集中式的控制策略，类似于课堂上老师点名提问。</p><ul><li><strong>工作机制：</strong><ul><li>网络中指定一个<strong>主节点 (Master Node)</strong>。</li><li>主节点以循环的方式“邀请”每一个<strong>从节点 (Slave Nodes)</strong> 发送数据。</li><li><em>流程：</em> 主节点发送报文给节点 A：“你有数据吗？如果有，你可以发 x 帧。” -&gt; A 发送数据（或回答“没有”） -&gt; 主节点询问节点 B -&gt; …</li></ul></li><li><strong>优点：</strong><ul><li><strong>消除冲突：</strong> 因为只有被点名的节点才能发送，所以不会发生碰撞。</li><li><strong>消除空闲时隙：</strong> 如果一个节点没有数据，主节点会立刻询问下一个，不会像 TDMA 那样死板地等待。</li></ul></li><li><strong>缺点：</strong><ul><li><strong>轮询开销 (Polling Overhead)：</strong> 主节点发出的“询问/邀请”报文本身也占用带宽。如果节点数据很少，大部分带宽可能都浪费在询问上了。</li><li><strong>等待延迟 (Latency)：</strong> 即使只有一个节点想发送数据，它也必须等待主节点完成一轮询问点到它名字时才能发送。</li><li><strong>单点故障 (Single Point of Failure)：</strong> 最致命的问题。如果<strong>主节点宕机</strong>，整个信道将瘫痪，所有从节点都无法通信。</li></ul></li></ul><h5 id="2）令牌传递协议-Token-Passing">2）令牌传递协议 (Token Passing)</h5><p>这是一种分布式的轮流策略，类似于“击鼓传花”或“传话筒”。</p><ul><li><strong>工作机制：</strong><ul><li>没有主节点，网络通常组织成环形拓扑（逻辑上或物理上）。</li><li>一个被称为 <strong>令牌 (Token)</strong> 的特殊小帧在节点之间按固定顺序传递。</li><li><strong>规则：</strong><ol><li>当节点收到令牌时，如果没有数据要发，就立即把令牌传给下一个节点。</li><li>如果有数据要发，它就持有令牌，发送最大数量的数据帧，发送完毕后再把令牌传给下家。</li></ol></li></ul></li><li><strong>优点：</strong><ul><li><strong>分散控制：</strong> 不需要主节点，相对公平。</li><li><strong>高负载效率高：</strong> 每个节点都有机会发送，且没有碰撞。</li></ul></li><li><strong>缺点：</strong><ul><li><strong>令牌开销：</strong> 传递令牌本身需要时间。</li><li><strong>延迟：</strong> 节点必须等待令牌转一圈回到自己手中才能发送。</li><li><strong>令牌丢失/节点故障：</strong><ul><li>如果持有令牌的节点突然<strong>死机</strong>，令牌就不见了，整个网络陷入死寂。</li><li>如果令牌在传输中因位错而<strong>丢失</strong>，网络也会瘫痪。</li><li><em>解决：</em> 需要复杂的恢复机制来检测令牌丢失并重新生成令牌。</li></ul></li></ul></li></ul><hr><h3 id="5-4-链路层寻址-Link-Layer-Addressing">5.4 链路层寻址 (Link-Layer Addressing)</h3><h4 id="1-MAC-地址-MAC-Address">1. MAC 地址 (MAC Address)</h4><ul><li><strong>功能：</strong> 用于在<strong>同一物理网络 (LAN)</strong> 上，将帧从一个接口发送到另一个接口。</li><li><strong>格式：</strong> 48 位 (6 字节)，通常用十六进制表示 (如 <code>1A-2F-BB-76-09-AD</code>)。</li><li><strong>唯一性：</strong> 地址被 <strong>“烧录” (burned in)</strong> 在 NIC 的 ROM 中。由 IEEE 统一管理和分配。</li><li><strong>广播地址 (Broadcast address):</strong> <code>FF-FF-FF-FF-FF-FF</code>。发往此地址的帧会被 LAN 上的所有节点接收。</li><li><strong>MAC vs. IP：</strong><ul><li><strong>MAC 地址：</strong> 扁平 (flat) 结构，可移植。如同<strong>身份证号</strong>（唯一且不随地点改变）。</li><li><strong>IP 地址：</strong> 层次 (hierarchical) 结构，不可移植（取决于所连接的子网）。如同<strong>邮政地址</strong>（随地点改变）。</li></ul></li></ul><h4 id="2-ARP-Address-Resolution-Protocol-地址解析协议">2. ARP (Address Resolution Protocol - 地址解析协议)</h4><ul><li><strong>问题：</strong> 在同一局域网内，已知一个节点的 IP 地址，如何获取其 MAC 地址？</li><li><strong>ARP 表 (ARP table):</strong><ul><li>LAN 上的每个节点（主机、路由器）都有一个 ARP 表。</li><li>存储 <code>&lt;IP 地址, MAC 地址, TTL&gt;</code> 的映射关系。</li><li><strong>TTL (Time To Live):</strong> 映射过期的（通常 20 分钟），是一种<strong>软状态 (soft state)</strong>。</li></ul></li><li><strong>ARP 协议过程 (在同一 LAN 内)：</strong><ol><li>A 想给 B 发送数据报，A 知道 B 的 IP 地址。</li><li>A 在其 ARP 表中查找 B 的 IP，未找到。</li><li>A <strong>广播 (broadcast)</strong> 一个 <strong>ARP 查询 (query)</strong> 包，询问：“谁拥有 B 的 IP 地址 <code>x.x.x.x</code>？” (目的 MAC 为 <code>FF-FF...</code>)</li><li>LAN 上的所有节点都收到此查询。</li><li>只有 B 识别出这是在询问自己的 IP。</li><li>B <strong>单播 (unicast)</strong> 一个 <strong>ARP 回复 (reply)</strong> 给 A，包中包含：“我是 <code>x.x.x.x</code>，我的 MAC 地址是 <code>...</code>”。</li><li>A 收到回复，将 B 的 (IP, MAC) 映射存入自己的 ARP 表，然后发送数据帧。</li></ol></li></ul><h4 id="3-跨子网路由-Routing-to-another-LAN">3. 跨子网路由 (Routing to another LAN)</h4><p>这是一个至关重要的场景，展示了网络层 (IP) 和链路层 (MAC) 如何在复杂的网络拓扑中协同工作。跨子网路由是为了实现 <strong>A 到 B 的端到端通信</strong>。在这个过程中，ARP 查找 MAC 地址只是为了解决“下一跳给谁”的传输问题。</p><p>在理解具体步骤前，必须牢记两条规则：</p><ul><li><strong>IP 地址 (逻辑地址) 始终不变：</strong> 就像信封上的“收件人”和“寄件人”，无论经过多少个中转站，<strong>源 IP</strong> 和 <strong>目的 IP</strong> 从头到尾保持不变。</li><li><strong>MAC 地址 (物理地址) 逐跳改变：</strong> 就像负责运输的“卡车”或“快递员”，每一“跳” (Hop) 都要重新封装，<strong>源 MAC</strong> 和 <strong>目的 MAC</strong> 在每一段链路都会改变。</li></ul><p><strong>场景设定</strong>：</p><ul><li><strong>发送方 A</strong>：位于子网 1 (IP_A, MAC_A)。</li><li><strong>接收方 B</strong>：位于子网 2 (IP_B, MAC_B)。</li><li><strong>路由器 R</strong>：连接子网 1 和子网 2 的网关。<ul><li>面向子网 1 的接口：(IP_R1, MAC_R1)</li><li>面向子网 2 的接口：(IP_R2, MAC_R2)</li></ul></li></ul><p><strong>阶段一：主机 A 发送数据 (在子网 1 内)</strong></p><ol><li><strong>判断目标：</strong> A 查看 B 的 IP 地址，根据子网掩码判断出 B <strong>不在</strong>同一个子网内。</li><li><strong>确定下一跳：</strong> A 决定将数据包发送给其配置的<strong>默认网关 (Default Gateway)</strong>，即路由器 R。</li><li><strong>封装 IP 数据报：</strong> A 创建网络层数据报。<ul><li>Src IP: <strong>A</strong></li><li>Dest IP: <strong>B</strong></li></ul></li><li><strong>获取网关 MAC：</strong> A 知道网关的 IP (IP_R1)，但在封装帧时需要 MAC 地址。A 检查 ARP 表，若没有，则广播 <strong>ARP Query</strong>。路由器 R 回复其 MAC 地址 (<strong>MAC_R1</strong>)。</li><li><strong>发送帧：</strong> A 创建链路层帧并发送。<ul><li>Src MAC: <strong>A</strong></li><li>Dest MAC: <strong>MAC_R1</strong> (注意：这里目标是路由器，不是 B)</li><li>Payload: IP 数据报 (A-&gt;B)</li></ul></li></ol><p><strong>阶段二：路由器 R 中转 (跨越网络)</strong><br>6.  <strong>解封装 (Decapsulation)：</strong> 路由器 R 在接口 1 收到帧，检查 Dest MAC 是自己 (MAC_R1)，于是接收并提取出 IP 数据报。<br>7.  <strong>路由决策：</strong> R 检查 IP 头部，发现 Dest IP 是 <strong>B</strong>。R 查询转发表 (Forwarding Table)，得知通往 B 的路径需要从<strong>接口 2</strong> 出发。<br>8.  <strong>获取下一跳 MAC：</strong> R 需要将包转发给子网 2 中的 B。R 检查接口 2 的 ARP 表，查找 IP_B 对应的 MAC。若未找到，R 在子网 2 中广播 ARP Query，B 回复 <strong>MAC_B</strong>。<br>9.  <strong>重新封装 (Re-encapsulation)：</strong> R 创建一个新的链路层帧。<br>* Src MAC: <strong>MAC_R2</strong> (路由器的出口 MAC)<br>* Dest MAC: <strong>MAC_B</strong> (最终目标的 MAC)<br>* Payload: <strong>完全相同</strong>的 IP 数据报 (A-&gt;B)</p><p><strong>阶段三：主机 B 接收 (在子网 2 内)</strong><br>10. <strong>最终接收：</strong> B 收到帧，检查 Dest MAC 是自己 (MAC_B)，解封装取出 IP 数据报。<br>11. <strong>上交处理：</strong> B 检查 Dest IP 是自己，将数据载荷上交给传输层 (TCP/UDP) 处理。</p><table><thead><tr><th style="text-align:left">传输阶段</th><th style="text-align:left">源 IP 地址</th><th style="text-align:left">目的 IP 地址</th><th style="text-align:left">源 MAC 地址</th><th style="text-align:left">目的 MAC 地址</th></tr></thead><tbody><tr><td style="text-align:left"><strong>A -&gt; 路由器</strong></td><td style="text-align:left">IP_A (不变)</td><td style="text-align:left">IP_B (不变)</td><td style="text-align:left"><strong>MAC_A</strong></td><td style="text-align:left"><strong>MAC_R1</strong> (网关)</td></tr><tr><td style="text-align:left"><strong>路由器 -&gt; B</strong></td><td style="text-align:left">IP_A (不变)</td><td style="text-align:left">IP_B (不变)</td><td style="text-align:left"><strong>MAC_R2</strong> (网关)</td><td style="text-align:left"><strong>MAC_B</strong></td></tr></tbody></table><blockquote><p><strong>总结：</strong> 路由器在网络层是“中转站”，但在链路层它是“终点”和“新起点”。它剥离旧的帧头，换上新的帧头，就像在中转站给包裹换了一辆新的运输车，但包裹里的信件内容（IP包）从未被打开修改。</p></blockquote><h4 id="4-ARP-攻击">4. ARP 攻击</h4><ul><li><strong>原理：</strong> ARP 协议基于信任。攻击者可以主动发送伪造的 ARP 响应包（ARP 欺骗），毒化 (poison)<br>目标主机的 ARP 缓存，将网关的 IP 映射到攻击者的 MAC 地址。</li><li><strong>后果：</strong> 造成中间人攻击 (man-in-the-middle) 或网络中断。</li></ul><hr><h3 id="5-5-以太网-Ethernet">5.5 以太网 (Ethernet)</h3><ul><li>目前<strong>占主导地位</strong>的有线局域网技术。</li><li>由 Metcalfe (梅特卡夫) 发明，最初使用 CSMA/CD。</li></ul><h4 id="1-拓扑演进">1. 拓扑演进</h4><ul><li><strong>过去：总线型 (Bus Topology)</strong><ul><li>所有节点共享同一根同轴电缆。这根电缆就是一个巨大的<strong>碰撞域 (Collision Domain)</strong>。因为容易冲突，所以效率不高，这主要存在于 90 年代。</li></ul></li><li><strong>现在：星型 (Star Topology)</strong><ul><li>交换机是<strong>活动 (Active)</strong> 设备，它很聪明。每个节点和交换机之间都是独立的链路。在全双工模式下，<strong>节点之间根本不会发生碰撞</strong>。这是现在的绝对主流。</li></ul></li></ul><h4 id="2-以太网帧结构-Ethernet-Frame-Structure">2. 以太网帧结构 (Ethernet Frame Structure)</h4><ul><li><strong>前同步码 (Preamble) (8 字节):</strong> 7 字节的 <code>10101010</code> 和 1 字节的 <code>10101011</code>。用于发送方和接收方的时钟同步。</li><li><strong>目的 MAC 地址 (Dest. Address) (6 字节)</strong></li><li><strong>源 MAC 地址 (Source Address) (6 字节)</strong></li><li><strong>类型 (Type) (2 字节):</strong> 指示上层协议（如果里面是 IP 数据包，就交给 IP 协议处理；如果是 ARP 包，就交给 ARP 协议处理。）。</li><li><strong>数据 (Data) (46-1500 字节):</strong> 封装的上层 PDU (如 IP 数据报)。<ul><li><strong>1500 (MTU)</strong>：以太网规定一次最大只能运这么多，太大了要切分。</li></ul><ul><li><strong>46</strong>：如果数据太少（比如只有 10 个字节），以太网会强行填充垃圾数据补齐到 46 字节。这是为了保证帧有足够的长度，让旧式的碰撞检测 (CD) 机制能正常工作。</li></ul></li><li><strong>CRC (4 字节):</strong> 循环冗余校验。接收方会检查 CRC，如果失败，则<strong>丢弃该帧 (dropped)</strong>。</li></ul><h4 id="3-以太网特性">3. 以太网特性</h4><ul><li><strong>无连接 (Connectionless):</strong> 发送和接收 NIC 之间没有握手。不像 TCP 那样还需要三次握手建立感情，以太网是有数据直接就发。</li><li><strong>不可靠 (Unreliable):</strong> 接收 NIC 不会向发送 NIC 发送 ACK 或 NACK。<ul><li>如果帧丢失（例如 CRC 校验失败），数据报就丢失了。</li><li>不管你收没收到。接收方收到了不会回“收到”，收不到（比如 CRC 错被丢了）也不会回“重传”。<strong>可靠性必须由上层（如 TCP）来保证。</strong></li></ul></li></ul><h4 id="4-以太网-CSMA-CD-算法-经典总线型">4. 以太网 CSMA/CD 算法 (经典总线型)</h4><p>虽然现在的星型网络（交换机）已经几乎没有碰撞了，但 CSMA/CD 是以太网的灵魂。它主要用于解决<strong>总线型</strong>网络大家都想说话的问题。</p><ol><li>网络接口卡<em>NIC</em> 从网络层收到数据报，创建帧。</li><li><strong>侦听信道 (CS - Carrier Sense)：</strong><ul><li>如果信道空闲，开始传输。</li><li>如果信道繁忙，等待直到信道变为空闲，然后立即传输。</li></ul></li><li>传输期间，持续进行<strong>碰撞检测 (CD)</strong>。</li><li>如果传输完成<strong>未检测到碰撞</strong>，则帧发送成功。</li><li>如果<strong>检测到碰撞</strong>：<ul><li>(a) <strong>中止</strong>传输，并发送一个 48 bit 的<strong>堵塞信号 (Jam Signal)</strong>。</li><li>(b) 进入<strong>指数退避 (Exponential Backoff)</strong> 阶段：<ul><li>第 <em>m</em> 次碰撞后，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msup><mn>2</mn><mi>m</mi></msup><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{0, 1, \dots, 2^m - 1\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span> 中随机选择一个数 <code>K</code>。</li><li>等待 <code>K * 512</code> 比特时间 (bit times)。</li><li>返回步骤 2。</li></ul></li></ul></li></ol><hr><h3 id="5-6-链路层交换机-Link-Layer-Switches">5.6 链路层交换机 (Link-Layer Switches)</h3><h4 id="1-集线器-Hubs">1. 集线器 (Hubs)</h4><ul><li>是<strong>物理层 (Layer 1)</strong> 设备，“愚蠢的”中继器 (dumb repeaters)。</li><li>将从一个端口收到的<strong>比特 (bits)</strong> 复制并广播到<strong>所有</strong>其他端口。</li><li>所有连接到 Hub 的节点都在<strong>同一个碰撞域</strong>中。</li></ul><h4 id="2-交换机-Switches">2. 交换机 (Switches)</h4><ul><li>是<strong>链路层 (Layer 2)</strong> 设备，比 Hub 智能。</li><li><strong>存储转发 (Store-and-forward):</strong> 接收完整的帧，检查 MAC地址，然后<strong>选择性地 (selectively)</strong> 将帧转发到一个或多个出端口。</li><li><strong>透明 (Transparent):</strong> 主机不知道交换机的存在，实现了<strong>即插即用 (plug-and-play)</strong>。</li><li><strong>优点：</strong><ul><li><strong>隔离碰撞域：</strong> 交换机的每个端口都是一个独立的碰撞域。</li><li><strong>允许多路同时传输：</strong> A-&gt;A’ 和 B-&gt;B’ 的通信可以同时进行，互不干扰。</li></ul></li></ul><h4 id="3-交换机表-Switch-Table">3. 交换机表 (Switch Table)</h4><ul><li>交换机如何知道 A’ 在接口 4，B’ 在接口 5？</li><li>交换机维护一个交换机表，条目为：<code>&lt;MAC 地址, 转发接口, TTL&gt;</code>。</li></ul><h4 id="4-交换机自学习-Self-Learning">4. 交换机自学习 (Self-Learning)</h4><ul><li>交换机通过<strong>查看入站帧的源 MAC 地址 (source MAC address)</strong> 来自动构建其交换机表。</li><li><strong>过程：</strong><ol><li>当一个帧从接口 <code>X</code> 到达时，交换机查看其<strong>源 MAC 地址</strong>（例如 <code>A</code>）。</li><li>它在表中记录或更新条目：<code>&lt;A, X, TTL&gt;</code>。</li><li>（自学习过程与转发过程是同时进行的）。</li></ol></li></ul><h4 id="5-交换机转发-Filtering-Forwarding">5. 交换机转发 (Filtering/Forwarding)</h4><ol><li>收到一个帧（来自接口 <code>X</code>，源 <code>S</code>，目的 <code>D</code>）。</li><li>使用 <code>S</code> 和 <code>X</code> 更新交换机表（自学习）。</li><li>在交换机表中查找<strong>目的 MAC 地址 <code>D</code></strong>：<ul><li><strong>(a) 如果找到条目</strong>（<code>D</code> 对应接口 <code>Y</code>）：<ul><li><strong>if (Y == X):</strong> 丢弃该帧 (目的在同一网段，无需转发)。</li><li><strong>else (Y != X):</strong> 将帧<strong>转发 (forward)</strong> 到接口 <code>Y</code>。</li></ul></li><li><strong>(b) 如果未找到条目：</strong><ul><li><strong>泛洪 (Flood)</strong>。将帧复制并转发到<mark><strong>除 <code>X</code> 之外的所有</strong>接口</mark>。<ul><li>接在其他接口的都会收到这个帧，但它们发现目的 MAC 不是自己，就丢弃。</li></ul><ul><li>D 也会收到，D 发现目的 MAC 是自己，于是接收。</li><li><strong>注意</strong>：这就有点像 Hub 的行为，但交换机只在<strong>不知道目的地</strong>时才这么做。</li></ul></li></ul></li></ul></li></ol><h4 id="6-交换机-vs-路由器-Switches-vs-Routers">6. 交换机 vs. 路由器 (Switches vs. Routers)</h4><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">交换机 (Switch)</th><th style="text-align:left">路由器 (Router)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>工作层次</strong></td><td style="text-align:left">第 2 层 (链路层)</td><td style="text-align:left">第 3 层 (网络层)</td></tr><tr><td style="text-align:left"><strong>转发依据</strong></td><td style="text-align:left">MAC 地址</td><td style="text-align:left">IP 地址</td></tr><tr><td style="text-align:left"><strong>转发表来源</strong></td><td style="text-align:left">自学习 (plug-and-play)</td><td style="text-align:left">路由算法 (RIP, OSPF, BGP)</td></tr><tr><td style="text-align:left"><strong>隔离</strong></td><td style="text-align:left">隔离<strong>碰撞域 (Collision Domains)</strong></td><td style="text-align:left">隔离<strong>广播域 (Broadcast Domains)</strong></td></tr></tbody></table><h4 id="7-现代以太网-Full-Duplex">7. 现代以太网 (Full-Duplex)</h4><ul><li>现代交换机使用<strong>星型拓扑</strong>和<strong>全双工 (full duplex)</strong> 链路（使用双绞线中的不同线对进行收发）。</li><li>在点对点的全双工链路中，<strong>不可能发生碰撞</strong>。</li><li>因此，现代以太网交换机<strong>不再需要 CSMA/CD</strong> 协议。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-04-Datalink-Layer-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-04-Datalink-Layer-01/"/>
    <published>2026-01-14T19:10:00.000Z</published>
    <summary>这一层负责在物理上相邻的两个节点之间传输数据。</summary>
    <title>Network - 04.Data Link Layer-01</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success">            <p><strong>路由算法 (Routing Algorithms)</strong></p><ul><li><strong>核心目标：</strong> 在网络中找到从源到目的地的<strong>最低成本路径</strong>。</li><li><strong>抽象模型：</strong> 使用图论 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo>=</mo><mo stretchy="false">(</mo><mi>N</mi><mo separator="true">,</mo><mi>E</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G=(N, E)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mclose">)</span></span></span></span> 来建模网络，其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 是路由器，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 是链路，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><msup><mi>x</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x,x&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 是链路成本。</li><li><strong>分类：</strong><ul><li><strong>按信息范围：</strong><ul><li><strong>全局 (LS)：</strong> 所有路由器拥有完整的拓扑和成本信息（如 <strong>OSPF</strong>）。使用 <strong>Dijkstra 算法</strong>。</li><li><strong>分散 (DV)：</strong> 路由器只知道邻居信息，通过迭代交换信息（如 <strong>RIP</strong>）。使用 <strong>Bellman-Ford 方程</strong>。</li></ul></li><li><strong>按更新时机：</strong> 静态（变化慢）与动态（变化快）。</li></ul></li></ul><p><strong>链路状态 (LS) 路由</strong></p><ul><li><strong>算法：</strong> Dijkstra 算法，计算从一个源到所有节点的最低成本路径。</li><li><strong>特点：</strong> 需要全网广播链路状态信息。</li><li><strong>问题：</strong> 可能发生<strong>路由震荡</strong>，尤其是在成本与流量相关时。</li></ul><p><strong>距离向量 (DV) 路由</strong></p><ul><li><strong>算法：</strong> 基于 Bellman-Ford 方程的迭代、异步、分布式算法。</li><li><strong>特点：</strong> 节点只维护到所有目的地的成本估计（距离向量），并与邻居交换。</li><li><strong>问题：</strong> <strong>坏消息传得慢</strong>，可能导致路由环路（<strong>计数到无穷</strong>）。解决方案包括<strong>毒性逆转</strong>。</li></ul><p><strong>互联网中的路由</strong></p><ul><li><strong>分层结构：</strong> 由于互联网规模巨大且管理自治，采用<strong>分层路由</strong>，将路由器组织成<strong>自治系统 (AS)</strong>。</li><li><strong>AS 内部路由 (IGP)：</strong> 在同一个 AS 内部运行，目标是找到最优路径。<ul><li><strong>RIP：</strong> 简单的 DV 协议，基于跳数，每 30 秒广播。</li><li><strong>OSPF：</strong> 开放的 LS 协议，使用 Dijkstra，直接承载在 IP 上，支持分层（区域）。</li></ul></li><li><strong>AS 间路由 (EGP)：</strong> 在不同 AS 之间运行，目标是找到可达且符合策略的路径。<ul><li><strong>BGP：</strong> 事实上的标准，基于路径向量，通过 TCP 会话（eBGP/iBGP）交换可达信息，并根据策略进行路由选择。</li></ul></li></ul><p><strong>软件定义网络 (SDN)</strong></p><ul><li><strong>核心思想：</strong> <strong>控制平面与数据平面分离</strong>。控制平面是逻辑上集中的远程<strong>控制器 (软件)</strong>，数据平面是简单的<strong>交换机硬件</strong>。</li><li><strong>优势：</strong> 易于管理、开放性、灵活的流量工程。</li><li><strong>架构：</strong><ol><li><strong>应用层：</strong> 实现网络功能（路由、防火墙等）。</li><li><strong>控制器层：</strong> 维护网络状态，提供北向和南向 API。</li><li><strong>基础设施层：</strong> 数据平面交换机，根据<strong>流表</strong>转发。</li></ol></li><li><strong>OpenFlow：</strong> 事实上的标准<strong>南向接口</strong>协议。核心是基于<strong>流表</strong>的<strong>广义转发</strong>（匹配+动作），统一了路由器、交换机、防火墙等设备的功能。</li><li><strong>本质：</strong> 通过软件定义和可编程性，解耦软硬件，实现网络的深度可编程。</li></ul>          </div><h3 id="4-5-路由算法-Routing-Algorithms">4.5 路由算法 (Routing Algorithms)</h3><ol><li><p><strong>图抽象 (Graph Abstraction)</strong></p><ul><li>路由问题可以抽象为图论问题。</li><li><strong>图 (Graph):</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo>=</mo><mo stretchy="false">(</mo><mi>N</mi><mo separator="true">,</mo><mi>E</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G=(N, E)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mclose">)</span></span></span></span></li><li><strong>N = 节点/路由器 (Nodes/Routers):</strong> 集合 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo separator="true">,</mo><mi>w</mi><mo separator="true">,</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{u, v, w, x, y, z\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">}</span></span></span></span></li><li><strong>E = 链路 (Edges/Links):</strong> 路由器之间的连接，例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><mi>u</mi><mo separator="true">,</mo><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{(u,v), (u,x), ...\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{(</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mclose">}</span></span></span></span></li><li><strong>链路成本 (Link Cost):</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><msup><mi>x</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x, x&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><ul><li>可以是 1（即计算跳数），也可以与带宽 (bandwidth) 或拥塞 (congestion) 程度成反比。</li></ul></li><li><strong>路径成本 (Path Cost):</strong> 路径上所有链路成本的总和。</li><li><strong>路由算法 (Routing Algorithm):</strong> 找到源和目标之间的<strong>最低成本路径 (least-cost path)</strong>。</li></ul></li><li><p><strong>路由算法分类 (Classification)</strong><br><strong>按信息范围：</strong></p><ul><li><strong>全局 (Global) 算法 (又称: 链路状态 LS):</strong><ul><li>所有路由器拥有完整的<strong>拓扑 (topology)</strong> 和链路成本信息。</li><li>例如：<strong>链路状态 (Link State, LS) 算法</strong>。</li></ul></li><li><strong>分散 (Decentralized) 算法 (又称: 距离向量 DV):</strong><ul><li>路由器只知道其物理连接的邻居和到邻居的链路成本。</li><li>通过迭代计算和与邻居交换信息来工作。</li><li>例如：<strong>距离向量 (Distance Vector, DV) 算法</strong>。<br><strong>按更新时机：</strong></li></ul></li><li><strong>静态 (Static):</strong> 路由变化缓慢。</li><li><strong>动态 (Dynamic):</strong> 路由变化迅速，可能是周期性更新或在链路成本变化时触发。</li></ul></li></ol><h4 id="4-5-1-链路状态-Link-State-LS-路由算法">4.5.1 链路状态 (Link State, LS) 路由算法</h4><p>链路状态算法是一种<strong>全局性 (Global)</strong> 路由算法，要求网络中的每个节点在计算路径前，都必须掌握完整的网络拓扑结构和所有链路的成本 (Link Cost)。</p><h5 id="1-狄克斯特拉算法-Dijkstra’s-Algorithm">1. 狄克斯特拉算法 (Dijkstra’s Algorithm)</h5><p>这是 LS 路由最核心的算法，用于计算从一个<strong>源节点 (Source Node)</strong> 到网络中所有其他节点的<strong>最低成本路径 (Least-cost Path)</strong>。</p><p><strong>算法符号定义：</strong></p><ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x, y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></strong>：从节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 到节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的<strong>直接</strong>链路成本；如果不直接相连，则成本为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">\infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span>。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D(v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span></strong>：从源节点到目的节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的<strong>当前</strong>路径成本。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span></strong>：从源到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的当前最低成本路径中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的<strong>前驱节点 (Predecessor)</strong>。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></strong>：当前已确定最低成本路径的节点集合。</li></ul><p><strong>算法执行步骤：</strong></p><ol><li><strong>初始化 (Initialization)</strong>：<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mo stretchy="false">{</mo><mi>u</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">N&#x27; = \{u\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathnormal">u</span><span class="mclose">}</span></span></span></span>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span> 为源节点）。</li><li>对于所有节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>：<ul><li>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span> 的邻居，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo><mo>=</mo><mi>c</mi><mo stretchy="false">(</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D(v) = c(u, v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span>。</li><li>否则，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">D(v) = \infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span>。</li></ul></li></ul></li><li><strong>循环 (Loop)</strong>：<ul><li>在所有不在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 中的节点中，找到一个具有最小当前成本 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>w</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D(w)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mclose">)</span></span></span></span> 的节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span>。</li><li>将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 加入集合 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>。</li><li><strong>更新 (Update)</strong>：对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 的所有不在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 中的邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>，更新其成本：<br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo><mo>=</mo><mi>min</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>D</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>D</mi><mo stretchy="false">(</mo><mi>w</mi><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo stretchy="false">(</mo><mi>w</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D(v) = \min( D(v), D(w) + c(w, v) )</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">min</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">))</span></span></span></span>。<ul><li><em>含义：新成本是原到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的成本与“经过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 到达 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的成本”之间的最小值</em>。</li></ul></li></ul></li><li><strong>终止</strong>：当所有节点都已加入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 时，算法结束。</li></ol><h5 id="2-算法复杂度与特性">2. 算法复杂度与特性</h5><ul><li><strong>计算复杂度 (Computational Complexity)</strong>：<ul><li>对于拥有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个节点的网络，算法需要进行 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 次迭代。</li><li>每一轮迭代都需要搜索不在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">N&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 中的节点以寻找最小值。</li><li>总搜索次数为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mn>2</mn></mrow><annotation encoding="application/x-tex">n(n+1)/2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">/2</span></span></span></span>，即算法复杂度为 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></strong>；若使用高效实现（如堆排序），可优化至 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mi>log</mi><mo>⁡</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n \log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></strong>。</li></ul></li><li><strong>报文复杂度 (Message Complexity)</strong>：<ul><li>每个节点必须通过<strong>链路状态广播 (Link State Broadcast)</strong> 向全网所有其他节点发送其链路信息。</li><li>发送的消息数量级通常与节点数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 和链路数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 相关。</li></ul></li></ul><h5 id="3-LS-算法的问题：路由震荡-Oscillations">3. LS 算法的问题：路由震荡 (Oscillations)</h5><p>如果链路成本是基于流量负载 (Load-sensitive) 定义的，LS 算法可能会导致<strong>路由震荡 (Oscillations)</strong>。</p><p><strong>震荡过程示例：</strong></p><ol><li>假设路径 A 流量较轻，成本低，所有路由器计算后将流量全部切向 A。</li><li>由于所有流量都涌向 A，导致路径 A 变得极度拥塞，成本大幅上升。</li><li>在下一次算法计算中，路由器发现路径 B 的成本相对变低，于是所有流量又同时切向 B。</li><li>这种在不同路径间<strong>集体“跳跃”的行为即为震荡</strong>。</li></ol><p><strong>解决方案：</strong></p><p>如果所有路由器都在<strong>同一时间间隔</strong>（例如每 30 秒）同步运行 Dijkstra 算法，它们会看到完全相同的“低成本”路径，并做出完全相同的决定。这种<strong>一致性的行为</strong>导致了流量的剧烈波动。</p><p>为了打破这种“集体行动”，通常采用以下策略：</p><ul><li><strong>计算时间随机化 (Randomize Algorithms Execution)</strong>：<ul><li>这是最实用的方案。通过让每个路由器运行 Dijkstra 算法的时间点<strong>随机错开</strong>，可以保证每次只有一部分路由器在改变路由决策。这样，流量会逐步、零散地向更优路径迁移，网络更有可能达到一个稳定的平衡点，而不是在两个极端间震荡。</li></ul></li><li><strong>平滑成本权重</strong>： 避免链路成本对流量变化过于敏感。例如，不直接使用瞬时负载，而是使用长期平均负载来计算成本，从而过滤掉短期波动对路由的影响。</li></ul><h4 id="4-5-2-距离向量-Distance-Vector-DV-路由">4.5.2 距离向量 (Distance Vector, DV) 路由</h4><p>距离向量算法是一种<strong>迭代的 (Iterative)</strong>、<strong>分布式的 (Distributed)</strong> 且<strong>异步的 (Asynchronous)</strong> 算法。与链路状态 (LS) 算法不同，它不需要节点了解全局网络拓扑，节点只需与邻居交换信息即可。</p><h5 id="1-贝尔曼-福特方程-Bellman-Ford-Equation">1. 贝尔曼-福特方程 (Bellman-Ford Equation)</h5><p>这是 DV 算法的数学核心，利用了动态规划的思想。</p><p><strong>方程表达式：</strong><br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>v</mi></msub><mo stretchy="false">{</mo><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>d</mi><mi>v</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">d_x(y) = \min_v \{ c(x,v) + d_v(y) \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span class="mop">min</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">{</span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)}</span></span></span></span></p><p><strong>符号含义：</strong></p><ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_x(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></strong>：从源节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 到目的节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的最低路径成本估计。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span></strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 的所有直连邻居。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x,v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span></strong>：从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 到邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的<strong>直接</strong>链路成本。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>v</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_v(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></strong>：从邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 到目的节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的最低路径成本估计。</li></ul><p><strong>逻辑：</strong> 节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 遍历所有邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>，计算“到邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的成本”与“从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的剩余成本”之和，取其中的最小值。</p><h5 id="2-路由器的内部存储结构：距离向量表">2. <strong>路由器的内部存储结构：距离向量表</strong></h5><ul><li>在 DV 算法中，每个节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 实际上维护的是一个<strong>二维矩阵（或多个向量的集合）</strong>。<ul><li><strong>自己的距离向量 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>x</mi></msub></mrow><annotation encoding="application/x-tex">D_x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>：这是一个一维数组，存储着节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 认为到网络中所有目的地 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的<strong>当前最小成本</strong>。这是节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 对外通告的内容。</li><li><strong>邻居的距离向量库 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">D_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>：节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 会为每一个直接相连的邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 开辟一块空间，专门记录邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 上一次发过来的距离向量。</li><li><em>注意</em>：这反映了“邻居认为它到目的地的距离”。</li><li><strong>本地链路成本 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x,v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span>)</strong>：节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 知道自己到所有直接邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的物理链路成本。</li></ul></li></ul><h5 id="3-详细的维护流程：三阶段迭代">3. <strong>详细的维护流程：三阶段迭代</strong></h5><ol><li>第一阶段：<strong>等待</strong> (Wait)<ul><li>路由器大部分时间处于“休眠”状态，直到以下两种<strong>事件</strong>之一发生：<ul><li><strong>本地链路成本变化</strong>：节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 发现到某个邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的物理链路变快了、变慢了或断开了。</li><li><strong>收到邻居的更新报文</strong>：邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 发送了它最新的距离向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">D_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 过来。</li></ul></li></ul></li><li>第二阶段：<strong>重新计算</strong> (Recompute) —— 执行Bellman-Ford方程<ul><li>这是最核心的维护步骤。每当上述事件发生，节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 就会重新计算它到所有目的地 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的最小成本 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_x(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>。</li><li>计算逻辑如下：<ul><li>对于每一个目的地 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>，节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 会扫描它所有的邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>，并计算：$$d_x(y) = \min_{v} { c(x,v) + d_v(y) }$$</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x,v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span> 是我到邻居的距离（本地已知）。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>v</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_v(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span> 是邻居上次告诉我的，它到目的地的距离（从缓存中取）。</li></ul></li><li><strong>结果</strong>：节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 选出那个能让总和最小的邻居 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>，作为通往 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的<strong>下一跳 (Next Hop)</strong>，并更新自己的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D_x(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li>第三阶段：<strong>通知</strong> (Notify) —— 增量传播<ul><li><strong>触发条件</strong>：只有当节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 重新计算后的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>x</mi></msub></mrow><annotation encoding="application/x-tex">D_x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 发生了<strong>变化</strong>（即发现了一条更优路径或原路径变差了），它才需要行动。</li><li><strong>动作</strong>：将更新后的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>x</mi></msub></mrow><annotation encoding="application/x-tex">D_x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 向量（包含到所有目的地的最新估计）打包发送给<strong>所有</strong>直接相邻的邻居。</li><li><strong>结果</strong>：邻居收到后，又会进入它们自己的“第二阶段”，从而形成连锁反应。</li></ul></li></ol><h5 id="4-DV-维护的关键特性">4. DV 维护的关键特性</h5><ol><li>异步性 (Asynchronous)<ul><li>节点之间不需要“对表”。A 节点可以现在计算，B 节点可以 10 秒后收到后再计算。信息是在网络中像波浪一样传播的。</li></ul></li><li>分布式 (Distributed)<ul><li>每个节点只根据：本地已知的链路成本 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(x,v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span>，邻居传来的二向信息 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>v</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">d_v(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></li><li>进行计算。它永远不知道完整的网络长什么样（例如它不知道邻居后面还连了谁，它只相信邻居给的数字）。</li></ul></li><li>迭代收敛<ul><li>只要网络拓扑不再发生变化，这些节点就会不断地互相交换向量。每一次交换，节点都会获得更远的路径信息。<ul><li>第一次迭代：获得 1 跳范围内的路径。</li><li>第二次迭代：获得 2 跳范围内的路径。</li></ul></li><li>以此类推，直到所有节点的路由表都不再变化（达到<strong>不动点</strong>），此时网络达到<strong>收敛 (Convergence)</strong> 状态。</li></ul></li></ol><h5 id="5-路由环路与“计数到无穷”问题">5. 路由环路与“计数到无穷”问题</h5><p>DV 算法存在一个显著缺陷，即信息的传播是非对称的。</p><ul><li><strong>好消息传得快 (Good news travels fast)</strong>：<ul><li>当某条链路成本降低时，这种“好消息”会迅速通过邻居间的更新在全网收敛。</li></ul></li><li><strong>坏消息传得慢 (Bad news travels slow)</strong>：<ul><li>当链路成本大幅增加或失效时，可能会产生<strong>路由环路 (Routing Loop)</strong>。</li></ul><ul><li>当路径变差或中断时，节点会倾向于寻找“替代路径”。由于它们没有全局视角，往往会误把原本就经过自己的路径当成替代路径，从而陷入互相欺骗的死循环。</li></ul></li></ul><p><strong>“计数到无穷 (Count-to-Infinity)”示例：</strong></p><ol><li>假设路径 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo>←</mo><mi>Y</mi><mo>←</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">X \leftarrow Y \leftarrow Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span>，原本 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 通过直接链路到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的成本为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 通过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的成本为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span>。</li><li>若 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c(Y,X)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span></span></span></span> 变为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>60</mn></mrow><annotation encoding="application/x-tex">60</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">60</span></span></span></span>。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 更新时，会看到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 曾通告过“我到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的成本是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span>”。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 误以为可以通过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 到达 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span>，于是计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>Y</mi></msub><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mi>c</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>Z</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>d</mi><mi>Z</mi></msub><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo>+</mo><mn>5</mn><mo>=</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">d_Y(X) = c(Y,Z) + d_Z(X) = 1 + 5 = 6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.22222em;">Y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">6</span></span></span></span>。</li><li>随后 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 发现 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 的成本变了，又更新自己的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>Z</mi></msub><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo>+</mo><mn>6</mn><mo>=</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">d_Z(X) = 1 + 6 = 7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">6</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">7</span></span></span></span>。</li><li>这种错误的更新会在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 之间往复，直到成本值增加到定义的“无穷大”（如 RIP 协议中规定的 16 跳）为止。如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 每 30 秒交换一次数据，从 5 数到 16 需要好几分钟。在这几分钟里，去往 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的数据包会在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 之间不停地打转（环路），直到丢包。这就是所谓的<strong>收敛极慢</strong>。</li></ol><h5 id="6-解决方案：毒性逆转-Poisoned-Reverse">6. 解决方案：毒性逆转 (Poisoned Reverse)</h5><p>为了解决这种两个节点间的路由环路，引入了“毒性逆转”规则：</p><ul><li><strong>核心思想</strong>：如果节点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 经过<strong>邻居</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 到达目的地 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span>，那么 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 向 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 通告路径信息时，会谎称其到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的距离为<strong>无穷大</strong> (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>Z</mi></msub><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">d_Z(X) = \infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span>)。</li><li><strong>效果</strong>：这样 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 在链路成本增加时，就不会试图通过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 去寻找通往 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的路径，从而打破了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span> 之间的循环依赖。</li><li><strong>局限性</strong>：毒性逆转只能解决涉及<strong>两个直接相邻节点</strong>的环路，无法完全消除涉及三个或更多节点的复杂环路。</li></ul><h5 id="7-LS-与-DV-算法对比">7. LS 与 DV 算法对比</h5><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">链路状态 (LS)</th><th style="text-align:left">距离向量 (DV)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>拓扑知识</strong></td><td style="text-align:left">全局 (获取全网地图)</td><td style="text-align:left">局部 (仅知邻居)</td></tr><tr><td style="text-align:left"><strong>消息传递</strong></td><td style="text-align:left">泛洪广播 (对全网发送)</td><td style="text-align:left">仅与邻居交换信息</td></tr><tr><td style="text-align:left"><strong>收敛速度</strong></td><td style="text-align:left">快</td><td style="text-align:left">慢 (且可能产生环路)</td></tr><tr><td style="text-align:left"><strong>鲁棒性</strong></td><td style="text-align:left">节点可能广播错误的链路成本</td><td style="text-align:left">节点可能广播错误的路径成本 (错误会扩散)</td></tr></tbody></table><h4 id="4-5-3-分层路由-Hierarchical-Routing">4.5.3 分层路由 (Hierarchical Routing)</h4><ul><li><p><strong>动机：</strong> 在理想的小型实验网络中，我们可以用 <em>Dijkstra</em> 或 <em>Bellman-Ford</em> 算法算出所有路径。但在现实的互联网中，有两个无法逾越的障碍：</p><ol><li><strong>规模 (Scale):</strong> 互联网的规模巨大，单个路由器无法存储所有目的地的路由表。路由算法的计算开销也会爆炸。每当一个偏远地区的链路断开，全球所有路由器都要重新计算，这会造成网络带宽被路由更新信息占满。</li><li><strong>管理自治 (Administrative Autonomy):</strong> 互联网是“网络的网络”，每个网络（公司、大学）希望有权决定自己内部使用什么协议，并且不希望外界知道自己内部详细的网络拓扑。</li></ol></li><li><p><strong>解决方案：</strong> 将路由器组织成<strong>自治系统 (Autonomous Systems, AS)</strong>。</p></li><li><p><strong>AS (自治系统):</strong> 一个 AS 通常是由某个管理机构（如一个 ISP 或一个大型企业）控制的一组路由器。</p><ul><li>每个全球可达的 AS 都有一个唯一的编号（AS Number）。</li><li>内部路由被隐藏在 AS 内部。外界只看到这个 AS，而看不到 AS 里面的具体路由器。</li></ul></li><li><p><strong>AS 内部路由 (Intra-AS Routing / IGP):</strong></p><ul><li>也称为<strong>内部网关协议 (Interior Gateway Protocols, IGP)</strong>。</li><li>在<em>同一个</em> AS 内部运行，所有路由器运行相同的协议。管理员可以随意更换协议，不影响外界。</li><li><strong>目标：</strong> 在 AS 内部找到最优路径。追求<strong>性能最大化</strong>。</li><li><strong>协议：</strong> <strong>RIP</strong>, <strong>OSPF</strong>, IGRP (Cisco 专用)。</li></ul></li><li><p><strong>AS 间路由 (Inter-AS Routing / EGP):</strong></p><ul><li>也称为<strong>外部网关协议 (Exterior Gateway Protocols, EGP)</strong>。</li><li>在<em>不同</em> AS 之间运行。</li><li><strong>目标：</strong> 在 AS 之间找到可达的、符合<em>策略</em>的路径。</li><li><strong>协议：</strong> <strong>BGP</strong>(Border Gateway Protocol)。GP 负责把分散的 AS 粘合成一个整体的互联网。</li></ul></li><li><p><strong>网关路由器 (Gateway Router):</strong> 位于 AS 边缘，它一方面通过 IGP 知道 AS 内部的所有路径，另一方面通过 EGP 与其他 AS 的网关交流，了解如何到达全球其他地方。</p></li><li><p><strong>热土豆路由 (Hot potato routing):</strong> 当一个 AS 决定如何将数据包发往 AS <strong>外部</strong>时，它会将数据包转发给（AS 内部）路径成本最低的那个网关路由器，尽快将数据包“扔”出自己的网络。</p></li></ul><hr><h3 id="4-6-互联网中的路由-Routing-in-the-Internet">4.6 互联网中的路由 (Routing in the Internet)</h3><h4 id="AS-内部路由协议-IGP">AS 内部路由协议 (IGP)</h4><h5 id="4-6-1-RIP-Routing-Information-Protocol">4.6.1 RIP (Routing Information Protocol)</h5><p>RIP 是互联网中最古老的<strong>内部网关协议 (IGP)</strong> 之一。它是一种典型的基于<strong>距离向量 (Distance Vector, DV)</strong> 算法的路由协议，设计目标是简单、易于实现，适用于小型、自治的网络环境。</p><ol><li>核心度量标准：跳数 (Hop Count)<ul><li>在 RIP 中，路径的“成本”仅由<strong>跳数 (Hops)</strong> 决定。<ul><li><strong>定义</strong>：从源到目的地经过的路由器数量。</li><li><strong>计算</strong>：直连网络的跳数为 0，每经过一个路由器，跳数加 1。</li><li><strong>局限性</strong>：由于只看跳数，不考虑链路的带宽、延迟或拥塞情况。例如，一条经过 2 个路由器的 10M 链路在 RIP 看来，优于经过 3 个路由器的 1000M 链路。</li></ul></li></ul></li><li>最大跳数与“无穷大”<ul><li>为了解决距离向量 <em>DV</em> 算法中“计数到无穷”问题，RIP 引入了硬性的规模限制：</li></ul><ul><li><strong>最大有效跳数</strong>：15 跳。</li><li><strong>不可达标识</strong>：16 跳被定义为<strong>无穷大 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">\infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span>)</strong>，表示目的地不可达。</li><li><strong>设计意图</strong>：这限制了 RIP 只能在小型局域网或企业网中使用（直径不能超过 15 个路由器）。</li></ul></li><li>路由通告 (Advertisements) 机制<ul><li>RIP 路由器通过定期交换信息来同步路由表。</li></ul><ul><li><strong>周期性更新</strong>：大约每 <strong>30 秒</strong>，路由器会向邻居发送其完整的路由表副本。</li><li><strong>通告内容</strong>：被称为 <strong>RIP 响应报文 (Response Message)</strong> 或 <strong>RIP 广告 (Advertisement)</strong>，包含了一组 (目的地, 跳数) 的列表。</li><li><strong>传输协议</strong>：RIP 报文封装在 <strong>UDP</strong> 数据报中，使用 <strong>520</strong> 端口。虽然它运行在应用层，但其目的是为了配置网络层的转发表。</li></ul></li><li>链路失效与容错<ul><li>RIP 通过超时机制来判断邻居是否发生故障：</li></ul><ul><li><strong>180 秒超时</strong>：如果一个路由器在连续 180 秒（即 6 个更新周期）内没有收到来自某个邻居的通告，则认为该邻居已失效。</li><li><strong>应对措施</strong>（在一次播报中）：<ol><li>路由毒化：路由器会将<strong>经过该邻居的所有路径成本</strong>设为 16（不可达），是发现故障后的<strong>紧急广播</strong>。</li><li>随后触发<strong>毒性逆转 (Poisoned Reverse)</strong> 机制，防止产生环路。这是一条专门针对“下一跳”邻居的规则。如果路由器 A 经过邻居 B 到达目的地 X，那么当 A 向 B 通告路由时，A 会告诉 B：“我到 X 的距离是 <strong>16</strong>（无穷大）”。</li></ol></li></ul></li><li>协议的实现：routed 进程<ul><li>RIP 通常不是直接硬编码在路由器的内核硬件中，而是作为一个软件进程运行。</li></ul><ul><li><strong>实现形式</strong>：在 Unix/Linux 系统中，该进程通常被称为 <strong><code>routed</code> (Route Daemon)</strong>。</li><li><strong>工作逻辑</strong>：<ol><li><code>routed</code> 进程在应用层维护路由信息。</li><li>它监听 UDP 520 端口的更新消息。</li><li>根据收到的信息计算出最优路径后，通过系统调用更新操作系统内核中的 <strong>IP 转发表 (Forwarding Table)</strong>。</li></ol></li></ul></li><li>RIP 的优缺点总结</li></ol><table><thead><tr><th style="text-align:left">优点</th><th style="text-align:left">缺点</th></tr></thead><tbody><tr><td style="text-align:left"><strong>配置极其简单</strong>：几乎不需要手动干预。</td><td style="text-align:left"><strong>收敛速度慢</strong>：遇到故障时需要“计数到 16”，反应迟钝。</td></tr><tr><td style="text-align:left"><strong>资源消耗低</strong>：对 CPU 和内存的要求很小。</td><td style="text-align:left"><strong>规模受限</strong>：无法支持超过 15 跳的大型网络。</td></tr><tr><td style="text-align:left"><strong>易于理解</strong>：基于简单的跳数逻辑。</td><td style="text-align:left"><strong>路由选择不合理</strong>：忽略了链路带宽等关键性能指标。</td></tr></tbody></table><div class="note note-info">            <p>虽然 DV 算法理论上提倡“有变化才更新”，但 RIP 协议作为工业实现，必须结合 <strong>定期更新</strong>（每 30 秒一次）和 <strong>触发更新</strong> (Triggered Update) 来确保系统的稳定性，其核心原因如下：</p><ul><li><p><strong>容错机制 (Fault Tolerance)：</strong> &gt;   RIP 报文封装在 <strong>UDP</strong> 数据报中。由于 UDP 是不可靠传输，如果仅依赖一次性的“触发更新”且该报文在网络中丢包，接收方将永远无法获知路径变化。定期更新提供了<strong>强制同步</strong>的“兜底”机制。</p></li><li><p><strong>存活检测 (Heartbeat / 活性检测)：</strong> &gt;   RIP 协议没有专门的 <code>Hello</code> 报文（心跳包）。路由器通过是否能按时收到邻居的定期路由通告来判断其存活状态。若连续 <strong>180 秒</strong>（即 6 个周期）未收到信息，则判定邻居失效并进入容错处理。</p></li><li><p><strong>防止静默状态 (Preventing Silence)：</strong> &gt;   在分布式系统中，定期通告能确保全网始终处于活跃的同步状态，避免因长时间无消息而无法区分“网络稳定”与“节点死机”。</p></li></ul><p><strong>总结：</strong> RIP 通过“触发更新”追求响应速度，通过“定期更新”解决 UDP 丢包及邻居状态监测的现实问题，二者相辅相成。</p>          </div><h5 id="4-6-2-OSPF-Open-Shortest-Path-First">4.6.2 OSPF (Open Shortest Path First)</h5><p>OSPF 是目前互联网中最广泛使用的<strong>内部网关协议 (IGP)</strong>。它克服了 RIP 的许多限制，适用于大型、复杂的企业级网络。</p><h6 id="1-基本特性">1. 基本特性</h6><ul><li><strong>算法类型</strong>：基于<strong>链路状态 (Link State, LS)</strong> 路由算法，核心是 <strong>Dijkstra 算法</strong>。</li><li><strong>“开放” (Open)</strong>：表示该协议是公开发布的 IETF 标准（RFC 2328），任何厂商的路由器都可以实现并互相通信，而不像 Cisco 的 IGRP 是私有的。</li><li><strong>收敛速度</strong>：由于每个路由器都掌握全网拓扑，一旦链路状态发生变化，收敛速度远快于 RIP，且不会产生环路。</li></ul><h6 id="2-链路状态通告-LSA-与泛洪-Flooding">2. 链路状态通告 (LSA) 与泛洪 (Flooding)</h6><ul><li><strong>工作机制</strong>：当链路状态（如开启、断开、成本变化）发生改变时，路由器会产生 <strong>LSA (Link State Advertisement)</strong>。</li><li><strong>泛洪 (Flooding)</strong>：LSA 会被发送给 AS 内的所有其他路由器。这意味着 AS 内的<strong>每一个</strong>路由器都拥有一张完全相同的、完整的全网地图（链路状态数据库）。</li><li><strong>更新触发</strong>：除了定时刷新外，一旦状态变化立即触发更新，保证了信息的一致性。</li></ul><h6 id="3-协议栈位置：直接承载于-IP">3. 协议栈位置：直接承载于 IP</h6><ul><li><strong>传输方式</strong>：与 RIP 使用 UDP 不同，OSPF 报文<strong>直接承载在 IP 数据报中</strong>。</li><li><strong>协议号</strong>：IP 首部的协议字段值为 <strong>89</strong>。</li><li><strong>设计意图</strong>：不使用 TCP 或 UDP 是为了减少开销，并确保在传输层协议尚不可用或不稳定的情况下，路由信息仍能高效传递。</li></ul><h6 id="4-高级特性">4. 高级特性</h6><ul><li><strong>安全性 (Security)</strong>：OSPF 支持认证机制。路由器之间交换的报文可以经过 MD5 等算法加密，防止恶意攻击者伪造路由信息。</li><li><strong>多倍路径允许 (ECMP)</strong>：如果到目的地有多条成本相同的路径，OSPF 允许流量在这几条路径上进行负载均衡，而 RIP 只能选一条。</li><li><strong>服务质量 (QoS)</strong>：支持针对不同的 TOS (服务类型) 计算不同的链路成本。</li></ul><h6 id="5-分层-OSPF-Hierarchical-OSPF">5. 分层 OSPF (Hierarchical OSPF)</h6><p>为了在大规模自治系统 (AS) 中限制泛洪带来的开销（避免成千上万台路由器同时泛洪造成网络瘫痪），OSPF 引入了区域化管理：</p><ul><li><strong>区域 (Areas)</strong>：将一个大的 AS 划分为多个小的逻辑块。<ul><li><strong>泛洪限制</strong>：链路状态的详细信息只在区域内部泛洪。</li><li><strong>路由汇总</strong>：区域内部的拓扑对外部不可见，只向外通告汇总后的路径。</li></ul></li><li><strong>骨干区域 (Backbone Area / Area 0)</strong>：<ul><li>它是分层结构的核心，所有非骨干区域必须物理上或逻辑上连接到骨干区域。</li><li>作用：负责在不同非骨干区域之间中转路由信息。</li></ul></li><li><strong>区域边界路由器 (Area Border Routers, ABR)</strong>：<ul><li>位于区域边缘的“外交官”，同时连接骨干区域和其他区域。</li><li>职责：将本区域的路由信息汇总后发给骨干区域，或者将其他区域的信息带回本区域。</li></ul></li><li><strong>AS 边界路由器 (ASBR)</strong>：<ul><li>负责连接当前的 OSPF AS 与其他的 AS（如运行 BGP 的网络）。</li></ul></li></ul><h6 id="6-OSPF-与-RIP-的对比总结">6. OSPF 与 RIP 的对比总结</h6><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">RIP</th><th style="text-align:left">OSPF</th></tr></thead><tbody><tr><td style="text-align:left"><strong>算法</strong></td><td style="text-align:left">距离向量 (DV)</td><td style="text-align:left">链路状态 (LS)</td></tr><tr><td style="text-align:left"><strong>度量标准</strong></td><td style="text-align:left">跳数 (最大15)</td><td style="text-align:left">成本 (通常基于带宽)</td></tr><tr><td style="text-align:left"><strong>收敛速度</strong></td><td style="text-align:left">慢 (可能环路)</td><td style="text-align:left">快</td></tr><tr><td style="text-align:left"><strong>分层支持</strong></td><td style="text-align:left">不支持</td><td style="text-align:left">支持 (Area 分层)</td></tr><tr><td style="text-align:left"><strong>协议承载</strong></td><td style="text-align:left">UDP (端口 520)</td><td style="text-align:left">IP (协议号 89)</td></tr></tbody></table><h4 id="AS-间路由协议-EGP">AS 间路由协议 (EGP)</h4><h5 id="4-6-3-BGP-边界网关协议">4.6.3 BGP (边界网关协议)</h5><p>BGP 是互联网中唯一的 <strong>AS 间 (Inter-AS)</strong> 路由协议，负责将全球数万个自治系统“粘合”在一起。</p><h6 id="1-核心定位">1. 核心定位</h6><ul><li><strong>目标</strong>：不仅寻找路径，更重要的是根据<strong>策略 (Policy)</strong> 实现子网的<strong>可达性 (Reachability)</strong>。</li><li><strong>连接方式</strong>：基于 <strong>TCP</strong> (端口 179) 的半永久连接，称为 <strong>BGP 会话</strong>。</li></ul><h6 id="2-两种会话类型">2. 两种会话类型</h6><ul><li><strong>eBGP (External BGP)</strong>：用于<strong>不同 AS 之间</strong>，从邻居 AS 获取路由信息。</li><li><strong>iBGP (Internal BGP)</strong>：用于<strong>同一 AS 内部</strong>，将从外部学到的路由信息分发给 AS 内的所有路由器。</li></ul><h6 id="3-关键路径属性-Attributes">3. 关键路径属性 (Attributes)</h6><ul><li><strong>AS-PATH</strong>：记录路由经过的所有 AS 编号。<ul><li>作用：<strong>检测环路</strong>（若看到自己 AS 编号则拒绝）；选择较短路径。</li></ul></li><li><strong>NEXT-HOP</strong>：指向通往目的地的下一个具体 IP 地址（通常是相邻 AS 的网关接口）。</li></ul><h6 id="4-路由选择标准-优先级排序">4. 路由选择标准 (优先级排序)</h6><p>BGP 并不简单看跳数或带宽，而是按以下顺序选择：</p><ol><li><strong>本地偏好 (Local Preference)</strong>：由管理员设置，基于政策或经济协议（最高优先级）。</li><li><strong>最短 AS-PATH</strong>：经过的自治系统数量最少。</li><li><strong>热土豆路由 (Hot Potato Routing)</strong>：选择距离本 AS 内部出口最近（IGP 成本最低）的网关。</li><li><strong>其他准则</strong>（如 BGP 标识符 ID 等）。</li></ol><h6 id="5-总结：IGP-vs-BGP">5. 总结：IGP vs BGP</h6><ul><li><strong>IGP (OSPF/RIP)</strong>：在 AS 内部运行，关注<strong>性能（快）</strong>。</li><li><strong>BGP</strong>：在 AS 之间运行，关注<strong>策略（商业/安全/可达性）</strong>。</li></ul><hr><h3 id="软件定义网络-Software-Defined-Networking-SDN">软件定义网络 (Software Defined Networking, SDN)</h3><h4 id="1-传统路由-vs-SDN">1. 传统路由 vs. SDN</h4><ul><li><strong>传统路由 (Per-router control plane):</strong><ul><li><strong>控制平面 (Control Plane)</strong>（运行路由算法如 OSPF, BGP）和<strong>数据平面 (Data Plane)</strong>（根据转发表转发数据包）被<strong>紧密耦合</strong>在同一台路由器中。</li><li>路由器是“整体式”的、封闭的、专有的（如 Cisco IOS）。</li></ul></li><li><strong>SDN (Logically centralized control plane):</strong><ul><li><strong>控制平面与数据平面分离 (Separation)</strong>。</li><li><strong>数据平面：</strong> 由简单的、“哑”的交换机硬件组成。</li><li><strong>控制平面：</strong> 是一个<strong>逻辑上集中 (logically centralized)</strong> 的<strong>远程控制器 (Remote Controller)</strong>，它是一个软件程序。</li><li>控制器负责计算转发表，然后将转发表分发到数据平面的交换机上。</li></ul></li></ul><h4 id="2-为什么需要-SDN？">2. 为什么需要 SDN？</h4><ol><li><strong>易于网络管理：</strong> 集中式编程比在每台路由器上配置分布式算法更容易，可以避免配置错误。</li><li><strong>开放性 (Open)：</strong> 打破了传统路由器厂商的“垂直集成”和“封闭”系统（类比大型机 vs. PC）。</li><li><strong>灵活的流量工程 (Traffic Engineering):</strong><ul><li>传统路由（LS, DV）很难实现精细的流量控制（例如，将 u-z 的流量一半走 uvwz，一半走 uxyz）。</li><li>使用 SDN，控制器可以<em>显式</em>地编程任何它想要的路径。</li></ul></li></ol><h4 id="3-SDN-架构">3. SDN 架构</h4><ol><li><strong>网络控制应用 (Control Applications):</strong><ul><li>SDN 的“大脑”，实现路由、负载均衡、防火墙等逻辑。</li></ul></li><li><strong>SDN 控制器 (SDN Controller / Network OS):</strong><ul><li>维护网络状态（拓扑、交换机信息、流表）。</li><li>为上层应用提供 <strong>北向接口 (Northbound API)</strong>。</li><li>通过 <strong>南向接口 (Southbound API)</strong> 与交换机通信。</li></ul></li><li><strong>数据平面交换机 (Data-plane Switches):</strong><ul><li>根据控制器下发的<strong>流表 (Flow tables)</strong> 进行转发。</li></ul></li></ol><h4 id="4-OpenFlow-南向接口">4. OpenFlow (南向接口)</h4><ul><li>OpenFlow 是 SDN 中事实上的标准南向接口协议。</li><li><strong>核心思想：</strong> <strong>基于流 (flow-based)</strong> 的<strong>广义转发 (generalized forwarding)</strong>。</li><li><strong>流表 (Flow Table):</strong><ul><li><strong>匹配 (Pattern):</strong> 匹配数据包头部的多个字段（L2 MAC, L3 IP, L4 Port 等）。</li><li><strong>动作 (Actions):</strong> 转发 (forward)、丢弃 (drop)、修改 (modify) 或发送到控制器 (send to controller)。</li></ul></li><li><strong>OpenFlow 统一了多种设备：</strong><ul><li><strong>路由器：</strong> 匹配目的 IP -&gt; 动作：转发。</li><li><strong>交换机：</strong> 匹配目的 MAC -&gt; 动作：转发/泛洪。</li><li><strong>防火墙：</strong> 匹配 IP/Port -&gt; 动作：允许/拒绝。</li><li><strong>NAT：</strong> 匹配 IP/Port -&gt; 动作：重写地址/端口。</li></ul></li><li><strong>OpenFlow 协议消息：</strong><ul><li><strong>控制器 -&gt; 交换机：</strong> <code>Modify-state</code> (添加/删除流表项), <code>Packet-out</code> (将一个特定数据包从指定端口发出)。</li><li><strong>交换机 -&gt; 控制器：</strong> <code>Packet-in</code> (收到一个无法匹配流表的包，请求控制器指示), <code>Port-status</code> (报告端口/链路故障)。</li></ul></li></ul><h4 id="5-“软件定义”-Software-Defined-的本质">5. “软件定义” (Software Defined) 的本质</h4><ul><li><strong>定义：</strong> 用软件去定义系统的功能，用软件给硬件赋能。</li><li><strong>本质：</strong> “深度”可编程。将原来硬件中“写死”的功能，以软件可编程的方式来实现。</li><li><strong>API：</strong> 解除了软硬件之间的耦合关系。</li><li><em>类比：</em> 操作系统、虚拟机 (VM)、容器 (Containers)、智能手机（相对于功能机）都是“软件定义”思想的体现。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-03-Network-Layer-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-03-Network-Layer-02/"/>
    <published>2026-01-14T19:05:00.000Z</published>
    <summary>路由算法 (Routing Algorithms)</summary>
    <title>Network - 03.Network Layer-02</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success **主要任务**">            <ul><li><strong>主要任务：</strong> 将数据报 (datagrams) 从源主机跨越多个网络<strong>路由 (routing)</strong> 到目标主机。<ul><li><strong>逻辑寻址 (Addressing)：</strong> 定义全局唯一的 IP 地址（如 IPv4、IPv6）来标识网络中的主机 。</li><li><strong>路由 (Routing)：</strong> 决定数据包从源到目标的最佳路径。这是通过路由算法（如链路状态算法 或距离向量算法 ）实现的。</li><li><strong>转发 (Forwarding)：</strong> (讲稿第 4 章内容) 路由器根据转发表将数据包从输入端口移动到正确的输出端口。</li><li><strong>数据报封装：</strong> 将来自传输层的报文段 (segment) 封装成数据报 (datagram) 。</li><li><strong>地址管理：</strong> CIDR 和路由地址聚合 用于高效管理地址空间。</li></ul></li></ul>          </div><h2 id="第-4-章：网络层-Chapter-4-Network-Layer">第 4 章：网络层 (Chapter 4: Network Layer)</h2><h3 id="4-1-简介-Introduction">4.1 简介 (Introduction)</h3><p>网络层 (Network Layer) 的主要任务是实现<mark><strong>主机到主机 (host-to-host)</strong></mark> 的通信。它负责将<strong>报文段 (segment)</strong>（来自传输层的数据单元）从源主机安全、准确地传输到目的主机。<br>* <strong>主机到主机通信</strong>：与传输层负责的进程到进程通信不同，网络层关注的是将数据从一台计算机发送到另一台计算机，而不关心这些数据最终是由哪个应用程序接收的。 <br>* <strong>无处不在</strong>：网络是互联网的核心，因此网络中的每一个<strong>主机 (host)</strong> 和每一个<strong>路由器 (router)</strong> 都必须实现网络层协议。</p><h4 id="1-网络层的功能">1. 网络层的功能</h4><ul><li><strong>发送端主机</strong>：<ul><li>网络层从上层的传输层接收<strong>报文段 (segment)</strong>。</li><li>它将这些报文段进行<strong>封装 (encapsulates)</strong>，即在报文段前面加上网络层的首部信息（如源IP地址、目的IP地址等），形成<strong>数据报 (datagram)</strong>。</li><li>封装好的数据报随后被传递给链路层进行发送。</li></ul></li><li><strong>网络中的路由器</strong>：<ul><li>当一个数据报到达路由器的输入链路时，路由器的网络层会<strong>检查数据报的首部字段</strong>。</li><li>通过检查首部中的目的地址，路由器决定将该数据报转发到哪个输出链路。</li></ul></li><li><strong>接收端主机</strong>：<ul><li>当数据报到达目的主机时，网络层接收该数据报。 *它会去掉网络层首部，取出其中的<strong>报文段</strong>，并将其向上递交给<strong>传输层</strong>。</li></ul></li></ul><h4 id="2-两个关键功能：转发与路由">2. 两个关键功能：转发与路由</h4><ul><li><strong>转发 (Forwarding):</strong><ul><li><strong>定义</strong>：转发（有时也称为<strong>交换 Switching</strong>）是指将数据包从路由器的<strong>输入接口</strong>移动到适当的<strong>输出接口</strong>的过程。 <br>* <strong>性质</strong>：这是一个在<strong>单个路由器内部</strong>发生的<strong>本地 (local)</strong> 动作。</li><li><strong>层面</strong>：转发是在<strong>数据平面 (Data Plane)</strong> 上执行的。数据平面指的是路由器中负责实际处理和传送用户数据报的部分。</li><li><strong>实现</strong>：转发通常必须非常快（纳秒到微秒级别），因此通常由专用硬件来完成。路由器通过查询其内部的<strong>转发表 (forwarding table)</strong> 来决定将数据报发送到哪个输出端口。</li></ul></li><li><strong>路由 (Routing):</strong> 决定数据包从源到目标所采用的路径。这是在“控制平面”(Control Plane)上执行的全局操作。<br>* <strong>定义</strong>：路由是指确定数据包从源主机到目的主机所经过的<strong>整体路径</strong>的过程。<ul><li><strong>性质</strong>：这是一个涉及整个网络的<strong>全局 (global)</strong> 动作。它需要了解网络的拓扑结构和链路状态。</li><li><strong>层面</strong>：路由是在<strong>控制平面 (Control Plane)</strong> 上执行的。控制平面负责管理网络的逻辑和决策，它决定了数据报应该如何流动。</li></ul><ul><li><strong>实现</strong>：路由通常通过在路由器上运行复杂的<strong>路由算法 (Routing algorithms)</strong> 来实现。这些算法计算出最佳路径，并据此填充和更新路由器的<strong>转发表</strong>。路由计算的时间尺度通常比转发要慢得多（秒到分钟级别），并且通常由软件实现。</li></ul></li><li><strong>路由算法 (Routing algorithms)</strong> 决定了路由器的<strong>转发表 (forwarding table)</strong>。路由算法生成 <strong>路由表 (RIB)</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 经过优选和编译 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 生成 <strong>转发表 (FIB)</strong>。</li></ul><blockquote><p><strong>比喻：</strong></p><ul><li><strong>路由 (Routing)</strong> 就像是规划一次从源头到目的地的完整旅行路线。</li><li><strong>转发 (Forwarding)</strong> 就像是在一个交叉路口（路由器）决定从哪条路（输出端口）离开。</li></ul></blockquote><h4 id="3-连接建立-Connection-Setup">3. 连接建立 (Connection Setup)</h4><ul><li>某些网络架构（如 ATM, X.25）中存在<strong>连接建立 (Connection setup)</strong>。</li><li>在数据流开始前，端系统和中间的路由器会建立<strong>虚连接 (virtual connection)</strong>。</li><li>这与传输层的连接（进程到进程）不同，网络层的连接是主机到主机 (host-to-host) 的。</li></ul><h4 id="4-网络服务模型-Network-Service-Model">4. 网络服务模型 (Network Service Model)</h4><ul><li><strong>网络服务模型</strong>本质上是网络（快递公司）和用户（发件人）之间的一份 <strong>“服务合同”</strong>。它定义了当你把一个数据包（包裹）交给网络后，网络承诺会如何对待这个包裹。在这个“合同”里，可能会包含以下条款：<ul><li><strong>确保送达吗？</strong> (Guaranteed delivery) —— 丢件了赔不赔？</li><li><strong>有时限吗？</strong> (Delay) —— 承诺3天内必达吗？</li><li><strong>不仅送达，还要按顺序吗？</strong> (In-order) —— 我发了包裹A和包裹B，你能保证A先到，B后到吗？</li><li><strong>带宽保证吗？</strong> (Bandwidth) —— 能给我预留一条专用车道，确保我不堵车吗？</li></ul></li><li><strong>服务示例：</strong><ul><li><strong>单个数据报：</strong> 保证交付 (guaranteed delivery)、带延迟上界的保证交付 (guaranteed delivery with delay)。</li><li><strong>数据流：</strong> 按序数据报交付 (in-order datagram delivery)、保证最小带宽 (guaranteed minimum bandwidth)。</li></ul></li><li><strong>互联网 (Internet)</strong> 的服务模型是 <strong>尽力而为 (best effort)</strong>：<ul><li>不保证带宽 (Bandwidth)</li><li>不保证不丢包 (Loss)</li><li>不保证按序 (Order)</li><li>不保证时序 (Timing)</li></ul></li><li><strong>ATM</strong> 提供了多种服务模型，如 CBR (恒定比特率)、VBR (可变比特率) 等，提供严格的保证。<ul><li><strong>ATM (Asynchronous Transfer Mode)</strong> 是老一代的电信网络技术（主要用于电话网核心）</li><li><strong>CBR (Constant Bit Rate，恒定比特率)</strong>：<ul><li>就像传统的电话线路。网络承诺：“我给你预留一条 64kbps 的专用通道，不管网络多忙，这条通道都是你的，延时极低且固定。”这非常适合传输语音，但如果没人说话，这带宽就浪费了。</li></ul></li></ul><ul><li><strong>VBR (Variable Bit Rate，可变比特率)</strong>：<ul><li>允许速率在一定范围内波动，但依然有严格的平均带宽和延迟保证。</li></ul></li></ul></li></ul><hr><h3 id="4-2-虚电路和数据报网络-Virtual-Circuit-and-Datagram-Networks">4.2 虚电路和数据报网络 (Virtual Circuit and Datagram Networks)</h3><p>网络层可以提供两种服务：</p><ol><li><strong>数据报网络 (Datagram network)</strong> 提供网络层的<strong>无连接服务 (connectionless service)</strong>。</li><li><strong>虚电路网络 (Virtual circuit network)</strong> 提供网络层的<strong>连接服务 (connection service)</strong>。</li></ol><h4 id="1-虚电路-Virtual-Circuits-VCs">1. 虚电路 (Virtual Circuits - VCs)</h4><ul><li>VC 网络的行为类似于电话电路，在数据传输前需要建立连接。</li><li><strong>流程：</strong> 1. 呼叫建立 (call setup) -&gt; 2. 数据流动 -&gt; 3. 呼叫拆除 (teardown)。</li><li>每个数据包携带 <strong>VC 标识符 (VC identifier)</strong>，而不是目的主机地址。</li><li>路径上的每个路由器都为通过的连接维护<strong>状态 (state)</strong>。</li><li><strong>信令协议 (Signaling protocols)</strong> (如 ATM, X.25) 用于建立、维护和拆除 VC。</li><li><strong>互联网不使用信令协议</strong>。</li></ul><h4 id="2-数据报网络-Datagram-Networks">2. 数据报网络 (Datagram Networks)</h4><ul><li>这是互联网采用的模式。</li><li>网络层<strong>没有呼叫建立 (no call setup)</strong>。</li><li>路由器<strong>不维护 (no state)</strong> 关于端到端连接的状态。</li><li>数据包使用<strong>目的主机地址 (destination host address)</strong> 进行转发。</li><li>同一源-目标对之间的数据包可能走<strong>不同路径</strong>。</li><li><strong>转发表 (Forwarding table)</strong> 是基于目的地址范围的。存储的是<mark>前缀</mark></li><li><strong>最长前缀匹配 (Longest prefix matching):</strong> 路由器在转发表中查找与数据包目的地址匹配的“最具体”的条目（即前缀最长的条目），并据此转发。</li><li>通过这种方式，路由器的转发表可以非常紧凑和高效。它不需要知道 40 亿个地址，它可能只需要几万到几十万个“前缀”（即地址范围）就能覆盖整个互联网的路由。</li></ul><h4 id="3-对比：数据报-vs-虚电路">3. 对比：数据报 vs. 虚电路</h4><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">数据报网络 (Internet)</th><th style="text-align:left">虚电路网络 (ATM)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>设计目标</strong></td><td style="text-align:left">计算机数据交换（弹性服务）</td><td style="text-align:left">电话网演进（严格时序）</td></tr><tr><td style="text-align:left"><strong>端系统</strong></td><td style="text-align:left">“智能” (Smart end systems)</td><td style="text-align:left">“哑” (Dumb end systems)</td></tr><tr><td style="text-align:left"><strong>复杂性</strong></td><td style="text-align:left"><strong>在“边缘” (complexity at “edge”)</strong></td><td style="text-align:left"><strong>在“内部” (complexity inside network)</strong></td></tr></tbody></table><hr><h3 id="4-3-路由器内部-What’s-Inside-a-Router">4.3 路由器内部 (What’s Inside a Router)</h3><h4 id="1-路由器架构-Router-Architecture">1. 路由器架构 (Router Architecture)</h4><ul><li><strong>路由处理器 (Routing processor):</strong> (运行在控制平面)<ul><li>执行路由协议（如 OSPF, BGP）。</li><li>维护路由表。</li><li>计算转发表。</li></ul></li><li><strong>交换与转发：</strong> (运行在数据平面)<ul><li><strong>输入端口 (Input port)</strong></li><li><strong>交换结构 (Switching fabric)</strong></li><li><strong>输出端口 (Output port)</strong></li></ul></li></ul><h4 id="2-输入端口-Input-Port">2. 输入端口 (Input Port)</h4><ul><li><strong>功能：</strong><ol><li>物理层：接收比特。接收光纤或网线传来的光电信号，把它们还原成 0 和 1 的比特流。</li><li>数据链路层：解封装。从以太网帧头取出里面的 IP 数据包。</li><li>网络层：查找转发表，决定输出端口。</li></ol></li><li><strong>去中心化交换 (Decentralized switching):</strong> 路由处理器把计算好的“转发表”，<strong>复制</strong>一份给每一个输入端口。在输入端口<strong>本地维护</strong>一份转发表的副本，以实现<strong>线速 (line speed)</strong> 处理，避免路由处理器成为瓶颈。</li><li>如果数据报到达速度快于转发速率，会发生<strong>队列 (queuing)</strong>。</li></ul><h4 id="3-交换结构-Switching-Fabric">3. 交换结构 (Switching Fabric)</h4><ul><li><p><strong>功能：</strong> 将数据包从输入端口连接到输出端口。</p></li><li><p><strong>三种类型：</strong></p><ol><li><strong>通过内存交换 (Switching Via Memory):</strong><ul><li>第一代路由器。由 CPU 控制。</li><li>数据包需要两次穿过系统总线（输入-&gt;内存，内存-&gt;输出）。</li><li>速度受限于内存带宽。</li></ul></li><li><strong>通过总线交换 (Switching Via a Bus):</strong><ul><li>输入端口通过<strong>共享总线</strong>将数据报传输到输出端口。</li><li>速度受限于总线带宽，存在<strong>总线竞争 (bus contention)</strong>。</li></ul></li><li><strong>通过互连网络交换 (Switching Via An Interconnection Network):</strong><ul><li>例如<strong>纵横式交换机 (crossbar switch)</strong>。</li><li>克服总线带宽限制，可并行转发多个数据包。</li></ul></li></ol></li></ul><h4 id="4-输出端口-Output-Port">4. 输出端口 (Output Port)</h4><ul><li><strong>功能：</strong><ol><li>网络层：排队（缓冲区管理）。<ul><li><strong>缓冲区管理</strong>：这是输出端口最忙碌的工作。如果交换结构送来的包太快，而外面的网线（链路）发得太慢，数据包就必须在这里<strong>排队</strong>。</li><li><strong>丢包</strong>：如果缓冲区（排队大厅）满了，新来的数据包就会被无情地丢弃（Packet Drop）。</li></ul></li><li>数据链路层：封装（添加头部和尾部）。<ul><li>数据包在路由器内部“裸奔”（只有 IP 内容）。在发出去之前，必须给它穿上“外套”。</li><li>比如，如果出口连的是以太网，就要加上<strong>以太网帧头 (Header)</strong> 和 <strong>帧尾 (Trailer)</strong>。</li></ul></li><li>物理层：发送比特。<ul><li>这是最后一步。将封装好的帧（Frame）转换成光信号或电信号，推送到网线上。</li></ul></li></ol></li><li><strong>缓冲 (Buffering)</strong> 是必需的：当数据报从交换结构到达的速率快于输出链路的传输速率时。</li><li><strong>调度策略 (Scheduling discipline)</strong> 决定了在队列中选择哪个数据包进行下一次传输（例如 FIFO 或<br>WFQ）。<ul><li><strong>FIFO (First-In-First-Out, 先进先出)</strong>：<ul><li><strong>最简单</strong>：大家按顺序排队，谁先来谁先走。</li><li><strong>缺点</strong>：不灵活。如果前面有个巨大的数据包在传，后面紧急的语音通话数据包也得干等（导致语音卡顿）。</li></ul></li><li><strong>优先级队列 (Priority Queuing)</strong>：<ul><li><strong>VIP 通道</strong>：给数据包分类。比如，标记为“VoIP 语音”或“网络管理”的包属于高优先级。</li><li><strong>机制</strong>：只要高优先级队列里有包，就先发高优先级的；只有高优先级空了，才发普通优先级的（如邮件、下载）。</li></ul></li><li><strong>WFQ (Weighted Fair Queuing, 加权公平队列)</strong>：<ul><li><strong>相对公平</strong>：它把排队的包按“流 (Flow)”（比如视频流、网页流）分开。</li><li><strong>机制</strong>：各个流轮流发送，但是<strong>权重</strong>不同。比如给视频流分配 50% 的带宽，给网页流分配 20%。这样既保证了关键业务，又不会让低优先级的业务完全饿死。</li></ul></li></ul></li></ul><h4 id="5-队列-Queuing">5. 队列 (Queuing)</h4><ul><li><strong>队列发生的位置：</strong> 输入端口和输出端口都可能发生。</li><li><strong>缓冲区大小 (Buffering Size):</strong><ul><li><em>传统经验法则 (RFC 3439):</em> 缓冲区大小 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mi>R</mi><mi>T</mi><mi>T</mi><mo>⋅</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">B = RTT \cdot C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span> (往返时间 * 链路容量)。</li><li><em>近期推荐：</em> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mfrac><mrow><mi>R</mi><mi>T</mi><mi>T</mi><mo>⋅</mo><mi>C</mi></mrow><msqrt><mi>N</mi></msqrt></mfrac></mrow><annotation encoding="application/x-tex">B = \frac{RTT \cdot C}{\sqrt{N}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.4103em;vertical-align:-0.538em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8723em;"><span style="top:-2.5374em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord sqrt mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9323em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mtight" style="padding-left:0.833em;"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span><span style="top:-2.8923em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1077em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">RTT</span><span class="mbin mtight">⋅</span><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.538em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span> (N 为流的数量)。</li></ul></li><li><strong>输入队列的队头阻塞 (Head-of-the-Line (HOL) blocking):</strong><ul><li>当输入队列的第一个数据包（例如，一个红色的包）因其目标输出端口忙碌而被阻塞时，它会阻止队列中后续的数据包（例如，一个绿色的包），即使绿色包的目标输出端口是空闲的。</li></ul></li><li><strong>输出端口的队列：</strong><ul><li>当多个输入端口同时向同一个输出端口发送数据包，且速度超过输出链路容量时，会在输出端口形成队列。</li></ul></li></ul><hr><h3 id="4-4-IP：互联网协议-IP-Internet-Protocol">4.4 IP：互联网协议 (IP: Internet Protocol)</h3><p><strong>互联网网络层</strong></p><p>互联网网络层相关的三个主要协议：</p><ol><li><strong>IP 协议 (IP protocol):</strong> 寻址、数据报格式、分片等。<mark>网络层只有这一个协议</mark></li><li><strong>路由协议 (Routing protocols):</strong> 路径选择 (如 RIP, OSPF, BGP)。</li><li><strong>ICMP 协议 (ICMP protocol):</strong> 错误报告、网络查询。</li></ol><h4 id="4-4-1-IP-数据报格式-IPv4-Datagram-Format">4.4.1 IP 数据报格式 (IPv4 Datagram Format)</h4><ul><li><strong>版本 (Version):</strong> 4 (表示 IPv4)。</li><li><strong>首部长度 (Header length):</strong> IP 头部的长度（以 32 位字为单位即4字节）。</li><li><strong>总长度 (Total length):</strong> 整个数据报（首部 + 数据）的长度（以字节为单位）。</li><li><strong>标识 (Identifier), 标志 (Flags), 片偏移 (Fragment offset):</strong> 这三个字段用于 IP 分片。<ul><li><strong>标识 (Identifier)</strong>: 16 bits。主机发送的每个数据报都有唯一的 ID。当数据报被分片时，所有分片都复制同一个 ID，以便接收方能将它们识别为同一个原始包。</li><li><strong>标志 (Flags)</strong>: 3 bits。<ul><li>Bit 0: 保留。</li><li>Bit 1: <strong>DF (Don’t Fragment)</strong>。如果置 1，强制路由器不要分片（如果包太大传不过去，路由器只能丢包并报错）。</li><li>Bit 2: <strong>MF (More Fragments)</strong>。如果置 1，表示后面还有分片；如果置 0，表示这是最后一个分片。</li></ul></li><li><strong>片偏移 (Fragment Offset)</strong>: 13 bits。指示当前分片在原始数据报中的位置。用于接收方将乱序到达的分片重新拼装。</li></ul></li><li><strong>生存时间 (Time to Live - TTL):</strong> 数据包在网络中可通过的最大跳数。<strong>每经过一个路由器减 1</strong>，若减到 0，则丢弃该包（防止无限循环）。<ul><li><strong>目的</strong>: 防止路由环路（Routing Loop）。如果路由表配置错误导致数据包在网络中无限兜圈子，TTL 最终会减为 0。</li></ul></li><li><strong>上层协议 (Upper layer protocol):</strong> 指示负载 (payload) 应交付给哪个传输层协议（例如 TCP (6) 或 UDP (17)）。</li><li><strong>首部校验和 (Header checksum):</strong> <strong>仅对头部</strong>进行校验。每经过一个路由器都会重新计算（因为 TTL 字段会改变）。（数据部分的校验由 TCP/UDP 自己负责）因为 TTL 字段在每经过一个路由器时都会改变，所以<strong>校验和必须在每个路由器上重新计算</strong>。</li><li><strong>源 IP 地址 (Source IP address):</strong> 32 位。</li><li><strong>目的 IP 地址 (Destination IP address):</strong> 32 位。</li><li><strong>选项 (Options):</strong> (可选) 用于时间戳、记录路由等。</li><li><strong>开销 (Overhead):</strong><ul><li>一个典型的 IP 头部有 <strong>20 字节</strong> (没有选项时)。</li><li>一个典型的 TCP 头部有 <strong>20 字节</strong>。</li><li>因此，传输数据至少有 40 字节的头部开销。</li></ul><ul><li><strong>意义</strong>: 如果你只发送 1 个字节的数据（例如 Telnet 按键），实际需要传输 41 字节。这就解释了为什么在流媒体或游戏中，我们倾向于尽量填满数据包载荷，以提高带宽利用率。<br>网络层的功能是从<mark>主机到主机</mark>的，而不是从<mark>进程到进程</mark>的，所以没有端口号。</li></ul></li></ul><h5 id="IP-分片与重组-IP-Fragmentation-Reassembly">IP 分片与重组 (IP Fragmentation &amp; Reassembly)</h5><ul><li><strong>最大传输单元 (Max Transfer Unit - MTU):</strong> 链路层帧能承载的最大数据量。</li><li><strong>分片 (Fragmentation):</strong> 当一个 IP 数据报大于链路的 MTU 时，路由器会将其分割成多个较小的数据报（<strong>分片 (fragments)</strong>）。</li><li><strong>重组 (Reassembly):</strong> <mark>只在<strong>最终目的地 (final destination)</strong> 进行</mark>。</li><li><em>示例：</em> 一个 4000 字节的数据报（20 字节头 + 3980 字节数据）在 MTU=1500 字节的链路上分片：<ol><li><strong>片 1：</strong> 1500 字节（20 字节头 + 1480 字节数据）。<ul><li><code>fragflag=1</code> (表示还有更多分片)</li><li><code>offset=0</code></li></ul></li><li><strong>片 2：</strong> 1500 字节（20 字节头 + 1480 字节数据）。<ul><li><code>fragflag=1</code></li><li><code>offset=185</code> (偏移量以 8 字节为单位, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>185</mn><mo>×</mo><mn>8</mn><mo>=</mo><mn>1480</mn></mrow><annotation encoding="application/x-tex">185 \times 8 = 1480</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">185</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">8</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1480</span></span></span></span>)</li></ul></li><li><strong>片 3：</strong> 1040 字节（20 字节头 + 1020 字节数据）。<ul><li><code>fragflag=0</code> (表示这是最后的分片)</li><li><code>offset=370</code> (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>370</mn><mo>×</mo><mn>8</mn><mo>=</mo><mn>2960</mn></mrow><annotation encoding="application/x-tex">370 \times 8 = 2960</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">370</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">8</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2960</span></span></span></span>)</li></ul></li></ol></li></ul><table><thead><tr><th style="text-align:left">分片</th><th style="text-align:left">数据部分 (Bytes)</th><th style="text-align:left">头部 (Bytes)</th><th style="text-align:left">总长度 (Total Length)</th><th style="text-align:left">标志 (MF)</th><th style="text-align:left">偏移 (Offset)</th><th style="text-align:left">实际对应的原始字节位置</th></tr></thead><tbody><tr><td style="text-align:left"><strong>片 1</strong></td><td style="text-align:left">1480</td><td style="text-align:left">20</td><td style="text-align:left">1500</td><td style="text-align:left">1 (还有)</td><td style="text-align:left">0</td><td style="text-align:left">0 ~ 1479</td></tr><tr><td style="text-align:left"><strong>片 2</strong></td><td style="text-align:left">1480</td><td style="text-align:left">20</td><td style="text-align:left">1500</td><td style="text-align:left">1 (还有)</td><td style="text-align:left">185</td><td style="text-align:left">1480 ~ 2959</td></tr><tr><td style="text-align:left"><strong>片 3</strong></td><td style="text-align:left">1020</td><td style="text-align:left">20</td><td style="text-align:left">1040</td><td style="text-align:left">0 (没了)</td><td style="text-align:left">370</td><td style="text-align:left">2960 ~ 3979</td></tr></tbody></table><div class="note note-info">            <p>之所以容易混淆，是因为在计算中出现了两次“20 字节”：</p><ol><li><strong>原始包的 20 字节</strong>：这是<strong>原始 IP 头部</strong>。我们在计算 Payload 时把它减掉了 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4000</mn><mo>−</mo><mn>20</mn><mo>=</mo><mn>3980</mn></mrow><annotation encoding="application/x-tex">4000 - 20 = 3980</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4000</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">20</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3980</span></span></span></span>)。</li><li><strong>分片时的 20 字节</strong>：这是<strong>新生成的 IP 头部</strong>。我们在计算每个分片能装多少数据时把它减掉了 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1500</mn><mo>−</mo><mn>20</mn><mo>=</mo><mn>1480</mn></mrow><annotation encoding="application/x-tex">1500 - 20 = 1480</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1500</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">20</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1480</span></span></span></span>)。</li></ol><p>题目中看到的“20 字节头”，在分片计算的语境下，始终指的是 IP 协议的头部。TCP 头部在这个过程中被当成了<strong>数据</strong>的一部分，被切分到了第一个分片里。</p>          </div><h4 id="4-4-2-IPv4-寻址-IPv4-Addressing">4.4.2 IPv4 寻址 (IPv4 Addressing)</h4><h5 id="1-IP-地址-IP-Address-与-接口-Interface"><strong>1. IP 地址 (IP Address) 与 接口 (Interface)</strong></h5><ul><li><strong>核心定义：</strong> IP 地址并不直接标识一台“主机”或“路由器”，而是标识它们的一个<strong>接口 (Interface)</strong>。<ul><li><strong>主机 (Host)：</strong> 通常有<strong>一个或两个接口</strong>（例如有线网卡 + 无线网卡），每个接口都需要一个独立的 IP 地址。</li><li><strong>路由器 (Router)：</strong> 路由器的工作就是在不同网络间转发数据，因此它必须至少有两个或更多的接口。每个接口连接到一个不同的网络，因此<strong>每个接口都有一个属于该特定网络的 IP 地址</strong>。</li></ul></li><li><strong>直观理解：</strong> IP 地址就像是“门牌号”。路由器像是一座连接多条街道（网络）的建筑物，它在每条街道上都有一个大门（接口），每个大门都需要挂上对应街道的门牌号。</li></ul><h5 id="2-子网-Subnet"><strong>2. 子网 (Subnet)</strong></h5><p>子网是理解 IP 网络的基石。</p><ul><li><p><strong>什么是子网？</strong></p><ul><li><strong>物理层面：</strong> 想象一个“孤岛”。如果你把路由器的电源拔掉，甚至把路由器从网络中移除，剩下的设备如果仍然能够通过<mark>交换机</mark>（Switch）或<mark>直接连线互相通信</mark>（发送以太网帧），那么这些设备就构成了一个子网。</li><li><strong>逻辑层面：</strong> 属于同一个子网的接口，其 IP 地址的<strong>网络前缀 (Network Prefix)</strong> 部分必须完全相同。</li></ul></li><li><p><strong>子网掩码 (Subnet Mask) 的作用：</strong></p><ul><li>计算机无法通过肉眼判断 IP 地址哪部分是网络号，哪部分是主机号。子网掩码就是一把“尺子”，用来划分界限。</li><li>例如：<code>255.255.255.0</code> (二进制为 24 个 1) 告诉计算机，IP 地址的前 24 位是子网部分，剩下的 8 位是主机部分。</li></ul></li><li><p><strong>如何判断一个网络中有几个子网？</strong></p><ul><li><strong>方法：</strong> 找到网络拓扑图中的每一个路由器接口。以该接口为中心，向外发散，直到碰到其他路由器接口或终点（主机）。这一片区域就是一个子网。</li><li><strong>注意：</strong> 两个路由器之间的点对点链路（Point-to-Point Link）本身也是一个独立的子网。</li></ul></li></ul><h5 id="3-CIDR-Classless-InterDomain-Routing-——-无类域间路由"><strong>3. CIDR (Classless InterDomain Routing) —— 无类域间路由</strong></h5><p>这是现代互联网分配 IP 地址的标准，它废除了早期死板的 A类、B类、C类 地址划分。</p><ul><li><strong>表示法：</strong> <code>a.b.c.d/x</code><ul><li><code>x</code> 称为前缀长度。</li><li><strong>前 x 位：</strong> 是网络部分（子网 ID）。这部分一旦确定，该子网内所有设备的前 x 位必须一样。</li><li><strong>后 (32-x) 位：</strong> 是主机部分。用于区分子网内的不同设备。</li></ul></li><li><strong>计算能力：</strong><ul><li><strong>子网大小：</strong> 一个 <code>/x</code> 的子网可以容纳 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mo stretchy="false">(</mo><mn>32</mn><mo>−</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></msup><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">2^{(32-x)} - 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9713em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">32</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">x</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 台主机。</li><li><em>为什么要减 2？</em> 因为主机号全为 0 的地址代表<strong>本网络地址</strong>，主机号全为 1 的地址代表<strong>本子网广播地址</strong>，这两个不能分配给具体设备。</li><li><em>示例：</em> <code>/24</code> 子网（即掩码 255.255.255.0）有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>32</mn><mo>−</mo><mn>24</mn><mo>=</mo><mn>8</mn></mrow><annotation encoding="application/x-tex">32-24=8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">32</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">24</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">8</span></span></span></span> 位主机号。可分配地址为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>8</mn></msup><mo>−</mo><mn>2</mn><mo>=</mo><mn>254</mn></mrow><annotation encoding="application/x-tex">2^8 - 2 = 254</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">254</span></span></span></span> 个。</li></ul></li></ul><h5 id="4-层次化寻址与路由聚合-Route-Aggregation"><strong>4. 层次化寻址与路由聚合 (Route Aggregation)</strong></h5><p>这是为了解决互联网路由表过于庞大而设计的机制，也称为<strong>超网 (Supernetting)</strong>。</p><ul><li><p><strong>问题背景：</strong></p><ul><li>假设一个 ISP（互联网服务提供商）拥有 8 个连续的 <code>/24</code> 小网段。如果它向全球互联网通告这 8 个独立的路由信息，全球所有核心路由器的路由表都会增加 8 行。这非常浪费资源。</li></ul></li><li><p><strong>解决方案 (路由聚合)：</strong></p><ul><li>ISP 就像一个大的邮局分拣中心。它不告诉外界“我这里有A小区、B小区、C小区…”，而是直接告诉外界“所有邮编开头是 100xxx 的信件都给我”。</li><li><strong>技术实现：</strong> 将这 8 个小网段的共同前缀提取出来，合并成一个更短前缀（例如 <code>/21</code>）的大块地址。</li><li>ISP 只向外界通告这一个 <code>/21</code> 的聚合路由。</li></ul></li><li><p><strong>最长前缀匹配 (Longest Prefix Match)：</strong></p><ul><li>如果路由表中存在一条聚合路由（例如 <code>200.23.16.0/20</code>，指向 ISP A）和一条特例路由（例如 <code>200.23.18.0/24</code>，指向 ISP B），当数据包的目标是 <code>200.23.18.1</code> 时，路由器会优先选择<strong>掩码最长（匹配最精确）</strong> 的那条路（即 <code>/24</code> 指向的 ISP B）。这就是为什么聚合不会导致特例路由失效。</li></ul></li></ul><h5 id="5-ICANN-的角色"><strong>5. ICANN 的角色</strong></h5><ul><li><strong>全称：</strong> Internet Corporation for Assigned Names and Numbers。</li><li><strong>职责：</strong> 它是互联网的“大管家”。<ul><li><strong>分配 IP 地址：</strong> 它不直接给个人分 IP，而是把大块的 IP 地址块分配给区域互联网注册机构 (RIRs，如亚太区的 APNIC)。</li><li><strong>管理 DNS 根域：</strong> 确保全球域名解析系统的根基稳定。</li></ul></li></ul><h5 id="6-DHCP：动态主机配置协议-DHCP-Dynamic-Host-Configuration-Protocol">6. DHCP：动态主机配置协议 (DHCP: Dynamic Host Configuration Protocol)</h5><ul><li><strong>功能：</strong> 允许主机在加入网络时从服务器<strong>动态获取 (dynamically obtain)</strong> 其 IP 地址。</li><li><strong>DHCP 交互过程 (D-O-R-A)：</strong><ol><li><strong>Discover (发现):</strong> 主机广播 “DHCP discover” 消息。（源: 0.0.0.0, 目的: 255.255.255.255）</li><li><strong>Offer (提供):</strong> DHCP 服务器响应 “DHCP offer” 消息，提供一个 IP 地址及租期。</li><li><strong>Request (请求):</strong> 主机广播 “DHCP request” 消息，请求所提供的地址。</li><li><strong>Ack (确认):</strong> DHCP 服务器发送 “DHCP ack” 消息，确认地址分配。</li></ol></li></ul><ul><li>后两步使用广播（Broadcast）看起来似乎效率不高，但它们是 DHCP 协议设计中非常关键的环节，主要是为了<strong>解决潜在的冲突</strong>和<strong>确保消息的可靠传递</strong>。<ul><li><p><strong>通知“中选”的服务器（服务器 A）：</strong> “我确定要用你提供的 IP 地址！”</p></li><li><p><strong>通知所有“落选”的服务器（服务器 B）：</strong> “我不要你们的 IP 地址了！” 这样，其他服务器（服务器 B）就可以收回它们之前保留的 IP 地址（192.168.1.150），并将其分配给其他需要的主机。</p></li><li><p>如果服务器将 <code>Ack</code> <strong>单播</strong>（直接发送）到那个新分配的 IP 地址（例如 <code>223.1.2.4</code> ），主机的网络功能可能还没有完全准备好接收发往这个新地址的数据包。这个 <code>Ack</code> 很可能会丢失。</p></li><li><p>因此，服务器采用最稳妥的方式：<strong>广播</strong> <code>Ack</code> 消息 。</p></li><li><p>主机此时仍然在监听来自 0.0.0.0 的广播消息。当它收到这个 <code>Ack</code> 广播时，它会检查消息中的事务 ID (Transaction ID) 和自己的 MAC 地址，确认是发给自己的，然后才正式将 <code>223.1.2.4</code> 这个 IP 地址配置到自己的网络接口上</p></li></ul></li></ul><h5 id="7-NAT：网络地址转换-NAT-Network-Address-Translation">7. NAT：网络地址转换 (NAT: Network Address Translation)</h5><ul><li><strong>动机：</strong><ul><li>本地网络（如家庭网络）对外界<strong>只使用一个 IP 地址</strong>。</li><li>解决了 IPv4 地址短缺问题。</li><li><strong>安全性：</strong> 本地网络中的设备对外界不可见/不可寻址。</li></ul></li><li><strong>实现：</strong> NAT 路由器维护一个 <strong>NAT 转换表 (NAT translation table)</strong>。<ol><li><strong>出站数据报：</strong> 路由器用（NAT IP 地址, 新端口号）替换（源 IP 地址, 源端口号）。</li><li><strong>入站数据报：</strong> 路由器根据 NAT 表，用（原始源 IP 地址, 原始端口号）替换目的地的（NAT IP 地址, 新端口号）。</li></ol></li></ul><ul><li><strong>为什么需要端口号？</strong><ul><li>NAT 路由器的 WAN 口（对外）通常只有<strong>一个</strong>公共 IP 地址（这里是 <code>138.76.29.7</code>）。</li><li>但是 LAN（内网）里有很多台电脑（<code>10.0.0.1</code>, <code>10.0.0.2</code>, <code>10.0.0.3</code>）。</li><li>如果只转换 IP 地址，当外网的数据回来时，路由器不知道该把数据给哪台内网电脑。</li><li><strong>解决方案</strong>：路由器使用 <strong>端口号</strong> 来区分不同的内网连接。它把内网的 <code>IP:端口</code> 映射为外网的 <code>公网IP:新端口</code>。</li><li>图中 NAT 表的意思是：凡是发往 <code>138.76.29.7</code> 且端口号是 <code>5001</code> 的数据包，都要转发给内网的 <code>10.0.0.1</code> 的 <code>3345</code> 端口。</li></ul></li></ul><ul><li><strong>争议：</strong><ul><li>路由器本应只处理到第 3 层（网络层），但 NAT 触及了第 4 层（传输层）的端口号。</li><li>违反了<strong>端到端论点 (end-to-end argument)</strong>。</li></ul></li></ul><ul><li><strong>私有地址 vs 公有地址</strong>：<ul><li>图中内网使用的是 <code>10.0.0.0/24</code> 网段，这是 <strong>RFC 1918</strong> 定义的 <strong>私有 IP 地址</strong>（Private IP）。私有地址在公网（Internet）上是无效的，专门用于局域网。</li><li>图中的 <code>138.76.29.7</code> 是 <strong>公有 IP 地址</strong>（Public IP）。</li></ul></li></ul><ul><li><strong>NAT 穿越问题 (NAT traversal problem):</strong> 外部客户端无法主动连接到 NAT 后的服务器。<ul><li><strong>解决方案 1：静态配置 (Static NAT)</strong> (例如端口转发)。</li><li><strong>解决方案 2：UPnP (Universal Plug and Play)</strong> (通用即插即用)，允许主机自动配置 NAT 端口映射。</li><li><strong>解决方案 3：中继 (Relaying)</strong> (例如 Skype 使用)，两个客户端都连接到一个公共的中继服务器，服务器在两者之间转发数据包。</li></ul></li></ul><h4 id="4-4-3-ICMP：互联网控制消息协议-ICMP-Internet-Control-Message-Protocol">4.4.3 ICMP：互联网控制消息协议 (ICMP: Internet Control Message Protocol)</h4><p>IP 协议（网络层）本身是一个“尽力而为”的协议，它只负责把数据包发出去，不保证能送到，也不负责报告错误。<strong>ICMP 就是 IP 协议的“辅助/补丁”</strong>。</p><ul><li><strong>功能</strong>：它用于在主机和路由器之间传递<strong>控制消息</strong>。</li><li><strong>内容</strong>：它不传数据，只传“情报”。比如：“网络不通”、“主机关机了”、“路太远走不到了”或者“请把速度放慢点”。</li><li><strong>封装位置</strong>：ICMP 看起来像是一个上层协议（因为它被封装在 IP 数据报里），但在逻辑上它属于<strong>网络层 (Layer 3)</strong> 的一部分。</li><li>结构：<code>[ IP 头部 | ICMP 消息 ]</code></li></ul><ul><li><strong>主要用途：</strong> 错误报告 (Error reporting) 和 网络查询 (Echo request/reply)。</li><li>ICMP 消息封装在 IP 数据报中。</li><li><strong>常见类型：</strong><ul><li><strong>Type 8 (Echo Request) &amp; Type 0 (Echo Reply)</strong>：<ul><li>这是 <strong>Ping</strong> 命令的基础。</li><li>你发一个 Type 8（请求），对方回一个 Type 0（应答）。如果收到了，说明网络层是通的。</li></ul></li><li><strong>Type 3 (Destination Unreachable - 目标不可达)</strong>：<ul><li>当路由器无法找到去往目标的路径，或者目标主机被防火墙拦截时，会返回这个错误。</li><li><em>注意</em>：在 Traceroute 的最后一步，正是利用了这个类型（具体是端口不可达）来确认到达终点。</li></ul></li><li><strong>Type 11 (Time Exceeded - TTL 过期)</strong>：<ul><li>这是 <strong>Traceroute</strong> 的核心。</li><li>IP 协议规定，每个数据包都有寿命（TTL）。每经过一个路由器，TTL 减 1。</li><li>当 TTL 减为 0 时，路由器<strong>必须</strong>丢弃该包，并向发送者回送一个 Type 11 的 ICMP 消息，告诉发送者：“你的包死在我这里了”。</li></ul></li></ul></li><li><strong>Traceroute 和 ICMP：</strong> Traceroute 并不想真的发送数据，它的目的是<strong>让沿途的每一个路由器都“报错”</strong>，从而暴露它们的身份。<ol><li><strong>探测第一跳 (TTL=1)：</strong><ul><li>源主机发送一个 UDP 数据包，目标是最终目的地，端口号选一个很大的随机数（如 33434，确保目标主机上没有程序在用这个端口）。</li><li>关键点：将 IP 头部的 <strong>TTL 设置为 1</strong>。</li><li><strong>结果</strong>：数据包到达路径上的<strong>第 1 个路由器</strong>。路由器将 TTL 减 1 变为 0。路由器丢弃该包，并向源主机发送 <strong>ICMP Type 11 (TTL expired)</strong>。</li><li><strong>收获</strong>：源主机收到了 ICMP 包，查看其<strong>源 IP 地址</strong>，就知道了第 1 跳路由器的身份；计算往返时间，就得到了 RTT。</li></ul></li><li><strong>探测第二跳 (TTL=2)：</strong><ul><li>源主机再次发送 UDP 包，这次将 <strong>TTL 设置为 2</strong>。</li><li><strong>过程</strong>：<ul><li>第 1 个路由器：<code>TTL 2 -&gt; 1</code>，转发通过。</li><li>第 2 个路由器：<code>TTL 1 -&gt; 0</code>，丢弃！</li></ul></li><li><strong>结果</strong>：第 2 个路由器向源主机发送 <strong>ICMP Type 11</strong>。</li><li><strong>收获</strong>：源主机知道了第 2 跳路由器的 IP。</li></ul></li><li><strong>循环递增 (TTL=3, 4, 5…)：</strong><ul><li>Traceroute 程序不断增加 TTL 的值，每次发包都能比上一次多走一步，然后“死”在下一个路由器手里，从而“骗”回下一个路由器的 IP。</li></ul></li><li><strong>到达终点 (Stopping Condition)：</strong><ul><li>假设目的地在第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 跳。源主机发送 TTL=<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 的包。</li><li>沿途所有路由器都放行了，数据包顺利到达了<strong>目标主机</strong>。</li><li>目标主机不会检查 TTL 是否耗尽（因为它是终点），它试图解包并处理 UDP 数据。</li><li><strong>关键反转</strong>：目标主机发现 UDP 目的端口（如 33434）没有程序在监听。</li><li><strong>结果</strong>：目标主机根据网络协议规定，向源主机发送一个 <strong>ICMP Type 3 (Destination Unreachable)</strong>，具体代码为 <strong>Port Unreachable (端口不可达)</strong>。</li></ul></li><li><strong>结束任务：</strong><ul><li>源主机一直在等 ICMP 消息。之前收到的都是 <strong>Type 11 (TTL 过期)</strong>，意味着还在半路上。</li><li>一旦收到 <strong>Type 3 (端口不可达)</strong>，源主机就知道：“啊，这是目标主机发回来的，说明我已经到了！”</li><li>程序停止探测，打印完整路径。</li></ul></li></ol></li></ul><h4 id="4-4-4-IPv6">4.4.4 IPv6</h4><ul><li><p><strong>主要动机：</strong> 32 位的 IPv4 地址空间已耗尽。</p></li><li><p><strong>IPv6 地址：</strong> 128 位。</p></li><li><p><strong>IPv6 数据报格式：</strong></p><ul><li><strong>固定的 40 字节首部</strong>。路由器处理起来非常快，硬件实现更简单。</li><li><strong>不允许分片 (no fragmentation allowed)</strong>（分片只能由源主机在发送前进行）。<ul><li><strong>IPv6</strong>: <strong>禁止路由器分片</strong>。如果包太大（超过链路 MTU），路由器直接<strong>丢弃</strong>该包，并回送一个 <strong>ICMPv6 “Packet Too Big”</strong> 消息。</li><li><em>处理</em>：源主机收到错误后，必须自己把包切小一点重发（这叫 <strong>路径 MTU 发现</strong>）。</li></ul></li><li><strong>Flow Label (流标签):</strong> 识别同一“流”中的数据报，有助于 QoS。<ul><li>用于标识属于同一个“流”（Flow）的数据报（例如一个音视频通话的数据流）。</li><li>这使得路由器可以给特定流提供 <strong>QoS (服务质量)</strong> 保障，而不需要深度包检测。</li></ul></li></ul></li><li><p><strong>与 IPv4 的主要变化：</strong></p><ul><li><strong>Checksum (校验和):</strong> <strong>彻底移除</strong>，以减少每跳的处理时间（依赖链路层和传输层进行校验）。<ul><li><em>理由</em>：现代链路层（光纤、以太网）非常可靠，很少出错；且传输层（TCP/UDP）本身就有校验。网络层不做重复劳动，以此加快转发速度。</li></ul></li><li><strong>Options (选项):</strong> 允许，但放在首部之外，通过 “Next Header” 字段指示。</li><li><strong>ICMPv6:</strong> 新版 ICMP，增加了 “Packet Too Big” 等消息类型。</li></ul></li><li><p><strong>隧道 (Tunnel)</strong>：是逻辑上的链路。实际上，它是把 IPv6 数据报当成 IPv4 数据报的 <strong>“数据 (Payload)”</strong> 来传输。</p></li><li><p><strong>双栈路由器 (Dual-stack Router)</strong>：隧道两端的路由器（通常是边缘路由器）必须同时支持 IPv4 和 IPv6。</p></li></ul><p>假设：<strong>主机 A (IPv6)</strong> 想发送数据给 <strong>主机 B (IPv6)</strong>，但中间必须经过一段 <strong>IPv4 网络</strong>。</p><ol><li><strong>源主机发送 (IPv6)</strong>：<ul><li>主机 A 发出一个标准的 IPv6 数据报。</li><li><code>[ IPv6 头部 | 数据 ]</code></li><li>源地址：A 的 IPv6 地址；目的地址：B 的 IPv6 地址。</li></ul></li><li><strong>进入隧道 (Encapsulation / 封装)</strong>：<ul><li>IPv6 数据报到达了“IPv6 岛屿”边缘的路由器（<strong>入口节点</strong>）。</li><li>该路由器发现要去往 B，必须经过 IPv4 网络。</li><li>路由器创建一个 <strong>IPv4 数据报</strong>。</li><li><strong>关键操作</strong>：<mark>它把完整的 IPv6 数据报塞进 IPv4 的“数据部分”。</mark></li><li><strong>IPv4 头部设置</strong>：<ul><li>源 IP：<strong>入口路由器</strong>的 IPv4 地址。</li><li>目的 IP：<strong>出口路由器</strong>的 IPv4 地址。</li><li><strong>Protocol 字段</strong>：设置为 <strong>41</strong> (表示 Payload 是 IPv6)。</li></ul></li><li>现在的包结构：<code>[ IPv4 头部 | IPv6 头部 | 数据 ]</code></li></ul></li><li><strong>穿过隧道 (Transmission)</strong>：<ul><li>这个包在中间的 IPv4 网络中传输。</li><li>中间的 IPv4 路由器<strong>只看外层的 IPv4 头部</strong>。它们根本不知道（也不关心）里面包着一个 IPv6 的包裹。它们只负责把包送到出口路由器的 IPv4 地址。</li></ul></li><li><strong>离开隧道 (Decapsulation / 解封装)</strong>：<ul><li>数据包到达了“IPv6 岛屿”另一端的边缘路由器（<strong>出口节点</strong>）。</li><li>出口路由器检查 IPv4 头部，发现 Protocol = 41。</li><li>它<strong>剥离</strong>掉外层的 IPv4 头部，取出了里面的 IPv6 数据报。</li></ul></li><li><strong>最终交付</strong>：<ul><li>出口路由器读取恢复出来的 IPv6 头部（目的地址是 B）。</li><li>它通过 IPv6 网络将数据报转发给主机 B。</li></ul></li></ol>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-03-Network-Layer-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-03-Network-Layer-01/"/>
    <published>2026-01-14T19:00:00.000Z</published>
    <summary>主要任务： 将数据报 (datagrams) 从源主机跨越多个网络路由 (routing) 到目标主机。</summary>
    <title>Network - 03.Network Layer-01</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<h2 id="3-4-可靠数据传输-Reliable-Data-Transfer-RDT-原理">3.4 可靠数据传输 (Reliable Data Transfer - RDT) 原理</h2><h3 id="RDT-总结">RDT 总结</h3><p><strong>目标</strong>：在不可靠的信道 (Unreliable Channel) 上实现可靠数据传输。</p><p><strong>情况1：信道只会A出现bit错误 (Bit Errors)</strong></p><ul><li><strong>需求</strong>：<ol><li>接收端具有检查错误的能力，例如使用 <strong>校验和 (Checksum)</strong>。</li><li>接收端需要能<br>够反馈接收状态，即 <strong>确认 (Acknowledgement - ACK)</strong>。</li><li>发送端在收到阴性确认 (Negative Acknowledgement - NAK) 或损坏的ACK时，需要有 <strong>重传 (Retransmission)</strong> 的能力。</li></ol></li><li><strong>新问题</strong>：如果ACK消息也损坏或丢失，发送端可能会重传，导致接收端收到 <strong>重复数据 (Duplicate Data)</strong>。</li><li><strong>解决方案</strong>：引入 <strong>序列号 (Sequence Number)</strong>。接收端可以根据序列号丢弃重复的分组。</li><li><strong>最终机制</strong>：校验和 (Checksum)、确认 (ACK)、序列号 (Sequence Number)。</li></ul><p><strong>情况2：信道既有bit错误，也会丢包 (Packet Loss)</strong></p><ul><li><strong>需求</strong> (在情况1的基础上)：<ol><li>发送端必须有能力检测到丢包。</li></ol></li><li><strong>解决方案</strong>：设置 <strong>定时器 (Timer)</strong>。发送端在发送一个分组后启动定时器，如果定时器超时 (Timeout) 仍未收到ACK，就认为分组丢失，并重传。</li><li><strong>新问题</strong>：定时器超时并不一定意味着丢包，也可能是由于网络延迟过大。这同样会导致重复分组，但序列号机制已经解决了这个问题。</li><li><strong>最终机制 (rdt3.0)</strong>：校验和 (Checksum)、确认 (ACK)、序列号 (Sequence Number)、定时器 (Timer)。</li></ul><h3 id="rdt3-0-的性能问题">rdt3.0 的性能问题</h3><ul><li><code>rdt3.0</code> 协议功能正确，但性能极差。</li><li>它是一种 <strong>停止-等待 (Stop-and-Wait)</strong> 协议。发送端发送一个包后，必须停止并等待它的ACK，然后才能发送下一个包。</li><li><strong>示例</strong>：在一个 1 Gbps 的链路上，传播延迟 (Propagation Delay) 为 15ms，一个 8000 bit 的包：<ul><li>传输时间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mrow><mi>t</mi><mi>r</mi><mi>a</mi><mi>n</mi><mi>s</mi></mrow></msub><mo>=</mo><mi>L</mi><mi mathvariant="normal">/</mi><mi>R</mi><mo>=</mo><mn>8000</mn><mtext> bits</mtext><mi mathvariant="normal">/</mi><msup><mn>10</mn><mn>9</mn></msup><mtext> bps</mtext><mo>=</mo><mn>8</mn><mi>μ</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">d_{trans} = L/R = 8000 \text{ bits} / 10^9 \text{ bps} = 8 \mu s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">an</span><span class="mord mathnormal mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">L</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">8000</span><span class="mord text"><span class="mord"> bits</span></span><span class="mord">/1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">9</span></span></span></span></span></span></span></span><span class="mord text"><span class="mord"> bps</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">8</span><span class="mord mathnormal">μ</span><span class="mord mathnormal">s</span></span></span></span>。</li><li>往返时间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mi>T</mi><mi>T</mi><mo>=</mo><mn>15</mn><mtext> ms</mtext><mo>×</mo><mn>2</mn><mo>=</mo><mn>30</mn><mtext> ms</mtext><mo>=</mo><mn>30008</mn><mi>μ</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">RTT = 15 \text{ ms} \times 2 = 30 \text{ ms} = 30008 \mu s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">15</span><span class="mord text"><span class="mord"> ms</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span><span class="mord text"><span class="mord"> ms</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">30008</span><span class="mord mathnormal">μ</span><span class="mord mathnormal">s</span></span></span></span> (计入传输时间)。</li><li>发送端利用率 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>U</mi><mrow><mi>s</mi><mi>e</mi><mi>n</mi><mi>d</mi><mi>e</mi><mi>r</mi></mrow></msub><mo>=</mo><mfrac><mrow><mi>L</mi><mi mathvariant="normal">/</mi><mi>R</mi></mrow><mrow><mi>R</mi><mi>T</mi><mi>T</mi><mo>+</mo><mi>L</mi><mi mathvariant="normal">/</mi><mi>R</mi></mrow></mfrac><mo>=</mo><mfrac><mn>.008</mn><mn>30.008</mn></mfrac><mo>≈</mo><mn>0.00027</mn></mrow><annotation encoding="application/x-tex">U_{sender} = \frac{L/R}{RTT + L/R} = \frac{.008}{30.008} \approx 0.00027</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">U</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">se</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">er</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.53em;vertical-align:-0.52em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.01em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">RTT</span><span class="mbin mtight">+</span><span class="mord mathnormal mtight">L</span><span class="mord mtight">/</span><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.485em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span><span class="mord mtight">/</span><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.52em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">30.008</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">.008</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.00027</span></span></span></span>。</li></ul></li><li><strong>结论</strong>：发送端在绝大多数时间都在空闲等待ACK。网络协议严重限制了物理资源的使用。</li></ul><h3 id="流水线协议-Pipelined-Protocols">流水线协议 (Pipelined Protocols)</h3><ul><li><strong>解决方案</strong>：允许发送方在收到ACK之前，连续发送多个分组。</li><li><strong>优势</strong>：极大地提高了信道利用率。</li><li><strong>要求</strong>：<ol><li>需要更大的序列号范围。</li><li>发送方和/或接收方需要 <strong>缓冲 (Buffering)</strong>。</li></ol></li><li><strong>两种通用的流水线协议</strong>：<ol><li><strong>回退N步 (Go-Back-N - GBN)</strong></li><li><strong>选择重传 (Selective Repeat - SR)</strong></li></ol></li></ul><hr><h3 id="1-回退N步-Go-Back-N-GBN">1. 回退N步 (Go-Back-N - GBN)</h3><p>GBN 允许发送方有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 个已发送但未确认的分组在“飞行中”。</p><ul><li><strong>发送方 (Sender)</strong>：<ul><li>维护一个大小为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 的 <strong>发送窗口 (Send Window)</strong>。</li><li><code>send_base</code>：窗口中最早的未被确认的分组序列号。</li><li><code>nextseqnum</code>：下一个待发送的分组序列号。</li><li><strong>累积确认 (Cumulative ACK)</strong>：接收到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>C</mi><mi>K</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ACK(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> 意味着序列号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">\leq n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 的所有分组都已被正确接收。</li><li><strong>单一定时器 (Single Timer)</strong>：只为最早的未确认分组 (<code>send_base</code>) 设置一个定时器。</li><li><strong>超时事件 (Timeout)</strong>：如果定时器超时，发送方 <strong>重传所有已发送但未确认的分组</strong> (即从 <code>send_base</code> 到 <code>nextseqnum-1</code> 的所有分组)。</li></ul></li><li><strong>接收方 (Receiver)</strong>：<ul><li><strong>按序接收 (In-order)</strong>：只维护一个 <code>expectedseqnum</code> (期望收到的序列号)。</li><li>如果收到的分组序列号等于 <code>expectedseqnum</code>：接收并交付给上层，发送 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>C</mi><mi>K</mi><mo stretchy="false">(</mo><mtext>expectedseqnum</mtext><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ACK(\text{expectedseqnum})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mopen">(</span><span class="mord text"><span class="mord">expectedseqnum</span></span><span class="mclose">)</span></span></span></span>，然后 <code>expectedseqnum++</code>。</li><li>如果收到 <strong>乱序分组 (Out-of-order Packet)</strong>：<strong>直接丢弃 (Discard)</strong>。</li><li><strong>无接收缓冲 (No Receiver Buffering)</strong>：不缓冲任何乱序的分组。</li><li><strong>总是</strong> 发送当前已正确接收的最高按序序列号的ACK。这会导致在丢包时，发送方会收到大量 <strong>重复ACK (Duplicate ACKs)</strong>。</li></ul></li></ul><h3 id="2-选择重传-Selective-Repeat-SR">2. 选择重传 (Selective Repeat - SR)</h3><p>SR 通过让接收方缓冲乱序分组，来避免GBN中不必要的重传，只重传真正丢失的分组。</p><ul><li><strong>发送方 (Sender)</strong>：<ul><li><strong>为每个未确认的分组维护一个定时器 (Timer per Packet)</strong>。</li><li><strong>超时事件 (Timeout)</strong>：如果某个分组的定时器超时，<strong>只重传那一个分组</strong>。</li><li><strong>单独确认 (Individual ACK)</strong>：接收来自接收方的对每个分组的单独ACK。</li><li>发送窗口 (<code>sendbase</code>) 只有在窗口内的最早的分组被确认后才能向前滑动。</li></ul></li><li><strong>接收方 (Receiver)</strong>：<ul><li><strong>单独确认 (Individual ACK)</strong>：对每个正确接收的分组（无论是否按序）都发送一个ACK。</li><li><strong>接收缓冲 (Receiver Buffering)</strong>：<strong>缓冲</strong> 那些早于期望序列号（<code>rcv_base</code>）但未按序到达的分组。</li><li><strong>按序交付</strong>：当 <code>rcv_base</code> 所指向的分组到达时，将它以及后续已缓冲的连续分组一起交付给上层，并向前移动接收窗口。</li></ul></li><li><strong>SR 的困境 (Dilemma)</strong>：<ul><li>序列号空间的大小必须是窗口大小 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>) 的 <strong>至少两倍</strong>。</li><li><strong>原因</strong>：如果序列号空间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>=</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">= N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>（例如 N=3, 序列号 0,1,2），接收方无法区分一个序列号为 0 的分组是第一次发送的新包，还是一个迟到的重传包。</li></ul></li></ul><h3 id="GBN-vs-SR-总结">GBN vs SR 总结</h3><table><thead><tr><th style="text-align:left">特性 (Comparison)</th><th style="text-align:left">回退N步 (Go-Back-N)</th><th style="text-align:left">选择重传 (Selective Repeat)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>重传 (Retransmission)</strong></td><td style="text-align:left">重传所有未确认的分组</td><td style="text-align:left">只重传丢失/损坏的分组</td></tr><tr><td style="text-align:left"><strong>ACK 类型</strong></td><td style="text-align:left">累积确认 (Cumulative)</td><td style="text-align:left">单独确认 (Individual)</td></tr><tr><td style="text-align:left"><strong>发送方定时器</strong></td><td style="text-align:left">1 个 (针对最早的未确认包)</td><td style="text-align:left">N 个 (每个未确认包一个)</td></tr><tr><td style="text-align:left"><strong>接收方缓冲 (Buffering)</strong></td><td style="text-align:left">无需缓冲 (丢弃乱序包)</td><td style="text-align:left">必须缓冲乱序包</td></tr><tr><td style="text-align:left"><strong>接收方排序 (Sorting)</strong></td><td style="text-align:left">无需排序</td><td style="text-align:left">必须排序以按序交付</td></tr><tr><td style="text-align:left"><strong>复杂度 (Complexity)</strong></td><td style="text-align:left">较简单</td><td style="text-align:left">非常复杂</td></tr><tr><td style="text-align:left"><strong>适用场景</strong></td><td style="text-align:left">网络条件好 (低丢包率)</td><td style="text-align:left">网络条件差 (高丢包率)</td></tr></tbody></table><hr><div class="note note-info">            <p><strong>1. 核心关系：理论 vs 实践</strong></p><ul><li><strong>RDT (特别是 GBN 和 SR)</strong> 是 TCP 协议设计的<strong>理论基础</strong>。</li><li><strong>TCP</strong> 是这些理论在互联网环境中的<strong>具体实现</strong>，它是 GBN 和 SR 的<strong>混合体 (Hybrid)</strong>。</li></ul><p><strong>2. 机制的直接映射</strong></p><p>TCP 沿用了 RDT 的四大核心工具来保证可靠性：</p><ul><li><strong>校验和 (Checksum)</strong>：检测错误。</li><li><strong>序列号 (Sequence Number)</strong>：TCP 编号基于<strong>字节</strong>，RDT 基于<strong>包</strong>。</li><li><strong>确认 (ACK)</strong>：告知接收状态。</li><li><strong>定时器 (Timer)</strong>：处理丢包。</li></ul><p><strong>3. TCP 的混合特性 (GBN + SR)</strong></p><ul><li><strong>像 GBN 的地方</strong>：TCP 使用 <strong>累积确认 (Cumulative ACK)</strong>，且通常只使用 <strong>单一定时器</strong>。</li><li><strong>像 SR 的地方</strong>：TCP 接收方会 <strong>缓冲乱序分组</strong> (避免不必要的重传)，且支持 <strong>SACK (选择性确认)</strong>。</li></ul><p><strong>4. 关键差异</strong></p><ul><li><strong>窗口控制</strong>：RDT 的窗口大小 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 通常是固定的；而 TCP 的窗口大小是<strong>动态</strong>的，由 <strong>流量控制</strong> 和 <strong>拥塞控制</strong> 共同决定。</li><li><strong>重传优化</strong>：TCP 引入了 <strong>快速重传 (Fast Retransmit)</strong>（收到3个重复ACK即重传），弥补了单一定时器反应慢的缺陷。</li></ul>          </div><h2 id="3-5-面向连接的传输-TCP-Connection-Oriented-Transport">3.5 面向连接的传输: TCP (Connection-Oriented Transport)</h2><h3 id="TCP-概述-Overview">TCP 概述 (Overview)</h3><p>TCP 是互联网的核心传输层协议，它在IP协议（不可靠）之上提供可靠的数据传输服务。</p><ul><li><strong>点对点 (Point-to-point)</strong>：一个发送方，一个接收方。<ul><li><strong>不适用场景</strong>：广播 (Broadcasting) 或多播 (Multicasting) 不能使用 TCP，因为 TCP 需要维护每一对通信端点的状态（如序列号、窗口大小）。</li></ul></li><li><strong>可靠的、按序的字节流 (Reliable, in-order byte stream)</strong>：它不关心“报文”的边界，只是一个字节流。<ul><li><strong>无报文边界</strong>：与 UDP 不同，TCP 不保留应用层消息的边界。应用程序交给 TCP 的数据被视为一连串无结构的字节。</li><li><strong>可靠性</strong>：TCP 保证数据<strong>不丢失</strong>、<strong>不重复</strong>、<strong>无错误</strong>。</li><li><strong>按序性</strong>：即使底层 IP 数据包乱序到达，TCP 也会在接收端重新排序，确保应用层读到的数据顺序与发送端一致。</li></ul></li><li><strong>流水线的 (Pipelined)</strong>：通过 <strong>拥塞控制 (Congestion Control)</strong> 和 <strong>流量控制 (Flow Control)</strong> 来动态设置窗口大小。<ul><li>为了提高效率，TCP 允许发送方在未收到确认的情况下发送多个数据段。</li><li><strong>窗口控制</strong>：TCP 的“流水线”容量是动态调整的，受两个因素限制：<ol><li><strong>拥塞控制 (Congestion Control)</strong>：防止网络拥塞（保护网络）。</li><li><strong>流量控制 (Flow Control)</strong>：防止接收方缓冲区溢出（保护接收方）。</li></ol></li></ul></li><li><strong>全双工 (Full duplex)</strong>：数据可以在同一连接上双向流动。这意味着<mark>数据可以同时在两个方向上流动</mark>（从客户端到服务器，<em>并且</em> 从服务器到客户端）<ul><li>一条 TCP 连接拥有两个独立的传输通道。</li><li><strong>MSS (Maximum Segment Size)</strong>：指在不分片的情况下，TCP 能够传输的最大数据载荷（不包含 TCP 头部）。</li></ul></li><li><strong>面向连接 (Connection-oriented)</strong>：在数据交换前，必须通过 <strong>三次握手 (Three-Way Handshake)</strong> 建立连接。<ul><li>在数据传输前，必须先建立“状态”。双方必须通过 <strong>三次握手</strong> 初始化序列号、缓冲区大小等参数。</li></ul><ul><li>连接状态仅存在于端系统中（发送方和接收方的操作系统内核），中间的路由器完全不知道 TCP 连接的存在。</li></ul></li><li><strong>流量控制 (Flow controlled)</strong>：确保发送方不会“淹没”（即超出缓冲区）接收方。<ul><li>发送方必须根据接收方的处理能力来控制发送速度。如果接收方处理得慢，发送方必须减速，避免数据在接收端缓冲区溢出导致丢包。</li></ul></li></ul><h3 id="3-5-1-TCP-段结构-Segment-Structure">3.5.1 TCP 段结构 (Segment Structure)</h3><p>TCP 在IP数据报中传输的数据单元称为 <strong>段 (Segment)</strong>。</p><ul><li><strong>源端口号 (Source Port #)</strong> 和 <strong>目的端口号 (Dest Port #)</strong>：用于多路复用/分用，结合 IP 地址，唯一标识了通信两端的进程（Socket）。</li><li><strong>序列号 (Sequence Number)</strong>：<ul><li><strong>关键</strong>：TCP 序列号是 <mark><strong>字节流中的字节编号</strong></mark>，而不是段的编号。</li><li>它指的是<mark>该段数据中 <strong>第一个字节</strong> 在整个字节流中的编号</mark>。</li><li><em>例子</em>：如果文件很大，第一个段的序列号是 0，且该段包含 1000 字节数据；那么第二个段的序列号就是 1000（而不是 1）。</li></ul></li><li><strong>确认号 (Acknowledgement Number - ACK #)</strong>：<ul><li><strong>关键</strong>：TCP 使用 <strong>累积确认 (Cumulative ACK)</strong>。</li><li>这个字段的值是 <mark><strong>期望从对方接收的下一个字节的序列号</strong></mark>。</li><li><em>例子</em>：接收方收到了字节 0-999。它回复的 ACK 将是 <strong>1000</strong>。</li></ul></li><li><strong>首部长度 (Header Length)</strong>：指示 TCP 首部的长度（因为有“选项”字段）。<ul><li><strong>核心作用：</strong> 因为 TCP 头部后面可能跟着可变长度的“选项 (Options)”，接收方拿到一个包，如果没有这个字段，它根本不知道<strong>从第几个字节开始才是真正的用户数据</strong>。</li><li>单位是 <mark>4 字节</mark>（32位字）。</li></ul><ul><li>通常 TCP 头部为 20 <mark>字节</mark>（无选项），此时该字段值为 5（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn><mo>×</mo><mn>4</mn><mo>=</mo><mn>20</mn></mrow><annotation encoding="application/x-tex">5 \times 4 = 20</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">20</span></span></span></span>）。</li><li>因为有“选项”字段，头部长度可变，所以需要此字段来定位数据载荷从哪里开始。</li></ul></li><li><strong>标志位 (Flags)</strong>：<ul><li><code>ACK</code>：表示“确认号”字段有效。置 1 时，确认号字段才有效（连接建立后所有包该位都为 1）。</li><li><code>SYN</code>：用于发起连接。同步序列号，仅在<strong>三次握手</strong>的前两步出现（建立连接）。</li><li><code>FIN</code>：用于关闭连接。发送方数据发送完毕，请求释放连接。</li><li><code>RST</code>：重置连接。连接出现严重错误（如主机崩溃），必须强制重置。</li><li><code>PSH</code>： (Push) 提示接收端立即将数据交给应用层，不要在缓冲区等待凑满。</li><li><code>URG</code>： (Urgent) 表示段中包含紧急数据（配合紧急指针使用，现代网络中较少用）。</li></ul></li><li><strong>接收窗口 (Receive Window)</strong>：用于 <strong>流量控制</strong>。该值告诉对方：“我的接收缓冲区还有多少字节的空闲空间”。</li><li><strong>校验和 (Checksum)</strong>：用于检查首部和数据的bit错误。<ul><li>覆盖范围：TCP 伪首部（来自 IP 层的信息）、TCP 首部、TCP 数据。</li></ul><ul><li>作用：检测数据在传输过程中是否发生比特翻转。</li></ul></li></ul><h3 id="3-5-2-TCP-可靠数据传输-RDT">3.5.2 TCP 可靠数据传输 (RDT)</h3><p>TCP 的 RDT 机制结合了 GBN 和 SR 的思想，是一种高度优化的混合体。</p><h4 id="1-RTT-估计与超时-RTT-and-Timeout">1. RTT 估计与超时 (RTT and Timeout)</h4><p>TCP 必须设置<mark>一个</mark>超时定时器来重传丢失的分组，这个定时器的值至关重要。</p><ul><li><strong>问题</strong>：RTT (Round Trip Time) 在网络中是动态变化的。<ul><li><strong>定时器太短</strong>：导致过早超时 (Premature Timeout)，进行不必要的重传，浪费带宽。</li><li><strong>定时器太长</strong>：对丢包的反应慢，降低吞吐量。</li></ul></li><li><strong>解决方案</strong>：动态估计 RTT。<ol><li><strong>估计 RTT (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>s</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>R</mi><mi>T</mi><mi>T</mi></mrow><annotation encoding="application/x-tex">EstimatedRTT</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ima</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span></span></span></span>)</strong>：<ul><li>测量多个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>R</mi><mi>T</mi><mi>T</mi></mrow><annotation encoding="application/x-tex">SampleRTT</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">am</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span></span></span></span>（从发送段到收到ACK的时间）。</li><li>使用 <strong>指数加权移动平均 (EWMA)</strong> 来平滑 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>R</mi><mi>T</mi><mi>T</mi></mrow><annotation encoding="application/x-tex">SampleRTT</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">am</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span></span></span></span> 的抖动。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>s</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>α</mi><mo stretchy="false">)</mo><mo>×</mo><mi>E</mi><mi>s</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>+</mo><mi>α</mi><mo>×</mo><mi>S</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>R</mi><mi>T</mi><mi>T</mi></mrow><annotation encoding="application/x-tex">EstimatedRTT = (1-\alpha) \times EstimatedRTT + \alpha \times SampleRTT</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ima</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ima</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">am</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span></span></span></span> (典型 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi><mo>=</mo><mn>0.125</mn></mrow><annotation encoding="application/x-tex">\alpha = 0.125</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.125</span></span></span></span>)</li></ul></li><li><strong>设置超时时间 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mi>i</mi><mi>m</mi><mi>e</mi><mi>o</mi><mi>u</mi><mi>t</mi><mi>I</mi><mi>n</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>a</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">TimeoutInterval</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal">im</span><span class="mord mathnormal">eo</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span>)</strong>：<ul><li>还需要考虑 RTT 的 <strong>方差 (Variance)</strong>。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mi>e</mi><mi>v</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>β</mi><mo stretchy="false">)</mo><mo>×</mo><mi>D</mi><mi>e</mi><mi>v</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>+</mo><mi>β</mi><mo>×</mo><mi mathvariant="normal">∣</mi><mi>S</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>−</mo><mi>E</mi><mi>s</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>R</mi><mi>T</mi><mi>T</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">DevRTT = (1-\beta) \times DevRTT + \beta \times |SampleRTT - EstimatedRTT|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">De</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">De</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">am</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ima</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mord">∣</span></span></span></span> (典型 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>β</mi><mo>=</mo><mn>0.25</mn></mrow><annotation encoding="application/x-tex">\beta = 0.25</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.25</span></span></span></span>)</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mi>i</mi><mi>m</mi><mi>e</mi><mi>o</mi><mi>u</mi><mi>t</mi><mi>I</mi><mi>n</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>a</mi><mi>l</mi><mo>=</mo><mi>E</mi><mi>s</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>R</mi><mi>T</mi><mi>T</mi><mo>+</mo><mn>4</mn><mo>×</mo><mi>D</mi><mi>e</mi><mi>v</mi><mi>R</mi><mi>T</mi><mi>T</mi></mrow><annotation encoding="application/x-tex">TimeoutInterval = EstimatedRTT + 4 \times DevRTT</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal">im</span><span class="mord mathnormal">eo</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ima</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">De</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.13889em;">RTT</span></span></span></span> (增加一个“安全边界”)</li></ul></li></ol></li></ul><h4 id="2-TCP-重传机制-Retransmission">2. TCP 重传机制 (Retransmission)</h4><p>TCP 使用 <strong>累积确认</strong> 并维护一个 <strong>单一的重传定时器</strong>（逻辑上，它总是为最早的未确认段 <code>SendBase</code> 计时）。</p><p><strong>重传由两个事件触发：</strong></p><ol><li><strong>超时 (Timeout)</strong></li><li><strong>重复的 ACK (Duplicate ACKs)</strong></li></ol><ul><li><p><strong>简化的TCP发送方逻辑 (Simplified Sender)</strong>：</p><ul><li><strong>事件：收到来自应用的数据</strong>：创建段，发送，如果定时器未运行，则启动定时器。</li><li><strong>事件：定时器超时</strong>：<strong>重传</strong> 造成超时的段 (即 <mark><code>SendBase</code></mark> 对应的段)，重启定时器。</li><li><strong>事件：收到 ACK (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>)</strong>：如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>&gt;</mo><mi>S</mi><mi>e</mi><mi>n</mi><mi>d</mi><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">y &gt; SendBase</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal">se</span></span></span></span> (即它是新的确认)，则更新 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>e</mi><mi>n</mi><mi>d</mi><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>=</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">SendBase = y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal">se</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>。如果此时还有未确认的段，<strong>重启定时器</strong>。</li></ul></li><li><p><strong>丢包场景</strong>：</p><ul><li><strong>ACK 丢失</strong>：如果 <code>ACK=100</code> 丢失，发送方最终会因 <code>Seq=92</code> 的定时器超时而 <strong>重传</strong> <code>Seq=92</code>。接收方会丢弃这个重复的段，并 <strong>再次发送</strong> <code>ACK=100</code>。</li><li><strong>段丢失 (Segment Loss)</strong>：如果 <code>Seq=92</code> 丢失，接收方将永远不会发送 <code>ACK=100</code> (因为ACK是累积的)。发送方最终会因 <code>Seq=92</code> 的定时器超时而 <strong>重传</strong> <code>Seq=92</code>。</li></ul></li></ul><table><thead><tr><th><strong>接收方事件</strong></th><th><strong>TCP 接收方动作</strong></th></tr></thead><tbody><tr><td>按序分段到达，具有期望的序列号。所有低于此期望序列号的数据均已被确认。</td><td>延迟 ACK。等待最多 500ms 以接收下一个分段。如果没有下一个分段到达，则发送 ACK。</td></tr><tr><td>按序分段到达，具有期望的序列号。另有一个分段的 ACK 正处于待定状态。</td><td>立即发送一个单一的累积 ACK，同时确认这两个按序分段。</td></tr><tr><td>乱序分段到达，序列号高于期望值。检测到空隙。</td><td>立即发送_重复 ACK_，指明下一个期望字节的序列号。</td></tr><tr><td>分段到达，该分段部分或完全填充了空隙。</td><td>立即发送 ACK，前提是该分段从空隙的下边界开始。</td></tr></tbody></table><ul><li><strong>一切正常时</strong>：TCP 很懒，能拖就拖，尽量合并 ACK（第一行、第二行）。</li><li><strong>出乱子时</strong>：TCP 很急，一旦发现乱序（丢包），立刻尖叫（发重复 ACK）让发送方赶紧重传（第三行）。</li><li><strong>修好后</strong>：TCP 很爽快，一旦丢的包补上了，立刻更新最新进度（第四行）。</li></ul><h4 id="3-快速重传-Fast-Retransmit">3. 快速重传 (Fast Retransmit)</h4><p><strong>问题</strong>：等待超时重传的延迟太长。</p><p><strong>优化</strong>：使用 <strong>重复的ACK (Duplicate ACKs)</strong> 来提早检测丢包。</p><ul><li>当一个段丢失时（例如 <code>Seq=100</code> 丢失），但后续的段（<code>Seq=120</code>, <code>Seq=140</code>…）被接收方收到。</li><li>由于接收方期望的是 <code>Seq=100</code>，它会 <strong>丢弃</strong> 这些乱序的段（在经典TCP中）或者 <strong>缓冲</strong> 它们（在现代TCP中）。</li><li>但无论如何，它 <strong>每次</strong> 收到一个乱序段时，都会 <strong>立即</strong> 发送一个ACK，ACK的值是它 <strong>期望的字节号</strong>，即 <code>ACK=100</code>。</li><li>这导致发送方会收到多个 <code>ACK=100</code>，这就是 <strong>重复ACK</strong>。</li><li><strong>快速重传规则</strong>：当<mark>发送方收到 <strong>3 个重复的ACK</strong> (即总共4个相同的ACK) 时</mark>，它就认为这个ACK所指示的下一个段（<code>Seq=100</code>）已经丢失。</li><li><strong>动作</strong>：发送方 <mark><strong>立即重传 (Fast Retransmit)</strong></mark> 丢失的段，<strong>而无需等待定时器超时</strong>。</li></ul><hr><h3 id="3-5-3-TCP-流量控制-TCP-Flow-Control">3.5.3 TCP 流量控制 (TCP Flow Control)</h3><p><strong>目标</strong>：防止发送方发送数据的速度超过 <strong>接收方</strong> 应用程序处理数据的速度，导致接收方缓冲区溢出。</p><ul><li>与理论的SR不同的是，这里发送和接收方的窗口大小并非一个固定值，</li></ul><ul><li><strong>区别</strong>：这是为了保护 <strong>接收方</strong>，而 <strong>拥塞控制</strong> 是为了保护 <strong>网络</strong>。</li><li><strong>机制</strong>：<ol><li>接收方在其接收缓冲区 <code>RcvBuffer</code> 中跟踪“空闲空间” <code>RcvWindow</code>。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mi>c</mi><mi>v</mi><mi>W</mi><mi>i</mi><mi>n</mi><mi>d</mi><mi>o</mi><mi>w</mi><mo>=</mo><mi>R</mi><mi>c</mi><mi>v</mi><mi>B</mi><mi>u</mi><mi>f</mi><mi>f</mi><mi>e</mi><mi>r</mi><mo>−</mo><mo stretchy="false">(</mo><mtext>LastByteRcvd</mtext><mo>−</mo><mtext>LastByteRead</mtext><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">RcvWindow = RcvBuffer - (\text{LastByteRcvd} - \text{LastByteRead})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">Win</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.10764em;">ff</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord text"><span class="mord">LastByteRcvd</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">LastByteRead</span></span><span class="mclose">)</span></span></span></span></li><li>接收方将这个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mi>c</mi><mi>v</mi><mi>W</mi><mi>i</mi><mi>n</mi><mi>d</mi><mi>o</mi><mi>w</mi></mrow><annotation encoding="application/x-tex">RcvWindow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">Win</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 的值放入它发送的每个TCP段的 <strong>“接收窗口” (Receive Window)</strong> 字段中，通告给发送方。</li><li>发送方维护一个变量 <code>RcvWindow</code> (从ACK中获取)，并确保其<mark>“在途”（已发送但未确认）</mark>的数据量不超过该值。</li><li><strong>发送方限制</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>LastByteSent</mtext><mo>−</mo><mtext>LastByteAcked</mtext><mo>≤</mo><mi>R</mi><mi>c</mi><mi>v</mi><mi>W</mi><mi>i</mi><mi>n</mi><mi>d</mi><mi>o</mi><mi>w</mi></mrow><annotation encoding="application/x-tex">\text{LastByteSent} - \text{LastByteAcked} \leq RcvWindow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">LastByteSent</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">LastByteAcked</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">Win</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span></li></ol></li></ul><hr><h3 id="3-5-4-TCP-连接管理-TCP-Connection-Management">3.5.4 TCP 连接管理 (TCP Connection Management)</h3><h4 id="1-建立连接：三次握手-Three-Way-Handshake">1. 建立连接：三次握手 (Three-Way Handshake)</h4><ul><li><strong>Step 1: Client -&gt; Server: <code>SYN</code></strong><ul><li>客户端发送一个 <code>SYN</code> 段（<code>SYN=1</code>）。</li><li>随机选择一个初始序列号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>（<code>seq=x</code>）。</li></ul></li><li><strong>Step 2: Server -&gt; Client: <code>SYNACK</code></strong><ul><li>服务器收到 <code>SYN</code> 后，分配缓冲区和变量。</li><li>服务器发回一个 <code>SYNACK</code> 段（<code>SYN=1</code>, <code>ACK=1</code>）。</li><li>随机选择自己的初始序列号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>（<code>seq=y</code>）。</li><li>确认客户端的 <code>SYN</code>（<code>ack=x+1</code>）。</li></ul></li><li><strong>Step 3: Client -&gt; Server: <code>ACK</code></strong><ul><li>客户端收到 <code>SYNACK</code> 后，也分配缓冲区。</li><li>客户端发送一个 <code>ACK</code> 段（<code>ACK=1</code>）。</li><li>确认服务器的 <code>SYN</code>（<code>ack=y+1</code>）。</li><li>此时 <code>SYN=0</code>。这个段可以携带应用层数据。</li></ul></li></ul><p><strong>思考：为什么是三次握手？</strong></p><ul><li><strong>不是两次？</strong> 无法防止“已失效的连接请求”。如果一个旧的 <code>SYN</code> (来自 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>) 在网络中延迟了很久才到达服务器，服务器会用 <code>SYNACK</code> (来自 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mi>c</mi><mi>k</mi><mo>=</mo><mi>x</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">ack=x+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>) 回复并建立连接。客户端（早已超时）会忽略这个 <code>SYNACK</code>。但如果是两次握手，服务器会单方面建立连接并等待数据，浪费资源。</li></ul><p><strong>Q2: 第三次握手丢了怎么办？</strong></p><ul><li><strong>Client</strong>：发完第三次握手后，Client 已经认为连接建立了，开始发数据。</li><li><strong>Server</strong>：收不到第三次握手，它还在 <code>SYN_RCVD</code> 状态。</li><li><strong>后果</strong>：Server 会触发<strong>超时重传</strong>，重发第二次握手的包 (<code>SYN+ACK</code>)。如果重试多次仍收不到，Server 就会断开连接。</li><li><em>注：Client 随后发来的携带数据的包，会被 Server 识别为错误（因为不在 ESTABLISHED 状态），导致连接重置。</em></li></ul><p><strong>Q3: 初始序列号 (ISN) 为什么是随机的，不能从 0 开始吗？</strong></p><ul><li>为了安全（防止黑客伪造 TCP 包进行攻击，如 TCP 序列号预测攻击）。</li><li>为了防止同一个端口的前一个连接的旧数据包干扰新的连接（如果都从 0 开始，很难区分这是上一次连接残留的包，还是新连接的包）。</li></ul><p>从可靠数据传输的角度，建立连接的过程不是必要的，但是如果考虑主机和网络的资源和性能，则有必要。<br>建立连接的过程，是双方对通信参数做约定的过程，从而预留相应的资源（例如预留缓冲区）<br>如果确定对方有意愿开始通信，则预留资源；避免在不确定对方是否通信的情况下就预留资源</p><p>可靠<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo mathvariant="normal">≠</mo></mrow><annotation encoding="application/x-tex">\neq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span></span></span></span>达成一致性</p><p>TCP中通信双方不是对等的，在“两军问题”中双方不一致即失败，但是TCP中双方不一致不算失败。</p><div class="note note-info">            <ul><li><p><strong>目标</strong>：红军 A 和 红军 B 必须<strong>同时</strong>进攻白军才能赢，单独进攻就会被消灭。</p></li><li><p><strong>通信</strong>：通过信使穿越敌占区（不可靠信道，信使可能被抓/消息丢失）。</p></li><li><p><strong>A 将军发起提议</strong>：“明早 8 点进攻。”</p></li><li><p><strong>第一回合（消息发出）</strong></p><ul><li>A 派出信使 1 号：<strong>“明早进攻。”</strong></li><li><em>现状</em>：A 不敢动，因为 A 不知道 B 是否收到了。如果 B 没收到，A 进攻就是送死。</li></ul></li><li><p><strong>第二回合（B 收到并确认）</strong></p><ul><li>B 收到了信使 1 号。</li><li>B 派出信使 2 号回复：<strong>“收到，明早进攻。”</strong></li><li><em>现状</em>：B 此时<strong>不敢动</strong>。因为信使 2 号可能被抓。如果 A 没收到回复，A 就会认为 B 不知道计划，从而取消行动。那样 B 一进攻就送死了。</li></ul></li><li><p><strong>第三回合（A 收到确认）</strong></p><ul><li>A 收到了信使 2 号。A 心里石头落地了（A 知道 B 知道了）。</li><li>但是！A 突然意识到：<strong>B 现在还处于恐慌中</strong>（即上一条现状）。B 不知道 A 是否收到了回复。为了让 B 放心，A 必须回复。</li><li>A 派出信使 3 号：<strong>“我收到了你的回复，明早进攻。”</strong></li><li><em>现状</em>：A 此时<strong>不敢动</strong>。因为如果信使 3 号丢了，B 就会认为 A 没收到确认，导致 A 取消计划，所以 B 也会取消计划。A 若进攻就是送死。</li></ul></li><li><p><strong>第四回合（无限递归）</strong></p></li><li><p>在分布式系统中，要达成完美的一致性，需要达到<strong>共同知识</strong>（Common Knowledge）的状态。</p></li><li><p>关于Common Knowledge与Shared Knowledge：<a href="https://www.bilibili.com/video/BV1FdWEzwEDw/?spm_id_from=333.337.search-card.all.click">红蓝眼睛之谜</a></p></li></ul>          </div><h4 id="2-关闭连接：四次挥手-Four-Way-Handshake">2. 关闭连接：四次挥手 (Four-Way Handshake)</h4><p>连接的两个方向必须被单独关闭。</p><ul><li><strong>Step 1: Client -&gt; Server: <code>FIN</code></strong><ul><li>客户端应用调用 <code>close()</code>。</li><li>客户端发送一个 <code>FIN</code> 段（<code>FIN=1</code>, <code>seq=u</code>）。</li></ul></li><li><strong>Step 2: Server -&gt; Client: <code>ACK</code></strong><ul><li>服务器收到 <code>FIN</code>，发送一个 <code>ACK</code> 来确认（<code>ACK=1</code>, <code>ack=u+1</code>）。</li><li>此时，客户端不能再发送数据，但服务器 <strong>仍然可以发送数据</strong>（进入 <code>CLOSE_WAIT</code> 状态）。</li></ul></li><li><strong>Step 3: Server -&gt; Client: <code>FIN</code></strong><ul><li>当服务器应用也调用 <code>close()</code>，并且它也发送完了所有数据时。</li><li>服务器发送一个 <code>FIN</code> 段（<code>FIN=1</code>, <code>seq=v</code>）。</li></ul></li><li><strong>Step 4: Client -&gt; Server: <code>ACK</code></strong><ul><li>客户端收到 <code>FIN</code>，发送一个 <code>ACK</code> 来确认（<code>ACK=1</code>, <code>ack=v+1</code>）。</li></ul></li></ul><p>在 TCP 四次挥手的最后一步，<strong>主动关闭方</strong>（通常是客户端）发送完最后一个 <code>ACK</code> 后，并不会立即关闭连接，而是进入一个非常关键的 <strong><code>TIME_WAIT</code></strong> 状态。</p><ul><li><strong>触发时机</strong>：第 4 步发送 <code>ACK</code> 之后。</li><li><strong>持续时间</strong>：<strong>2MSL</strong> (Maximum Segment Lifetime，报文最大生存时间)。<ul><li><em>注：MSL 是任何报文段被丢弃前在网络内的最长生存时间，RFC 793 建议为 2 分钟，实际实现中通常为 30 秒或 1 分钟。</em></li></ul></li></ul><p><strong>1. 可靠地终止 TCP 连接 (防止“假死”异常关闭)</strong><br>这是为了处理<strong>第四步的 ACK 丢失</strong>的情况。</p><ul><li><strong>场景还原</strong>：<ol><li>客户端发送最后一个 <code>ACK</code> (第4步)。</li><li>如果这个 <code>ACK</code> 在网络中<strong>丢失</strong>了。</li><li><strong>服务端视角</strong>：收不到确认，它会以为自己发的 <code>FIN</code> (第3步) 丢了，于是启动超时重传，<strong>再次发送 <code>FIN</code></strong>。</li></ol></li><li><strong>TIME_WAIT 的作用</strong>：<ul><li>如果客户端还在 <code>TIME_WAIT</code> 中：它收到重传的 <code>FIN</code>，知道“哦，刚才的 ACK 丢了”，于是<strong>重发 ACK</strong>，并刷新 2MSL 计时器。</li><li><strong>如果没这个状态 (直接关闭)</strong>：客户端早已释放资源 (CLOSED)。收到重传的 <code>FIN</code> 时，它会判定为错误，回送一个 <strong><code>RST</code> (复位报文)</strong>。这将导致服务端报错（Connection Reset），而不是正常的关闭。</li></ul></li></ul><p><strong>2. 保证“旧脏数据”从网络中彻底消失 (防止“诈尸”干扰新连接)</strong><br>这是为了防止<strong>失效的连接请求报文段</strong>出现在本连接之后建立的新连接中。</p><ul><li><strong>场景还原</strong>：<ol><li>当前的连接 A (IP_1:Port_1 &lt;-&gt; IP_2:Port_2) 正在传输数据，某个数据包 <code>Seq=X</code> 在路由中滞留（迷路了），没能在关闭前到达。</li><li>连接 A 关闭。</li><li><strong>立刻</strong>在相同的 IP 和端口上建立了新连接 B。</li><li>此时，那个迷路的旧数据包 <code>Seq=X</code> 终于到达了。</li></ol></li><li><strong>TIME_WAIT 的作用</strong>：<ul><li>TCP 规定：在 <code>TIME_WAIT</code> 期间，<strong>不允许</strong>在相同的 IP:Port 二元组上建立新连接。</li><li>等待 <strong>2MSL</strong> 的时间，足以让当前连接产生的所有报文段（包括迷路的、重传的）在网络中自然消亡（TTL 耗尽）。</li><li>从而保证：<strong>当建立新连接时，网络中再也不会有旧连接的“僵尸包”来捣乱。</strong></li></ul></li></ul><hr><h2 id="3-6-拥塞控制-Congestion-Control-原理">3.6 拥塞控制 (Congestion Control) 原理</h2><h3 id="什么是拥塞-Congestion-？">什么是拥塞 (Congestion)？</h3><ul><li><strong>非正式定义</strong>：“太多的源端，发送了太多的数据，太快了，以至于<mark>网络</mark>无法处理”。</li><li><strong>表现</strong>：<ul><li><strong>丢包 (Lost Packets)</strong>：路由器的缓冲区溢出。</li><li><strong>长延迟 (Long Delays)</strong>：分组在路由器的缓冲区中排队。</li></ul></li></ul><h3 id="拥塞控制-vs-流量控制-Congestion-vs-Flow-Control">拥塞控制 vs 流量控制 (Congestion vs Flow Control)</h3><p>这是一个非常重要的区别：</p><ul><li><strong>流量控制 (Flow Control)</strong>：<ul><li><strong>问题</strong>：发送方太快，<strong>接收方</strong> 处理不过来。</li><li><strong>类比</strong>：B 说：“你说慢点，我拿笔记一下”。</li><li><strong>解决</strong>：TCP 使用 <strong>接收窗口 (RcvWindow)</strong> 字段。</li></ul></li><li><strong>拥塞控制 (Congestion Control)</strong>：<ul><li><strong>问题</strong>：发送方（们）太快，<strong>网络</strong> 处理不过来。</li><li><strong>类比</strong>：B 说：“你说慢点，我这信号不好（网络卡），听不清”。</li><li><strong>解决</strong>：TCP 使用 <strong>拥塞窗口 (CongWin)</strong>。</li></ul></li></ul><h3 id="拥塞的代价-Costs-of-Congestion">拥塞的代价 (Costs of Congestion)</h3><ol><li><strong>大延迟</strong>：当输入速率接近链路容量时，排队延迟趋于无穷大。</li><li><strong>不必要的重传</strong>：由于延迟大导致过早超时，发送方重传了并未丢失的包，浪费网络带宽。</li><li><strong>上游带宽浪费</strong>：在一个多跳路径中，如果一个分组在下游链路被丢弃，那么它在所有上游链路中传输所占用的带宽就完全被浪费了。</li></ol><h3 id="拥塞控制的方法">拥塞控制的方法</h3><ol><li><strong>端到端拥塞控制 (End-to-end Congestion Control)</strong>：<ul><li>网络不提供明确的反馈。</li><li>端系统通过观察 <strong>丢包 (Loss)</strong> 和 <strong>延迟 (Delay)</strong> 来 <em>推断</em> 网络是否拥塞。</li><li><strong>这是 TCP 采用的方法。</strong></li></ul></li><li><strong>网络辅助拥塞控制 (Network-assisted Congestion Control)</strong>：<ul><li>路由器提供明确的反馈给端系统。</li><li>例如，路由器可以设置一个 ECN (Explicit Congestion Notification) 位，或者直接告诉发送方一个明确的速率 (Explicit Rate)。</li></ul></li></ol><hr><h2 id="3-7-TCP-拥塞控制-TCP-Congestion-Control">3.7 TCP 拥塞控制 (TCP Congestion Control)</h2><h4 id="拥塞窗口-Congestion-Window"><strong>拥塞窗口 (Congestion Window)</strong></h4><ol><li><strong>功能</strong>：拥塞窗口用于限制TCP发送方在任意时刻可以向网络中发送、但尚未收到确认的数据量 。发送方必须遵守规则：<code>LastByteSent - LastByteAcked &lt; CongWin</code> 。</li><li><strong>目的</strong>：它反映了发送方对网络拥塞程度的感知 。它是一个动态变化的值 。</li><li><strong>速率控制</strong>：发送方的传输速率（以字节/秒为单位）大致等于拥塞窗口的大小 (<code>CongWin</code>) 除以 RTT (往返时间) 。</li></ol><h4 id="AIMD-Additive-Increase-Multiplicative-Decrease-是-TCP-拥塞控制的核心思想。">AIMD (Additive Increase, Multiplicative Decrease) 是 TCP 拥塞控制的核心思想。</h4><ul><li><strong>基本策略</strong>：发送方不断增加其传输速率（通过增大拥塞窗口 <code>CongWin</code>）来探测可用带宽，直到发生丢包（检测到拥塞）。一旦发生丢包，就大幅削减其传输速率。</li><li><strong>加法增大 (Additive Increase - AI)</strong>：<ul><li>在“拥塞避免”阶段，<code>CongWin</code> 每经过一个 RTT (Round Trip Time) 就会增加 1 MSS (Maximum Segment Size)。</li><li>这是一种线性的、缓慢的增长方式，用于温和地探测更多可用带宽。</li></ul></li><li><strong>乘法减小 (Multiplicative Decrease - MD)</strong>：<ul><li>当检测到一次丢包事件（例如超时或收到3个重复ACK）时，发送方会将 <code>CongWin</code> 切割为一半。</li><li>这是一种快速的、大幅度的速率降低，用于迅速缓解网络拥塞。</li></ul></li><li><strong>行为模式</strong>：<ul><li>这种 AI 和 MD 结合的策略导致 <code>CongWin</code> 的变化呈现出一种“锯齿形” (Sawtooth) 行为。</li><li>窗口大小线性增长，直到发生丢包，然后被迅速（乘法）减半，再开始新一轮的线性增长。<br>TCP 采用端到端的方法，通过 <strong>丢包事件 (Loss Event)</strong> 来推断拥塞。</li></ul></li><li><strong>丢包事件</strong> = <strong>超时 (Timeout)</strong> 或 <strong>收到3个重复ACK</strong>。</li><li>TCP 发送方维护一个 <strong>拥塞窗口 (Congestion Window - <code>CongWin</code>)</strong>。</li><li>发送方的实际发送速率 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo><mtext>CongWin</mtext><mi mathvariant="normal">/</mi><mtext>RTT</mtext></mrow><annotation encoding="application/x-tex">\approx \text{CongWin} / \text{RTT}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">CongWin</span></span><span class="mord">/</span><span class="mord text"><span class="mord">RTT</span></span></span></span></span>。</li><li>发送方通过调整 <code>CongWin</code> 的大小来控制其向网络发送数据的速率。</li></ul><p>TCP 拥塞控制由三个核心机制组成：</p><ol><li><strong>慢启动 (Slow Start - SS)</strong></li><li><strong>拥塞避免 (Congestion Avoidance - CA)</strong></li><li><strong>快速恢复 (Fast Recovery)</strong></li></ol><h4 id="1-慢启动-Slow-Start">1. 慢启动 (Slow Start)</h4><ul><li><strong>目的</strong>：在连接刚开始时，快速地“探测”可用带宽，找到拥塞发生的“大致位置”。</li><li><strong>机制</strong>：<ul><li>连接开始时，设置 <code>CongWin = 1</code> MSS (Maximum Segment Size)。</li><li><mark><strong>每当收到一个 ACK</strong></mark>，就将 <code>CongWin</code> 增加 1 MSS。</li><li><strong>效果</strong>：这导致 <code>CongWin</code> <strong>每经过一个 RTT 就翻倍</strong>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>→</mo><mn>2</mn><mo>→</mo><mn>4</mn><mo>→</mo><mn>8</mn><mo>→</mo><mn>16...</mn></mrow><annotation encoding="application/x-tex">1 \to 2 \to 4 \to 8 \to 16...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">8</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">16...</span></span></span></span>）。</li><li>这是一个 <strong>指数增长 (Exponential Growth)</strong> 过程。</li></ul></li></ul><h4 id="2-拥塞避免-Congestion-Avoidance">2. 拥塞避免 (Congestion Avoidance)</h4><ul><li><p><strong>目的</strong>：当 <code>CongWin</code> 增长到一定程度（即接近网络容量）时，转为一种更温和的探测方式，避免造成拥塞。</p></li><li><p><strong>机制</strong>：<strong>AIMD</strong></p><ul><li><strong>加法增大 (Additive Increase)</strong>：<strong>每经过一个 RTT</strong>，<code>CongWin</code> 只增加 1 MSS。</li><li><strong>实现</strong>：对于收到的 <em>每个</em> ACK，<code>CongWin += MSS * (MSS / CongWin)</code>。</li><li>这是一个 <strong>线性增长 (Linear Growth)</strong> 过程。</li></ul></li><li><p><strong>SS 和 CA 的转换</strong>：</p><ul><li>TCP 维护一个 <strong>阈值 (Threshold)</strong> 变量。</li><li>当 <code>CongWin &lt; Threshold</code> 时：处于 <strong>慢启动</strong> 状态（指数增长）。</li><li>当 <code>CongWin &gt; Threshold</code> 时：处于 <strong>拥塞避免</strong> 状态（线性增长）。</li><li>当 <code>CongWin == Threshold</code> 时：两者皆可。</li></ul></li></ul><h4 id="3-快速恢复-Fast-Recovery">3. 快速恢复 (Fast Recovery)</h4><ul><li><p><strong>目的</strong>：对不同严重程度的丢包事件做出不同反应。</p></li><li><p><strong>TCP Reno 算法</strong>：</p><ul><li><strong>事件1：超时 (Timeout)</strong><ul><li><strong>认为</strong>：这是一个 <strong>严重</strong> 的拥塞信号。</li><li><strong>动作</strong>：<ol><li><code>Threshold = CongWin / 2</code></li><li><strong><code>CongWin = 1</code> MSS</strong></li><li>进入 <strong>慢启动</strong> 状态。</li></ol></li></ul></li><li><strong>事件2：收到3个重复ACK</strong><ul><li><strong>认为</strong>：这是一个 <strong>轻微</strong> 的拥塞信号（网络还能传包）。</li><li><strong>动作 (这就是快速恢复)</strong>：<ol><li>触发 <strong>快速重传</strong>（重传丢失的包）。</li><li><code>Threshold = CongWin / 2</code> <mark>阈值设置为当前拥塞窗口的一半</mark></li><li><strong><code>CongWin = Threshold</code></strong> (乘法减小 - Multiplicative Decrease, MD)</li><li>进入 <strong>拥塞避免</strong> 状态 (而不是慢启动)。</li></ol></li></ul></li></ul></li><li><p><strong>TCP Tahoe 算法</strong> (早期版本)：</p><ul><li>无论是超时还是 3 个重复 ACK，它都一律将 <code>CongWin</code> 设为 1 MSS 并进入慢启动。Reno 是一种优化。</li></ul></li></ul><ul><li>处理时间是每次收到ACK都要进行处理，在收到ACK时候多发一个（增加一个MSS）</li></ul><h3 id="TCP-拥塞控制的演进">TCP 拥塞控制的演进</h3><ul><li><strong>基于丢包 (Loss-based)</strong>：<ul><li><strong>Tahoe</strong>: 早期版本。</li><li><strong>Reno</strong>: 经典版本，区分了超时和3-dup-ACK。</li><li><strong>Cubic</strong>: 现代 Linux 内核的默认算法，为高带宽、低丢包率网络优化。</li></ul></li><li><strong>基于 RTT (RTT-based)</strong>：<ul><li><strong>Vegas</strong>: 未被广泛采用。</li></ul></li><li><strong>基于链路容量 (Capacity-based)</strong>：<ul><li><strong>BBR (Bottleneck Bandwidth and Round-trip propagation time)</strong>：由 Google 提出 (2016)，已在 Google、YouTube 部署，显著降低延迟。</li></ul></li></ul><h3 id="TCP-公平性-Fairness">TCP 公平性 (Fairness)</h3><ul><li><strong>目标</strong>：如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span> 个 TCP 连接共享一个带宽为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span> 的瓶颈链路，每个连接应平均获得 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mi mathvariant="normal">/</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">R/K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span> 的速率。</li><li><strong>AIMD 实现了公平性</strong>：两个竞争的连接会自然地收敛到平等的带宽共享。</li><li><strong>不公平的来源</strong>：<ol><li><strong>UDP</strong>：UDP 不使用拥塞控制。一个高速的 UDP 流会抢占 TCP 的带宽，导致 TCP 连接饿死（速率降到极低）。</li><li><strong>并行 TCP 连接 (Parallel TCP Connections)</strong>：一个应用程序（如Web浏览器）可以同时打开多个（例如10个）TCP连接到同一个服务器。这10个连接会与其它应用程序的1个连接竞争，导致该应用获得 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo><mn>10</mn><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><mn>10</mn><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\approx 10/(10+1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">10/</span><span class="mopen">(</span><span class="mord">10</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span> 的带宽，而其它应用只有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><mn>10</mn><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">1/(10+1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/</span><span class="mopen">(</span><span class="mord">10</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>。</li></ol></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-02-Transport-Layer-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-02-Transport-Layer-02/"/>
    <published>2026-01-14T18:55:00.000Z</published>
    <summary>3.4 可靠数据传输 (Reliable Data Transfer - RDT) 原理</summary>
    <title>Network - 02.Transport Layer-02</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success **传输层的主要任务**">            <ul><li>在两个<strong>端点（主机）上运行的应用程序进程</strong>之间建立、管理和终止通信会话。这与<strong>网络层</strong>负责<strong>主机之间</strong>的通信形成对比。<ul><li><strong>网络层 (主机到主机)</strong>: 负责将数据包从源主机路由到目的主机，使用 <strong>IP地址</strong> 进行寻址。例如，你的电脑向Google的服务器发送一个请求。</li><li><strong>传输层 (进程到进程)</strong>: 负责将数据从源主机上的特定进程交付到目的主机上的特定进程，使用 <strong>端口号</strong> 进行寻址。例如，你的浏览器进程 (端口号 12345) 向Google服务器上的Web服务器进程 (端口号 80 或 443) 发送请求。</li></ul></li><li><strong>可靠数据传输 (Reliable Data Transfer - RDT)：</strong> 确保数据完整、按序到达。这是 TCP 协议的核心功能 。<ul><li><strong>连接管理：</strong> 建立和拆除连接（例如 TCP 的三次握手和四次挥手） 。</li><li><strong>流量控制 (Flow Control)：</strong> 防止发送方的数据淹没接收方 。</li><li><strong>拥塞控制 (Congestion Control)：</strong> 防止网络过载（例如 AIMD、慢启动） 。</li><li><strong>多路复用/解复用：</strong> (通过 TCP/UDP 隐含) 使用端口号将数据交付给正确的应用程序进程。</li><li><strong>差错检测：</strong> 使用<strong>校验和 (Checksum)</strong> 检查数据在端到端传输中是否出错</li></ul></li></ul>          </div><h2 id="一、传输层概述-Transport-Layer-Services">一、传输层概述 (Transport Layer Services)</h2><h3 id="1-1-学习目标-Goals">1.1 学习目标 (Goals)</h3><ul><li><strong>理解传输层服务背后的原理 (Principles)</strong><ul><li>多路复用 (Multiplexing) / 多路分用 (Demultiplexing)</li><li>可靠数据传输 (Reliable Data Transfer)</li><li>流量控制 (Flow Control)</li><li>拥塞控制 (Congestion Control)</li></ul></li><li><strong>学习互联网中的传输层协议 (Protocols)</strong><ul><li><strong>UDP</strong>: 无连接传输 (Connectionless Transport)</li><li><strong>TCP</strong>: 面向连接的传输 (Connection-oriented Transport)</li><li>TCP 拥塞控制 (TCP Congestion Control)</li></ul></li></ul><h3 id="1-2-传输层的核心功能">1.2 传输层的核心功能</h3><ul><li>传输层协议为运行在不同主机上的<mark><strong>应用进程 (Application Processes)</strong></mark> 之间提供<mark><strong>逻辑通信 (Logical Communication)</strong></mark>。</li><li>传输协议只运行在<strong>端系统 (End Systems)</strong> 中。<ul><li><strong>发送方 (Send Side)</strong>: 将应用层的报文 (Messages) 分割成<strong>报文段 (Segments)</strong>，然后传递给网络层。</li><li><strong>接收方 (Rcv Side)</strong>: 将接收到的报文段重组成报文，并传递给应用层。</li></ul></li><li>互联网为应用提供了多种传输协议，主要是 TCP 和 UDP。</li></ul><h3 id="1-3-传输层-vs-网络层-Transport-vs-Network-Layer">1.3 传输层 vs. 网络层 (Transport vs. Network Layer)</h3><ul><li><strong>网络层 (Network Layer)</strong>: 提供<font color="#ffc000">主机 (Hosts)</font> 之间的逻辑通信。</li><li><strong>传输层 (Transport Layer)</strong>: 提供<font color="#ffc000">进程(Processes)</font>  之间的逻辑通信。 它依赖于网络层提供的服务，并对其进行增强。</li></ul><div class="note note-info">            <ul><li>12个孩子之间互相写信。</li><li>进程 (Processes) = 孩子们 (Kids)</li><li>应用报文 (App Messages) = 信封里的信件 (Letters)</li><li>主机 (Hosts) = 房子 (Houses)</li><li><strong>传输层协议</strong> = Ann 和 Bill（负责在屋里收发信件，确保信件交给正确的孩子）。</li><li><strong>网络层协议</strong> = 邮政服务 (Postal Service)（负责在房子之间传递信件）。</li></ul>          </div><h3 id="1-4-互联网协议栈中的数据单位">1.4 互联网协议栈中的数据单位</h3><table><thead><tr><th style="text-align:left">协议层</th><th style="text-align:left">数据基本单位</th></tr></thead><tbody><tr><td style="text-align:left"><strong>应用层 (Application Layer)</strong></td><td style="text-align:left">消息 (Message)</td></tr><tr><td style="text-align:left"><strong>传输层 (Transport Layer)</strong></td><td style="text-align:left">数据段 (Segment)</td></tr><tr><td style="text-align:left"><strong>网络层 (Network Layer)</strong></td><td style="text-align:left">数据包 (Datagram)</td></tr><tr><td style="text-align:left"><strong>链路层 (Link Layer)</strong></td><td style="text-align:left">数据帧 (Frame)</td></tr><tr><td style="text-align:left"><strong>物理层 (Physical Layer)</strong></td><td style="text-align:left">符号 (Symbol)、比特 (Bit)</td></tr></tbody></table><hr><h2 id="二、多路复用与多路分用-Multiplexing-and-Demultiplexing">二、多路复用与多路分用 (Multiplexing and Demultiplexing)</h2><ul><li><strong>多路分用 (Demultiplexing)</strong>: 在接收方主机，将收到的报文段根据头部信息分发给正确的套接字 (Socket)。</li><li><strong>多路复用 (Multiplexing)</strong>: 在发送方主机，从多个套接字收集数据，并为每个数据块封装上头部信息（用于后续的分用），然后传递给网络层。</li></ul><div class="note note-info">            <ol><li><p>定义与角色<br>套接字是应用层与传输层之间的编程接口 (API)。它是应用程序进程与网络协议栈进行数据交换的“门户”。</p></li><li><p>形象比喻<br>如果把网络通信比作寄信：</p><ul><li><strong>进程</strong>是房子里的人。</li><li><strong>套接字</strong>就是房子的<strong>门</strong>。</li><li>发送数据时，进程把报文推过这扇“门”，之后就由门外的运输部门（TCP/UDP）负责投递。</li></ul></li><li><p>寻址标识<br>一个套接字通常由 IP 地址（标识主机）和 端口号（标识进程）共同唯一确定。</p><ul><li><strong>Socket = (IP Address : Port Number)</strong></li></ul></li><li><p>主要类型</p><ul><li><strong>TCP 套接字 (Stream Socket):</strong> 提供面向连接、可靠的字节流服务。</li><li><strong>UDP 套接字 (Datagram Socket):</strong> 提供无连接、不可靠的数据报服务。</li></ul></li></ol>          </div><h3 id="2-1-分用是如何工作的">2.1 分用是如何工作的</h3><p>主机使用 <strong>IP 地址</strong> 和 <strong>端口号 (Port Numbers)</strong> 将报文段定向到正确的套接字。</p><ul><li>每个数据报 (Datagram) 都包含源 IP 地址和目的 IP 地址。</li><li>每个数据报携带一个传输层报文段 (Segment)。</li><li>每个报文段都包含源端口号 (Source Port #) 和目的端口号 (Dest Port #)。</li></ul><h3 id="2-2-无连接分用-Connectionless-Demultiplexing-UDP">2.2 无连接分用 (Connectionless Demultiplexing - UDP)</h3><ul><li>一个 UDP 套接字由一个包含<mark><strong>两个元素</mark>的元组 (Two-tuple)</strong> 来标识：<code>(目的IP地址, 目的端口号)</code>。</li><li>当主机收到一个 UDP 报文段时，它检查报文段中的<strong>目的端口号</strong>，并将其定向到绑定该端口号的套接字。</li><li>因此，来自不同源 IP 地址或源端口号的 IP 数据报，只要它们的目的端口号相同，都会被定向到同一个 UDP 套接字。</li></ul><h3 id="2-3-面向连接的分用-Connection-oriented-Demultiplexing-TCP">2.3 面向连接的分用 (Connection-oriented Demultiplexing - TCP)</h3><ul><li>一个 TCP 套接字<em>socket</em>由一个包含<strong>四个元素的元组 (Four-tuple)</strong> 来标识：<code>(源IP地址, 源端口号, 目的IP地址, 目的端口号)</code>。</li><li>接收方主机会使用这<strong>全部四个值</strong>来将报文段定向到正确的套接字。</li><li>这意味着服务器可以为每一个连接的客户端维护一个独立的套接字，每个套接字都由其唯一的四元组标识。</li></ul><hr><h2 id="三、无连接传输-UDP-User-Datagram-Protocol">三、无连接传输: UDP (User Datagram Protocol)</h2><p>UDP 是一种 “精简” 或 “最基本” 的互联网传输协议。</p><h3 id="3-1-UDP-的特点">3.1 UDP 的特点</h3><ul><li><strong>尽力而为 (Best Effort)</strong>: UDP 报文段可能会<strong>丢失 (Lost)</strong> 或<strong>乱序 (Delivered out of order)</strong> 到达。</li><li><strong>无连接 (Connectionless)</strong>: 在数据传输前，发送方和接收方之间没有<strong>握手 (Handshaking)</strong> 过程。 每个 UDP 报文段都是独立处理的。</li><li><strong>为什么需要 UDP?</strong><ul><li><strong>无连接建立延迟</strong>: 省去了建立连接所需的时间。</li><li><strong>简单</strong>: 发送方和接收方无需维护连接状态。</li><li><strong>头部开销小</strong>: UDP 的头部只有 8 字节，非常小。</li><li><strong>无拥塞控制</strong>: UDP 可以按照应用期望的速率发送数据，不会被拥塞控制限制。</li></ul></li></ul><h3 id="3-2-UDP-的应用">3.2 UDP 的应用</h3><ul><li>常用于<mark><strong>流媒体</mark>应用 (Streaming Multimedia Apps)</strong>，因为这类应用能容忍部分数据丢失 (Loss Tolerant)，但对传输速率敏感 (Rate Sensitive)。</li><li>其他用途包括 <mark><strong>DNS</strong> 和 <strong>SNMP</strong></mark>。</li><li>如果需要在 UDP 上实现可靠传输，必须在<strong>应用层 (Application Layer)</strong> 增加可靠性机制。</li></ul><h3 id="3-3-UDP-报文段格式与校验和-Checksum">3.3 UDP 报文段格式与校验和 (Checksum)</h3><div class="note note-info">            <ol><li><strong>准备数据</strong><ol><li><strong>分块：</strong> 将所有需要校验的数据（例如 TCP 头部 + TCP 数据 + 伪首部）在逻辑上划分为 16 位（2 字节）的块。</li><li><strong>补齐：</strong> 如果数据的总字节数是奇数，就在末尾（逻辑上）补一个全 0 的字节 (0x00)，使其成为偶数，以便能配成 16 位的块。</li><li><strong>清零：</strong> 将数据中用于存放“校验和”的字段（例如 TCP 头部中的 Checksum 字段）全部设为 0。</li></ol></li><li><strong>计算 1 的补码和</strong><ol><li><strong>相加：</strong> 将所有 16 位的块看作无符号整数，进行二进制加法。</li><li><strong>回卷 (Wrap Around)：</strong> 1 的补码加法有一个关键特性：如果两个 16 位的数相加产生了第 17 位（即发生了溢出或“进位”），<strong>这个进位不能丢弃</strong>。您必须将这个进位（值总为 1）加回到总和的最低位。这个过程称为**“回卷” (end-around carry)**。</li><li><strong>迭代：</strong> 持续进行回卷操作，直到所有的进位都被加回去，最终的总和是一个 16 位的数。</li></ol></li><li><strong>取反</strong><ol><li><strong>1 的补码：</strong> 对第 2 步得到的最终 16 位总和，按位取反（即 1 变成 0，0 变成 1）。</li><li><strong>存入：</strong> 得到的结果就是最终的校验和。发送方将这个 16 位的值放入头部（例如 TCP 头部）的 Checksum 字段中，然后将数据包发送出去。</li></ol></li></ol>          </div><div class="note note-info">            <ol><li>核心数学原理</li></ol><p>在二进制反码算术中，一个数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 与其反码 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∼</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">\sim S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 相加，结果的每一位都是 1（即全 1）。</p><ul><li>公式：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>+</mo><mo stretchy="false">(</mo><mo>∼</mo><mi>S</mi><mo stretchy="false">)</mo><mo>=</mo><mn>11...11</mn></mrow><annotation encoding="application/x-tex">S + (\sim S) = 11...11</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">11...11</span></span></span></span></li></ul><ol start="2"><li>接收端的“零开销”验证</li></ol><p>取反操作使得接收端可以将校验和字段视为普通数据的一部分，直接参与整体加法运算，无需专门提取。</p><ul><li><p><strong>发送端：</strong> 发送 <code>数据</code> + <code>~Sum</code>。</p></li><li><p><strong>接收端：</strong> 计算 <code>数据</code> + <code>~Sum</code>。如果传输无误，这等价于计算 <code>Sum</code> + <code>~Sum</code>。</p></li></ul><ol start="3"><li>效率提升</li></ol><p>最终结果应为 全 1。在硬件电路中，检测“全 1”或“全 0”比比较两个数值更快速、更简单。</p>          </div><ul><li><strong>UDP 头部</strong>: 包括源端口、目的端口、长度和校验和。</li><li><strong>校验和 (Checksum)</strong>: 用于检测传输过程中报文段出现的<strong>差错 (Errors)</strong>，例如比特翻转。<ul><li><strong>发送方</strong>: 将报文段内容视为一系列16比特的整数，计算它们的<strong>反码和 (1’s Complement Sum)</strong>（将进位的1加在最低位上），并将结果存入校验和字段。</li><li><strong>接收方</strong>: 对收到的报文段重新计算校验和，并与头部中的校验和字段进行比对。 如果不匹配，则检测到错误。</li></ul></li></ul><hr><h2 id="四、可靠数据传输原理-Principles-of-Reliable-Data-Transfer-RDT">四、可靠数据传输原理 (Principles of Reliable Data Transfer - RDT)</h2><p>目标：在不可靠的信道上实现可靠的数据传输。 这是网络领域最重要的十大主题之一。 我们将通过有限状态机 (FSM) 逐步构建可靠数据传输协议。</p><h3 id="4-1-RDT-1-0-可靠信道上的可靠传输">4.1 RDT 1.0: 可靠信道上的可靠传输</h3><ul><li><strong>假设</strong>: 底层信道是完全可靠的，没有比特错误，也没有丢包。</li><li><strong>实现</strong>: 发送方从上层接收数据，打包后发送；接收方从信道接收数据，解包后交付给上层。</li></ul><h3 id="4-2-RDT-2-0-应对比特错误-Channel-with-Bit-Errors">4.2 RDT 2.0: 应对<strong>比特错误</strong> (Channel with Bit Errors)</h3><ul><li><strong>新情况</strong>: 底层信道可能会翻转数据包中的比特，但是不会有丢包。<mark>接收方必须要有发现错误的机制</mark></li><li><strong>解决方案</strong>: 引入<strong>错误检测</strong>和<strong>接收方反馈</strong>机制。<ul><li><strong>校验和 (Checksum)</strong>: 用于检测比特错误。</li><li><strong>确认 (Acknowledgements, ACKs)</strong>: 接收方告知发送方数据包已成功接收，可以发送下一个数据包。</li><li><strong>否定确认 (Negative Acknowledgements, NAKs)</strong>: 接收方告知发送方数据包已损坏。</li><li><strong>重传 (Retransmission)</strong>: 发送方在收到 NAK 后，重传该数据包。</li></ul></li></ul><h3 id="4-3-RDT-2-1-2-2-应对损坏的ACK-NAK">4.3 RDT 2.1 &amp; 2.2: 应对<strong>损坏的ACK/NAK</strong></h3><ul><li><strong>RDT 2.0 的致命缺陷</strong>: 如果 ACK 或 NAK 本身在传输中损坏了怎么办？ 发送方无法确定接收方的状态，直接重传可能导致<strong>重复数据包 (Duplicate Packets)</strong>。</li><li><strong>解决方案</strong>:<ul><li><strong>RDT 2.1</strong>: 引入<strong>序列号 (Sequence Number)</strong>。 发送方为每个数据包添加序列号（如0和1交替）。 接收方通过检查序列号来判断是否是重复数据包，如果是则直接丢弃。</li><li><strong>RDT 2.2 (无 NAK 协议)</strong>: 接收方只发送 ACK。 为了告知哪个包被正确接收，ACK 中必须包含被确认包的序列号。 如果发送方收到一个<mark><strong>重复的 ACK</strong>，就执行与收到 NAK 相同</mark>的操作：重传当前数据包。</li></ul></li></ul><h3 id="4-4-RDT-3-0-应对丢包-Packet-Loss">4.4 RDT 3.0: 应对<strong>丢包</strong> (Packet Loss)</h3><ul><li><strong>新情况</strong>: 底层信道不仅会出错，还可能丢失数据包（数据或ACK）。</li><li><strong>解决方案</strong>: 引入<strong>定时器 (Countdown Timer)</strong>。<ul><li>发送方在发送数据包后，启动一个定时器。</li><li>如果在定时器超时前没有收到对应的 ACK，就认为数据包丢失，并<strong>重传 (Retransmits)</strong> 该数据包。</li><li>序列号机制可以很好地处理因延迟而非丢失导致的重传（即重复包问题）。</li></ul></li><li>RDT 3.0 也被称为<strong>停等协议 (Stop-and-Wait Protocol)</strong>。</li></ul><h3 id="4-5-RDT-机制总结">4.5 RDT 机制总结</h3><p>为了在不可靠信道上实现可靠数据传输，最终的解决方案整合了四项核心机制：</p><ol><li><strong>校验和 (Checksum)</strong>: 解决比特错误问题。</li><li><strong>确认 (ACK)</strong>: 提供接收方反馈。</li><li><strong>序列号 (Sequence Number)</strong>: 解决重复数据包问题。</li><li><strong>定时器 (Timer)</strong>: 解决丢包问题。</li></ol><h3 id="4-6-RDT-3-0-协议性能分析">4.6 RDT 3.0 协议性能分析</h3><p>rdt3.0 协议虽然实现了可靠传输，但其“<strong>停止-等待</strong>”（Stop-and-Wait）机制在现代网络（高带宽、高延迟）中性能极差，导致带宽资源被严重浪费。</p><h4 id="1-问题根源：停止-等待机制">1. 问题根源：停止-等待机制</h4><ul><li><strong>工作模式</strong>: 发送方每发送一个数据包，就必须<strong>停止</strong>并<strong>等待</strong>接收方返回确认（ACK）后，才能发送下一个。</li><li><strong>时间浪费</strong>: 在等待ACK返回的整个往返时间（RTT）内，发送方完全处于<strong>空闲状态</strong>，无法利用链路发送更多数据。</li></ul><h4 id="2-实例量化分析">2. 实例量化分析</h4><p>PPT中的例子生动地展示了这个问题：</p><ul><li><strong>场景</strong>: 在一个 1 Gbps 的高速链路上，往返延迟（RTT）为 30ms。</li><li><strong>发送耗时 (<code>L/R</code>)</strong>: 发送一个数据包本身只需要 <strong>8微秒</strong>。</li><li><strong>等待耗时 (<code>RTT</code>)</strong>: 而等待确认却需要 <strong>30,000微秒</strong>。</li><li><strong>链路利用率 (<code>Utilization</code>)</strong>: 计算得出，发送方真正在发送数据的时间仅占整个周期的 <strong>0.027%</strong>。超过 <strong>99.9%</strong> 的时间里，高速链路都处于闲置状态。</li></ul><hr><h2 id="五、流水线协议-Pipelined-Protocols">五、流水线协议 (Pipelined Protocols)</h2><h3 id="5-1-停等协议的性能问题">5.1 停等协议的性能问题</h3><p>RDT 3.0 (停等协议) 虽然能工作，但性能极差。 发送方在大部分时间里都在等待 ACK，导致链路利用率 (Utilization) 非常低。</p><h3 id="5-2-流水线-Pipelining">5.2 流水线 (Pipelining)</h3><ul><li><strong>核心思想</strong>: 允许发送方在收到 ACK 之前，连续发送多个数据包。 这就像流水线一样，让多个数据包同时处于“在途 (in-flight)”状态。</li><li><strong>优点</strong>: 极大地提高了链路利用率。</li><li><strong>要求</strong>:<ul><li>需要更大的序列号范围。</li><li>发送方和/或接收方需要设置缓冲区 (Buffering)。</li></ul></li></ul><hr><h2 id="六、滑动窗口协议：回退N帧-Go-Back-N-与选择重传-Selective-Repeat">六、滑动窗口协议：回退N帧 (Go-Back-N) 与选择重传 (Selective Repeat)</h2><p>流水线协议有两种通用形式：回退N帧 (Go-Back-N) 和选择重传 (Selective Repeat)。 它们都属于<strong>滑动窗口 (Sliding Window)</strong> 方法。</p><h3 id="6-1-回退N帧-Go-Back-N-GBN">6.1 回退N帧 (Go-Back-N, GBN)</h3><ul><li><strong>发送方</strong>:<ul><li>维护一个大小为 N 的发送窗口，最多允许有 N 个未被确认的数据包在流水线中。</li><li>只为<strong>最老的、未被确认的</strong>数据包设置一个计时器。</li><li>当计时器超时，<strong>重传所有已发送但未被确认的</strong>数据包。</li><li>当接收到窗口最左端的包的ACK时，<strong>重置</strong>计时器并<strong>移动窗口</strong>，发送移动后的窗口中未发送的数据包。</li><li>当收到重复的ACK，直接无视。</li></ul></li><li><strong>接收方</strong>:<ul><li>只发送<strong>累积确认 (Cumulative ACKs)</strong>。 <code>ACK(n)</code> 表示序列号为 n 及 n 之前的<strong>所有数据包都已正确接收</strong>。</li><li>对于乱序到达的数据包，<strong>直接丢弃 (Discard)</strong>，不进行缓存。 接收方会重新发送具有最高有序序列号的 ACK。</li></ul></li></ul><h3 id="6-2-选择重传-Selective-Repeat-SR">6.2 选择重传 (Selective Repeat, SR)</h3><ul><li><strong>发送方</strong>:<ul><li>同样维护一个大小为 N 的发送窗口。</li><li>为<strong>每一个未被确认的</strong>数据包都维护一个<mark>独立</mark>的计时器。</li><li>当某个计时器超时，<strong>只重传那一个未被确认的</strong>数据包。</li></ul></li><li><strong>接收方</strong>:<ul><li>对<strong>每一个正确接收的</strong>数据包都进行单独确认 (Individual ACKs)。</li><li>对于乱序到达的数据包，会将其<strong>缓存 (Buffers)</strong> 起来，直到所有缺失的数据包都到达，再按序交付给上层。</li><li>当收到在窗口前的数据包，可能因为之前发送的ACK损坏导致sender计时器超时，这时候再次发送ACK(n)。</li></ul></li><li>发送方和接收方窗口不对齐，是因为sender尚未收到ACK</li><li>序列号空间的大小必须是窗口大小 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>) 的 <strong>至少两倍</strong>。<ul><li><strong>原因</strong>：如果序列号空间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>=</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">= N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>（例如 N=3, 序列号 0,1,2），接收方无法区分一个序列号为 0 的分组是第一次发送的新包，还是一个迟到的重传包。</li><li>极端情况是发送方的的N个包都传到了接收方，但是接收方发送的所有ACK都丢包了。</li></ul></li></ul><h3 id="6-3-GBN-与-SR-对比总结">6.3 GBN 与 SR 对比总结</h3><table><thead><tr><th style="text-align:left">对比项</th><th style="text-align:left">回退N帧 (Go-Back-N)</th><th style="text-align:left">选择重传 (Selective Repeat)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>重传机制</strong></td><td style="text-align:left">重传所有已发送但未确认的帧。</td><td style="text-align:left">只重传丢失或损坏的帧。</td></tr><tr><td style="text-align:left"><strong>接收方行为</strong></td><td style="text-align:left">丢弃所有乱序的帧。</td><td style="text-align:left">缓存乱序的帧，直到空缺被填补。</td></tr><tr><td style="text-align:left"><strong>确认机制</strong></td><td style="text-align:left">累积确认 (Cumulative ACK)。</td><td style="text-align:left">单独确认 (Individual ACK)。</td></tr><tr><td style="text-align:left"><strong>复杂度</strong></td><td style="text-align:left">比较简单。</td><td style="text-align:left">逻辑更复杂，发送和接收方都需要排序和存储。</td></tr><tr><td style="text-align:left"><strong>适用场景</strong></td><td style="text-align:left">适用于网络条件好、误码率低的情况。</td><td style="text-align:left">适用于网络条件差、误码率高的情况。</td></tr></tbody></table>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-02-Transport-Layer-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-02-Transport-Layer-01/"/>
    <published>2026-01-14T18:45:00.000Z</published>
    <summary>在两个端点（主机）上运行的应用程序进程之间建立、管理和终止通信会话。这与网络层负责主机之间的通信形成对比。</summary>
    <title>Network - 02.Transport Layer-01</title>
    <updated>2026-07-01T11:38:22.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>Program Optimization (程序性能优化)</h1><h2 id="1-性能现状-Performance-Realities">1. 性能现状 (Performance Realities)</h2><ul><li><strong>常数因子至关重要 (Constant factors matter)</strong>：在渐进复杂度 (Asymptotic Complexity) 之外，同样的算法逻辑，代码写法的不同可能导致 10:1 的性能差异。</li><li><strong>多层级优化 (Optimize at multiple levels)</strong>：必须在多个层面进行优化：<ul><li>算法 (Algorithm)</li><li>数据表示 (Data representations)</li><li>过程 (Procedures)</li><li>循环 (Loops)</li></ul></li><li><strong>系统认知 (Understand System)</strong>：必须理解程序是如何编译和执行的，如何测量性能瓶颈，以便在不破坏代码模块化 (Modularity) 和通用性 (Generality) 的前提下提升性能。</li></ul><h2 id="2-优化编译器-Optimizing-Compilers">2. 优化编译器 (Optimizing Compilers)</h2><h3 id="2-1-编译器的能力-Capabilities">2.1 编译器的能力 (Capabilities)</h3><ul><li><strong>寄存器分配 (Register Allocation)</strong>：这是最关键的优化之一。CPU 访问寄存器的速度远快于内存。编译器会分析哪些变量使用最频繁，并将它们放入有限的寄存器中，而不是放在栈（内存）上 。</li><li><strong>代码选择与调度 (Code Selection and Ordering)</strong>：编译器会选择最适合当前 CPU 的指令序列，并重新排列指令顺序（Scheduling），以便让 CPU 的流水线更顺畅地运行，掩盖指令延迟 。</li><li><strong>死代码消除 (Dead Code Elimination)</strong>：如果一段代码计算的结果从未被使用，或者一段代码永远无法被执行（例如 <code>if (0) {...}</code>），编译器会直接将其删除，减少代码体积和执行时间 。</li><li><strong>消除微小低效 (Eliminating minor inefficiencies)</strong>：比如去除多余的跳转指令等 。</li></ul><h3 id="2-2-编译器的局限性-Limitations">2.2 编译器的局限性 (Limitations)</h3><p>虽然编译器很聪明，但它必须遵守一个<strong>基本约束 (Fundamental Constraint)</strong>：<strong>绝对不能改变程序的行为</strong> 。这意味着：</p><ol><li><strong>保守策略 (Conservative Strategy)</strong>：<ul><li>编译器无法像程序员那样了解代码的“意图”。如果编译器无法确定一个优化是否安全（例如，它不确定两个指针是否指向同一块内存，即<strong>内存别名 Memory Aliasing</strong>），它就必须假设最坏的情况，从而放弃优化 。</li><li><strong>例子</strong>：如果你的代码中有两个指针参数，编译器不敢轻易把其中一个的值缓存在寄存器里太久，因为它担心通过另一个指针的写入可能会修改这个值。</li></ul></li><li><strong>分析范围受限</strong>：<ul><li>大多数优化分析仅限于<strong>过程 (Procedure/Function) 内部</strong>。编译器通常看不到函数调用的内部细节（除非内联），因此它必须假设函数调用会有<strong>副作用 (Side-effects)</strong>，比如修改全局变量 。</li><li><strong>全程序分析 (Whole-program analysis)</strong> 虽然存在，但对于大型程序来说，编译时间开销过大，通常不作为默认选项 。</li></ul></li><li><strong>静态信息局限</strong>：<ul><li>编译器只能看到代码的静态结构，无法知道运行时变量的具体值（例如 <code>n</code> 到底是大是小）。因此它很难针对特定的运行时情况做极致优化 。</li></ul></li></ol><h2 id="3-通用优化方法-Generally-Useful-Optimizations">3. 通用优化方法 (Generally Useful Optimizations)</h2><p>无论使用何种处理器或编译器，程序员都应尝试的优化手段。</p><h3 id="3-1-代码移动-Code-Motion-预计算-Precomputation">3.1 代码移动 (Code Motion) / 预计算 (Precomputation)</h3><ul><li><p><strong>原理</strong>：减少计算执行的频率。</p></li><li><p><strong>场景</strong>：将计算结果不会改变的代码从循环内部移到循环外部。</p></li><li><p><strong>案例 1：矩阵行访问</strong></p><ul><li><strong>未优化</strong>：在 <code>for (j=0; j&lt;n; j++)</code> 循环内部写 <code>a[n*i + j]</code>。这里 <code>n*i</code> 在每次 <code>j</code> 循环中都要算一次，但其实 <code>i</code> 和 <code>n</code> 在内层循环里没变。</li><li><strong>优化后</strong>：在循环前定义 <code>long ni = n*i;</code>，循环内直接用 <code>a[ni + j]</code>。这减少了 <code>n</code> 次乘法运算 。</li></ul></li></ul><ul><li><strong>案例 2：过程调用 (<code>strlen</code>) —— 经典反面教材</strong><ul><li><strong>问题代码</strong>：<code>for (i=0; i &lt; strlen(s); i++) { ... }</code></li><li><strong>性能陷阱</strong>：<code>strlen</code> 需要遍历整个字符串来确定长度，复杂度是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>。把它放在循环终止条件里，意味着每次迭代都要执行一次。总复杂度变成了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>N</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 。</li><li><strong>优化后</strong>：</li></ul>  <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">int</span> len = <span class="hljs-built_in">strlen</span>(s);<br><span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>; i &lt; len; i++) &#123; ... &#125;<br></code></pre></td></tr></table></figure><ul><li><strong>效果</strong>：将复杂度降回 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>。这是一种极大的性能提升，且编译器往往因为担心 <code>strlen</code> 有副作用（虽然标准库函数通常没问题，但编译器视其为黑盒）而不敢自动优化。</li></ul></li></ul><h3 id="3-2-强度削减-Reduction-in-Strength">3.2 强度削减 (Reduction in Strength)</h3><ul><li><strong>原理</strong>：用代价更低 (Simpler/Costly less) 的操作替代高代价操作。</li><li><strong>示例</strong>：<ul><li><strong>移位代替乘除</strong>：例如用 <code>x &lt;&lt; 4</code> 代替 <code>16 * x</code>。</li><li><strong>累加代替乘法</strong>：在循环中用 <code>ni += n</code> 代替 <code>ni = n * i</code>。</li></ul></li></ul><h3 id="3-3-公共子表达式共享-Share-Common-Subexpressions">3.3 公共子表达式共享 (Share Common Subexpressions)</h3><ul><li><strong>核心思想</strong>：不要让 CPU 重复计算已经算过的东西 。</li><li><strong>案例：图像处理/矩阵邻居求和</strong><ul><li>假设你要访问像素 <code>(i, j)</code> 的上下左右四个邻居：<ul><li>上：<code>(i-1)*n + j</code></li><li>下：<code>(i+1)*n + j</code></li><li>左：<code>i*n + j - 1</code></li><li>右：<code>i*n + j + 1</code></li></ul></li><li><strong>未优化</strong>：代码中直接写上述公式，导致进行了 3 次乘法：<code>i*n</code>, <code>(i-1)*n</code>, <code>(i+1)*n</code> 。</li><li><strong>优化后</strong>  <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> inj = i * n + j; <span class="hljs-comment">// 算出中心点索引，只做一次乘法</span><br>up    = val[inj - n];<br>down  = val[inj + n];<br>left  = val[inj - <span class="hljs-number">1</span>];<br>right = val[inj + <span class="hljs-number">1</span>];<br></code></pre></td></tr></table></figure></li><li>这样只需要 1 次乘法和几次简单的加减法，大大减少了计算量 。</li></ul></li></ul><h2 id="4-优化障碍-Optimization-Blockers">4. 优化障碍 (Optimization Blockers)</h2><h3 id="4-1-过程调用-Procedure-Calls">4.1 过程调用 (Procedure Calls)</h3><ul><li><strong>问题</strong>：编译器通常将函数调用视为<strong>黑盒 (Black Box)</strong>。<ul><li>函数可能有<strong>副作用 (Side Effects)</strong>（如修改全局状态），阻止了代码移动。</li><li>编译器难以确定函数返回值在参数不变时是否恒定。</li></ul></li><li><strong>解决方案</strong>：<ul><li><strong>内联函数 (Inline functions)</strong>：减少调用开销，允许跨过程优化。</li><li><strong>手动代码移动</strong>：显式地将函数调用（如 <code>strlen</code>）移出循环。</li></ul></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">lower</span><span class="hljs-params">(<span class="hljs-type">char</span> *s)</span> <br>&#123; <br><span class="hljs-type">int</span> i; <br><span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-built_in">strlen</span>(s); i++) <br><span class="hljs-keyword">if</span> (s[i] &gt;= <span class="hljs-string">&#x27;A&#x27;</span> &amp;&amp; s[i] &lt;= <span class="hljs-string">&#x27;Z&#x27;</span>) <br>s[i] -= (<span class="hljs-string">&#x27;A&#x27;</span> - <span class="hljs-string">&#x27;a&#x27;</span>); <br>&#125;<br></code></pre></td></tr></table></figure><h3 id="4-2-内存别名-Memory-Aliasing">4.2 内存别名 (Memory Aliasing)</h3><ul><li><strong>定义</strong>：两个不同的内存引用指向同一个物理位置 (Two different memory references specify single location)。</li><li><strong>影响</strong>：编译器<strong>必须假设任何内存写入都可能影响后续的读取</strong>，因此不敢将内存值缓存在寄存器中，导致频繁的内存读写。</li><li><strong>解决方案</strong>：<ul><li>引入<strong>局部变量 (Local Variables/Accumulators)</strong>：在循环中使用局部变量累加结果，循环结束后再一次性写入内存。这告诉编译器不需要检查别名。</li></ul></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">sum_rows1</span><span class="hljs-params">(<span class="hljs-type">double</span> *a, <span class="hljs-type">double</span> *b, <span class="hljs-type">long</span> n)</span> &#123;<br>    <span class="hljs-type">long</span> i, j;<br>    <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>; i&lt;n; i++) &#123;<br>        b[i] = <span class="hljs-number">0</span>;<br>        <span class="hljs-keyword">for</span> (j=<span class="hljs-number">0</span>; j&lt;n; j++)<br>            b[i] += a[i*n+j]; <span class="hljs-comment">// ⚠️ 关键点：每次循环都直接读写内存 b[i]</span><br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">sum_rows2</span><span class="hljs-params">(<span class="hljs-type">double</span> *a, <span class="hljs-type">double</span> *b, <span class="hljs-type">long</span> n)</span> &#123;<br>    <span class="hljs-type">long</span> i, j;<br>    <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>; i&lt;n; i++) &#123;<br>        <span class="hljs-type">double</span> val = <span class="hljs-number">0</span>; <span class="hljs-comment">// ✅ 引入局部变量</span><br>        <span class="hljs-keyword">for</span> (j=<span class="hljs-number">0</span>; j&lt;n; j++)<br>            val += a[i*n+j]; <span class="hljs-comment">// 在寄存器中累加</span><br>        b[i] = val; <span class="hljs-comment">// ✅ 循环结束后只写一次内存</span><br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p>但是编译器不回自动进行上面的优化，因为有可能<code>b</code>数组使用的是<code>a</code>中的内存。</p><blockquote><p>编译器总是偏于保守；因此，为了改进代码，程序员必须经常帮助编译器显式地完成代码的优化。</p></blockquote><h2 id="5-利用指令级并行-Exploiting-Instruction-Level-Parallelism-ILP">5. 利用指令级并行 (Exploiting Instruction-Level Parallelism, ILP)</h2><h3 id="5-1-现代-CPU-架构-Modern-CPU-Design">5.1 现代 CPU 架构 (Modern CPU Design)</h3><h4 id="1-超标量-Superscalar">1. 超标量 (Superscalar)</h4><ul><li><strong>定义</strong>：超标量处理器可以在<strong>一个时钟周期内发射并执行多条指令</strong>。</li><li><strong>机制</strong>：CPU 从顺序的指令流中读取指令，但通过硬件动态地将它们分发到多个独立的执行单元上并行处理。</li><li><strong>对比</strong>：传统的标量处理器一个周期只能执行一条指令，而现代超标量处理器（自 Pentium Pro 起）可以同时处理 3-4 条甚至更多。</li></ul><h4 id="2-乱序执行-Out-of-Order-Execution">2. 乱序执行 (Out-of-Order Execution)</h4><ul><li><strong>原理</strong>：指令的执行顺序不需要严格遵守程序代码的编写顺序。</li><li><strong>流程</strong>：<ol><li>只要操作数准备好了，指令就可以立即执行，而不必等待前面的慢速指令（如缓存未命中）。</li><li>虽然执行是乱序的，但为了保证程序逻辑正确，<strong>提交（Retirement/Write-back）必须是按顺序的</strong>。</li></ol></li><li><strong>优势</strong>：极大地掩盖了长延迟操作（如内存读取）的开销，防止 CPU 流水线因为单条指令的阻塞而停滞。</li></ul><p>现代 CPU 主要分为两个核心部分：<strong>指令控制单元 (Instruction Control Unit, ICU)</strong> 和 <strong>执行单元 (Execution Unit, EU)</strong>。</p><h4 id="3-指令控制单元-ICU">3. 指令控制单元 (ICU)</h4><p>负责从内存中读取指令，并将其转化为微操作，准备交给执行单元。</p><ul><li><strong>取指控制 (Fetch Control)</strong>：包含分支预测逻辑，决定下一步从哪里读取指令。</li><li><strong>指令译码 (Instruction Decode)</strong>：将复杂的 x86 指令翻译成简单的微指令 (Micro-ops)。</li><li><strong>退役单元 (Retirement Unit)</strong>：<ul><li>记录正在执行的指令状态。</li><li>控制寄存器文件的更新。</li><li><strong>关键作用</strong>：确保指令虽然是乱序执行的，但结果是<strong>按顺序提交</strong>到寄存器和内存的。如果预测错误（如分支预测失败），它负责回滚状态并刷新流水线。</li></ul></li></ul><h4 id="4-执行单元-EU">4. 执行单元 (EU)</h4><p>负责实际的运算操作。它接收来自 ICU 的微指令，并在操作数就绪时将其分发给具体的功能单元。</p><ul><li><strong>功能单元 (Functional Units)</strong>：现代 CPU 拥有多个冗余的执行端口，可以并行工作。例如：<ul><li><strong>Integer ALU</strong>：处理整数加减、逻辑运算。</li><li><strong>Integer Mult/Div</strong>：专门处理整数乘除。</li><li><strong>FP Add</strong>：浮点加法器。</li><li><strong>FP Mult/Div</strong>：浮点乘除法器。</li><li><strong>Load/Store Units</strong>：专门负责内存读写的单元（通常有独立的地址计算逻辑）。</li></ul></li><li><strong>并行能力</strong>：在同一个周期内，CPU 可能同时在做一个浮点乘法、两个整数加法和一个内存读取。</li></ul><h4 id="5-延迟与吞吐量-Latency-vs-Throughput">5.  延迟与吞吐量 (Latency vs. Throughput)</h4><p>这是理解性能界限的关键。</p><ul><li><strong>延迟 (Latency)</strong>：完成一条指令所需的总时间（周期数）。<ul><li>例如：浮点乘法可能需要 4-5 个周期，整数除法可能需要 10-20 个周期。</li></ul></li><li><strong>吞吐量 (Throughput)</strong> / <strong>发射时间 (Issue Time)</strong>：连续发射两条相同类型指令之间的最小间隔。<ul><li><strong>流水线化 (Pipelining)</strong>：得益于功能单元的流水线设计，即使浮点乘法需要 5 个周期才能算完，CPU 依然可以<strong>每个周期发射一条新的浮点乘法指令</strong>（Issue Time = 1）。</li><li>这意味着如果没有任何依赖，系统的理论吞吐量非常高。</li></ul></li></ul><p><strong>分支预测 (Branch Prediction)</strong></p><ul><li>为了保持流水线满载，CPU 必须在知道分支结果之前就“猜测”下一条指令在哪里。</li><li><strong>投机执行 (Speculative Execution)</strong>：CPU 会执行猜测路径上的指令。如果猜对了，性能极大提升；如果猜错了，必须丢弃所有投机计算的结果（这也是性能开销的主要来源之一）。</li></ul><p>可以把现代 CPU 想象成一个 <strong>“并行小王子”</strong>，它拥有强大的并行处理能力，但需要程序员的配合才能释放潜力。</p><ul><li><strong>硬件能力</strong>：<ul><li>算术运算单元通常是完全流水线化的（吞吐量为 1）。</li><li>有多个算术单元（如 2 个加法器，1 个乘法器）。</li><li>可以并行执行加载和存储。</li></ul></li><li><strong>程序员的任务</strong>：<ul><li><strong>打破数据依赖</strong>：如果不打破顺序依赖（如 <code>x = x + ...</code>），CPU 只能被迫串行工作，无法利用多余的功能单元。</li><li><strong>利用代码并行性</strong>：通过<strong>循环展开</strong>和<strong>多路累积 (Separate Accumulators)</strong>，人为地创造出多条独立的数据流，让 CPU 的多个功能单元同时忙碌起来。</li></ul></li></ul><h2 id="6-高级优化技术-Advanced-Techniques">6. 高级优化技术 (Advanced Techniques)</h2><p><em>目标：利用 ILP (指令级并行)，打破延迟界限，逼近吞吐量界限。</em></p><h3 id="6-1-性能指标-CPE-Cycles-Per-Element">6.1 性能指标 CPE (Cycles Per Element)</h3><ul><li><p><strong>CPE (Cycles Per Element)</strong>：</p><ul><li><strong>定义</strong>：处理向量中<strong>每个元素</strong>所需的平均时钟周期数。它是衡量循环微观效率的核心指标。</li><li><strong>计算视角</strong>：<ul><li><strong>实验测量</strong>：在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>y</mi><mi>c</mi><mi>l</mi><mi>e</mi><mi>s</mi><mo>=</mo><mi>C</mi><mi>P</mi><mi>E</mi><mo>×</mo><mi>n</mi><mo>+</mo><mi>O</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow><annotation encoding="application/x-tex">Cycles = CPE \times n + Overhead</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord mathnormal">yc</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">es</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">CPE</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span></span></span></span> 公式中，CPE 对应测量直线的<strong>斜率 (Slope)</strong>。</li><li><strong>理论分析</strong>：通过分析循环体内的<strong>关键路径</strong>和<strong>硬件资源</strong>来估算性能下限。</li></ul></li></ul></li><li><p><strong>延迟界限 (Latency Bound)</strong>：</p><ul><li><strong>定义</strong>：由于指令执行需要时间，且数据之间存在<strong>顺序依赖 (Sequential Dependency)</strong>，导致 CPU 必须等待上一条指令结果生成才能开始下一条。</li><li><strong>理论公式</strong>：<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>理论 CPE</mtext><mo>=</mo><mfrac><mtext>关键路径上的总延迟 (Total Latency)</mtext><mtext>每次迭代处理的元素数 (Unrolling Factor)</mtext></mfrac></mrow><annotation encoding="application/x-tex">\text{理论 CPE} = \frac{\text{关键路径上的总延迟 (Total Latency)}}{\text{每次迭代处理的元素数 (Unrolling Factor)}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord cjk_fallback">理论</span><span class="mord"> CPE</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord cjk_fallback">每次迭代处理的元素数</span><span class="mord"> (Unrolling Factor)</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord cjk_fallback">关键路径上的总延迟</span><span class="mord"> (Total Latency)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li><li><strong>意义</strong>：这是<strong>串行代码</strong>的性能瓶颈。如果不打破依赖链（如 <code>x = x * d[i]</code>），无论硬件多么强大，性能都会被锁死在延迟界限上。</li><li><em>例子</em>：浮点乘法延迟为 5 周期。若存在 <code>r = r * ...</code> 的强依赖，即使循环展开 2 次，CPE 依然是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10</mn><mi mathvariant="normal">/</mi><mn>2</mn><mo>=</mo><mn>5.0</mn></mrow><annotation encoding="application/x-tex">10/2 = 5.0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">10/2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5.0</span></span></span></span>。</li><li><em>突破手段</em>：<strong>重新结合变换 (Reassociation)</strong>，利用结合律改变计算顺序（如 <code>r = r * (x * y)</code>），缩短关键路径。</li></ul></li><li><p><strong>吞吐量界限 (Throughput Bound)</strong>：</p><ul><li><strong>定义</strong>：由 CPU 硬件的物理特性（功能单元数量、发射宽度、流水线能力）决定的理论最大处理速度。</li><li><strong>理论公式</strong>：<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>理论 CPE</mtext><mo>=</mo><mfrac><mn>1</mn><mtext>功能单元的总吞吐能力</mtext></mfrac></mrow><annotation encoding="application/x-tex">\text{理论 CPE} = \frac{1}{\text{功能单元的总吞吐能力}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord cjk_fallback">理论</span><span class="mord"> CPE</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord cjk_fallback">功能单元的总吞吐能力</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li><li><strong>意义</strong>：这是程序性能的<strong>物理极限</strong>。当代码中没有数据依赖阻塞时，性能将受限于“CPU 算得有多快”。</li><li><em>例子</em>：如果 CPU 有 2 个乘法器，且每个都能每周期输出 1 个结果（流水线化），那么乘法的极限 CPE 为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.0</mn><mi mathvariant="normal">/</mi><mn>2</mn><mo>=</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">1.0 / 2 = 0.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.0/2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.5</span></span></span></span>。</li><li><em>逼近手段</em>：<strong>分离累积变量 (Separate Accumulators)</strong>，创建多路完全独立的计算链（如 <code>x0</code>, <code>x1</code>…），填满 CPU 的所有流水线级数。</li></ul></li></ul><h3 id="6-2-循环展开-Loop-Unrolling">6.2 循环展开 (Loop Unrolling)</h3><ul><li><strong>原理</strong>：增加每次迭代处理的元素数量，减少循环开销（分支预测、索引更新）。</li></ul><ul><li><strong>对整数运算有效</strong>：课件数据显示，对于整数加法和乘法，CPE 确实降低了。这是因为现代 CPU 甚至可以重组简单的整数运算，而且减少了循环辅助指令的干扰 。</li><li><strong>对浮点运算无效 (瓶颈所在)</strong>：对于浮点乘法，CPE 依然卡在 <strong>延迟界限</strong> 上（例如 3.0 或 5.0）。<ul><li><strong>原因</strong>：<strong>顺序依赖 (Sequential Dependency)</strong>。</li><li>虽然你写在一行里，但编译器默认是从左到右计算：<code>x = (x OP d[i]) OP d[i+1]</code>。</li><li>第二次 OP 必须等第一次 OP 算出 <code>x</code> 的新值后才能开始。这导致 CPU 的流水线必须空转等待（Stall），无法并行 。</li></ul></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">// 2x Unrolling</span><br><span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; limit; i+=<span class="hljs-number">2</span>) &#123;<br>    x = (x OP d[i]) OP d[i+<span class="hljs-number">1</span>]; <br>&#125;<br></code></pre></td></tr></table></figure><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs text">r_old (上一轮)<br>   |<br>   v<br>[ Mul 1 ] &lt;--- d[i]       (时刻 T+0 开始)<br>   |<br>   v (中间结果)<br>[ Mul 2 ] &lt;--- d[i+1]     (时刻 T+5 开始，必须等 Mul 1)<br>   |<br>   v<br>r_new (这一轮结果)        (时刻 T+10 完成)<br>   |<br>   v<br>(下一轮...)<br></code></pre></td></tr></table></figure><h3 id="6-3-重新结合变换-Reassociation">6.3 重新结合变换 (Reassociation)</h3><p><strong>原理</strong>： 利用数学上的结合律，改变计算的顺序，<strong>打破对累积变量 <code>x</code> 的依赖链</strong>。</p><ul><li><strong>变换前</strong>：<code>x = (x OP d[i]) OP d[i+1]</code> （必须串行）</li><li><strong>变换后</strong>：<code>x = x OP (d[i] OP d[i+1])</code> （括号内的可以并行） 。</li></ul><p><strong>为什么能提速？</strong></p><ul><li><code>d[i] OP d[i+1]</code> 这部分计算<strong>不依赖</strong>当前的 <code>x</code>。</li><li>当 CPU 正在计算上一轮的 <code>x</code> 更新时，另一个空闲的功能单元可以同时计算 <code>d[i] OP d[i+1]</code> 。</li><li><strong>效果</strong>：这使得关键路径（Critical Path）上的操作减少了，性能可以接近 <strong>2 倍</strong> 提升，突破了延迟界限 。</li></ul><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs text">时间轴 (Time)<br>  |<br>  |     [ 计算 v0 = d[0]*d[1] ]      [ 计算 v2 = d[2]*d[3] ] ... (支线任务，并行狂奔)<br>  |              |                            |<br>  |              | (5周期后准备好)            | (5周期后准备好)<br>  |              v                            v<br>  |  r_init ---&gt;[ Mul ]---------------------&gt;[ Mul ]---------------------&gt; r_final<br>  |              (主线)                       (主线)<br>  |            耗时 5 周期                  耗时 5 周期<br>  v<br></code></pre></td></tr></table></figure><p><strong>注意</strong>：对于浮点数，<code>(a+b)+c</code> 和 <code>a+(b+c)</code> 结果可能因精度舍入而略有不同，但在大多数高性能计算中通常是可以接受的 。</p><h3 id="6-4-分离累积变量-Separate-Accumulators">6.4 分离累积变量 (Separate Accumulators)</h3><ul><li><strong>原理</strong>：使用多个独立的局部变量并行累积结果，彻底打破顺序依赖。</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs c">x0 = x0 OP d[i];<br>x1 = x1 OP d[i+<span class="hljs-number">1</span>];<br>...<br>*dest = x0 OP x1;<br></code></pre></td></tr></table></figure><ul><li><strong>效果</strong>：<ul><li><strong>打破依赖</strong>：计算 <code>x0</code> 不需要等 <code>x1</code>，计算 <code>x1</code> 也不需要等 <code>x0</code>。它们是完全独立的<strong>两条指令流</strong> 。</li><li><strong>填满流水线</strong>：如果一个乘法延迟是 5 个周期，通过展开成 5 个或更多独立的累积变量（<code>x0</code>…<code>x4</code>），我们可以让 CPU 在等待 <code>x0</code> 结果出来的间隙，依次发射 <code>x1</code> 到 <code>x4</code> 的计算指令。</li><li><strong>逼近吞吐量界限</strong>：当累积变量足够多（K足够大），所有的功能单元都被喂饱了，CPE 将不再受延迟限制，而是受限于硬件有多少个计算单元（吞吐量界限） 。</li></ul></li></ul><h2 id="7-向量指令-Vector-Instructions">7. 向量指令 (Vector Instructions)</h2><ul><li><strong>原理</strong>：前面的优化虽然并行了，但还是一条指令算一个数（SISD）。<strong>SIMD (Single Instruction Multiple Data)</strong> 允许一条指令同时算多个数（例如一条 <code>addpd</code> 指令同时算 2 个 double 加法） 。</li><li><strong>SSE / AVX</strong>：这是 Intel CPU 提供的具体指令集。</li><li><strong>效果</strong>：通过使用 SIMD，可以进一步将性能提升到超越标量吞吐量界限的水平 。例如，如果标量最优 CPE 是 1.0，向量指令可能达到 0.25（一次处理 4 个）。</li></ul><h2 id="8-Combine-函数优化">8. Combine 函数优化</h2><p>优化的目标是针对一个向量归约函数（Vector Reduction，即计算向量元素的和或积），通过一系列手段降低 <strong>CPE (Cycles Per Element，每元素周期数)</strong>。</p><ul><li><strong>数据结构</strong>：定义了一个 <code>vec</code> 结构体，包含数组长度 <code>len</code> 和数据指针 <code>data</code> 。</li><li><strong>计算任务</strong>：函数 <code>combine</code>，遍历向量的所有元素，计算它们的<strong>和 (Sum)</strong> 或 <strong>积 (Product)</strong> 。<ul><li>数据类型包括：<code>Integer</code> (整数) 和 <code>Double FP</code> (双精度浮点数)。</li><li>运算操作包括：<code>Add</code> (+) 和 <code>Mult</code> (*) 。</li></ul></li></ul><h3 id="1-起点：低效的原始代码-Combine1">1. 起点：低效的原始代码 (Combine1)</h3><p>这是未经优化的原始版本，虽然逻辑正确，但包含两个严重的性能杀手。</p><h4 id="代码分析">代码分析</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">void</span> <span class="hljs-title function_">combine1</span><span class="hljs-params">(vec_ptr v, <span class="hljs-type">data_t</span> *dest)</span> &#123;<br>    <span class="hljs-type">long</span> <span class="hljs-type">int</span> i;<br>    *dest = IDENT; <span class="hljs-comment">// 初始化</span><br>    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; vec_length(v); i++) &#123; <span class="hljs-comment">// ⚠️ 问题1：循环条件中调用函数</span><br>        <span class="hljs-type">data_t</span> val;<br>        get_vec_element(v, i, &amp;val);      <span class="hljs-comment">// ⚠️ 问题2：边界检查开销</span><br>        *dest = *dest OP val;             <span class="hljs-comment">// ⚠️ 问题3：每次迭代读写内存</span><br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="性能瓶颈">性能瓶颈</h4><ul><li><strong>重复的函数调用</strong>：<code>vec_length(v)</code> 在每次循环迭代中都被调用，复杂度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>。</li><li><strong>内存别名隐患</strong>：每次迭代都更新 <code>*dest</code>。编译器因担心内存别名，被迫<strong>每次都进行读写内存</strong>。</li><li><strong>CPE</strong>：Integer Add: <strong>29.0</strong>。</li></ul><h3 id="2-第一阶段：基础优化-Combine4">2. 第一阶段：基础优化 (Combine4)</h3><p>这是程序员应该养成的基本编码习惯，消除明显开销。</p><h4 id="优化手段">优化手段</h4><ol><li><strong>代码移动 (Code Motion)</strong>：将 <code>vec_length(v)</code> 移出循环。</li><li><strong>消除内存别名</strong>：引入局部变量 <code>t</code> (Accumulator) 在寄存器中累加，循环结束后再一次性写入 <code>*dest</code>。</li><li><strong>直接数组访问</strong>：使用 <code>get_vec_start</code> 获取数组起始地址，直接通过 <code>d[i]</code> 访问。</li></ol><h4 id="代码演变">代码演变</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">combine4</span><span class="hljs-params">(vec_ptr v, <span class="hljs-type">data_t</span> *dest)</span> &#123;<br>    <span class="hljs-type">int</span> length = vec_length(v);    <span class="hljs-comment">// ✅ 移出循环</span><br>    <span class="hljs-type">data_t</span> *d = get_vec_start(v);<br>    <span class="hljs-type">data_t</span> t = IDENT;              <span class="hljs-comment">// ✅ 使用局部变量</span><br>    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; length; i++)<br>        t = t OP d[i];             <span class="hljs-comment">// ✅ 寄存器内操作</span><br>    *dest = t;                     <span class="hljs-comment">// ✅ 最终写回内存</span><br>&#125;<br></code></pre></td></tr></table></figure><h4 id="性能提升">性能提升</h4><ul><li><strong>效果</strong>：消除了循环开销和内存读写。</li><li><strong>CPE</strong>：Integer Add: <strong>2.0</strong>。</li><li><strong>新瓶颈</strong>：撞上了 <strong>延迟界限 (Latency Bound)</strong>。<code>t = t OP d[i]</code> 存在顺序依赖，必须等上一次运算完成。</li></ul><h3 id="3-第二阶段：循环展开-Loop-Unrolling">3. 第二阶段：循环展开 (Loop Unrolling)</h3><p>尝试通过减少循环迭代次数来降低开销。</p><h4 id="优化手段-2">优化手段</h4><ul><li><strong>2x1 循环展开</strong>：每次迭代处理 2 个元素。</li><li><strong>逻辑</strong>：<code>x = (x OP d[i]) OP d[i+1]</code>。</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">unroll2a_combine</span><span class="hljs-params">(vec_ptr v, <span class="hljs-type">data_t</span> *dest)</span> <br>&#123;<br>    <span class="hljs-type">int</span> length = vec_length(v);<br>    <span class="hljs-type">int</span> limit = length - <span class="hljs-number">1</span>;           <span class="hljs-comment">// 限制循环边界，防止越界</span><br>    <span class="hljs-type">data_t</span> *d = get_vec_start(v);<br>    <span class="hljs-type">data_t</span> x = IDENT;                 <span class="hljs-comment">// 累积变量</span><br>    <span class="hljs-type">int</span> i;<br><br>    <span class="hljs-comment">/* Combine 2 elements at a time */</span><br>    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; limit; i += <span class="hljs-number">2</span>) &#123;<br>        x = (x OP d[i]) OP d[i+<span class="hljs-number">1</span>];    <span class="hljs-comment">// ⚠️ 依然存在顺序依赖</span><br>    &#125;<br><br>    <span class="hljs-comment">/* Finish any remaining elements (处理剩下的尾部元素) */</span><br>    <span class="hljs-keyword">for</span> (; i &lt; length; i++) &#123;<br>        x = x OP d[i];<br>    &#125;<br><br>    *dest = x;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="结果分析">结果分析</h4><ul><li><strong>Integer Mult</strong>：CPE 降至 <strong>1.5</strong>（编译器进行了重组优化）。</li><li><strong>Double FP Add/Mult</strong>：<strong>几乎没有提升</strong>。因为依然存在<strong>顺序依赖</strong>，无法突破延迟界限。</li></ul><h3 id="4-第三阶段：打破依赖-ILP-高级优化">4. 第三阶段：打破依赖 (ILP 高级优化)</h3><p>利用 CPU 的 <strong>超标量</strong> 和 <strong>乱序执行</strong> 能力，突破延迟界限。</p><h4 id="方法-A：重新结合变换-Reassociation">方法 A：重新结合变换 (Reassociation)</h4><p>利用结合律改变计算顺序，增加并行度。</p><ul><li><strong>代码变换</strong>：<ul><li>原代码：<code>x = (x OP d[i]) OP d[i+1]</code> （串行）</li><li>新代码：<code>x = x OP (d[i] OP d[i+1])</code> （并行）</li></ul></li><li><strong>原理</strong>：<code>d[i] OP d[i+1]</code> 不依赖累积变量 <code>x</code>，可提前并行计算。</li><li><strong>效果</strong>：Double Add CPE 降至 <strong>1.5</strong>，打破了顺序依赖链。</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">unroll2aa_combine</span><span class="hljs-params">(vec_ptr v, <span class="hljs-type">data_t</span> *dest)</span> <br>&#123;<br>    <span class="hljs-type">int</span> length = vec_length(v);<br>    <span class="hljs-type">int</span> limit = length - <span class="hljs-number">1</span>;<br>    <span class="hljs-type">data_t</span> *d = get_vec_start(v);<br>    <span class="hljs-type">data_t</span> x = IDENT;<br>    <span class="hljs-type">int</span> i;<br><br>    <span class="hljs-comment">/* Combine 2 elements at a time */</span><br>    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; limit; i += <span class="hljs-number">2</span>) &#123;<br>        <span class="hljs-comment">// ✅ 关键改变：括号位置变了</span><br>        <span class="hljs-comment">// CPU 可以独立计算 (d[i] OP d[i+1])，不需要等待上一轮的 x</span><br>        x = x OP (d[i] OP d[i+<span class="hljs-number">1</span>]); <br>    &#125;<br><br>    <span class="hljs-comment">/* Finish any remaining elements */</span><br>    <span class="hljs-keyword">for</span> (; i &lt; length; i++) &#123;<br>        x = x OP d[i];<br>    &#125;<br><br>    *dest = x;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="方法-B：分离累积变量-Separate-Accumulators">方法 B：分离累积变量 (Separate Accumulators)</h4><p>使用多个独立的变量并行累积，彻底利用硬件吞吐量。</p><ul><li><strong>代码变换</strong>：</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">// 2路并行</span><br>x0 = x0 OP d[i];     <span class="hljs-comment">// 流 1</span><br>x1 = x1 OP d[i+<span class="hljs-number">1</span>];   <span class="hljs-comment">// 流 2</span><br>...<br>*dest = x0 OP x1;    <span class="hljs-comment">// 最后合并</span><br></code></pre></td></tr></table></figure><ul><li><strong>原理</strong>：创建两条完全独立的数据依赖链，CPU 同时执行。</li><li><strong>效果</strong>：所有操作的 CPE 大幅下降，逼近 <strong>吞吐量界限 (Throughput Bound)</strong>。这是标量代码的最佳性能。</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">void</span> <span class="hljs-title function_">unroll2a_combine_separate</span><span class="hljs-params">(vec_ptr v, <span class="hljs-type">data_t</span> *dest)</span> <br>&#123;<br>    <span class="hljs-type">int</span> length = vec_length(v);<br>    <span class="hljs-type">int</span> limit = length - <span class="hljs-number">1</span>;<br>    <span class="hljs-type">data_t</span> *d = get_vec_start(v);<br>    <span class="hljs-type">data_t</span> x0 = IDENT;      <span class="hljs-comment">// 累积变量 1 (负责偶数索引)</span><br>    <span class="hljs-type">data_t</span> x1 = IDENT;      <span class="hljs-comment">// 累积变量 2 (负责奇数索引)</span><br>    <span class="hljs-type">int</span> i;<br><br>    <span class="hljs-comment">/* Combine 2 elements at a time */</span><br>    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; limit; i += <span class="hljs-number">2</span>) &#123;<br>        x0 = x0 OP d[i];    <span class="hljs-comment">// ✅ 独立的指令流 1</span><br>        x1 = x1 OP d[i+<span class="hljs-number">1</span>];  <span class="hljs-comment">// ✅ 独立的指令流 2</span><br>    &#125;<br><br>    <span class="hljs-comment">/* Finish any remaining elements */</span><br>    <span class="hljs-keyword">for</span> (; i &lt; length; i++) &#123;<br>        x0 = x0 OP d[i];    <span class="hljs-comment">// 将剩余元素合并到 x0</span><br>    &#125;<br><br>    *dest = x0 OP x1;       <span class="hljs-comment">// ✅ 最后将两条流的结果合并</span><br>&#125;<br></code></pre></td></tr></table></figure><h3 id="5-最终阶段：向量化-Vector-Instructions">5. 最终阶段：向量化 (Vector Instructions)</h3><ul><li><strong>手段</strong>：使用 SSE / AVX 指令集 (SIMD)。</li><li><strong>原理</strong>：单条指令同时运算多个数据。</li><li><strong>效果</strong>：突破标量处理器的吞吐量界限。</li></ul><h3 id="总结：CPE-性能演进表">总结：CPE 性能演进表</h3><table><thead><tr><th><strong>优化阶段</strong></th><th><strong>关键技术</strong></th><th><strong>性能瓶颈</strong></th><th><strong>Int Add CPE</strong></th></tr></thead><tbody><tr><td><strong>Combine1</strong></td><td>原始代码</td><td>函数调用、内存读写</td><td>29.0</td></tr><tr><td><strong>Combine4</strong></td><td>代码移动、局部变量</td><td><strong>延迟界限 (顺序依赖)</strong></td><td>2.0</td></tr><tr><td><strong>Unrolling</strong></td><td>循环展开</td><td>延迟界限</td><td>2.0</td></tr><tr><td><strong>Reassoc</strong></td><td>重新结合</td><td>吞吐量界限 (部分并行)</td><td>1.5</td></tr><tr><td><strong>Sep Accum</strong></td><td><strong>分离累积变量</strong></td><td><strong>吞吐量界限 (完全并行)</strong></td><td><strong>1.0</strong></td></tr></tbody></table><p>通过这一系列优化，性能从最初的 29.0 CPE 提升到了 1.0 CPE，实现了近 <strong>29 倍</strong> 的加速。</p><h2 id="9-总结：如何获取高性能-Getting-High-Performance">9.  总结：如何获取高性能 (Getting High Performance)</h2><ol><li><strong>编译器与选项</strong>：使用优秀的编译器并开启 <code>-O1</code> 或更高优化。</li><li><strong>避免低效算法</strong>：警惕隐蔽的算法低效（如循环内的 <code>strlen</code>）。</li><li><strong>编写编译器友好的代码</strong>：<ul><li>消除优化障碍（过程调用、内存引用/别名）。</li><li>使用局部变量代替频繁的内存引用。</li></ul></li><li><strong>聚焦最内层循环 (Innermost Loops)</strong>：大部分计算发生在这里。</li><li><strong>针对机器调优</strong>：<ul><li>利用指令级并行 (ILP)。</li><li>避免不可预测的分支 (Unpredictable branches)。</li><li>编写对缓存友好 (Cache friendly) 的代码。</li></ul></li></ol>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/09-Optimization/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/09-Optimization/"/>
    <published>2026-01-14T18:40:00.000Z</published>
    <summary>Program Optimization (程序性能优化)</summary>
    <title>CSAPP - 09.Optimization</title>
    <updated>2026-07-01T11:38:22.788Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Network" scheme="https://yima-gu.github.io/categories/Network/"/>
    <category term="Network" scheme="https://yima-gu.github.io/tags/Network/"/>
    <content>
      <![CDATA[<div class="note note-success **主要任务**">            <ul><li>为用户应用程序提供网络服务，并定义应用程序之间通信的规则。</li><li>定义数据交换的格式（例如，Web 浏览器如何向服务器请求页面）。</li><li>提供各种网络应用协议 。</li><li><strong>示例协议：</strong>  HTTP（万维网）、SMTP（电子邮件）、DHCP（地址配置）、DNS（域名解析） 以及 YouTube、Google、Netflix 等服务 。</li></ul>          </div><h3 id="应用层核心原理"><strong>应用层核心原理</strong></h3><h4 id="网络应用程序的体系结构-Application-Architectures"><strong>网络应用程序的体系结构 (Application Architectures)</strong></h4><ul><li><strong>客户端-服务器 (Client-Server) 结构</strong><ul><li><strong>服务器 (Server)</strong>:<ul><li>通常是“永远在线”的主机。</li><li>拥有固定的、永久性的IP地址。</li><li>为了应对大量请求，通常以数据中心或服务器集群 (Server farms) 的形式存在以实现扩展。</li></ul></li><li><strong>客户端 (Client)</strong>:<ul><li>与服务器进行通信，但客户端之间不直接通信。</li><li>可能是间歇性地连接到网络。</li><li>其IP地址可能是动态分配的。</li></ul></li></ul></li><li><strong>对等 (Peer-to-Peer, P2P) 结构</strong><ul><li>几乎没有或完全不使用永远在线的服务器。</li><li>任意的终端系统（称为对等方/Peers）之间可以直接通信。</li><li>对等方可以间歇性地连接到网络，并且每次连接的IP地址都可能改变。</li><li>这种结构具有很高的可扩展性，因为每个对等方既是信息的请求者也是提供者，但管理起来较为困难。</li></ul></li><li><strong>混合 (Hybrid) 结构</strong><ul><li>这是客户端-服务器和P2P结构的结合体。</li><li><strong>详细说明</strong>: 以即时通信 (Instant Messaging) 为例，它利用中心化的服务器来追踪用户的在线状态和IP地址（这部分是C/S结构），但用户之间的聊天报文是直接发送的（这部分是P2P结构）。Skype也是一个典型例子，它使用中心化服务器来寻找你要呼叫的用户，但一旦找到，语音数据流就直接在两个用户之间传输。</li></ul></li></ul><h4 id="进程通信与寻址"><strong>进程通信与寻址</strong></h4><ul><li><strong>进程 (Process)</strong>: 是在主机上运行的程序实例。不同主机上的进程通过网络交换报文 (messages) 来进行通信。</li><li><strong>套接字 (Socket)</strong>:<ul><li><strong>详细说明</strong>: 套接字可以被看作是应用程序进程的“门”。进程通过这个门向网络中发送报文，并从网络中接收报文。它是由操作系统控制的、应用程序与传输层协议之间的编程接口 (API)，应用程序开发者可以通过它来选择传输协议（如TCP或UDP）并设置一些参数。</li></ul></li><li><strong>进程寻址 (考点)</strong>:<ul><li>为了让报文能准确送达某个特定进程，仅有IP地址是不够的，因为一台主机上可能同时运行着多个需要网络的进程。</li><li>因此，一个进程的唯一标识符由两部分组成：<mark><strong>主机的IP地址</strong> 和 <strong>端口号 (Port Number)</strong>。</mark></li><li>一些知名应用有默认的端口号，例如HTTP服务器使用80端口，SMTP邮件服务器使用25端口。</li></ul></li></ul><div class="note note-info">            <p><strong>IP地址 (Internet Protocol Address)</strong>:<br>可以把它想象成互联网上每台设备的家庭住址。它是一个独一无二的数字标识（例如 <code>166.111.4.100</code>），分配给连接到网络的每一台计算机、手机或其他设备。网络中的其他设备使用这个地址来找到它，并向它发送数据。目前主要有32位的IPv4地址和更长的IPv6地址两种格式。</p>          </div><h4 id="应用所需的传输服务与Internet协议"><strong>应用所需的传输服务与Internet协议</strong></h4><ul><li><strong>应用需求</strong>:<ul><li><strong>可靠性 (Reliability)</strong>: 文件传输、电子邮件等应用要求100%可靠的数据传输，不能有任何数据丢失。而实时音视频等应用则可以容忍一定程度的数据丢失。</li><li><strong>带宽 (Bandwidth)</strong>: 多媒体应用通常需要一个最低的带宽保障才能有效工作。而像电子邮件这样的弹性应用 (elastic apps) 则会利用任何可用的带宽。</li><li><strong>延迟 (Delay)</strong>: 交互式应用，如网络电话和在线游戏，对延迟非常敏感，要求较低的延迟。</li></ul></li><li><strong>Internet提供的传输协议</strong>:<ul><li><strong>TCP (传输控制协议, Transmission Control Protocol)</strong>:<ul><li>提供<strong>面向连接 (Connection-Oriented)</strong> 的服务，在传输数据前必须先建立连接。</li><li>提供<strong>可靠的数据传输 (Reliable Data Transfer)</strong> 服务，保证数据不丢失、不冗余、按序到达。</li><li>包含<strong>流量控制 (Flow Control)</strong>，确保发送方不会压垮接收方。</li><li>包含<strong>拥塞控制 (Congestion Control)</strong>，在网络拥塞时会限制发送方的速率。</li><li><strong>不提供</strong>: 延迟保证或最小带宽保证。</li></ul></li><li><strong>UDP (用户数据报协议, User Datagram Protocol)</strong>:<ul><li>提供<strong>不可靠 (Unreliable)</strong> 的数据传输服务。</li><li>不提供任何TCP所具有的服务，如连接建立、可靠性、流控或拥塞控制等。</li><li><strong>为何存在UDP?</strong>: 因为它简单、开销小，能够提供更低的延迟，<mark>非常适合对延迟敏感且能容忍丢包的应用。</mark></li></ul></li></ul></li></ul><h3 id="Web-和-HTTP-协议"><strong>Web 和 HTTP 协议</strong></h3><h4 id="HTTP-概述"><strong>HTTP 概述</strong></h4><ul><li><strong>HTTP (超文本传输协议, HyperText Transfer Protocol)</strong> 是Web的应用层协议。</li><li><strong>无状态协议 (Stateless Protocol)</strong>:<ul><li><strong>详细说明 (考点)</strong>: 这是HTTP的一个核心特性，意味着服务器不保存关于客户端过去请求的任何历史信息。这样做的好处是极大地简化了服务器的设计，使其能够轻松处理数以千计的并发连接。但如果应用需要识别用户（如电商网站），就需要通过其他机制来实现状态的维持，最常见的就是 <strong>Cookies</strong>。</li></ul></li></ul><h4 id="HTTP-连接管理-考点"><strong>HTTP 连接管理 (考点)</strong></h4><div class="note note-info">            <p>RTT 就是一个数据包从你的电脑出发，到达目标服务器，然后服务器的响应再返回到你的电脑，这<strong>一来一回所花费的总时间</strong>。</p>          </div><ul><li><strong>非持续连接 (Non-Persistent Connection)</strong>:<ul><li>每个TCP连接最多只传输一个Web对象（如一个HTML文件或一张图片），然后就关闭。</li><li><strong>性能分析</strong>: 获取每个对象都需要<strong>2个RTT</strong>的开销（1个RTT用于建立TCP连接，1个RTT用于HTTP请求和响应），外加文件自身的传输时间。这导致了较高的延迟和服务器负担。这是HTTP/1.0的默认方式。</li><li><strong>举例来说</strong>，一个包含1个HTML文件和3张图片的网页，客户端总共需要发起4次HTTP请求。在使用<strong>非持续连接时</strong>，就需要建立4个独立的TCP连接，仅建立连接和请求/响应的固定开销就高达 <strong><code>4 * 2RTT = 8RTT</code></strong>，这导致了很高的延迟。</li></ul></li><li><strong>持续连接 (Persistent Connection)</strong>:<ul><li>多个Web对象可以通过同一个TCP连接进行传输。服务器在发送响应后会保持连接开启，等待后续请求。</li><li><strong>性能分析</strong>: 对于所有被引用的对象，可以省去重复建立TCP连接的开销，大大提升了效率。这是HTTP/1.1的默认方式。</li><li><strong>流水线 (Pipelining)</strong>: 在持续连接的基础上，客户端可以连续发送多个请求，而无需等待前一个请求的响应，进一步减少了延迟。</li></ul></li></ul><h4 id="HTTP-报文格式"><strong>HTTP 报文格式</strong></h4><ul><li><strong>请求报文 (Request Message)</strong>:<ul><li><strong>请求行</strong>: 包含方法（如GET, POST）、请求的URL和HTTP版本。</li><li><strong>首部行</strong>: 包含Host（目标主机）、User-agent（浏览器信息）、Accept-language（可接受的语言）等。</li><li><strong>实体主体</strong>: 通常用于POST方法，携带提交给服务器的数据（如表单内容）。</li></ul></li><li><strong>响应报文 (Response Message)</strong>:<ul><li><strong>状态行</strong>: 包含HTTP版本、状态码（如 <code>200</code>）和状态短语（如 <code>OK</code>）。</li><li><strong>首部行</strong>: 包含Connection（连接状态）、Date、Server（服务器软件）、Content-Type（内容类型）等。</li><li><strong>(考点) 重要首部字段区分</strong>:<ul><li><code>Date</code>: 指的是该响应报文被服务器<strong>创建并发送</strong>的时间。</li><li><code>Last-Modified</code>: 指的是所请求的对象（如HTML文件）在服务器上<strong>最后被修改</strong>的时间。这个字段主要用于缓存控制。</li></ul></li><li><strong>实体主体</strong>: 包含请求的实际对象，如HTML文件。<ul><li><strong>注意</strong>: 在某些情况下，响应报文的实体主体是<strong>空的</strong>。例如：<ul><li><strong>对 HEAD 请求的响应</strong>: 服务器只返回首部信息。</li><li><strong><code>304 Not Modified</code> 响应</strong>: 当服务器通过条件GET告知缓存其副本仍然有效时，响应报文中不包含实体主体，以节省带宽。</li></ul></li></ul></li></ul></li></ul><h4 id="Cookies-与-Web-缓存"><strong>Cookies 与 Web 缓存</strong></h4><ul><li><strong>Cookies</strong>:<ul><li><strong>作用</strong>: 通过在HTTP报文的首部中添加额外信息，并在客户端本地保存一个小文件，来帮助网站追踪用户和维持状态。</li><li><strong>应用</strong>: 用户认证、购物车、个性化推荐、Web邮箱的会话保持等。</li></ul></li><li><strong>Web 缓存 (Web Cache) / 代理服务器 (Proxy Server)</strong>:<ul><li><strong>目标</strong>: 在不访问源服务器的情况下满足客户端的请求，以降低延迟和网络流量。</li><li><strong>条件GET (Conditional GET)</strong>:<ul><li><strong>详细说明 (考点)</strong>: 缓存为了确认自己存储的对象副本是否为最新，会在发往源服务器的请求中包含一个 <code>If-modified-since</code> 首部行，其值为该对象上次被获取的日期。如果源服务器上的对象在此日期之后没有被修改过，服务器会返回一个特殊的 <code>304 Not Modified</code> 响应，且响应报文中不包含对象主体。这样，缓存就知道自己的副本仍然有效，从而避免了不必要的网络传输。</li></ul></li></ul></li></ul><h3 id="FTP-电子邮件-DNS"><strong>FTP, 电子邮件, DNS</strong></h3><h4 id="FTP-文件传输协议-File-Transfer-Protocol"><strong>FTP (文件传输协议, File Transfer Protocol)</strong></h4><ul><li><strong>核心特点 (考点)</strong>: FTP使用<strong>两个并行</strong>的TCP连接来工作。<ul><li><strong>控制连接 (Control Connection) (Port 21)</strong>: 用于传输命令和响应，如用户登录、改变目录等。它在整个会话期间保持开启。这种带外 (out-of-band) 控制方式是其特点。</li><li><strong>数据连接 (Data Connection) (Port 20)</strong>: 用于实际的文件传输。每传输一个文件，就会建立一个新的数据连接。</li></ul></li><li><strong>状态</strong>: FTP是一个<strong>有状态 (stateful)</strong> 的协议，服务器会记录用户的当前目录、认证状态等信息。</li></ul><h4 id="电子邮件-SMTP"><strong>电子邮件 (SMTP)</strong></h4><ul><li><strong>三大组件</strong>: 用户代理 (User Agent)、邮件服务器 (Mail Servers) 和 SMTP 协议。</li><li><strong>SMTP (简单邮件传输协议, Simple Mail Transfer Protocol)</strong>:<ul><li><strong>作用</strong>: 负责将邮件从发送方的邮件服务器<strong>推送 (push)</strong> 到接收方的邮件服务器。</li><li><strong>与HTTP对比</strong>: HTTP是一个<strong>拉取 (pull)</strong> 协议，由客户端主动从服务器拉取信息。而SMTP是服务器到服务器的推送过程。</li></ul></li></ul><h4 id="DNS-域名系统-Domain-Name-System"><strong>DNS (域名系统, Domain Name System)</strong></h4><ul><li><p><strong>功能</strong>: 一个庞大的、<strong>分布式 (distributed)、层次化 (hierarchical)</strong> 的数据库，用于将用户友好的主机名（如<code>www.google.com</code>）解析为机器可读的IP地址（<strong>hostname到IP的映射</strong>）。<mark>是应用层协议</mark></p></li><li><p>层级化结构</p></li><li><p><strong>解析过程详解</strong>:</p><ol><li><strong>本地DNS服务器 (Local DNS Server)</strong>: 用户的查询请求首先发送到其ISP(Internet Service Provider) 或机构的本地DNS服务器。</li><li><strong>迭代查询 (Iterated Query)</strong>: 如果本地服务器没有缓存该记录，它会启动一个迭代查询过程。它首先查询一个<strong>根DNS服务器 (Root DNS Server)</strong>。</li><li>根服务器不会直接给出IP，而是返回负责相应<strong>顶级域 (Top-Level Domain, TLD)</strong>（如<code>.com</code>）的TLD服务器的地址。</li><li>本地服务器接着查询该TLD服务器，TLD服务器会返回负责目标域（如<code>amazon.com</code>）的<strong>权威DNS服务器 (Authoritative DNS Server)</strong> 的地址。</li><li>最后，本地服务器查询该权威DNS服务器，从而获得最终的IP地址。</li><li>本地服务器将结果返回给用户主机，并<strong>缓存 (Caching)</strong> 该记录以备后续查询。</li></ol></li><li><p><strong>DNS 记录 (Resource Records, RR)</strong>:</p><ul><li><strong>A记录</strong>: 将主机名映射到IPv4地址。</li><li><strong>AAAA记录</strong>: 将主机名映射到IPv6地址。</li><li><strong>NS记录</strong>: 指定域的权威DNS服务器。</li><li><strong>CNAME记录</strong>: 为一个主机名创建别名。</li><li><strong>MX记录</strong>: 指定域的邮件服务器。</li></ul></li><li><p><strong>递归查询 (Recursive Query)</strong></p><ul><li><strong>特点</strong>: “请帮我查到底，给我最终答案。”</li><li><strong>过程</strong>: 客户端向 DNS 服务器发起请求，该服务器必须返回最终的 IP 地址或“找不到”的错误。解析的全部负担都在被请求的服务器上。</li><li><strong>常见于</strong>: <code>你的电脑 -&gt; 本地 DNS 服务器</code>。</li></ul></li><li><p><strong>迭代查询 (Iterated Query)</strong></p><ul><li><strong>特点</strong>: “我不知道，但你可以去问它。”</li><li><strong>过程</strong>: 服务器不会直接返回最终答案，而是返回它所知道的、更接近答案的下一个 DNS 服务器的地址。请求方需要自己继续向下一个服务器查询。</li><li><strong>常见于</strong>: <code>本地 DNS 服务器 -&gt; 根/TLD/权威 DNS 服务器</code>。</li></ul></li></ul><p>这是互联网 DNS 系统的<strong>实际工作方式</strong>，它结合了递归和迭代两种查询，高效且分工明确。</p><ul><li><p><strong>核心思想</strong>: <strong>本地 DNS 服务器</strong>作为“总指挥”，主导整个查询过程。</p></li><li><p><strong>流程</strong>:</p><ol><li><strong>客户端</strong> 向 <strong>本地 DNS 服务器</strong> 发起 <strong>递归查询</strong> (请求最终结果)。</li><li><strong>本地 DNS 服务器</strong> 收到请求后，代表客户端进行一系列 <strong>迭代查询</strong>：<ul><li>它先问 <strong>根 DNS 服务器</strong>，根服务器回复 TLD 服务器的地址。</li><li>它再问 <strong>TLD DNS 服务器</strong>，TLD 服务器回复权威服务器的地址。</li><li>它最后问 <strong>权威 DNS 服务器</strong>，获得最终的 IP 地址。</li></ul></li><li><strong>本地 DNS 服务器</strong> 将最终的 IP 地址返回给 <strong>客户端</strong>，完成最初的递归请求。</li></ol></li><li><p><strong>关键点</strong>: 整个“奔波”的工作是由本地 DNS 服务器完成的，根和 TLD 服务器只负责“指路”，因此效率非常高。</p></li></ul><h5 id="DNS-Records">DNS Records</h5><p>DNS 是一个存储<strong>资源记录 (Resource Record - RR)</strong> 的分布式数据库。</p><p>一条标准的 RR 包含四个字段：<code>(name, value, type, ttl)</code></p><ul><li><strong>name</strong>: 记录所关联的域名。</li><li><strong>value</strong>: 记录的值，含义由 <code>type</code> 决定。</li><li><strong>type</strong>: 记录的类型。</li><li><strong>ttl</strong>: 生存时间 (Time To Live)，该记录能在缓存中存放多久。</li></ul><p><strong>A 记录 (Address)</strong></p><ul><li><strong>用途</strong>: 将主机名<strong>映射到 IPv4 地址</strong>。</li><li><strong>格式</strong>: <code>name</code> 是主机名, <code>value</code> 是 IP 地址。</li><li><strong>示例</strong>: <code>(servereast.backup2.ibm.com, 129.42.60.212, A)</code></li></ul><p><strong>CNAME 记录 (Canonical Name)</strong></p><ul><li><strong>用途</strong>: 为一个主机名设置一个<strong>别名</strong>。</li><li><strong>格式</strong>: <code>name</code> 是别名, <code>value</code> 是规范名 (真名)。</li><li><strong>示例</strong>: <code>(ibm.com, servereast.backup2.ibm.com, CNAME)</code></li><li><strong>说明</strong>: 访问 <code>ibm.com</code> 最终会解析到 <code>servereast.backup2.ibm.com</code> 的 IP 地址。</li></ul><p><strong>NS 记录 (Name Server)</strong></p><ul><li><strong>用途</strong>: 指定管理某个域的<strong>权威 DNS 服务器</strong>。</li><li><strong>格式</strong>: <code>name</code> 是域名, <code>value</code> 是权威 DNS 服务器的主机名。</li><li><strong>示例</strong>: <code>(ibm.com, dns.ibm.com, NS)</code></li><li><strong>说明</strong>: 这条记录告诉其他服务器，想知道 <code>ibm.com</code> 下的任何记录，就去问 <code>dns.ibm.com</code>。</li></ul><p><strong>MX 记录 (Mail Exchanger)</strong></p><ul><li><strong>用途</strong>: 指定接收该域名<strong>电子邮件的邮件服务器</strong>。</li><li><strong>格式</strong>: <code>name</code> 是域名, <code>value</code> 是邮件服务器的主机名。</li><li><strong>示例</strong>: <code>(ibm.com, mail.backup2.ibm.com, MX)</code></li><li><strong>说明</strong>: 发往 <code>@ibm.com</code> 的邮件会被路由到 <code>mail.backup2.ibm.com</code> 服务器。</li></ul><hr><h3 id="P2P-应用"><strong>P2P 应用</strong></h3><div class="note note-success 什么是覆盖网络 (Overlay Network)?">            <p>覆盖网络是一个构建在另一个现有网络（通常称为“底层网络”）之上的<strong>虚拟网络</strong>。网络中的节点通过虚拟的逻辑链路直接相互连接，而无需关心底层网络的物理拓扑。</p><ul><li><strong>节点</strong>: 覆盖网络的节点是运行特定应用的终端主机，不包含传统意义上的<strong>物理路由器</strong></li><li><strong>边</strong>: 覆盖网络中的“边”是连接两个节点的<strong>逻辑链路</strong>，在底层网络中可能对应着非常复杂的物理路径。</li><li><strong>P2P应用就是构建在这种覆盖网络上的典型例子。</strong></li></ul>          </div><h4 id="P2P-文件共享架构"><strong>P2P 文件共享架构</strong></h4><ul><li>P2P应用的核心挑战是如何在分散的、动态的对等方网络中定位内容。</li><li><strong>中心化目录 (Centralized Directory) (以Napster为例)</strong>:<ul><li>定位内容的过程是<mark><strong>中心化的</strong></mark>。用户上线时向一个中央服务器注册自己拥有的文件，查询时也向该服务器进行。</li><li>文件传输本身是<strong>去中心化的</strong><mark>P2P</mark>，直接在对等方之间进行。</li><li><strong>缺点</strong>: 中央服务器是单点故障和性能瓶颈。</li></ul></li><li><strong>查询洪泛 (Query Flooding) (以Gnutella为例)</strong>:<ul><li>是<strong>完全分布式</strong>的，没有中央服务器。</li><li>当一个对等方想查找文件时，它会向所有与之相連的邻居发送查询请求，这些邻居再将查询转发给它们的邻居，以此类推，形成“洪泛”。</li></ul></li><li><strong>超级对等方 (Super-peer) (以KaZaA为例)</strong>:<ul><li>一种<strong>混合</strong>模式，利用了网络中节点的异构性（即某些节点拥有更强的计算能力和网络带宽）。</li><li>这些强大的节点成为<strong>超级对等方 (Super-peer)</strong> 或组长，每个普通节点会连接到一个组长，并由组长索引其内容。</li><li>查询首先发送给组长，如果组长没有，它会再将查询转发给其他组长。</li></ul></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/Network/Network-01-Application-Layer/</id>
    <link href="https://yima-gu.github.io/2026/01/14/Network/Network-01-Application-Layer/"/>
    <published>2026-01-14T18:40:00.000Z</published>
    <summary>为用户应用程序提供网络服务，并定义应用程序之间通信的规则。</summary>
    <title>Network - 01.Application Layer</title>
    <updated>2026-07-01T11:38:22.793Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<div class="note note-success 核心导读：高速缓存——存储器层次结构的关键 (Cache Memories: The Key to Memory Hierarchy)">            <p><strong>主要内容 (Overview)</strong>：<br>本章深入探讨了计算机系统中最重要的性能优化组件之一：<strong>高速缓存 (Cache Memories)</strong>。</p><ol><li><strong>缓存的基本组织结构</strong>：如何将巨大的内存空间映射到小容量的缓存中（直接映射、组相联、全相联）。</li><li><strong>缓存的读写机制</strong>：CPU 如何查找数据，以及写入数据时的策略（写穿透 vs 写回）。</li><li><strong>缓存对性能的影响</strong>：通过具体的矩阵乘法示例，展示了缓存友好的代码如何带来数量级的性能提升。</li><li><strong>编写高速缓存友好的代码</strong>：给程序员的实战指南，如何利用局部性原理优化程序。</li></ol><p><strong>Motivation</strong>：<br>随着 CPU 和内存速度差距的拉大，Cache 成为了系统性能的瓶颈所在。理解 Cache 的工作原理，不再把内存看作一个平坦的数组，而是理解其层次结构，是编写高性能代码（High Performance Computing）的必备技能。</p>          </div><h1>计算机组成原理笔记：高速缓存 (Cache Memories)</h1><h2 id="1-为什么需要高速缓存？-Why-Caching">1. 为什么需要高速缓存？(Why Caching?)</h2><h3 id="1-1-存储技术的趋势-Storage-Trends">1.1 存储技术的趋势 (Storage Trends)</h3><ul><li><strong>CPU 速度</strong>：每 18 个月翻一番（摩尔定律）。</li><li><strong>内存速度</strong>：增长缓慢，远落后于 CPU。</li><li><strong>差距 (The Gap)</strong>：CPU 和内存之间的速度差距越来越大。如果 CPU 每次都要等内存，性能将极其低下。</li></ul><h3 id="1-2-解决方案：局部性-缓存-Locality-Cache">1.2 解决方案：局部性 + 缓存 (Locality + Cache)</h3><ul><li>利用程序的<strong>局部性原理 (Locality)</strong>，我们将最常访问的数据放在离 CPU 最近、速度最快的小容量存储器中，这就是 <strong>Cache</strong>。</li><li><strong>SRAM vs DRAM</strong>：Cache 使用 SRAM（快但贵），主存使用 DRAM（慢但便宜）。</li></ul><hr><h2 id="2-通用高速缓存存储器组织结构-General-Cache-Organization">2. 通用高速缓存存储器组织结构 (General Cache Organization)</h2><div class="note note-info">            <ul><li>为了解决：<strong>如何在极短的时间内（几个时钟周期），从巨大的主存地址空间（m 位地址）中，精准地找到我们需要的那个字节是否藏在极小的缓存里？</strong></li><li>这种组织方式本质上是一种<strong>硬件哈希表（Hardware Hash Map）</strong></li></ul>          </div><div class="note note-success 核心概念辨析：缓存 vs 主存">            <ul><li><p><strong>高速缓存 (Cache)</strong>：</p><ul><li><strong>物理介质</strong>：<strong>SRAM</strong> (静态随机存取存储器)。</li><li><strong>位置</strong>：集成在 <strong>CPU 芯片内部</strong> (L1, L2, L3)。</li><li><strong>特点</strong>：速度极快，但容量小、造价贵。</li></ul></li><li><p><strong>主存 (Main Memory)</strong>：</p><ul><li><strong>物理介质</strong>：<strong>DRAM</strong> (动态随机存取存储器)，即通常说的“内存条”。</li><li><strong>位置</strong>：插在主板上，通过总线连接 CPU。</li><li><strong>逻辑视图</strong>：对 CPU 而言，主存只是一个巨大的、线性的字节数组 <code>Array[0...N]</code>。</li></ul></li><li><p><strong>地址翻译机制</strong>：</p><ul><li>CPU 发出的总是 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 位的物理地址</strong>（例如 64 位）。</li><li>Cache 控制器负责将这个线性的地址**“切分”**，映射到 Cache 内部特定的二维硬件结构中进行快速查找。</li></ul></li></ul>          </div><p>一个高速缓存系统由四个核心参数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>S</mi><mo separator="true">,</mo><mi>E</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(S, E, B, m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span> 定义。这完全描述了 <strong>CPU 内部 SRAM</strong> 的物理硬件布局。</p><h3 id="2-1-几何参数定义">2.1 几何参数定义</h3><ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> (Sets, 组数)</strong>：<ul><li>缓存被分为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 个<strong>组 (Cache Sets)</strong>。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 必须是 2 的幂，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>=</mo><msup><mn>2</mn><mi>s</mi></msup></mrow><annotation encoding="application/x-tex">S = 2^s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span></span></span></span></span></span></span></span>。这里的 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span></strong> 是地址中用于索引组的位数 (<strong>Set Index bits</strong>)。</li></ul></li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> (Lines/Ways, 行)</strong>：<ul><li>每个组包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 个<strong>缓存行 (Cache Lines)</strong>。</li><li>这决定了缓存的类型（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">E=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>: 直接映射；<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>&gt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">E&gt;1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>: 组相联）。</li></ul></li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> (Block Size, 块大小)</strong>：<ul><li>每个缓存行存储的数据大小为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> <strong>字节</strong>。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 必须是 2 的幂，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><msup><mn>2</mn><mi>b</mi></msup></mrow><annotation encoding="application/x-tex">B = 2^b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span></span></span></span></span></span></span>。这里的 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></strong> 是地址中用于块内定位的位数 (<strong>Block Offset bits</strong>)。</li><li><strong>重要意义</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 决定了主存与缓存之间数据流转的<strong>最小颗粒度</strong>。当发生未命中 (Miss) 时，硬件会一次性搬运 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 个字节</strong>（利用<strong>空间局部性</strong>），而不仅仅是请求的那 1 个字节。</li></ul></li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> (Address Bits, 地址位数)</strong>：<ul><li>物理内存地址的总位数 (例如 64 位)。</li></ul></li></ul><h3 id="2-2-地址划分-Address-Breakdown">2.2 地址划分 (Address Breakdown)</h3><p>当 CPU 发出一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 位的物理地址时，Cache 硬件会将其<strong>位级表示</strong>切分为三个部分，用于定位数据：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>m</mi><mtext> bits</mtext><mo>=</mo><munder><munder><mrow><mi>t</mi><mtext> bits</mtext></mrow><mo stretchy="true">⏟</mo></munder><mtext>Tag</mtext></munder><mtext> </mtext><mi mathvariant="normal">∣</mi><mtext> </mtext><munder><munder><mrow><mi>s</mi><mtext> bits</mtext></mrow><mo stretchy="true">⏟</mo></munder><mtext>Set Index</mtext></munder><mtext> </mtext><mi mathvariant="normal">∣</mi><mtext> </mtext><munder><munder><mrow><mi>b</mi><mtext> bits</mtext></mrow><mo stretchy="true">⏟</mo></munder><mtext>Block Offset</mtext></munder></mrow><annotation encoding="application/x-tex">m \text{ bits} = \underbrace{t \text{ bits}}_{\text{Tag}} \ |\  \underbrace{s \text{ bits}}_{\text{Set Index}} \ |\  \underbrace{b \text{ bits}}_{\text{Block Offset}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">m</span><span class="mord text"><span class="mord"> bits</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2124em;vertical-align:-1.4624em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-1.6737em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">Tag</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span class="svg-align" style="top:-2.352em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="mord text"><span class="mord"> bits</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.648em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4624em;"><span></span></span></span></span></span><span class="mspace"> </span><span class="mord">∣</span><span class="mspace"> </span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-1.6659em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">Set Index</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span class="svg-align" style="top:-2.352em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="mord text"><span class="mord"> bits</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.648em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3341em;"><span></span></span></span></span></span><span class="mspace"> </span><span class="mord">∣</span><span class="mspace"> </span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-1.6659em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">Block Offset</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span class="svg-align" style="top:-2.352em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="mord text"><span class="mord"> bits</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.648em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3341em;"><span></span></span></span></span></span></span></span></span></span></p><ol><li><strong>组索引 (Set Index, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> bits)</strong>：<ul><li><strong>作用</strong>：<strong>定位组</strong>。</li><li>决定去哪一个“抽屉” (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>…</mo><mi>S</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">0 \dots S-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>) 里查找。</li><li>计算：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><msub><mrow><mi>log</mi><mo>⁡</mo></mrow><mn>2</mn></msub><mi>S</mi></mrow><annotation encoding="application/x-tex">s = \log_2 S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9386em;vertical-align:-0.2441em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.207em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2441em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。</li></ul></li><li><strong>标记位 (Tag, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> bits)</strong>：<ul><li><strong>作用</strong>：<strong>身份验证</strong>。</li><li>因为多个内存块可能映射到同一个组，Tag 用于确认组里的这一行数据是否真的是我们需要的那块。</li><li>计算：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mo>=</mo><mi>m</mi><mo>−</mo><mo stretchy="false">(</mo><mi>s</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">t = m - (s + b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><strong>块偏移 (Block Offset, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> bits)</strong>：<ul><li><strong>作用</strong>：<strong>数据提取</strong>。</li><li>在找到的那个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 字节的数据块中，精确定位到我们要读写的具体字节位置。</li><li>计算：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><msub><mrow><mi>log</mi><mo>⁡</mo></mrow><mn>2</mn></msub><mi>B</mi></mrow><annotation encoding="application/x-tex">b = \log_2 B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9386em;vertical-align:-0.2441em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.207em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2441em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>。</li></ul></li></ol><h3 id="2-3-物理缓存行结构-Physical-Cache-Line-Structure">2.3 物理缓存行结构 (Physical Cache Line Structure)</h3><p>每一个物理缓存行 (Cache Line) 不仅仅存储数据，还包含元数据。它由以下三部分组成：</p><table><thead><tr><th style="text-align:left">组成部分</th><th style="text-align:left">大小</th><th style="text-align:left">作用</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Valid Bit (有效位)</strong></td><td style="text-align:left">1 bit</td><td style="text-align:left">标记该行是否存储了有意义的数据（冷启动时为 0</td></tr><tr><td style="text-align:left"><strong>Tag (标记)</strong></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> bits</td><td style="text-align:left">存储该数据块对应的内存地址高位，用于与 CPU 地址中的 Tag 进行</td></tr><tr><td style="text-align:left"><strong>Data Block (数据块)</strong></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> bytes</td><td style="text-align:left">实际存储的主存数</td></tr><tr><td style="text-align:left"><strong>Dirty Bit （脏位）</strong></td><td style="text-align:left">1 bit</td><td style="text-align:left">如果缓存采用“写回”策略（只改缓存，不马上改内存），还需要一个 Dirty Bit。<br>它标记这行数据是否被 CPU 修改过。如果是脏的，在被驱逐时必须写回内存</td></tr></tbody></table><blockquote><p><strong>总容量计算</strong>：缓存的数据容量 = <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>×</mo><mi>E</mi><mo>×</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">S \times E \times B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 字节。（不包括 Tag 和 Valid Bit 占用的空间）</p></blockquote><hr><h2 id="3-缓存映射策略-Cache-Mapping-Strategies">3. 缓存映射策略 (Cache Mapping Strategies)</h2><p>根据关联度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 的不同，Cache 分为三类：</p><h3 id="3-1-直接映射缓存-Direct-Mapped-Cache-E-1">3.1 直接映射缓存 (Direct Mapped Cache, E=1)</h3><ul><li><strong>特点</strong>：每一组只有一行 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">E=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)。</li><li><strong>查找过程</strong>：<ol><li><strong>组选择 (Set Selection)</strong>：根据地址中的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 位索引找到唯一对应的组。</li><li><strong>行匹配 (Line Matching)</strong>：检查该组中那唯一一行的有效位是否为 1，且 Tag 是否匹配。</li><li><strong>字抽取 (Word Extraction)</strong>：如果匹配（Hit），根据 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> 位偏移量取出数据。</li></ol></li><li><strong>缺点</strong>：容易发生<strong>冲突未命中 (Conflict Miss)</strong>。如果两个频繁访问的地址映射到同一个组，它们会不停地互相驱逐（Thrashing）。</li></ul><h3 id="3-2-组相联缓存-E-way-Set-Associative-Cache-1-E-C-B">3.2 组相联缓存 (E-way Set Associative Cache, 1 &lt; E &lt; C/B)</h3><ul><li><strong>特点</strong>：每一组有多行（例如 E=2, 4, 8）。</li><li><strong>查找过程</strong>：<ol><li><strong>组选择</strong>：同上，找到对应的组。</li><li><strong>行匹配</strong>：<strong>并行</strong>检查该组内所有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 行的 Tag。只要有一行匹配且有效，就是命中。</li></ol></li><li><strong>优点</strong>：减少了冲突未命中，因为一个组可以容纳多个映射到此的块。</li><li><strong>替换策略 (Replacement Policy)</strong>：当组满了需要放入新块时，需要选择一行<strong>驱逐</strong>。常用策略：<ul><li><strong>LRU (Least Recently Used)</strong>：最近最少使用。<ul><li>系统会记录每个数据块<strong>最后一次被访问的时间</strong>。当需要驱逐时，选择那个<strong>时间戳最老</strong>（也就是距离现在最久没有被使用过）的块。</li><li>基于<strong>时间局部性</strong>假设。</li><li><strong>优点</strong>：<strong>性能最好</strong>，最符合大多数程序的运行规律，命中率通常最高。</li><li><strong>缺点</strong>：<strong>实现昂贵</strong>，硬件需要维护一个复杂的队列或时间戳，每次访问都要更新顺序，硬件开销大。</li></ul></li><li><strong>LFU (Least Frequently Used)</strong>：最不常使用。<ul><li><strong>保留热门数据</strong>：对于长期频繁使用的数据保护得很好。</li><li><strong>“历史包袱” (Aging Problem)</strong>：这是 LFU 最大的由于。比如一个数据在程序启动时用了 1000 次（计数很高），但之后再也没用过。因为它的计数器太高了，它会一直赖在缓存里不走。通常需要配合“定期衰减”机制来解决。</li></ul></li><li><strong>Random</strong>：随机替换。<ul><li><strong>实现极简</strong>：硬件极其简单，不需要存储额外的历史信息，速度极快。</li><li><strong>不够智能</strong>：可能会运气不好，把下一秒马上要用的关键数据给踢走了，导致发生未命中。</li><li>在缓存很大时，Random 的表现其实出人意料地不错，并没有比 LRU 差太多。</li></ul></li></ul></li></ul><h3 id="3-3-全相联缓存-Fully-Associative-Cache-S-1">3.3 全相联缓存 (Fully Associative Cache, S=1)</h3><ul><li><strong>特点</strong>：只有 1 个组，该组包含所有行 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mi>C</mi><mi mathvariant="normal">/</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">E = C/B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>)。</li><li><strong>查找过程</strong>：没有组索引，地址只分为 Tag 和 Offset。必须<strong>并行搜索所有行</strong>的 Tag。</li><li><strong>应用</strong>：因为硬件并行搜索极其昂贵，只用于容量很小但缺失代价极高的缓存（如 <strong>TLB</strong> 页表缓存）。</li></ul><hr><h2 id="4-缓存的写操作-Writes">4. 缓存的写操作 (Writes)</h2><p><strong>写操作 (Writes)</strong> 要复杂得多，因为我们修改了缓存中的数据后，必须考虑<strong>如何让主存（Main Memory）也知道数据变了</strong>。</p><p>根据 CPU 想要写入的数据是否已经在缓存中，我们将情况分为 <strong>写命中 (Write Hit)</strong> 和 <strong>写未命中 (Write Miss)</strong>。</p><h3 id="1-写命中-Write-Hit">1. 写命中 (Write Hit)</h3><p><strong>场景</strong>：CPU 想要修改地址 <code>A</code> 的数据，而地址 <code>A</code> 对应的数据块<strong>已经</strong>存在于缓存中。</p><p>此时有两种主流策略来处理更新：</p><h4 id="策略-A-写穿透-Write-through">策略 A: 写穿透 (Write-through)</h4><ul><li><strong>机制</strong>：CPU 修改缓存中数据的同时，<strong>立即</strong>将这个新数据写入到主存（或下一级缓存）中。</li><li><strong>流程</strong>：<ol><li>更新 Cache 中的行。</li><li>同时发起一个总线写事务，更新 Memory 中的块。</li></ol></li><li><strong>优点</strong>：<ul><li><strong>简单</strong>：易于实现。</li><li><strong>一致性好</strong>：主存中的数据始终是最新的。这对于<mark>多核处理器</mark>或 DMA（直接内存访问）非常重要。</li></ul></li><li><strong>缺点</strong>：<ul><li><strong>慢 (Slow)</strong>：每次写操作都要访问主存，速度受限于主存带宽。</li><li><strong>总线流量大 (High Bandwidth)</strong>：即使是反复修改同一个变量，也会产生大量的总线写请求。</li></ul></li></ul><h4 id="策略-B-写回-Write-back-——-现代高性能-CPU-首选">策略 B: 写回 (Write-back) —— <em>现代高性能 CPU 首选</em></h4><ul><li><strong>机制</strong>：CPU <strong>只修改缓存</strong>中的数据，<strong>不立即</strong>写入主存。<ul><li>只有当这一行数据因为冲突被<strong>驱逐 (Evicted)</strong> 出缓存时，才将它写回主存。</li></ul></li><li><strong>关键技术：脏位 (Dirty Bit)</strong><ul><li>缓存行结构中增加一个 <strong>Dirty Bit</strong>。</li><li>当 CPU 修改了某一行，将 Dirty Bit 置为 <code>1</code>。</li><li>当该行被替换时：<ul><li>如果 Dirty Bit == 1：说明这行被改过，必须写回主存。</li><li>如果 Dirty Bit == 0：说明这行没动过，直接覆盖即可，不用写回。</li></ul></li></ul></li><li><strong>优点</strong>：<ul><li><strong>极快</strong>：写操作以 Cache 速度进行，不需要等主存。</li><li><strong>节省带宽</strong>：如果一个变量被修改 100 次（例如循环计数器），只会产生 1 次主存写操作（被驱逐时）。</li></ul></li><li><strong>缺点</strong>：<ul><li><strong>复杂</strong>：需要额外的硬件（Dirty Bit）和控制逻辑。</li><li><strong>不一致</strong>：主存中的数据可能是旧的（Stale），这在多核环境下需要复杂的缓存一致性协议（如 MESI）来解决。</li></ul></li></ul><h3 id="2-写未命中-Write-Miss">2. 写未命中 (Write Miss)</h3><p><strong>场景</strong>：CPU 想要修改地址 <code>A</code> 的数据，但地址 <code>A</code> <strong>不在</strong>缓存中。</p><p>此时也有两种策略，通常与写命中策略搭配使用：</p><h4 id="策略-A-写分配-Write-allocate-——-通常搭配-Write-back">策略 A: 写分配 (Write-allocate) —— <em>通常搭配 Write-back</em></h4><ul><li><strong>机制</strong>：<strong>“先搬进来，再修改”</strong>。<ol><li>将地址 <code>A</code> 所在的整个块从主存<strong>读入 (Load)</strong> 缓存（分配一行）。</li><li>在缓存中修改这个块的数据。</li></ol></li><li><strong>逻辑</strong>：假设利用<strong>局部性原理</strong>，如果我现在写了这个数据，哪怕它不在缓存里，我接下来很可能还会读/写它，所以把它搬进来是值得的。</li><li><strong>缺点</strong>：第一次写会比较慢，因为多了一次“读主存”的操作。</li></ul><h4 id="策略-B-非写分配-No-write-allocate-——-通常搭配-Write-through">策略 B: 非写分配 (No-write-allocate) —— <em>通常搭配 Write-through</em></h4><ul><li><strong>机制</strong>：<strong>“直接绕过缓存”</strong>。<ul><li>直接把数据写入主存。</li><li><strong>不</strong>将该块加载到缓存中。</li></ul></li><li><strong>逻辑</strong>：既然不在缓存里，我就不破坏缓存现在的布局了，直接写到底层存储去。</li></ul><h3 id="3-总结与典型组合">3. 总结与典型组合</h3><p>虽然理论上有 4 种组合，但实际工程中主要使用以下两种：</p><h4 id="组合-1：Write-back-Write-allocate-回写-写分配">组合 1：Write-back + Write-allocate (回写 + 写分配)</h4><ul><li><strong>代表</strong>：<strong>Intel Core i7/i9, Linux 内存系统</strong>。</li><li><strong>特点</strong>：尽可能把所有数据操作都留在 Cache 内部解决。</li><li><strong>性能</strong>：利用局部性原理，性能最高，适合绝大多数现代应用。</li></ul><h4 id="组合-2：Write-through-No-write-allocate-直写-非写分配">组合 2：Write-through + No-write-allocate (直写 + 非写分配)</h4><ul><li><strong>代表</strong>：一些简单的嵌入式处理器，或者图形显存。</li><li><strong>特点</strong>：逻辑简单。如果程序只是单纯地“写数据”（如初始化大数组）而不再读它，这种策略效率反而更高（避免了把数据读进 Cache 的开销）。</li></ul><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">Write-through (直写)</th><th style="text-align:left">Write-back (回写)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>内存一致性</strong></td><td style="text-align:left">内存总是最新的</td><td style="text-align:left">内存可能是旧的</td></tr><tr><td style="text-align:left"><strong>总线流量</strong></td><td style="text-align:left">高 (每次写都占用)</td><td style="text-align:left">低 (仅驱逐时占用)</td></tr><tr><td style="text-align:left"><strong>硬件需求</strong></td><td style="text-align:left">低</td><td style="text-align:left">高 (需要 Dirty Bit)</td></tr><tr><td style="text-align:left"><strong>写未命中策略</strong></td><td style="text-align:left">通常用 No-write-allocate</td><td style="text-align:left">通常用 Write-allocate</td></tr><tr><td style="text-align:left"><strong>适用场景</strong></td><td style="text-align:left">简单系统，对一致性要求高</td><td style="text-align:left">高性能通用计算</td></tr></tbody></table><hr><h2 id="5-缓存性能指标-Cache-Performance-Metrics">5. 缓存性能指标 (Cache Performance Metrics)</h2><ul><li><strong>未命中率 (Miss Rate)</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mi>i</mi><mi>s</mi><mi>s</mi><mi>e</mi><mi>s</mi><mi mathvariant="normal">/</mi><mi>A</mi><mi>c</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi>e</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">Misses / Accesses</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">i</span><span class="mord mathnormal">sses</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mord mathnormal">ccesses</span></span></span></span> (通常 L1: 3-10%, L2: &lt;1%)。</li><li><strong>命中率 (Hit Rate)</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>−</mo><mi>M</mi><mi>i</mi><mi>s</mi><mi>s</mi><mi>R</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">1 - Miss Rate</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">i</span><span class="mord mathnormal">ss</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span></span></span></span>。</li><li><strong>命中时间 (Hit Time)</strong>: 从 Cache 读数据的延迟 (L1: ~4 cycles)。</li><li><strong>未命中惩罚 (Miss Penalty)</strong>: 从下一层取数据的额外时间 (L2: ~10 cycles, Main Memory: 50-200 cycles)。</li></ul><p><strong>平均访问时间 (AMAT, Average Memory Access Time)</strong>:</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>T</mi><mrow><mi>a</mi><mi>v</mi><mi>g</mi></mrow></msub><mo>=</mo><msub><mi>T</mi><mrow><mi>h</mi><mi>i</mi><mi>t</mi></mrow></msub><mo>+</mo><mi>M</mi><mi>R</mi><mo>×</mo><msub><mi>T</mi><mrow><mi>m</mi><mi>i</mi><mi>s</mi><mi>s</mi><mi mathvariant="normal">_</mi><mi>p</mi><mi>e</mi><mi>n</mi><mi>a</mi><mi>l</mi><mi>t</mi><mi>y</mi></mrow></msub></mrow><annotation encoding="application/x-tex">T_{avg} = T_{hit} + MR \times T_{miss\_penalty}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">vg</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">hi</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">MR</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0503em;vertical-align:-0.367em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">mi</span><span class="mord mathnormal mtight">ss</span><span class="mord mtight" style="margin-right:0.02778em;">_</span><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">na</span><span class="mord mathnormal mtight">lt</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.367em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>哪怕只有 1% 的 Miss Rate，如果 Miss Penalty 很大，也会严重拖慢整体性能。</p><hr><h2 id="6-编写高速缓存友好的代码-Writing-Cache-Friendly-Code">6. 编写高速缓存友好的代码 (Writing Cache-Friendly Code)</h2><p>这是对程序员最重要的部分。</p><h3 id="6-1-核心原则">6.1 核心原则</h3><ol><li><strong>关注内循环 (Focus on Inner Loops)</strong>：大部分计算发生在这里。</li><li><strong>最大化空间局部性 (Maximize Spatial Locality)</strong>：<ul><li>以 <strong>步长为 1 (Stride-1)</strong> 的方式顺序读取数据。</li><li>避免大步长跳跃访问。</li></ul></li><li><strong>最大化时间局部性 (Maximize Temporal Locality)</strong>：<ul><li>一旦把数据读进来，就尽可能多地使用它，防止它被驱逐。</li></ul></li></ol><h3 id="6-2-案例分析：矩阵乘法-Matrix-Multiplication">6.2 案例分析：矩阵乘法 (Matrix Multiplication)</h3><p>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><mi>A</mi><mo>×</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">C = A \times B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>，其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A, B, C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span> 均为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>×</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">n \times n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 矩阵，数据类型为 <code>double</code>（8字节），Cache Block 大小为 32 字节（容纳 4 个 double）。</p><h4 id="1-朴素算法-ijk-Permutation">1. 朴素算法 (ijk Permutation)</h4><p>最常见的实现方式，三重循环嵌套：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; n; i++) &#123;<br>    <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>; j &lt; n; j++) &#123;<br>        sum = <span class="hljs-number">0.0</span>;<br>        <span class="hljs-keyword">for</span> (k = <span class="hljs-number">0</span>; k &lt; n; k++)<br>            sum += A[i][k] * B[k][j];<br>        C[i][j] = sum;<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>缓存未命中分析 (Miss Rate Analysis)</strong>：</p><ul><li><strong>假设</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 非常大，缓存很小（无法装下一整行）。</li><li><strong>对 A 的访问 (<code>A[i][k]</code>)</strong>：<ul><li><strong>模式</strong>：行优先扫描 (Stride-1)。</li><li><strong>局部性</strong>：良好 (Spatial Locality)。</li><li><strong>未命中率</strong>：每读 1 个 Block 发生 1 次 Miss。若 Block 能存 4个 double，Miss rate = <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>4</mn></mrow><annotation encoding="application/x-tex">1/4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/4</span></span></span></span>。</li></ul></li><li><strong>对 B 的访问 (<code>B[k][j]</code>)</strong>：<ul><li><strong>模式</strong>：列优先扫描 (Stride-n)。</li><li><strong>局部性</strong>：极差。每次访问都跳过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个元素，大概率跳转到缓存中不存在的块。</li><li><strong>未命中率</strong>：100% (Miss rate = 1.0)。</li></ul></li><li><strong>总未命中数</strong>：每次迭代产生 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.25</mn></mrow><annotation encoding="application/x-tex">1.25</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.25</span></span></span></span> 次 Misses。总 Misses <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo><mn>1.25</mn><msup><mi>n</mi><mn>3</mn></msup></mrow><annotation encoding="application/x-tex">\approx 1.25 n^3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">1.25</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span></span>。</li></ul><h4 id="2-jik-模式-——-性能中等-较差">2. jik 模式 —— 性能中等/较差</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">for</span> (j=<span class="hljs-number">0</span>; j&lt;n; j++)<br>  <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>; i&lt;n; i++) &#123;<br>    sum = <span class="hljs-number">0.0</span>;<br>    <span class="hljs-keyword">for</span> (k=<span class="hljs-number">0</span>; k&lt;n; k++) <span class="hljs-comment">// 内层循环变量 k</span><br>      sum += A[i][k] * B[k][j];<br>    C[i][j] = sum;<br>  &#125;<br></code></pre></td></tr></table></figure><ul><li><strong>访问模式分析</strong>:<ul><li>内层循环依然是 <code>k</code> 递增。</li><li>内存访问模式与 <code>ijk</code> 完全一致：A 是 Stride-1，B 是 Stride-N。</li></ul></li><li><strong>结论</strong>: 性能受到 B 矩阵列扫描的限制，速度较慢。</li></ul><h4 id="3-kij-模式-优化算法-——-性能最佳">3. kij 模式 (优化算法) —— 性能最佳</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">for</span> (k=<span class="hljs-number">0</span>; k&lt;n; k++)<br>  <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>; i&lt;n; i++) &#123;<br>    r = A[i][k]; <span class="hljs-comment">// 在内层循环中是常数，放入寄存器</span><br>    <span class="hljs-keyword">for</span> (j=<span class="hljs-number">0</span>; j&lt;n; j++) <span class="hljs-comment">// 内层循环变量 j</span><br>      C[i][j] += r * B[k][j];<br>  &#125;<br></code></pre></td></tr></table></figure><ul><li><strong>访问模式分析</strong>:<ul><li><code>B[k][j]</code>: 内层循环 <code>j</code> 递增，访问 <code>B</code> 的同一行相邻元素。<strong>Stride-1 (行扫描)</strong>，空间局部性极好。</li><li><code>C[i][j]</code>: 内层循环 <code>j</code> 递增，访问 <code>C</code> 的同一行相邻元素。<strong>Stride-1 (行扫描)</strong>，空间局部性极好。</li><li><code>A[i][k]</code>: 在内层循环中 <code>i, k</code> 不变，<code>r</code> 常驻寄存器，无访存开销。</li></ul></li><li><strong>Miss Rate</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">\approx 0.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.5</span></span></span></span> (B 为 0.25, C 为 0.25，考虑 write-allocate 等因素总体极低)。</li><li><strong>结论</strong>: 仅通过改变循环顺序，将所有内存访问都变成了顺滑的行扫描，充分利用了 Cache Block，性能比 <code>ijk</code>快得多。</li></ul><h4 id="4-jki-kji-模式-反面教材-——-性能最差">4. jki / kji 模式 (反面教材) —— 性能最差</h4><ul><li>如果内层循环是 <code>i</code> 递增，那么 <code>A[i][k]</code> 和 <code>C[i][j]</code> 都会变成 <strong>Stride-N (列扫描)</strong>。</li><li>这是最糟糕的情况，双重列扫描会导致 Cache 频繁颠簸 (Thrashing)。</li></ul><table><thead><tr><th><strong>循环顺序</strong></th><th><strong>内层循环</strong></th><th><strong>内存访问模式 (A, B, C)</strong></th><th><strong>Misses / Iter</strong></th><th><strong>性能评价</strong></th></tr></thead><tbody><tr><td><strong>ijk / jik</strong></td><td><code>k</code></td><td>A: Stride-1 (快)<br>B: Stride-N (慢)</td><td>~1.25</td><td><strong>中等</strong> (受限于 B)</td></tr><tr><td><strong>jki / kji</strong></td><td><code>i</code></td><td>A: Stride-N (慢)<br>C: Stride-N (慢)</td><td>~2.0</td><td><strong>最差</strong> (双重慢)</td></tr><tr><td><strong>kij / ikj</strong></td><td><code>j</code></td><td>B: Stride-1 (快)<br>C: Stride-1 (快)</td><td>~0.50</td><td><strong>最好</strong> (双重快)</td></tr></tbody></table><p>在编写处理多维数组的循环时，务必让最内层循环的索引对应数组最右侧的下标（例如 <code>Array[...][i]</code> 中的 <code>i</code>）。这能保证访问地址是连续的，最大化空间局部性。</p><h4 id="5-分块算法-Blocking-Tiled-Matrix-Multiplication">5. 分块算法 (Blocking / Tiled Matrix Multiplication)</h4><p><strong>核心思想</strong>：利用<strong>分治</strong>策略，将大的矩阵乘法分解为多个小块（Sub-blocks）的乘法。保证小块的大小能完全装入 L1 Cache 中。</p><p><strong>代码逻辑</strong>：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">// B 是分块大小 (Blocking Factor)</span><br><span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; n; i += B) &#123;          <span class="hljs-comment">// 外层 i</span><br>    <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>; j &lt; n; j += B) &#123;      <span class="hljs-comment">// 外层 j</span><br>        <span class="hljs-keyword">for</span> (k = <span class="hljs-number">0</span>; k &lt; n; k += B) &#123;  <span class="hljs-comment">// 外层 k</span><br>            <span class="hljs-comment">/* B x B mini matrix multiplications */</span><br>            <span class="hljs-comment">// 这里的 min 是为了处理边缘情况（n 不能被 B 整除时）</span><br>            <span class="hljs-keyword">for</span> (i1 = i; i1 &lt; min(i + B, n); i1++) &#123;<br>                <span class="hljs-keyword">for</span> (j1 = j; j1 &lt; min(j + B, n); j1++) &#123;<br>                    <span class="hljs-type">double</span> r = <span class="hljs-number">0</span>; <span class="hljs-comment">// 使用寄存器临时存储</span><br>                    <span class="hljs-keyword">for</span> (k1 = k; k1 &lt; min(k + B, n); k1++) &#123;<br>                        r += A[i1*n + k1] * B[k1*n + j1];<br>                    &#125;<br>                    C[i1*n + j1] += r;<br>                &#125;<br>            &#125;<br>        &#125;<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p>分块约束条件：</p><p>为了避免冲突未命中，我们需要保证<strong>参与计算的三个小块（A 的子块、B 的子块、C 的子块）能同时驻留在缓存中</strong>。<br>即：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn><mo>×</mo><mo stretchy="false">(</mo><mi>B</mi><mo>×</mo><mi>B</mi><mo stretchy="false">)</mo><mo>×</mo><mtext>sizeof(element)</mtext><mo>&lt;</mo><mtext>Cache Size</mtext></mrow><annotation encoding="application/x-tex">3 \times (B \times B) \times \text{sizeof(element)} &lt; \text{Cache Size}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">sizeof(element)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">Cache Size</span></span></span></span></span>。<br><strong>缓存未命中分析 (Miss Rate Analysis)</strong>：</p><ul><li>假设 <strong>Cache Block 可以存 8 个元素</strong>。</li><li>每计算一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>×</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">B \times B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 大小的 C 子块，我们需要加载：<ul><li>A 的一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>×</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">B \times B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 子块。</li><li>B 的一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>×</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">B \times B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 子块。</li></ul></li><li><strong>加载一个子块的 Miss 数</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>B</mi><mn>2</mn></msup><mi mathvariant="normal">/</mi><mn>8</mn></mrow><annotation encoding="application/x-tex">B^2 / 8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord">/8</span></span></span></span>。</li><li><strong>总运算量</strong>：我们需要计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mi mathvariant="normal">/</mi><mi>B</mi><mo stretchy="false">)</mo><mo>×</mo><mo stretchy="false">(</mo><mi>n</mi><mi mathvariant="normal">/</mi><mi>B</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>n</mi><mi mathvariant="normal">/</mi><mi>B</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">(n/B) \times (n/B) = (n/B)^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span> 个 C 的子块。</li><li>对于每个 C 的子块，我们需要遍历 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mi mathvariant="normal">/</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">n/B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 次 A 和 B 的子块乘法。</li><li>总 Miss 数公式：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Total Misses</mtext><mo>=</mo><mo stretchy="false">(</mo><mfrac><mi>n</mi><mi>B</mi></mfrac><msup><mo stretchy="false">)</mo><mn>3</mn></msup><mo>×</mo><mo stretchy="false">(</mo><mn>2</mn><mo>×</mo><mfrac><msup><mi>B</mi><mn>2</mn></msup><mn>8</mn></mfrac><mo stretchy="false">)</mo><mo>=</mo><mfrac><msup><mi>n</mi><mn>3</mn></msup><mrow><mn>4</mn><mi>B</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\text{Total Misses} = (\frac{n}{B})^3 \times (2 \times \frac{B^2}{8}) = \frac{n^3}{4B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">Total Misses</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1591em;vertical-align:-0.345em;"></span><span class="mopen">(</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6954em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.3629em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0179em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.3629em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0179em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><br><strong>性能对比</strong>：</li><li><strong>朴素算法 Misses</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo><mo>∼</mo><mfrac><mn>9</mn><mn>8</mn></mfrac><msup><mi>n</mi><mn>3</mn></msup></mrow><annotation encoding="application/x-tex">O(n^3) \sim \frac{9}{8} n^3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">9</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span></span></li><li><strong>分块算法 Misses</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mi mathvariant="normal">/</mi><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^3 / B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose">)</span></span></span></span></li><li><strong>结论</strong>：性能提升了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 倍（通常 B 可取 16~32 左右），这是一个巨大的优化。</li></ul><p>分块算法将内存访问模式从“扫描全图”变成了“局部高频访问”。通过让数据在被驱逐出 Cache 之前被尽可能多地复用，极大地利用了时间局部性 (Temporal Locality)。<br>但是要求缓存大小大于三个块。</p><h3 id="6-3-存储器山-The-Memory-Mountain">6.3 存储器山 (The Memory Mountain)</h3><ul><li><strong>读吞吐量 (Read Throughput)</strong> 是 <strong>步长 (Stride)</strong> 和 <strong>工作集大小 (Working Set Size)</strong> 的函数。</li><li>我们可以画出一个三维图（山），山峰是 L1 Cache，山谷是 Main Memory。</li><li>优秀的代码应该尽可能停留在“山顶”（利用 L1 Cache）。</li></ul><h2 id="7-总结-Summary">7. 总结 (Summary)</h2><ul><li><strong>Cache 是透明的</strong>：硬件自动管理，程序员无需显式控制，但可以通过代码风格影响它。</li><li><strong>局部性是关键</strong>：利用好时间局部性和空间局部性，你的程序就能飞快。</li><li><strong>优化策略</strong>：<ul><li>重新排列循环（如矩阵乘法的 ijk -&gt; kij）。</li><li>使用分块技术 (Blocking) 处理大数据集。</li></ul></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-02/"/>
    <published>2026-01-14T18:35:00.000Z</published>
    <summary>主要内容 (Overview)：</summary>
    <title>CSAPP - 08.MEM-02</title>
    <updated>2026-07-01T11:38:22.788Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>计算机组成原理笔记：存储器层次结构 (The Memory Hierarchy)</h1><div class="note note-success 核心导读：存储器层次结构 (The Memory Hierarchy)">            <p><strong>主要内容</strong>：<br>本章探讨了如何通过架构设计来弥补 <strong>CPU 高速计算</strong>与<strong>存储器低速访问</strong>之间的巨大鸿沟。</p><ol><li><strong>存储技术 (Storage Technologies)</strong>：分析了不同介质的物理特性与权衡。<ul><li><strong>SRAM</strong>：快、贵、易失 (用于 CPU 缓存)。</li><li><strong>DRAM</strong>：较慢、较便宜、易失 (用于主存)。</li><li><strong>Disk/SSD</strong>：极慢、极便宜、非易失 (用于海量存储)。</li></ul></li><li><strong>局部性原理 (Locality)</strong>：层次结构生效的<strong>理论基石</strong>。<ul><li><strong>时间局部性</strong>：刚被访问过的很快会被再次访问。</li><li><strong>空间局部性</strong>：刚被访问过的附近的数据很快会被访问。</li></ul></li><li><strong>层次结构设计 (The Hierarchy)</strong>：构建了一个“金字塔”结构 (L0 寄存器 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> L1/L2/L3 缓存 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 主存 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 磁盘)。核心机制是 <strong>缓存 (Caching)</strong> —— 总是用更小、更快的上层作为更大、更慢下层的缓冲区。</li></ol><p><strong>Motivation</strong>：<br>程序员想要一个**“无限大、无限快、无限便宜”**的存储器，但物理定律决定了速度越快造价越高、容量越小。<br><strong>存储器层次结构</strong>利用程序的局部性创造了一个完美的幻觉：向 CPU 提供接近 <strong>SRAM 的速度</strong>，同时向程序员提供接近 <strong>磁盘的容量</strong>，从而解决了日益扩大的 <strong>CPU-Memory Gap</strong>。</p>          </div><h2 id="1-存储技术-Storage-Technologies">1. 存储技术 (Storage Technologies)</h2><p>计算机利用多种不同的技术来存储信息，它们在速度、容量和成本上各不相同。</p><h3 id="1-1-随机访问存储器-RAM">1.1 随机访问存储器 (RAM)</h3><p>RAM 分为两类：静态 RAM (SRAM) 和 动态 RAM (DRAM)。</p><ul><li><p><strong>SRAM (Static RAM)</strong>：</p><ul><li><strong>原理</strong>：每个位使用 6 个晶体管存储。</li><li><strong>特性</strong>：<ul><li><strong>稳定</strong>：只要通电，数据就会保持，不需要刷新。</li><li><strong>抗干扰</strong>：对光和电噪声不敏感。</li><li><strong>速度</strong>：非常快（访问时间约 1x）。</li><li><strong>成本</strong>：非常贵，集成度低。</li></ul></li><li><strong>用途</strong>：主要用于 CPU 的 <strong>高速缓存 (Cache Memories, L1/L2/L3)</strong>。</li></ul></li><li><p><strong>DRAM (Dynamic RAM)</strong>：</p><ul><li><strong>原理</strong>：每个位使用 1 个晶体管和 1 个电容存储。</li><li><strong>特性</strong>：<ul><li><strong>不稳定</strong>：电容会漏电，必须周期性地<strong>刷新 (Refresh)</strong>（每几毫秒一次）。</li><li><strong>敏感</strong>：对干扰比较敏感。</li><li><strong>速度</strong>：比 SRAM 慢（访问时间约 10x）。</li><li><strong>成本</strong>：便宜，集成度非常高。</li></ul></li><li><strong>用途</strong>：主要用于 <strong>主存 (Main Memory)</strong> 和图形帧缓冲区。</li><li><strong>增强型 DRAM</strong>：<ul><li><strong>SDRAM (Synchronous DRAM)</strong>：与系统时钟同步。</li><li><strong>DDR (Double Data-Rate) SDRAM</strong>：在时钟的上升沿和下降沿都传输数据，提高了带宽 (DDR, DDR2, DDR3, DDR4, DDR5)。</li></ul></li></ul></li></ul><h3 id="1-2-非易失性存储器-Nonvolatile-Memory">1.2 非易失性存储器 (Nonvolatile Memory)</h3><p>RAM 是易失的 (Volatile)，断电后数据丢失。非易失性存储器在断电后仍能保存数据。</p><ul><li><strong>ROM (Read-Only Memory)</strong>：在生产时编程。</li><li><strong>Flash Memory (闪存)</strong>：基于 EEPROM 技术，可以电擦除和重写。<ul><li><strong>SSD (固态硬盘)</strong> 就是基于闪存构建的。</li></ul></li></ul><h3 id="1-3-磁盘存储-Disk-Storage">1.3 磁盘存储 (Disk Storage)</h3><ul><li><strong>机械硬盘 (Rotating Disks)</strong>：<ul><li><strong>结构</strong>：由盘片 (Platters)、表面 (Surfaces)、磁道 (Tracks)、扇区 (Sectors) 和 柱面 (Cylinders) 组成。</li><li><strong>容量</strong>：由记录密度 (Recording density)、磁道密度 (Track density) 和面密度 (Areal density) 决定。</li><li><strong>访问时间 (Access Time)</strong>：是机械运动时间，非常慢（毫秒级）。<ol><li><strong>寻道时间 (Seek Time)</strong>：读写头移动到目标柱面的时间（最慢，约 3-9 ms）。</li><li><strong>旋转延迟 (Rotational Latency)</strong>：等待目标扇区转到读写头下的时间（取决于 RPM）。</li><li><strong>传输时间 (Transfer Time)</strong>：读取数据的时间（最快）。</li></ol></li><li><strong>连接</strong>：通过 I/O 总线连接，使用 DMA (直接内存访问) 技术传送数据，不需要 CPU 干预。</li></ul></li></ul><h3 id="1-4-固态硬盘-SSD">1.4 固态硬盘 (SSD)</h3><ul><li><strong>结构</strong>：基于闪存 (Flash Memory)。数据按 <strong>页 (Page)</strong> 读写，按 <strong>块 (Block)</strong> 擦除。</li><li><strong>特性</strong>：<ul><li>无机械部件，比机械硬盘快、省电、耐用。</li><li><strong>写操作复杂</strong>：在写入一个页之前，必须擦除整个块 (Block)。这导致写操作比读操作慢。</li><li><strong>磨损 (Wear out)</strong>：每个块的擦除次数有限（约 100,000 次）。通过<strong>磨损均衡 (Wear Leveling)</strong> 逻辑来延长寿命。</li></ul></li></ul><h3 id="1-5-存储技术趋势">1.5 存储技术趋势</h3><ul><li><strong>SRAM</strong>：速度跟上 CPU，但容量小，价格贵。</li><li><strong>DRAM</strong>：速度滞后于 CPU，主要提升容量。</li><li><strong>Disk</strong>：容量巨大，但速度极慢。</li><li><strong>CPU-Memory Gap</strong>：CPU 的速度提升远快于内存速度的提升，导致处理器和内存之间的性能差距不断扩大。这迫使我们必须使用<strong>存储器层次结构</strong>。</li></ul><hr><h2 id="2-局部性原理-Locality">2. 局部性原理 (Locality)</h2><p>这是计算机程序的一个基本属性，也是存储器层次结构有效的基础。</p><p><strong>定义</strong>：程序倾向于引用邻近于其他最近引用过的数据项的数据项，或者引用最近引用过的数据项本身。</p><h3 id="2-1-两种局部性">2.1 两种局部性</h3><ol><li><p><strong>时间局部性 (Temporal Locality)</strong>：</p><ul><li>如果一个存储位置被引用了一次，那么它很可能在不久的将来再次被引用。</li><li><strong>例子</strong>：循环中的变量（如 <code>sum</code> 或循环计数器 <code>i</code>），循环体内的指令。</li></ul></li><li><p><strong>空间局部性 (Spatial Locality)</strong>：</p><ul><li>如果一个存储位置被引用了一次，那么程序很可能在不久的将来引用其<strong>附近</strong>的存储位置。</li><li><strong>例子</strong>：按顺序访问数组元素（步长为 1）。</li></ul></li></ol><h3 id="2-2-代码示例分析">2.2 代码示例分析</h3><ul><li><strong>良好的局部性</strong>：<ul><li>步长为 1 的数组访问 (Stride-1 reference pattern)。</li><li>例如：<code>sum += a[i]</code> (C语言中数组行优先存储，按行遍历局部性好)。</li></ul></li><li><strong>差的局部性</strong>：<ul><li>大步长的跳转访问。</li><li>例如：按列遍历二维数组 (Stride-N)，这会导致大量的缓存未命中。</li></ul></li></ul><hr><h2 id="3-存储器层次结构-The-Memory-Hierarchy">3. 存储器层次结构 (The Memory Hierarchy)</h2><p>为了弥补 CPU 和主存/磁盘之间的速度差异，计算机系统采用了分层的存储结构。</p><h3 id="3-1-层次结构设计">3.1 层次结构设计</h3><p>核心思想是：<strong>利用局部性原理，用上一层更小、更快的存储器作为下一层更大、更慢存储器的缓存 (Cache)。</strong></p><ul><li><strong>L0: 寄存器 (Registers)</strong>：CPU 内部，速度最快，容量最小。</li><li><strong>L1: L1 高速缓存 (SRAM)</strong>：在 CPU 芯片上，访问需几个周期。</li><li><strong>L2: L2 高速缓存 (SRAM)</strong>：在 CPU 芯片上，访问需十几个周期。</li><li><strong>L3: L3 高速缓存 (SRAM)</strong>：在 CPU 芯片上，多核共享。</li><li><strong>L4: 主存 (Main Memory - DRAM)</strong>：访问需几百个周期。</li><li><strong>L5: 本地二级存储 (Local Disk)</strong>：访问需几百万个周期。</li><li><strong>L6: 远程存储 (Remote Storage)</strong>：分布式文件系统，网络服务器。</li></ul><h3 id="3-2-缓存的概念-Caches">3.2 缓存的概念 (Caches)</h3><p><strong>缓存</strong>是一个小而快的存储设备，它作为更大、更慢设备的<strong>缓冲区</strong>。</p><ul><li><strong>缓存命中 (Hit)</strong>：CPU 需要的数据刚好在当前层 (Level k) 的缓存中。速度极快。</li><li><strong>缓存未命中 (Miss)</strong>：数据不在当前层，需要从下一层 (Level k+1) 取回数据，并将其放入当前层（可能会替换掉某个现有的块）。</li></ul><h3 id="3-3-缓存未命中的类型-3-C’s">3.3 缓存未命中的类型 (3 C’s)</h3><ol><li><strong>冷启动未命中 (Cold / Compulsory Miss)</strong>：<ul><li>缓存是空的，第一次访问某个块时必然发生。</li></ul></li><li><strong>冲突未命中 (Conflict Miss)</strong>：<ul><li>由于<strong>放置策略 (Placement Policy)</strong> 限制（例如哈希映射），多个数据块映射到了同一个缓存槽位，导致互相驱逐。即使缓存还有空位，也会发生。</li><li><strong>情况</strong>：缓存明明还有大量的空闲空间（Empty Space），但是你要访问的数据 <code>A</code> 和数据 <code>B</code> 根据映射规则（比如哈希取模），<strong>只能放在同一个坑位里</strong>。</li></ul><ul><li><strong>后果</strong>：当你交替访问 <code>A</code> 和 <code>B</code> 时，它们会互相把对方踢出去（Thrashing，颠簸），导致每次都未命中。</li></ul></li><li><strong>容量未命中 (Capacity Miss)</strong>：<ul><li>活动数据集 (Working Set) 的大小超过了缓存的总容量，缓存装不下了。</li><li>程序反复循环访问一个 1MB 的数组，但你的缓存只有 512KB。无论你怎么优化摆放位置，缓存都装不下这么多数据，旧数据必然会被挤出去。</li></ul></li></ol><h3 id="3-4-总结">3.4 总结</h3><ul><li>存储器层次结构创建了一个巨大的存储池，其<strong>成本</strong>像底层存储一样便宜，但向程序提供数据的<strong>速度</strong>却像顶层存储一样快。</li><li>理解存储器层次结构和局部性原理，对于编写高性能程序至关重要。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-01/"/>
    <published>2026-01-14T18:30:00.000Z</published>
    <summary>计算机组成原理笔记：存储器层次结构 (The Memory Hierarchy)</summary>
    <title>CSAPP - 08.MEM-01</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>计算机组成原理笔记：流水线实现 II (Pipelined Implementation Part II)</h1><div class="note note-success 核心导读：打造高效的流水线 (Building an Efficient Pipeline)">            <p><strong>主要内容</strong>：<br>上一节我们构建了 <strong>PIPE-</strong>（基础流水线），但它遇到冒险时只能通过“暂停”或“插入气泡”来解决，效率极其低下。<br>本章的目标是将 <strong>PIPE-</strong> 升级为最终的 <strong>PIPE</strong> 处理器，核心手段是：</p><ol><li><strong>数据转发 (Data Forwarding)</strong>：解决大部分数据冒险，不需要暂停，极大提升吞吐量。</li><li><strong>加载/使用冒险处理 (Load/Use Handling)</strong>：处理转发也无法解决的特殊数据冒险（必须暂停 1 周期）。</li><li><strong>控制冒险处理 (Control Hazard Handling)</strong>：高效处理分支预测错误和 <code>ret</code> 指令。</li><li><strong>异常与组合逻辑</strong>：处理多种冒险同时发生时的优先级问题。</li></ol><p><strong>Motivation</strong>：<br>如果流水线充满了“气泡”（空指令），那它就失去了意义。通过硬件层面的优化（转发），我们可以让指令像接力赛一样紧密衔接，让 CPI（每指令周期数）无限接近于 1.0，从而获得极致的性能。</p>          </div><h2 id="1-复习与现状-Review-Status">1. 复习与现状 (Review &amp; Status)</h2><h3 id="1-1-处理器演进路线">1.1 处理器演进路线</h3><ol><li><strong>SEQ</strong>：顺序执行，简单但太慢。</li><li><strong>SEQ+</strong>：调整 PC 更新阶段，为流水线做准备。</li><li><strong>PIPE-</strong>：<ul><li><strong>特点</strong>：插入了流水线寄存器 (F, D, E, M, W)。</li><li><strong>问题</strong>：无法自动处理 <strong>数据冒险 (Data Hazards)</strong> 和 <strong>控制冒险 (Control Hazards)</strong>。</li><li><strong>临时方案</strong>：依赖编译器插入 <code>nop</code> 指令（软件气泡），导致代码体积膨胀且性能低下。</li></ul></li><li><strong>PIPE</strong>：<ul><li><strong>目标</strong>：完整的、高效的流水线处理器。</li><li><strong>手段</strong>：引入 <strong>数据转发 (Data Forwarding)</strong> 和高级控制逻辑。</li></ul></li></ol><h3 id="1-2-PIPE-的困境">1.2 PIPE- 的困境</h3><ul><li><strong>数据冒险</strong>：如果指令 A 写寄存器 <code>%rax</code>，紧接着指令 B 读 <code>%rax</code>。在 PIPE- 中，B 必须等 A 写回（Write-back）后才能读，中间需要插入 3 个气泡。</li><li><strong>控制冒险</strong>：分支预测错误或 <code>ret</code> 指令导致取指错误，需要清除流水线。</li></ul><h2 id="数据冒险的解决方案：气泡指令（Bubble）">数据冒险的解决方案：气泡指令（Bubble）</h2><div class="note note-info">            <p><strong>定义</strong>：<br>“Bubble” 并不是程序员在汇编代码中写的一条真实指令，而是<strong>处理器硬件自动产生</strong>的一种特殊状态。它在功能上完全等同于 <strong><code>nop</code> (No Operation)</strong> 指令。</p><p><strong>本质</strong>：<br>当流水线控制逻辑向某个阶段（如 Execute 阶段）注入 Bubble 时，该阶段的流水线寄存器会被重置为默认状态（通常对应 <code>nop</code>）。这会导致该阶段在当前时钟周期内：</p><ul><li><strong>不执行</strong>任何有效操作。</li><li><strong>不改变</strong>任何程序状态（不写寄存器、不写内存、不改条件码）。</li><li>像一个“空气泡”一样流向下游阶段。</li></ul><p><strong>为什么要用它？（解决冒险）</strong><br>它是处理流水线冒险 (Hazards) 的关键机制，就像在紧凑的传送带上故意留出一个“空位”：</p><ol><li><strong>抵消错误 (Squashing)</strong>：当<strong>分支预测错误</strong>时，之前错误取入流水线的指令必须被“杀掉”，方法就是把它们变成 Bubble。</li><li><strong>制造延迟 (Stalling)</strong>：当发生<strong>加载/使用冒险 (Load/Use Hazard)</strong> 时，需要在执行阶段插入 Bubble，从而推迟后续指令的执行，给内存读取留出时间。</li></ol>          </div><p>气泡（Bubble）本质上是一个空操作（NOP）指令。通过在流水线中插入气泡，可以暂停流水线的某些阶段，从而解决冒险问题。</p><p>对于上图，处理器自动检测前面指令在<code>W</code>（写回）阶段与当前指令的<code>F</code>（访存）阶段是否有冲突。如果是，插入bubble指令。</p><p>为了实现“暂停”和“插入空指令”，硬件设计者修改了流水线寄存器（F, D, E, M, W），让它们支持三种操作模式：</p><table><thead><tr><th style="text-align:left">模式 (Mode)</th><th style="text-align:left">行为描述 (Behavior)</th><th style="text-align:left">作用 (Function)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Normal (正常)</strong></td><td style="text-align:left"><code>Output = Input</code></td><td style="text-align:left">正常传递信号，流水线流畅运行。</td></tr><tr><td style="text-align:left"><strong>Stall (暂停)</strong></td><td style="text-align:left"><code>Output = Old Output</code></td><td style="text-align:left"><strong>“卡住”</strong>：寄存器保持上一周期的值不变，忽略输入。这会让当前阶段的指令“停”在原地。</td></tr><tr><td style="text-align:left"><strong>Bubble (气泡)</strong></td><td style="text-align:left"><code>Output = NOP</code></td><td style="text-align:left"><strong>“喷出气泡”</strong>：寄存器的输出被强制重置为 <code>nop</code> 指令的状态。这相当于在流水线中凭空变出一条空指令。</td></tr></tbody></table><p>当译码阶段（Decode）的指令需要读取寄存器，而前面的指令（处于 Execute, Memory, Write-back 阶段）还没有把结果写回去时，就发生了数据冒险。</p><p><strong>处理流程：</strong></p><ol><li><p><strong>检测冒险 (Detection)</strong>：</p><ul><li>检查 <strong>Decode 阶段</strong>指令的源寄存器 (<code>d_srcA</code>, <code>d_srcB</code>)。</li><li>检查 <strong>Execute / Memory / Write-back 阶段</strong>指令的目的寄存器 (<code>e_dstE</code>, <code>M_dstE</code>, <code>W_dstE</code> 等)。</li><li>如果有重叠（<strong>Read-After-Write</strong>），说明数据还没准备好。</li></ul></li><li><p><strong>控制动作 (Action)</strong>：</p><ul><li><strong>对于 Decode 阶段的指令（依赖者）</strong>：<ul><li>对 <strong>D 寄存器</strong> 发送 <strong>Stall</strong> 信号 -&gt; 让这条指令留在译码阶段，下一周期继续尝试读取。</li><li>对 <strong>F 寄存器</strong> 发送 <strong>Stall</strong> 信号 -&gt; 让取指阶段也停下，防止取入新指令覆盖当前指令。</li></ul></li><li><strong>对于 Execute 阶段（空隙）</strong>：<ul><li>对 <strong>E 寄存器</strong> 发送 <strong>Bubble</strong> 信号 -&gt; 因为 D 阶段没送来新指令（被暂停了），E 阶段必须执行一个“空操作” (<code>nop</code>) 来填补时间空隙。</li></ul></li></ul></li><li><p><strong>效果</strong>：</p><ul><li>就像在两条指令之间动态插入了 <code>nop</code> 指令。</li><li>这种状态会持续（多个周期），直到前面的指令通过 <strong>Write-back</strong> 阶段，数据真正写入寄存器文件。此时冒险消除，流水线恢复 <strong>Normal</strong> 状态。</li></ul></li></ol><p>为了实现这一逻辑，引入了一个名为 <strong>Pipeline Control Logic (流水线控制逻辑)</strong> 的组合逻辑块。</p><ul><li><strong>输入</strong>：所有阶段的寄存器 ID、状态码、指令代码。</li><li><strong>输出</strong>：控制 5 个流水线寄存器的 <code>stall</code> 和 <code>bubble</code> 信号（例如 <code>F_stall</code>, <code>D_stall</code>, <code>E_bubble</code> 等）。</li></ul><p><strong>检测逻辑示例 (简化版)</strong>：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">bool</span> data_hazard =<br>    (d_srcA != RNONE &amp;&amp; d_srcA in &#123; e_dstE, M_dstE, M_dstM, W_dstE, W_dstM &#125;) ||<br>    (d_srcB != RNONE &amp;&amp; d_srcB in &#123; ... &#125;);<br><br><span class="hljs-keyword">if</span> (data_hazard) &#123;<br>    F_stall = <span class="hljs-number">1</span>;  <span class="hljs-comment">// 暂停取指</span><br>    D_stall = <span class="hljs-number">1</span>;  <span class="hljs-comment">// 暂停译码</span><br>    E_bubble = <span class="hljs-number">1</span>; <span class="hljs-comment">// 执行阶段插入气泡</span><br>&#125;<br></code></pre></td></tr></table></figure><ul><li><strong>优点</strong>：<ul><li><strong>简单</strong>：硬件逻辑相对容易实现。</li><li><strong>正确</strong>：能够保证程序逻辑的绝对正确性，不会产生数据竞争。</li></ul></li><li><strong>缺点</strong>：<ul><li><strong>性能极差 (Poor Performance)</strong>：<ul><li>每次遇到数据依赖，流水线都要停顿 2-3 个周期。</li><li>由于数据依赖在程序中非常常见，这会导致 <strong>CPI (每指令周期数)</strong> 大幅上升，吞吐量暴跌。</li><li>这使得流水线处理器退化回了 SEQ 处理器的效率，甚至更差（因为有寄存器延迟）。</li></ul></li></ul></li></ul><blockquote><p><strong>下一步</strong>：为了解决这个问题，我们需要引入 <strong>数据转发 (Data Forwarding)</strong>，让数据不需要等待写回，直接在流水线内部“传递”，从而消除这些不必要的 Bubble。</p></blockquote><h2 id="2-数据冒险的解决方案：数据转发-Data-Forwarding">2. 数据冒险的解决方案：数据转发 (Data Forwarding)</h2><p>这是本章最核心的概念。</p><h3 id="2-1-什么是数据转发？">2.1 什么是数据转发？</h3><ul><li><strong>朴素思想 (Naive Pipeline)</strong>：指令必须等到 <strong>写回 (Write-back)</strong> 阶段结束，数据真正写入寄存器文件后，后续指令才能读取。</li><li><strong>观察 (Observation)</strong>：其实数据在 <strong>执行 (Execute)</strong> 或 <strong>访存 (Memory)</strong> 阶段就已经计算出来了！</li><li><strong>转发 (Forwarding)</strong>：<ul><li><strong>原理</strong>：不等待数据写回寄存器文件，而是直接将<strong>流水线寄存器</strong>（E, M, W 阶段）中的中间结果，“抄近道”发送给 <strong>译码 (Decode)</strong> 阶段。</li><li><strong>效果</strong>：消除了大部分数据冒险带来的暂停，流水线可以满负荷运行。</li></ul></li></ul><h3 id="2-2-转发源与目的-Forwarding-Sources-Destinations">2.2 转发源与目的 (Forwarding Sources &amp; Destinations)</h3><ul><li><p><strong>源 (Sources) - 数据从哪里来？</strong></p><ol><li><strong>ALU 输出 (e_valE)</strong>：在 Execute 阶段刚算出来的结果。</li><li><strong>内存输出 (m_valM)</strong>：在 Memory 阶段刚读出来的结果。</li><li><strong>M 阶段的 ALU 结果 (M_valE)</strong>：上条指令算出来，正在过 Memory 阶段的值。</li><li><strong>W 阶段的写入值 (W_valM, W_valE)</strong>：即将写入寄存器文件，但还没写进去的值。</li></ol></li><li><p><strong>目的 (Destinations) - 数据到哪里去？</strong></p><ul><li><strong>Decode 阶段</strong>：<code>valA</code> 和 <code>valB</code> 的选择逻辑（即 <code>d_valA</code> 和 <code>d_valB</code>）。</li></ul></li></ul><h3 id="2-3-转发优先级-Forwarding-Priority">2.3 转发优先级 (Forwarding Priority)</h3><p>当流水线中有多条指令同时写同一个寄存器时（例如：连续三条指令都修改 <code>%rax</code>），应该转发哪一个？</p><p><strong>这段 HCL 代码的作用就是：</strong> 决定 <code>valA</code> 到底是从寄存器堆里读旧值，还是从流水线前面的阶段“窃取”（Forward）最新的值。</p><ul><li><strong>原则</strong>：选择 <strong>“最新” (Earliest Pipeline Stage)</strong> 的数据。</li><li><strong>逻辑顺序</strong>：<ol><li><strong>E 阶段 (Execute)</strong>：最年轻的指令，数据最新鲜。</li><li><strong>M 阶段 (Memory)</strong>。</li><li><strong>W 阶段 (Write Back)</strong>：最老的指令。</li></ol></li><li><strong>实现 (HCL)</strong>：在 <code>Case</code> 表达式中，先检查 E 阶段，再检查 M 阶段，最后检查 W 阶段。匹配即停止。</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs C"># HCL 示例：选择操作数 A (d_valA)<br><span class="hljs-type">int</span> d_valA = [<br>    # <span class="hljs-number">1.</span> 转发自 ALU 输出 (最优先)<br>    D_icode in &#123; ICALL, IJXX &#125; : D_valP; <br>    d_srcA == e_dstE : e_valE;<br><br>    # <span class="hljs-number">2.</span> 转发自 内存阶段<br>    d_srcA == M_dstM : m_valM;<br>    d_srcA == M_dstE : M_valE;<br><br>    # <span class="hljs-number">3.</span> 转发自 写回阶段<br>    d_srcA == W_dstM : W_valM;<br>    d_srcA == W_dstE : W_valE;<br><br>    # <span class="hljs-number">4.</span> 没有冲突，读寄存器文件<br>    <span class="hljs-number">1</span> : d_rvalA;<br>];<br></code></pre></td></tr></table></figure><hr><h2 id="3-加载-使用冒险-Load-Use-Hazard">3. 加载/使用冒险 (Load/Use Hazard)</h2><h3 id="3-1-转发的局限性">3.1 转发的局限性</h3><p>有一种情况是转发也救不了的：<strong>加载/使用冒险</strong>。</p><ul><li><strong>场景</strong>：<ol><li><code>mrmovq (%rcx), %rax</code> (从内存读数据到 <code>%rax</code>)</li><li><code>addq %rax, %rbx</code> (下一条指令立马用 <code>%rax</code>)</li></ol></li><li><strong>原因</strong>：<ul><li>指令 1 在 <strong>Memory</strong> 阶段结束时（周期 8）才能拿到数据。</li><li>指令 2 需要在 <strong>Execute</strong> 阶段开始时（周期 8）使用数据。</li><li><strong>时序冲突</strong>：数据还没读出来，ALU 就要用了。这是一个“时光倒流”的需求，硬件做不到。</li></ul></li></ul><h3 id="3-2-解决方案：暂停-转发">3.2 解决方案：暂停 + 转发</h3><ul><li><strong>策略</strong>：必须暂停 <strong>1 个时钟周期</strong>。</li><li><strong>具体操作</strong>：<ol><li><strong>Stall (暂停)</strong>：保持 Fetch 和 Decode 阶段的指令不变（F 和 D 寄存器不更新）。PC不更新。</li><li><strong>Bubble (气泡)</strong>：向 Execute 阶段插入一个气泡（<code>nop</code>）。</li></ol></li><li><strong>结果</strong>：指令 2 晚一步进入 E 阶段，此时指令 1 已经拿到了内存数据，可以通过转发机制（从 W 阶段转发到 E 阶段前）解决问题。</li></ul><h3 id="3-3-检测逻辑-Detection-Logic">3.3 检测逻辑 (Detection Logic)</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">bool</span> load_use_hazard = <br>    (E_icode in &#123; IMRMOVQ, IPOPQ &#125;) &amp;&amp;  # 上一条指令是读内存<br>    (E_dstM in &#123; d_srcA, d_srcB &#125;);     # 且 目标寄存器 == 当前指令的源寄存器<br></code></pre></td></tr></table></figure><p><code>ret</code>指令也会访问内存，但是写入的是<code>PC</code>（硬件寄存器）而不是寄存器文件，所以不会出现加载/使用冒险。</p><p>在PIPE处理器中，一般的数据冲突并不会增加时钟周期，只有<mark>加载/使用冒险</mark>会增加1个时钟周期。</p><p><code>pop</code>指令在写回阶段时候，要写两个寄存器，<code>R[%rsp] &lt;- valE</code>和<code>R[%rA] &lt;- valM</code>，在这里将栈顶元素值和新的栈地址“都写入”<code>%rsp</code>寄存器。事实上，写入哪个依赖于下面的顺序：</p><ol><li>HCL 逻辑开始判断第一行：<code>d_srcA</code> (<code>%rsp</code>) 是否等于 <code>M_dstE</code> (<code>%rsp</code>)？</li><li><strong>答案是 YES！</strong> 因为 <code>popq</code> 指令确实会更新栈指针（<code>dstE</code> 设为了 <code>%rsp</code>）。</li><li><strong>匹配命中，立即停止</strong>。</li><li><strong>输出结果</strong>：选择 <code>M_valE</code>。</li></ol><h2 id="4-控制冒险的解决方案-Handling-Control-Hazards">4. 控制冒险的解决方案 (Handling Control Hazards)</h2><p>控制冒险主要来自 <strong>分支预测错误</strong> 和 <strong>返回指令 (ret)</strong>。</p><h3 id="4-1-分支预测错误-Branch-Misprediction">4.1 分支预测错误 (Branch Misprediction)</h3><p>在流水线中，处理器为了保持高速运转，遇到条件跳转指令（如 <code>je</code>, <code>jne</code>）时，不能等到算出结果再决定下一条指令取哪里的。它必须<strong>猜测</strong>（通常 CS:APP 的 Y86 设计默认采用“<strong>预测跳转 (Always Taken)</strong>”策略，或者简单的静态预测）。</p><ul><li><p><strong>Fetch 阶段</strong>：看到了 <code>je target</code>，直接假设条件成立，开始取 <code>target</code> 处的指令。</p></li><li><p><strong>Decode 阶段</strong>：继续处理 <code>target</code> 处的指令。</p></li><li><p><strong>Execute 阶段</strong>：<strong>真相大白时刻</strong>。ALU 终于算出了条件码（CC），我们知道了条件到底成不成立。</p></li><li><p><strong>现状</strong>：我们默认预测条件跳转 (<code>jXX</code>) 是 <strong>Taken (跳转)</strong> 的。</p></li><li><p><strong>问题</strong>：如果实际不应该跳转 (Not Taken)，流水线已经错误地取入了目标地址的<mark>两条</mark>指令。</p></li><li><p><strong>解决</strong>：<strong>Cancel (取消/冲刷)</strong>。</p><ul><li>当 <code>jXX</code> 到达 Execute 阶段时，ALU 算出条件不满足。</li><li><strong>注入气泡 (Inject Bubbles)</strong>：在下一个周期，将<mark>Decode 和 Execute 阶段</mark>的指令替换为气泡。</li><li><strong>修正 PC</strong>：Fetch 阶段重新从正确地址 (<code>valP</code>) 取指。</li></ul></li><li><p><strong>代价</strong>：浪费 <strong>2 个</strong> 时钟周期。</p></li></ul><p><code>Trigger: E_icode = IJXX &amp; !e_Cnd</code></p><p>这个公式的意思是：<strong>“如果在 Execute 阶段发现这是一条跳转指令，并且条件竟然不成立！”</strong></p><p>我们逐项拆解：</p><ul><li><p><strong><code>E_icode = IJXX</code></strong>:</p><ul><li>表示当前在 Execute 阶段执行的指令是<strong>条件跳转指令</strong>（Jump if XX，例如 <code>je</code>, <code>jg</code>, <code>jl</code> 等）。</li><li>注：<code>jmp</code> 是无条件跳转，不需要判断条件，所以不算在这里。</li></ul></li><li><p><strong><code>!e_Cnd</code></strong>:</p><ul><li><code>e_Cnd</code> 是图中蓝色小方块输出的信号 (Condition Holds)。它根据 ALU 刚刚算出的标志位（CC）判断跳转条件是否为真。</li><li><code>!e_Cnd</code> 表示<strong>条件为假 (False)</strong>。</li><li><strong>关键隐含前提</strong>：因为我们的处理器（Y86-64 Pipeline）默认策略通常是<strong>预测跳转 (Predicted Taken)</strong>。</li><li>如果我们<strong>预测它会跳</strong>（已经去取目标地址的指令了），结果现在发现<strong>条件不成立（不该跳）</strong>，这就说明我们<strong>预测错了吗 (Mispredicted)</strong>。</li></ul></li><li><p><strong>ALU &amp; CC (Condition Codes)</strong>:</p><ul><li>ALU 执行计算（比如 <code>subq %rax, %rbx</code>），产生 Zero Flag (ZF), Sign Flag (SF) 等。</li><li>这些标志位保存在 CC 寄存器中。</li></ul></li><li><p><strong>e_Cnd 逻辑块</strong>:</p><ul><li>它读取当前的跳转类型（比如 <code>je</code> 需要 ZF=1）和当前的 CC 值。</li><li>如果匹配，输出 1 (<code>e_Cnd</code> is true)；否则输出 0。</li></ul></li></ul><p>虽然这张图只讲了“检测”，但检测到之后的动作才是关键，这通常被称为<strong>流水线清洗 (Pipeline Flushing)</strong>：</p><ol><li>废除指令：<br>因为预测错了，所以目前紧跟在跳转指令后面的两条指令（分别在 Fetch 和 Decode 阶段）都是错误的指令（原本不该执行的）。<br>处理器必须向 D 和 E 流水线寄存器中插入气泡 (Bubble)，或者把它们变为 nop，从而“杀掉”这两条错误指令。</li><li>修正 PC：<br>处理器必须把 PC 重新指向正确的地址（即跳转指令的下一条指令，也就是“不跳转”的路径）。</li></ol><h3 id="4-2-返回指令-Ret-Instruction">4.2 返回指令 (Ret Instruction)</h3><ul><li><strong>现状</strong>：<code>ret</code> 的返回地址在栈里，必须等到 <strong>Memory</strong> 阶段才能拿到。</li><li><strong>解决</strong>：<strong>Stall until complete (一直暂停)</strong>。<ul><li>当译码阶段发现 <code>ret</code> 指令时。</li><li>对 Fetch 阶段进行 <strong>Stall (暂停)</strong>，只要 <code>ret</code> 还在 D, E, M 阶段。</li><li>对 Decode 阶段进行 <strong>Bubble (气泡)</strong>，防止错误指令进入。</li><li>直到 <code>ret</code> 到达 Write-back 阶段，拿到了 <code>valM</code> (返回地址)，并将 PC 设置为该地址。</li></ul></li><li><strong>代价</strong>：浪费 <strong>3 个</strong> 时钟周期。</li></ul><p>分三次每次插一个<code>bubble</code></p><hr><h2 id="5-流水线控制逻辑总结-Pipeline-Control-Logic">5. 流水线控制逻辑总结 (Pipeline Control Logic)</h2><p>我们需要一个集中的逻辑块来控制所有流水线寄存器的状态（Normal, Stall, Bubble）。</p><h3 id="5-1-特殊情况组合-Control-Combinations">5.1 特殊情况组合 (Control Combinations)</h3><p>有些罕见情况会同时触发多种控制逻辑，需要设定优先级。</p><ul><li><p><strong>组合 A (Mispredict + Ret)</strong>：</p><ul><li>分支预测错误，且跳转目标刚好是 <code>ret</code>。</li><li>处理：按 <strong>分支预测错误</strong> 处理。</li></ul></li><li><p><strong>组合 B (Load/Use + Ret)</strong>：</p><ul><li>加载/使用冒险，且下一条是 <code>ret</code>。</li><li>处理：<strong>Load/Use 优先级更高</strong>。因为如果不暂停让数据读出来，<code>ret</code> 根本不知道回哪去。</li></ul></li></ul><h3 id="5-2-最终控制表-Pipeline-Control-Actions">5.2 最终控制表 (Pipeline Control Actions)</h3><table><thead><tr><th><strong>条件 (Condition)</strong></th><th><strong>F Reg</strong></th><th><strong>D Reg</strong></th><th><strong>E Reg</strong></th><th><strong>M Reg</strong></th><th><strong>W Reg</strong></th></tr></thead><tbody><tr><td><strong>正常 (Normal)</strong></td><td>Normal</td><td>Normal</td><td>Normal</td><td>Normal</td><td>Normal</td></tr><tr><td><strong>加载/使用冒险 (Load/Use)</strong></td><td><strong>Stall</strong></td><td><strong>Stall</strong></td><td><strong>Bubble</strong></td><td>Normal</td><td>Normal</td></tr><tr><td><strong>分支预测错误 (Mispredict)</strong></td><td>Normal</td><td><strong>Bubble</strong></td><td><strong>Bubble</strong></td><td>Normal</td><td>Normal</td></tr><tr><td><strong>Ret 指令处理</strong></td><td><strong>Stall</strong></td><td><strong>Bubble</strong></td><td>Normal</td><td>Normal</td><td>Normal</td></tr></tbody></table><hr><h2 id="6-性能分析-Performance-Analysis">6. 性能分析 (Performance Analysis)</h2><h3 id="6-1-CPI-Cycles-Per-Instruction">6.1 CPI (Cycles Per Instruction)</h3><p>衡量流水线效率的核心指标。</p><ul><li><strong>理想 CPI</strong>：1.0 (每个周期完成一条指令)。</li><li><strong>实际 CPI</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.0</mn><mo>+</mo><mtext>惩罚 (Penalties)</mtext></mrow><annotation encoding="application/x-tex">1.0 + \text{惩罚 (Penalties)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord cjk_fallback">惩罚</span><span class="mord"> (Penalties)</span></span></span></span></span>。<ul><li><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>C</mi><mi>P</mi><mi>I</mi><mo>=</mo><mfrac><msub><mi>C</mi><mrow><mi>t</mi><mi>o</mi><mi>t</mi><mi>a</mi><mi>l</mi></mrow></msub><msub><mi>I</mi><mrow><mi>t</mi><mi>o</mi><mi>t</mi><mi>a</mi><mi>l</mi></mrow></msub></mfrac><mo>=</mo><mn>1.0</mn><mo>+</mo><mfrac><msub><mi>B</mi><mrow><mi>b</mi><mi>u</mi><mi>b</mi><mi>b</mi><mi>l</mi><mi>e</mi><mi>s</mi></mrow></msub><msub><mi>I</mi><mrow><mi>t</mi><mi>o</mi><mi>t</mi><mi>a</mi><mi>l</mi></mrow></msub></mfrac></mrow><annotation encoding="application/x-tex">CPI = \frac{C_{total}}{I_{total}} = 1.0 + \frac{B_{bubbles}}{I_{total}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">CP</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.1963em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.1963em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">bb</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li></ul></li></ul><h3 id="6-2-惩罚项-Penalties">6.2 惩罚项 (Penalties)</h3><ol><li><strong>LP (Load Penalty)</strong>: 加载/使用冒险导致的气泡 (1个)。</li><li><strong>MP (Misprediction Penalty)</strong>: 分支预测错误导致的气泡 (2个)。</li><li><strong>RP (Return Penalty)</strong>: <code>ret</code> 指令导致的气泡 (3个)。</li></ol><p>典型性能计算：</p><p>假设：Load占25% (其中20%发生冲突), 分支占20% (40%预测错), Ret占2%。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>C</mi><mi>P</mi><mi>I</mi><mo>=</mo><mn>1.0</mn><mo>+</mo><mo stretchy="false">(</mo><mn>0.25</mn><mo>×</mo><mn>0.2</mn><mo>×</mo><mn>1</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>0.2</mn><mo>×</mo><mn>0.4</mn><mo>×</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>0.02</mn><mo>×</mo><mn>3</mn><mo stretchy="false">)</mo><mo>=</mo><mn>1.27</mn></mrow><annotation encoding="application/x-tex">CPI = 1.0 + (0.25 \times 0.2 \times 1) + (0.2 \times 0.4 \times 2) + (0.02 \times 3) = 1.27</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">CP</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0.25</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0.2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0.2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0.4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0.02</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.27</span></span></span></span></span></p><ul><li>结论：虽然有暂停和预测错误，CPI 1.27 依然远好于非流水线的 CPI (如 &gt; 5.0)。</li></ul><hr><h2 id="7-现代处理器展望-Modern-CPU-Design">7. 现代处理器展望 (Modern CPU Design)</h2><p>课件最后简要提及了真实世界的高性能 CPU（如 Intel Haswell）是如何设计的：</p><ol><li><strong>超深流水线</strong>：不止 5 级，可能有 15-20 级，以提高主频。</li><li><strong>多发射 (Multiple Issue)</strong>：每个周期取指、译码、执行多条指令 (Superscalar)。</li><li><strong>乱序执行 (Out-of-Order Execution)</strong>：<ul><li>指令不一定按顺序执行。</li><li>有一个指令池，谁的数据准备好了谁先跑。</li><li><strong>退役单元 (Retirement Unit)</strong>：确保指令按程序顺序写回结果（保证正确性）。</li></ul></li><li><strong>分支预测 (Branch Prediction)</strong>：<ul><li>使用 <strong>BTB (Branch Target Buffer)</strong> 和复杂的历史记录表。</li><li>预测准确率极高 (&gt;95%)，极大减少了 MP 惩罚。</li></ul></li></ol><blockquote><p><strong>总结</strong>：从 SEQ 到 PIPE 是计算机体系结构的一次飞跃。通过<strong>转发</strong>解决了数据等待，通过<strong>预测</strong>解决了控制等待，虽然引入了复杂性，但获得了巨大的性能回报。</p></blockquote>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/07-PIPE-02/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/07-PIPE-02/"/>
    <published>2026-01-14T18:25:00.000Z</published>
    <summary>计算机组成原理笔记：流水线实现 II (Pipelined Implementation Part II)</summary>
    <title>CSAPP - 07.PIPE-02</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<div class="note note-success 核心导读：从顺序执行到流水线设计">            <p><strong>主要内容</strong>：<br>本章重点介绍了从 <strong>SEQ (顺序执行)</strong> 处理器向 <strong>PIPE (流水线)</strong> 处理器的演进过程。</p><ol><li><strong>流水线原理</strong>：流水线 (Pipelining) ——将任务分解为子任务并行处理，以提高 <strong>吞吐量 (Throughput)</strong>。</li><li><strong>PIPE- 设计</strong>：在 SEQ+ 的基础上插入流水线寄存器 (Pipeline Registers)，实现了基本的流水线处理器 PIPE-。</li><li><strong>流水线挑战</strong>：讨论了流水线带来的新问题，主要是 <strong>数据冒险 (Data Hazards)</strong> 和 <strong>控制冒险 (Control Hazards)</strong>，以及通过插入 NOP 指令这种低效的解决方法。</li><li><strong>ISA（指令集）没有改变</strong><ul><li>无论是 SEQ 还是 PIPE，它们支持的<strong>指令集 (Y86-64)</strong> 是完全一样的。</li><li>程序员写出的汇编代码 <code>addq %rax, %rbx</code> 在两者上都能跑，结果也一样。</li></ul></li><li>改变的是微架构（Microarchitecture）<ul><li><strong>硬件电路结构变了</strong>：我们在 SEQ 的基础上，在各个阶段之间插入了<strong>流水线寄存器 (Pipeline Registers)</strong>。</li><li><strong>执行方式变了</strong>：<ul><li><strong>SEQ</strong>：一条指令必须跑完所有 6 个阶段（<code>F-&gt;D-&gt;E-&gt;M-&gt;W</code>），下一条指令才能进场。</li><li><strong>PIPE</strong>：第一条指令刚跑完 F 阶段进入 D 阶段，第二条指令就可以马上进入 F 阶段。</li></ul></li></ul></li></ol><p><strong>Motivation</strong>：<br>现代 CPU 为了追求高性能，普遍采用深度流水线技术。理解流水线的设计原理、局限性（如不均匀延迟、寄存器开销）以及它带来的冒险问题，是深入理解现代计算机体系结构性能瓶颈的关键。</p>          </div><h2 id="1-流水线的基本原理-General-Principles-of-Pipelining">1. 流水线的基本原理 (General Principles of Pipelining)</h2><h3 id="1-1-现实世界的流水线">1.1 现实世界的流水线</h3><ul><li><strong>例子</strong>：洗车店、福特汽车装配线。</li><li><strong>核心思想</strong>：<ul><li>将整个处理过程划分为若干个<strong>独立的阶段 (Independent Stages)</strong>。</li><li>让对象（如汽车、指令）依次通过这些阶段。</li><li><strong>并行处理</strong>：在任何时刻，多个对象正在被不同的阶段同时处理。</li></ul></li></ul><h3 id="1-2-计算系统中的流水线示例">1.2 计算系统中的流水线示例</h3><p>假设一个组合逻辑电路需要 300ps (皮秒) 完成计算，加上寄存器加载需要 20ps。</p><ul><li><p><strong>非流水线系统 (Unpipelined System)</strong>：</p><ul><li><strong>延迟 (Delay)</strong>：320 ps (300 + 20)。</li><li><strong>吞吐量 (Throughput)</strong>：1 / 320ps ≈ 3.12 GIPS (十亿指令/秒)。</li><li><strong>特点</strong>：必须等上一条指令完全做完，下一条才能开始。</li></ul></li><li><p><strong>3级流水线系统 (3-Way Pipelined System)</strong>：</p><ul><li>将组合逻辑拆分为 A, B, C 三个阶段，每个 100ps。</li><li>插入流水线寄存器 (20ps)。</li><li><strong>单阶段时间</strong>：120 ps (100 + 20)。</li><li><strong>吞吐量</strong>：1 / 120ps ≈ 8.33 GIPS。</li><li><strong>延迟</strong>：3 * 120 = 360 ps (单条指令的总延迟变长了)。</li><li><strong>优势</strong>：吞吐量提升了 2.67 倍。</li></ul></li></ul><h3 id="1-3-流水线的局限性-Limitations">1.3 流水线的局限性 (Limitations)</h3><ol><li><strong>不均匀的阶段延迟 (Nonuniform Delays)</strong>：<ul><li>流水线的时钟周期受限于<strong>最慢</strong>的那个阶段。</li><li>如果阶段划分不均匀（例如 50ps, 150ps, 100ps），吞吐量会被 150ps 的阶段拖慢，其他快阶段会空闲。</li></ul></li><li><strong>寄存器开销 (Register Overhead)</strong>：<ul><li>每个流水线寄存器都会引入延迟（如 20ps）。</li><li>随着流水线级数加深，寄存器延迟占总周期的比例会越来越大，从而限制了流水线深度的上限。</li></ul></li></ol><h4 id="数据依赖-Data-Dependency"><strong>数据依赖 (Data Dependency)</strong></h4><ul><li><strong>定义</strong>: 数据依赖指的是指令之间关于数据的先后使用关系。当一条指令需要使用前一条（或几条）指令计算出的结果作为操作数时，这两条指令之间就存在数据依赖。</li><li><strong>类型</strong>:<ul><li><strong>读后写 (Read-After-Write, RAW)</strong>: 这是最常见也是流水线中主要关注的依赖。指令 B 需要读取指令 A 写入的寄存器或内存数据。如果 A 还没写完，B 就读了，就会出错。这被称为“真依赖 (True Dependency)”。</li><li><em>写后读 (Write-After-Read, WAR)</em>: 指令 B 写入指令 A 读取的位置。在乱序执行中需要注意，但在简单的顺序流水线中通常不是大问题。</li><li><em>写后写 (Write-After-Write, WAW)</em>: 指令 B 和指令 A 写入同一个位置。需要保证最终结果是 B 的值。</li></ul></li><li><strong>本质</strong>: 它是程序逻辑的固有属性，由代码本身的顺序决定。</li></ul><h4 id="数据冒险-Data-Hazard"><strong>数据冒险 (Data Hazard)</strong></h4><ul><li><strong>定义</strong>: 数据冒险是指由于<strong>数据依赖</strong>的存在，导致流水线中的下一条指令无法在预期的时钟周期内正确执行的现象。简单来说，就是“想用的数据还没准备好”。</li><li><strong>发生场景</strong>:<ol><li>指令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 修改了寄存器 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>。</li><li>紧接着的指令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 需要读取寄存器 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>。</li><li>在流水线中，指令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 可能还在<strong>执行 (Execute)</strong> 或 <strong>写回 (Write Back)</strong> 阶段，数据还没真正写入寄存器文件。</li><li>此时指令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 在 <strong>译码 (Decode)</strong> 阶段尝试读取 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>，读到的是旧值（脏数据）。</li></ol></li><li><strong>本质</strong>: 它是流水线硬件设计导致的<strong>时间冲突</strong>问题。</li></ul><hr><h2 id="2-构建流水线-Y86-64-处理器-Creating-a-Pipelined-Y86-64-Processor">2. 构建流水线 Y86-64 处理器 (Creating a Pipelined Y86-64 Processor)</h2><h3 id="2-1-改造-SEQ-SEQ">2.1 改造 SEQ -&gt; SEQ+</h3><p>为了适应流水线，首先需要对 SEQ 进行微调，得到 <strong>SEQ+</strong>：</p><ul><li><strong>PC 阶段的移动</strong>：将 PC 更新阶段移到<strong>周期的开始</strong>。<ul><li>目的：为了在流水线中更早地计算出下一条指令的地址。</li><li><strong>PC 预测</strong>：不再通过寄存器保存 PC，而是基于上一条指令的信息动态计算当前 PC。</li></ul></li></ul><h3 id="2-2-插入流水线寄存器-Inserting-Pipeline-Registers">2.2 插入流水线寄存器 (Inserting Pipeline Registers)</h3><p>在 SEQ+ 的各个阶段之间插入流水线寄存器，形成 <strong>PIPE-</strong> 架构。这些寄存器用于保存指令在各阶段产生的中间结果，使其能传递到下一阶段。</p><p>虽然名字里有“寄存器”三个字，但请<strong>不要</strong>把它和“通用寄存器”（如 <code>%rax</code>, <code>%rbx</code>, <code>%rsp</code> 组成的 <code>Register File</code>）混淆。</p><ul><li><strong>通用寄存器 (Register File)：</strong> 程序员可见的，用来存代码里的变量。</li><li><strong>流水线寄存器：</strong> 程序员<strong>不可见</strong>的，是 CPU 内部用来存“指令状态”的。</li><li><strong>硬件实现：</strong> 它们本质上是一组 <strong>D 触发器 (D Flip-Flops)</strong>。这意味着它们是由<strong>时钟信号 (Clock)</strong> 控制的。</li></ul><div class="note note-info">            <p><strong>流水线寄存器 (Pipeline Registers)</strong><br>它们是位于 F, D, E, M, W 各个阶段之间的硬件“隔离墙”（由时钟控制的触发器组成）。</p><p><strong>核心作用</strong></p><ol><li><strong>隔离</strong>：防止当前阶段不稳定的电信号干扰后续阶段。</li><li><strong>传递</strong>：在时钟上升沿，将上一阶段的计算结果“锁存”，带入下一阶段，防止被紧跟的新指令覆盖。</li></ol><p><strong>命名规则：为什么要有前缀？</strong></p><ul><li><strong>无前缀 (如 valE)</strong>：<strong>组合逻辑输出 (Wire)</strong>。代表当前阶段（Execute）ALU 刚刚算出的瞬时值。</li><li><strong>有前缀 (如 M_valE)</strong>：<strong>流水线寄存器输出 (State)</strong>。代表该数值目前存储在 M 寄存器中，供当前阶段（Memory）使用或透传。</li></ul><p><strong>数据流动实例 (以 valM 为例)</strong></p><ol><li><strong>Memory 阶段</strong>：从内存读出数据 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 产生瞬时信号 <strong>valM</strong>。</li><li><strong>时钟跳变</strong>：信号被锁存进 <strong>W 寄存器</strong>。</li><li><strong>Write Back 阶段</strong>：W 寄存器输出 <strong>W_valM</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 最终写入通用寄存器文件。</li></ol>          </div><p><strong>流水线寄存器命名规范</strong>：</p><ul><li><strong>F (Fetch)</strong>: 保存 PC 预测值。</li><li><strong>D (Decode)</strong>: 位于取指和译码之间。</li><li><strong>E (Execute)</strong>: 位于译码和执行之间。</li><li><strong>M (Memory)</strong>: 位于执行和访存之间。</li><li><strong>W (Write back)</strong>: 位于访存和写回之间。</li></ul><ul><li><strong>SEQ (顺序) 模式 —— “独占”</strong><ul><li><strong>场景</strong>：CPU 里同一时刻<strong>只有一条指令</strong>在运行。</li><li><strong>状态</strong>：当这一条指令在执行时，整个电路中的 <code>icode</code>（指令代码）、<code>valC</code>（立即数）、<code>dstE</code>（目标寄存器）等信号线，传输的都是<strong>这一条指令</strong>的数据。</li><li><strong>命名</strong>：因为没有竞争者，我们直接叫 <code>icode</code> 就行，不会产生歧义。</li></ul></li><li><strong>PIPE (流水线) 模式 —— “并发”</strong><ul><li><strong>场景</strong>：CPU 里同一时刻有 <strong>5 条不同的指令</strong> 在同时运行，分别处于 F, D, E, M, W 五个阶段。</li><li><strong>冲突</strong>：<ul><li><strong>取指阶段 (F)</strong> 正在读取指令 A（例如 <code>jmp</code>）。</li><li><strong>译码阶段 (D)</strong> 正在解析指令 B（例如 <code>addq</code>）。</li><li><strong>执行阶段 (E)</strong> 正在计算指令 C（例如 <code>mrmovq</code>）。</li></ul></li><li><strong>问题</strong>：这三条指令都有自己的 <code>icode</code>。如果你在控制逻辑里只写一个 <code>icode</code>，电路根本不知道你指的是哪条指令。是指正在取指的 <code>jmp</code>？还是正在译码的 <code>addq</code>？</li></ul></li></ul><p><strong>信号命名</strong>：</p><ul><li><strong>为了区分不同阶段的同名信号</strong>，加上阶段前缀。</li><li>例如：<code>D_icode</code> (译码阶段的 <code>icode</code>), <code>E_icode</code> (执行阶段的 <code>icode</code>), <code>M_valE</code> (访存阶段的 <code>valE</code>)。</li></ul><h3 id="2-3-PC-预测策略-PC-Prediction-Strategy">2.3 PC 预测策略 (PC Prediction Strategy)</h3><p>在 PIPE 的电路图中（特别是在 Fetch 阶段的开头），你会看到一个叫 <strong>Select PC</strong> 的逻辑块。它取代了 SEQ 中最后的“更新 PC”阶段。</p><table><thead><tr><th><strong>特性</strong></th><th><strong>SEQ 处理器</strong></th><th><strong>PIPE 处理器</strong></th></tr></thead><tbody><tr><td><strong>PC 何时更新</strong></td><td><strong>当前指令结束时</strong> (第 6 阶段)</td><td><strong>下一条指令开始前</strong> (第 1 阶段)</td></tr><tr><td><strong>决策依据</strong></td><td><strong>事实</strong> (确切知道下一条去哪)</td><td><strong>预测</strong> (先猜一个，猜错再改)</td></tr><tr><td><strong>电路位置</strong></td><td>这里的逻辑是计算 <code>newPC</code></td><td>这里的逻辑叫 <strong>Select PC</strong></td></tr><tr><td><strong>PC 寄存器</strong></td><td>真实的硬件寄存器 PC</td><td><strong>F 流水线寄存器</strong> 里的 <code>predPC</code></td></tr></tbody></table><p>所谓的“预测”，就是当 CPU 刚刚把当前指令（比如一条跳转指令）读进来，还完全不知道这条指令想干什么的时候，就<strong>强行猜一个地址</strong></p><ul><li>如果猜对了，流水线继续飞速运行。</li><li>如果猜错了，就需要把刚才读进来的东西扔掉，重新去正确的地方读（这就是“预测失败的惩罚”）。</li></ul><ul><li><strong>策略</strong>：<ul><li><strong>普通指令</strong>：预测为 <code>valP</code> (下一条顺序指令)。</li><li><strong><code>Call / Jmp</code> (无条件)</strong>：预测为 <code>valC</code> (目标地址)。</li><li><strong><code>JXX</code> (条件跳转)</strong>：<strong>总是预测选择分支 (Always Taken)</strong>，即预测为 <code>valC</code>。</li><li><strong>Ret</strong>：<strong>不预测</strong>，因为返回地址在栈中，必须等到访存阶段读出后才知道。这会导致流水线暂停。</li></ul></li></ul><hr><h2 id="4-流水线冒险-Pipeline-Hazards">4. 流水线冒险 (Pipeline Hazards)</h2><p>PIPE- 虽然实现了流水线结构，但它面临严重的<strong>依赖 (Dependency)</strong> 问题。</p><h3 id="4-1-数据冒险-Data-Hazards">4.1 数据冒险 (Data Hazards)</h3><p>当一条指令需要使用上一条（或上几条）指令尚未写回的结果时，就会发生数据冒险。</p><ul><li><strong>根本原因</strong>：<code>Read-after-write (RAW)</code> 依赖。下一条指令在译码阶段读取寄存器时，上一条指令的结果还在执行或访存阶段，还没写回寄存器文件。</li><li><strong>例子</strong>：</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs assembly">irmovq $10, %rdx  ; 写 %rdx<br>addq %rdx, %rax   ; 读 %rdx (但在流水线中，此时上面的写操作还没完成)<br></code></pre></td></tr></table></figure><h3 id="4-2-控制冒险-Control-Hazards">4.2 控制冒险 (Control Hazards)</h3><p>当处理器无法根据当前指令确定下一条指令的地址时（通常发生在跳转或返回指令），就会发生控制冒险。</p><ul><li><strong>根本原因</strong>：PC 的更新依赖于指令执行的结果，而流水线已经取出了后续的指令。</li><li><strong>例子</strong>：<ul><li><strong>条件跳转 (Mispredicted Branch)</strong>：预测跳转了，但实际没跳。导致流水线中取入了错误的指令。</li><li><strong>Ret 指令</strong>：返回地址必须等到访存阶段读栈后才知道，导致后面几条指令取指错误。</li></ul></li></ul><h3 id="4-3-临时解决方案：插入-NOP">4.3 临时解决方案：插入 NOP</h3><p>在 PIPE- 中，解决冒险的简单（但低效）方法是编译器或硬件自动插入 <strong>NOP (No Operation)</strong> 指令。</p><ul><li><strong>原理</strong>：通过插入 NOP 产生气泡，推迟后续指令的执行，直到依赖的数据准备好。</li><li><strong>缺点</strong>：严重降低性能（吞吐量）。如果一条指令后面要跟 3-4 个 NOP，流水线的优势就荡然无存了。</li></ul><h3 id="4-4-总结与展望">4.4 总结与展望</h3><ul><li><strong>PIPE-</strong>：这是一个通过插入流水线寄存器构建的基础流水线处理器。</li><li><strong>问题</strong>：无法高效处理数据冒险和控制冒险。</li><li><strong>下一步 (PIPE)</strong>：我们将通过 <strong>数据转发 (Data Forwarding)</strong> 和更复杂的控制逻辑来解决这些问题，构建最终的高效 PIPE 处理器。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/07-PIPE-01/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/07-PIPE-01/"/>
    <published>2026-01-14T18:20:00.000Z</published>
    <summary>本章重点介绍了从 SEQ (顺序执行) 处理器向 PIPE (流水线) 处理器的演进过程。</summary>
    <title>CSAPP - 07.PIPE-01</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>计算机体系结构笔记：SEQ 顺序实现 (Sequential Implementation)</h1><div class="note note-success 核心导读：从逻辑门到处理器">            <p><strong>主要内容</strong>： 本章正式进入硬件实现（微架构）层面。我们将跨越数字电路基础，最终设计出一个完整的 CPU。</p><ol><li><strong>数字电路基础</strong>：组合逻辑（ALU、MUX）与时序逻辑（寄存器、时钟、锁存器）的区别与协作。</li><li><strong>HCL (Hardware Control Language)</strong>：学习一种简单的硬件描述语言来表达控制逻辑。</li><li><strong>SEQ (顺序) 处理器</strong>：这是我们设计的第一个 CPU。它将指令执行分解为 6 个统一阶段（取指、译码、执行、访存、写回、更新），并在<strong>一个时钟周期</strong>内按顺序完成所有操作。</li><li>本节内容为：<strong>如何用 HCL 这种语言，来定义 SEQ 处理器的控制逻辑</strong></li></ol><p><strong>Motivation</strong>： 这一章打破了软件和硬件的界限。你将看到抽象的指令（如 <code>addq</code>）是如何通过导线、逻辑门和时钟信号变成物理上的电信号操作的。这是理解<strong>计算机是如何真正“跑”起来</strong>的关键一步，也是后续学习流水线设计的基础。</p>          </div><h2 id="1-逻辑设计基础-Logic-Design-Basics">1. 逻辑设计基础 (Logic Design Basics)</h2><h3 id="1-1-硬件基本需求">1.1 硬件基本需求</h3><ul><li><strong>通信 (Communication)</strong>: 将值从一个地方传输到另一个地方。</li><li><strong>计算 (Computation)</strong>: 对值进行处理。</li><li><strong>存储 (Storage)</strong>: 保存这些值。</li></ul><h3 id="1-2-电路分类">1.2 电路分类</h3><ul><li><strong>组合电路 (Combinational Logic)</strong>:<ul><li>不存储任何信息。</li><li>输出仅取决于当前的输入（经过一定的延迟）。</li><li><strong>无环网络 (Acyclic Network)</strong>: 网络中不能有回路。</li><li>例子: ALU (算术逻辑单元)、MUX (多路复用器)。</li></ul></li><li><strong>时序电路 (Sequential Circuits)</strong>:<ul><li>存储状态位。</li><li><strong>寄存器 (Registers)</strong>: 存储单个字，仅在时钟上升沿加载。</li><li><strong>随机访问存储器 (Random-Access Memories)</strong>: 存储多个字 (如寄存器文件、指令内存、数据内存)。</li></ul></li></ul><h3 id="1-3-硬件控制语言-HCL-Hardware-Control-Language">1.3 硬件控制语言 (HCL - Hardware Control Language)</h3><p>HCL 是一种简单的语言，用于描述处理器的控制逻辑。</p><ul><li><strong>数据类型</strong>: <code>bool</code> (布尔值), <code>int</code> (字)。<br>* <strong>操作</strong>: <br>* 布尔运算: <code>&amp;&amp;</code> (AND), <code>||</code> (OR), <code>!</code> (NOT)。 <br>* 字比较: <code> ==</code>, <code>!=</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>。<br> * <strong>集合成员 (Set Membership)</strong>: <code>A in &#123; B, C, D &#125;</code>。 <br>* <strong>多路复用 (MUX) 描述</strong>: 使用 Case 表达式。  <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">[ test1 : val1; test2 : val2; <span class="hljs-number">1</span> : default_val; ] <span class="hljs-comment">// 按顺序评估，返回第一个成功测试对应的值 </span><br></code></pre></td></tr></table></figure></li></ul><hr><h2 id="2-SEQ-处理器概述-SEQ-Processor-Overview">2. SEQ 处理器概述 (SEQ Processor Overview)</h2><p><strong>SEQ (Sequential)</strong> 处理器的核心设计思想是：<strong>在一个时钟周期内，顺序地完成一条指令的所有执行步骤</strong>。</p><h3 id="2-1-设计策略：复用-Reuse">2.1 设计策略：复用 (Reuse)</h3><ul><li>将每条不同指令所需的计算步骤映射到一个统一的<strong>通用框架</strong>中。</li><li>共享硬件单元（如 ALU、内存），通过控制逻辑来决定每条指令具体使用哪些功能。</li></ul><h3 id="2-2-六大阶段-The-6-Stages">2.2 六大阶段 (The 6 Stages)</h3><p>所有 Y86-64 指令的执行都被组织成以下 6 个阶段：</p><ol><li><strong>取指 (Fetch)</strong>: 从指令内存读取指令字节，计算下一条指令地址 (<code>valP</code>)。</li><li><strong>译码 (Decode)</strong>: 从寄存器文件读取操作数 (<code>valA</code>, <code>valB</code>)。</li><li><strong>执行 (Execute)</strong>: ALU 执行计算 (<code>valE</code>)，设置条件码 (CC)。</li><li><strong>访存 (Memory)</strong>: 读写数据内存 (<code>valM</code>)。</li><li><strong>写回 (Write Back)</strong>: 将结果写回寄存器文件。</li><li><strong>更新 PC (PC Update)</strong>: 更新程序计数器，指向下一条指令。</li></ol><h2 id="3-SEQ-硬件实现详解-Hardware-Implementation">3. SEQ 硬件实现详解 (Hardware Implementation)</h2><p>在 SEQ 处理器的硬件设计图中，不同的连线样式代表了不同宽度的数据流：</p><p><strong>1. 粗实线 (Thick Lines)</strong></p><ul><li><strong>含义</strong>: 表示 <strong>64位 (64-bit)</strong> 的字数据 (Word values)。</li><li><strong>用途</strong>: 用于传输主要的程序数据和地址。</li><li><strong>示例</strong>:<ul><li>程序计数器的值 (<code>PC</code>)</li><li>寄存器中的数据 (<code>valA</code>, <code>valB</code>)</li><li>ALU 计算结果 (<code>valE</code>)</li><li>从内存读取的数据 (<code>valM</code>)</li><li>内存地址</li></ul></li></ul><p><strong>2. 细实线 (Thin Lines)</strong></p><ul><li><strong>含义</strong>: 表示 <strong>4-8位 (4-8 bit)</strong> 的较小数值。</li><li><strong>用途</strong>: 通常用于传输索引、ID 或指令的组成部分。</li><li><strong>示例</strong>:<ul><li>寄存器 ID (Register IDs): 如 <code>srcA</code>, <code>srcB</code>, <code>dstE</code>, <code>dstM</code> (4-bit)。</li><li>指令代码 (<code>icode</code>) 和功能代码 (<code>ifun</code>) (4-bit)。</li><li>指令中的寄存器指示字节 (<code>rA</code>, <code>rB</code>)。</li></ul></li></ul><p><strong>3. 虚线 (Dotted Lines)</strong></p><ul><li><strong>含义</strong>: 表示 <strong>1位 (1-bit)</strong> 的数值。</li><li><strong>用途</strong>: 用于传输布尔值 (Boolean) 或控制信号 (Control Signals)。</li><li><strong>示例</strong>:<ul><li>条件标志 (<code>Cnd</code>): 决定跳转是否发生。</li><li>指令有效性信号 (<code>instr_valid</code>)。</li><li>内存错误信号 (<code>imem_error</code>, <code>dmem_error</code>)。</li><li>时钟信号 (<code>Clock</code>)。</li></ul></li></ul><div class="note note-info 硬件图例解码 (Reading the Diagram)">            <p>课件中硬件架构图的视觉语言非常关键，它是看懂数据通路的基础：</p><p><strong>1. 硬件单元 (方框颜色)</strong></p><ul><li><strong>蓝色方框</strong>: 预先设计好的<strong>硬件黑盒</strong>（如内存、ALU、寄存器文件）。我们只管使用它们的功能，不关心内部如何实现。</li><li><strong>灰色方框</strong>: <strong>控制逻辑 (Control Logic)</strong>。这是本章的核心，通常用 <strong>HCL</strong> 语言描述。它们像开关一样，决定了数据在电线中如何流动。</li><li><strong>白色椭圆</strong>: 信号标签，用于标注线路上流动的是什么值。</li></ul><p><strong>2. 数据流连线 (线条样式)</strong></p><ul><li><strong>粗实线</strong>: 传输 <strong>64位</strong> 字数据 (Word)，例如寄存器里的值 (<code>%rax</code>)、内存读出的数据 (<code>valM</code>)。</li><li><strong>细实线</strong>: 传输 <strong>4-8位</strong> 数据，例如寄存器 ID (<code>srcA</code>, <code>rA</code>)、指令功能码 (<code>ifun</code>)。</li><li><strong>虚线</strong>: 传输 <strong>1位</strong> 布尔信号 (Bit)，例如条件码跳转信号 (<code>Cnd</code>)、时钟信号、或者控制逻辑的输出（如 <code>mem_read</code>）。</li></ul>          </div><div class="note note-info SEQ 数据通路核心信号 (Key Signals)">            <p><strong>1. 取指阶段 (Fetch) 产生的信号</strong></p><ul><li><strong><code>valP</code> (Next PC)</strong>:<ul><li><strong>含义</strong>: 下一条指令的地址 (<code>PC</code> + 当前指令长度)。</li><li><strong>作用</strong>: 用于顺序更新 PC，或作为 <code>call</code> 指令压栈的<strong>返回地址</strong>。</li></ul></li><li><strong><code>valC</code> (Constant)</strong>:<ul><li><strong>含义</strong>: 指令中嵌入的 <strong>8 字节常数</strong>。</li><li><strong>作用</strong>: 用作立即数 (<code>irmovq</code>)、内存地址偏移量 (<code>rmmovq</code>) 或跳转目标地址。</li></ul></li></ul><p><strong>2. 译码阶段 (Decode) 读出的信号</strong></p><ul><li><strong><code>valA</code></strong>:<ul><li><strong>含义</strong>: 寄存器 A 的值。通常读取 <code>rA</code>，但在 <code>popq</code>/<code>ret</code> 中读取 <strong><code>%rsp</code></strong>。</li></ul></li><li><strong><code>valB</code></strong>:<ul><li><strong>含义</strong>: 寄存器 B 的值。通常读取 <code>rB</code>，但在栈操作 (<code>push</code>/<code>pop</code>/<code>call</code>/<code>ret</code>) 中读取 <strong><code>%rsp</code></strong>。</li></ul></li></ul><p><strong>3. 计算与访存阶段 (Execute &amp; Memory) 产生的信号</strong></p><ul><li><strong><code>valE</code> (ALU Result)</strong>:<ul><li><strong>含义</strong>: <strong>ALU 计算结果</strong>。</li><li><strong>作用</strong>: 可能是算术运算结果、计算出的<strong>有效内存地址</strong>、或增减后的<strong>新栈指针</strong>。</li></ul></li><li><strong><code>valM</code> (Memory Value)</strong>:<ul><li><strong>含义</strong>: <strong>从数据内存读出的值</strong>。</li><li><strong>作用</strong>: 用于 <code>mrmovq</code> 写回寄存器，或 <code>pop</code>/<code>ret</code> 恢复数据。</li></ul></li></ul>          </div><h3 id="3-1-取指阶段-Fetch-Stage">3.1 取指阶段 (Fetch Stage)</h3><p><strong>阶段目标</strong>：从内存中读出当前指令，弄清楚它是谁，有多长，下一条指令在哪里 (<code>valP</code>)。</p><ul><li><strong>硬件单元</strong>:<ul><li><strong>PC</strong>: 提供当前地址。</li><li><strong>指令内存 (Instruction Memory)</strong>: 一次性读出 10 个字节（最长指令长度）。</li><li><strong>Split (分割单元)</strong>: 把第 1 个字节切成 <code>icode</code> (指令代码) 和 <code>ifun</code> (功能代码) 。</li><li><strong>Align (对齐单元)</strong>: 把剩下的字节整理好，提取出寄存器指示符 <code>rA</code>, <code>rB</code> 和常数 <code>valC</code> 。</li></ul></li><li><strong>控制逻辑 (HCL)</strong>:<ul><li><strong>Instr Valid</strong>: 检查 <code>icode</code> 是否合法。</li><li><strong>Need regids</strong>: 判断指令是否包含寄存器字节 (如 <code>IRRMOVQ</code>, <code>IOPQ</code> 等)。</li><li><strong>Need valC</strong>: 判断指令是否包含常数 (如 <code>IIRMOVQ</code>, <code>IRMMOVQ</code>)。</li><li><strong>PC Increment</strong>: 计算 <code>valP = PC + 1 + r + 8i</code> (其中 r 为寄存器字节长, i 为常数字节长)。<code>i</code>和 <code>r</code>都是<code>bool</code>量</li></ul></li></ul><div class="note note-primary **典型指令行为**">            <p><strong>核心逻辑</strong>：读指令，定长度，算下个 PC (<code>valP</code>)。</p><ul><li><strong><code>OPq rA, rB</code> (整数运算)</strong>:<ul><li><code>icode:ifun</code> ← <code>M1[PC]</code></li><li><code>rA:rB</code> ← <code>M1[PC+1]</code></li><li><code>valP</code> ← <code>PC + 2</code></li></ul></li><li><strong><code>irmovq V, rB</code> (立即数传送)</strong>:<ul><li>读出 <code>rA:rB</code> 和 <code>valC</code> (8字节常数)。</li><li><code>valP</code> ← <code>PC + 10</code> (1 + 1 + 8)。</li></ul></li><li><strong><code>popq rA</code> (出栈)</strong>:<ul><li><code>icode:ifun</code> ← <code>M1[PC]</code></li><li><code>rA:rB</code> ← <code>M1[PC+1]</code></li><li><code>valP</code> ← <code>PC + 2</code></li></ul></li></ul>          </div><h3 id="3-2-译码阶段-Decode-Stage">3.2 译码阶段 (Decode Stage)</h3><p><strong>阶段目标</strong>：从寄存器文件 (Register File) 中读取所需的操作数 (<code>valA</code>, <code>valB</code>)。</p><ul><li><strong>硬件动作</strong>：<ul><li>寄存器文件有两个读端口 (A 和 B)，可以同时读出两个值 。</li></ul></li><li><strong>HCL 控制逻辑 (重点)</strong>：<ul><li><strong><code>srcA</code> (读端口 A 地址)</strong>：通常读指令里的 <code>rA</code>。<strong>特例</strong>：如果是 <code>popq</code> 或 <code>ret</code> 指令，它们需要弹栈，所以必须读栈指针 <code>%rsp</code> 。</li><li><strong><code>srcB</code> (读端口 B 地址)</strong>：通常读 <code>rB</code>。<strong>特例</strong>：<code>pushq</code>, <code>popq</code>, <code>call</code>, <code>ret</code> 都要操作栈，所以要读 <code>%rsp</code> 。</li></ul></li></ul><div class="note note-primary **典型指令行为追踪**">            <p><strong>核心逻辑</strong>：确定读端口 <code>srcA</code> 和 <code>srcB</code> 的地址，读出 <code>valA</code> 和 <code>valB</code>。</p><ul><li><strong><code>OPq rA, rB</code></strong>:<ul><li><code>srcA</code> = <code>rA</code> (读操作数A) → 得到 <code>valA</code></li><li><code>srcB</code> = <code>rB</code> (读操作数B) → 得到 <code>valB</code></li></ul></li><li><strong><code>pushq rA</code></strong>:<ul><li><code>srcA</code> = <code>rA</code> (读要压栈的值) → 得到 <code>valA</code></li><li><code>srcB</code> = <code>%rsp</code> (读栈指针) → 得到 <code>valB</code></li></ul></li><li><strong><code>popq rA</code> (重点考点)</strong>:<ul><li><code>srcA</code> = <code>%rsp</code> (读栈指针，用于后续<strong>内存读取地址</strong>) → 得到 <code>valA</code></li><li><code>srcB</code> = <code>%rsp</code> (读栈指针，用于后续<strong>ALU加法</strong>) → 得到 <code>valB</code></li><li><em>注：这里同时从两个端口读取 <code>%rsp</code> 的旧值。</em></li></ul></li></ul>          </div><h3 id="3-3-执行阶段-Execute-Stage">3.3 执行阶段 (Execute Stage)</h3><p><strong>阶段目标</strong>：让 ALU (算术逻辑单元) 进行计算，得到结果 <code>valE</code>。</p><ul><li><strong>硬件单元</strong>:<ul><li><strong>ALU</strong>: 执行算术/逻辑运算，生成 <code>valE</code>。</li><li><strong>CC</strong>: 条件码寄存器 (ZF, SF, OF)。</li><li><strong>cond</strong>: 根据 CC 和 <code>ifun</code> 计算条件标志 <code>Cnd</code> (用于跳转或条件传送)。</li></ul></li><li><strong>控制逻辑 (HCL)</strong>:<ul><li><strong>aluA</strong>: 选择 ALU 输入 A。<ul><li><code>valA</code>: 用于算术运算。</li><li><code>valC</code>: 用于地址计算 (如 <code>rmmovq</code>, <code>mrmovq</code>)。</li><li><code>-8</code> / <code>+8</code>: 用于栈指针调整 (<code>call</code>, <code>push</code>, <code>ret</code>, <code>pop</code>)。</li></ul></li></ul><ul><li><strong><code>aluB</code> (输入 B)</strong>：通常选 <code>valB</code>。</li></ul><ul><li><strong>alufun</strong>: 选择 ALU 功能 (加、减、与、异或)。</li><li><strong>Set CC</strong>: 决定这次计算要不要更新条件码（只有算术指令更新，跳转指令不更新）</li></ul></li></ul><div class="note note-primary **典型指令行为追踪**">            <p><strong>核心逻辑</strong>：ALU 计算 <code>valE</code>，可能更新 CC。</p><ul><li><strong><code>OPq rA, rB</code></strong>:<ul><li><code>valE</code> ← <code>valB</code> OP <code>valA</code></li><li><strong>更新 CC</strong> (ZF, SF, OF)</li></ul></li><li><strong><code>rmmovq rA, D(rB)</code> (写内存)</strong>:<ul><li><code>valE</code> ← <code>valB</code> + <code>valC</code> (计算有效地址：基址+偏移)</li><li><strong>不更新 CC</strong></li></ul></li><li><strong><code>popq rA</code></strong>:<ul><li><code>valE</code> ← <code>valB</code> + 8 (栈指针 +8)</li></ul></li><li><strong><code>call Dest</code></strong>:<ul><li><code>valE</code> ← <code>valB</code> - 8 (栈指针 -8)</li></ul></li></ul>          </div><h3 id="3-4-访存阶段-Memory-Stage">3.4 访存阶段 (Memory Stage)</h3><p><strong>阶段目标</strong>：如果指令需要，就去读写数据内存（注意不是指令内存）。</p><ul><li><strong>硬件单元</strong>: <strong>数据内存 (Data Memory)</strong>，读出一个字 (<code>valM</code>) 或写入一个字。</li><li><strong>控制逻辑 (HCL)</strong>:<ul><li><strong>Mem. addr</strong>: 选择内存地址。通常是 <code>valE</code> (计算出的有效地址) 或 <code>valA</code> (如 <code>popq</code>/<code>ret</code> 的栈顶地址)。</li><li><strong>Mem. read/write</strong>: 控制读写信号。</li><li><strong>Stat</strong>: 生成指令状态 (AOK, HLT, ADR, INS)。</li></ul></li></ul><div class="note note-info">            <p>处理器不仅计算数据，还要时刻监控自身的健康状态。<code>Stat</code> 寄存器由 HCL 逻辑直接生成，用于告诉操作系统当前发生了什么：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">int</span> Stat = [<br>    imem_error || dmem_error : SADR;  <span class="hljs-comment">// 内存地址异常 (如访问越界)</span><br>    !instr_valid             : SINS;  <span class="hljs-comment">// 非法指令异常 (遇到不能识别的编码)</span><br>    icode == IHALT           : SHLT;  <span class="hljs-comment">// 遇到 halt 指令，正常停机</span><br>    <span class="hljs-number">1</span>                        : SAOK;  <span class="hljs-comment">// 一切正常 (Default)</span><br>];<br></code></pre></td></tr></table></figure>          </div><p><code>call</code>指令将返回地址压栈，<code>valP</code>的值是之前计算的下一条指令的地址<code>PC + 1 + r + 8i</code>，<code>valE</code>是<code>%rsp - 8</code>，新的栈顶地址。</p><div class="note note-primary **典型指令行为追踪**">            <p><strong>核心逻辑</strong>：读 (<code>valM</code>) 或 写 内存。</p><ul><li><strong><code>rmmovq rA, D(rB)</code></strong>:<ul><li>写内存：<code>M[valE]</code> ← <code>valA</code> (将寄存器值写入地址)。</li></ul></li><li><strong><code>mrmovq D(rB), rA</code></strong>:<ul><li>读内存：<code>valM</code> ← <code>M[valE]</code> (从地址读出数据)。</li></ul></li><li><strong><code>popq rA</code></strong>:<ul><li>读内存：<code>valM</code> ← <code>M[valA]</code> (注意：使用<strong>旧栈指针</strong> <code>valA</code> 读栈顶数据)。</li></ul></li><li><strong><code>call Dest</code></strong>:<ul><li>写内存：<code>M[valE]</code> ← <code>valP</code> (将<strong>返回地址</strong> <code>valP</code> 压入<strong>新栈顶</strong> <code>valE</code>)。</li></ul></li></ul>          </div><h3 id="3-5-写回阶段-Write-Back">3.5 写回阶段 (Write Back)</h3><p><strong>阶段目标</strong>：把计算结果 (<code>valE</code>) 或内存读出的结果 (<code>valM</code>) 写回到寄存器文件。</p><ul><li><strong>写端口 (Write Ports)</strong>: E 和 M，地址为 <code>dstE</code>（<strong>ALU 计算结果</strong> (<code>valE</code>) 的目标寄存器 ID）, <code>dstM</code>（<strong>内存读取结果</strong> (<code>valM</code>) 的目标寄存器 ID）。</li><li><strong>控制逻辑 (HCL)</strong>:<ul><li><strong><code>dstE</code></strong>: 决定写端口 E 的目标寄存器 (通常写入 ALU 的计算结果)，通常写回 <code>rB</code>。<ul><li>条件传送 (<code>cmovXX</code>)：如果条件不满足 (<code>!Cnd</code>)，则设为 <code>RNONE</code> (不写入)。</li><li><code>pushq</code>, <code>popq</code>, <code>call</code>, <code>ret</code>：更新 <code>%rsp</code>。</li></ul></li></ul><ul><li><strong><code>dstM</code> (写端口 M 地址)</strong>：通常写回 <code>rA</code> (比如 <code>popq rA</code> 读出的值要给 <code>rA</code>) 。</li></ul></li></ul><div class="note note-info">            <p>这是 SEQ 处理器设计中的一个关键点，主要是为了支持 <strong><code>popq</code> (出栈)</strong> 这种复杂指令：</p><ul><li><strong><code>popq rA</code> 指令</strong>在一个周期内需要同时修改两个寄存器：</li></ul><ol><li><strong>栈指针 <code>%rsp</code></strong> 需要更新（加 8）：这个值由 ALU 计算得出 (<code>valE</code>)，写入 <strong><code>dstE</code></strong> (<code>%rsp</code>) 。</li><li><strong>目标寄存器 <code>rA</code></strong> 需要存入弹出的数据：这个值由内存读出 (<code>valM</code>)，写入 <strong><code>dstM</code></strong> (<code>rA</code>) 。</li></ol><p>如果没有两个写端口，<code>popq</code> 指令就无法在一个时钟周期内完成。</p>          </div><div class="note note-primary **典型指令行为追踪**">            <p><strong>核心逻辑</strong>：设置端口 <code>dstE</code> (ALU结果) 和 <code>dstM</code> (内存结果) 的写入目标寄存器。</p><ul><li><strong><code>OPq rA, rB</code></strong>:<ul><li><code>dstE</code> = <code>rB</code> (写回计算结果)。</li></ul></li><li><strong><code>popq rA</code> (双写操作)</strong>:<ul><li><code>dstE</code> = <code>%rsp</code> (更新栈指针)。</li><li><code>dstM</code> = <code>rA</code> (写入弹出的数据)。</li></ul></li><li><strong><code>call Dest</code> / <code>ret</code> / <code>pushq</code></strong>:<ul><li><code>dstE</code> = <code>%rsp</code> (更新栈指针)。</li></ul></li><li><strong><code>cmovXX</code> (条件传送)</strong>:<ul><li>如果条件 <code>Cnd</code> 成立：<code>dstE</code> = <code>rB</code>。</li><li>如果不成立：<code>dstE</code> = <code>RNONE</code> (什么都不写)。</li></ul></li></ul>          </div><h3 id="3-6-更新-PC-阶段-PC-Update-Stage">3.6 更新 PC 阶段 (PC Update Stage)</h3><ul><li><strong>控制逻辑 (HCL)</strong> (<code>new_pc</code>):<ul><li><code>call</code>: 设置为目标地址 <code>valC</code>。</li><li><code>jXX</code> (条件跳转): 如果跳转 (<code>Cnd</code> 为真) 设为 <code>valC</code>，否则设为 <code>valP</code>。</li><li><code>ret</code>: 设置为返回地址 <code>valM</code>。</li><li>其他: 默认设为 <code>valP</code> (下一条指令)。</li></ul></li></ul><div class="note note-primary **典型指令行为追踪**">            <p><strong>核心逻辑</strong>：决定下一条指令地址 <code>PC</code>。</p><ul><li><strong>顺序执行 (<code>OPq</code>, <code>push</code>, <code>pop</code> 等)</strong>:<ul><li><code>PC</code> ← <code>valP</code></li></ul></li><li><strong><code>call Dest</code></strong>:<ul><li><code>PC</code> ← <code>valC</code> (跳转到目标函数地址)。</li></ul></li><li><strong><code>ret</code></strong>:<ul><li><code>PC</code> ← <code>valM</code> (跳转到从栈里弹出的返回地址)。</li></ul></li><li><strong><code>jxx Dest</code> (条件跳转)</strong>:<ul><li><code>PC</code> ← <code>Cnd ? valC : valP</code> (条件成立跳 <code>valC</code>，否则继续 <code>valP</code>)。</li></ul></li></ul>          </div><div class="note note-info SEQ 控制信号总览 (Control Signals Overview)">            <p>处理器“思考”的过程，本质上就是生成这些控制信号的过程。</p><table><thead><tr><th style="text-align:left">阶段</th><th style="text-align:left">信号名</th><th style="text-align:left">逻辑描述 (HCL 核心思想)</th><th style="text-align:left">关键特例 / 考点</th></tr></thead><tbody><tr><td style="text-align:left"><strong>取指</strong></td><td style="text-align:left"><code>need_regids</code></td><td style="text-align:left">指令包含寄存器字节吗？</td><td style="text-align:left"><code>addq</code>, <code>pushq</code> 需要; <code>jmp</code>, <code>call</code> 不需要。</td></tr><tr><td style="text-align:left"><strong>取指</strong></td><td style="text-align:left"><code>need_valC</code></td><td style="text-align:left">指令包含常数(立即数/地址)吗？</td><td style="text-align:left"><code>irmovq</code>, <code>rmmovq</code> 需要; <code>addq</code> 不需要。</td></tr><tr><td style="text-align:left"><strong>译码</strong></td><td style="text-align:left"><code>srcA</code></td><td style="text-align:left">端口 A 读哪个寄存器？</td><td style="text-align:left">通常读 <code>rA</code>; <strong><code>popq</code>, <code>ret</code> 必须读 <code>%rsp</code></strong>。</td></tr><tr><td style="text-align:left"><strong>译码</strong></td><td style="text-align:left"><code>srcB</code></td><td style="text-align:left">端口 B 读哪个寄存器？</td><td style="text-align:left">通常读 <code>rB</code>; <code>pushq</code>, <code>popq</code>, <code>call</code>, <code>ret</code> 读 <code>%rsp</code>。</td></tr><tr><td style="text-align:left"><strong>执行</strong></td><td style="text-align:left"><code>aluA</code></td><td style="text-align:left">ALU 输入 A 选谁？</td><td style="text-align:left">通常是 <code>valA</code>; 内存指令选 <code>valC</code>; 栈指令选 <code>8</code> 或 <code>-8</code>。</td></tr><tr><td style="text-align:left"><strong>执行</strong></td><td style="text-align:left"><code>aluB</code></td><td style="text-align:left">ALU 输入 B 选谁？</td><td style="text-align:left">通常是 <code>valB</code>; <code>rmmovq</code> 等地址计算选 <code>valB</code>。</td></tr><tr><td style="text-align:left"><strong>访存</strong></td><td style="text-align:left"><code>mem_read</code></td><td style="text-align:left">是否读内存？</td><td style="text-align:left"><code>mrmovq</code>, <code>popq</code>, <code>ret</code> 为真。</td></tr><tr><td style="text-align:left"><strong>访存</strong></td><td style="text-align:left"><code>mem_write</code></td><td style="text-align:left">是否写内存？</td><td style="text-align:left"><code>rmmovq</code>, <code>pushq</code>, <code>call</code> 为真。</td></tr><tr><td style="text-align:left"><strong>更新</strong></td><td style="text-align:left"><code>new_pc</code></td><td style="text-align:left">下一条指令地址在哪？</td><td style="text-align:left"><code>call</code> 去 <code>valC</code>; <code>ret</code> 去 <code>valM</code>; 否则默认 <code>valP</code>。</td></tr></tbody></table>          </div><h2 id="4-SEQ-时序与评价-Timing-Evaluation">4. SEQ 时序与评价 (Timing &amp; Evaluation)</h2><h3 id="4-1-SEQ-工作流程详解-Timing-Workflow">4.1 SEQ 工作流程详解 (Timing &amp; Workflow)</h3><p>SEQ 处理器采用<strong>单周期设计</strong>，即在一个时钟周期内完整执行一条指令的全部 6 个阶段。</p><h4 id="1-时钟上升沿-The-Rising-Edge-状态更新的瞬间">1. 时钟上升沿 (The Rising Edge): 状态更新的瞬间</h4><ul><li><strong>动作</strong>: 时钟信号从低变高。这是周期的开始，也是上一条指令的结束。</li><li><strong>对象</strong>: 所有的<strong>状态元件</strong> (State Elements) 在这一瞬间同时打开“大门”，锁存输入线上的新值。<ul><li><strong>PC</strong>: 更新为 <code>newPC</code> (指向当前指令)。</li><li><strong>寄存器文件</strong>: 写入上一条指令计算出的 <code>valE</code> 或 <code>valM</code> (如果需要写)。</li><li><strong>CC</strong>: 更新条件码。</li><li><strong>数据内存</strong>: 写入数据 (如果是 <code>rmmovq</code> 或 <code>pushq</code> 等写指令)。</li></ul></li><li><strong>物理意义</strong>: 计算机的“状态”在这一刻发生改变。</li></ul><h4 id="2-高-低电平期间-The-Interval-信号的漫长传播">2. 高&amp;低电平期间 (The Interval): 信号的漫长传播</h4><ul><li><strong>动作</strong>: 信号通过<strong>组合逻辑</strong> (Combinational Logic) 进行传播和计算。</li><li><strong>流程</strong>:<ul><li><strong>无阻碍流动</strong>: 信号从刚刚更新的 PC/寄存器出发，像多米诺骨牌一样依次流过：<code>指令内存</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>译码逻辑</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>ALU</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>数据内存</code>。</li><li><strong>产生中间信号</strong>: 在这个过程中，<code>valP</code>, <code>valA</code>, <code>valB</code>, <code>valE</code>, <code>valM</code> 等信号依次生成。</li><li><strong>信号驻留</strong>: 计算完成后（例如 ALU 2ns 就算完了，周期有 10ns），<code>valE</code> 等信号会<strong>稳定地维持在导线上</strong>，作为电压（电平）“顶”在寄存器或内存的输入端门口，等待下一次开门。</li></ul></li><li><strong>关键</strong>: 此时状态元件（寄存器/PC）的值<strong>不会改变</strong>，它们只负责稳定输出旧值，驱动组合逻辑工作。</li></ul><h4 id="3-下一个时钟上升沿-Next-Rising-Edge-锁存结果">3. 下一个时钟上升沿 (Next Rising Edge): 锁存结果</h4><ul><li><strong>动作</strong>: 当前周期结束，下一个周期开始。</li><li><strong>结果</strong>: 刚才在导线上排队等候的稳定信号 (<code>valE</code>, <code>valM</code>, <code>newPC</code>) 被瞬间写入状态元件。</li></ul><h3 id="4-2-局限性-Limitations">4.2 局限性 (Limitations)</h3><ul><li><strong>速度太慢 (Too slow)</strong>: 时钟周期必须足够长，以容纳<strong>最慢</strong>的那条指令在所有阶段的信号传播延迟 (例如 <code>ret</code> 或 <code>mrmovq</code> 需要经过所有阶段)。</li><li><strong>硬件利用率低</strong>: 在周期的某一时刻，只有一小部分硬件在有效工作。</li></ul><div class="note note-danger SEQ 的致命弱点：为什么我们需要流水线？">            <p><strong>1. 单周期时序的束缚 (Single-Cycle Timing)</strong></p><ul><li>SEQ 处理器必须在<strong>一个时钟周期</strong>内完成一条指令的所有 6 个阶段。</li><li>运作流程：<code>时钟上升沿(更新状态)</code> -&gt; <code>组合逻辑漫长的传播(取指...更新PC)</code> -&gt; <code>下个上升沿(锁存结果)</code>。</li><li>这意味着时钟频率不能太高，必须等待电信号跑完全程。</li></ul><p><strong>2. 性能瓶颈 (The Performance Bottleneck)</strong></p><ul><li><strong>木桶效应</strong>：时钟周期的时间长度，取决于<strong>最慢</strong>的那条指令（通常是 <code>mrmovq</code> 或 <code>ret</code>，因为它们既要运算又要访存）。这导致简单的指令（如 <code>addq</code>）也被迫等待这么久。</li><li><strong>硬件浪费</strong>：在周期的任意时刻，只有一小部分硬件在工作。例如在取指阶段，昂贵的 ALU 和数据内存是闲置的。</li></ul><p><strong>结论</strong>：SEQ 虽然逻辑清晰、设计简单，但<strong>吞吐量 (Throughput)</strong> 太低。为了让硬件并行工作，我们需要引入 <strong>流水线 (Pipelining)</strong> 技术。</p>          </div>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/06-SEQ/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/06-SEQ/"/>
    <published>2026-01-14T18:15:00.000Z</published>
    <summary>计算机体系结构笔记：SEQ 顺序实现 (Sequential Implementation)</summary>
    <title>CSAPP - 06. SEQ</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>计算机体系结构：逻辑设计 (Computer Architecture: Logic Design)</h1><div class="note note-success 核心导读：从 0/1 到 处理器 (From Logic Gates to CPU)">            <p><strong>主要内容 (Overview)</strong>：<br>本章深入计算机的<strong>微架构 (Microarchitecture)</strong> 层面，讲解如何用基础的电子元件搭建出计算核心：</p><ol><li><strong>数字电路基础</strong>：<ul><li><strong>组合逻辑 (Combinational Logic)</strong>：如 ALU 和 MUX，负责“计算”，输出只取决于当前输入，没有记忆。</li><li><strong>时序逻辑 (Sequential Logic)</strong>：如寄存器和 RAM，负责“存储”，由<strong>时钟 (Clock)</strong> 控制状态更新。</li></ul></li><li><strong>HCL (Hardware Control Language)</strong>：学习一种类 C 的简单语言，用来描述硬件的控制逻辑（例如：ALU 该做加法还是减法？）。</li></ol><p><strong>Motivation</strong>：</p><ul><li><strong>打破黑盒</strong>：之前我们把 CPU 当作一个能执行指令的黑盒子。这一章打开了这个盒子，看到 <code>addq</code> 指令在物理上是如何通过导线、晶体管和电压变化来实现的。</li><li><strong>理解时序</strong>：理解<strong>时钟周期</strong>和<strong>边沿触发</strong>是理解计算机性能（频率）、流水线设计以及并发问题的物理基础。这是连接软件逻辑与物理硬件的关键桥梁。</li><li></li></ul>          </div><h2 id="1-逻辑设计基础-Logic-Design-Fundamentals">1. 逻辑设计基础 (Logic Design Fundamentals)</h2><h3 id="硬件的基本需求">硬件的基本需求</h3><ol><li><strong>通信 (Communication)</strong>：如何将值从一个地方传到另一个地方。</li><li><strong>计算 (Computation)</strong>：如何对值进行处理。</li><li><strong>存储 (Storage)</strong>：如何保存这些值。</li></ol><h3 id="数字化：比特-Bits">数字化：比特 (Bits)</h3><ul><li>所有事物都用 0 和 1 来表示。</li><li><strong>通信</strong>：导线上的低电压 (0) 或高电压 (1)。</li><li><strong>计算</strong>：计算布尔函数 (Boolean functions)。</li><li><strong>存储</strong>：存储信息位。</li><li><strong>数字信号</strong>：我们使用电压阈值从连续信号中提取离散的 0 和 1。这种方式不易受噪声影响，可以使电路简单、小巧且快速。</li></ul><h2 id="2-组合逻辑-Combinational-Logic">2. 组合逻辑 (Combinational Logic)</h2><p>组合电路从本质上来讲，<strong>不存储任何信息</strong>，它只是简单地响应输入信号，并（经过短暂延迟后）产生等于输入信号某个函数的输出。</p><h3 id="逻辑门-Logic-Gates">逻辑门 (Logic Gates)</h3><ul><li>数字电路的基本计算元素。</li><li><strong>与 (AND)</strong>: <code>out = a &amp;&amp; b</code></li><li><strong>或 (OR)</strong>: <code>out = a || b</code></li><li><strong>非 (NOT)</strong>: <code>out = !a</code></li></ul><h3 id="组合电路-Combinational-Circuits">组合电路 (Combinational Circuits)</h3><ul><li>由逻辑门组成的<strong>无环网络 (Acyclic Network)</strong>。</li><li>网络中不能有回路，否则会导致函数计算有歧义。</li><li>它的输出是其输入的布尔函数。</li></ul><h3 id="HCL-Hardware-Control-Language">HCL (Hardware Control Language)</h3><p>HCL 是一种非常简单的硬件描述语言，语法类似 C 语言，用于描述处理器的控制逻辑。</p><ul><li><strong>数据类型</strong>：<ul><li><code>bool</code>：布尔值 (a, b, c, …)</li><li><code>int</code>：字 (A, B, C, …)</li></ul></li><li><strong>HCL 表达式</strong>：<ul><li><strong>布尔表达式 (Boolean Expressions)</strong>：<ul><li>逻辑操作: <code>a &amp;&amp; b</code>, <code>a || b</code>, <code>!a</code></li><li>字比较: <code>A == B</code>, <code>A != B</code>, <code>A &lt; B</code>, <code>A &lt;= B</code>, <code>A &gt;= B</code>, <code>A &gt; B</code></li><li>集合成员: <code>A in &#123; B, C, D &#125;</code> (等价于 <code>A &lt;mark&gt; B || A &lt;/mark&gt; C || A == D</code>)</li></ul></li><li><strong>字表达式 (Word Expressions)</strong>：<ul><li><strong>案例表达式 (Case expression)</strong>：按顺序评估测试，并为第一个成功的测试返回其对应的值。</li></ul></li></ul></li></ul><h4 id="HCL-组合电路示例：">HCL 组合电路示例：</h4><ol><li><strong>位相等 (Bit Equality)</strong>：<ul><li><code>bool eq = (a &amp;&amp; b) || (!a &amp;&amp; !b);</code></li><li>如果 a 和 b 相等，则产生 1。</li></ul></li><li><strong>字相等 (Word Equality)</strong>：<ul><li><code>bool Eq = (A == B);</code></li><li>这是位相等的 64 位版本。</li></ul></li><li><strong>位多路复用器 (Bit MUX - Multiplexor)</strong>：<ul><li><code>bool out = (s &amp;&amp; a) || (!s &amp;&amp; b);</code></li><li>根据<strong>控制信号 s</strong>，从 <code>a</code> 和 <code>b</code> 两个数据信号中选择一个作为输出。</li><li>如果 <code>s=1</code>，输出 <code>a</code>；如果 <code>s=0</code>，输出 <code>b</code>。</li></ul></li><li><strong>字多路复用器 (Word MUX)</strong>：<ul><li>使用 HCL 的案例表达式来表示。</li></ul></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs Terraform">int Out = [<br>    s : A;  // 如果 s 为 1, 输出 A<br>    1 : B;  // 否则 (s 为 0), 输出 B<br>];<br></code></pre></td></tr></table></figure><ol start="5"><li><strong>4路 MUX (4-Way Multiplexor)</strong>：<ul><li>使用两个控制信号 <code>s1</code> 和 <code>s0</code> 从 4 个输入 (<code>D0</code>, <code>D1</code>, <code>D2</code>, <code>D3</code>) 中选择一个。</li></ul> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs Terraform">int Out4 = [<br>    !s1 &amp;&amp; !s0 : D0; // s1=0, s0=0<br>    !s1        : D1; // s1=0, s0=1<br>    !s0        : D2; // s1=1, s0=0<br>    1          : D3; // s1=1, s0=1<br>];<br></code></pre></td></tr></table></figure></li></ol><h3 id="ALU-Arithmetic-Logic-Unit-算术逻辑单元">ALU (Arithmetic Logic Unit - 算术逻辑单元)</h3><ul><li>这是一个组合逻辑块。</li><li>有一个<strong>控制信号</strong>输入，用于选择它执行哪种计算。</li><li>对应 Y86-64 中的 4 种算术/逻辑操作 (Add, Sub, And, Xor)。</li><li>除了计算结果 (X+Y, X-Y, …)，它还计算<strong>条件码 (Condition Codes)</strong>：<code>OF</code> (溢出), <code>ZF</code> (零), <code>CF</code> (进位)。</li></ul><h2 id="3-时序电路-Sequential-Circuits-存储">3. 时序电路 (Sequential Circuits) - 存储</h2><p>为了创建<strong>状态 (State)</strong>，我们必须引入<strong>存储 (Storage)</strong> 设备。</p><h3 id="存储-1-比特：双稳态元件-Bistable-Element">存储 1 比特：双稳态元件 (Bistable Element)</h3><ul><li>通过将两个<strong>非门 (NOT gate)</strong> 的输出交叉连接到对方的输入，可以构成一个<strong>双稳态元件</strong>。</li><li>这个电路有两个<strong>稳定状态</strong> (Stable 0, Stable 1) 和一个<strong>亚稳态</strong> (Metastable)。</li><li>它可以无限期地保持一个比特（0 或 1）。</li></ul><h3 id="锁存器-Latch">锁存器 (Latch)</h3><ul><li><strong>R-S 锁存器</strong>：基于双稳态元件构建，有两个输入 S (Set, 置位) 和 R (Reset, 复位)。<ul><li>*输入 S (Set - 置位)**: 用于将锁存器的状态设置为 1。</li><li>*输入 R (Reset - 复位)**: 用于将锁存器的状态清零为 0。</li></ul></li></ul><ol><li><strong>存储模式 (Storing Mode) (S=0, R=0)</strong>:<ul><li>当 S 和 R 均为 0 时，锁存器“锁住”当前状态。</li><li>两个门的交叉反馈会无限期地保持当前的值（Q+ 保持为 q, Q- 保持为 !q）。这就是它的记忆功能。</li></ul></li><li><strong>置位模式 (Setting Mode) (S=1, R=0)</strong>:<ul><li>当 S 输入为 1 (R为0) 时，它会强制 <code>Q+</code> 输出变为 1，同时 <code>Q-</code> 输出变为0。</li></ul></li><li><strong>复位模式 (Resetting Mode) (S=0, R=1)</strong>:<ul><li>当 R 输入为 1 (S为0) 时，它会强制 <code>Q+</code> 输出变为 0，同时 <code>Q-</code> 输出变为1。</li></ul></li></ol><ul><li><strong>D 锁存器 (D Latch)</strong>：<ul><li>有两个输入：数据 <code>D</code> (Data) 和时钟 <code>C</code> (Clock)。</li><li>当 <code>C=1</code> 时，锁存器处于 <strong>“锁存模式” (Latching)</strong>：输出 <code>Q+</code> 会跟随输入 <code>D</code> 的变化（此时电路是<strong>透明的</strong>）。</li><li>当 <code>C=0</code> 时，锁存器处于 <strong>“存储模式” (Storing)</strong>：输出 <code>Q+</code> 保持 <code>C</code> 从 1 变为 0 瞬间 <code>D</code> 的值，不再随 <code>D</code>变化。</li></ul></li></ul><h3 id="D-触发器-Edge-Triggered-Latch-Flip-Flop">D 触发器 (Edge-Triggered Latch / Flip-Flop)</h3><ul><li>D 锁存器的问题在于它在 <code>C=1</code> 的整个期间都是透明的。</li><li><strong>边沿触发</strong>的设计只在时钟信号的<strong>上升沿 (Rising edge)</strong> 这个极短的瞬间才进入锁存模式。</li><li>在时钟的所有其他时间，它都处于存储模式，输出保持稳定。</li><li><strong>这是构建处理器存储（如寄存器）的基础。</strong></li></ul><h3 id="硬件寄存器-Registers">硬件寄存器 (Registers)</h3><ul><li>一个<strong>硬件寄存器</strong>是多个<strong>边沿触发锁存器</strong>的集合，用于存储一个完整的<strong>字 (Word)</strong>（例如，一个 64 位的寄存器由 64 个 D 触发器并排组成，共享同一个时钟信号）。</li><li>在时钟<strong>上升沿</strong>时，它加载输入值 <code>I</code>，并将其作为输出值 <code>O</code>。</li><li><strong>寄存器的作用</strong>：作为电路中不同组合逻辑块之间的<strong>屏障 (barrier)</strong>，用来控制数据流，确保在一个时钟周期内，数据能稳定地从一个阶段传播到下一个阶段。</li></ul><h3 id="随机访问存储器-Random-Access-Memory-RAM">随机访问存储器 (Random-Access Memory - RAM)</h3><p>在 SEQ 处理器设计中，<strong>随机访问存储器 (RAM)</strong> 是一个通用的概念，指的是可以根据<strong>地址 (Address)</strong> 读写数据的存储设备。<br>最典型的实现就是 CPU 内部的 <strong>寄存器文件 (Register File)</strong>。它就像一个超高速的小型 RAM。</p><ul><li>用于存储多个字（例如内存或寄存器文件）。</li><li>有一个<strong>地址 (Address)</strong> 输入，用于指定要读取或写入哪个字。</li></ul><h4 id="寄存器文件-Register-File">寄存器文件 (Register File)</h4><ul><li>是一种特殊的 RAM，用于保存程序寄存器（如 <code>%rax</code>, <code>%rsp</code> 等）。</li><li>它使用寄存器 ID (如 <code>%rax</code> 的 <code>0</code>) 作为地址。</li><li><strong>多端口 (Multiple Ports)</strong>：允许在一个时钟周期内同时进行多次读写。Y86-64 需要两个读端口（<code>srcA</code>, <code>srcB</code>）和两个写端口（<code>dstE</code>, <code>dstM</code>，在 SEQ 设计中合并为 <code>dstW</code>）。</li><li><strong>寄存器文件时序 (Timing)</strong>：<ul><li><strong>读操作</strong>：类似于组合逻辑。一旦地址（如 <code>srcA</code>）稳定，数据（<code>valA</code>）就会（经过延迟后）出现在输出端。</li><li><strong>写操作</strong>：是时序逻辑。数据（<code>valW</code>）仅在时钟<strong>上升沿</strong>才会被写入到地址（<code>dstW</code>）指定的寄存器中。</li></ul></li></ul><div class="note note-info">            <p>在计算机体系结构中，“Register” 一词指代两个完全不同的硬件实体，<strong>混淆它们会导致无法理解 CPU 时序</strong>。</p><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">1. 程序寄存器 (Program Registers)</th><th style="text-align:left">2. 硬件寄存器 (Hardware Registers)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>别名</strong></td><td style="text-align:left"><strong>寄存器文件 (Register File)</strong></td><td style="text-align:left"><strong>时序寄存器 / 状态寄存器</strong></td></tr><tr><td style="text-align:left"><strong>具体例子</strong></td><td style="text-align:left"><code>%rax</code>, <code>%rsp</code>, <code>%rbx</code> (共15个)</td><td style="text-align:left"><code>PC</code>, <code>CC</code>, <code>Stat</code>, 流水线寄存器(F/D/E…)</td></tr><tr><td style="text-align:left"><strong>核心本质</strong></td><td style="text-align:left"><strong>ISA 层的“变量”</strong> (数据容器)</td><td style="text-align:left"><strong>微架构层的“门栓”</strong> (时序屏障)</td></tr><tr><td style="text-align:left"><strong>可见性</strong></td><td style="text-align:left"><strong>可见</strong> (程序员用汇编直接读写)</td><td style="text-align:left"><strong>不可见</strong> (硬件自动维护，程序员无法接触)</td></tr><tr><td style="text-align:left"><strong>物理实现</strong></td><td style="text-align:left"><strong>存储阵列 (SRAM)</strong><br>必须通过 <strong>ID (地址)</strong> 灵活寻址访问。</td><td style="text-align:left"><strong>D 触发器组 (D Flip-Flops)</strong><br>物理位置固定“焊死”，<strong>无需寻址</strong>。</td></tr><tr><td style="text-align:left"><strong>电路作用</strong></td><td style="text-align:left">提供运算所需的数据源。</td><td style="text-align:left"><strong>隔离时钟周期</strong>。在时钟上升沿截断信号，防止数据在阶段间乱窜。</td></tr></tbody></table><p><strong>为什么必须区分？</strong></p><ul><li><strong>设计视角</strong>：你在写汇编 <code>addq %rax, %rbx</code> 时，把它们看作变量（瞬间读写）。</li><li><strong>硬件视角</strong>：在电路中，<strong>程序寄存器</strong>负责在周期内<strong>提供</strong>数据，而<strong>硬件寄存器</strong>负责在周期结束时<strong>锁住</strong>结果。如果不区分，就会误以为数据能瞬间更新，从而画错时序图。</li></ul>          </div><hr><h2 id="4-SEQ-顺序-处理器设计">4. SEQ (顺序) 处理器设计</h2><p>我们将设计一个 CPU，这个 CPU 在一个时钟周期内<strong>顺序</strong>地完成执行一条指令的所有步骤。</p><h3 id="SEQ-核心思想：复用-Reuse">SEQ 核心思想：复用 (Reuse)</h3><ul><li>执行一条指令需要很多处理（计算操作、计算地址、更新栈指针、确定下一条指令地址）。</li><li>幸运的是，每条指令的整个流程都比较相似。</li><li><strong>降低复杂度</strong>：让不同的指令共享尽量多的硬件。</li><li><strong>挑战</strong>：将每条不同指令所需要的计算放入到一个<strong>通用框架</strong>中。</li></ul><h3 id="SEQ-硬件结构-Hardware-Structure">SEQ 硬件结构 (Hardware Structure)</h3><ul><li><strong>状态元件 (State)</strong>：<ul><li>PC (Program Counter) 寄存器</li><li>条件码寄存器 (CC)</li><li>寄存器文件 (Register File)</li><li>内存 (Memories)：分为指令内存 (Instruction memory) 和数据内存 (Data memory)。</li></ul></li><li><strong>指令流 (Instruction Flow)</strong>：<ul><li>处理器无限循环，执行这些阶段。</li><li>从 PC 指定的地址读取指令。</li><li>按阶段处理指令。</li><li>更新 PC。</li></ul></li></ul><h3 id="Y86-64-数据信号定义-Key-Data-Signals">Y86-64 数据信号定义 (Key Data Signals)</h3><table><thead><tr><th style="text-align:left">信号 (Symbol)</th><th style="text-align:left">产生阶段 (Stage)</th><th style="text-align:left">来源 (Source)</th><th style="text-align:left">含义与作用 (Description)</th></tr></thead><tbody><tr><td style="text-align:left"><strong><code>valP</code></strong></td><td style="text-align:left"><strong>取指 (Fetch)</strong></td><td style="text-align:left">PC + 指令长度</td><td style="text-align:left"><strong>顺序下一条指令地址</strong> (Fall-through PC)。即便发生跳转，第一步也会先计算出如果“不跳”该去的地址。</td></tr><tr><td style="text-align:left"><strong><code>valC</code></strong></td><td style="text-align:left"><strong>取指 (Fetch)</strong></td><td style="text-align:left">指令代码</td><td style="text-align:left"><strong>立即数 / 常数</strong>。直接编码在指令中的 8 字节常数（如 <code>irmovq</code> 的立即数 V 或 <code>rmmovq</code> 的偏移量 D）。</td></tr><tr><td style="text-align:left"><strong><code>valA</code></strong></td><td style="text-align:left"><strong>译码 (Decode)</strong></td><td style="text-align:left">寄存器文件 (Port A)</td><td style="text-align:left"><strong>寄存器读出值 A</strong>。通常是指令中 <code>rA</code> 对应的寄存器值；在 <code>pop</code>/<code>ret</code> 中对应 <code>%rsp</code>。</td></tr><tr><td style="text-align:left"><strong><code>valB</code></strong></td><td style="text-align:left"><strong>译码 (Decode)</strong></td><td style="text-align:left">寄存器文件 (Port B)</td><td style="text-align:left"><strong>寄存器读出值 B</strong>。通常是指令中 <code>rB</code> 对应的寄存器值；常作为 ALU 运算的被加数或基址。</td></tr><tr><td style="text-align:left"><strong><code>valE</code></strong></td><td style="text-align:left"><strong>执行 (Execute)</strong></td><td style="text-align:left">ALU 输出</td><td style="text-align:left"><strong>执行结果</strong>。是 ALU 计算出的数值结果，或者是计算出的<strong>有效内存地址</strong>。</td></tr><tr><td style="text-align:left"><strong><code>valM</code></strong></td><td style="text-align:left"><strong>访存 (Memory)</strong></td><td style="text-align:left">数据内存</td><td style="text-align:left"><strong>内存读出值</strong>。仅在涉及读内存操作（<code>mrmovq</code>, <code>popq</code>, <code>ret</code>）时有效。</td></tr></tbody></table><h3 id="SEQ-的-6-个阶段-SEQ-Stages">SEQ 的 6 个阶段 (SEQ Stages)</h3><ol><li><strong>取指 (Fetch)</strong><ul><li>从<strong>指令内存 (Instruction memory)</strong> 中读取指令字节。</li><li>PC 作为地址。</li><li>计算 <code>valP</code>（下一条指令的地址）。</li></ul></li><li><strong>译码 (Decode)</strong><ul><li>从<strong>寄存器文件 (Register file)</strong> 中读取操作数。</li><li>例如，读取 <code>rA</code> 和 <code>rB</code> 对应的寄存器值 <code>valA</code> 和 <code>valB</code>。</li></ul></li><li><strong>执行 (Execute)</strong><ul><li><strong>ALU (算术逻辑单元)</strong> 执行指令指定的操作（加、减、计算地址等）。</li><li>得到结果 <code>valE</code>。</li><li>设置或使用<strong>条件码 (CC)</strong>。</li></ul></li><li><strong>访存 (Memory)</strong><ul><li>从<strong>数据内存 (Data memory)</strong> 中读取数据（<code>valM</code>），或向其写入数据。</li></ul></li><li><strong>写回 (Write Back)</strong><ul><li>将结果（来自<strong>执行</strong>阶段的 <code>valE</code> 或来自<strong>访存</strong>阶段的 <code>valM</code>）写回到<strong>寄存器文件 (Register file)</strong>。</li></ul></li><li><strong>PC 更新 (PC Update)</strong><ul><li>更新 PC (程序计数器) 为下一条指令的地址。</li></ul></li></ol><h2 id="5-详解：每条指令的-6-阶段计算">5. 详解：每条指令的 6 阶段计算</h2><p>所有指令都遵循这个通用模式，只是在每一步具体计算的内容不同。</p><h4 id="1-OPq-rA-rB-例如-addq-rax-rbx">1. <code>OPq rA, rB</code> (例如 <code>addq %rax, %rbx</code>)</h4><ul><li><strong>取指 (Fetch)</strong>: 读 2 字节 (<code>icode:ifun</code>, <code>rA:rB</code>)。<code>valP = PC + 2</code>。</li><li><strong>译码 (Decode)</strong>: 读 <code>valA = R[rA]</code>，读 <code>valB = R[rB]</code>。</li><li><strong>执行 (Execute)</strong>: <code>valE = valB OP valA</code> (ALU 执行加/减/与/异或)。设置 CC。</li><li><strong>访存 (Memory)</strong>: (什么也不做)。</li><li><strong>写回 (Write Back)</strong>: 将 <code>valE</code> 写入 <code>R[rB]</code> (<code>dstE = rB</code>)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valP</code>。</li></ul><h4 id="2-rmmovq-rA-D-rB-写内存">2. <code>rmmovq rA, D(rB)</code> (写内存)</h4><ul><li><strong>取指 (Fetch)</strong>: 读 10 字节 (<code>icode:ifun</code>, <code>rA:rB</code>, <code>valC=D</code>)。<code>valP = PC + 10</code>。</li><li><strong>译码 (Decode)</strong>: 读 <code>valA = R[rA]</code>，读 <code>valB = R[rB]</code>。</li><li><strong>执行 (Execute)</strong>: <code>valE = valB + valC</code> (ALU 计算有效地址 D+rB)。</li><li><strong>访存 (Memory)</strong>: 将 <code>valA</code> 写入内存 <code>M[valE]</code>。</li><li><strong>写回 (Write Back)</strong>: (什么也不做)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valP</code>。</li></ul><h4 id="3-popq-rA">3. <code>popq rA</code></h4><ul><li><strong>取指 (Fetch)</strong>: 读 2 字节 (<code>icode:ifun</code>, <code>rA:rB</code>)。<code>valP = PC + 2</code>。</li><li><strong>译码 (Decode)</strong>: 读 <code>%rsp</code> 两次 (得 <code>valA = R[%rsp]</code>, <code>valB = R[%rsp]</code>)。</li><li><strong>执行 (Execute)</strong>: <code>valE = valB + 8</code> (ALU 计算新栈顶地址)。</li><li><strong>访存 (Memory)</strong>: 从 <code>M[valA]</code> (旧栈顶) 读取 <code>valM</code>。</li><li><strong>写回 (Write Back)</strong>: 将 <code>valE</code> 写入 <code>%rsp</code> (更新栈顶)，将 <code>valM</code> 写入 <code>R[rA]</code> (写入弹出的值)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valP</code>。</li></ul><h4 id="4-cmovXX-rA-rB-条件传送">4. <code>cmovXX rA, rB</code> (条件传送)</h4><ul><li><strong>取指 (Fetch)</strong>: 读 2 字节 (<code>icode:ifun</code>, <code>rA:rB</code>)。<code>valP = PC + 2</code>。</li><li><strong>译码 (Decode)</strong>: 读 <code>valA = R[rA]</code>。</li><li><strong>执行 (Execute)</strong>: <code>valE = 0 + valA</code> (ALU 仅仅传递 <code>valA</code>)。</li><li><strong>访存 (Memory)</strong>: 没有操作。</li><li><strong>写回 (Write Back)</strong>: <strong>根据条件码</strong>和 <code>ifun</code> 判断。如果条件不满足，则不写入 (<code>rB</code> 设为 <code>0xF</code> 来禁用)。如果条件满足，<code>R[rB] = valE</code>。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valP</code>。</li></ul><h4 id="5-jXX-Dest-条件跳转">5. <code>jXX Dest</code> (条件跳转)</h4><ul><li><strong>取指 (Fetch)</strong>: 读 9 字节 (<code>icode:ifun</code>, <code>valC=Dest</code>)。<code>valP = PC + 9</code> (valP 是 “fall-thru” 地址)。</li><li><strong>译码 (Decode)</strong>: (什么也不做)。</li><li><strong>执行 (Execute)</strong>: <code>Cnd = Cond(CC, ifun)</code> (ALU 检查条件码，输出 Cnd 标志)。<ul><li>逻辑电路（我们称为 <code>Cond</code> 模块）<strong>输入</strong>：<strong><code>ifun</code></strong>：指令里的功能码，告诉 CPU 是哪种跳转；<strong><code>CC</code></strong>：当前的条件码状态。</li><li>产生一个 1 位的信号 <strong><code>Cnd</code></strong> (Condition Holds)，表示是否跳转。</li></ul></li><li><strong>访存 (Memory)</strong>: (什么也不做)。</li><li><strong>写回 (Write Back)</strong>: (什么也不做)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = Cnd ? valC : valP</code> (根据 Cnd 标志，选择 Dest 或 fall-through 地址)。</li></ul><h4 id="6-call-Dest">6. <code>call Dest</code></h4><ul><li><strong>取指 (Fetch)</strong>: 读 9 字节 (<code>icode:ifun</code>, <code>valC=Dest</code>)。<code>valP = PC + 9</code> (valP 是<mark><strong>返回地址</strong></mark>)。</li><li><strong>译码 (Decode)</strong>: 读 <code>valB = R[%rsp]</code>。</li><li><strong>执行 (Execute)</strong>: <code>valE = valB + -8</code> (ALU 计算 <code>rsp-8</code>，即新栈顶)。</li><li><strong>访存 (Memory)</strong>: 将 <code>valP</code> (返回地址) 写入内存 <code>M[valE]</code> (压入栈)。</li><li><strong>写回 (Write Back)</strong>: 将 <code>valE</code> 写入 <code>%rsp</code> (更新栈顶)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valC</code> (跳转到 Dest)。</li></ul><h4 id="7-ret-返回">7. <code>ret</code> (返回)</h4><ul><li><strong>取指 (Fetch)</strong>: 读 1 字节 (<code>icode:ifun</code>)。</li><li><strong>译码 (Decode)</strong>: 读 <code>%rsp</code> <mark>两次</mark> (得 <code>valA = R[%rsp]</code>, <code>valB = R[%rsp]</code>)。</li><li><strong>执行 (Execute)</strong>: <code>valE = valB + 8</code> (ALU 计算 <code>rsp+8</code>，即新栈顶)。</li><li><strong>访存 (Memory)</strong>: 从 <code>M[valA]</code> (旧栈顶) 读取 <code>valM</code> (即<strong>返回地址</strong>)。</li><li><strong>写回 (Write Back)</strong>: 将 <code>valE</code> 写入 <code>%rsp</code> (更新栈顶)。</li><li><strong>PC 更新 (PC Update)</strong>: <code>PC = valM</code> (跳转到返回地址)。</li></ul><div class="note note-info">            <p><strong>1. <code>valA</code>, <code>valE</code>, <code>valM</code> 是寄存器吗？</strong></p><ul><li><strong>不是</strong>。它们是 CPU 内部的<strong>临时信号线 (Wires)</strong>，仅在当前时钟周期内有效。</li><li><strong>对比</strong>：<code>%rax</code>, <code>%rsp</code> 是<strong>架构寄存器</strong>（仓库/存储）；<code>valA</code>, <code>valE</code> 是<strong>内部信号</strong>（传送带/运输）。</li><li><strong>速查字典</strong>：<ul><li><code>valP</code>: 下一条指令地址 (Next <strong>P</strong>C)。</li><li><code>valC</code>: 指令中的常数/立即数 (<strong>C</strong>onstant)。</li><li><code>valE</code>: <strong>ALU</strong> 计算出的结果 (<strong>E</strong>xecute)。</li><li><code>valM</code>: <strong>数据内存</strong>读出的值 (<strong>M</strong>emory)。</li></ul></li></ul><hr><p><strong>2. 为什么 <code>popq</code> 或 <code>ret</code> 需要读两次 <code>%rsp</code>？</strong></p><ul><li><strong>根本原因</strong>：SEQ 处理器的硬件连线是固定的，必须并行工作。</li><li><strong>分工需求</strong>：这条指令既要用 <code>%rsp</code> 指向的地址<strong>去读内存</strong>，又要用 <code>%rsp</code> 的值<strong>去加 8</strong>。</li><li><strong>硬件实现</strong>：<ul><li><strong>读端口 A (<code>valA</code>)</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 物理连向 <strong>内存地址端</strong> (Memory Address)。</li><li><strong>读端口 B (<code>valB</code>)</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 物理连向 <strong>ALU 输入端</strong> (ALU Input)。</li></ul></li><li><strong>结论</strong>：为了让内存和 ALU 同时拿到 <code>%rsp</code> 的旧值开始干活，控制逻辑必须让寄存器文件同时从 A、B 两个端口输出 <code>%rsp</code> 的值。</li></ul>          </div>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/05-Logic/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/05-Logic/"/>
    <published>2026-01-14T18:10:00.000Z</published>
    <summary>计算机体系结构：逻辑设计 (Computer Architecture: Logic Design)</summary>
    <title>CSAPP - 05.Logic</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>计算机体系结构: ISA (Instruction Set Architecture)</h1><div class="note note-success 核心导读：定义硬件与软件的接口">            <p><strong>主要内容</strong>：<br>本章从使用汇编转向了<strong>设计 CPU</strong>。</p><ol><li><strong>ISA (指令集架构)</strong>：介绍了 ISA 作为软硬件契约的概念，以及 CISC (x86) 与 RISC (ARM/MIPS) 的设计哲学区别。</li><li><strong>Y86-64</strong>：为了教学目的，简化了复杂的 x86-64，定义了一个迷你的指令集 Y86-64。我们详细定义了它的寄存器、指令编码字节、以及异常处理状态。</li></ol><p><strong>Motivation</strong>：<br>真正的 x86-64 太复杂，无法在课堂上设计出它的电路。学习 Y86-64 是为了搭建一个**“麻雀虽小，五脏俱全”的模型**。它是后续章节我们亲手“造 CPU”的蓝图和需求文档。</p>          </div><h2 id="指令集架构-Instruction-Set-Architecture-ISA">指令集架构 (Instruction Set Architecture - ISA)</h2><ul><li><strong>ISA (指令集架构)</strong> 是一个抽象层，位于编译器编写者和处理器设计者之间。</li><li>它定义了处理器的<strong>汇编语言视图 (Assembly Language View)</strong>：<ul><li><strong>处理器状态 (Processor state):</strong> 寄存器、内存等。</li><li><strong>指令 (Instructions):</strong> <code>addq</code>, <code>pushq</code>, <code>ret</code> 等。</li><li><strong>指令编码 (Encoding):</strong> 指令如何被编码为字节。</li></ul></li></ul><p><strong>抽象层次：</strong></p><ul><li><strong>对编译器编写者 (上层):</strong><ul><li>只需要知道允许哪些指令，以及它们是如何编码的。</li><li>关注机器代码优化。</li></ul></li><li><strong>对处理器设计者 (下层):</strong><ul><li>需要建造出能执行这些指令的处理器。</li><li>关注如何高效执行指令（例如，通过流水线并行执行）。</li></ul></li></ul><hr><h2 id="CISC-vs-RISC">CISC vs. RISC</h2><h3 id="CISC-复杂指令集计算机">CISC (复杂指令集计算机)</h3><ul><li><strong>CISC</strong> = Complex Instruction Set Computer。</li><li><strong>IA32 (x86-32)</strong> 是一个典型的例子。</li><li><strong>特性:</strong><ul><li><strong>面向栈 (Stack-oriented):</strong> 使用栈来传递参数、保存程序计数器，有显式的 <code>push</code> 和 <code>pop</code> 指令。</li><li><strong>算术指令可访问内存:</strong> 例如 <code>addq %rax, 12(%rbx,%rcx,8)</code>，一条指令就包含了复杂的地址计算以及内存读写。</li><li><strong>条件码 (Condition codes):</strong> 作为算术和逻辑指令的副作用被设置。</li></ul></li><li><strong>哲学:</strong> 添加指令来执行“典型”的编程任务。</li><li><strong>结果:</strong> x86 指令集中的指令数量随时间不断增长，到 2014 年已超过 1300 条。</li></ul><h3 id="RISC-精简指令集计算机">RISC (精简指令集计算机)</h3><ul><li><strong>RISC</strong> = Reduced Instruction Set Computer。</li><li>由 IBM 的项目开创，后被 Hennessy (Stanford) 和 Patterson (Berkeley) 推广。</li><li><strong>特性:</strong><ul><li><strong>更少、更简单的指令:</strong> 完成某个任务可能需要更多条指令，但每条指令都可以用更小、更快的硬件来执行。</li><li><strong>面向寄存器 (Register-oriented):</strong><ul><li>通常有更多（例如 32 个）寄存器。</li><li>使用寄存器传递参数、存储返回值和临时变量。</li></ul></li><li><strong>Load/Store 架构:</strong><ul><li><strong>只有 <code>load</code> (加载) 和 <code>store</code> (存储) 指令可以访问内存</strong>（类似于 Y86-64 的 <code>mrmovq</code> 和 <code>rmmovq</code>）。</li><li>算术指令（如 <code>add</code>）只能操作寄存器。</li></ul></li><li><strong>无条件码:</strong> 测试指令（如比较）会在一个寄存器中返回 0 或 1。</li></ul></li></ul><h4 id="MIPS-示例-一种-RISC-ISA">MIPS 示例 (一种 RISC ISA)</h4><ul><li><strong>MIPS 寄存器:</strong> 有 32 个通用寄存器（<code>$0</code> - <code>$31</code>），按用途命名（如 <code>$a0</code> - <code>$a3</code> 用于参数，<code>$v0</code> - <code>$v1</code> 用于返回值，<code>$t0</code> - <code>$t9</code> 用于临时变量，<code>$s0</code> - <code>$s7</code> 用于保存的变量，<code>$sp</code> 栈指针，<code>$ra</code> 返回地址）。</li><li><strong>MIPS 指令示例:</strong><ul><li><code>addu $3, $2, $1</code> (寄存器加法): <code>$3 = $2 + $1</code></li><li><code>addu $3, $2, 3145</code> (立即数加法: <code>$3 = $2 + 3145</code>)</li><li><code>lw $3, 16($2)</code> (Load Word: <code>$3 = M[$2 + 16]</code>)</li><li><code>sw $3, 16($2)</code> (Store Word: <code>M[$2 + 16] = $3</code>)</li></ul></li></ul><h3 id="CISC-vs-RISC-的现状">CISC vs. RISC 的现状</h3><ul><li><p><strong>最初的争论:</strong></p><ul><li><strong>CISC 支持者:</strong> 对编译器友好，代码字节数更少。</li><li><strong>RISC 支持者:</strong> 对优化编译器友好，可以用简单的芯片设计实现高速运行。</li></ul></li><li><p><strong>目前的状态:</strong></p><ul><li><strong>桌面处理器:</strong> ISA 的选择已不是一个关键技术问题。有足够强大的硬件，任何 ISA 都能跑得很快。<strong>代码兼容性</strong>更重要。</li><li><strong>x86-64</strong> 已经吸收了很多 <strong>RISC 的特性</strong>（例如，更多的寄存器，使用寄存器传参）。</li><li><strong>嵌入式处理器:</strong> RISC 意义重大（更小、更便宜、功耗更低）。<strong>ARM</strong> 处理器（一种 RISC）被用于大多数手机。</li></ul></li><li><p><strong>总结:</strong> 无论是单纯的 RISC 还是 CISC 都不如结合两者思想精华的设计。Y86-64 就同时具有 CISC（如条件码、可变指令长度）和 RISC（如 Load/Store 体系结构）的属性。</p></li></ul><hr><h2 id="Y86-64-处理器状态-Processor-State">Y86-64 处理器状态 (Processor State)</h2><ul><li><strong>RF (Program Registers):</strong> 15 个程序寄存器（省略 <code>%r15</code>），每个 64 位。</li><li><strong>CC (Condition Codes):</strong> 3 个单位标志位：<ul><li><code>ZF</code>: 零 (Zero)</li><li><code>SF</code>: 负 (Negative)</li><li><code>OF</code>: 溢出 (Overflow)</li></ul></li><li><strong>PC (Program Counter):</strong> 存放下一条要执行指令的地址。</li><li><strong>Stat (Program Status):</strong> 指示程序是正常运行还是出现了错误。</li><li><strong>DMEM (Memory):</strong> 字节寻址的存储阵列。</li></ul><h2 id="Y86-64-指令集-Instruction-Set">Y86-64 指令集 (Instruction Set)</h2><ul><li><strong>格式:</strong> 指令长度为 1 到 10 字节。可以从第一个字节确定指令长度。编码比 x86-64 简单。</li><li><strong>字节编码的唯一解释</strong>：这是指令集的一个重要性质。<ul><li>任意一个字节序列要么是一个唯一的指令序列的编码，要么就不是一个合法的字节序列。</li><li>这保证了处理器可以无二义性地执行目标代码程序。</li></ul></li><li><strong>第一个字节</strong>：Y86-64 每条指令的第一个字节有唯一的<strong>代码 (icode)</strong> 和<strong>功能 (ifun)</strong> 组合。<ul><li>给定这个字节，我们就可以决定所有其他附加字节的长度和含义。</li></ul></li><li><strong>字节序</strong>：Y86-64 采用<strong>小端法 (little-endian)</strong>，同 x86-64 一样。</li></ul><h3 id="寄存器编码-Encoding-Registers">寄存器编码 (Encoding Registers)</h3><ul><li>每个寄存器有一个 4-bit 的 ID (0-E)。</li><li>ID <strong><code>F</code> (15)</strong> 表示 <strong>“无寄存器” (No Register)</strong>。</li></ul><table><thead><tr><th><strong>寄存器</strong></th><th><strong>ID</strong></th><th><strong>寄存器</strong></th><th><strong>ID</strong></th></tr></thead><tbody><tr><td><code>%rax</code></td><td>0</td><td><code>%r8</code></td><td>8</td></tr><tr><td><code>%rcx</code></td><td>1</td><td><code>%r9</code></td><td>9</td></tr><tr><td><code>%rdx</code></td><td>2</td><td><code>%r10</code></td><td>A</td></tr><tr><td><code>%rbx</code></td><td>3</td><td><code>%r11</code></td><td>B</td></tr><tr><td><code>%rsp</code></td><td>4</td><td><code>%r12</code></td><td>C</td></tr><tr><td><code>%rbp</code></td><td>5</td><td><code>%r13</code></td><td>D</td></tr><tr><td><code>%rsi</code></td><td>6</td><td><code>%r14</code></td><td>E</td></tr><tr><td><code>%rdi</code></td><td>7</td><td>(无)</td><td>F</td></tr></tbody></table><h3 id="Y86-64-指令详解">Y86-64 指令详解</h3><h4 id="1-算术和逻辑操作-Arithmetic-and-Logical-Operations">1. 算术和逻辑操作 (Arithmetic and Logical Operations)</h4><ul><li><code>OPq rA, rB</code> (编码: <code>6 fn rA rB</code>)</li><li>从 <code>rA</code> 和 <code>rB</code> 读取值，计算结果，存回 <code>rB</code>，并设置条件码。</li><li><code>fn</code> (function code) 决定具体操作：<ul><li><code>addq</code> (加法): <code>fn = 0</code> (编码: <code>60</code>)</li><li><code>subq</code> (减法): <code>fn = 1</code> (编码: <code>61</code>)</li><li><code>andq</code> (与): <code>fn = 2</code> (编码: <code>62</code>)</li><li><code>xorq</code> (异或): <code>fn = 3</code> (编码: <code>63</code>)</li></ul></li><li><strong>示例:</strong> <code>addq %rax, %rsi</code><ul><li><code>rA = %rax = 0</code>, <code>rB = %rsi = 6</code></li><li>编码: <code>60 06</code></li></ul></li></ul><h4 id="2-移动操作-Move-Operations">2. 移动操作 (Move Operations)</h4><ul><li><code>rrmovq rA, rB</code> (编码: <code>20 rA rB</code>)<ul><li>寄存器 -&gt; 寄存器。</li></ul></li><li><code>irmovq V, rB</code> (编码: <code>30 F rB V</code>)<ul><li>立即数 -&gt; 寄存器。<code>V</code> 是一个 8 字节的立即数。</li></ul></li><li><code>rmmovq rA, D(rB)</code> (编码: <code>40 rA rB D</code>)<ul><li>寄存器 -&gt; 内存。<code>D</code> 是一个 8 字节的位移。</li></ul></li><li><code>mrmovq D(rB), rA</code> (编码: <code>50 rA rB D</code>)<ul><li>内存 -&gt; 寄存器。<code>D</code> 是一个 8 字节的位移。</li></ul></li><li><strong>示例:</strong> <code>irmovq $0xabcd, %rdx</code><ul><li><code>rB = %rdx = 2</code>, <code>V = 0x...abcd</code></li><li>编码: <code>30 f2 cd ab 00 00 00 00 00 00</code> (小端法)</li></ul></li><li><strong>示例:</strong> <code>rmmovq %rsi, 0x41c(%rsp)</code><ul><li><code>rA = %rsi = 6</code>, <code>rB = %rsp = 4</code>, <code>D = 0x...41c</code></li><li>编码: <code>40 64 1c 04 00 00 00 00 00 00</code></li></ul></li></ul><h4 id="3-条件移动-Conditional-Move-Instructions">3. 条件移动 (Conditional Move Instructions)</h4><ul><li><code>cmovXX rA, rB</code> (编码: <code>2 fn rA rB</code>)</li><li>这是 <code>rrmovq</code> 的变体。只有当条件码满足 <code>fn</code> 指定的条件时，才将 <code>rA</code> 的值复制到 <code>rB</code>。</li><li><code>fn</code> (function code) 决定条件：<ul><li><code>rrmovq</code> (无条件): <code>fn = 0</code> (编码: <code>20</code>)</li><li><code>cmovle</code> (小于或等于): <code>fn = 1</code> (编码: <code>21</code>)</li><li><code>cmovl</code> (小于): <code>fn = 2</code> (编码: <code>22</code>)</li><li><code>cmove</code> (等于): <code>fn = 3</code> (编码: <code>23</code>)</li><li><code>cmovne</code> (不等于): <code>fn = 4</code> (编码: <code>24</code>)</li><li><code>cmovge</code> (大于或等于): <code>fn = 5</code> (编码: <code>25</code>)</li><li><code>cmovg</code> (大于): <code>fn = 6</code> (编码: <code>26</code>)</li></ul></li></ul><h4 id="4-跳转指令-Jump-Instructions">4. 跳转指令 (Jump Instructions)</h4><ul><li><code>jXX Dest</code> (编码: <code>7 fn Dest</code>)</li><li>根据 <code>fn</code> 指定的条件码，跳转到 <code>Dest</code> (一个 8 字节的绝对地址)。</li><li><code>fn</code> (function code) 决定条件：<ul><li><code>jmp</code> (无条件): <code>fn = 0</code> (编码: <code>70</code>)</li><li><code>jle</code> (小于或等于): <code>fn = 1</code> (编码: <code>71</code>)</li><li><code>jl</code> (小于): <code>fn = 2</code> (编码: <code>72</code>)</li><li><code>je</code> (等于): <code>fn = 3</code> (编码: <code>73</code>)</li><li><code>jne</code> (不等于): <code>fn = 4</code> (编码: <code>74</code>)</li><li><code>jge</code> (大于或等于): <code>fn = 5</code> (编码: <code>75</code>)</li><li><code>jg</code> (大于): <code>fn = 6</code> (编码: <code>76</code>)</li></ul></li></ul><h4 id="5-栈操作-Stack-Operations">5. 栈操作 (Stack Operations)</h4><ul><li>Y86-64 的栈向<strong>低地址</strong>增长。<code>%rsp</code> 指向栈顶元素。</li><li><code>pushq rA</code> (编码: <code>A0 rA F</code>)<ol><li><code>%rsp</code> 减 8。</li><li>将 <code>rA</code> 的值存入 <code>%rsp</code> 指向的内存。</li></ol></li><li><code>popq rA</code> (编码: <code>B0 rA F</code>)<ol><li>从 <code>%rsp</code> 指向的内存读取一个值存入 <code>rA</code>。</li><li><code>%rsp</code> 加 8。</li></ol></li></ul><h4 id="6-子程序调用和返回-Subroutine-Call-and-Return">6. 子程序调用和返回 (Subroutine Call and Return)</h4><ul><li><code>call Dest</code> (编码: <code>80 Dest</code>)<ol><li>将 <code>call</code> 指令的下一条指令地址（返回地址）<code>push</code> 到栈上。</li><li>跳转到 <code>Dest</code>。</li></ol></li><li><code>ret</code> (编码: <code>90</code>)<ol><li>从栈上 <code>pop</code> 一个地址。</li><li>跳转到该地址。</li></ol></li></ul><h4 id="7-杂项指令-Miscellaneous-Instructions">7. 杂项指令 (Miscellaneous Instructions)</h4><ul><li><code>nop</code> (编码: <code>10</code>)<ul><li>不做任何事。</li></ul></li><li><code>halt</code> (编码: <code>00</code>)<ul><li>停止执行指令。</li><li>编码为 <code>00</code> 确保了程序如果意外跳转到未初始化的内存（通常为 0）时会停止，而不是执行非法指令。</li></ul></li></ul><h3 id="状态条件-Status-Conditions">状态条件 (Status Conditions)</h3><ul><li><code>AOK</code> (Code 1): 正常操作。</li><li><code>HLT</code> (Code 2): <code>halt</code> 指令。</li><li><code>ADR</code> (Code 3): 遇到非法地址（指令或数据）。</li><li><code>INS</code> (Code 4): 遇到非法指令。</li><li>如果状态不是 <code>AOK</code>，处理器停止执行。</li></ul><table><thead><tr><th style="text-align:left">类别</th><th style="text-align:left">指令助记符 (Mnemonic)</th><th style="text-align:left">字节编码 (Byte Encoding)<br><code>icode:ifun</code> …</th><th style="text-align:left">长度 (Bytes)</th><th style="text-align:left">含义 / 操作描述</th></tr></thead><tbody><tr><td style="text-align:left"><strong>控制与杂项</strong></td><td style="text-align:left"><strong>halt</strong></td><td style="text-align:left"><code>00</code></td><td style="text-align:left">1</td><td style="text-align:left">停止指令执行。将状态码设置为 <code>HLT</code> 。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>nop</strong></td><td style="text-align:left"><code>10</code></td><td style="text-align:left">1</td><td style="text-align:left">空操作，什么也不做 (No Operation) 。</td></tr><tr><td style="text-align:left"><strong>数据传送</strong></td><td style="text-align:left"><strong>rrmovq</strong> rA, rB</td><td style="text-align:left"><code>20 rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left">寄存器到寄存器传送：<code>R[rB] &lt;- R[rA]</code>。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>cmovXX</strong> rA, rB</td><td style="text-align:left"><code>2fn rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left"><strong>条件传送</strong>：根据条件码决定是否将 <code>R[rA]</code> 传送到 <code>R[rB]</code>。<br> <code>21</code>: <strong>cmovle</strong> (&lt;=)<br> <code>22</code>: <strong>cmovl</strong> (&lt;)<br> <code>23</code>: <strong>cmove</strong> (=)<br> <code>24</code>: <strong>cmovne</strong> (!=)<br> <code>25</code>: <strong>cmovge</strong> (&gt;=)<br> <code>26</code>: <strong>cmovg</strong> (&gt;)</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>irmovq</strong> V, rB</td><td style="text-align:left"><code>30 F rB V</code></td><td style="text-align:left">10</td><td style="text-align:left">立即数到寄存器：<code>R[rB] &lt;- V</code>。注意源寄存器位固定为 <code>F</code> (无) 。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>rmmovq</strong> rA, D(rB)</td><td style="text-align:left"><code>40 rA rB D</code></td><td style="text-align:left">10</td><td style="text-align:left">寄存器到内存：<code>M[R[rB] + D] &lt;- R[rA]</code> 。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>mrmovq</strong> D(rB), rA</td><td style="text-align:left"><code>50 rA rB D</code></td><td style="text-align:left">10</td><td style="text-align:left">内存到寄存器：<code>R[rA] &lt;- M[R[rB] + D]</code>。</td></tr><tr><td style="text-align:left"><strong>算术逻辑</strong></td><td style="text-align:left"><strong>addq</strong> rA, rB</td><td style="text-align:left"><code>60 rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left">加法：<code>R[rB] &lt;- R[rB] + R[rA]</code> 。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>subq</strong> rA, rB</td><td style="text-align:left"><code>61 rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left">减法：<code>R[rB] &lt;- R[rB] - R[rA]</code>。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>andq</strong> rA, rB</td><td style="text-align:left"><code>62 rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left">逻辑与：<code>R[rB] &lt;- R[rB] &amp; R[rA]</code>。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>xorq</strong> rA, rB</td><td style="text-align:left"><code>63 rA rB</code></td><td style="text-align:left">2</td><td style="text-align:left">逻辑异或：<code>R[rB] &lt;- R[rB] ^ R[rA]</code>。</td></tr><tr><td style="text-align:left"><strong>跳转控制</strong></td><td style="text-align:left"><strong>jmp</strong> Dest</td><td style="text-align:left"><code>70 Dest</code></td><td style="text-align:left">9</td><td style="text-align:left">无条件跳转。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>jXX</strong> Dest</td><td style="text-align:left"><code>7fn Dest</code></td><td style="text-align:left">9</td><td style="text-align:left"><strong>条件跳转</strong>：根据条件码跳转 。<br> <code>71</code>: <strong>jle</strong> (&lt;=)<br> <code>72</code>: <strong>jl</strong> (&lt;)<br> <code>73</code>: <strong>je</strong> (=)<br> <code>74</code>: <strong>jne</strong> (!=)<br> <code>75</code>: <strong>jge</strong> (&gt;=)<br> <code>76</code>: <strong>jg</strong> (&gt;)</td></tr><tr><td style="text-align:left"><strong>函数调用</strong></td><td style="text-align:left"><strong>call</strong> Dest</td><td style="text-align:left"><code>80 Dest</code></td><td style="text-align:left">9</td><td style="text-align:left">将返回地址压栈，然后跳转到 Dest。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>ret</strong></td><td style="text-align:left"><code>90</code></td><td style="text-align:left">1</td><td style="text-align:left">从栈中弹出返回地址，并跳转到该地址。</td></tr><tr><td style="text-align:left"><strong>栈操作</strong></td><td style="text-align:left"><strong>pushq</strong> rA</td><td style="text-align:left"><code>A0 rA F</code></td><td style="text-align:left">2</td><td style="text-align:left">将寄存器 <code>rA</code> 的值压入栈。注意第二个寄存器位固定为 <code>F</code> 。</td></tr><tr><td style="text-align:left"></td><td style="text-align:left"><strong>popq</strong> rA</td><td style="text-align:left"><code>B0 rA F</code></td><td style="text-align:left">2</td><td style="text-align:left">从栈弹出值并存入寄存器 <code>rA</code>。注意第二个寄存器位固定为 <code>F</code> 。</td></tr></tbody></table><p>Y86-64 <strong>不支持</strong> x86-64 中的 <strong>比例变址 (scaled addressing)</strong> 寻址模式。</p><ul><li><strong>x86-64 支持：</strong> <code>D(Rb, Ri, S)</code>，即 <code>Displacement(Base, Index, Scale)</code>。例如 <code>(%rdi, %rax, 8)</code> 表示地址为 <code>R[%rdi] + R[%rax] * 8</code>。这在访问数组 <code>a[i]</code> 时非常方便。</li><li><strong>Y86-64 仅支持：</strong> <code>D(Rb)</code>，即 <strong>基址 + 偏移量 (Base + Displacement)</strong>。例如 <code>8(%rbp)</code> 或 <code>(%rdi)</code>。<ul><li>它不支持索引寄存器（Index Register）。</li><li>它不支持比例因子（Scale Factor, 如 <code>*1, *2, *4, *8</code>）。</li></ul></li></ul><h2 id="编写-Y86-64-代码">编写 Y86-64 代码</h2><ul><li><strong>方法:</strong><ol><li>在 C 中编写代码。</li><li>使用 <code>gcc -Og -S</code> 编译为 x86-64 汇编。</li><li>将其“转译” (Transliterate) 为 Y86-64 汇编。</li></ol></li><li><strong>难点:</strong> Y86-64 没有 x86-64 的<strong>比例变址 (scaled addressing)</strong> 寻址模式（如 <code>(%rdi, %rax, 8)</code>），这使得数组索引 <code>a[i]</code> 变得困难。</li></ul><h3 id="示例：计算数组长度">示例：计算数组长度</h3><ul><li><strong>目标:</strong> 计算一个以 0 结尾的 <code>long</code> 数组的长度。</li><li><strong>C 语言 (指针版本):</strong></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> <span class="hljs-title function_">len</span><span class="hljs-params">(<span class="hljs-type">long</span> *a)</span> &#123;<br>    <span class="hljs-type">long</span> val = *a;<br>    <span class="hljs-type">long</span> len = <span class="hljs-number">0</span>;<br>    <span class="hljs-keyword">while</span> (val) &#123;<br>        a++;       <span class="hljs-comment">// 指针加 8</span><br>        len++;<br>        val = *a;  <span class="hljs-comment">// 取下一个值</span><br>    &#125;<br>    <span class="hljs-keyword">return</span> len;<br>&#125;<br></code></pre></td></tr></table></figure><ul><li><strong>Y86-64 汇编 (len):</strong></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs y86"># %rdi = a (数组指针)<br># %rax = len (返回值)<br># %rdx = val (当前值)<br># %r8 = 1 (常量 1)<br># %r9 = 8 (常量 8)<br><br>len:<br>    irmovq $1, %r8          # Constant 1<br>    irmovq $8, %r9          # Constant 8<br>    irmovq $0, %rax         # len = 0<br>    mrmovq (%rdi), %rdx     # val = *a<br>    andq %rdx, %rdx         # Test val (设置 ZF)<br>    je Done                 # if (val == 0) goto Done<br><br>Loop:<br>    addq %r8, %rax          # len++<br>    addq %r9, %rdi          # a++ (指针移动 8 字节)<br>    mrmovq (%rdi), %rdx     # val = *a<br>    andq %rdx, %rdx         # Test val<br>    jne Loop                # if (val != 0) goto Loop<br><br>Done:<br>    ret                     # 返回<br></code></pre></td></tr></table></figure><h3 id="Y86-64-程序结构">Y86-64 程序结构</h3><p>Y86-64 程序是一个 <strong>“裸机” (Bare-metal)</strong> 程序。因为没有操作系统来加载程序或设置运行环境，程序员必须在代码中显式地定义内存布局、初始化栈指针，并手动停止处理器。</p><h4 id="1-完整代码结构示例">1. 完整代码结构示例</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><code class="hljs y86"># 第一部分：初始化代码 (Entry Point)<br># 程序必须从地址 0 开始执行<br>    .pos 0                  # 告诉汇编器，下面的代码从地址 0 开始放置<br>init:<br>    irmovq Stack, %rsp      # 【关键步骤】 初始化栈指针。<br>                            # 必须在执行任何 call/push 指令前完成。<br>                            # Stack 是底部定义的标签地址 (例如 0x100)。<br><br>    call Main               # 调用主函数 (进入业务逻辑)<br>    halt                    # 【关键步骤】 停机。<br>                            # 如果没有这条指令，CPU 会继续向下执行，<br>                            # 试图把下面的数据当作指令执行，导致错误。<br><br># 第二部分：数据段 (Data Section)<br># 存放全局变量、数组等静态数据<br>    .align 8                # 内存对齐：确保接下来的数据地址是 8 的倍数<br>array:<br>    .quad 0x111             # 定义 8字节常数 (.quad = quad word)<br>    .quad 0x222<br>    .quad 0x333<br>    .quad 0                 # 数组结束符 (类似于 C 字符串的 \0)<br><br># 第三部分：代码段 (Code Section)<br># 存放具体的函数逻辑<br><br>Main:<br>    irmovq array, %rdi      # 准备参数：将数组首地址传给第一个参数寄存器 %rdi<br>    call len                # 调用计算长度的函数<br>    ret                     # 返回 init (然后执行 halt)<br><br>len:                        # 子函数定义<br>    irmovq $1, %r8          # 常数 1<br>    irmovq $0, %rax         # sum = 0<br>    # ... (省略具体循环逻辑) ...<br>    ret<br><br># 第四部分：栈区域 (Stack Area)<br># 必须放置在内存的高地址处，远离代码和数据<br>    .pos 0x100              # 【关键指令】 将汇编地址跳转到 0x100<br>                            # 这意味着 0x100 之前的空间是空的，留给栈生长。<br><br>Stack:                      # 标签定义。<br>                            # 当执行 irmovq Stack, %rsp 时，%rsp = 0x100。<br>                            # 栈向低地址增长 (0x0F8, 0x0F0...)。<br></code></pre></td></tr></table></figure><h4 id="2-核心组成部分解析">2. 核心组成部分解析</h4><h5 id="2-1-程序的入口-init">2.1 程序的入口 (<code>init</code>)</h5><ul><li><strong><code>.pos 0</code></strong>: Y86 处理器复位后，PC (程序计数器) 默认值为 0。因此，地址 0 处必须是可以执行的代码。</li><li><strong><code>irmovq Stack, %rsp</code></strong>: 这是程序的第一条有效指令。<ul><li>在执行 <code>call</code> 指令时，CPU 会自动将返回地址压栈。</li><li>如果 <code>%rsp</code> 没有初始化（或者是 0），压栈操作会导致内存错误或覆盖地址 0 处的代码。</li></ul></li><li><strong><code>halt</code></strong>: 程序结束的标志。在 Y86 模拟器中，这会让处理器停止运行并显示最终状态 (<code>HLT</code>)。</li></ul><h5 id="2-2-数据布局-align-quad">2.2 数据布局 (<code>.align</code> &amp; <code>.quad</code>)</h5><ul><li><strong><code>.align 8</code></strong>: Y86-64 是 64 位架构。虽然它不像某些硬件那样强制要求对齐，但为了模拟真实系统并避免跨字边界访问，通常对数据进行 8 字节对齐。</li><li><strong><code>.quad</code></strong>: 定义一个 64 位 (8字节) 的字。这对应于 C 语言中的 <code>long</code> 类型。</li><li><strong>放置位置</strong>: 数据通常放在 <code>halt</code> 之后，<code>Main</code> 之前。这样既不会被意外执行，离代码也比较近。</li></ul><h5 id="2-3-栈的设置-Stack-pos">2.3 栈的设置 (<code>Stack</code> &amp; <code>.pos</code>)</h5><p>栈的设计采用了 <strong>“向后定义”</strong> 的技巧：</p><ol><li><strong><code>.pos 0x100</code></strong>: 这条伪指令告诉汇编器：“不要紧接着上面的代码写了，直接跳到地址 <code>0x100</code>”。</li><li><strong>留白区域</strong>: 从上一个代码结束的位置到 <code>0x100</code> 之间的内存区域，就是<strong>栈空间</strong>。</li><li><strong><code>Stack:</code> 标签</strong>: 这个标签代表地址 <code>0x100</code>。</li><li><strong>生长方向</strong>:<ul><li>初始 <code>%rsp</code> = <code>0x100</code>。</li><li>第一次 <code>push</code> 或 <code>call</code>，<code>%rsp</code> 变为 <code>0x0F8</code> (减8)。</li><li>栈向<strong>低地址</strong>增长，慢慢填满 <code>0x100</code> 之前的空白区。</li></ul></li></ol><div class="note note-warning 栈溢出风险">            <p>如果栈空间预留得不够大（例如 .pos 的地址太小），或者递归调用太深，栈就会一直向低地址生长，最终覆盖掉代码段或数据段，导致程序崩溃或行为异常。</p>          </div><h4 id="3-内存映像图解-Memory-Map">3. 内存映像图解 (Memory Map)</h4><p>这个程序的内存布局在模拟器中看起来是这样的：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs Code">地址 (Address)      内容 (Content)<br>--------------------------------------<br>0x000             init 代码 (irmovq, call...)<br>...               halt 指令<br>--------------------------------------<br>(自动对齐)         数据段 (array: 0x111, 0x222...)<br>--------------------------------------<br>(紧接着数据)       Main 函数代码<br>...               len 函数代码<br>--------------------------------------<br>...               (空白内存区域)<br>...               (栈在这里动态生长)<br>...               (Stack frame n...)<br>...               (Stack frame 1...)<br>--------------------------------------<br>0x100             Stack 标签 (栈底)<br>--------------------------------------<br></code></pre></td></tr></table></figure><h3 id="汇编和仿真">汇编和仿真</h3><ol><li><strong>汇编 (Assembling):</strong> <code>yas len.ys</code> (Y86-64 Assembler)<ul><li>生成目标文件 <code>len.yo</code>。</li></ul></li><li><strong>仿真 (Simulating):</strong> <code>yis len.yo</code> (Y86-64 Instruction Simulator)<ul><li>执行代码，报告处理器状态的改变（寄存器、内存）和最终状态。</li></ul></li></ol><h2 id="开源指令集">开源指令集</h2><ul><li><strong>RISC-V (2016):</strong> 完全开源，架构简单，易于移植，模块化设计，低功耗。</li><li><strong>PowerPC (2019):</strong> 架构和指令集移交给了 Linux 基金会。</li></ul><h2 id="总结">总结</h2><ul><li><strong>Y86-64 ISA:</strong><ul><li>与 x86-64 相似的状态和指令。</li><li>更简单的编码。</li><li>介于 CISC 和 RISC 之间。</li></ul></li><li><strong>ISA 设计的重要性:</strong><ul><li>现在的重要性低于过去。</li><li>有足够强大的硬件，几乎任何 ISA 都能跑得很快。</li></ul></li></ul><h2 id="练习">练习</h2><h3 id="CSAPP-练习题4-1">CSAPP 练习题4.1</h3><p>需要用到 Y86-64 指令集的以下规则：</p><ol><li><strong>指令编码格式</strong>：<ul><li><code>irmovq V, rB</code>: <code>30 F rB V</code> (10 字节)</li><li><code>rrmovq rA, rB</code>: <code>20 rA rB</code> (2 字节)</li><li><code>rmmovq rA, D(rB)</code>: <code>40 rA rB D</code> (10 字节)</li><li><code>addq rA, rB</code>: <code>60 rA rB</code> (2 字节)</li><li><code>jmp Dest</code>: <code>70 Dest</code> (9 字节)</li></ul></li><li><strong>寄存器 ID</strong>：<ul><li><code>%rcx</code> = 1, <code>%rbx</code> = 3</li></ul></li><li><strong>数据格式</strong>：<ul><li>立即数、偏移量、跳转地址均使用 <strong>8字节、小端法 (Little-endian)</strong> 存储。</li></ul></li></ol><table><thead><tr><th><strong>地址 (Address)</strong></th><th><strong>字节编码 (Byte Representation)</strong></th><th><strong>指令 (Instruction)</strong></th></tr></thead><tbody><tr><td><strong>0x100</strong></td><td><code>30 F3 0F 00 00 00 00 00 00 00</code></td><td><code>irmovq $15, %rbx</code></td></tr><tr><td><strong>0x10A</strong></td><td><code>20 31</code></td><td><code>rrmovq %rbx, %rcx</code></td></tr><tr><td><strong>0x10C</strong></td><td><code>40 13 FD FF FF FF FF FF FF FF</code></td><td><code>loop: rmmovq %rcx, -3(%rbx)</code></td></tr><tr><td><strong>0x116</strong></td><td><code>60 31</code></td><td><code>addq %rbx, %rcx</code></td></tr><tr><td><strong>0x118</strong></td><td><code>70 0C 01 00 00 00 00 00 00</code></td><td><code>jmp loop</code></td></tr></tbody></table><h3 id="CSAPP-练习题4-2">CSAPP 练习题4.2</h3><p>这是一个关于 Y86-64 指令解码的练习题。我们需要根据指令编码规则，将每个字节序列翻译成汇编代码，并检查是否有非法指令。</p><p><strong>A. <code>0x100: 30f3fcffffffffffffff40630008000000000000</code></strong></p><p>这是一个<strong>合法</strong>的序列。</p><ol><li><strong><code>0x100: 30 f3 fcffffffffffffff</code></strong><ul><li><code>30</code>: <code>irmovq</code> 指令。</li><li><code>f3</code>: 源无 (<code>F</code>), 目的 <code>%rbx</code> (<code>3</code>)。</li><li><code>fcffffffffffffff</code>: 立即数 <code>-4</code> (0xff…fc)。</li><li><strong>指令</strong>: <code>irmovq $-4, %rbx</code></li></ul></li><li><strong><code>0x10A: 40 63 0008000000000000</code></strong><ul><li><code>40</code>: <code>rmmovq</code> 指令。</li><li><code>63</code>: 源 <code>%rsi</code> (<code>6</code>), 基址 <code>%rbx</code> (<code>3</code>)。</li><li><code>0008...</code>: 偏移量 <code>0x800</code>。</li><li><strong>指令</strong>: <code>rmmovq %rsi, 0x800(%rbx)</code></li></ul></li></ol><p><strong>B. <code>0x200: a06f800c0200000000000030f30a0000000000000090</code></strong></p><p>这是一个<strong>合法</strong>的序列。</p><ol><li><strong><code>0x200: a0 6f</code></strong><ul><li><code>a0</code>: <code>pushq</code> 指令。</li><li><code>6f</code>: 寄存器 <code>%rsi</code> (<code>6</code>), 填充位 <code>F</code>。</li><li><strong>指令</strong>: <code>pushq %rsi</code></li></ul></li><li><strong><code>0x202: 80 0c02000000000000</code></strong><ul><li><code>80</code>: <code>call</code> 指令。</li><li><code>0c02...</code>: 目标地址 <code>0x20c</code>。</li><li><strong>指令</strong>: <code>call 0x20c</code></li></ul></li><li><strong><code>0x20B: 30 f3 0a00000000000000</code></strong><ul><li><code>30</code>: <code>irmovq</code> 指令。</li><li><code>f3</code>: 目的 <code>%rbx</code> (<code>3</code>)。</li><li><code>0a...</code>: 立即数 <code>10</code>。</li><li><strong>指令</strong>: <code>irmovq $10, %rbx</code></li></ul></li><li><strong><code>0x215: 90</code></strong><ul><li><code>90</code>: <code>ret</code> 指令。</li><li><strong>指令</strong>: <code>ret</code></li></ul></li></ol><p><strong>C. <code>0x300: 5054070000000000000010f0b01f</code></strong></p><p>这是一个<strong>非法</strong>的序列。</p><ol><li><strong><code>0x300: 50 54 0700000000000000</code></strong><ul><li><code>50</code>: <code>mrmovq</code> 指令。</li><li><code>54</code>: 目的 <code>%rbp</code> (<code>5</code>), 基址 <code>%rsp</code> (<code>4</code>)。</li><li><code>07...</code>: 偏移量 <code>7</code>。</li><li><strong>指令</strong>: <code>mrmovq 7(%rsp), %rbp</code></li></ul></li><li><strong><code>0x30A: 10</code></strong><ul><li><code>10</code>: <code>nop</code> 指令。</li><li><strong>指令</strong>: <code>nop</code></li></ul></li><li><strong><code>0x30B: f0</code></strong><ul><li><strong>错误</strong>: Y86-64 指令集中没有以 <code>0xF</code> 开头的操作码。</li><li><strong>结论</strong>: 地址 <strong>0x30B</strong> 处出现非法字节 <code>f0</code>。</li></ul></li></ol><p><strong>D. <code>0x400: 6113730004000000000000</code></strong></p><p>这是一个<strong>合法</strong>的序列。</p><ol><li><strong><code>0x400: 61 13</code></strong><ul><li><code>61</code>: <code>subq</code> 指令。</li><li><code>13</code>: 寄存器 <code>%rcx</code> (<code>1</code>) 和 <code>%rbx</code> (<code>3</code>)。</li><li><strong>指令</strong>: <code>subq %rcx, %rbx</code></li></ul></li><li><strong><code>0x402: 73 0004000000000000</code></strong><ul><li><code>73</code>: <code>je</code> (相等则跳转) 指令。</li><li><code>0004...</code>: 目标地址 <code>0x400</code>。</li><li><strong>指令</strong>: <code>je 0x400</code></li></ul></li><li><strong><code>0x40B: 00</code></strong><ul><li><code>00</code>: <code>halt</code> 指令。</li><li><strong>指令</strong>: <code>halt</code></li></ul></li></ol><p><strong>E. <code>0x500: 6362a0f0</code></strong></p><p>这是一个<strong>非法</strong>的序列。</p><ol><li><strong><code>0x500: 63 62</code></strong><ul><li><code>63</code>: <code>xorq</code> 指令。</li><li><code>62</code>: 寄存器 <code>%rsi</code> (<code>6</code>) 和 <code>%rdx</code> (<code>2</code>)。</li><li><strong>指令</strong>: <code>xorq %rsi, %rdx</code></li></ul></li><li><strong><code>0x502: a0 f0</code></strong><ul><li><code>a0</code>: <code>pushq</code> 指令。</li><li><strong>错误</strong>: <code>pushq</code> 的寄存器字节格式必须是 <code>rA F</code>。<ul><li>这里的第二个字节是 <code>f0</code>。</li><li>高位 <code>f</code> 表示寄存器 <code>rA</code> 是 <code>0xF</code> (无寄存器)，这是非法的，因为 <code>push</code> 必须操作一个有效寄存器。</li><li>低位 <code>0</code> 应该是 <code>F</code> (填充位)，这里却是 <code>0</code>。</li></ul></li><li><strong>结论</strong>: 地址 <strong>0x503</strong> (或者说指令 <code>0x502</code>) 的寄存器说明符字节 <code>f0</code> 是非法的。</li></ul></li></ol><p><a href="https://boginw.github.io/js-y86-64/">y86-64 Simulator</a></p>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/04-ISA/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/04-ISA/"/>
    <published>2026-01-14T18:05:00.000Z</published>
    <summary>计算机体系结构: ISA (Instruction Set Architecture)</summary>
    <title>CSAPP - 04.ISA</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1><strong>机器级编程 IV：高级 （Advanced Topics）</strong></h1><div class="note note-success 核心导读：利用与防御——栈的脆弱性">            <p><strong>主要内容</strong>：<br>本章探讨内存布局与安全漏洞。</p><ol><li><strong>内存布局</strong>：栈、堆、数据段在 x86-64 Linux 中的分布。</li><li><strong>缓冲区溢出</strong>：演示了如何利用 C 语言不检查数组边界的特性，通过覆盖栈上的“返回地址”来劫持程序控制流。</li><li><strong>防御机制</strong>：介绍了现代系统如何通过栈随机化 (ASLR)、栈金丝雀 (Canary) 和不可执行位 (NX) 来防御攻击。</li></ol><p><strong>Motivation</strong>：<br>这是一个“黑客与防御者”的章节。它展示了上一章学到的“过程调用机制”如果被滥用会有什么后果。理解这些对编写安全的代码（Secure Coding）和理解系统安全机制至关重要。</p>          </div><h2 id="5-1-x86-64-Linux-内存布局"><strong>5.1 x86-64 Linux 内存布局</strong></h2><p>一个程序在运行时，其内存被划分为几个关键区域：</p><ol><li><strong>栈 (Stack)</strong><ul><li>位于内存的最高地址区域（例如 <code>0x00007FFF...</code>）。</li><li><strong>向下增长</strong>（即新数据放在更低的地址）。</li><li>用于存储局部变量、函数参数、返回地址。</li><li>每次函数调用都会创建一个新的<strong>栈帧 (Stack Frame)</strong>。</li><li>通常有大小限制（例如 8MB）。</li><li>为了安全，栈的起始地址是<strong>随机化</strong>的。</li></ul></li><li><strong>共享库 (Shared Libraries)</strong><ul><li>位于栈下方，用于存放像 <code>printf</code> 这样的动态链接库的代码和数据。</li><li>其加载地址也是<strong>随机化</strong>的。</li></ul></li><li><strong>堆 (Heap)</strong><ul><li>位于共享库下方。</li><li><strong>向上增长</strong>（即新数据放在更高的地址）。</li><li>用于<strong>动态内存分配</strong>，即 <code>malloc()</code>、<code>calloc()</code>、<code>new()</code> 申请的内存。</li></ul></li><li><strong>数据段 (Data Segment)</strong><ul><li>用于存放静态分配的数据。</li><li>例如：全局变量、静态变量 (<code>static</code> 修饰的变量)、字符串常量（如 “Hello, World”）。</li></ul></li><li><strong>代码段 (Text Segment)</strong><ul><li>位于内存的最低地址区域（例如 <code>0x000000000040...</code>）。</li><li>存放可执行的机器指令。</li><li>通常是<strong>只读 (Read-only)</strong> 的，防止程序意外修改自身代码。</li></ul></li></ol><p><strong>示例：</strong></p><ul><li><code>int local = 0;</code> (函数内的局部变量) -&gt; <strong>栈 (Stack)</strong></li><li><code>void *p = malloc(100);</code> (指针 <code>p</code> 在栈上, 它指向的100字节) -&gt; <strong>堆 (Heap)</strong></li><li><code>int global = 0;</code> (函数外的全局变量) -&gt; <strong>数据段 (Data Segment)</strong></li><li><code>main()</code> 函数本身的代码 -&gt; <strong>代码段 (Text Segment)</strong></li></ul><hr><h2 id="5-2-缓冲区溢出-Buffer-Overflow"><strong>5.2 缓冲区溢出 (Buffer Overflow)</strong></h2><p>缓冲区溢出是 C 语言程序中最主要、最危险的安全漏洞之一。</p><h3 id="1-什么是缓冲区溢出？"><strong>1. 什么是缓冲区溢出？</strong></h3><p>当向一个数组（缓冲区）写入的数据超出了该数组分配的内存大小时，多出的数据就会“溢出”，并覆盖掉相邻的内存区域。</p><p>这在C语言中尤其危险，因为很多标准库函数<strong>不检查边界</strong>。</p><ul><li><strong>危险函数</strong>：<ul><li><code>gets(char *dest)</code>：无法指定读取长度，已废弃。</li><li><code>strcpy(dest, src)</code>：无边界检查地复制字符串。</li><li><code>strcat(dest, src)</code>：无边界检查地拼接字符串。</li><li><code>scanf(&quot;%s&quot;, buf)</code>：读取字符串时，不限制长度。</li></ul></li></ul><h3 id="2-栈破坏-Stack-Smashing-示例"><strong>2. 栈破坏 (Stack Smashing) 示例</strong></h3><p>在栈上发生的缓冲区溢出称为“栈破坏”。</p><p><strong>场景</strong>:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">void</span> <span class="hljs-title function_">echo</span><span class="hljs-params">()</span> &#123;<br>    <span class="hljs-type">char</span> buf[<span class="hljs-number">4</span>]; <span class="hljs-comment">// 缓冲区大小只有 4 字节</span><br>    gets(buf);   <span class="hljs-comment">// 从用户读取输入</span><br>    ...<br>&#125;<br>````<br><br>- **编译器的行为**: 编译器在栈上分配空间时，除了 `buf[<span class="hljs-number">4</span>]`，还会在其后（更高地址）分配额外的**填充空间 (padding)**，再往后才是保存的**返回地址 (Return Address)**。<br><br>```text<br>内存地址 (Address)      栈内容 (Stack Content)<br>------------------------------------------------------<br>High (高地址)    |  ...父函数的栈帧...        |<br>      ^          +---------------------------+<br>      |          |  返回地址 (Return Addr)    |  &lt;-- 关键目标！(<span class="hljs-number">8</span>字节)<br>      |          +---------------------------+<br>      |          |  旧 %rbp (Old RBP)        |  &lt;-- 保存的基址指针 (<span class="hljs-number">8</span>字节)<br>      |          +---------------------------+ &lt;--- 栈帧分界线<br>      |          |  (可能存在的填充 Padding)   |  &lt;-- 编译器为了对齐分配的空隙<br>      |          +---------------------------+<br>      |          |  buf[<span class="hljs-number">3</span>]                   |<br>      |          |  buf[<span class="hljs-number">2</span>]                   |<br>      |          |  buf[<span class="hljs-number">1</span>]                   |<br>Low (低地址)     |  buf[<span class="hljs-number">0</span>]                   |  &lt;-- %rsp (栈顶) 指向这里<br>------------------------------------------------------<br></code></pre></td></tr></table></figure><ul><li><strong>Case 1: 输入 “0123456789”</strong><ul><li>输入字符串的长度超过了 4 字节。</li><li>多出的字符会溢出，并覆盖掉 <code>buf</code> 后面的填充空间。</li><li><strong>但是</strong>，返回地址可能没有被碰到。</li><li><strong>结果</strong>: 函数可能正常返回，程序_看起来_没问题，但内存已经被破坏。</li></ul></li><li><strong>Case 2: 输入 “012345678901234567890123” (24个字符)</strong><ul><li>输入字符串足够长，它会填满 <code>buf</code>、填满所有填充空间，并最终<strong>覆盖掉返回地址</strong>。</li><li>例如，返回地址 <code>0x0000004006c3</code> 被覆盖成了 <code>0x000000400600</code> (来自 “0123” 的ASCII码和最后的 <code>\0</code>)。</li><li><strong>结果</strong>: 当 <code>echo</code> 函数执行 <code>ret</code> 指令时，它不会返回到主函数，而是试图跳转到地址 <code>0x400600</code>。这个地址是无效的，导致<strong>段错误 (Segmentation Fault)</strong>，程序崩溃。</li></ul></li></ul><div class="note note-info">            <p><strong>1. 核心误区纠正</strong></p><ul><li><strong>误区</strong>：认为栈上有一个名为 <code>buff</code> 的指针变量（占 8 字节）专门用来存首地址。</li><li><strong>真相</strong>：对于 <code>char buff[4]</code>，栈上<strong>只有</strong> 4 个字节用来存数据（字符）。<strong>根本不存在</strong>一个物理上的变量用来存“buff 的地址”。</li><li><strong>本质</strong>：数组名 <code>buff</code> 只是编译器眼中的<strong>符号/标签</strong>。编译后，它直接变成了相对于栈指针 (<code>%rsp</code>) 的<strong>固定偏移量</strong> (如 <code>0(%rsp)</code>)，存在于指令操作数中，不占数据内存。</li></ul><hr><p><strong>2. 内存布局对比</strong></p><ul><li><strong>局部数组 (<code>char buff[4]</code>)</strong>：<ul><li>栈占用：<strong>仅 4 字节</strong> (存 <code>'A', 'B'...</code>)。</li><li>地址存储位置：<strong>无</strong> (直接硬编码在汇编指令里)。</li></ul></li><li><strong>指针变量 (<code>char *ptr</code>)</strong>：<ul><li>栈占用：<strong>8 字节</strong>。</li><li>地址存储位置：<strong>栈上</strong> (确实有一个变量空间用来存地址)。</li></ul></li></ul><hr><p><strong>3. 栈破坏攻击的路径</strong></p><ul><li>由于栈上不存在“buff 指针变量”，当写入数据超过 4 字节时：</li><li><strong>溢出路径</strong>：<code>buff 数据区</code> -&gt; <code>填充(Padding)</code> -&gt; <code>旧 %rbp</code> -&gt; <strong><code>返回地址 (Return Address)</code></strong>。</li><li><strong>结论</strong>：你淹没的是物理上存在的“返回地址”，而不是一个并不存在的“数组指针”。</li></ul><hr><p><strong>4. 形象类比</strong></p><ul><li><strong>数组 (<code>buff</code>) 是房子</strong>：房子本身占地（内存），虽有地址，但房子里不需要专门建个房间存“地址纸条”。</li><li><strong>指针变量 (<code>ptr</code>) 是名片</strong>：名片本身占地，上面写着地址。</li></ul>          </div><h3 id="3-栈破坏攻击-Stack-Smashing-Attack"><strong>3. 栈破坏攻击 (Stack Smashing Attack)</strong></h3><p>黑客利用上述原理，不只是让程序崩溃，而是让程序执行恶意代码。</p><ul><li><p><strong>攻击1：跳转到已有代码</strong></p><ol><li>攻击者知道程序中有一个恶意函数（例如 <code>smash()</code>）的地址，比如 <code>0x4006c8</code>。</li><li>攻击者构造一个特殊的输入字符串，称为<strong>攻击载荷 (exploit code)</strong>。</li><li>这个字符串包含：<code>[任意填充字符 (24字节)] + [恶意函数的地址 (8字节)]</code></li><li>例如 (Hex): <code>3031...33</code> (24字节) + <code>c8 06 40 00 00 00 00 00</code> (小端序地址)</li><li><code>gets(buf)</code> 将这个字符串读入栈中，<code>buf</code> 和填充区被填满，而<strong>返回地址</strong>被精确地覆盖为 <code>0x4006c8</code>。</li><li><strong>结果</strong>: 当 <code>echo</code> 函数 <code>ret</code> 时，它会跳转到 <code>smash()</code> 函数并执行，导致攻击成功。</li></ol></li><li><p><strong>攻击2：代码注入 (Code Injection)</strong></p><ol><li>这是更致命的攻击。攻击者将<strong>可执行的机器码</strong>作为字符串的一部分输入。</li><li>攻击者将返回地址覆盖为<strong>缓冲区 <code>buf</code> 自己的地址</strong>。</li><li><strong>结果</strong>: 当函数 <code>ret</code> 时，它会跳转到 <code>buf</code> 的起始地址，并<strong>开始执行</strong>黑客注入的恶意代码。</li><li>这就是1988年<strong>互联网蠕虫 (Internet Worm)</strong> 和 <strong>红色代码 (Code Red)</strong> 蠕虫病毒的攻击原理。</li></ol></li></ul><hr><h2 id="5-3-缓冲区溢出保护机制"><strong>5.3 缓冲区溢出保护机制</strong></h2><p>为了应对这些攻击，现代操作系统和编译器提供了多层防御：</p><h3 id="1-编写安全的代码-程序员的责任"><strong>1. 编写安全的代码 (程序员的责任)</strong></h3><ul><li><strong>永远不要使用 <code>gets()</code></strong>。</li><li>使用有边界检查的安全函数替代：<ul><li><code>fgets(buf, size, stdin)</code> 替代 <code>gets()</code>。</li><li><code>strncpy()</code> 替代 <code>strcpy()</code>。</li><li><code>snprintf()</code> 替代 <code>sprintf()</code>。</li></ul></li><li>使用 <code>scanf()</code> 时，<strong>必须</strong>指定字段宽度，例如 <code>scanf(&quot;%10s&quot;, buf)</code>，以限制最多读取10个字符。</li></ul><h3 id="2-系统级保护-操作系统的责任"><strong>2. 系统级保护 (操作系统的责任)</strong></h3><ul><li><p><strong>A. 栈随机化 (ASLR)</strong></p><ul><li><strong>全称</strong>: 地址空间布局随机化 (Address-Space Layout Randomization)。</li><li><strong>原理</strong>: 每次程序运行时，操作系统都将栈、堆、共享库的起始地址设置在一个<strong>随机</strong>的位置。</li><li><strong>效果</strong>: 攻击者无法预测 <code>buf</code> 的地址（用于代码注入）或 <code>smash()</code> 函数的地址（库函数可能在不同位置）。</li><li><strong>局限性</strong>: 攻击者可以通过“NOP雪橇”(NOP Sled) 进行暴力破解。即在恶意代码前放置大量空操作指令(<code>nop</code>)，只要返回地址猜中了雪橇上的任意一点，程序就会“滑行”到恶意代码并执行。</li></ul></li><li><p><strong>B. 不可执行内存 (Non-Executable / NX bit)</strong></p><ul><li><strong>原理</strong>: 现代 CPU 硬件允许操作系统将内存页标记为“不可执行”。</li><li><strong>效果</strong>: 操作系统将栈和堆都标记为“可读/可写”，但 <strong>“不可执行”</strong> 。</li><li><strong>防御</strong>: 这是<strong>对抗代码注入攻击最有效的手段</strong>。即使攻击者成功将返回地址指向了栈上的 <code>buf</code>，当 CPU 试图执行那里的代码时，会立即触发硬件异常，程序崩溃，攻击失败。</li></ul></li></ul><h3 id="3-栈金丝雀-Stack-Canaries-编译器的责任"><strong>3. 栈金丝雀 (Stack Canaries) (编译器的责任)</strong></h3><ul><li><p><strong>原理</strong>: 编译器在函数开始时，从一个秘密位置取出一个特殊的随机值，称为 <strong>“金丝雀” (Canary)</strong>，并将其放在栈帧中，位于所有缓冲区和返回地址<strong>之间</strong>。</p></li><li><p><strong>机制</strong>:</p><ol><li><strong>函数开始</strong>: <code>mov %fs:0x28, %rax</code> (获取金丝雀) -&gt; <code>mov %rax, 0x8(%rsp)</code> (存入栈中)。</li><li><strong>函数返回前</strong>: <code>mov 0x8(%rsp), %rax</code> (从栈中取回) -&gt; <code>xor %fs:0x28, %rax</code> (与原始值比较)。</li><li><strong>检查</strong>:<ul><li>如果 <code>xor</code> 结果为 0 (值未变)，说明没有发生溢出，正常执行 <code>ret</code>。</li><li>如果 <code>xor</code> 结果非 0 (值被修改)，说明缓冲区溢出<strong>已经</strong>破坏了金丝雀。程序会立即跳转到 <code>__stack_chk_fail</code>，<strong>直接终止程序</strong>，而不会执行 <code>ret</code>。</li></ul></li></ol></li><li><p><strong>效果</strong>: 这种方法可以有效防止任何试图通过溢出缓冲区来覆盖返回地址的攻击。</p></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-4-advanced/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-4-advanced/"/>
    <published>2026-01-14T18:00:00.000Z</published>
    <summary>机器级编程 IV：高级 （Advanced Topics）</summary>
    <title>CSAPP - 03.Machine-Level Programming IV</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1><strong>机器级编程 III: 过程 (Procedures)</strong></h1><div class="note note-success 核心导读：从“结构化”到“线性跳转”">            <p><strong>主要内容</strong>：<br>本章关注计算机如何实现逻辑控制。包括：</p><ol><li><strong>条件码 (Condition Codes)</strong>：CPU 如何通过 <code>ZF</code>, <code>SF</code> 等标志位记住上一次计算的结果。</li><li><strong>跳转指令 (Jumps)</strong>：汇编中没有 <code>if</code> 和 <code>while</code>，只有 <code>goto</code> (即 <code>jmp</code>/<code>je</code>)。</li><li><strong>翻译控制结构</strong>：详细讲解了 C 语言中的 <code>if-else</code>、<code>while</code>、<code>for</code> 和 <code>switch</code> 是如何被“降维打击”成汇编中的条件跳转和跳转表的。</li></ol><p><strong>Motivation</strong>：<br>高级语言有优雅的结构（如循环、分支），但底层硬件非常“笨”，只会按顺序执行或跳转。理解这一章，你就能明白<strong>编译器是如何“欺骗”硬件来模拟复杂逻辑的</strong>，也能理解为什么某些写法（如 switch 跳转表）会比其他写法更快。</p>          </div><h2 id="3-1-过程-Procedures-的机制"><strong>3.1 过程 (Procedures) 的机制</strong></h2><p>一个过程（或函数）的调用需要一套完整的机制来支持：</p><ol><li><strong>传递控制 (Passing Control)</strong>:<ul><li>在调用时，程序必须能跳转到过程的起始地址。</li><li>在过程返回时，程序必须能跳转回调用指令的<em>下一条</em>指令。</li></ul></li><li><strong>传递数据 (Passing Data)</strong>:<ul><li>必须能够将<strong>参数 (Arguments)</strong> 传递给过程。</li><li>过程必须能够返回一个<strong>返回值 (Return Value)</strong>。</li></ul></li><li><strong>内存管理 (Memory Management)</strong>:<ul><li>过程在执行期间需要能够<strong>分配 (Allocate)</strong> 内存来存储局部变量。</li><li>在过程返回时，必须<strong>释放 (Deallocate)</strong> 这部分内存。</li></ul></li></ol><p>这些机制都是通过机器指令集和一套固定的策略来实现的。这些策略和选择共同构成了 <strong>应用二进制接口 (Application Binary Interface, ABI)</strong>。</p><h2 id="3-2-x86-64-栈-Stack-结构"><strong>3.2 x86-64 栈 (Stack) 结构</strong></h2><p><code>栈 (Stack)</code> 是实现过程机制的核心数据结构。</p><ul><li><strong>栈区域</strong>: 内存中一块特殊的区域，遵循 <code>栈 (Stack)</code> 规则（后进先出, LIFO）来管理。</li><li><strong>增长方向</strong>: 在 x86-64 架构中，栈从高地址<mark>向<strong>低地址</strong>增长</mark>，每次有压栈操作时候<code>%rsp</code>减8。（在64位计算机上，存储地址使用的是<code>64 bits</code>即<code>8 bytes</code>的大小）</li><li><strong>栈指针 (Stack Pointer, %rsp)</strong>:<ul><li><code>%rsp</code> 是一个特殊的寄存器<strong>栈指针寄存器</strong>，<mark>它始终指向<strong>栈顶 (Stack Top)</strong></mark>。</li><li>“栈顶”指的是当前栈上<mark><em>最低</em></mark>的内存地址（即最后压入的数据所在的位置）。</li></ul></li></ul><h3 id="栈操作-Stack-Operations"><strong>栈操作 (Stack Operations)</strong></h3><ul><li><strong><code>pushq Src</code> (压栈)</strong>:<ol><li>从 <code>Src</code> 获取操作数。</li><li>将 <code>%rsp</code> 减 8 (因为栈向低地址增长)。</li><li>将操作数写入到 <code>%rsp</code> 指向的新地址。</li></ol></li><li><strong><code>popq Dest</code> (出栈)</strong>:<ol><li>从 <code>%rsp</code> 指向的地址读取值。</li><li>将 <code>%rsp</code> 加 8。</li><li>将读取的值写入到 <code>Dest</code> (通常是一个寄存器)。</li></ol></li></ul><h2 id="3-3-调用约定-Calling-Conventions"><strong>3.3 调用约定 (Calling Conventions)</strong></h2><p><code>调用约定 (Calling Conventions)</code> 是一套必须遵守的规则，它详细规定了过程调用如何实现。</p><h3 id="1-传递控制-Passing-Control"><strong>1. 传递控制 (Passing Control)</strong></h3><p>控制流的传递依赖于 <code>栈 (Stack)</code> 和两条关键指令：</p><ul><li><strong><code>call label</code> <code>label</code>为地址 (过程调用)</strong>:<ol><li>将<strong>返回地址 (Return Address)</strong> 压入栈中。（返回地址是 <code>call</code> 指令<em>之后</em>的那条指令的地址）。</li><li>无条件跳转 (Jump) 到 <code>label</code> 处。</li></ol></li><li><strong><code>ret</code> (过程返回)</strong>:<ol><li>从栈顶弹出一个地址（这个地址就是之前 <code>call</code> 压入的返回地址）。</li><li>无条件跳转到这个弹出的地址。</li></ol></li></ul><p>这个例子逐步展示了在一次函数调用中，<code>call</code> 和 <code>ret</code> 指令如何利用栈 (Stack) 来精确地转移程序控制权。</p><p>这其中涉及两个关键寄存器：</p><ul><li><strong>%rsp (栈指针)</strong>: 始终指向栈顶。</li><li><strong>%rip (程序计数器)</strong>: 始终指向下一条要执行的指令。</li></ul><p><strong>场景</strong>: 程序即将从 <code>multstore</code> 函数内部调用 <code>mult2</code> 函数。</p><p><strong><code>call 0x400550 &lt;mult2&gt;</code> 指令执行时，会发生两件核心事情：</strong></p><ol><li><strong>压入返回地址</strong>：<ul><li><code>call</code> 指令会查找它<mark>后面紧跟着的那条指令的地址</mark> (在这个例子中是 <code>0x400549</code>)。</li><li>它将这个 “返回地址” 压入 (push) 栈顶。</li><li>因此，栈指针 <code>%rsp</code> 的值会<strong>减少</strong> 8 字节 (例如，从 <code>0x120</code> 变为 <code>0x118</code>)，指向这个新压入的返回地址。</li></ul></li><li><strong>跳转</strong>：<ul><li>程序计数器 <code>%rip</code> 的值被更新为 <code>call</code> 指令的目标地址，即 <code>mult2</code> 函数的起始地址 <code>0x400550</code>。</li></ul></li></ol><p><strong>结果</strong>: 程序控制权跳转到了 <code>mult2</code> 函数，并且栈上保存了&quot;返回票根&quot;（即返回地址），以便稍后能正确返回。</p><p><strong>场景</strong>: <code>mult2</code> 函数已经执行完毕，即将执行其最后一条 <code>ret</code> (返回) 指令。</p><p><strong>此时的状态：</strong></p><ul><li>程序计数器 <code>%rip</code> 指向 <code>ret</code> 指令本身的地址 (<code>0x400557</code>)。</li><li>栈指针 <code>%rsp</code> 仍然是 <code>0x118</code>，栈顶仍然保存之前存入的返回地址 <code>0x400549</code>。</li></ul><p><strong>场景</strong>: <code>ret</code> 指令被执行。</p><p><strong><code>ret</code> 指令会执行与 <code>call</code> 相反的操作：</strong></p><ol><li><strong>弹出返回地址</strong>:<ul><li><code>ret</code> 指令从栈顶弹出 (pop) 一个值。在这个例子中，它弹出了 <code>0x400549</code>。</li><li>因此，栈指针 <code>%rsp</code> 的值会<strong>增加</strong> 8 字节 (例如，从 <code>0x118</code> 恢复为 <code>0x120</code>)，栈被&quot;清理&quot;干净。</li></ul></li><li><strong>跳转</strong>:<ul><li>程序计数器 <code>%rip</code> 的值被更新为刚刚从栈中弹出的那个地址，即 <code>0x400549</code>。</li></ul></li></ol><p><strong>结果</strong>: 程序控制权无缝地返回到了 <code>multstore</code> 函数中，并从 <code>call</code> 指令的下一行 (<code>0x400549</code> 处) 继续执行。</p><h3 id="2-传递数据-Passing-Data"><strong>2. 传递数据 (Passing Data)</strong></h3><ul><li><strong>传递参数 (Arguments)</strong>:<ul><li><strong>前 6 个</strong> 整数或指针参数按顺序使用<mark>寄存器</mark>传递：<ol><li><code>%rdi</code></li><li><code>%rsi</code></li><li><code>%rdx</code></li><li><code>%rcx</code></li><li><code>%r8</code></li><li><code>%r9</code></li></ol></li><li><strong>第 7 个及以后</strong>的参数通过 <code>栈 (Stack)</code> 传递。</li></ul></li><li><strong>返回数据 (Return Value)</strong>:<ul><li>返回值（如果是整数或指针）<strong>总是通过 <mark><code>%rax</code></mark> 寄存器</strong>返回。</li></ul></li></ul><h3 id="3-管理本地数据-Managing-Local-Data"><strong>3. 管理本地数据 (Managing Local Data)</strong></h3><p>支持递归 (Recursion) 的语言（如C, Java）要求过程的代码是<strong>可重入的 (Reentrant)</strong>。这意味着一个过程可以调用它自己，而不会破坏上一次调用的状态。</p><p>这是通过为<mark><strong>每一次过程调用</strong>（每一个实例）</mark>分配一个私有的内存区域来实现的，而不是为每一个函数分配一个内存空间，这个区域称为<strong>栈帧 (Stack Frame)</strong>。</p><p>一个“栈帧”就是当一个函数（过程）被调用时，在栈上为它分配的一块专属内存区域，用来存放它运行所需的所有本地信息。</p><p>这张图解从上到下（从高内存地址到低内存地址）展示了栈的结构，分为两个部分：<strong>“Caller Frame” (调用者栈帧)</strong> 和 <strong>“Current Stack Frame” (当前栈帧)</strong>。</p><p>下面是 <strong>“当前栈帧”</strong> 各部分的详细讲解（按压栈顺序，从高地址到低地址）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs text">高地址 (High Address)<br>        |<br>+------------------------------+<br>| ...                          |<br>| A 的局部变量                 |<br>+------------------------------+ &lt;--- A 的栈帧结束<br>| 参数 8 (为 B 准备)           |  \<br>| 参数 7 (为 B 准备)           |   &#125;  B 的“输入” (Arguments 7+ for B)<br>+------------------------------+  /<br>| 返回地址 (Return Address)    |<br>+&lt;mark&gt;=&lt;/mark&gt;&lt;mark&gt;=&lt;/mark&gt;&lt;mark&gt;=&lt;/mark&gt;&lt;mark&gt;=&lt;/mark&gt;&lt;mark&gt;=&lt;/mark&gt;&lt;mark&gt;=&lt;/mark&gt;+ &lt;--- 分界线：B 的栈帧开始 (B&#x27;s Frame)<br>| 保存的寄存器 (Saved Regs)    |<br>| B 的局部变量 (Local Vars)    |<br>| ...                         |<br>+------------------------------+<br>| 参数 7 (为 C 准备)           |  \<br>| 参数 8 (为 C 准备)           |   &#125;  B 的“输出” (Argument Build Area)<br>+------------------------------+  /<br>        |<br>      低地址 (Low Address)    &lt;--- %rsp (栈顶指针)<br></code></pre></td></tr></table></figure><ol><li>Arguments 7+ (第7个及以上的参数)<ul><li>这是由<strong>调用者 (Caller)</strong> 放入的。</li><li>根据调用约定，前6个参数通过寄存器传递，而第7个、第8个等后续参数则在调用 <code>call</code> 指令<em>之前</em>被压入栈中，存放在这里。</li></ul></li><li>Return Addr (返回地址)<ul><li>这是由 <code>call</code> 指令<strong>自动</strong>压入栈中的。</li><li>它保存了 <code>call</code> 指令的<em>下一条</em>指令的地址。当当前函数执行 <code>ret</code> 指令时，CPU会从这里弹出地址，并跳转回去，从而实现函数返回。</li></ul></li><li>Old <code>%rbp</code> (旧的 <code>%rbp</code>, 可选)<ul><li>这是<strong>当前栈帧的开始</strong>。</li><li>如果当前函数需要使用 <code>%rbp</code> 作为帧指针（基址指针），它执行的第一件事就是 <code>pushq %rbp</code>，将<em>调用者</em>的 <code>%rbp</code> 值保存在这里。</li></ul></li><li>Saved Registers + Local Variables (保存的寄存器 + 局部变量)<ul><li>这是栈帧的主体部分。</li><li><strong>Saved Registers</strong>: 如果当前函数需要使用任何“被调用者保存 (Callee-Saved)”的寄存器（如 <code>%rbx</code>, <code>%r12-%r15</code>），它必须在修改它们之前，先把它们的原始值保存在这里。</li><li><strong>Local Variables</strong>: 当函数的局部变量太多，寄存器不够用时，或者当有数组、结构体等大型局部变量时，它们会被存放在这里。</li></ul></li><li>Argument Build (参数构造区, 可选)<ul><li>这是当前栈帧的<strong>最顶部</strong>（即最低的内存地址）。</li><li>如果当前函数<em>自己</em>需要调用另一个函数，它就会在这里准备传递给那个新函数的参数。</li><li>例如，如果它要调用的函数需要8个参数，它会把第7个和第8个参数放在这里，然后再执行 <code>call</code>。</li></ul></li></ol><ul><li><strong>%rsp (栈指针)</strong><ul><li>始终指向<strong>栈顶</strong>（即栈上已使用内存的最低地址）。在图中，它指向 “Argument Build” 区域的底部。</li><li>它会随着 <code>pushq</code> (减小) 和 <code>popq</code> (增大) 或 <code>subq</code> / <code>addq</code> 指令而<strong>动态变化</strong>。</li></ul></li><li><strong>%rbp (帧指针, 可选)</strong><ul><li>如果使用，它会在函数开始时被设置为指向一个<strong>固定位置</strong>（即 “Old %rbp” 的存放位置）。</li><li><strong>它的好处是</strong>：即使 <code>%rsp</code> 因为构造参数等操作而移动，<code>%rbp</code> 仍然保持不变，使得编译器可以用固定的偏移量（如 <code>-8(%rbp)</code> 访问局部变量, <code>+16(%rbp)</code> 访问参数）来访问栈帧中的数据。</li><li><code>%rbp</code> 寄存器随后会更新，指向这个位置，为访问局部变量和参数提供一个固定的基准点。</li><li><strong>逻辑上</strong>，利用保存的 <code>Old %rbp</code> 构建了一个“链表”，让我们能回溯函数的调用历史。当前函数的 <code>%rbp</code>指向当前栈帧的基准点（就是存放 <code>Old %rbp</code> 的那个地址）。这个地址里存的值（即 <code>Old %rbp</code> 的内容）是指向<strong>上一个栈帧</strong>基准点的指针。</li></ul></li></ul><div class="note note-info">            <p>在现代 x86-64 架构中，<code>%rbp</code> 不再强制作为栈帧基准，主要出于以下优化考虑：</p><p><strong>1. 现代编译器的静态分析能力 (通过 <code>%rsp</code> 寻址)</strong></p><ul><li><strong>旧机制</strong>：过去因为 <code>%rsp</code> 会随压栈/出栈频繁变动，必须用 <code>%rbp</code> 作为一个固定锚点来定位局部变量（如 <code>-8(%rbp)</code>）。</li><li><strong>新机制</strong>：现代编译器非常智能，能够在编译时<strong>静态计算</strong>出任意时刻 <code>%rsp</code> 相对于局部变量的偏移量。因此，直接使用 <code>%rsp</code> 寻址（如 <code>8(%rsp)</code>）即可，不再需要固定的 <code>%rbp</code>。</li></ul><p><strong>2. 节省宝贵的寄存器资源</strong></p><ul><li>x86-64 只有 16 个通用寄存器。如果不强制 <code>%rbp</code> 做帧指针，它可以被当作<strong>第 17 个通用寄存器</strong>使用，用于存储普通变量，从而提升性能。</li><li>这种优化通常通过编译器选项 <code>-fomit-frame-pointer</code> 开启。</li></ul><p><strong>3. 必须使用 <code>%rbp</code> 的特殊情况</strong><br>虽然通常是可选的，但在以下场景中仍<strong>必须</strong>或<strong>建议</strong>使用：</p><ul><li><strong>变长数组 (VLA) / <code>alloca()</code></strong>：当栈帧大小在编译期无法确定（动态变化）时，编译器无法计算相对于 <code>%rsp</code> 的固定偏移量，<strong>必须</strong>依赖 <code>%rbp</code> 记录栈帧起始位置。<em>只有C99标准支持，标准C++不支持</em></li><li><strong>调试与回溯</strong>：保留 <code>%rbp</code> 链表结构能让调试器（如 GDB）更轻松、直观地解析函数调用栈（Backtrace）。</li></ul>          </div><h3 id="4-寄存器保存约定-Register-Saving-Conventions"><strong>4. 寄存器保存约定 (Register Saving Conventions)</strong></h3><p><strong>问题</strong>: 当一个过程（<code>Caller</code>, 调用者）调用另一个过程（<code>Callee</code>, 被调用者）时，<code>Callee</code> 可能会修改 <code>Caller</code> 稍后还需要使用的寄存器。</p><p><strong>解决方案</strong>: x86-64 规定了一套寄存器保存约定：</p><ul><li><p><strong>调用者保存 (Caller-Saved)</strong>:</p><ul><li>寄存器: <code>%rax</code>, <code>%rdi</code>, <code>%rsi</code>, <code>%rdx</code>, <code>%rcx</code>, <code>%r8</code>, <code>%r9</code>, <code>%r10</code>, <code>%r11</code>。</li><li>规则: <code>Caller</code> (调用者) 必须假设 <code>Callee</code> (被调用者) 会<em>破坏</em>这些寄存器的内容。</li><li>行动: 如果 <code>Caller</code> 在 <code>call</code> 之后还需要这些寄存器中的值，<code>Caller</code> 必须自己在 <code>call</code> 指令<em>之前</em>将它们保存（例如压入栈中），并在 <code>call</code> <em>之后</em>恢复它们。</li></ul></li><li><p><strong>被调用者保存 (Callee-Saved)</strong>:</p><ul><li>寄存器: <code>%rbx</code>, <code>%rbp</code>, <code>%r12</code>, <code>%r13</code>, <code>%r14</code>, <code>%r15</code>。</li><li>规则: <code>Caller</code> (调用者) 可以假设 <code>Callee</code> (被调用者) 在返回时会<em>保持</em>这些寄存器的值不变。</li><li>行动: 如果 <code>Callee</code> 需要使用这些寄存器，它必须在<em>使用前</em>保存它们的原始值（通常是压入栈中），并在 <code>ret</code> 指令<em>之前</em>将它们恢复。</li></ul></li><li><p><code>%rsp</code> 是特殊的，它必须在 <code>Callee</code> 返回时被正确恢复。</p></li></ul><h2 id="3-4-递归-Recursion-的实现">3.4 递归 (Recursion) 的实现</h2><p>在 Y86-64 与 x86-64 体系结构中，递归函数的实现<strong>不需要任何特殊的硬件指令支持</strong>。它完全依赖于标准的函数调用机制，即利用栈 (Stack) 的特性和软件层面的调用约定。</p><h3 id="1-核心机制-Core-Mechanisms">1. 核心机制 (Core Mechanisms)</h3><p>递归能够正常工作，主要得益于以下三个基石：</p><ul><li><strong>栈帧 (Stack Frames)</strong>:<ul><li>每次函数调用（即使是调用自身）都会在栈上分配一段<strong>私有的存储空间</strong>。</li><li>这保证了不同层级的递归（例如 <code>pcount_r(2)</code> 和 <code>pcount_r(1)</code>）虽然运行同一段代码，但拥有独立的局部变量和返回地址，互不干扰。</li></ul></li><li><strong>寄存器保存约定 (Register Saving Conventions)</strong>:<ul><li>这是递归中数据“存活”的关键。</li><li><strong>被调用者保存 (Callee-Saved)</strong> 寄存器（如 <code>%rbx</code>）确保了当内层递归返回时，外层函数保存在其中的临时数据（如当前的计算结果）依然保持原样。</li></ul></li><li><strong>栈的 LIFO 特性</strong>:<ul><li>栈的“后进先出”规则与函数调用的 <code>call / ret</code> 模式（P调用Q，Q必须在P之前返回）完美契合。</li></ul></li></ul><h3 id="2-实例分析：统计置位位数-pcount-r">2. 实例分析：统计置位位数 (<code>pcount_r</code>)</h3><p>这个例子展示了如何利用 <strong>Callee-Saved 寄存器 (%rbx)</strong> 在递归调用之间保存局部状态。</p><h4 id="2-1-C-语言源代码">2.1 C 语言源代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">long</span> <span class="hljs-title function_">pcount_r</span><span class="hljs-params">(<span class="hljs-type">unsigned</span> <span class="hljs-type">long</span> x)</span> &#123;<br>    <span class="hljs-keyword">if</span> (x == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>    <span class="hljs-comment">// 逻辑拆解：</span><br>    <span class="hljs-comment">// 1. 计算 (x &amp; 1)。这个值必须保存下来，等待递归返回。</span><br>    <span class="hljs-comment">// 2. 递归调用 pcount_r(x &gt;&gt; 1)。</span><br>    <span class="hljs-comment">// 3. 将两部分结果相加。</span><br>    <span class="hljs-keyword">return</span> (x &amp; <span class="hljs-number">1</span>) + pcount_r(x &gt;&gt; <span class="hljs-number">1</span>);<br>&#125;<br>````<br><br>#### <span class="hljs-number">2.2</span> 汇编实现详解<br><br><br>```Code snippet<br>pcount_r:<br>    # --- <span class="hljs-number">1.</span> 保存现场 (Prologue) ---<br>    pushq %rbx           # 【关键步骤】<br>                         # %rbx 是 Callee-Saved 寄存器。<br>                         # 在使用它之前，必须把调用者(上一层)的值压栈保存。<br>                         # 这为当前层创建了一个安全的私有寄存器空间。<br><br>    movq %rdi, %rbx      # 将参数 x 复制到 %rbx，方便后续操作。<br><br>    # --- <span class="hljs-number">2.</span> 局部计算 ---<br>    andl $<span class="hljs-number">1</span>, %ebx        # 计算 %rbx = x &amp; <span class="hljs-number">1</span>。<br>                         # 此时，%rbx 保存的是当前这一位的计算结果。<br>                         # 因为它在 Callee-Saved 寄存器中，所以即使下面发生了 call，<br>                         # 这个值也不会被覆盖。<br><br>    shrq %rdi            # 计算 x &gt;&gt; <span class="hljs-number">1</span>。<br>                         # 更新 %rdi，作为传给下一层递归的参数。<br><br>    # --- <span class="hljs-number">3.</span> 递归调用 (Recursive Call) ---<br>    testq %rbx, %rbx     # (可选优化) 检查 x 是否为 <span class="hljs-number">0</span>，处理基准情况<br>    je .L_return_zero    # 如果是<span class="hljs-number">0</span>，跳转处理（省略具体代码，聚焦递归流）<br><br>    call pcount_r        # 【递归发生】<br>                         # 此时当前函数暂停，控制权交给下一层。<br>                         # 关键：下一层也会遵守约定先 pushq %rbx，<br>                         # 所以我们放在 %rbx 里的 (x&amp;<span class="hljs-number">1</span>) 是绝对安全的。<br><br>    # --- <span class="hljs-number">4.</span> 恢复与累加 (Accumulate) ---<br>    # 当 call 返回时：<br>    # %rax = pcount_r(x&gt;&gt;<span class="hljs-number">1</span>) 的返回值 (由下一层计算得出)<br>    # %rbx = (x &amp; <span class="hljs-number">1</span>) 的值 (我们之前算好并保存住的)<br><br>    addq %rbx, %rax      # 结果 = 当前位(x&amp;<span class="hljs-number">1</span>) + 剩余位统计(%rax)<br><br>    # --- <span class="hljs-number">5.</span> 恢复现场 (Epilogue) ---<br>    popq %rbx            # 【关键步骤】<br>                         # 函数返回前，必须将栈里保存的旧 %rbx 弹回寄存器。<br>                         # 做到“借用完原样归还”，不破坏上一层的数据。<br>    ret<br><br>.L_return_zero:<br>    movl $<span class="hljs-number">0</span>, %eax<br>    popq %rbx            # 即使是基准情况返回，也要配对 pop<br>    ret<br></code></pre></td></tr></table></figure><h3 id="3-为什么必须保存寄存器？-Deep-Dive">3. 为什么必须保存寄存器？(Deep Dive)</h3><ul><li><strong>问题</strong>: 为什么不能把 <code>(x &amp; 1)</code> 的结果存在 <code>%rdx</code> 或 <code>%rcx</code> 这种 Caller-Saved 寄存器里？</li><li><strong>原因</strong>: <code>Caller-Saved</code> 寄存器属于“临时工”。当你执行 <code>call pcount_r</code> 时，下一层函数有权随意修改 <code>%rdx</code> 的值。等你从 <code>call</code> 回来时，<code>%rdx</code> 里的数据可能已经变了。</li><li><strong>解决</strong>: 必须使用 <code>Callee-Saved</code> 寄存器（如 <code>%rbx</code>）。约定强制要求：<strong>不管下一层函数怎么运行，它在返回时必须保证 <code>%rbx</code> 的值与调用前一模一样</strong>（通过它自己的 push/pop 实现）。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-3-procedures/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-3-procedures/"/>
    <published>2026-01-14T17:55:00.000Z</published>
    <summary>机器级编程 III: 过程 (Procedures)</summary>
    <title>CSAPP - 03.Machine-Level Programming III</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h1>机器级编程 II：算数与控制 (Machine-Level Programming II: Arithmetic &amp; Control)</h1><blockquote><p>真正的程序员可以用任何语言编写汇编代码。(REAL PROGRAMMERS CAN WRITE ASSEMBLY CODE IN ANY LANGUAGE.)</p><p>— Larry Wall, 美国程序员 (American Programmer)</p></blockquote><div class="note note-success 核心导读：从“结构化”到“线性跳转”">            <p><strong>主要内容</strong>：<br>本章关注计算机如何实现逻辑控制。包括：</p><ol><li><strong>条件码 (Condition Codes)</strong>：CPU 如何通过 <code>ZF</code>, <code>SF</code> 等标志位记住上一次计算的结果。</li><li><strong>跳转指令 (Jumps)</strong>：汇编中没有 <code>if</code> 和 <code>while</code>，只有 <code>goto</code> (即 <code>jmp</code>/<code>je</code>)。</li><li><strong>翻译控制结构</strong>：详细讲解了 C 语言中的 <code>if-else</code>、<code>while</code>、<code>for</code> 和 <code>switch</code> 是如何被“降维打击”成汇编中的条件跳转和跳转表的。</li></ol><p><strong>Motivation</strong>：<br>高级语言有优雅的结构（如循环、分支），但底层硬件非常“笨”，只会按顺序执行或跳转。理解这一章，你就能明白<strong>编译器是如何“欺骗”硬件来模拟复杂逻辑的</strong>，也能理解为什么某些写法（如 switch 跳转表）会比其他写法更快。</p>          </div><p><strong>今日主题 (Today)</strong></p><ul><li>控制：条件码 (Control: Condition codes)</li><li>条件分支 (Conditional branches)</li><li>循环 (Loops)</li><li>Switch 语句 (Switch Statements)</li></ul><h2 id="2-1-控制流-Control-Flow">2.1 控制流 (Control Flow)</h2><p>高级语言使用 <code>if/else</code> 这样的控制结构，但汇编只有跳转 (jumps)。</p><p><strong>C 代码 (C Code) 示例:</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">extern</span> <span class="hljs-type">void</span> <span class="hljs-title function_">op1</span><span class="hljs-params">(<span class="hljs-type">void</span>)</span>;<br><span class="hljs-keyword">extern</span> <span class="hljs-type">void</span> <span class="hljs-title function_">op2</span><span class="hljs-params">(<span class="hljs-type">void</span>)</span>;<br><span class="hljs-type">void</span> <span class="hljs-title function_">decision</span><span class="hljs-params">(<span class="hljs-type">int</span> x)</span> &#123;<br>  <span class="hljs-keyword">if</span> (x) &#123; <span class="hljs-comment">// (x != 0)</span><br>    op1();<br>  &#125;<br>  <span class="hljs-keyword">else</span> &#123;<br>    op2();<br>  &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>汇编 (Assembly) 中的控制流:</strong></p><figure class="highlight plaintext"><figcaption><span>snippet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs Code">decision:<br>  subq    $8, %rsp     <br>  testl   %edi, %edi   ; 测试 x (在 %edi 中)。设置标志位。<br>  je      .L2          ; 如果相等 (if x == 0) 则跳转到 .L2<br>  call    op1          ; (then 块): 调用 op1<br>  jmp     .L1          ; 无条件跳转到 .L1 (跳过 else)<br>.L2:<br>  call    op2          ; (else 块): 调用 op2<br>.L1:<br>  addq    $8, %rsp     <br>  ret                  <br></code></pre></td></tr></table></figure><ul><li>这一切都是用 <strong>GOTO</strong> (跳转) 完成的！</li></ul><h3 id="处理器状态-Processor-State-x86-64-部分">处理器状态 (Processor State) (x86-64, 部分)</h3><p>这是关于当前执行程序的信息。</p><ul><li><strong>寄存器 (Registers):</strong> 临时数据 (Temporary data)<ul><li><code>%rax</code>, <code>%rbx</code>, <code>%rcx</code>, <code>%rdx</code>, <code>%rsi</code>, <code>%rdi</code>, <code>%rbp</code>, <code>%rsp</code></li><li><code>%r8</code> - <code>%r15</code></li></ul></li><li><strong>指令指针 (Instruction pointer) (<code>%rip</code>):</strong><ul><li>当前代码控制点的位置 (Location of current code control point)</li></ul></li><li><strong>条件码 (Condition codes):</strong><ul><li><code>CF</code>, <code>ZF</code>, <code>SF</code>, <code>OF</code></li><li>最近测试的状态 (Status of recent tests)</li></ul></li></ul><h3 id="条件码-Condition-Codes-隐式设置">条件码 (Condition Codes) (隐式设置)</h3><p>这些是单位寄存器 (Single bit registers)，它们作为算术操作（例如 <code>addq</code>）的副作用被隐式设置。</p><ul><li><strong><code>CF</code> (Carry Flag):</strong> <mark>进位标志</mark> (用于无符号数)<ul><li>如果最高有效位 (most significant bit) 产生进位（无符号溢出），则设置。</li><li>在执行<strong>减法</strong>操作（如 <code>sub</code> 或 <code>cmp</code>）时，它充当的是 <strong>借位标志 (Borrow Flag)</strong>。</li></ul></li><li><strong><code>ZF</code> (Zero Flag):</strong> <mark>零标志</mark><ul><li>如果结果 <code>t == 0</code>，则设置。</li></ul></li><li><strong><code>SF</code> (Sign Flag):</strong> <mark>符号标志</mark> (用于有符号数)<ul><li>如果结果 <code>t &lt; 0</code>（作为有符号数），则设置。</li></ul></li><li><strong><code>OF</code> (Overflow Flag):</strong> <mark>溢出标志</mark> (用于有符号数)<ul><li>如果发生二补数（有符号）溢出，则设置。</li><li><code>(a&gt;0 &amp;&amp; b&gt;0 &amp;&amp; t&lt;0) || (a&lt;0 &amp;&amp; b&lt;0 &amp;&amp; t&gt;=0)</code></li></ul></li></ul><p><strong>注意:</strong> <code>lea</code> (Load Effective Address) 指令<strong>不会</strong>设置条件码。</p><h3 id="显式设置">显式设置</h3><ul><li><strong><code>cmp a, b</code></strong><ul><li>计算 <code>b - a</code>（就像 <code>sub</code>），但是<code>sub</code>指令会将结果（差）放在<code>b</code>中，但是<code>cmp</code>不会。</li><li>根据结果设置条件码<ul><li>在 AT&amp;T 语法（即 <code>Instruction Source, Destination</code>）中，条件跳转指令的阅读顺序通常是<strong>从右往左</strong>读，或者说是<strong>第二个操作数 与 第一个操作数 比较</strong></li></ul></li><li>用于 <code>if (a &lt; b)</code> 这样的判断</li></ul></li><li><strong><code>test a, b</code></strong><ul><li>计算 <code>b &amp; a</code>（就像 <code>and</code>），区别在于<strong>不改变</strong> <code>b</code></li><li>根据结果设置条件码（主要是 <code>SF</code> 和 <code>ZF</code>）</li><li><strong>最常见用途:</strong> <code>test %rX, %rX</code>，用于比较 <code>%rX</code> 和 0</li></ul></li></ul><h3 id="条件码小结">条件码小结</h3><ul><li><strong>构成:</strong> 四个标识 (Four flags): <code>CF</code>, <code>ZF</code>, <code>SF</code>, <code>OF</code></li><li><strong>设置方法:</strong><ul><li>显式 (Explicit): <code>CMP</code> 与 <code>TEST</code></li><li>隐式 (Implicit): 算术运算 (Arithmetic operations)</li></ul></li><li><strong>访问方法:</strong><ul><li>显式 (Explicit): <code>SET</code> 指令 (SET instructions)</li><li>隐式 (Implicit): 条件跳转 (Conditional jumps)、条件赋值 (Conditional moves)</li></ul></li></ul><h2 id="2-2-条件分支（Conditional-branches）">2.2 条件分支（Conditional branches）</h2><h3 id="访问条件码：Jumping-jX">访问条件码：Jumping (jX)</h3><p><code>jX</code> 指令根据条件码跳转到代码的不同部分。</p><table><thead><tr><th><strong>指令 (Instruction)</strong></th><th><strong>条件 (Condition)</strong></th><th><strong>描述 (Description)</strong></th></tr></thead><tbody><tr><td><code>jmp</code></td><td><code>1</code></td><td>无条件 (Unconditional)</td></tr><tr><td><code>je</code></td><td><code>ZF</code></td><td>相等 / 零 (Equal / Zero)</td></tr><tr><td><code>jne</code></td><td><code>~ZF</code></td><td>不相等 / 非零 (Not Equal / Not Zero)</td></tr><tr><td><code>js</code></td><td><code>SF</code></td><td>负数 (Negative)</td></tr><tr><td><code>jns</code></td><td><code>~SF</code></td><td>非负数 (Nonnegative)</td></tr><tr><td><code>jg</code></td><td><code>~(SF^OF) &amp; ~ZF</code></td><td>大于 (Greater) (有符号)</td></tr><tr><td><code>jge</code></td><td><code>~(SF^OF)</code></td><td>大于或等于 (Greater or Equal) (有符号)</td></tr><tr><td><code>jl</code></td><td><code>(SF^OF)</code></td><td>小于 (Less) (有符号)</td></tr><tr><td><code>jle</code></td><td><code>(SF^OF) | ZF</code></td><td>小于或等于 (Less or Equal) (有符号)</td></tr><tr><td><code>ja</code></td><td><code>~CF &amp; ~ZF</code></td><td>高于 (Above) (无符号)</td></tr><tr><td><code>jb</code></td><td><code>CF</code></td><td>低于 (Below) (无符号)</td></tr></tbody></table><h3 id="访问条件码：Setting-setX">访问条件码：Setting (setX)</h3><p><code>setX</code> 指令根据条件码的组合将目标的低位<strong>字节</strong> (low-order byte) 设置为 0 或 1。</p><ul><li>它<strong>不会改变寄存器中剩余的 7 个字节</strong>。</li><li><code>setX</code> 的参数总是一个<strong>低位字节寄存器</strong>（如 <code>%al</code>, <code>%r8b</code> 等）。</li></ul><table><thead><tr><th><strong>指令 (Instruction)</strong></th><th><strong>条件 (Condition)</strong></th><th><strong>描述 (Description)</strong></th></tr></thead><tbody><tr><td><code>sete</code></td><td><code>ZF</code></td><td>相等 / 零 (Equal / Zero)</td></tr><tr><td><code>setne</code></td><td><code>~ZF</code></td><td>不相等 / 非零 (Not Equal / Not Zero)</td></tr><tr><td><code>sets</code></td><td><code>SF</code></td><td>负数 (Negative)</td></tr><tr><td><code>setns</code></td><td><code>~SF</code></td><td>非负数 (Nonnegative)</td></tr><tr><td><code>setg</code></td><td><code>~(SF^OF) &amp; ~ZF</code></td><td>大于 (Greater) (有符号)</td></tr><tr><td><code>setge</code></td><td><code>~(SF^OF)</code></td><td>大于或等于 (Greater or Equal) (有符号)</td></tr><tr><td><code>setl</code></td><td><code>(SF^OF)</code></td><td>小于 (Less) (有符号)</td></tr><tr><td><code>setle</code></td><td><code>(SF^OF) | ZF</code></td><td>小于或等于 (Less or Equal) (有符号)</td></tr><tr><td><code>seta</code></td><td><code>~CF &amp; ~ZF</code></td><td>高于 (Above) (无符号)</td></tr><tr><td><code>setb</code></td><td><code>CF</code></td><td>低于 (Below) (无符号)</td></tr></tbody></table><h4 id="setX-指令示例"><code>setX</code> 指令示例</h4><p><code>movzbl</code> (Move Zero-Extend Byte to Long) 通常在 <code>setX</code> 之后使用，以将 32 位寄存器的高位清零。</p><p><strong>C 代码 (C Code):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">int</span> <span class="hljs-title function_">gt</span> <span class="hljs-params">(<span class="hljs-type">long</span> x, <span class="hljs-type">long</span> y)</span><br>&#123;<br>  <span class="hljs-keyword">return</span> x &gt; y;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>汇编 (Assembly Code):</strong></p><figure class="highlight plaintext"><figcaption><span>snippet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs Code">; %rdi = x, %rsi = y<br>  cmpq    %rsi, %rdi  ; 比较 x:y<br>  setg    %al         ; 如果 &gt; (Greater) 则设置 %al<br>  movzbl  %al, %eax   ; 将 %al 零扩展到 %eax (清零 %rax 的其余部分)<br>  ret<br></code></pre></td></tr></table></figure><ul><li><code>movzbl %al, %eax</code> 将 <code>%al</code> 中的 1 字节结果移动到 4 字节的 <code>%eax</code>，并将高 3 字节填充为 0。这也将 64 位 <code>%rax</code>寄存器的高 4 字节清零。</li><li>在 x86-64 架构中，<strong>任何向 32 位寄存器（如 <code>%eax</code>）写入的操作，都会自动将高 32 位（即 <code>%rax</code> 的高半部分）全部清零。</strong></li></ul><h3 id="条件分支示例-Conditional-Branch-Example">条件分支示例 (Conditional Branch Example)</h3><p><strong>C 代码 (C Code):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> <span class="hljs-title function_">absdiff</span><span class="hljs-params">(<span class="hljs-type">long</span> x, <span class="hljs-type">long</span> y)</span><br>&#123;<br>  <span class="hljs-type">long</span> result;<br>  <span class="hljs-keyword">if</span> (x &gt; y)<br>    result = x - y;<br>  <span class="hljs-keyword">else</span><br>    result = y - x;<br>  <span class="hljs-keyword">return</span> result;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>汇编 (Assembly) (使用分支):</strong></p><figure class="highlight plaintext"><figcaption><span>snippet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs Code">; %rdi = x, %rsi = y, %rax = 返回值 (Return value)<br>absdiff:<br>  cmpq    %rsi, %rdi  ; 比较 x:y<br>  jle     .L4         ; 如果 x &lt;= y, 跳转到 .L4<br>  movq    %rdi, %rax  ; result = x<br>  subq    %rsi, %rax  ; result = x - y<br>  ret                 <br>.L4:<br>  ; x &lt;= y<br>  movq    %rsi, %rax  ; result = y<br>  subq    %rdi, %rax  ; result = y - x<br>  ret                 <br></code></pre></td></tr></table></figure><h4 id="用-Goto-代码表达-Expressing-with-Goto-Code">用 Goto 代码表达 (Expressing with Goto Code)</h4><p>C 语言允许 <code>goto</code> 语句。编译器实质上是将 <code>if-else</code> 结构翻译成基于 <code>goto</code> 的版本。</p><p><strong><code>goto</code> 版本 (编译器视角):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> result;<br><span class="hljs-type">int</span> ntest = (x &lt;= y);<br><span class="hljs-keyword">if</span> (ntest) <span class="hljs-keyword">goto</span> Else;<br>result = x - y;<br><span class="hljs-keyword">goto</span> Done;<br><br>Else:<br>  result = y - x;<br>Done:<br>  <span class="hljs-keyword">return</span> result;<br></code></pre></td></tr></table></figure><h3 id="结构化编程-Structured-Programming">结构化编程 (Structured Programming)</h3><ul><li>1968年，Edsger Dijkstra 写了“Go To Statement Considered Harmful”（Go To 语句被认为有害）的里程碑式论文。</li><li>他认为 <code>goto</code> 语句会导致“面条式代码” (spaghetti code)，使程序难以理解。</li><li>新语言引入了用于受控分支 (controlled branching) 的结构：<ul><li><code>if / else-if / else</code> 和 <code>switch</code> 语句</li><li><code>while</code> 和 <code>for</code> 循环</li></ul></li></ul><h4 id="通用条件表达式翻译-使用分支">通用条件表达式翻译 (使用分支)</h4><p>C 代码 (C Code) (三元运算符):<code>val = Test ? Then_Expr : Else_Expr;</code><br><strong>Goto 版本 (Goto Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs C">ntest = !Test;<br><span class="hljs-keyword">if</span> (ntest) <span class="hljs-keyword">goto</span> Else;<br>val = Then_Expr;<br><span class="hljs-keyword">goto</span> Done;<br>Else:<br>val = Else_Expr;<br>Done:<br></code></pre></td></tr></table></figure><p>这为 <code>then</code> 和 <code>else</code> 表达式创建了单独的代码区域，并执行适当的一个。</p><h3 id="使用条件移动-Using-Conditional-Moves">使用条件移动 (Using Conditional Moves)</h3><ul><li><strong>条件移动指令 (Conditional Move Instructions)</strong> (<code>cmovX</code>) 提供了分支 (branching) 的替代方案。</li><li>指令支持：<code>if (Test) Dest = Src</code>。</li><li><strong>为何使用它们?</strong><ul><li>分支 (Branches) 对现代处理器的指令流水线 (pipelines) 具有非常大的干扰性。</li><li>条件移动不需要控制转移 (control transfer)。</li></ul></li></ul><h4 id="条件移动-Conditional-Move-示例">条件移动 (Conditional Move) 示例</h4><p><strong>C 代码 (C Code):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> <span class="hljs-title function_">absdiff</span><span class="hljs-params">(<span class="hljs-type">long</span> x, <span class="hljs-type">long</span> y)</span><br>&#123;<br>  <span class="hljs-type">long</span> result;<br>  <span class="hljs-keyword">if</span> (x &gt; y)<br>    result = x - y;<br>  <span class="hljs-keyword">else</span><br>    result = y - x;<br>  <span class="hljs-keyword">return</span> result;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>汇编 (Assembly) (使用 <code>cmov</code>):</strong></p><figure class="highlight plaintext"><figcaption><span>snippet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs code">; %rdi = x, %rsi = y<br>absdiff:<br>  movq    %rdi, %rax  ; rax = x<br>  subq    %rsi, %rax  ; rax = x - y (result)<br>  movq    %rsi, %rdx  ; rdx = y<br>  subq    %rdi, %rdx  ; rdx = y - x (eval)<br>  cmpq    %rsi, %rdi  ; 比较 x:y<br>  cmovle  %rdx, %rax  ; if (x &lt;= y) result = eval<br>  ret<br></code></pre></td></tr></table></figure><ul><li>此代码计算了 <code>x-y</code> 和 <code>y-x</code> <em>两者</em>。</li><li><code>cmovle</code> (Conditional Move if Less or Equal) 根据 <code>cmpq</code> 的标志位选择正确的结果，而<strong>无需跳转</strong>。</li><li>在不使用 jump 语句时候，<strong>处理器运行速度更快</strong>。</li></ul><h4 id="条件移动的不适用情况-Bad-Cases-for-Conditional-Move">条件移动的不适用情况 (Bad Cases for Conditional Move)</h4><p>条件移动会计算<strong>两个</strong>表达式，因此在以下情况下表现不佳：</p><ol><li><strong>昂贵的计算 (Expensive Computations):</strong><ul><li><code>val = Test(x) ? Hard1(x) : Hard2(x);</code></li><li><code>Hard1(x)</code> 和 <code>Hard2(x)</code> 都会被计算。</li></ul></li><li><strong>有风险的计算 (Risky Computations) (不安全 Unsafe):</strong><ul><li><code>val = p ? *p : 0;</code></li><li>这会尝试解引用 (dereference) <code>p</code>，即使 <code>p</code> 是 <code>NULL</code>，导致错误。</li></ul></li><li><strong>有副作用的计算 (Computations with side effects) (非法 Illegal):</strong><ul><li><code>val = x &gt; 0 ? x *= 7 : x += 3;</code></li><li>代码必须没有副作用。</li></ul></li></ol><h2 id="2-3循环-Loops">2.3循环 (Loops)</h2><h3 id="“Do-While”-循环示例">“Do-While” 循环示例</h3><p>此函数计算 <code>x</code> 中 ‘1’ 的数量 (popcount)。</p><p><strong>C 代码 (C Code):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> <span class="hljs-title function_">pcount_do</span><span class="hljs-params">(<span class="hljs-type">unsigned</span> <span class="hljs-type">long</span> x)</span> &#123;<br>  <span class="hljs-type">long</span> result = <span class="hljs-number">0</span>;<br>  <span class="hljs-keyword">do</span> &#123;<br>    result += x &amp; <span class="hljs-number">0x1</span>;<br>    x &gt;&gt;= <span class="hljs-number">1</span>;<br>  &#125; <span class="hljs-keyword">while</span> (x);<br>  <span class="hljs-keyword">return</span> result;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>Goto 版本 (Goto Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-type">long</span> <span class="hljs-title function_">pcount_goto</span><span class="hljs-params">(<span class="hljs-type">unsigned</span> <span class="hljs-type">long</span> x)</span> &#123;<br>  <span class="hljs-type">long</span> result = <span class="hljs-number">0</span>;<br>loop:<br>  result += x &amp; <span class="hljs-number">0x1</span>;<br>  x &gt;&gt;= <span class="hljs-number">1</span>;<br>  <span class="hljs-keyword">if</span> (x) <span class="hljs-keyword">goto</span> loop;<br>  <span class="hljs-keyword">return</span> result;<br>&#125;<br></code></pre></td></tr></table></figure><h3 id="“Do-While”-循环编译">“Do-While” 循环编译</h3><p><strong>汇编 (Assembly) (针对 <code>pcount_goto</code>):</strong></p><figure class="highlight plaintext"><figcaption><span>snippet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs Code">; %rdi = x, %rax = result<br>  movl    $0, %eax        ; result = 0<br>.L2:                      ; loop:<br>  movq    %rdi, %rdx      <br>  andl    $1, %edx        ; t = x &amp; 0x1<br>  addq    %rdx, %rax      ; result += t<br>  shrq    %rdi            ; x &gt;&gt;= 1<br>  jne     .L2             ; if (x != 0) goto loop<br>  rep; ret<br></code></pre></td></tr></table></figure><h3 id="通用-“Do-While”-翻译">通用 “Do-While” 翻译</h3><p><strong>C 代码 (C Code):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">do</span><br>  Body<br><span class="hljs-title function_">while</span> <span class="hljs-params">(Test)</span>;<br></code></pre></td></tr></table></figure><p><strong>Goto 版本 (Goto Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs C">loop:<br>  Body<br>  <span class="hljs-title function_">if</span> <span class="hljs-params">(Test)</span><br>    <span class="hljs-keyword">goto</span> loop<br></code></pre></td></tr></table></figure><h3 id="通用-“While”-翻译-1-Jump-to-middle">通用 “While” 翻译 #1 (Jump-to-middle)</h3><ul><li>“跳转到中间” (Jump-to-middle) 翻译</li><li>与 <code>-Og</code> 编译选项一起使用</li></ul><p><strong>While 版本 (While version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">while</span> (Test)<br>  Body<br></code></pre></td></tr></table></figure><p><strong>Goto 版本 (Goto Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs C">  <span class="hljs-keyword">goto</span> test;<br>loop:<br>  Body<br>test:<br>  <span class="hljs-keyword">if</span> (Test)<br>    <span class="hljs-keyword">goto</span> loop;<br>done:<br></code></pre></td></tr></table></figure><h3 id="通用-“While”-翻译-2-Do-while-conversion">通用 “While” 翻译 #2 (Do-while conversion)</h3><ul><li>“Do-while” 转换</li><li>与 <code>-O1</code> 编译选项一起使用</li></ul><p><strong>While 版本 (While version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">while</span> (Test)<br>  Body<br></code></pre></td></tr></table></figure><p><strong>Do-While 版本 (Do-While Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">if</span> (!Test)<br>  <span class="hljs-keyword">goto</span> done;<br><span class="hljs-keyword">do</span><br>  Body<br><span class="hljs-title function_">while</span> <span class="hljs-params">(Test)</span>;<br>done:<br></code></pre></td></tr></table></figure><h3 id="“For”-循环-For-Loop">“For” 循环 (For Loop)</h3><p><code>for</code> 循环通过将其转换为 <code>do-while</code> 形式来进行翻译。</p><p><strong>For 版本 (For version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-keyword">for</span> (Init; Test; Update)<br>  Body<br></code></pre></td></tr></table></figure><p><strong>Do-While 版本 (Do-While Version):</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C">Init;<br><span class="hljs-keyword">if</span> (!Test)<br>  <span class="hljs-keyword">goto</span> done;<br><span class="hljs-keyword">do</span> &#123;<br>  Body<br>  Update<br>&#125; <span class="hljs-keyword">while</span>(Test);<br>done:<br></code></pre></td></tr></table></figure><h2 id="总结-Summarizing">总结 (Summarizing)</h2><p>编译器生成代码序列以实现复杂的 C 控制结构。</p><table><thead><tr><th><strong>C 控制 (C Control)</strong></th><th><strong>汇编控制 (Assembler Control)</strong></th></tr></thead><tbody><tr><td><code>if-then-else</code></td><td>条件跳转 (Conditional jump) 或 条件移动 (Conditional move)</td></tr><tr><td><code>do-while</code></td><td>条件跳转 (Conditional jump)</td></tr><tr><td><code>while</code>, <code>for</code></td><td>条件跳转 (Conditional jump) (转换为 <code>do-while</code> 或 <code>jump-to-middle</code>)</td></tr><tr><td><code>switch</code></td><td>间接跳转 (Indirect jump) (通过跳转表 (jump tables))</td></tr></tbody></table><ul><li>稀疏的 <code>switch</code> 语句可能使用决策树 (decision trees) (if-elseif-else)。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-2-control/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-2-control/"/>
    <published>2026-01-14T17:50:00.000Z</published>
    <summary>
      <![CDATA[机器级编程 II：算数与控制 (Machine-Level Programming II: Arithmetic & Control)]]>
    </summary>
    <title>CSAPP - 03.Machine-Level Programming II</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<div class="note note-warning 深入理解计算机系统 (布莱恩特) (Z-Library), p.149">            <p>对干机器级编程来说，其中两种抽象尤为重要。第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,<strong>ISA</strong>)来定义机器级程序的格式和行为，它定义了处理器状态、指令的格式，以及每条指令对状态的影响。</p>          </div><h1>机器级编程 I： (Machine-Level Programming I):</h1><div class="note note-success 核心导读：揭开硬件的面纱">            <p><strong>主要内容</strong>：<br>本章是机器级编程的入门，重点介绍 <strong>汇编语言的基础</strong>。包括：</p><ol><li><strong>C 代码如何变成机器码</strong>：编译、汇编、链接的流程。</li><li><strong>硬件的“程序员视角”</strong>：介绍了 CPU 中你可以直接操作的资源，特别是 <strong>16个通用寄存器</strong>（<code>%rax</code>, <code>%rbx</code> 等）。</li><li><strong>基本指令</strong>：如何移动数据（<code>movq</code>）、如何访问内存（寻址模式）、以及基本的算术运算（<code>addq</code>, <code>leaq</code>）。</li></ol><p><strong>Motivation</strong>：<br>计算机不认识 C 语言，只认识二进制指令。要理解程序的<strong>性能瓶颈</strong>、<strong>调试底层 Bug</strong> 或者<strong>理解指针的本质</strong>，你必须掌握 CPU 是如何通过寄存器和内存搬运数据的。这是理解计算机系统的基石。</p>          </div><h3 id="1-1-Intel处理器与体系结构简史"><strong>1.1 Intel处理器与体系结构简史</strong></h3><ul><li><strong>CISC vs. RISC</strong>:<ul><li><strong>Intel x86</strong> 属于 <strong>复杂指令集计算机 (CISC)</strong>。其特点是指令集庞大，指令功能复杂多样，格式不一。</li><li>与之相对的是 <strong>精简指令集计算机 (RISC)</strong>，例如 ARM 和 RISC-V。RISC的指令数量少，格式统一，易于优化。近年来，RISC在低功耗和移动设备领域复兴。</li></ul></li><li><strong>x86 发展里程碑</strong>:<ul><li><strong>1978 (8086)</strong>: 第一款16位Intel处理器，是IBM PC和DOS系统的基础。</li><li><strong>1985 (386)</strong>: 第一款32位Intel处理器 (IA32)，引入了“平坦寻址模式”，能够运行Unix等现代操作系统。</li><li><strong>2004 (Pentium 4E)</strong>: 第一款支持64位扩展 (x86-64) 的Intel处理器。</li><li><strong>2006 (Core 2)</strong>: 第一款Intel多核处理器，标志着性能提升的思路从单纯提高主频转向增加核心数。</li></ul></li><li><strong>性能发展的趋势与挑战</strong>:<ul><li><strong>CPU-内存性能差距 (The CPU-Memory Gap)</strong>: 几十年来，处理器性能的提升速度远超内存（DRAM）和磁盘（Disk）。这导致CPU经常需要花费时间等待从内存中获取数据，内存访问延迟成为主要性能瓶颈。</li><li><strong>功耗墙 (Power Wall)</strong>: 大约在2005年之后，由于功耗和散热问题，单纯提高CPU时钟频率变得不再可行。这促使整个行业转向多核架构来继续提升计算性能。</li></ul></li></ul><h3 id="1-2-从C代码到可执行文件"><strong>1.2 从C代码到可执行文件</strong></h3><p>将C源代码文件（<code>.c</code>）编译成一个可执行程序，主要经历以下步骤：</p><ol><li><strong>编译 (Compilation)</strong>: 编译器（如 <code>gcc -S</code>）将C代码翻译成人类可读的汇编代码（<code>.s</code>文件）。</li><li><strong>汇编 (Assembly)</strong>: 汇编器（如 <code>as</code>）将汇编代码转换成二进制的机器指令，生成目标文件（<code>.o</code>文件）。此文件包含了代码的二进制表示，但外部函数的地址等尚未确定。</li><li><strong>链接 (Linking)</strong>: 链接器（如 <code>ld</code>）将多个目标文件和所需的库文件（如C标准库）合并起来，解析符号引用（如函数调用），最终生成一个完整的可执行文件。</li><li><strong>反汇编 (Disassembly)</strong>: 可以使用工具将目标文件或可执行文件“逆向”回汇编代码，这对于调试和理解底层代码非常有帮助。<ul><li>命令行工具: <code>objdump -d &lt;文件名&gt;</code></li><li>GDB调试器内: <code>disassemble &lt;函数名&gt;</code></li></ul></li></ol><h3 id="1-3-汇编基础：程序员视角"><strong>1.3 汇编基础：程序员视角</strong></h3><p>在汇编层面，程序员直接与处理器的状态打交道。</p><ul><li><p><strong>程序员可见的状态 (Programmer-Visible State)</strong>:</p><ul><li><strong>PC Programme Counter (程序计数器)</strong>: 在x86-64架构中是 <mark><code>%rip</code></mark> 寄存器。它存放着<mark><strong>下一条</strong> 将要执行的指令的内存地址</mark>。</li><li><strong>寄存器文件 (Register File)</strong>: 16个64位的通用整数寄存器（如 <code>%rax</code>, <code>%rbx</code> 等），它们是CPU内部极快的小容量存储单元。</li><li><strong>条件码 (Condition Codes)</strong>: 一组特殊的标志位，用于存储最近一次算术或逻辑运算的结果状态（例如，结果是否为零、是否发生进位等）。它们是实现条件分支（如if-else）的基础。</li><li><strong>内存 (Memory)</strong>: 一个巨大的、按字节寻址的数组，用于存放代码、用户数据和程序运行栈。</li></ul></li><li><p><strong>x86-64 整数寄存器</strong>:<br>x86-64提供了16个64位的通用寄存器。为了向后兼容，<strong>前8个寄存器还可以访问它们的低32位、16位和8位部分。</strong></p></li></ul><table><thead><tr><th style="text-align:left">64位</th><th style="text-align:left">32位</th><th style="text-align:left">惯例用途</th></tr></thead><tbody><tr><td style="text-align:left"><code>%rax</code></td><td style="text-align:left"><code>%eax</code></td><td style="text-align:left">累加器 / 函数返回值</td></tr><tr><td style="text-align:left"><code>%rbx</code></td><td style="text-align:left"><code>%ebx</code></td><td style="text-align:left">基址寄存器</td></tr><tr><td style="text-align:left"><code>%rcx</code></td><td style="text-align:left"><code>%ecx</code></td><td style="text-align:left">计数器</td></tr><tr><td style="text-align:left"><code>%rdx</code></td><td style="text-align:left"><code>%edx</code></td><td style="text-align:left">数据寄存器</td></tr><tr><td style="text-align:left"><code>%rsi</code></td><td style="text-align:left"><code>%esi</code></td><td style="text-align:left">源变址寄存器</td></tr><tr><td style="text-align:left"><code>%rdi</code></td><td style="text-align:left"><code>%edi</code></td><td style="text-align:left">目的变址寄存器</td></tr><tr><td style="text-align:left"><code>%rsp</code></td><td style="text-align:left"><code>%esp</code></td><td style="text-align:left">栈指针</td></tr><tr><td style="text-align:left"><code>%rbp</code></td><td style="text-align:left"><code>%ebp</code></td><td style="text-align:left">基址指针</td></tr><tr><td style="text-align:left"><code>%r8</code> - <code>%r15</code></td><td style="text-align:left"><code>%r8d</code> - <code>%r15d</code></td><td style="text-align:left">通用寄存器</td></tr></tbody></table><ul><li><strong>AT&amp;T vs. Intel 汇编语法</strong>: 本课程使用 <strong>AT&amp;T 语法</strong>，这在Linux/GCC环境中是默认的。</li></ul><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">AT&amp;T 风格 (本课程使用)</th><th style="text-align:left">Intel 风格</th></tr></thead><tbody><tr><td style="text-align:left"><strong>操作数顺序</strong></td><td style="text-align:left"><code>指令 源, 目标</code></td><td style="text-align:left"><code>指令 目标, 源</code></td></tr><tr><td style="text-align:left"><strong>寄存器</strong></td><td style="text-align:left">加<code>%</code>前缀, e.g., <code>%rax</code></td><td style="text-align:left">无前缀, e.g., <code>rax</code></td></tr><tr><td style="text-align:left"><strong>立即数</strong></td><td style="text-align:left">加<code>$</code>\text{前缀}, e.g., <code>$0x104</code></td><td style="text-align:left">直接书写</td></tr><tr><td style="text-align:left"><strong>内存寻址</strong></td><td style="text-align:left"><code>8(%rbp)</code></td><td style="text-align:left"><code>[rbp+8]</code></td></tr></tbody></table><h3 id="1-4-数据传送：mov-指令与寻址模式"><strong>1.4 数据传送：<code>mov</code> 指令与寻址模式</strong></h3><ul><li><p><strong>指令格式</strong>: <code>movq Source, Dest</code> (将<mark>8字节</mark>数据从源移动到目标)（q代表是<mark>64位操作</mark>）。</p></li><li><p><strong>操作数类型 (Operand Types)</strong>:</p><ul><li><strong>立即数 (Immediate)</strong>: 常数值，以 <code>$</code> \text{开头，例如} <code>$-533</code>。</li><li><strong>寄存器 (Register)</strong>: 16个整数寄存器之一，例如 <code>%rax</code>。不能写给有专用用途的如<code>%rsp</code></li><li><strong>内存 (Memory)</strong>: 内存中的一个地址，由括号 <code>()</code> 表示。<code>(%rax)</code>以寄存器中存的数据当作地址去内存中寻找。</li></ul></li><li><p><strong>核心限制</strong>: <strong>不可以在一条指令中完成从内存到内存的数据传送</strong>。必须先将数据从内存加载到寄存器，再从寄存器存回内存。</p></li><li><p><strong>内存寻址模式 (Memory Addressing Modes)</strong>: 用于灵活地指定内存地址。</p><ul><li><strong>普通模式 (Normal)</strong>: <code>(%rcx)</code>，将寄存器 <code>%rcx</code> 中的值作为内存地址（等价于C语言中的指针解引用 <code>*rcx</code>）。</li><li><strong>偏移模式 (Displacement)</strong>: <code>D(R)</code>，例如 <mark><code>8(%rbp)</code></mark>，表示访问内存地址为 <code>Reg[R] + D</code> 的位置（等价于 <code>*(rbp + 8)</code>）。</li><li><strong>最通用形式</strong>: <mark><code>D(Rb, Ri, S)</code></mark><ul><li>地址计算公式为: <strong><code>Mem[Reg[Rb] + S * Reg[Ri] + D]</code></strong>。</li><li><strong>D</strong>: 常量偏移量 (Displacement)。</li><li><strong>Rb</strong>: 基址寄存器 (Base register)。</li><li><strong>Ri</strong>: 变址寄存器 (Index register)。</li><li><strong>S</strong>: 比例因子 (Scale)，值只能是1, 2, 4, 8。这个因子对于数组访问非常有用，可以方便地计算出数组元素的地址。</li></ul></li></ul></li></ul><h3 id="1-5-算术和逻辑运算"><strong>1.5 算术和逻辑运算</strong></h3><ul><li><p><strong>加载有效地址 (<code>leaq</code>)</strong>:</p><ul><li><code>leaq Src, Dst</code> 指令非常特殊。它使用内存寻址的语法来计算一个地址，但 <strong>并不会访问内存</strong>。</li><li>相反，它将计算出的 <strong>地址值本身</strong> 存放到目标寄存器 <code>Dst</code> 中。</li><li>编译器经常巧妙地利用它来完成一些高效的算术运算。例如，要计算 <code>x * 12</code>，可以分两步：<ol><li><code>leaq (%rdi, %rdi, 2), %rax</code>  # <code>rax = x + 2*x = 3*x</code></li><li><code>salq $2, %rax</code> # <code>rax = rax &lt;&lt; 2 = (3*x) * 4 = 12*x</code></li></ol></li></ul></li><li><p><strong>常见的二元运算指令</strong>:<br>（注意：指令格式为 <code>op Src, Dest</code>，运算结果存回 <code>Dest</code>）</p></li></ul><table><thead><tr><th style="text-align:left">指令</th><th style="text-align:left">运算</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>addq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest + Src</code></td><td style="text-align:left">加法</td></tr><tr><td style="text-align:left"><code>subq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest - Src</code></td><td style="text-align:left">减法</td></tr><tr><td style="text-align:left"><code>imulq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest * Src</code></td><td style="text-align:left">乘法</td></tr><tr><td style="text-align:left"><code>andq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest &amp; Src</code></td><td style="text-align:left">按位与</td></tr><tr><td style="text-align:left"><code>orq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest | Src</code></td><td style="text-align:left">按位或</td></tr><tr><td style="text-align:left"><code>xorq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest ^ Src</code></td><td style="text-align:left">按位异或</td></tr><tr><td style="text-align:left"><code>salq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest &lt;&lt; Src</code></td><td style="text-align:left">左移</td></tr><tr><td style="text-align:left"><code>sarq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest &gt;&gt; Src</code></td><td style="text-align:left">算术右移</td></tr><tr><td style="text-align:left"><code>shrq Src, Dest</code></td><td style="text-align:left"><code>Dest = Dest &gt;&gt; Src</code></td><td style="text-align:left">逻辑右移</td></tr></tbody></table><ul><li><strong>常见的一元运算指令</strong>:</li></ul><table><thead><tr><th style="text-align:left">指令</th><th style="text-align:left">运算</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>incq Dest</code></td><td style="text-align:left"><code>Dest = Dest + 1</code></td><td style="text-align:left">加一</td></tr><tr><td style="text-align:left"><code>decq Dest</code></td><td style="text-align:left"><code>Dest = Dest - 1</code></td><td style="text-align:left">减一</td></tr><tr><td style="text-align:left"><code>negq Dest</code></td><td style="text-align:left"><code>Dest = -Dest</code></td><td style="text-align:left">取负 (补码)</td></tr><tr><td style="text-align:left"><code>notq Dest</code></td><td style="text-align:left"><code>Dest = ~Dest</code></td><td style="text-align:left">按位取反</td></tr></tbody></table>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-1-basics/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/03-machine-level-1-basics/"/>
    <published>2026-01-14T17:40:00.000Z</published>
    <summary>对干机器级编程来说，其中两种抽象尤为重要。第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为，它定义了处理器状态、指令的格式，以及每条指令对状态的影响。</summary>
    <title>CSAPP - 03.Machine-Level Programming I</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h2 id="一、小数的二进制表示-Fractional-Binary-Numbers">一、小数的二进制表示 (Fractional Binary Numbers)</h2><h3 id="1-表示方法">1. 表示方法</h3><p>计算机使用二进制来表示一切信息。对于小数，其表示方法与整数类似，只是在小数点右侧的每一位代表 2 的负数次幂。</p><p>一个二进制小数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mi>i</mi></msub><msub><mi>b</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>b</mi><mn>1</mn></msub><msub><mi>b</mi><mn>0</mn></msub><mi mathvariant="normal">.</mi><msub><mi>b</mi><mrow><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>b</mi><mrow><mo>−</mo><mn>2</mn></mrow></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>b</mi><mrow><mo>−</mo><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">b_{i}b_{i-1}...b_{1}b_{0}.b_{-1}b_{-2}...b_{-j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span> 的值可以表示为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>Value</mtext><mo>=</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mo>−</mo><mi>j</mi></mrow><mi>i</mi></munderover><msub><mi>b</mi><mi>k</mi></msub><mo>×</mo><msup><mn>2</mn><mi>k</mi></msup></mrow><annotation encoding="application/x-tex">\text{Value} = \sum_{k=-j}^{i}b_{k}\times2^{k} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">Value</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2499em;vertical-align:-1.4382em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8117em;"><span style="top:-1.8479em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">−</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4382em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8991em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>小数点左边的位权是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>0</mn></msup><mo separator="true">,</mo><msup><mn>2</mn><mn>1</mn></msup><mo separator="true">,</mo><msup><mn>2</mn><mn>2</mn></msup><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">2^0, 2^1, 2^2, ...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span></span></span></span></li><li>小数点右边的位权是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>2</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>2</mn></mrow></msup><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>4</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>3</mn></mrow></msup><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>8</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">2^{-1} (1/2), 2^{-2} (1/4), 2^{-3} (1/8), ...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">1/2</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">1/4</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">1/8</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span></span></span></span></li></ul><p><strong>示例</strong>：</p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mn>101.11</mn><mn>2</mn></msub><mo>=</mo><mn>1</mn><mo>×</mo><msup><mn>2</mn><mn>2</mn></msup><mo>+</mo><mn>0</mn><mo>×</mo><msup><mn>2</mn><mn>1</mn></msup><mo>+</mo><mn>1</mn><mo>×</mo><msup><mn>2</mn><mn>0</mn></msup><mo>+</mo><mn>1</mn><mo>×</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mn>1</mn><mo>×</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>2</mn></mrow></msup><mo>=</mo><mn>4</mn><mo>+</mo><mn>0</mn><mo>+</mo><mn>1</mn><mo>+</mo><mn>0.5</mn><mo>+</mo><mn>0.25</mn><mo>=</mo><mn>5.75</mn></mrow><annotation encoding="application/x-tex">101.11_2 = 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} = 4 + 0 + 1 + 0.5 + 0.25 = 5.75</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">101.1</span><span class="mord"><span class="mord">1</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0.5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.25</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5.75</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.111111..</mn><msub><mi mathvariant="normal">.</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">0.111111..._2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">0.111111..</span><span class="mord"><span class="mord">.</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的值趋近于 1.0 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>2</mn><mo>+</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>4</mn><mo>+</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>8</mn><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo>→</mo><mn>1.0</mn></mrow><annotation encoding="application/x-tex">1/2 + 1/4 + 1/8 + ... \rightarrow 1.0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mord">...</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.0</span></span></span></span>)。</li></ul><h3 id="2-表示的局限性">2. 表示的局限性</h3><ul><li><strong>精确表示</strong>：只有形如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mi mathvariant="normal">/</mi><msup><mn>2</mn><mi>k</mi></msup></mrow><annotation encoding="application/x-tex">x/2^k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0991em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span> 的有理数才能被精确地表示。</li><li><strong>循环表示</strong>：其他许多有理数在二进制下是无限循环小数。<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>3</mn><mo>=</mo><mn>0.010101..</mn><msub><mi mathvariant="normal">.</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">1/3 = 0.010101..._2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/3</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">0.010101..</span><span class="mord"><span class="mord">.</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>5</mn><mo>=</mo><mn>0.00110011..</mn><msub><mi mathvariant="normal">.</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">1/5 = 0.00110011..._2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/5</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">0.00110011..</span><span class="mord"><span class="mord">.</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>10</mn><mo>=</mo><mn>0.000110011..</mn><msub><mi mathvariant="normal">.</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">1/10 = 0.000110011..._2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/10</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">0.000110011..</span><span class="mord"><span class="mord">.</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li></ul></li></ul><h2 id="二、IEEE-754-浮点数标准">二、IEEE 754 浮点数标准</h2><p>为了统一浮点数的算术标准，IEEE 在 1985 年推出了 <strong>IEEE 754 标准</strong>。它被所有主流 CPU 支持，并为舍入、溢出等问题提供了良好的规范。该标准的主要设计者是 William Kahan，他因此获得了 1989 年的图灵奖。</p><h3 id="1-数值形式-Numerical-Form">1. 数值形式 (Numerical Form)</h3><p>所有浮点数都被表示为科学记数法的形式：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mo>−</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mi>s</mi></msup><mo>×</mo><mi>M</mi><mo>×</mo><msup><mn>2</mn><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">(-1)^s \times M \times 2^E </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8913em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> (Sign)</strong>: 符号位，决定正负 (0 为正, 1 为负)。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> (Significand)</strong>: 尾数，通常是一个范围在 <code>[1.0, 2.0)</code> 之间的小数。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> (Exponent)</strong>: 阶码，用于对数值进行加权。</li></ul><h3 id="2-编码-Encoding">2. 编码 (Encoding)</h3><p>在计算机中，一个浮点数被编码为三个部分：</p><table><thead><tr><th><code>s</code> (符号位)</th><th><code>exp</code> (阶码字段)</th><th><code>frac</code> (小数部分)</th></tr></thead></table><ul><li><strong>s</strong>: 直接编码符号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>。</li><li><strong>exp</strong>: 编码阶码 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span>（但 <code>exp</code> <strong>不等于</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span>）。</li><li><strong>frac</strong>: 编码尾数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>（但 <code>frac</code> <strong>不等于</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>）。</li></ul><h3 id="3-精度-Precisions">3. 精度 (Precisions)</h3><ul><li><strong>单精度 (Single Precision / <code>float</code>)</strong>: 32 bits  4 bytes。<ul><li><code>s</code>: 1 位, <code>exp</code>: 8 位, <code>frac</code>: 23 位。</li></ul></li><li><strong>双精度 (Double Precision / <code>double</code>)</strong>: 64 bits  8 bytes。<ul><li><code>s</code>: 1 位, <code>exp</code>: 11 位, <code>frac</code>: 52 位。</li></ul></li></ul><h3 id="4-三种编码类型">4. 三种编码类型</h3><h4 id="a-规格化值-Normalized-Values">a. 规格化值 (Normalized Values)</h4><p>这是最常见的情况。</p><ul><li><strong>条件</strong>: <code>exp</code> 字段既不全为 0，也不全为 1。</li><li><strong>阶码 (Exponent)</strong>: 采用 <strong>偏置表示法 (Biased Value)</strong>。<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mtext>Exp</mtext><mo>−</mo><mtext>Bias</mtext></mrow><annotation encoding="application/x-tex">E = \text{Exp} - \text{Bias}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Exp</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">Bias</span></span></span></span></span>。</li><li><code>Exp</code> 是 <code>exp</code> 字段的无符号整数值。</li><li><code>Bias</code> 是一个偏置常数（用于表示大于和小于1的数），值为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mi>k</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^{k-1}-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9324em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 是 <code>exp</code> 的位数）。<ul><li>单精度 <code>k=8</code> <code>Bias= 127</code>，能表达<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mo>−</mo><mn>126</mn></mrow></msup><mo>∼</mo><msup><mn>2</mn><mn>127</mn></msup></mrow><annotation encoding="application/x-tex">2^{-126} \sim 2^{127}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">126</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">127</span></span></span></span></span></span></span></span></span></span></span></span> （阶码不全为0也不全为1）</li><li>双精度 <code>Bias = 1023</code>。</li></ul></li></ul></li><li><strong>尾数 (Significand)</strong>: 采用 <strong>隐含的头一位 (Implied Leading 1)</strong>。<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mn>1.</mn><mi>x</mi><mi>x</mi><mi>x</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">M = 1.xxx...x_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">1.</span><span class="mord mathnormal">xxx</span><span class="mord">...</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，其中 <code>xxx...x</code> 是 <code>frac</code> 字段的值。</li><li>因为规格化数的尾数第一位总是 1，所以可以<mark><strong>省略不存</strong></mark>，从而 “免费” 获得一位额外的精度。</li></ul></li></ul><div class="note note-info">            <p>我们以<strong>单精度（Single Precision）</strong> 为例来详细解释：</p><ol><li><strong><code>exp</code> 字段的位数</strong>: 对于单精度浮点数，阶码字段 <code>exp</code> 共有 <strong>k=8</strong> 位 1。</li><li><strong><code>exp</code> 的原始范围</strong>: 作为一个8位的无符号整数，<code>exp</code> 字段可以表示的十进制值范围是从 <code>00000000</code> (0) 到 <code>11111111</code> (255)。</li><li><strong>保留的特殊值</strong>: IEEE 754 标准规定，<code>exp</code> 字段的两个极端值是保留作特殊用途的：</li></ol><ul><li><strong><code>exp</code> 全为 0</strong> (<code>00000000</code>, 即十进制的 0) 被保留用于表示<strong>非规格化数 (Denormalized Values)</strong> 和 <strong>0</strong>2222。</li><li><strong><code>exp</code> 全为 1</strong> (<code>11111111</code>, 即十进制的 255) 被保留用于表示<strong>无穷大 (Infinity)</strong> 和 <strong>NaN (Not-a-Number)</strong> 3。</li></ul><ol start="4"><li><strong>规格化数的 <code>exp</code> 范围</strong>: 因为最大和最小的值被保留了，所以用于表示常规规格化数（Normalized Values）的 <code>exp</code> 字段的有效范围就变成了从 <strong>1</strong> 到 <strong>254</strong>。</li><li><strong>计算实际的阶码 E</strong>:</li></ol><ul><li><strong>偏置值 (Bias)</strong>: 单精度的 Bias 是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mn>8</mn><mo>−</mo><mn>1</mn></mrow></msup><mo>−</mo><mn>1</mn><mo>=</mo><mn>127</mn></mrow><annotation encoding="application/x-tex">2^{8-1} -1 = 127</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">127</span></span></span></span>。</li><li>最小阶码 Emin​: 使用 exp 的有效最小值 1 来计算。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>E</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow></msub><mo>=</mo><mn>1</mn><mo>−</mo><mi>B</mi><mi>i</mi><mi>a</mi><mi>s</mi><mo>=</mo><mn>1</mn><mo>−</mo><mn>127</mn><mo>=</mo><mo>−</mo><mn>126</mn></mrow><annotation encoding="application/x-tex">E_{min} = 1 - Bias = 1 - 127 = -126</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">ia</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">127</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">126</span></span></span></span></li><li>最大阶码 Emax​: 使用 exp 的有效最大值 254 来计算。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>E</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub><mo>=</mo><mn>254</mn><mo>−</mo><mi>B</mi><mi>i</mi><mi>a</mi><mi>s</mi><mo>=</mo><mn>254</mn><mo>−</mo><mn>127</mn><mo>=</mo><mn>127</mn></mrow><annotation encoding="application/x-tex">E_{max} = 254 - Bias = 254 - 127 = 127</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">254</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">ia</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">254</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">127</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">127</span></span></span></span></li></ul><p>简单来说，引入偏置值（Bias）是为了在 <code>exp</code> 字段中只使用无符号整数，就能方便地表示正负范围的阶码，这简化了硬件在比较浮点数大小时的设计。而去掉头尾两个特殊值，则是为了能够表示像0和无穷大这样的特殊情况。</p><p>[!tip] 规格化浮点数换算<br>数值 = <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo>−</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mi>s</mi></msup><mo>×</mo><mi>M</mi><mo>×</mo><msup><mn>2</mn><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">(-1)^s × M × 2^E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span></p><ol><li><strong>符号 (s)</strong>: 直接取二进制的最高位。0代表正数，1代表负数。</li><li><strong>阶码 (E)</strong>:</li></ol><ul><li>读取<code>exp</code>字段的二进制，将其转换为无符号整数 <code>Exp</code>。</li><li>用<code>Exp</code>减去一个固定的<strong>偏置值 (Bias)</strong> 得到 <code>E</code>。</li><li><em>公式</em>: <code>E = Exp - Bias</code> (例如，单精度Bias为127)。</li></ul><ol start="3"><li><strong>尾数 (M)</strong>:</li></ol><ul><li>在<code>frac</code>字段的二进制小数前，加上一个隐含的 “1.”。</li><li><em>公式</em>: <code>M = 1.frac</code> (二进制形式)。</li></ul><p>将计算出的 <code>s</code>, <code>E</code>, 和 <code>M</code> 代入核心公式，即可得到最终的十进制数。</p>          </div><h4 id="b-非规格化值-Denormalized-Values">b. 非规格化值 (Denormalized Values)</h4><p>用于表示非常接近 0 的数。</p><ul><li><strong>条件</strong>: <code>exp</code> 字段全为 0。</li><li><strong>阶码 (Exponent)</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mn>1</mn><mo>−</mo><mtext>Bias</mtext></mrow><annotation encoding="application/x-tex">E = 1 - \text{Bias}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">Bias</span></span></span></span></span>。这是是为了实现<strong>平滑过渡（Seamless Transition）</strong>。<ul><li><strong>最小的规格化数</strong>（4字节） <code>exp=1</code>, <code>frac=00...0</code> :  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi><mo>=</mo><mn>1.0</mn><mo>×</mo><msup><mn>2</mn><mrow><mn>1</mn><mo>−</mo><mn>127</mn></mrow></msup><mo>=</mo><mrow><mn mathvariant="bold">1.0</mn><mo>×</mo><msup><mn mathvariant="bold">2</mn><mrow><mo>−</mo><mn mathvariant="bold">126</mn></mrow></msup></mrow></mrow><annotation encoding="application/x-tex">Value = 1.0 \times 2^{1-127} = \mathbf{1.0 \times 2^{-126}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">−</span><span class="mord mtight">127</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathbf">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathbf">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathbf mtight">126</span></span></span></span></span></span></span></span></span></span></span></span></span>。</li><li><strong>最大的非规格化数</strong> (<code>exp=0</code>, <code>frac=11...1</code>): 如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>127</mn></mrow><annotation encoding="application/x-tex">-127</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">127</span></span></span></span>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi><mo>=</mo><mn>0.11...1</mn><mo>×</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>127</mn></mrow></msup></mrow><annotation encoding="application/x-tex">Value = 0.11...1 \times 2^{-127}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0.11...1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">127</span></span></span></span></span></span></span></span></span></span></span></span>。这与上面的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.0</mn><mo>×</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>126</mn></mrow></msup></mrow><annotation encoding="application/x-tex">1.0 \times 2^{-126}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">126</span></span></span></span></span></span></span></span></span></span></span></span> 之间会出现断层。 如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 是 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>126</mn></mrow><annotation encoding="application/x-tex">-126</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">126</span></span></span></span></strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi><mo>=</mo><mrow><mn mathvariant="bold">0.11...1</mn><mo>×</mo><msup><mn mathvariant="bold">2</mn><mrow><mo>−</mo><mn mathvariant="bold">126</mn></mrow></msup></mrow></mrow><annotation encoding="application/x-tex">Value = \mathbf{0.11...1 \times 2^{-126}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathbf">0.11...1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathbf">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathbf mtight">126</span></span></span></span></span></span></span></span></span></span></span></span></span>。</li></ul></li><li><strong>尾数 (Significand)</strong>: <strong>隐含的头一位</strong>是 0。<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mn>0.</mn><mi>x</mi><mi>x</mi><mi>x</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">M = 0.xxx...x_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7944em;vertical-align:-0.15em;"></span><span class="mord">0.</span><span class="mord mathnormal">xxx</span><span class="mord">...</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，其中 <code>xxx...x</code> 是 <code>frac</code> 字段的值。</li></ul></li><li><strong>特殊情况</strong>：<ul><li>如果 <code>frac</code> 也全为 0，则表示 <strong>0 值</strong>（区分 <code>+0</code> 和 <code>-0</code>）。</li><li>如果 <code>frac</code> 不全为 0，则表示非常接近 0 的数，实现了向 0 的 <strong>渐进下溢 (Gradual Underflow)</strong>。</li></ul></li></ul><h4 id="c-特殊值-Special-Values">c. 特殊值 (Special Values)</h4><ul><li><strong>条件</strong>: <code>exp</code> 字段全为 1。</li><li><strong>情况一：无穷大 (Infinity)</strong><ul><li>当 <code>frac</code> 字段<strong>全为</strong> 0 时。</li><li>表示运算溢出（如 <code>1.0 / 0.0</code>）的结果，有 <code>+∞</code> 和 <code>-∞</code>。</li></ul></li><li><strong>情况二：非数值 (Not-a-Number / NaN)</strong><ul><li>当 <code>frac</code> 字段<strong>不全为</strong> 0 时。</li><li>表示一个无法确定数值结果的操作（如 <code>sqrt(-1)</code>, <code>∞ - ∞</code>）。</li></ul></li></ul><div class="note note-info">            <ul><li><strong>位置</strong>: 非规格化数填充了最小的正规格化数与零之间的空隙（同样适用于负数）。</li><li><strong>密度</strong>: 非规格化与规格化数在数轴上<strong>越靠近零的区域分布越密集</strong>。</li><li><strong>间距</strong>: 与数值越大间距越大的规格化数不同，所有的非规格化数之间是<strong>等距 (Equispaced)</strong> 的，即它们均匀地分布在零附近。相同阶数的规格化数的间距是相等的，并且阶数越大间距越大。<ul><li>在二进制里，尾数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 每次变化的最小单位是最后一位加 1。对于 32 位浮点数（23 位尾数），这个最小变化量是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mo>−</mo><mn>23</mn></mrow></msup></mrow><annotation encoding="application/x-tex">2^{-23}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">23</span></span></span></span></span></span></span></span></span></span></span></span>。所以，相邻两个数的间距（Gap）是：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Gap</mtext><mo>=</mo><mo stretchy="false">(</mo><mn>1.</mn><msub><mi>M</mi><mrow><mi>n</mi><mi>e</mi><mi>x</mi><mi>t</mi></mrow></msub><mo>−</mo><mn>1.</mn><msub><mi>M</mi><mrow><mi>c</mi><mi>u</mi><mi>r</mi><mi>r</mi></mrow></msub><mo stretchy="false">)</mo><mo>×</mo><msup><mn>2</mn><mi>E</mi></msup><mo>=</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>23</mn></mrow></msup><mo>×</mo><msup><mn>2</mn><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">\text{Gap} = (1.M_{next} - 1.M_{curr}) \times 2^E = 2^{-23} \times 2^E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Gap</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1.</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">x</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">rr</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">23</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span></li><li><strong>结论</strong>：只要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span></span></span></span> 不变，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Gap</mtext></mrow><annotation encoding="application/x-tex">\text{Gap}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Gap</span></span></span></span></span> 就是一个定值。所以在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">2^E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mi>E</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">2^{E+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span> 这一段里，刻度是完全均匀的。</li><li>每当跨越一个 <strong>2 的幂次边界</strong>（比如从 2 到 4，或者从 1024 到 2048），浮点数的<strong>间距就会精确地翻倍</strong>。</li></ul></li><li><strong>作用</strong>: 这种分布方式实现了“渐进下溢” (Gradual Underflow)，避免了从一个很小的数直接跳变为零，从而保留了对极小数值的处理能力，但代价是牺牲了精度。</li></ul>          </div><hr><h2 id="三、浮点数运算-Floating-Point-Operations">三、浮点数运算 (Floating Point Operations)</h2><h3 id="1-基本思想">1. 基本思想</h3><p><strong>精确结果</strong>所含的有效位数，超过了目标浮点格式的尾数（<code>frac</code>）字段所能容纳的位数时，就需要进行舍入 。以下是讲义中提到的几种情况：</p><ul><li><strong>浮点数乘法 (Floating Point Multiplication)</strong>: 两个浮点数的尾数相乘后，其结果的有效位数可能会翻倍，超出了 <code>frac</code> 字段的长度，因此需要舍入 。</li><li><strong>浮点数加法 (Floating Point Addition)</strong>: 在加法运算中，为了对齐小数点，阶码较小的数的尾数需要右移，这可能产生额外的低位。两个尾数相加后的结果也可能需要舍入才能存入 <code>frac</code> 字段 。</li><li><strong>类型转换 (Casting)</strong>: 当一个位数更多的整数（例如，一个超过24位的 <code>int</code>）转换为 <code>float</code> 时，由于 <code>float</code> 的尾数只有23位（加上隐含的1位），无法精确表示该整数，因此需要进行舍入 。同样，从<code>double</code>（52位尾数）转换到 <code>float</code> 也常常需要舍入</li></ul><p>公式表示：</p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><msub><mo>+</mo><mi>f</mi></msub><mi>y</mi><mo>=</mo><mtext>Round</mtext><mo stretchy="false">(</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x +_f y = \text{Round}(x+y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8694em;vertical-align:-0.2861em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mbin">+</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Round</span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><msub><mo>×</mo><mi>f</mi></msub><mi>y</mi><mo>=</mo><mtext>Round</mtext><mo stretchy="false">(</mo><mi>x</mi><mo>×</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x \times_f y = \text{Round}(x \times y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8694em;vertical-align:-0.2861em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mbin">×</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Round</span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></li></ul><h3 id="2-舍入模式-Rounding-Modes">2. 舍入模式 (Rounding Modes)</h3><p>核心原则：<strong>默认模式</strong>总是优先选择<strong>精度最高</strong>（最接近）的值，仅在无法区分远近时使用仲裁规则。</p><h4 id="1-默认模式：向偶数舍入-Round-to-nearest-ties-to-even">1. 默认模式：向偶数舍入 (Round-to-nearest, ties to even)</h4><p>这是几乎所有现代计算机系统的默认行为。判断逻辑分为两步：</p><ul><li><strong>第一步：找最近 (Nearest)</strong><ul><li><strong>绝对优先原则</strong>。选择距离原数值最近的可表示值，不需要看奇偶。</li><li><em>例</em>：<code>1.1</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>1.0</code>； <code>1.9</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>2.0</code>。</li></ul></li><li><strong>第二步：中间值仲裁 (Ties to Even)</strong><ul><li><strong>触发条件</strong>：仅当原数值恰好位于两个可表示值的<strong>正中间</strong>（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>…</mo><mtext> </mtext><mn>.5000</mn><mo>…</mo></mrow><annotation encoding="application/x-tex">\dots .5000\dots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">.5000</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span></span></span></span>）时。</li><li><strong>规则</strong>：选择<strong>最低有效位 (LSB) 为 0</strong>（偶数）的那个值。</li><li><em>例 (十进制)</em>：<code>1.5</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>2</code> (偶)； <code>2.5</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>2</code> (偶)。</li><li><em>例 (二进制)</em>：<ul><li><code>10.10 100</code> (中间值) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>10.10</code> (末尾0, 偶)。</li><li><code>10.11 100</code> (中间值) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>11.00</code> (末尾0, 偶)。</li></ul></li></ul></li><li><strong>优势</strong>：<strong>统计无偏 (Statistically Unbiased)</strong>。避免了传统“四舍五入”在大量运算中造成结果持续偏大的系统误差（50%几率向上，50%几率向下）。</li></ul><h4 id="2-其他非默认模式-Directed-Rounding">2. 其他非默认模式 (Directed Rounding)</h4><p>这些模式<strong>不考虑</strong>“谁更近”，直接按方向强制取整，常用于区间算术或特定边界计算。</p><ul><li><strong>向零舍入 (Round toward zero)</strong>: 直接截断 (Truncate)。C 语言 <code>(int)</code> 强制转换时的行为。</li><li><strong>向正无穷舍入 (Round toward +Inf)</strong>: 向上取整 (Ceiling)。始终向数轴右侧靠近（<code>1.1</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>2.0</code>, <code>-1.5</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>-1.0</code>）。</li><li><strong>向负无穷舍入 (Round toward -Inf)</strong>: 向下取整 (Floor)。始终向数轴左侧靠近（<code>1.1</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>1.0</code>, <code>-1.5</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>-2.0</code>）。</li></ul><h3 id="3-浮点数加法和乘法详解">3. 浮点数加法和乘法详解</h3><p>浮点数运算比整数复杂，本质上是“科学计数法”的运算。</p><h4 id="1-浮点数乘法-Floating-point-Multiplication"><strong>1. 浮点数乘法 (Floating-point Multiplication)</strong></h4><p>乘法的逻辑相对直观，符号、阶码和尾数可以分开处理。</p><ul><li><p><strong>Step 1: 生成符号位 (Compute Sign)</strong></p><ul><li><strong>操作</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><mi>s</mi><mn>1</mn><mo>⊕</mo><mi>s</mi><mn>2</mn></mrow><annotation encoding="application/x-tex">s = s1 \oplus s2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">s</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord mathnormal">s</span><span class="mord">2</span></span></span></span></li><li><strong>原理</strong>：同号相乘为正，异号相乘为负。</li></ul></li><li><p><strong>Step 2: 阶码运算 (Compute Exponent)</strong></p><ul><li><strong>操作</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mi>E</mi><mn>1</mn><mo>+</mo><mi>E</mi><mn>2</mn><mo>−</mo><mi>B</mi><mi>i</mi><mi>a</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">E = E1 + E2 - Bias</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">ia</span><span class="mord mathnormal">s</span></span></span></span></li><li><strong>原理</strong>：阶码存储为移码 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>E</mi><mrow><mi>s</mi><mi>t</mi><mi>o</mi><mi>r</mi><mi>e</mi></mrow></msub><mo>=</mo><msub><mi>E</mi><mrow><mi>r</mi><mi>e</mi><mi>a</mi><mi>l</mi></mrow></msub><mo>+</mo><mi>B</mi><mi>i</mi><mi>a</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">E_{store} = E_{real} + Bias</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">ore</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">re</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">ia</span><span class="mord mathnormal">s</span></span></span></span>)。若直接相加，Bias 会被加两次，因此必须<strong>减去一次偏置值</strong>。</li></ul></li><li><p><strong>Step 3: 尾数相乘 (Multiply Significands)</strong></p><ul><li><strong>操作</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mi>M</mi><mn>1</mn><mo>×</mo><mi>M</mi><mn>2</mn></mrow><annotation encoding="application/x-tex">M = M1 \times M2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord">2</span></span></span></span></li><li><strong>范围</strong>：两个规格化数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[1, 2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mclose">)</span></span></span></span> 相乘，结果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 的范围是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>1</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[1, 4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span>。</li></ul></li><li><p><strong>Step 4: 规格化与舍入 (Normalization &amp; Rounding)</strong></p><ul><li><strong>情况 A (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>&lt;</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">M &lt; 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>)</strong>：结果已规格化，无需调整。</li><li><strong>情况 B (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>≥</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">M \ge 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.136em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>)</strong>：即结果在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[2, 4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span> 之间。<ul><li><strong>动作</strong>：尾数 <strong>右移 1 位</strong>，阶码 <strong>加 1</strong>。</li></ul></li><li><strong>舍入</strong>：截断多余位并按规则（如向偶数舍入）处理。</li><li><strong>检查</strong>：检查阶码是否发生上溢 (Overflow) 或下溢 (Underflow)。</li></ul></li></ul><h4 id="2-浮点数加法-Floating-point-Addition"><strong>2. 浮点数加法 (Floating-point Addition)</strong></h4><p>加法的核心难点在于<strong>必须先对齐小数点</strong>（对阶）。</p><ul><li><p><strong>Step 1: 对阶 (Alignment)</strong></p><ul><li><strong>原则</strong>：<strong>小阶向大阶看齐</strong>。</li><li><strong>理由</strong>：小阶变大需要右移尾数，丢失的是低位精度（可控）；大阶变小需要左移尾数，会丢失高位有效数字（灾难性错误）。</li><li><strong>操作</strong>：保持大阶码不变，将小阶码对应的尾数 <strong>右移</strong>，直到阶码相同。</li></ul></li><li><p><strong>Step 2: 尾数加减 (Significand Addition)</strong></p><ul><li><strong>操作</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mi>M</mi><mn>1</mn><mo>±</mo><mi>M</mi><msup><mn>2</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">M = M1 \pm M2&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">±</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> (其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><msup><mn>2</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">M2&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 是对阶后的尾数)。</li><li>根据符号位决定实际执行加法还是减法。</li></ul></li><li><p><strong>Step 3: 规格化 (Normalization)</strong></p><ul><li><strong>情况 A (进位, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>≥</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">M \ge 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.136em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>)</strong>：例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.5</mn><mo>+</mo><mn>1.5</mn><mo>=</mo><mn>3.0</mn></mrow><annotation encoding="application/x-tex">1.5 + 1.5 = 3.0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.5</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3.0</span></span></span></span>。<ul><li><strong>动作</strong>：尾数 <strong>右移 1 位</strong>，阶码 <strong>加 1</strong>。</li></ul></li><li><strong>情况 B (抵消, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>&lt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">M &lt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)</strong>：例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.5</mn><mo>−</mo><mn>1.4</mn><mo>=</mo><mn>0.1</mn></mrow><annotation encoding="application/x-tex">1.5 - 1.4 = 0.1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1.5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.4</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.1</span></span></span></span>。<ul><li><strong>动作</strong>：尾数 <strong>左移若干位</strong>，直到最高位恢复为 1。</li><li><strong>补偿</strong>：阶码相应 <strong>减小</strong>。</li></ul></li><li><strong>特殊情况</strong>：结果为 0，阶码和尾数全置 0。</li></ul></li><li><p><strong>Step 4: 舍入 (Rounding)</strong></p><ul><li>处理对阶或计算中移出的位。</li><li><strong>注意</strong>：舍入可能导致再次进位（如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.11...</mn></mrow><annotation encoding="application/x-tex">1.11...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.11...</span></span></span></span> 进位成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10.00...</mn></mrow><annotation encoding="application/x-tex">10.00...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">10.00...</span></span></span></span>），此时需再次执行“右移1位、阶码加1”。</li></ul></li></ul><div class="note note-info">            <p><strong>1. 可行性 (Feasibility)</strong></p><ul><li><strong>可以运算</strong>: 非规格化数之间、以及与规格化数之间<strong>完全可以</strong>进行加减乘除。</li><li><strong>机制</strong>: 硬件 (FPU) 或软件库会自动处理阶码对齐和尾数计算，实现从规格化数到 0 的平滑过渡。</li></ul><p><strong>2. 潜在风险 (Risks)</strong></p><ul><li><strong>性能陷阱 (Performance Penalty)</strong>: 许多硬件处理非规格化数效率极低（可能触发微代码或软件模拟），导致计算速度<strong>下降几十倍甚至上百倍</strong>。</li><li><strong>精度损失 (Precision Loss)</strong>: 数值越小，尾数的前导零越多，<strong>有效位数递减</strong>，导致计算精度严重下降。</li></ul><p><strong>3. 工程对策 (Handling)</strong></p><ul><li><strong>归零模式 (Flush-to-Zero, FTZ)</strong>: 在游戏开发或高性能计算中，为了保住性能，通常配置 CPU 将非规格化数直接<strong>视为 0</strong> 处理，但这会牺牲 IEEE 754 的标准兼容性。</li></ul>          </div><h3 id="4-数学属性-Mathematical-Properties">4. 数学属性 (Mathematical Properties)</h3><p>浮点数运算<strong>不完全</strong>满足实数算术的数学定律。</p><ul><li><strong>结合律不成立 (Associativity is violated)</strong>:<ul><li><code>(3.14 + 1e10) - 1e10</code> 的结果可能是 <code>0.0</code>。</li><li><code>3.14 + (1e10 - 1e10)</code> 的结果是 <code>3.14</code>。</li><li>原因是舍入误差。</li></ul></li><li><strong>分配律不成立 (Distributivity is violated)</strong>:<ul><li><code>1e20 * (1e20 - 1e20)</code> 结果是 <code>0.0</code>。</li><li><code>1e20 * 1e20 - 1e20 * 1e20</code> 结果可能是 <code>NaN</code>（因为中间结果溢出为 <code>∞</code>）。</li></ul></li></ul><p>这对编译器优化和严肃的数值计算程序员来说是一个巨大的挑战。</p><hr><h2 id="四、C-语言中的浮点数">四、C 语言中的浮点数</h2><ul><li><strong>数据类型</strong>：C 语言保证了两种精度的浮点数：<code>float</code> (单精度) 和 <code>double</code> (双精度)。</li><li><strong>类型转换 (Casting)</strong>:<ul><li><code>double</code>/<code>float</code> → <code>int</code>: <strong>截断 (Truncate)</strong> 小数部分，类似于向零舍入。</li><li><code>int</code> → <code>double</code>: 只要 <code>int</code> 的位数不多于 53 位（<code>double</code> 的尾数位数），转换是精确的（满足double的步长小于1）。对于一般的<code>int</code>（4 bytes）转换是精确的，对于<code>long long</code>可能发生舍入。</li><li><code>int</code> → <code>float</code>: 可能会发生舍入。<strong>尾数 (Mantissa)</strong>：只剩下 <strong>23 位</strong>（加上隐含的 1，共 <strong>24 位</strong>有效数字），不一定能存下<code>int</code>的最多32位有效数字。</li></ul></li><li><strong>比较问题</strong>：<ul><li>表达式 <code>(f+d)-f == d</code> 可能为 <code>false</code>，因为 <code>f+d</code> 的计算可能导致 <code>d</code> 的低位精度丢失。大数+小数导致精度丢失。</li></ul></li></ul><h3 id="浮点数谜题（Floating-Point-Puzzles）">浮点数谜题（Floating Point Puzzles）</h3><p><strong>预设条件</strong>: <code>int x</code> (32位), <code>float f</code> (32位), <code>double d</code> (64位)。假设无 NaN。</p><h4 id="1-类型转换与精度">1. 类型转换与精度</h4><ul><li><strong><code>x == (int)(float) x</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>False</strong><ul><li><strong>原因</strong>: <code>int</code> (31位有效值) &gt; <code>float</code> (24位有效精度)。大整数转 float 会发生舍入，丢失精度。</li></ul></li><li><strong><code>x == (int)(double) x</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: <code>double</code> (53位有效精度) &gt; <code>int</code> (31位)。double 能像大箱子一样无损装下 int。</li></ul></li><li><strong><code>f == (float)(double) f</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: float 转 double 是无损的（尾数补零），转回来数值不变。</li></ul></li><li><strong><code>d == (float) d</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>False</strong><ul><li><strong>原因</strong>: double 转 float 会发生舍入（丢弃低位）或溢出（变无穷大）。</li></ul></li></ul><h4 id="2-运算规则">2. 运算规则</h4><ul><li><strong><code>2/3 == 2/3.0</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>False</strong><ul><li><strong>原因</strong>: 左边是<strong>整数除法</strong> (结果为 0)，右边是<strong>浮点除法</strong> (结果为 0.66…)。</li></ul></li><li><strong><code>(d+f)-d == f</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>False</strong><ul><li><strong>原因</strong>: <strong>大数吃小数</strong>。当 <code>d</code> 极大 <code>f</code> 极小时，<code>d+f</code> 可能因精度限制仍等于 <code>d</code>，导致最终结果为 <code>0</code> (不等于 <code>f</code>)。</li></ul></li></ul><h4 id="3-符号与不等式">3. 符号与不等式</h4><ul><li><strong><code>f == -(-f)</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: 两次翻转符号位，还原回原值。</li></ul></li><li><strong><code>d &lt; 0.0 =&gt; ((d*2) &lt; 0.0)</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: 浮点数乘 2 仅增加指数，<strong>不改变符号位</strong>。即使溢出为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">-\infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">∞</span></span></span></span> 也依然小于 0。</li></ul></li><li><strong><code>d &gt; f =&gt; -f &gt; -d</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: 数学不等式性质，同乘 -1 变号。</li></ul></li><li><strong><code>d * d &gt;= 0.0</code></strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <strong>True</strong><ul><li><strong>原因</strong>: 实数平方非负。自乘时符号位异或 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>⊕</mo><mn>0</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">0 \oplus 0 = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>)，结果永远为正。</li></ul></li></ul><h4 id="核心记忆原则">核心记忆原则</h4><ol><li><strong>大转小必有失</strong>：<code>double</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>float</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>int</code> 容易丢失精度或溢出。</li><li><strong>小转大很安全</strong>：<code>int</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\to</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> <code>double</code> 是绝对精确的。</li><li><strong>大数吃小数</strong>：浮点加法运算中，极大数加极小数，小数的精度会被忽略。</li></ol><hr><h2 id="五、前沿热点：FP8">五、前沿热点：FP8</h2><p>近年来，随着 AI 的发展，低精度浮点数格式成为研究热点。</p><ul><li><strong>背景</strong>：为了在 AI 芯片中实现更高的计算吞吐量和更低的功耗，业界提出了多种比 FP32/FP16 更低精度的格式，如 <strong>FP8</strong>。</li><li><strong>FP8 格式</strong>：FP8 有多种变体，主要通过调整 <strong>阶码 (Exponent)</strong> 和 <strong>尾数 (Mantissa/Fraction)</strong> 的位数来权衡<strong>动态范围 (Range)</strong> 和 <strong>精度 (Precision)</strong>。<ul><li><strong>E5M2</strong>: 5 位阶码，2 位尾数。提供更大的动态范围，适合梯度等数值范围大的场景。</li><li><strong>E4M3</strong>: 4 位阶码，3 位尾数。提供更高的精度，适合权重等场景。</li></ul></li><li><strong>优势</strong>：在专用硬件（如 NVIDIA H100 GPU）上，使用 FP8 进行张量运算可以比 FP16 带来数倍的性能提升。</li></ul><h2 id="总结">总结</h2><ul><li>IEEE 754 标准为浮点数提供了一套清晰的数学属性和运算规则。</li><li>浮点数的表示形式为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo>−</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mi>s</mi></msup><mo>×</mo><mi>M</mi><mo>×</mo><msup><mn>2</mn><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">(-1)^s \times M \times 2^E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span>。</li><li>我们可以独立于具体硬件实现来推理浮点运算，因为其行为就像是先用无限精度计算再进行舍入。</li><li><strong>核心要点</strong>：浮点数算术 <strong>不等于</strong> 实数算术，它不满足结合律和分配律。理解这一点对于编写健壮、可靠的数值计算代码至关重要。</li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/02-Folat/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/02-Folat/"/>
    <published>2026-01-14T17:30:00.000Z</published>
    <summary>一、小数的二进制表示 (Fractional Binary Numbers)</summary>
    <title>CSAPP - 02.Floating Point Numbers</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="CSAPP" scheme="https://yima-gu.github.io/categories/CSAPP/"/>
    <category term="CSAPP" scheme="https://yima-gu.github.io/tags/CSAPP/"/>
    <content>
      <![CDATA[<h2 id="1-核心概念：位、字节与字">1. 核心概念：位、字节与字</h2><p>在计算机系统中，所有信息都表示为二进制位（bits）。</p><ul><li><p><strong>字节 (Byte)</strong>：是内存中最小的可寻址单位，通常由8个位（bit）组成。内存可以看作是一个巨大的字节数组，每个字节都有一个唯一的地址。</p></li><li><p><strong>字 (Word)</strong>：是处理器处理数据的标称大小（nominal size）。字长（Word Size）决定了虚拟地址空间的最大大小。</p></li><li><p>CPU需要通过地址来访问内存中的数据，存放这些地址的地方就是<strong>寄存器</strong>（特别是地址寄存器） 。</p></li><li><p>寄存器的<mark><strong>宽度等于字长</strong></mark>。这意味着一个<strong>32位</strong>的CPU，其地址寄存器最多只能存储32位的地址。</p><ul><li><strong>32位系统</strong>：字长为32位（4字节），虚拟地址空间最大为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>32</mn></msup></mrow><annotation encoding="application/x-tex">2^{32}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">32</span></span></span></span></span></span></span></span></span></span></span></span> 字节，即 4GB。</li><li><strong>64位系统</strong>：字长为64位（8字节），理论地址空间可达 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>64</mn></msup></mrow><annotation encoding="application/x-tex">2^{64}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">64</span></span></span></span></span></span></span></span></span></span></span></span> 字节，但实际系统（如x86-64）通常支持48位地址，即 256TB。</li></ul></li></ul><h3 id="C语言基本数据类型大小">C语言基本数据类型大小</h3><p>不同数据类型在不同架构的机器上可能占用不同大小的内存。表格中为所占的字节数。</p><table><thead><tr><th style="text-align:left">C Data Type</th><th style="text-align:left">Typical 32-bit</th><th style="text-align:left">Intel IA32</th><th style="text-align:left">x86-64</th></tr></thead><tbody><tr><td style="text-align:left">char</td><td style="text-align:left">1</td><td style="text-align:left">1</td><td style="text-align:left">1</td></tr><tr><td style="text-align:left">short</td><td style="text-align:left">2</td><td style="text-align:left">2</td><td style="text-align:left">2</td></tr><tr><td style="text-align:left">int</td><td style="text-align:left">4</td><td style="text-align:left">4</td><td style="text-align:left">4</td></tr><tr><td style="text-align:left">long</td><td style="text-align:left">4</td><td style="text-align:left">4</td><td style="text-align:left">8</td></tr><tr><td style="text-align:left">float</td><td style="text-align:left">4</td><td style="text-align:left">4</td><td style="text-align:left">4</td></tr><tr><td style="text-align:left">double</td><td style="text-align:left">8</td><td style="text-align:left">8</td><td style="text-align:left">8</td></tr><tr><td style="text-align:left">pointer</td><td style="text-align:left">4</td><td style="text-align:left">4</td><td style="text-align:left">8</td></tr></tbody></table><h2 id="2-字节序-Byte-Ordering">2. 字节序 (Byte Ordering)</h2><p>当一个数据（如<code>int</code>）需要<mark><strong>多个字节存储</strong></mark>时，就涉及到了<strong>字节在<mark>内存</mark>中的排列顺序</strong>问题。指针指向的地址与大小端无关，总是指向该数据的第一个字节（即<strong>最低地址的字节</strong>）。</p><ul><li><strong>小端表示法 (Little-Endian)</strong>：数据的<strong>最低有效字节 (Least Significant Byte, LSB)</strong> 存放在<strong>最低地址</strong>。大多数个人电脑（如x86架构）采用此模式。</li><li><strong>大端表示法 (Big-Endian)</strong>：数据的<strong>最高有效字节 (Most Significant Byte, MSB)</strong> 存放在<strong>最低地址</strong>。一些服务器和网络协议（如Internet Protocol）采用此模式。</li></ul><p><strong>示例</strong>：一个4字节的变量 <code>x</code>，值为 <code>0x01234567</code>，存放在地址 <code>0x100</code> 处。</p><table><thead><tr><th>Endian Type</th><th style="text-align:center">Addr 0x100</th><th style="text-align:center">0x101</th><th style="text-align:center">0x102</th><th style="text-align:center">0x103</th></tr></thead><tbody><tr><td>Big Endian</td><td style="text-align:center">01</td><td style="text-align:center">23</td><td style="text-align:center">45</td><td style="text-align:center">67</td></tr><tr><td>Little Endian</td><td style="text-align:center">67</td><td style="text-align:center">45</td><td style="text-align:center">23</td><td style="text-align:center">01</td></tr></tbody></table><p><strong>注意</strong>：字符串是由字符（单字节）数组表示的，每个字符使用如ASCII这样的标准编码。因此，字符串的存储<strong>不受字节序的影响</strong>。</p><h3 id="方案一：通过指针检测系统字节序">方案一：通过指针检测系统字节序</h3><p>可以通过C代码判断机器是大端序还是小端序：</p><p>利用 C 语言指针的强制类型转换，查看整数的第一个字节。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span><br><br><span class="hljs-type">int</span> <span class="hljs-title function_">is_little_endian</span><span class="hljs-params">()</span> &#123;<br>    <span class="hljs-type">unsigned</span> <span class="hljs-type">int</span> x = <span class="hljs-number">1</span>; <span class="hljs-comment">// 16进制表示: 0x 00 00 00 01</span><br>    <br>    <span class="hljs-comment">// 核心逻辑：</span><br>    <span class="hljs-comment">// 1. &amp;x 取出 int 的地址</span><br>    <span class="hljs-comment">// 2. (char*) 强制转换为“单字节视角”</span><br>    <span class="hljs-comment">// 3. * 解引用，只读取内存中最低地址的那 1 个字节</span><br>    <span class="hljs-type">char</span> *c = (<span class="hljs-type">char</span>*)&amp;x; <br><br>    <span class="hljs-keyword">return</span> *c; <span class="hljs-comment">// 返回 1 则是小端，返回 0 则是大端</span><br>&#125;<br><br><span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> &#123;<br>    <span class="hljs-keyword">if</span> (is_little_endian()) &#123;<br>        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Detected: Little-endian (小端)\n&quot;</span>); <span class="hljs-comment">// 此时内存低地址存放的是 01</span><br>    &#125; <span class="hljs-keyword">else</span> &#123;<br>        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Detected: Big-endian (大端)\n&quot;</span>);    <span class="hljs-comment">// 此时内存低地址存放的是 00</span><br>    &#125;<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong><code>(char*)&amp;x</code></strong>: 这是最关键的一步。</p><ul><li><code>&amp;x</code> 指向 4 字节的整体起始位置。</li><li>转换为 <code>char*</code> 后，编译器认为指针指向的“跨度”只有 <strong>1 个字节</strong>。</li></ul><h3 id="方案二：使用-show-bytes-可视化内存">方案二：使用 <code>show_bytes</code> 可视化内存</h3><p>不仅检测，还能看到完整的字节排列。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span><br><br><span class="hljs-keyword">typedef</span> <span class="hljs-type">unsigned</span> <span class="hljs-type">char</span> *byte_pointer;<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">show_bytes</span><span class="hljs-params">(byte_pointer start, <span class="hljs-type">int</span> len)</span> &#123;<br>    <span class="hljs-comment">// 遍历内存，从低地址向高地址打印</span><br>    <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i &lt; len; i++) &#123;<br>    <span class="hljs-comment">//这里的start被解释为unsigned char指针，[]操作每次移动1字节</span><br>        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot; %.2x&quot;</span>, start[i]); <br>    &#125;<br>    <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;\n&quot;</span>);<br>&#125;<br><br><span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> &#123;<br>    <span class="hljs-type">int</span> a = <span class="hljs-number">1</span>; <span class="hljs-comment">// 0x00000001</span><br>    <span class="hljs-comment">// 将 int 指针强转为 byte_pointer，传入字节长度</span><br>    show_bytes((byte_pointer) &amp;a, <span class="hljs-keyword">sizeof</span>(<span class="hljs-type">int</span>)); <br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br></code></pre></td></tr></table></figure><ul><li><code>start[i]</code>：取出一个字节的数据<ul><li><strong>含义</strong>：<code>start</code> 是一个指向字节（<code>unsigned char</code>）的指针（数组）。<code>[i]</code> 表示“偏移量”。</li><li><strong>动作</strong>：这表示去内存中找到 <code>start</code> 地址开始，向后数第 <code>i</code> 个位置，取出那里存放的<strong>1 个字节</strong>的内容。</li><li><strong>数值范围</strong>：因为是 <code>unsigned char</code>，取出来的值在十进制看是 <code>0</code> 到 <code>255</code>，在十六进制看是 <code>0x00</code> 到 <code>0xFF</code>。</li></ul></li><li><code>%</code>占位符开始，仅仅作为标记</li><li><strong>十六进制 (Hex)</strong>。把数值转换成十六进制显示，使用小写字母 (<code>a-f</code>)。这是计算机底层最通用的语言。</li><li><code>.2</code> <strong>精度/宽度控制</strong>。这是最精髓的地方：<strong>“至少显示 2 位”</strong>。如果数字不够 2 位，<strong>在前面补 0</strong>。</li></ul><h2 id="3-位级操作">3. 位级操作</h2><h3 id="1-结合表示与操作">1. 结合表示与操作</h3><p><strong>1. 集合的位向量表示 (Bit Vector Representation)</strong></p><ul><li><strong>核心定义</strong>：使用宽度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 的位向量来表示集合 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>w</mi><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{0, \dots, w-1\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span> 的子集。</li><li><strong>规则</strong>：当第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 位为 1 时 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>j</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">a_j = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)，表示元素 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 存在于集合中。</li><li><strong>索引对应</strong>：位索引从右向左依次为 <code>76543210</code>。</li><li><strong>示例</strong>：<ul><li><code>01101001</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\rightarrow \{ 0, 3, 5, 6 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mclose">}</span></span></span></span></li><li><code>01010101</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\rightarrow \{ 0, 2, 4, 6 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mclose">}</span></span></span></span></li></ul></li></ul><p><strong>2. 集合操作 (Operations)</strong></p><p>基于位运算实现集合代数：</p><table><thead><tr><th style="text-align:left">位运算符</th><th style="text-align:left">对应集合操作</th><th style="text-align:left">运算结果 (二进制)</th><th style="text-align:left">结果集合</th></tr></thead><tbody><tr><td style="text-align:left"><strong><code>&amp;</code></strong></td><td style="text-align:left"><strong>交集 (Intersection)</strong></td><td style="text-align:left"><code>01000001</code></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{ 0, 6 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mclose">}</span></span></span></span></td></tr><tr><td style="text-align:left"><code>|</code></td><td style="text-align:left"><strong>并集 (Union)</strong></td><td style="text-align:left"><code>01111101</code></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{ 0, 2, 3, 4, 5, 6 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mclose">}</span></span></span></span></td></tr><tr><td style="text-align:left"><strong><code>^</code></strong></td><td style="text-align:left"><strong>对称差 (Symmetric Difference)</strong></td><td style="text-align:left"><code>00111100</code></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{ 2, 3, 4, 5 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mclose">}</span></span></span></span></td></tr><tr><td style="text-align:left"><strong><code>~</code></strong></td><td style="text-align:left"><strong>补集 (Complement)</strong></td><td style="text-align:left"><code>10101010</code></td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{ 1, 3, 5, 7 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">}</span></span></span></span></td></tr></tbody></table><h3 id="2-位运算符">2. 位运算符 (<code>&amp;</code>, <code>|</code>, <code>~</code>, <code>^</code>)</h3><p>C语言提供了直接在位级别上进行操作的运算符。</p><p>这些运算符将操作数视为位向量，并按位进行计算。</p><ul><li><code>&amp;</code> (AND): 逐位与</li><li><code>|</code> (OR): 逐位或</li><li><code>~</code> (NOT): 逐位取反</li><li><code>^</code> (XOR): 逐位异或</li></ul><p><strong>示例</strong> (<code>char</code> 类型):</p><ul><li><code>~0x41</code> (<code>01000001₂</code>)  -&gt; <code>0xBE</code> (<code>10111110₂</code>)</li><li><code>0x69 | 0x55</code> -&gt; <code>01101001₂ | 01010101₂</code> -&gt; <code>01111101₂</code> -&gt; <code>0x7D</code></li></ul><h3 id="3-逻辑运算符">3. 逻辑运算符 (<code>&amp;&amp;</code>, <code>||</code>, <code>!</code>)</h3><p><mark><strong>逻辑</strong></mark>运算符与之不同，它们将任何<strong>非零值视为 <code>True</code></strong>，将<strong>零值视为 <code>False</code></strong>，并且结果总是 <code>0</code> 或 <code>1</code>。</p><p><strong>示例</strong> (<code>char</code> 类型):</p><ul><li><code>!0x41</code> -&gt; <code>!True</code> -&gt; <code>False</code> -&gt; <code>0x00</code></li><li><code>0x69 &amp;&amp; 0x55</code> -&gt; <code>True &amp;&amp; True</code> -&gt; <code>True</code> -&gt; <code>0x01</code></li></ul><h3 id="4-移位运算">4. 移位运算 (<code>&lt;&lt;</code>, <code>&gt;&gt;</code>)</h3><ul><li><strong>左移 <code>x &lt;&lt; y</code></strong>: 将 <code>x</code> 的位向左移动 <code>y</code> 位，右侧补0。</li><li><strong>右移 <code>x &gt;&gt; y</code></strong>: 将 <code>x</code> 的位向右移动 <code>y</code> 位。<ul><li><strong>逻辑右移</strong>: 左侧补0。对<strong>无符号数</strong> (<code>unsigned</code>) 必须使用逻辑右移。</li><li><strong>算术右移</strong>: 左侧用<strong>最高有效位 (符号位)</strong> 填充。几乎所有机器都对<strong>有符号数</strong>使用算术右移，这能保证负数在除以2的幂时结果正确。</li></ul></li></ul><p><strong>注意</strong>：移位量小于0或大于等于字长是未定义行为。</p><hr><h2 id="5-整数表示">5. 整数表示</h2><h3 id="1-无符号整数-Unsigned">1. 无符号整数 (Unsigned)</h3><ul><li><strong>表示</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mn>2</mn><mi>U</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msubsup><msub><mi>x</mi><mi>i</mi></msub><mo>⋅</mo><msup><mn>2</mn><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">B2U(X) = \sum_{i=0}^{w-1} x_i \cdot 2^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2537em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8247em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span></span></span></li><li><strong>范围</strong>: 对于一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 位的整数，范围是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mi>w</mi></msup><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[0, 2^w - 1]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span>。</li></ul><h3 id="2-有符号整数-Signed-二进制补码-Two’s-Complement">2. 有符号整数 (Signed) - 二进制补码 (Two’s Complement)</h3><ul><li><strong>表示</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mn>2</mn><mi>T</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><msub><mi>x</mi><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msub><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>w</mi><mo>−</mo><mn>2</mn></mrow></msubsup><msub><mi>x</mi><mi>i</mi></msub><msup><mn>2</mn><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">B2T(X) = -x_{w-1} 2^{w-1} + \sum_{i=0}^{w-2} x_i 2^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0224em;vertical-align:-0.2083em;"></span><span class="mord">−</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2537em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span></span></span></li><li>最高有效位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{w-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 是<strong>符号位</strong>，<code>0</code> 代表非负数，<code>1</code> 代表负数。</li><li><strong>范围</strong>: 对于一个 w 位的整数，范围是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mo>−</mo><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[-2^{w-1}, 2^{w-1} - 1]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span>。这是一个不对称的范围，负数的表示范围比正数多一个。</li></ul><table><thead><tr><th style="text-align:center">w (Bits)</th><th style="text-align:left">UMax (Unsigned Max)</th><th style="text-align:left">TMin (Signed Min)</th><th style="text-align:left">TMax (Signed Max)</th></tr></thead><tbody><tr><td style="text-align:center">8</td><td style="text-align:left">255</td><td style="text-align:left">-128</td><td style="text-align:left">127</td></tr><tr><td style="text-align:center">16</td><td style="text-align:left">65,535</td><td style="text-align:left">-32,768</td><td style="text-align:left">32,767</td></tr><tr><td style="text-align:center">32</td><td style="text-align:left">4,294,967,295</td><td style="text-align:left">-2,147,483,648</td><td style="text-align:left">2,147,483,647</td></tr></tbody></table><p>![[Course-Notes/Computer-Organization/Slides/02-bits-ints.pdf#page=42&amp;rect=24,17,699,499|02-bits-ints, p.42|500]]</p><h3 id="3-整数和它的相反数">3. 整数和它的相反数</h3><p>对于一个补码表示的整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span>，其相反数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mi>X</mi></mrow><annotation encoding="application/x-tex">-X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 可以通过 <code>~X + 1</code> 计算得到。对于<code>TMin</code>计算相反数有<code>~TMin+1</code>仍然为<code>TMin</code>。</p><hr><h2 id="6-类型转换与扩展">6. 类型转换与扩展</h2><h3 id="1-有符号与无符号整数的转换">1. 有符号与无符号整数的转换</h3><p>在C语言中，对有符号和无符号数进行强制类型转换时，<strong>底层的位模式保持不变</strong>，改变的只是对这些位的解释方式。</p><ul><li><strong>潜在问题</strong>：当一个表达式中同时包含 <code>signed</code> 和 <code>unsigned</code> 类型的变量时，C语言会<mark><strong>隐式地将有符号数转换为无符号数</strong></mark>再进行比较或运算。</li></ul><p>(1) <code>-2147483647-1 == 2147483648U</code>  <code>T</code><br>(2) <code>2147483647 &gt; (int) 2147483648U</code> <code>T</code><br>(3) <code>-1 &lt; 0U</code> <code>F</code></p><p><strong>示例</strong>:</p><ul><li><code>-1 &lt; 0U</code> 的结果是 <code>False</code>。因为 <code>-1</code> 被转换为 <code>UMax</code> (一个很大的正数)，所以 <code>UMax &lt; 0</code> 不成立。</li><li><code>2147483647 &gt; (int)2147483648U</code> 的结果是 <code>True</code>。因为 <code>2147483648U</code> (即 <code>TMax + 1</code>) 转换为 <code>int</code> 后，其位模式被解释为 <code>TMin</code> (<code>-2147483648</code>)，所以 <code>TMax &gt; TMin</code> 成立。</li></ul><h3 id="2-扩展与截断">2. 扩展与截断</h3><ul><li><strong>扩展 (Expanding)</strong>: 从一个较小的数据类型转换为一个较大的数据类型（如 <code>short</code> -&gt; <code>int</code>）。<ul><li><strong>无符号数</strong>: 高位补0 (零扩展)。</li><li><strong>有符号数</strong>: 高位用<strong>符号位</strong>填充 (符号扩展)。</li></ul></li><li><strong>截断 (Truncating)</strong>: 从一个较大的数据类型转换为一个较小的数据类型。直接丢弃高位。数值可能会发生巨大变化。<ul><li>对于有符号整数而言是模运算。</li></ul></li></ul><div class="note note-info">            <p>当把一个数扩展一位（从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 位变成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">w+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 位）时，你把原来的符号位复制到了新的最高位。</p><ul><li><strong>原来的符号位</strong>（现在变成了次高位）：权重从 <strong>负</strong> 变成了 <strong>正</strong>。即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">-2^{w-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span> 变成了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">+2^{w-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span>。</li><li><strong>新的符号位</strong>（复制过来的）：拥有了新的 <strong>负</strong> 权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><msup><mn>2</mn><mi>w</mi></msup></mrow><annotation encoding="application/x-tex">-2^w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span></span></span></span></span></span></span>。</li></ul><p>数值保持不变，因为：</p>          </div><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munder><munder><mrow><mo>−</mo><msup><mn>2</mn><mi>w</mi></msup></mrow><mo stretchy="true">⏟</mo></munder><mtext>新符号位权重</mtext></munder><mo>+</mo><munder><munder><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup><mo stretchy="true">⏟</mo></munder><mtext>旧符号位(现为正)</mtext></munder><mo>=</mo><munder><munder><mrow><mo>−</mo><msup><mn>2</mn><mrow><mi>w</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><mo stretchy="true">⏟</mo></munder><mtext>原符号位权重</mtext></munder></mrow><annotation encoding="application/x-tex">\underbrace{-2^w}_{\text{新符号位权重}} + \underbrace{2^{w-1}}_{\text{旧符号位(现为正)}} = \underbrace{-2^{w-1}}_{\text{原符号位权重}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.1241em;vertical-align:-1.4097em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-1.5903em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">新符号位权重</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span class="svg-align" style="top:-2.2687em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7313em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4097em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.4121em;vertical-align:-1.548em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-1.627em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">旧符号位</span><span class="mord mtight">(</span><span class="mord cjk_fallback mtight">现为正</span><span class="mord mtight">)</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span class="svg-align" style="top:-2.352em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.648em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.548em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2738em;vertical-align:-1.4097em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-1.5903em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">原符号位权重</span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span class="svg-align" style="top:-2.2687em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:0.548em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7313em;"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4097em;"><span></span></span></span></span></span></span></span></span></span></p><blockquote><ul><li>类似的可以说明：为什么对有符号数进行位运算是乘除。</li></ul></blockquote><hr><h2 id="7-整数运算">7. 整数运算</h2><h3 id="1-加法">1. 加法</h3><ul><li>加法的实现是位级的，直接对对应位进行加法，并处理进位。使用异或（XOR）和与（AND）操作来实现。<ul><li>对应两种位运算：<ul><li>本位和（Sum without Carry） <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 异或 (<code>^</code> XOR)</li><li>进位（Carry） <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> 与 (<code>&amp;</code> AND) + 左移 (<code>&lt;&lt;</code>)</li></ul></li><li>加法运算逻辑上是串行的，但现代硬件把它做成了并行的。现代计算机（x86, ARM）无法忍受这种等待，于是设计了<strong>超前进位加法器</strong> (Carry Lookahead Adder, CLA)。</li></ul></li><li>减法的实现是通过补码转换成加法来完成的，即 <code>x - y</code> 等价于 <code>x + (~y + 1)</code>。</li><li><strong>无符号加法</strong>: 结果是对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>w</mi></msup></mrow><annotation encoding="application/x-tex">2^w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span></span></span></span></span></span></span> 取模的。如果真实和 <code>u+v</code> 大于等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>w</mi></msup></mrow><annotation encoding="application/x-tex">2^w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span></span></span></span></span></span></span>，就会发生<strong>溢出 (Overflow)</strong>，实际结果是 <code>u+v - 2^w</code>。这是一种<strong>模运算</strong>。</li><li><strong>有符号加法 (补码加法)</strong>: 位级行为与无符号加法完全相同。 溢出分为两种情况：<ul><li><strong>正溢出 (Positive Overflow)</strong>: 两个正数相加，结果大于 <code>TMax</code>，变成了一个负数。</li><li><strong>负溢出 (Negative Overflow)</strong>: 两个负数相加，结果小于 <code>TMin</code>，变成了一个正数。</li></ul></li></ul><p>在 C 语言或其他底层开发中，<strong>不能</strong>用 <code>if (a + b &gt; TMax)</code> 来判断，因为 <code>a+b</code> 在计算时就已经溢出（截断）了，比较结果是失效的。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">// 假设 x 和 y 都是 int 类型</span><br><span class="hljs-type">int</span> sum = x + y;<br><br><span class="hljs-comment">// 获取符号位 (这里简化概念，实际代码可以直接比较 &lt; 0)</span><br><span class="hljs-type">int</span> x_sign = x &lt; <span class="hljs-number">0</span>; <br><span class="hljs-type">int</span> y_sign = y &lt; <span class="hljs-number">0</span>;<br><span class="hljs-type">int</span> sum_sign = sum &lt; <span class="hljs-number">0</span>;<br><br><span class="hljs-comment">// 核心判断逻辑</span><br><span class="hljs-type">int</span> overflow = (x_sign == y_sign) &amp;&amp; (x_sign != sum_sign);<br></code></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">// 假设计算 result = x - y;</span><br><br><span class="hljs-type">int</span> x_sign = x &lt; <span class="hljs-number">0</span>;<br><span class="hljs-type">int</span> y_sign = y &lt; <span class="hljs-number">0</span>;<br><span class="hljs-type">int</span> res_sign = result &lt; <span class="hljs-number">0</span>;<br><br><span class="hljs-comment">// 逻辑：(X与Y符号不同) 并且 (结果符号与X不同)</span><br><span class="hljs-type">int</span> overflow = (x_sign != y_sign) &amp;&amp; (res_sign != x_sign);<br></code></pre></td></tr></table></figure><p>![[Course-Notes/Computer-Organization/Slides/02-bits-ints.pdf#page=63&amp;rect=13,40,693,499|02-bits-ints, p.63|725]]</p><h3 id="2-乘法">2. 乘法</h3><p>C语言中的整数乘法会丢弃高 <code>w</code> 位，其实质也是一种模运算。</p><ul><li><strong>乘以2的幂</strong>: 可以通过左移 <code>&lt;&lt;</code> 来实现，这比直接使用乘法指令效率更高。 <code>u &lt;&lt; k</code> 等价于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi><mo>×</mo><msup><mn>2</mn><mi>k</mi></msup></mrow><annotation encoding="application/x-tex">u \times 2^k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">u</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span>。</li><li>通用乘法是通过 <strong>左移和加法</strong> 的算法实现的。模拟我们手算乘法的过程（二进制版）。对于 <code>a * b</code>，检查 <code>b</code> 的每一位：<ol><li>如果 <code>b</code> 的当前位是 <code>1</code>，则将 <code>a</code> 左移相应位数后，加到最终结果上。</li><li>如果 <code>b</code> 的当前位是 <code>0</code>，则什么都不做。</li></ol></li></ul><div class="note note-success 整数乘法的优化策略 (Optimization of Integer Multiplication)">            <p>传统的“逐位移位累加”算法过于缓慢，现代计算机主要从软硬件两个层面进行优化。</p><ol><li>编译器优化：强度削减 (针对常数乘法)<br>编译器会自动选择计算步数（代价）最少的方式，将乘法转化为移位和加减法。</li></ol><ul><li><p><strong>方案 A：移位 + 加法 (Run of 1s)</strong></p><ul><li><strong>原理</strong>：直接分解二进制中的 <code>1</code>。</li><li><strong>示例</strong> (<code>x * 14</code>, <code>1110</code>): <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo>≪</mo><mn>3</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>x</mi><mo>≪</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>x</mi><mo>≪</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x \ll 3) + (x \ll 2) + (x \ll 1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></li><li><em>代价</em>：2 次加法，3 次移位。</li></ul></li><li><p><strong>方案 B：移位 + 减法 (Booth’s Algorithm 思想)</strong></p><ul><li><strong>原理</strong>：利用连续的 <code>1</code> 序列，将其视为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mn>2</mn><mi>m</mi></msup></mrow><annotation encoding="application/x-tex">2^{n+1} - 2^m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span></span></span></span></span></span></span></span> (即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>14</mn><mo>=</mo><mn>16</mn><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">14 = 16 - 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">14</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">16</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>)。</li><li><strong>示例</strong> (<code>x * 14</code>): <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo>≪</mo><mn>4</mn><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mi>x</mi><mo>≪</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x \ll 4) - (x \ll 1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></li><li><em>代价</em>：<strong>1 次减法</strong>，2 次移位 (效率更高)。</li></ul></li></ul><ol start="2"><li><p>硬件优化：并行电路 (针对变量乘法)<br>现代 CPU 使用 <strong>华莱士树 (Wallace Tree)</strong> 或 <strong>Dadda Tree</strong> 结构，极大地提高了并行度。</p><ol><li><strong>并行生成部分积</strong>：利用逻辑门电路，瞬间并行生成所有位的部分积。</li><li><strong>树状压缩</strong>：不再逐行累加，而是使用保留进位加法器 (Carry Save Adder) 并行地将几十行部分积“压缩”成 2 行。</li><li><strong>最终相加</strong>：当只剩下最后两行时，使用普通加法器求和。</li></ol></li></ol><ul><li>在现代 CPU (如 Intel Core 或 AMD Ryzen) 中，整数乘法通常只需要 <strong>3 到 4 个时钟周期</strong>，而不是 64 个周期。</li></ul>          </div><h3 id="3-除以2的幂">3. 除以2的幂</h3><ul><li><strong>无符号除法</strong>: 使用<strong>逻辑右移</strong> <code>&gt;&gt;</code>。<code>u &gt;&gt; k</code> 等价于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">⌊</mo><mi>u</mi><mi mathvariant="normal">/</mi><msup><mn>2</mn><mi>k</mi></msup><mo stretchy="false">⌋</mo></mrow><annotation encoding="application/x-tex">\lfloor u / 2^k \rfloor</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0991em;vertical-align:-0.25em;"></span><span class="mopen">⌊</span><span class="mord mathnormal">u</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span><span class="mclose">⌋</span></span></span></span>。</li><li><strong>有符号除法</strong>: 使用<strong>算术右移</strong> <code>&gt;&gt;</code>。<ul><li><strong>实现原理</strong>：模拟手算长除法。这是一个迭代的过程，不断地用除数去减被除数（或其一部分），并根据能否成功相减来确定商的每一位是1还是0。这通常被称为<strong>移位和减法</strong>算法。</li><li>对于<strong>正数</strong>，<code>x &gt;&gt; k</code> 等价于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">⌊</mo><mi>x</mi><mi mathvariant="normal">/</mi><msup><mn>2</mn><mi>k</mi></msup><mo stretchy="false">⌋</mo></mrow><annotation encoding="application/x-tex">\lfloor x / 2^k \rfloor</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0991em;vertical-align:-0.25em;"></span><span class="mopen">⌊</span><span class="mord mathnormal">x</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span><span class="mclose">⌋</span></span></span></span>，结果正确。</li><li>对于<strong>负数</strong>，<code>x &gt;&gt; k</code> 会向<strong>负无穷</strong>舍入（例如，-2.5 -&gt; -3），而C语言要求向<strong>零</strong>舍入（-2.5 -&gt; -2）。</li><li><strong>修正方法</strong>: 为了得到正确的结果，可以在移位前加入一个<strong>偏置 (bias)</strong>。对于负数 <code>x</code>，计算 <code>(x + (1&lt;&lt;k) - 1) &gt;&gt; k</code>。</li></ul></li></ul><p>在整数算术中，有一个非常著名的恒等式，用于将“向上取整”转化为“向下取整”：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">⌈</mo><mfrac><mi>x</mi><mi>y</mi></mfrac><mo stretchy="false">⌉</mo><mo>=</mo><mo stretchy="false">⌊</mo><mfrac><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>−</mo><mn>1</mn></mrow><mi>y</mi></mfrac><mo stretchy="false">⌋</mo></mrow><annotation encoding="application/x-tex">\lceil \frac{x}{y} \rceil = \lfloor \frac{x + y - 1}{y} \rfloor</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.988em;vertical-align:-0.8804em;"></span><span class="mopen">⌈</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">⌉</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2019em;vertical-align:-0.8804em;"></span><span class="mopen">⌊</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">⌋</span></span></span></span></span></p><p>现在把数学公式对应回计算机的位运算：</p><ol><li><strong>除数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span></strong>：在位运算中是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>k</mi></msup></mrow><annotation encoding="application/x-tex">2^k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span>，即 <code>1 &lt;&lt; k</code>。</li><li><strong>偏置量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">y - 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></strong>：即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>k</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^k - 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9324em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，在位运算中写为 <code>(1 &lt;&lt; k) - 1</code>。</li><li><strong>除法 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">⌊</mo><mo>…</mo><mi mathvariant="normal">/</mi><mi>y</mi><mo stretchy="false">⌋</mo></mrow><annotation encoding="application/x-tex">\lfloor \dots / y \rfloor</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">⌊</span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">⌋</span></span></span></span></strong>：即右移 <code>&gt;&gt; k</code>。</li></ol><p>所以有<code>(x + (1 &lt;&lt; k) - 1) &gt;&gt; k</code></p><table><thead><tr><th><strong>类型</strong></th><th><strong>例子</strong></th><th><strong>对应的位操作</strong></th><th><strong>复杂度</strong></th><th><strong>关键点</strong></th></tr></thead><tbody><tr><td><strong>无符号整数</strong> (<code>unsigned</code>)</td><td><code>u / 4</code></td><td><strong>逻辑右移</strong> (<code>&gt;&gt; 2</code>)</td><td>✅ 简单</td><td>左边补 0，直接移位结果就是对的。</td></tr><tr><td><strong>有符号正数</strong> (<code>int &gt; 0</code>)</td><td><code>7 / 2</code></td><td><strong>算术右移</strong> (<code>&gt;&gt; 1</code>)</td><td>✅ 简单</td><td>左边补符号位(0)，结果也是对的。</td></tr><tr><td><strong>有符号负数</strong> (<code>int &lt; 0</code>)</td><td><code>-7 / 2</code></td><td><strong>偏置 + 算术右移</strong></td><td>❌ <strong>复杂</strong></td><td>直接右移会得到 -4 (向下取整)，但 C 语言要求结果是 -3 (向零取整)。<br><br>  <br><strong>必须先加偏置 (Bias) 再移位</strong>。</td></tr></tbody></table><div class="note note-success 非 2 的幂次除法 (Division by Constants)">            <p>对于像 <code>x / 3</code>, <code>x / 10</code> 这样的除法，现代编译器通常<strong>不使用</strong>昂贵的除法指令 (<code>div</code>/<code>idiv</code>)，而是将其优化为 <strong>“乘法 + 移位”</strong>。</p><ol><li><p>核心原理：乘以倒数 (Multiply by Reciprocal)<br>基本思想是将除法 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mi mathvariant="normal">/</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">x / K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span> 转换为乘法 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>×</mo><mfrac><mn>1</mn><mi>K</mi></mfrac></mrow><annotation encoding="application/x-tex">x \times \frac{1}{K}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</p><ul><li><strong>问题</strong>：整数算术无法直接表示小数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mi>K</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{K}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</li><li><strong>方案</strong>：将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mi>K</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{K}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span> 放大 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 倍，近似为一个整数 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> (Magic Number)</strong>。<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>M</mi><mo>≈</mo><mfrac><msup><mn>2</mn><mi>n</mi></msup><mi>K</mi></mfrac><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mfrac><mn>1</mn><mi>K</mi></mfrac><mo>≈</mo><mfrac><mi>M</mi><msup><mn>2</mn><mi>n</mi></msup></mfrac></mrow><annotation encoding="application/x-tex">M \approx \frac{2^n}{K} \implies \frac{1}{K} \approx \frac{M}{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0274em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3414em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0463em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5904em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li><li><strong>最终公式</strong>：<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>x</mi><mi mathvariant="normal">/</mi><mi>K</mi><mo>≈</mo><mo stretchy="false">(</mo><mi>x</mi><mo>⋅</mo><mi>M</mi><mo stretchy="false">)</mo><mo>≫</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">x / K \approx (x \cdot M) \gg n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≫</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span></p></li></ul></li><li><p>实现步骤</p><ol><li><strong>预计算 Magic Number (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>)</strong>: 编译器会在编译阶段算出这个特殊的整数（例如除以 3 的 magic number 可能是 <code>0xAAAAAAAB</code>）。</li><li><strong>执行乘法 (Multiply)</strong>: 计算 <code>x * M</code>。通常利用 CPU 的 <code>mul</code> 指令获取 64 位乘积的<strong>高 32 位</strong> (相当于先乘 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 再除以 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>32</mn></msup></mrow><annotation encoding="application/x-tex">2^{32}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">32</span></span></span></span></span></span></span></span></span></span></span></span>)。</li><li><strong>算术右移 (Shift)</strong>: 对结果进行移位，修正剩余的比例因子。</li><li><strong>符号修正 (Signed Adjustment)</strong>: 如果是有符号数，最后通常还需要根据符号位调整（例如加 1），类似于除以 2 的幂时的偏置处理。</li></ol></li><li><p>识别特征<br>当你在汇编代码中看到 <strong>“乘以一个奇怪的大整数”</strong>（如 <code>imul ... $1431655766</code>），紧接着是 <strong>移位操作</strong>，这通常就是在做除以常数的除法。</p></li></ol>          </div><p><strong>(1) <code>(x&amp;7) != 7 || (x &lt;&lt; 29 &lt; 0)</code></strong></p><ul><li><strong>结果</strong>：<strong>1 (True)</strong></li><li>证明：<ol><li>情况一：(x &amp; 7) != 7 为真。如果 x 的最低 3 位不全是 1，那么第一部分为真。由于短路求值，整个表达式结果为 1。</li><li>情况二：(x &amp; 7) != 7 为假。这意味着 (x &amp; 7) == 7。换句话说，x 的二进制表示的最低 3 位全是 1（即形式为 …111）。<code>x &lt;&lt; 29</code> 的结果是一个负数，表达式 <code>x &lt;&lt; 29 &lt; 0</code> 成立（为真）。</li></ol></li></ul><p><strong>(2) <code>x * x &gt;= 0</code></strong></p><ul><li><p><strong>结果</strong>：<strong>0 (False)</strong></p></li><li><p>反例：整数溢出</p><p>在 32 位补码算术中，两个正数相乘可能会发生正溢出，导致结果变成负数；或者运算结果截断后符号位为 1。</p><ul><li><strong>反例取值</strong>：取 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>65535</mn></mrow><annotation encoding="application/x-tex">x = 65535</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">65535</span></span></span></span> (即十六进制 <code>0xFFFF</code>)。</li><li>计算过程  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mn>2</mn></msup><mo>=</mo><mo stretchy="false">(</mo><msup><mn>2</mn><mn>16</mn></msup><mo>−</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>=</mo><msup><mn>2</mn><mn>32</mn></msup><mo>−</mo><msup><mn>2</mn><mn>17</mn></msup><mo>+</mo><mn>1</mn><mo>&gt;</mo><msup><mn>2</mn><mn>31</mn></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">x^2 = (2^{16} - 1)^2 = 2^{32} - 2^{17} + 1 &gt; 2^{31} -1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">32</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">17</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6835em;vertical-align:-0.0391em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">31</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 并且<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mn>2</mn></msup><mo>&lt;</mo><msup><mn>2</mn><mn>32</mn></msup></mrow><annotation encoding="application/x-tex">x^2 &lt; 2^{32}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8532em;vertical-align:-0.0391em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">32</span></span></span></span></span></span></span></span></span></span></span></span><br>在 32 位系统中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>32</mn></msup></mrow><annotation encoding="application/x-tex">2^{32}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">32</span></span></span></span></span></span></span></span></span></span></span></span> 会被截断丢弃，剩下的部分是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><msup><mn>2</mn><mn>17</mn></msup><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-2^{17} + 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">17</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>。</li></ul></li></ul><p><strong>(3) <code>x &gt; 0 || -x &gt;= 0</code></strong></p><ul><li><strong>结果</strong>：<strong>0 (False)</strong></li><li>反例：最小负数 TMin，<code>TMin</code> 的相反数还是 <code>TMin</code> 自己。</li></ul><p><strong><code>x &lt; 0 || -x &lt;= 0</code></strong> 的结果对于所有整数（包括 <code>TMin</code>）恒为 <strong>1 (True)</strong>。</p>]]>
    </content>
    <id>https://yima-gu.github.io/2026/01/14/CSAPP/01-Bits,%20Bytes%20and%20Integers/</id>
    <link href="https://yima-gu.github.io/2026/01/14/CSAPP/01-Bits,%20Bytes%20and%20Integers/"/>
    <published>2026-01-14T17:20:00.000Z</published>
    <summary>1. 核心概念：位、字节与字</summary>
    <title>CSAPP - 01.bits, Bytes and Integers</title>
    <updated>2026-07-01T11:38:22.787Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Talks" scheme="https://yima-gu.github.io/categories/Talks/"/>
    <category term="AI" scheme="https://yima-gu.github.io/categories/Talks/AI/"/>
    <category term="AI Talks" scheme="https://yima-gu.github.io/tags/AI-Talks/"/>
    <category term="Reinforcement Learning" scheme="https://yima-gu.github.io/tags/Reinforcement-Learning/"/>
    <category term="OaK Architecture" scheme="https://yima-gu.github.io/tags/OaK-Architecture/"/>
    <category term="Richard Sutton" scheme="https://yima-gu.github.io/tags/Richard-Sutton/"/>
    <content>
      <![CDATA[<h1>Deep Dive: OaK Architecture &amp; The Era of Experience</h1><ul><li><strong>Speaker</strong>: Richard Sutton (Father of Reinforcement Learning)</li><li><strong>Core Theme</strong>: Next-Gen Agent Architecture: OaK (Options and Knowledge)</li><li><strong>Key Quote</strong>: <em>“What we want is a machine that can learn from experience.”</em> — Alan Turing</li></ul><hr><h2 id="1-The-Paradigm-Shift-Why-LLMs-Are-Not-Enough">1. The Paradigm Shift: Why LLMs Are Not Enough</h2><p>Sutton argues that we are transitioning between major eras of AI development. To understand why we need a new architecture, we must look at the timeline.</p><p><em>The evolution from simulation to static data, and finally to interactive experience.</em></p><h3 id="Key-Analysis-of-the-Eras">Key Analysis of the Eras</h3><ul><li><strong>Era of Human Data (Status Quo)</strong>:<ul><li><strong>Source</strong>: Static, historical human text/code.</li><li><strong>Limitation</strong>: Intelligence is capped by the quality of human data. It is essentially “Imitation Learning.”</li></ul></li><li><strong>Era of Experience (The Future)</strong>:<ul><li><strong>Source</strong>: <strong>First-person Experience</strong> (Sensation + Action + Reward).</li><li><strong>Advantage</strong>: Like AlphaGo’s “Move 37,” RL can discover strategies humans have never found through trial-and-error.</li></ul></li></ul><h2 id="2-Core-Architecture-OaK-Options-and-Knowledge">2. Core Architecture: OaK (Options and Knowledge)</h2><p>To adapt to this “Era of Experience,” Sutton proposes the <strong>OaK Architecture</strong>. This is not just a policy network, but a complete cognitive system.</p><p><em>How the internal components connect to build a “Mind”.</em></p><pre class="mermaid">graph TD    %% Styles    style Agent fill:#f4f6f7,stroke:#333,stroke-width:2px    style World fill:#eafaf1,stroke:#333,stroke-width:2px    subgraph World [External Environment]        Observation(Observation / Sensation)        Reward(Reward Signal)    end    subgraph Agent [The OaK Agent]        direction TB                P["<b>Perception</b><br/>Generate State Features"]                subgraph Mind [Decision & Modeling]            RP["<b>Reactive Policy & Options</b><br/>(Behaviors)"]            VF["<b>Value Functions</b><br/>Eval (Main + Subtasks)"]            TM["<b>Transition Model (Knowledge)</b><br/>(Prediction)"]        end                Planning["<b>Planning</b><br/>(Longer jumps with models)"]    end        Action(Action)    %% Data Flow    World -->|Obs + Reward| P    P -->|State Features| RP    P -->|State Features| VF    P -->|State Features| TM        TM <-->|Predict Future| Planning    Planning -.->|Improve| RP        RP -->|Output Option| Action    Action -->|Act upon| World</pre><h3 id="Component-Definitions">Component Definitions</h3><ol><li><strong>O - Options (Skills)</strong>:<ul><li>The unit of behavior is not an atomic <code>Action</code>, but a <strong>temporally extended skill</strong>.</li><li><em>Definition</em>: A pair <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>π</mi><mo separator="true">,</mo><mi>γ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\pi, \gamma)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mclose">)</span></span></span></span>.</li><li><em>Example</em>: “Open the door” (Sequence of moves) vs. “Move hand 1cm” (Atomic).</li></ul></li><li><strong>K - Knowledge (World Model)</strong>:<ul><li>Specifically refers to the <strong>Transition Model</strong>.</li><li><em>Function</em>: It predicts, “If I execute this Option, where will I end up?”</li></ul></li></ol><h2 id="3-Runtime-Mechanism-The-Dynamic-Loop">3. Runtime Mechanism: The Dynamic Loop</h2><p>OaK is not a static script. It is a process performed in parallel at runtime to essentially “grow” a mind.</p><p><em>The cycle of curiosity and mastery.</em></p><pre class="mermaid">graph TD    %% === Node Definitions ===    Start((Start))    Step1["Generate State Features<br/>(Perception)"]    Step2["Create Subproblems<br/>(For highly-ranked features)"]    Step3["Learn Options<br/>(Policy + Termination)"]    Step4["Learn Knowledge<br/>(Transition Models)"]    Step5["Plan with Models<br/>(Longer Jumps)"]        %% === Main Flow ===    Start --> Step1    Step1 -->|Extract New Features| Step2    Step2 -->|Set Internal Goals| Step3    Step3 -->|Master Skills| Step4    Step4 -->|Predict Consequences| Step5    Step5 -->|Better Strategy| Step1    %% === Side Notes (Cognitive Process) ===    subgraph Meaning [Cognitive Evolution]        direction TB        L1["Curiosity: Finding new things"]        L2["Practice: Learning control"]        L3["Understanding: Building World Model"]        L4["Wisdom: Long-term Planning"]    end        %% Connections    Step2 -.-> L1    Step3 -.-> L2    Step4 -.-> L3    Step5 -.-> L4    %% === Highlighting ===    style Step2 fill:#f9e79f,stroke:#f1c40f,stroke-width:2px    style Step4 fill:#aed6f1,stroke:#3498db,stroke-width:2px</pre><h3 id="How-it-works">How it works:</h3><ol><li><strong>Feature Generation</strong>: The agent notices a new feature (e.g., “The door is open”).</li><li><strong>Subproblem Creation</strong> (Curiosity): It asks, “How can I make the door open?”</li><li><strong>Learn Options</strong> (Skill): It practices until it masters opening the door.</li><li><strong>Learn Knowledge</strong> (Understanding): It learns that “Opening the door leads to the hallway.”</li><li><strong>Planning</strong>: Now it can plan: “Open door -&gt; Go to Hallway,” jumping over the micro-steps.</li></ol><h2 id="4-Comparison-Standard-RL-vs-OaK">4. Comparison: Standard RL vs. OaK</h2><p>Why is OaK better for AGI?</p><table><thead><tr><th><strong>Feature</strong></th><th><strong>Standard RL Agent</strong></th><th><strong>OaK Agent (Sutton’s Vision)</strong></th></tr></thead><tbody><tr><td><strong>Goal</strong></td><td>Single Main Goal</td><td><strong>Multiple Goals</strong> (Main + Countless Subproblems)</td></tr><tr><td><strong>Unit of Behavior</strong></td><td>Atomic Action</td><td><strong>Option / Skill</strong></td></tr><tr><td><strong>World Model</strong></td><td>Pixel-level / Next-step</td><td><strong>State-to-State / Consequence Prediction</strong></td></tr><tr><td><strong>Driver</strong></td><td>Extrinsic Reward</td><td><strong>Curiosity &amp; Feature Attainment</strong></td></tr><tr><td><strong>Planning</strong></td><td>Short-sighted or expensive</td><td><strong>Long-jump Planning</strong> (Temporal Abstraction)</td></tr></tbody></table><hr><h2 id="5-Key-Takeaways-for-Review">5. Key Takeaways for Review</h2><ol><li><strong>The Route to AGI</strong>: Sutton argues LLMs are great interfaces to knowledge, but <strong>RL is the core of intelligence</strong>because only RL breaks the data ceiling through interaction.</li><li><strong>Revival of Hierarchical RL (HRL)</strong>: OaK is essentially the ultimate form of HRL—<strong>Automatic</strong> sub-goal discovery, <strong>Automatic</strong> skill learning, and <strong>Automatic</strong> high-level modeling.</li><li><strong>The Nature of Planning</strong>: In OaK, planning happens at the “Concept/Skill” level, not the “Pixel” level. This mirrors human reasoning (e.g., “Drive to airport” vs. “Move foot 1cm forward”).</li></ol>]]>
    </content>
    <id>https://yima-gu.github.io/2025/11/30/talks/The%20Era%20of%20Experience/</id>
    <link href="https://yima-gu.github.io/2025/11/30/talks/The%20Era%20of%20Experience/"/>
    <published>2025-11-30T20:00:00.000Z</published>
    <summary>
      <![CDATA[Deep Dive: OaK Architecture & The Era of Experience]]>
    </summary>
    <title>The Era of Experience</title>
    <updated>2026-07-01T11:38:22.796Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/categories/Deep-Learning/"/>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/tags/Deep-Learning/"/>
    <category term="GenerativeModel" scheme="https://yima-gu.github.io/tags/GenerativeModel/"/>
    <content>
      <![CDATA[<h2 id="Generative-Model">Generative Model</h2><p>数据分布是生成模型的核心。生成模型的目标是学习数据的分布，然后生成新的数据。目标是<strong>学习数据的分布</strong>，然后生成新的数据。<br>对生成模型的评价是通过生成的数据的质量来评价的，生成的数据越接近真实数据，生成模型的质量越好。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>θ</mi><mo>∗</mo></msup><mo>=</mo><mi>arg</mi><mo>⁡</mo><munder><mrow><mi>max</mi><mo>⁡</mo></mrow><mi>θ</mi></munder><msub><mi mathvariant="double-struck">E</mi><mrow><mi>x</mi><mo>∼</mo><msub><mi>p</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub></mrow></msub><mi>log</mi><mo>⁡</mo><msub><mi>p</mi><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta^* = \arg\max_{\theta} \mathbb{E}_{x \sim p_{data}} \log p_{model}(x|\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7387em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.5021em;vertical-align:-0.7521em;"></span><span class="mop">ar<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.4306em;"><span style="top:-2.3479em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">max</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7521em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mrel mtight">∼</span><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span></span></p><h3 id="GAN-Generative-Adversarial-Network">GAN: Generative Adversarial Network</h3><p>对抗机器学习的思想是通过两个网络之间的对抗来学习。生成器和判别器之间的对抗是GAN的核心思想。<br>使用的博弈问题的思想，使用的是最小化最大的思想。</p><p>GAN的思想为：生成器和判别器之间的对抗，生成器生成数据，判别器判断数据的真实性。</p><p>目标函数为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>G</mi></munder><munder><mrow><mi>max</mi><mo>⁡</mo></mrow><mi>D</mi></munder><mi>V</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>G</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi mathvariant="double-struck">E</mi><mrow><mi>x</mi><mo>∼</mo><msub><mi>p</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></msub><mo stretchy="false">[</mo><mi>log</mi><mo>⁡</mo><mi>D</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>+</mo><msub><mi mathvariant="double-struck">E</mi><mrow><mi>z</mi><mo>∼</mo><msub><mi>p</mi><mi>z</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow></msub><mo stretchy="false">[</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>D</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\min_G \max_D V(D,G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1-D(G(z)))]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.4943em;vertical-align:-0.7443em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em;"><span style="top:-2.3557em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">G</span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7443em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.4306em;"><span style="top:-2.3557em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">max</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7443em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">G</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1052em;vertical-align:-0.3552em;"></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.5198em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mrel mtight">∼</span><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3552em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1052em;vertical-align:-0.3552em;"></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.5198em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span><span class="mrel mtight">∼</span><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3552em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord mathnormal">G</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)))]</span></span></span></span></span></p><ul><li>当生成器固定时，判别器的目标是最大化判别器的准确率：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>max</mi><mo>⁡</mo></mrow><mi>D</mi></msub><mi>V</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>G</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\max_D V(D,G)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span class="mop">max</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">G</span><span class="mclose">)</span></span></span></span></li><li>当判别器固定时，生成器的目标是最小化判别器的准确率：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>G</mi></msub><mi>V</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>G</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\min_G V(D,G)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop"><span class="mop">min</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">G</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">G</span><span class="mclose">)</span></span></span></span></li></ul><p>生成器 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi></mrow><annotation encoding="application/x-tex">G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span></span></span></span> 的实质是将噪声分布 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>z</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_z(z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span>（如高斯分布）映射到数据分布 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>g</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_g(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>。根据概率密度变换定理，若 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi></mrow><annotation encoding="application/x-tex">G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span></span></span></span> 是可逆且光滑的函数，则生成数据的分布为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>g</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>p</mi><mi>z</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo>⋅</mo><mrow><mo fence="true">∣</mo><mi>det</mi><mo>⁡</mo><mrow><mo fence="true">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>G</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mo fence="true">)</mo></mrow><mo fence="true">∣</mo></mrow></mrow><annotation encoding="application/x-tex">p_g(x) = p_z(z) \cdot \left| \det \left( \frac{\partial G^{-1}(x)}{\partial x} \right) \right|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.4411em;vertical-align:-0.95em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.45em;"><span class="pstrut" style="height:4.4em;"></span><span style="width:0.333em;height:2.400em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.333em" height="2.400em" viewBox="0 0 333 2400"><path d="M145 15 v585 v1200 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v-1200 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v1200 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span></span><span class="mop">det</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathnormal">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.45em;"><span class="pstrut" style="height:4.4em;"></span><span style="width:0.333em;height:2.400em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.333em" height="2.400em" viewBox="0 0 333 2400"><path d="M145 15 v585 v1200 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v-1200 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v1200 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>尽管深度神经网络通常不可逆，但通过足够复杂的函数逼近（如多层非线性变换），生成器可以隐式地学习到从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>z</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_z(z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>g</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_g(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> 的映射，覆盖真实分布 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_{data}(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>。</p><p><strong>关键点</strong>：</p><ul><li>噪声输入的随机性确保了生成数据分布的多样性。</li><li>网络的非线性能力允许从简单分布（如高斯分布）逼近复杂分布（如图像像素分布）。</li></ul><p>但是GAN的<strong>训练过程是非常困难</strong>的，梯度性质是不好的，因为在比较好的样本中，由于梯度性质的问题会进行较大的更新。</p><p><strong>训练GAN的技巧</strong></p><h4 id="DCGAN-Deep-Convolutional-Generative-Adversarial-Networks">DCGAN: Deep Convolutional Generative Adversarial Networks</h4><p>对于生成器和判别器，使用卷积神经网络来进行训练。对于判别器，使用的是较为标准的CNN网络，对于生成器，使用的是转置卷积，先将特征图进行padding，然后进行卷积操作，这样可以获得一个较大的特征图。</p><ul><li><strong>生成器</strong>：使用转置卷积（反卷积）逐步上采样，生成高分辨率图像。</li><li><strong>判别器</strong>：使用标准CNN逐步下采样。</li><li><strong>关键技巧</strong>：批量归一化、Leaky ReLU、全卷积结构。</li></ul><p>证明了泛化定理：在有限的训练样本之下，可以通过训练得到一个泛化的模型。</p><h4 id="Inception-Score">Inception Score</h4><p>IS 用于衡量生成模型的性能，重点关注两点：</p><ul><li><strong>类别明确性</strong>：单个生成样本应明确属于某个类别（对应分类概率尖锐）。</li><li><strong>多样性</strong>：生成样本应覆盖多个类别（类别分布均匀）。</li></ul><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>IS</mtext><mo>=</mo><mi>exp</mi><mo>⁡</mo><mrow><mo fence="true">(</mo><msub><mi mathvariant="double-struck">E</mi><mrow><mi>x</mi><mo>∼</mo><msub><mi>p</mi><mi>g</mi></msub></mrow></msub><mrow><mo fence="true">[</mo><mtext>KL</mtext><mrow><mo fence="true">(</mo><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo>∥</mo><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo><mo fence="true">)</mo></mrow><mo fence="true">]</mo></mrow><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\text{IS} = \exp\left(\mathbb{E}_{x \sim p_g} \left[ \text{KL}\left(p(y|x) \parallel p(y)\right) \right]\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">IS</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mop">exp</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mrel mtight">∼</span><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2819em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3473em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord text"><span class="mord">KL</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span></span></span></p><ul><li>Class Probability Distribution: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(y|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>，生成样本 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 属于各个类别的概率，度量的是生成的数据的类别分布和真实数据的类别分布的相似性。</li><li>Marginal Distribution of Generated Data: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>，度量的是生成的数据的类别分布的多样性，如果生成的数据是单一的称为模式坍塌。</li></ul><h5 id="KL-Divergence">KL Divergence</h5><p>使用KL散度来度量两个分布的相似性：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>K</mi><mi>L</mi><mo stretchy="false">(</mo><mi>p</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>q</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi mathvariant="double-struck">E</mi><mi>X</mi></msub><mrow><mo fence="true">(</mo><mi>log</mi><mo>⁡</mo><mfrac><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><mrow><mi>q</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mfrac><mo fence="true">)</mo></mrow><mo>=</mo><munder><mo>∑</mo><mrow><mi>x</mi><mo>∈</mo><mi mathvariant="script">X</mi></mrow></munder><mi>p</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mi>log</mi><mo>⁡</mo><mfrac><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><mrow><mi>q</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">KL(p||q) =\mathbb{E}_X \left(  \log \frac{p(x)}{q(x)} \right)=\sum_{x \in \mathcal{X}} p(x) \log \frac{p(x)}{q(x)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mord">∣∣</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.7487em;vertical-align:-1.3217em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.8557em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mrel mtight">∈</span><span class="mord mathcal mtight" style="margin-right:0.14643em;">X</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3217em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>需要上面的值尽可能偏大</p><ul><li><strong>KL散度的意义</strong>：<ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(y|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> 尖锐</strong> → 分类概率集中（如某类概率接近 1），此时 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>KL</mtext><mo stretchy="false">(</mo><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo>∥</mo><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{KL}(p(y|x) \parallel p(y))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">KL</span></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">))</span></span></span></span> 值大。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span> 均匀</strong> → 生成样本覆盖所有类别，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>KL</mtext></mrow><annotation encoding="application/x-tex">\text{KL}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">KL</span></span></span></span></span> 值的期望更大。</li></ul></li><li><strong>取指数的作用</strong>：将对数空间的值转换为正数，放大差异便于比较。</li></ul><h4 id="FID-Frechet-Inception-Distance">FID: Frechet Inception Distance</h4><p>将生成的数据输入一个网络来提取特征，用得到的特征来拟和两个高斯分布，然后计算两个高斯分布的<em>Frechet Inception Distance</em>。这是有显式表达式的。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>FID</mtext><mo>=</mo><mi mathvariant="normal">∥</mi><msub><mi>μ</mi><mi>r</mi></msub><mo>−</mo><msub><mi>μ</mi><mi>g</mi></msub><msup><mi mathvariant="normal">∥</mi><mn>2</mn></msup><mo>+</mo><mtext>Tr</mtext><mrow><mo fence="true">(</mo><msub><mi mathvariant="normal">Σ</mi><mi>r</mi></msub><mo>+</mo><msub><mi mathvariant="normal">Σ</mi><mi>g</mi></msub><mo>−</mo><mn>2</mn><mo stretchy="false">(</mo><msub><mi mathvariant="normal">Σ</mi><mi>r</mi></msub><msub><mi mathvariant="normal">Σ</mi><mi>g</mi></msub><msup><mo stretchy="false">)</mo><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>2</mn></mrow></msup><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\text{FID} = \|\mu_r - \mu_g\|^2 + \text{Tr}\left(\Sigma_r + \Sigma_g - 2(\Sigma_r \Sigma_g)^{1/2}\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">FID</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∥</span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1502em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.8em;vertical-align:-0.65em;"></span><span class="mord text"><span class="mord">Tr</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">2</span><span class="mopen">(</span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1/2</span></span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span></span></span></span></span></p><ul><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>μ</mi><mi>r</mi></msub><mo separator="true">,</mo><msub><mi>μ</mi><mi>g</mi></msub></mrow><annotation encoding="application/x-tex">\mu_r, \mu_g</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></strong>：真实数据和生成数据特征的均值向量。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="normal">Σ</mi><mi>r</mi></msub><mo separator="true">,</mo><msub><mi mathvariant="normal">Σ</mi><mi>g</mi></msub></mrow><annotation encoding="application/x-tex">\Sigma_r, \Sigma_g</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">Σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></strong>：真实数据和生成数据特征的协方差矩阵。</li><li><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Tr</mtext><mo stretchy="false">(</mo><mo>⋅</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{Tr}(\cdot)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Tr</span></span><span class="mopen">(</span><span class="mord">⋅</span><span class="mclose">)</span></span></span></span></strong>：矩阵的迹（对角线元素之和）。</li></ul><h4 id="Mode-Collapse">Mode Collapse</h4><p>指生成的数据的多样性不够，类别分布是单一的，这是GAN的一个问题。</p><p>原始GAN使用JS散度（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mi>S</mi><mi>D</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub><mo>∥</mo><msub><mi>p</mi><mi>g</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">JSD(p_{data} \parallel p_g)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>）衡量分布距离，存在：</p><ul><li><strong>梯度消失</strong>：当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>g</mi></msub></mrow><annotation encoding="application/x-tex">p_g</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub></mrow><annotation encoding="application/x-tex">p_{data}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 无重叠时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mi>S</mi><mi>D</mi><mo>=</mo><mi>log</mi><mo>⁡</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">JSD = \log 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span></span></span></span>，梯度为零。</li><li><strong>模式坍塌</strong>：生成器倾向于生成少数样本。</li></ul><h5 id="Wasserstein-Distance">Wasserstein Distance</h5><p><a href="https://zh.wikipedia.org/wiki/%E6%B2%83%E7%91%9F%E6%96%AF%E5%9D%A6%E5%BA%A6%E9%87%8F">沃瑟斯坦度量 - 维基百科，自由的百科全书</a></p><p>有可能统计距离是不是一个好的距离度量。Wasserstein距离是一个好的距离度量，用推土机距离来度量两个分布的距离。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mo>↦</mo><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><mi mathvariant="normal">∞</mi><mo stretchy="false">)</mo><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">c(x,y) \mapsto [0, \infty), </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">↦</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">∞</span><span class="mclose">)</span><span class="mpunct">,</span></span></span></span></span></p><p>表示从点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>运输质量到点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>的代价。一个从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>μ</mi></mrow><annotation encoding="application/x-tex">\mu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">μ</span></span></span></span>到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ν</mi></mrow><annotation encoding="application/x-tex">\nu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.06366em;">ν</span></span></span></span>的运输方案可以用函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\gamma(x,y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>来描述，该函数表明从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>移动到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>的质量。一个运输方案<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\gamma(x,y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span>必须满足以下性质：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo>∫</mo><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>y</mi><mo>=</mo><mi>μ</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo>∫</mo><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>x</mi><mo>=</mo><mi>ν</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">)</mo><mo separator="true">,</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\int \gamma(x,y) \, \mathrm{d}y = \mu(x), \\\int \gamma(x,y) \, \mathrm{d}x = \nu(y),\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:5.0445em;vertical-align:-2.2722em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.7723em;"><span style="top:-4.7723em;"><span class="pstrut" style="height:3.36em;"></span><span class="mord"><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011em;">∫</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">μ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">,</span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.36em;"></span><span class="mord"><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011em;">∫</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.06366em;">ν</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mpunct">,</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.2722em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>前者表示从某一点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>移到其他所有点的土堆总质量必须等于最初该点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>上的土堆质量，后者则表示从所有点移到某一点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>的土堆总质量必须等于最终该点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>上的土堆质量。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>∬</mo><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>x</mi><mtext> </mtext><mi mathvariant="normal">d</mi><mi>y</mi><mo>=</mo><mo>∫</mo><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">\iint c(x,y) \gamma(x,y) \, \mathrm{d}x \, \mathrm{d}y = \int c(x,y) \, \mathrm{d}\gamma(x,y).</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.222em;vertical-align:-0.862em;"></span><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.001em;">∬</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2222em;vertical-align:-0.8622em;"></span><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011em;">∫</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord">.</span></span></span></span></span></p><p>方案<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>γ</mi></mrow><annotation encoding="application/x-tex">\gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span></span></span></span>并不是唯一的，所有可能的运输方案中代价最低的方案即为最优运输方案。最优运输方案的代价为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>C</mi><mo>=</mo><munder><mrow><mi>inf</mi><mo>⁡</mo></mrow><mrow><mi>γ</mi><mo>∈</mo><mi mathvariant="normal">Γ</mi><mo stretchy="false">(</mo><mi>μ</mi><mo separator="true">,</mo><mi>ν</mi><mo stretchy="false">)</mo></mrow></munder><mo>∫</mo><mi>c</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>γ</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">C = \inf_{\gamma \in \Gamma(\mu,\nu)} \int c(x,y) \, \mathrm{d}\gamma(x,y).</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.326em;vertical-align:-0.966em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-2.309em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05556em;">γ</span><span class="mrel mtight">∈</span><span class="mord mtight">Γ</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">μ</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.06366em;">ν</span><span class="mclose mtight">)</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">in<span style="margin-right:0.07778em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.966em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011em;">∫</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord">.</span></span></span></span></span></p><h5 id="Wasserstein-GAN">Wasserstein GAN</h5><p>对于模式坍塌进一步的理解，如果空间上有一个较大的利普希茨系数，那么说明发生了模式坍塌。</p><h5 id="Spectral-Normalization">Spectral Normalization</h5><table><thead><tr><th>指标</th><th>JS散度</th><th>Wasserstein距离</th></tr></thead><tbody><tr><td><strong>连续性</strong></td><td>不连续（梯度消失）</td><td>连续</td></tr><tr><td><strong>对称性</strong></td><td>对称</td><td>对称</td></tr><tr><td><strong>计算复杂度</strong></td><td>低</td><td>高（需约束判别器）</td></tr></tbody></table><h4 id="Conditional-GAN">Conditional GAN</h4><p>给定一个类来进行生成数据，这样可以生成不同类别的数据，这样可以生成更加多样的数据。并且可以在一定程度上避免模式坍塌。<br>除了接受高斯噪声还接受一个标签/图像等等作为输入。</p><h4 id="ACGAN-Auxiliary-Classifier-GAN">ACGAN: Auxiliary Classifier GAN</h4><p>是多任务学习的一种方法，除了生成数据，还可以进行分类。在生成数据的过程中还生成标签，所以可以一定程度上避免模式坍塌。</p><h4 id="Cycle-GAN">Cycle GAN</h4><p>无配对数据下的图像转换（如马→斑马），通过循环一致性损失<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>y</mi><mi>c</mi></mrow><annotation encoding="application/x-tex">Cyc</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord mathnormal">yc</span></span></span></span>保证生成的图像在两个方向上的转换是一致的。</p><h3 id="Self-Attention-GAN">Self-Attention GAN</h3><p>将<em>Self-Attention</em>机制应用到GAN中，这样可以使得生成的数据更加真实。</p><h4 id="Adaptive-Instance-Normalization">Adaptive Instance Normalization</h4><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>A</mi><mi>d</mi><mi>a</mi><mi>I</mi><mi>N</mi><mo stretchy="false">(</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo><mo>=</mo><mi>σ</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo><mrow><mo fence="true">(</mo><mfrac><mrow><mi>u</mi><mo>−</mo><mi>μ</mi><mo stretchy="false">(</mo><mi>u</mi><mo stretchy="false">)</mo></mrow><mrow><mi>σ</mi><mo stretchy="false">(</mo><mi>u</mi><mo stretchy="false">)</mo></mrow></mfrac><mo fence="true">)</mo></mrow><mo>+</mo><mi>μ</mi><mo stretchy="false">(</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">AdaIN(u ,v) = \sigma(v) \left(\frac{u - \mu(u)}{\sigma(u)}\right) + \mu(v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal">d</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">u</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">μ</span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">μ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span></span></p><p>本质上为重新着色的操作，将一个图像的风格转移到另一个图像上。</p><h4 id="StyleGAN">StyleGAN</h4><p>通过控制风格来生成数据，这样可以生成更加多样的数据。</p><h3 id="VAE">VAE</h3><h4 id="Encoder">Encoder</h4><ol><li><strong>推断潜在变量分布</strong><br>编码器将输入数据（如图像、文本）映射到潜在空间<em>latent space</em>，输出潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>的概率分布参数（通常是高斯分布的均值和方差）。这一步称为<strong>变分推断</strong>，目的是找到输入数据在低维潜在空间中的概率表示。</li><li><strong>数据压缩与特征提取</strong><br>编码器将高维输入数据压缩到低维潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>，提取数据的关键特征（如形状、颜色等抽象属性），同时去除冗余信息。</li><li><strong>引入不确定性</strong><br>不同于传统自编码器的确定性编码，VAE的编码器输出的是分布的参数，通过随机采样生成 zz，使得潜在空间具有连续性，便于生成新样本。</li></ol><h4 id="Decoder">Decoder</h4><ol><li><strong>数据生成</strong><br>解码器从潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>出发，重构输入数据<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>的分布（如像素值的伯努利分布或高斯分布），生成与原始数据相似的新样本。</li><li><strong>潜在空间映射到数据空间</strong><br>解码器学习如何将低维潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>解码为高维数据空间中的样本，捕捉数据生成过程的规律（如像素间的依赖关系）。</li><li><strong>生成多样性</strong><br>由于潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>是连续且概率化的，解码器可以在潜在空间中插值或随机采样，生成多样化且合理的新数据。</li></ol><h4 id="Why-Variational">Why Variational</h4><p>其核心目标是通过学习数据分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>，生成与训练数据类似的新样本。具体来说，VAE旨在解决以下问题：</p><ul><li><strong>生成新数据</strong>：例如生成图像、文本或音频。</li><li><strong>学习潜在表示</strong>：将高维数据映射到低维潜在空间，同时保持数据的语义特征。</li><li><strong>概率建模</strong>：显式定义数据的生成过程<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_{\theta} (x|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span>，并引入潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>表示数据的隐含因素</li></ul><p>在VAE中，我们引入一个潜在变量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>，假设数据 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 是由某个先验分布 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_\theta(z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span> 生成，然后通过条件分布 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_\theta(x|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span> 生成可观测数据 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo>∫</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mtext> </mtext><mi mathvariant="normal">d</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">p_\theta (x) = \int p_\theta(x|z) p_\theta(z) \, \mathrm{d}z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2222em;vertical-align:-0.8622em;"></span><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011em;">∫</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathrm">d</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>的分布是一个高斯分布，对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>采样得到的实例，通过一个网络生成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>。困难在于上面的反常积分，这是一个高维积分，不可行。可以使用<em>蒙特卡洛</em>。</p><p>对于后验分布：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">p_\theta(z|x) = \frac{p_\theta(x|z) p_\theta(z)}{p_\theta(x)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>在积分中是经常使用的，但是计算是NP-hard的，因此引入<strong>变分推断</strong>，通过优化下界（ELBO）间接逼近。直接求后验往往是不可行的。因此，我们用<strong>变分推断</strong>的方式，去学习一个近似后验分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo>∣</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q_{\phi}(z∣x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>，并用它来逼近真正的后验分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo>∣</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_{\theta}(z∣x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>，从而得到一个变分下界。</p><p>变分的意思为变量的替换，在概率中为分布率的替换。<br>对于这个问题，可以使用一个神经网络来实现，对于这种显式的分布，需要假设分布率，可以指定为高斯分布，用网络来学习均值和协方差，作为<em>Encoder Network</em>。<br>对于条件分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_\theta(x|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span>，也可以假定为高斯分布，这样可以计算均值和协方差，作为<em>Decoder Network</em>。</p><p>但是VAE是<em>Intractable</em>的，这个问题是NP-hard的。对于上面的条件概率，是比较困难的。所以采用一个近似的方法来进行求解。比如假设服从一个高斯分布，之后计算这个分布的均值和协方差矩阵。</p><h4 id="ELBO-Evidence-Lower-Bound">ELBO: Evidence Lower Bound</h4><p>训练的目的是使得<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>log</mi><mo>⁡</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\log p_\theta (x_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>尽可能大，但是很难计算，这里引入“参考系”，也就是引入一个近似的分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q_\phi(z|x_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</p><p>这里是将最大化似然的过程简化为最大化ELBO的过程。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>log</mi><mo>⁡</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi mathvariant="double-struck">E</mi><mrow><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></msub><mrow><mo fence="true">[</mo><mi>log</mi><mo>⁡</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo><mo fence="true">]</mo></mrow><mo>−</mo><mi>K</mi><mi>L</mi><mo stretchy="false">(</mo><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\log p_\theta (x_i) = \mathbb{E}_{q_\phi(z|x_i)} \left[ \log p_\theta(x_i|z) \right] - KL (q_\phi(z|x_i) || p_\theta(z))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1333em;vertical-align:-0.3833em;"></span><span class="mord"><span class="mord mathbb">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.5198em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:-0.0359em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.04398em;">z</span><span class="mord mtight">∣</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3833em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord">∣∣</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">))</span></span></span></span></span></p><h4 id="Reparameterization-Trick">Reparameterization Trick</h4><p>在VAE的训练过程中，通常需要从潜在变量的分布中采样。直接从分布中采样可能导致梯度无法传播到编码器网络，因此引入了重参数化技巧。<br>这是的采样变量是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϵ</mi></mrow><annotation encoding="application/x-tex">\epsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">ϵ</span></span></span></span>，这样的话采样的过程就在计算图的旁路上，这样就可以进行梯度的传播。</p><h4 id="VAE-Inference">VAE Inference</h4><p>在训练的时候是从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>中采样得到的，然后由后验分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q_\phi(z|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>来进行采样。而在推理过程中，是从潜在变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span>中采样得到的，然后由条件分布<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_\theta(x|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span>来进行进行推理。<br>上述过程的合理性在于目标函数ELBO中的第二项：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mi>L</mi><mo stretchy="false">(</mo><msub><mi>q</mi><mi>ϕ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">KL (q_\phi(z|x_i) || p_\theta(z))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord">∣∣</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mclose">))</span></span></span></span>在训练中被最小化了。</p><h4 id="VQ-VAE">VQ-VAE</h4><p>VQ-VAE是对VAE的一个改进，使用了向量量化的方法来进行训练。通过对潜在变量进行离散化来进行训练，这样可以避免模式坍塌的问题。</p><h3 id="Diffusion-Probabilistic-Models">Diffusion Probabilistic Models</h3><h4 id="Denoising-Diffusion-Probabilistic-Models">Denoising Diffusion Probabilistic Models</h4><p>Diffusion模型是通过对数据进行逐步添加噪声来训练模型的。通过对数据进行逐步添加噪声，然后再通过一个网络来进行去噪声的操作。这样可以生成新的数据。</p><p>Markovian Process: 逐步添加噪声的过程，通常是一个高斯分布的过程。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="script">N</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mo separator="true">;</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>β</mi><mi>t</mi></msub></mrow></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>β</mi><mi>t</mi></msub><mi>I</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}  x_{t-1}, \beta_t I)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.2561em;"></span><span class="mord mathcal" style="margin-right:0.14736em;">N</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9839em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9439em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2561em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mclose">)</span></span></span></span></span></p><p>联合分布：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mn>1</mn><mo>:</mo><mi>T</mi></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>T</mi></munderover><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q(x_{1:T} | x_0) = \prod_{t=1}^{T} q(x_t | x_{t-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>重参数化表达：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub><mo>=</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>β</mi><mi>t</mi></msub></mrow></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><msqrt><msub><mi>β</mi><mi>t</mi></msub></msqrt><mi>ϵ</mi><mspace width="1em"/><mi>ϵ</mi><mo>∼</mo><mi mathvariant="script">N</mi><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mi>I</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x_t = \sqrt{1-\beta_t} x_{t-1} + \sqrt{\beta_t} \epsilon \quad \epsilon \sim \mathcal{N}(0, I)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.2561em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9839em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9439em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2561em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.2561em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9839em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9439em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2561em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span><span class="mspace" style="margin-right:1em;"></span><span class="mord mathnormal">ϵ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathcal" style="margin-right:0.14736em;">N</span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mclose">)</span></span></span></span></span></p><h5 id="Diffusion-Kernel">Diffusion Kernel</h5><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>x</mi><mi>t</mi></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>β</mi><mi>t</mi></msub></mrow></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><msqrt><msub><mi>β</mi><mi>t</mi></msub></msqrt><mi>ϵ</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msqrt><msub><mi>α</mi><mi>t</mi></msub></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>α</mi><mi>t</mi></msub></mrow></msqrt><mi>ϵ</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msqrt><mrow><msub><mi>α</mi><mi>t</mi></msub><msub><mi>α</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>2</mn></mrow></msub><mo>+</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>α</mi><mi>t</mi></msub></mrow></msqrt><mi>ϵ</mi><mo>+</mo><msqrt><msub><mi>α</mi><mi>t</mi></msub></msqrt><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>α</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></msqrt><msup><mi>ϵ</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msqrt><mrow><msub><mi>α</mi><mi>t</mi></msub><msub><mi>α</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></msqrt><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>2</mn></mrow></msub><mo>+</mo><msqrt><mrow><mn>1</mn><mo>−</mo><msub><mi>α</mi><mi>t</mi></msub><msub><mi>α</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></msqrt><mi>ϵ</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>…</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msqrt><mover accent="true"><msub><mi>α</mi><mi>t</mi></msub><mo stretchy="true">‾</mo></mover></msqrt><msub><mi>x</mi><mn>0</mn></msub><mo>+</mo><msqrt><mrow><mn>1</mn><mo>−</mo><mover accent="true"><msub><mi>α</mi><mi>t</mi></msub><mo stretchy="true">‾</mo></mover></mrow></msqrt><mi>ϵ</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}x_t &amp; = \sqrt{1-\beta_t} x_{t-1} + \sqrt{\beta_t} \epsilon \\&amp;= \sqrt{\alpha_t} x_{t-1} + \sqrt{1-\alpha_t} \epsilon \\&amp;= \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \sqrt{1-\alpha_t} \epsilon + \sqrt{\alpha_t} \sqrt{1-\alpha_{t-1}} \epsilon&#x27; \\&amp; = \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \sqrt{1 -  \alpha_t \alpha_{t-1}} \epsilon \\&amp; \dots \\&amp; = \sqrt{\overline{\alpha_t}} x_0 + \sqrt{1 - \overline{\alpha_t}} \epsilon\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:9.4499em;vertical-align:-4.475em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.975em;"><span style="top:-6.9911em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-5.45em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-3.8381em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.2261em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-0.7261em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:0.815em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.475em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.975em;"><span style="top:-6.9911em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9839em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9439em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2561em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9839em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9439em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2561em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span></span></span><span style="top:-5.45em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7742em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.7342em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2658em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8811em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8411em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1589em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span></span></span><span style="top:-3.8381em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.745em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.705em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.295em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8811em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8411em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1589em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7742em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.7342em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2658em;"><span></span></span></span></span></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9519em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9119em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2881em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">ϵ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.2261em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.745em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.705em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.295em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9519em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.9119em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2881em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span></span></span><span style="top:-0.7261em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span></span></span><span style="top:0.815em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8742em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-2.8342em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1658em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8811em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-2.8411em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1589em;"><span></span></span></span></span></span><span class="mord mathnormal">ϵ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.475em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>α</mi><mi>t</mi></msub><mo stretchy="true">‾</mo></mover><mo>=</mo><msubsup><mo>∏</mo><mrow><mi>s</mi><mo>=</mo><mn>1</mn></mrow><mi>t</mi></msubsup><msub><mi>α</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">\overline{\alpha_t} = \prod_{s=1}^{t} \alpha_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7806em;vertical-align:-0.15em;"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2332em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9335em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li></ul><h5 id="Generation-by-Denoising">Generation by Denoising</h5><ul><li>首先对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>T</mi></msub></mrow><annotation encoding="application/x-tex">x_T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>进行采样，得到一个高斯分布的样本。</li><li>然后利用后验分布得到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，使用Bayes公式：<br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>∼</mo><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>∝</mo><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x_{t-1} \sim q(x_{t-1}|x_t) \propto q(x_{t-1}) q(x_t |x_{t-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∝</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li></ul><p>采用一个变分方法来实现：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="script">N</mi><mrow><mo fence="true">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">;</mo><msub><mi>μ</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><msubsup><mi>σ</mi><mi>t</mi><mn>2</mn></msubsup><mi mathvariant="bold">I</mi><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">p_{\theta}(x_{t-1}|x_t) = \mathcal{N} \left(x_{t-1}; \mu_{\theta}(x_t, t), \sigma_t^2 \mathbf{I} \right) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2141em;vertical-align:-0.35em;"></span><span class="mord mathcal" style="margin-right:0.14736em;">N</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord mathbf">I</span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span></span></span></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mn>0</mn><mo>:</mo><mi>T</mi></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>T</mi></msub><mo stretchy="false">)</mo><munderover><mo>∏</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>T</mi></munderover><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_\theta(x_{0:T}) = p_\theta (x_T)\prod_{t=1}^{T} p_\theta(x_{t-1}|x_t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>上述过程可以使用一个网络来实现对于均值和方差的输出。</p><p><a href="https://lilianweng.github.io/posts/2021-07-11-diffusion-models/">What are Diffusion Models? | Lil’Log</a></p><h5 id="Re-design-forward-Sampling">Re-design forward Sampling</h5><ul><li>Striding Sampling<ul><li>在每个时间步长中跳过多个时间步进行采样，从而减少采样次数。</li><li>问题在于在相邻的时间戳中反向传播的后验分布可以近似为高斯分布，但是在较大的步长下不一定是这样的。</li></ul></li><li>DDIM: Denoising Diffusion Implicit Models<ul><li>通过设计一个新的前向采样过程来加速采样。</li><li>通过引入一个新的参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>α</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">\alpha_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>来控制前向采样的过程。</li><li>通过设计一个新的后验分布来进行采样。</li><li>通过设计一个新的损失函数来进行训练。</li></ul></li></ul>]]>
    </content>
    <id>https://yima-gu.github.io/2025/08/03/Deep%20Learning/DL%20Notes-7%20Generative%20Models/</id>
    <link href="https://yima-gu.github.io/2025/08/03/Deep%20Learning/DL%20Notes-7%20Generative%20Models/"/>
    <published>2025-08-03T09:41:00.000Z</published>
    <summary>Generative Model</summary>
    <title>DL Notes-7 Generative Models</title>
    <updated>2026-07-01T11:38:22.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/categories/Deep-Learning/"/>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/tags/Deep-Learning/"/>
    <category term="Transformer" scheme="https://yima-gu.github.io/tags/Transformer/"/>
    <content>
      <![CDATA[<h2 id="Transformers">Transformers</h2><h3 id="Transformers-Attention-is-All-You-Need">Transformers: Attention is All You Need</h3><p>再次理解Attention的概念：类似于”查字典“的操作，对于Query <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>, Key <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>和Value <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>，计算相关性，也就是重要性，对于输出序列中的第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>个输出有价值的信息：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>=</mo><mi>a</mi><mo stretchy="false">(</mo><msub><mi>q</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>k</mi><mi>j</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">w_{ij} = a(q_i, k_j)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>是一个函数，可以是内积、<em>Additive Attention</em>等。对于输出序列中的第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>个输出，计算当前的输出的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>q</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">q_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，计算与输入序列中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>k</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">k_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>的相关性，然后对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">v_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>进行加权求和（这是一种寻址操作），得到的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是查字典所得到的信息：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>T</mi></munderover><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><msub><mi>v</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_i = \sum_{j=1}^T w_{ij}v_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2421em;vertical-align:-1.4138em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></span></p><p><strong>希望找到一种更好的计算方法</strong>。</p><p>在RNN中问题在于：</p><ul><li>太复杂的模型</li><li>某种意义上使用的Attention已经足够使用，不再需要循环网络</li><li>循环网络的计算是串行的，不能有效加速</li></ul><h4 id="Self-Attention">Self-Attention</h4><p>计算的是同一条序列中的不同位置之间的相关性，也就是自注意力。对于输入序列中的第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>个位置，计算与其他位置的相关性，然后对于所有的位置进行加权求和：<br>规定Query <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>q</mi><mn>1</mn></msub><mo>…</mo><msub><mi>q</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">Q = [q_1 \dots q_n]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span>，Key <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>k</mi><mn>1</mn></msub><mo>…</mo><msub><mi>k</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">K = [k_1 \dots k_n]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span>，Value <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>v</mi><mn>1</mn></msub><mo>…</mo><msub><mi>v</mi><mi>k</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">V = [v_1 \dots v_k]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span>，则：</p><h4 id="Scaled-Dot-Product-Attention">Scaled Dot-Product Attention</h4><p>我们认为使用一个网络来计算相关性太复杂了，当两个向量是相同维度的时候可以直接计算内积。在这里，在计算先引入参数，使得其维度是一样的，从而可以计算内积：</p><p><em>Scaled Dot-Product</em> :</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mi>q</mi><mo separator="true">,</mo><mi>k</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><msup><mi>q</mi><mi>T</mi></msup><mi>k</mi></mrow><msqrt><msub><mi>d</mi><mi>k</mi></msub></msqrt></mfrac></mrow><annotation encoding="application/x-tex">a(q,k) = \frac{q^T k}{\sqrt{d_k}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4483em;vertical-align:-0.93em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>使得变换前后的方差是一样的，这样可以使得梯度更加稳定，否则可能进入激活函数的饱和区。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>A</mi><mi>t</mi><mi>t</mi><mi>e</mi><mi>n</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo stretchy="false">(</mo><mi>Q</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>V</mi><mo stretchy="false">)</mo><mo>=</mo><mtext>softmax</mtext><mrow><mo fence="true">(</mo><mfrac><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><msqrt><msub><mi>d</mi><mi>k</mi></msub></msqrt></mfrac><mo fence="true">)</mo></mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">Attention(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal">tt</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4684em;vertical-align:-0.95em;"></span><span class="mord text"><span class="mord">softmax</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span></span></p><p>上面的式子将得到的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>×</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">n \times n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>的矩阵进行softmax操作，在归一化的过程中，<strong>是某一个query在所有的key上的注意力分配一定是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn mathvariant="bold">1</mn></mrow><annotation encoding="application/x-tex">\mathbf{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord mathbf">1</span></span></span></span></strong>。后面是对于Value的加权求和。<strong>在上面的公式中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span>中的向量都是行向量，进行softmax操作时也是在同一行上操作</strong>。</p><p>对于同一组输入，经过不同的线性变换得到的不同的Query、Key和Value，在样本数量为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>的情况下，可以进行计算：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>W</mi><mi>Q</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><msub><mi>d</mi><mi>k</mi></msub><mo>×</mo><msub><mi>d</mi><mtext>input</mtext></msub></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>W</mi><mi>K</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><msub><mi>d</mi><mi>k</mi></msub><mo>×</mo><msub><mi>d</mi><mtext>input</mtext></msub></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>W</mi><mi>V</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><msub><mi>d</mi><mi>v</mi></msub><mo>×</mo><msub><mi>d</mi><mtext>input</mtext></msub></mrow></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>Q</mi><mo>=</mo><mi>X</mi><msup><mi>W</mi><mi>Q</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>k</mi></msub></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>K</mi><mo>=</mo><mi>X</mi><msup><mi>W</mi><mi>K</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>k</mi></msub></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>V</mi><mo>=</mo><mi>X</mi><msup><mi>W</mi><mi>V</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>v</mi></msub></mrow></msup><mi mathvariant="normal">.</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><mi>m</mi></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext>softmax</mtext><mrow><mo fence="true">(</mo><mfrac><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><msqrt><msub><mi>d</mi><mi>k</mi></msub></msqrt></mfrac><mo fence="true">)</mo></mrow><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><mi>m</mi></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext>Attention</mtext><mo stretchy="false">(</mo><mi>Q</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>V</mi><mo stretchy="false">)</mo><mo>=</mo><mtext>softmax</mtext><mrow><mo fence="true">(</mo><mfrac><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><msqrt><msub><mi>d</mi><mi>k</mi></msub></msqrt></mfrac><mo fence="true">)</mo></mrow><mi>V</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>v</mi></msub></mrow></msup><mi mathvariant="normal">.</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp;W^Q \in \mathbb{R}^{d_k \times d_{\text{input}}}, \\&amp;W^K \in \mathbb{R}^{d_k \times d_{\text{input}}}, \\&amp;W^V \in \mathbb{R}^{d_v \times d_{\text{input}}} \\&amp;Q = X W^Q \in \mathbb{R}^{m \times d_k}, \\&amp;K = X W^K \in \mathbb{R}^{m \times d_k}, \\&amp;V = X W^V \in \mathbb{R}^{m \times d_v}. \\&amp;QK^T \in \mathbb{R}^{m \times m}, \\&amp;\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) \in \mathbb{R}^{m \times m}, \\&amp;\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \in \mathbb{R}^{m \times d_v}.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:16.4427em;vertical-align:-7.9714em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:8.4714em;"><span style="top:-11.0906em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-9.5315em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-7.9724em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-6.4132em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-4.8541em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-3.295em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:-1.7437em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:0.4346em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span><span style="top:3.203em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:7.9714em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:8.4714em;"><span style="top:-11.0906em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">Q</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.334em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">input</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2819em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:-9.5315em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.334em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">input</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2819em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:-7.9724em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.22222em;">V</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.334em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">input</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2819em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-6.4132em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">Q</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:-4.8541em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:-3.295em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.22222em;">V</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mord">.</span></span></span><span style="top:-1.7437em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">m</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:0.4346em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord text"><span class="mord">softmax</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8213em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">m</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span><span style="top:3.203em;"><span class="pstrut" style="height:3.5183em;"></span><span class="mord"><span class="mord"></span><span class="mord text"><span class="mord">Attention</span></span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">softmax</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:7.9714em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p><strong>维度总结表</strong></p><table><thead><tr><th>矩阵/操作</th><th>维度</th><th>说明</th></tr></thead><tbody><tr><td>输入矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mtext>input</mtext></msub></mrow><annotation encoding="application/x-tex">m \times d_{\text{input}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">input</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个样本，每个样本维度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mtext>input</mtext></msub></mrow><annotation encoding="application/x-tex">d_{\text{input}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">input</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>查询矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">m \times d_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>每个样本的查询向量维度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">d_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>键矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">m \times d_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>每个样本的键向量维度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">d_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>值矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">m \times d_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>每个样本的值向量维度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">d_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>注意力得分矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">QK^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">m \times m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></td><td>样本间的注意力强度矩阵</td></tr><tr><td>最终输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Attention</mtext><mo stretchy="false">(</mo><mi>Q</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>V</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{Attention}(Q,K,V)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Attention</span></span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mclose">)</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>×</mo><msub><mi>d</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">m \times d_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>聚合所有样本的加权值信息，输出维度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">d_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr></tbody></table><h4 id="Multi-Head-Attention">Multi-Head Attention</h4><p>注意到上面的注意力的表达能力是相当有限的，在language model同一个词和其他不同的词之间可能有很多种不同的关系，仅仅用一种简单的关系来表示是不够的。所以我们引入多头注意力，希望能在不同的侧面上进行表达。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>MultiHead</mtext><mo stretchy="false">(</mo><mi>Q</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>V</mi><mo stretchy="false">)</mo><mo>=</mo><mtext>Concat</mtext><mo stretchy="false">(</mo><msub><mtext>head</mtext><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mtext>head</mtext><mi>h</mi></msub><mo stretchy="false">)</mo><msup><mi>W</mi><mi>O</mi></msup></mrow><annotation encoding="application/x-tex">\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">MultiHead</span></span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Concat</span></span><span class="mopen">(</span><span class="mord"><span class="mord text"><span class="mord">head</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord text"><span class="mord">head</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span></span></span></span></span></span></span></span></span></span></span></span></p><p>其中：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mtext>head</mtext><mi>i</mi></msub><mo>=</mo><mtext>Attention</mtext><mo stretchy="false">(</mo><mi>Q</mi><msubsup><mi>W</mi><mi>i</mi><mi>Q</mi></msubsup><mo separator="true">,</mo><mi>K</mi><msubsup><mi>W</mi><mi>i</mi><mi>K</mi></msubsup><mo separator="true">,</mo><mi>V</mi><msubsup><mi>W</mi><mi>i</mi><mi>V</mi></msubsup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord">head</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2361em;vertical-align:-0.2769em;"></span><span class="mord text"><span class="mord">Attention</span></span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9592em;"><span style="top:-2.4231em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.1809em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">Q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.453em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.453em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>W</mi><mi>i</mi><mi>Q</mi></msubsup><mo separator="true">,</mo><msubsup><mi>W</mi><mi>i</mi><mi>K</mi></msubsup><mo separator="true">,</mo><msubsup><mi>W</mi><mi>i</mi><mi>V</mi></msubsup></mrow><annotation encoding="application/x-tex">W_i^Q, W_i^K, W_i^V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2361em;vertical-align:-0.2769em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9592em;"><span style="top:-2.4231em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.1809em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">Q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4413em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4413em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span></span></span></span>是不同的线性变换，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>W</mi><mi>O</mi></msup></mrow><annotation encoding="application/x-tex">W^O</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span></span></span></span></span></span></span></span></span></span></span>是最后的线性变换，最后进行的维度的规约操作。<br>与CNN相比，CNN的不同的通道之间与上一层的每一个通道之间都是有连接的；但是在这里，不同的头之间是没有连接的，这样可以使得不同的头可以关注不同的信息。</p><p>不同的头之间是可以并行计算的，这样可以加速计算；但是缺点是内存占用会很大。</p><h4 id="Position-wise-Feed-Forward-Networks">Position-wise Feed-Forward Networks</h4><p>在标准 Transformer Block 中，注意力层之后会接一个前馈神经网络（FFN），其结构如下：</p><ol><li>输入张量形状：</li></ol><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>X</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>B</mi><mo>×</mo><mi>L</mi><mo>×</mo><mi>H</mi><mo>×</mo><mi>D</mi></mrow></msup></mrow><annotation encoding="application/x-tex">   X \in \mathbb{R}^{B \times L \times H \times D}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8913em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">L</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span></span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>：Batch size</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>：序列长度</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi></mrow><annotation encoding="application/x-tex">H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span></span></span></span>：Attention 头数</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span></span></span></span>：每个头的维度</li></ul><ol><li><p>将多头输出合并：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi><mi mathvariant="normal">h</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">e</mi></mrow><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>B</mi><mo separator="true">,</mo><mtext> </mtext><mi>L</mi><mo separator="true">,</mo><mtext> </mtext><mi>H</mi><mo>⋅</mo><mi>D</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>B</mi><mo>×</mo><mi>L</mi><mo>×</mo><mo stretchy="false">(</mo><mi>H</mi><mtext> ⁣</mtext><mi>D</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">X&#x27; = \mathrm{reshape}(X,\, (B,\,L,\,H\cdot D)) \in \mathbb{R}^{B \times L \times (H\!D)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8019em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathrm">reshape</span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.938em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">L</span><span class="mbin mtight">×</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mspace mtight" style="margin-right:-0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>两层“卷积”全连接结构<br>这里所谓“卷积”，实际上等价于在最后一维上对每个位置独立地做 1×1 卷积（与 RNN 中在不同时间步共享参数的思想一致），并在卷积核后加入非线性 ReLU。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>Z</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mrow><mi mathvariant="normal">R</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">L</mi><mi mathvariant="normal">U</mi></mrow><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">(</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><msub><mi>W</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>1</mn></msub><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">)</mo><mo separator="true">,</mo><mspace width="1em"/><msub><mi>W</mi><mn>1</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mo stretchy="false">(</mo><mi>H</mi><mtext> ⁣</mtext><mi>D</mi><mo stretchy="false">)</mo><mo>×</mo><msub><mi>d</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub></mrow></msup><mo separator="true">,</mo><mtext>  </mtext><msub><mi>b</mi><mn>1</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><msub><mi>d</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>Z</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msub><mi>Z</mi><mn>1</mn></msub><msub><mi>W</mi><mn>2</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub><mo separator="true">,</mo><mspace width="1em"/><msub><mi>W</mi><mn>2</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><msub><mi>d</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub><mo>×</mo><mo stretchy="false">(</mo><mi>H</mi><mtext> ⁣</mtext><mi>D</mi><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><mtext>  </mtext><msub><mi>b</mi><mn>2</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mo stretchy="false">(</mo><mi>H</mi><mtext> ⁣</mtext><mi>D</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}Z_1 &amp;= \mathrm{ReLU}\bigl(X&#x27; W_1 + b_1\bigr),\quad W_1\in\mathbb{R}^{(H\!D)\times d_{ff}},\; b_1\in\mathbb{R}^{d_{ff}}\\Z_2 &amp;= Z_1 W_2 + b_2,\quad W_2\in\mathbb{R}^{d_{ff}\times(H\!D)},\; b_2\in\mathbb{R}^{(H\!D)}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.196em;vertical-align:-1.348em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.848em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.312em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.348em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.848em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathrm">ReLU</span></span><span class="mopen"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing size1">)</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mspace mtight" style="margin-right:-0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mclose mtight">)</span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.312em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span><span class="mbin mtight">×</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mspace mtight" style="margin-right:-0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mspace mtight" style="margin-right:-0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.348em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>第一层升维到中间维度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub></mrow><annotation encoding="application/x-tex">d_{ff}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>（例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2048</mn></mrow><annotation encoding="application/x-tex">2048</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2048</span></span></span></span>）</li><li>第二层降维回原始维度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi><mtext> ⁣</mtext><mi>D</mi></mrow><annotation encoding="application/x-tex">H\!D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mspace" style="margin-right:-0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span></span></span></span>（例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>512</mn></mrow><annotation encoding="application/x-tex">512</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">512</span></span></span></span>）</li></ul></li><li><p>加残差 &amp; LayerNorm</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>Y</mi><mo>=</mo><mrow><mi mathvariant="normal">L</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">y</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">N</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">m</mi></mrow><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">(</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><msub><mi>Z</mi><mn>2</mn></msub><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">)</mo><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>B</mi><mo>×</mo><mi>L</mi><mo>×</mo><mo stretchy="false">(</mo><mi>H</mi><mtext> ⁣</mtext><mi>D</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">Y = \mathrm{LayerNorm}\bigl(X&#x27; + Z_2\bigr)\in\mathbb{R}^{B\times L\times(H\!D)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mord"><span class="mord mathrm">LayerNorm</span></span><span class="mopen"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing size1">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.938em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">L</span><span class="mbin mtight">×</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.08125em;">H</span><span class="mspace mtight" style="margin-right:-0.1952em;"></span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>（可选）reshape 回多头排列：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>Y</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi><mi mathvariant="normal">h</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">e</mi></mrow><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>B</mi><mo separator="true">,</mo><mtext> </mtext><mi>L</mi><mo separator="true">,</mo><mtext> </mtext><mi>H</mi><mo separator="true">,</mo><mtext> </mtext><mi>D</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Y&#x27; = \mathrm{reshape}(Y,\, (B,\,L,\,H,\,D))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8019em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathrm">reshape</span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mclose">))</span></span></span></span></span></p></li></ol><ul><li><strong>线性限制</strong>：除去 Attention 中的 SoftMax，若只堆线性层，模型表达能力较弱；引入 ReLU 后能够拟合更复杂的非线性函数。</li><li><strong>稀疏权重</strong>：Attention 的 SoftMax 本质上生成了一组“稀疏”权重，负责学习不同位置间的依赖；FFN 则负责在每个位置上“干净”地抽取该词的内部特征，避免无谓的跨词干扰。</li><li><strong>卷积视角</strong>：将 FFN 看作<strong>对最后一维的 1×1 卷积</strong>，等同于对每个位置独立但在所有位置共享参数，这与 RNN 在时间步上共享权重的假设一致。</li><li><strong>增强表达</strong>：Attention 解决了上下文依赖，FFN 则补强了单位置特征提取，两者协同提升了 Transformer 的整体表达能力。</li></ul><hr><blockquote><p><strong>注意</strong>：以上操作对每个批次（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>）中每个序列位置（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>）都独立执行，参数在所有位置间共享。</p></blockquote><h4 id="Residual-Connection">Residual Connection</h4><p>在上面的操作中，这些操作都是有排列不变性。<br>残差是一个标准的操作，这样可以让网络更好地记录位置编码。</p><h4 id="Layer-Normalization">Layer Normalization</h4><p>目的是使得每一层经过Attention和Feed-Forward之后的输出的分布是一样的，这样可以使得梯度更加稳定。</p><h4 id="Value-Embedding">Value Embedding</h4><ul><li><p><strong>目的</strong>：将原始输入特征（如温度、流量、股价等数值）从低维（通常是 1 或几个通道）映射到高维向量空间，使模型能在更大维度下学习更丰富的特征表示。</p></li><li><p><strong>做法</strong>：通过一个线性层或 1×1 卷积（<code>TokenEmbedding</code>）把每个时间步的原始向量映成长度为 <code>d_model</code> 的向量。</p></li><li><p><strong>实现方式</strong>：通过一个线性映射或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>×</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">1 \times 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 卷积完，对于有<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">c_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>个特征维度的输入，使用卷积核的大小是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msub><mi>d</mi><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi></mrow></msub><mo separator="true">,</mo><msub><mi>c</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo separator="true">,</mo><mn>1</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[d_{model},c_{in},1]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span></p></li><li><p><strong>输入维度</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mtext>batch_size</mtext><mo separator="true">,</mo><mtext>seq_len</mtext><mo separator="true">,</mo><msub><mi>c</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\text{batch\_size}, \text{seq\_len}, c_{in})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mopen">(</span><span class="mord text"><span class="mord">batch_size</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord text"><span class="mord">seq_len</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p></li><li><p><strong>输出维度</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mtext>batch_size</mtext><mo separator="true">,</mo><mtext>seq_len</mtext><mo separator="true">,</mo><msub><mi>d</mi><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\text{batch\_size}, \text{seq\_len}, d_{model})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mopen">(</span><span class="mord text"><span class="mord">batch_size</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord text"><span class="mord">seq_len</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p></li></ul><h4 id="Positional-Encoding-Position-Embedding">Positional Encoding /Position Embedding</h4><p>位置信息是顺序信息的一种泛化的形式。如果采用独热编码，这是一种类别信息而不是一个顺序信息，不同的是不可以比的。所以引入<em>position embedding</em>，这是一个矩阵，效果类似于一个查找表。查找操作在这里就是一个矩阵乘上一个独热编码的操作，这是因为GPU在矩阵乘法操作上是非常高效的。<br>但是独热编码会带来下面的问题</p><ul><li><strong>高维稀疏性</strong>：  独热编码的维度等于序列最大长度（如512），导致向量稀疏且计算效率低下（尤其对长序列）。</li><li><strong>无法泛化到未见长度</strong>：  若训练时序列最大长度为512，模型无法处理更长的序列</li></ul><p><strong>引入归纳偏好</strong>：</p><ul><li>每个位置的编码应该是独一无二的且是确定的</li><li>认为两个位置的距离应该是一致的</li><li>应该生成一个有界的值，位置数随着序列长度的增加而增加</li></ul><p>Google的实现是使用的正弦和余弦函数的组合：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>e</mi><mi>i</mi></msub><mo stretchy="false">(</mo><mn>2</mn><mi>j</mi><mo stretchy="false">)</mo><mo>=</mo><mi>sin</mi><mo>⁡</mo><mrow><mo fence="true">(</mo><mfrac><mi>i</mi><msup><mn>10000</mn><mrow><mn>2</mn><mi>j</mi><mi mathvariant="normal">/</mi><msub><mi>d</mi><mtext>model</mtext></msub></mrow></msup></mfrac><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">e_i(2j) = \sin\left(\frac{i}{10000^{2j/d_{\text{model}}}}\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="mop">sin</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3365em;"><span style="top:-2.296em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1000</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">/</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">model</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span></span></span></span></span></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>e</mi><mi>i</mi></msub><mo stretchy="false">(</mo><mn>2</mn><mi>j</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mi>cos</mi><mo>⁡</mo><mrow><mo fence="true">(</mo><mfrac><mi>i</mi><msup><mn>10000</mn><mrow><mn>2</mn><mi>j</mi><mi mathvariant="normal">/</mi><msub><mi>d</mi><mtext>model</mtext></msub></mrow></msup></mfrac><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">e_i(2j+1) = \cos\left(\frac{i}{10000^{2j/d_{\text{model}}}}\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="mop">cos</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3365em;"><span style="top:-2.296em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1000</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">/</span><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">model</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span></span></span></span></span></p><p>上述公式中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>指的句子中的第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>个位置，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>指的是位置编码的维度，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mtext>model</mtext></msub></mrow><annotation encoding="application/x-tex">d_{\text{model}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">model</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是位置编码的维度。这样的编码是满足上面的归纳偏好的。</p><h4 id="Temporal-Embedding">Temporal Embedding</h4><ul><li><strong>目的</strong>：针对时间序列中特有的“时间属性”——小时、星期几、月份、季节等——进行编码，让模型学到周期性（如日周期、周周期、年周期）和节假日效应等信息。</li><li><strong>做法</strong>：通常把每个时间属性（hour-of-day, day-of-week, month 等）也映射到 <code>d_model</code> 维度，然后把这些属性向量加起来或拼接后再降维。<code>TemporalEmbedding</code> 类会根据 <code>embed_type</code>（如 <code>'fixed'</code> 或 <code>'learned'</code>）和 <code>freq</code>（如 <code>'h'</code>、<code>'d'</code>）来决定具体细节。</li></ul><h4 id="Encoder">Encoder</h4><p>编码器中使用的是多头注意力、逐位置前馈网络和位置编码。在这个编码器中是一个直筒式的网络，好处是调参较为简单。</p><p>缺点：</p><ul><li>二次复杂度</li><li>参数量过大</li><li>很多的头是冗余的</li></ul><p>训练阶段要使用多个头，发现有些头的权重较低，可以在推理阶段去掉这些头。</p><h4 id="Decoder">Decoder</h4><h5 id="Autoregressive">Autoregressive</h5><p>预测阶段一定要使用滚动预测，这是一个自回归的状态，但是这是一个串行的操作，会比较慢。但是在训练阶段这样是不能接受的，我希望训练的不同阶段可以并行计算，但是这里要求在一开始输入所有的序列，所以这里需要<strong>遮挡</strong>。<br>在算Attention的时候，对于当前的位置，只能看到之前的位置，不能看到之后的位置。</p><p>在编码器上是不能用的，因为防止解码器在训练时利用未来的目标序列信息（即“作弊”），确保模型逐步生成的能力与推理阶段一致。训练过程中仍然需要真实标签作为目标输出，但掩码限制了模型在生成当前词时对未来的访问。</p><h4 id="Encoder-Decoder-Attention">Encoder-Decoder Attention</h4><p>计算的是解码器的输出和编码器的输出之间的相关性，这里的Query是解码器的输出，Key和Value是编码器的输出。</p><p>注意这里是将编码器的输出输入到解码器中的每一层的Encoder-Decoder Attention中。这里是神经网络中的<strong>特征重用</strong>思想，并且解码器中的网络是直筒式的，所以这些特征是可以重用的。</p><h4 id="RNN-vs-Transformer">RNN vs. Transformer</h4><ul><li>RNN是串行的，Transformer是并行的</li><li>对于有严格偏序关系的序列，RNN可能更适合</li><li>对于长序列，Transformer更适合</li><li>对于较小的数据量，Transformers参数量较大，表现可能不如RNN</li></ul><h3 id="X-formers-Variance-with-Improvements">X-formers Variance with Improvements</h3><p><a href="https://arxiv.org/abs/2106.04554">[2106.04554] A Survey of Transformers</a></p><h3 id="GPT-Generative-Pre-trained-Transformer">GPT: Generative Pre-trained Transformer</h3><h4 id="Transfer-Learning">Transfer Learning</h4><p>先将一个模型预训练好，然后在特定的任务上进行微调。一般而言，预训练的过程是无监督的，优点是可以使用大规模数据。</p><h4 id="Pre-Training">Pre-Training</h4><ul><li>直接使用的是Transformers中的block，但是这里使用12层</li><li>只使用decoder没有encoder，因为这不是一个机器翻译的任务</li><li>在计算损失函数的过程中，使用的似然函数是最大似然估计，在实际中使用一个参数化的网络来近似需要的概率。</li></ul><h4 id="Supervised-Fine-Tuning">Supervised Fine-Tuning</h4><p>对于不同的任务，需要更换模型的输出头，并且还要使用新的损失函数。关注上下文建模。</p><p>最后是使用无监督训练的损失函数和有监督训练的损失函数的加权和，这是一个<strong>多任务学习</strong>。当微调的数据比较少的时候，可以使用无监督训练的损失函数的权重较大。</p><p>对于不同的下游任务，要进行任务适配<em>Task Specific Adaptation</em>。对于不同的下游任务，可以使用不同的头。</p><h4 id="GPT-2-GPT-3">GPT-2 &amp; GPT-3</h4><p>Zero-shot learning：在没有看到训练数据的情况下，直接在测试集上进行预测。通过在预训练阶段使用大规模的数据，可以使得模型具有更好的泛化能力，这样可以提高在一些常见问题上的表现。</p><h3 id="BERT-Bidirectional-Encoder-Representations-from-Transformers">BERT: Bidirectional Encoder Representations from Transformers</h3><p>与GPT不同的是，BERT是双向的，可以看到上下文的信息。</p><p>BERT在encoder阶段就使用了mask，这样可以使得模型在训练的时候不会看到未来的信息。在训练的过程中随机地mask掉一些词，然后预测这些词。如果遮挡的词太少，那么模型得到的训练不够， 如果遮挡的词太多，那么得到的上下文就很少。<br>在训练的过程中就使用了102种语言。<br>特征工程：使用了更多的特征，引入了更多的embedding<br>是多个任务的联合训练，这样可以使得模型更加通用。</p><h4 id="RoBERTa-A-Robustly-Optimized-BERT-Pretraining-Approach">RoBERTa: A Robustly Optimized BERT Pretraining Approach</h4><p>经过充分的调参和更长的训练时间，使得模型的表现更好。<br>证明了BERT中的下句预测是没有用的，因为在RoBERTa中去掉了这个任务。<br>mask的pattern可以动态调整</p><h4 id="ALBERT-A-Lite-BERT-for-Self-supervised-Learning-of-Language-Representations">ALBERT: A Lite BERT for Self-supervised Learning of Language Representations</h4><p>低秩分解，减少参数量</p><p>跨层参数共享：可以让模型更加稳定</p><h4 id="T5-Text-to-Text-Transfer-Transformer">T5: Text-to-Text Transfer Transformer</h4><p>迁移是泛化的高级形式：可以将多种文本任务统一为文本到文本的形式，这样可以使得模型更加通用。</p><p>架构层面的创新：</p><p>这里使用的是prefix-LM，这样可以使得模型更加通用。</p><h3 id="Vision-Transformer">Vision Transformer</h3><h4 id="ViT">ViT</h4><p>将一个图像变成一个patch<br>增加一个Position Embedding，于是得到各个patch的特征的加权平均。<br>主要的贡献是将图像转换为序列，从而可以使用transformers来进行建模。在这个之前，普遍的观点是transformers只能用于文本数据，而CNN用于图像数据。</p><h4 id="Swim-Transformer">Swim Transformer</h4><p>将CNN中的一些归纳偏好引入，可以使用局部的注意力，但是在一定程度上能捕捉全局的信息，通过Shifted Window Mechanism来实现。<br>层次化特征：</p><p>密集预测任务对于层次化特征需求更高，于是这个模型的表现是更好地。</p><h4 id="DETR">DETR</h4><h3 id="Fundation-Models">Fundation Models</h3><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>e</mi><mrow><mi>α</mi><mo>+</mo><mi>β</mi><mi>i</mi></mrow></msup><mo>=</mo><msup><mi>e</mi><mi>α</mi></msup><msup><mi>e</mi><mrow><mi>β</mi><mi>i</mi></mrow></msup><mo>=</mo><msup><mi>e</mi><mi>α</mi></msup><mo stretchy="false">(</mo><mi>cos</mi><mo>⁡</mo><mi>β</mi><mo>+</mo><mi>i</mi><mi>sin</mi><mo>⁡</mo><mi>β</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> e^{\alpha+ \beta i } = e^{\alpha} e^{\beta i} = e^{\alpha}(\cos \beta + i \sin \beta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8991em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0037em;">α</span><span class="mbin mtight">+</span><span class="mord mathnormal mtight" style="margin-right:0.05278em;">β</span><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8991em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0037em;">α</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05278em;">β</span><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0037em;">α</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mop">cos</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">sin</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mclose">)</span></span></span></span></span></p>]]>
    </content>
    <id>https://yima-gu.github.io/2025/08/01/Deep%20Learning/DL%20Notes-6%20Transformers/</id>
    <link href="https://yima-gu.github.io/2025/08/01/Deep%20Learning/DL%20Notes-6%20Transformers/"/>
    <published>2025-08-01T07:41:00.000Z</published>
    <summary>Transformers</summary>
    <title>DL Notes-6 Transformers</title>
    <updated>2026-07-01T11:38:22.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/categories/Deep-Learning/"/>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/tags/Deep-Learning/"/>
    <category term="RNN" scheme="https://yima-gu.github.io/tags/RNN/"/>
    <content>
      <![CDATA[<h2 id="Recurrent-Network">Recurrent Network</h2><h3 id="Sequence-Model">Sequence Model</h3><p>序列建模任务是指对一个序列的输入进行建模，比如文本、音频、视频等。序列模型的输入和输出都是序列，如机器翻译、语音识别、视频分类等任务。重要的是<strong>捕捉序列中的上下文</strong>。</p><h3 id="Basic-Principle">Basic Principle</h3><h4 id="Local-Dependency">Local Dependency</h4><p><strong>Local Dependency</strong>：对于序列中的每一个元素，它的预测是依赖于它的前面的元素的。这种依赖关系是<strong>局部的</strong>。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mi>T</mi></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>T</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>T</mi></munderover><mi>g</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>−</mo><mn>2</mn></mrow></msub><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_1,x_2,\dots,x_T) = \prod_{t=1}^{T} P(x_t|x_1,\dots,x_{t-1}) = \prod_{t=1}^{T} g(s_{t-2},x_{t-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>直接对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_t | x_1, \dots, x_{t-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 建模是极其困难的，因为随着 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> 的增长，条件部分的长度是可变的，会导致参数量爆炸。</p><ul><li><strong>马尔可夫假设 (Markov Assumption)</strong>：一个简单的妥协是假设当前状态只依赖于前一个或前几个状态（如n-gram模型）。但这会丢失大部分长期上下文信息，对于理解复杂序列是远远不够的。</li><li><strong>固定窗口 (Fixed Window)</strong>：使用一个固定大小的窗口（如前n个词）输入到MLP中。这种方法虽然解决了输入维度问题，但窗口大小难以确定，且丢失了窗口外的上下文。更重要的是，MLP的输入是位置无关的，它无法自然地处理序列的顺序信息。</li></ul><p>我们引入一个隐藏状态向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，并作出核心假设：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 能够<strong>压缩编码</strong>截至 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> 时刻的所有必要历史信息。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的计算依赖于前一时刻的状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">h_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 和当前时刻的输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">x_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。 $$h_t = f(h_{t-1}, x_t)$$ 这样，预测 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{t+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 就只需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 即可：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>≈</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>h</mi><mi>t</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_{t+1} | x_1, \dots, x_t) \approx P(x_{t+1} | h_t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。这个递推关系是RNN的灵魂。 同时，RNN引入了两个关键假设：</p><ol><li><strong>时间平稳性假设 (Stationarity Assumption)</strong>：决定状态如何演变的函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span> 在所有时间步上是<strong>相同</strong>的。这意味着模型在序列的不同位置学习到的模式是通用的。这在实践中体现为<strong>参数共享 (Parameter Sharing)</strong>，即计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>h</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>h</mi><mi>T</mi></msub></mrow><annotation encoding="application/x-tex">h_1, h_2, \dots, h_T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 时，使用的权重矩阵是同一套。这极大地减少了模型参数量，使其能够处理任意长度的序列。</li><li><strong>隐藏状态假设</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 包含了预测未来所需的全部历史信息。虽然理论上如此，但在实践中，基础RNN很难维持非常久远的记忆。</li></ol><div class="note note-info">            <ul><li><strong>核心机制</strong>: 通过一个循环更新的<strong>隐藏状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></strong> 来作为序列的“记忆”，理论上该状态压缩了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> 时刻之前的所有历史信息。</li><li><strong>核心假设</strong>: 状态转移函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span> 在时间上是<strong>共享</strong>的，这不仅极大减少了参数，也使得模型能够泛化到不同长度和位置的序列模式。</li><li><strong>本质</strong>: RNN将一个任意长度的序列问题，转化为了一个在每个时间步上重复执行相同操作的、结构固定的问题。</li></ul>          </div><h4 id="Language-Model">Language Model</h4><p>语言中的建模任务为：给定一个句子的前面的单词，预测下一个单词。这个任务被称为语言模型。语言模型的目标是最大化句子的概率。语言模型的输入是一个句子，输出是一个概率分布，表示下一个单词的概率。</p><p><strong>向量化表达</strong>：可以使用one-hot向量表示单词，也可以使用词向量表示单词。每个词的表达大概需要1000维度。<br>如果使用MLP，要将每个词的向量拼接起来，然后输入到MLP中。这样的模型不适合处理长序列，参数是非常可怕的。在MLP中丢失了一部分的信息（由于MLP的输入维度是可交换的），丢失了前后序关系。</p><h4 id="A-Better-MLP">A Better MLP</h4><p><strong>n-gram</strong>：使用n-gram模型，可以考虑前n个单词的信息。</p><img src="Pasted image 20250320225821.png" alt="" width="800"><p>输出的概率分布是一个softmax层，输入是一个向量，这个向量是前n个单词的向量拼接起来的。然后在得到的概率分布上进行采样。<strong>滚动预测</strong>，使用第一个次的预测结果作为第二次的输入，会有<strong>误差累计</strong>的问题。</p><p>但是上述模型会有一个问题：参数量太大；对于每一个词的预测需要有一个MLP，这样的模型不适合处理长序列。</p><h4 id="Parametric-Sharing">Parametric Sharing</h4><p>不同时刻使用的参数是一样的，这样可以大大降低参数量。这样的模型是<strong>循环神经网络</strong>。</p><hr><h3 id="RNN">RNN</h3><img src="Pasted image 20250321083321.png" alt="" width="800"><p>循环神经网络中最重要的内容是中间的隐藏层，构建学习到的时间程度上的特征。在每个时刻输入的都是向量，称为<em>token embedding</em>。<br>上述模型在纵向方向上，从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">x_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">y_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>就是一个前馈网络<em>feedforward network</em>（包括MLP和CNN）。在横向方向上，从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">s_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">s_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>就是一个循环网络<em>recurrent network</em>。</p><h4 id="Recurrent-Layer">Recurrent Layer</h4><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>用来编码<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻之前的所有信息。对于这样的层，接受的输入是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">x_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">h_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，输出是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的计算公式如下：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub><mo>=</mo><msub><mi>f</mi><mi>W</mi></msub><mo stretchy="false">(</mo><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h_t = f_W(h_{t-1},x_t) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">W</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub><mo>=</mo><mi>tanh</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>W</mi><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><mi>U</mi><msub><mi>x</mi><mi>t</mi></msub><mo>+</mo><msub><mi>b</mi><mi>h</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h_t = \tanh (Wh_{t-1} + Ux_t + b_h)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">tanh</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>长期以来使用的是双曲正切作为激活函数，但是使用ReLu可能有更好的梯度性质。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><msub><mi>y</mi><mi>t</mi></msub><mo>^</mo></mover><mo>=</mo><mi>V</mi><msub><mi>h</mi><mi>t</mi></msub><mo>+</mo><msub><mi>b</mi><mi>y</mi></msub></mrow><annotation encoding="application/x-tex">\hat{y_t} = Vh_t + b_y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>可以认为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>包含了之前的所有信息，所以使用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>来预测<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">y_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。<strong>通过引入状态变量来使得递推公式在形式上是二阶依赖</strong>（来源于两个依赖）。</p><div class="note note-info">            <p>可以将RNN的结构看作两个维度的信息流：</p><ul><li><strong>纵向（深度）方向</strong>：在<strong>单个时间步 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span></strong> 内，信息从输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">x_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 流经隐藏层 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 到输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>y</mi><mi>t</mi></msub><mo>^</mo></mover></mrow><annotation encoding="application/x-tex">\hat{y_t}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span>。这部分是一个标准的前馈网络，其训练挑战（如梯度消失/爆炸）与MLP或CNN类似。</li><li><strong>横向（时间）方向</strong>：信息从前一状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">h_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 流向当前状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。这是RNN特有的<strong>循环连接</strong>，也是其强大能力和主要训练难点（尤其是长程依赖导致的梯度问题）的根源。</li></ul>          </div><h4 id="Bidirectional-Deep-RNN">Bidirectional&amp;Deep RNN</h4><img src="Pasted image 20250321091923.png" alt="" width="800"><img src="Pasted image 20250321091936.png" alt="" width="800"><p>这里纵向方向上的前馈网络中的训练难点在前面的MLP与CNN中是一样的，梯度消失和梯度爆炸。<br>上面的图中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mrow><mi>t</mi><mo separator="true">,</mo><mi>c</mi></mrow></msub></mrow><annotation encoding="application/x-tex">y_{t,c}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">c</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>是真是标签的独热编码，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span>是此表中的元素个数。</p><p>在横向方向上，梯度消失是很严重的。因为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>包含了<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">h_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>的信息，所以梯度会在时间上指数级的衰减。解决这个问题的方法是<strong>LSTM</strong>和<strong>GRU</strong>。</p><h4 id="RNN-for-LM">RNN for LM</h4><ul><li>理论上，可以表达没有边界的时间上的依赖，由于将状态变量编码为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>包含了之前的所有信息。</li><li>将序列编码到一个向量中，这个向量包含了整个序列的信息。</li><li>参数在时间上是共享的</li><li>但是在实际上，很难建模时间上的长时间依赖。对于较早的信息，后面的权重会很小。</li></ul><p><strong>一个模型是否有效，在于<em>assumptions</em>与实际情况是否匹配。</strong></p><h4 id="Architecture">Architecture</h4><img src="Pasted image 20250321102900.png" alt="" width="800"><h5 id="1-Many-to-One"><strong>1. Many to One</strong></h5><ul><li><strong>任务</strong>: 情感分析、文本分类。</li><li><strong>结构</strong>: 输入一个序列，只在最后一个时间步 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 产生一个输出。</li><li>这里的核心假设是，最后一个隐藏状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>T</mi></msub></mrow><annotation encoding="application/x-tex">h_T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 已经对整个序列的信息进行了充分的编码和总结。然而，有时序列的关键信息（如情感词）可能出现在中间，这促使了后续Attention等机制的发展。</li></ul><h5 id="2-One-to-Many"><strong>2. One to Many</strong></h5><ul><li><strong>任务</strong>: 图像描述生成、音乐生成。</li><li><strong>结构</strong>: 输入一个单独的向量（如图像特征），输出一个序列。</li><li>通常，这个单一输入向量被用来初始化RNN的初始隐藏状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">h_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，或者在每个时间步都作为输入的一部分提供给RNN。</li></ul><h5 id="3-Many-to-Many"><strong>3. Many to Many</strong></h5><ul><li><strong>同步 (Aligned)</strong>：如视频逐帧分类、词性标注。输入序列和输出序列的长度严格对齐。</li><li><strong>异步 (Delayed/Autoregressive)</strong>：如语言模型。输出序列是输入序列的错位版本（预测下一个词）。</li></ul><h5 id="4-Sequence-to-Sequence-Seq2Seq"><strong>4. Sequence to Sequence (Seq2Seq)</strong></h5><ul><li><strong>任务</strong>: 机器翻译、对话系统、文本摘要。</li><li><strong>结构</strong>: 输入和输出都是序列，但长度不一定相同。这通常由一个<strong>编码器 (Encoder)</strong> 和一个<strong>解码器 (Decoder)</strong> 组成。</li><li><strong>Encoder</strong>: 一个RNN，负责读取整个输入序列，并将其所有信息压缩成一个固定长度的<strong>上下文向量 (context vector)</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>（通常是Encoder最后一个时间步的隐藏状态）。</li><li><strong>Decoder</strong>: 另一个RNN，以该上下文向量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 为初始状态，逐步生成输出序列。</li></ul><img src="Pasted image 20250321110238.png" alt="" width="800"><p>首先将输入变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{x_t\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>编码到状态变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>h</mi><mi>t</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{h_t\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>中<em>encoder</em>，然后再将状态变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>h</mi><mi>t</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{h_t\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>解码到输出变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>y</mi><mi>t</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{y_t\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>中<em>decoder</em>。编码器是没有loss function的，解码器接受的输入是编码器的输出，解码器的输出是一个概率分布。解码器的loss function是交叉熵损失函数。</p><p>在上面的图片中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>W</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">W_1,W_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是模型的参数，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>x</mi><mi>t</mi></msub><mo stretchy="false">}</mo><mo separator="true">,</mo><mo stretchy="false">{</mo><msub><mi>y</mi><mi>t</mi></msub><mo stretchy="false">}</mo><mo separator="true">,</mo><mo stretchy="false">{</mo><msub><mi>h</mi><mi>t</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{x_t\},\{y_t\},\{h_t\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>是模型的变量，考虑中文翻译英文问题，可以将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">W_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>理解为模型如何理解中文，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">W_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以理解为如何将写出英文。</p><p><strong>机器翻译任务中的挑战</strong>：</p><ul><li>输入和输出是异构的</li><li>长序列的处理</li></ul><img src="Pasted image 20250321130443.png" alt="" width="800"><p><strong>如何从概率中采样</strong>：</p><ul><li>选择概率最大的</li><li>概率较大的有更大的概率被选择</li><li>Beam Search贪心方法进行搜索</li></ul><img src="Pasted image 20250321130842.png" alt="" width="800"><p>可以选择概率较大的k个词，然后以这个词为条件计算下一个词的条件概率，类似于构建一个真k叉树，这样的方法是一种贪心的方法。考虑这棵树上所有的路径，选择最大的路径（本质上是一种搜索技术）。</p><h4 id="Backpropagation-Through-Time">Backpropagation Through Time</h4><img src="Pasted image 20250321133148.png" alt="" width="800"><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>U</mi></mrow></mfrac><mo>=</mo><munderover><mo>∑</mo><mrow><mi>t</mi><mo>=</mo><mn>0</mn></mrow><mi>T</mi></munderover><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>L</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>U</mi></mrow></mfrac><mo>=</mo><munderover><mo>∑</mo><mrow><mi>t</mi><mo>=</mo><mn>0</mn></mrow><mi>T</mi></munderover><munderover><mo>∑</mo><mrow><mi>s</mi><mo>=</mo><mn>0</mn></mrow><mi>t</mi></munderover><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>L</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>y</mi><mi>t</mi></msub></mrow></mfrac><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>y</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow></mfrac><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>s</mi></msub></mrow></mfrac><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>s</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>U</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\partial L}{\partial U}  = \sum_{t=0}^T \frac{\partial L_{t}}{\partial U} = \sum_{t=0}^{T} \sum_{s=0}^t \frac{\partial L_{t}}{\partial y_t} \frac{\partial y_t}{\partial h_t}  \frac{\partial h_t}{\partial h_s}\frac{\partial h_s}{\partial U}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>前一个求和的意义是对于损失函数的各个部分求和，后面的求和式是对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的前面的每一个可能的链求和。<br>其中：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>s</mi></msub></mrow></mfrac><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mi>s</mi><mo>+</mo><mn>1</mn></mrow><mi>t</mi></munderover><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>i</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\partial h_t}{\partial h_s} = \prod_{i=s+1}^t \frac{\partial h_i}{\partial h_{i-1}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.2074em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.1166em;vertical-align:-1.336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">s</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.336em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8943em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>这个式子是一个矩阵乘法，是一个矩阵的连乘。这个矩阵是一个雅可比矩阵。</p><img src="Pasted image 20250321135457.png" alt="" width="800"><p>用<em>Cauchy-Schwarz</em>不等式可以证明：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="normal">∥</mi><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mo>≤</mo><mi mathvariant="normal">∥</mi><msup><mi>W</mi><mi>T</mi></msup><mi mathvariant="normal">∥</mi><mi mathvariant="normal">∥</mi><mi>d</mi><mi>i</mi><mi>a</mi><mi>g</mi><mo stretchy="false">(</mo><msup><mi>f</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">(</mo><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mi mathvariant="normal">∥</mi><mo>≤</mo><msub><mi>σ</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub><mi>γ</mi></mrow><annotation encoding="application/x-tex">\| \frac{\partial h_t}{\partial h_{t-1}} \| \leq \| W^T \| \|diag (f&#x27;(h_{t-1}))\| \leq \sigma_{max} \gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.2658em;vertical-align:-0.8943em;"></span><span class="mord">∥</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8943em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∥</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord">∥∥</span><span class="mord mathnormal">d</span><span class="mord mathnormal">ia</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">))</span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span></span></span></span></span></p><p>这里<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\sigma_{max}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex">W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>的最大奇异值，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>γ</mi></mrow><annotation encoding="application/x-tex">\gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span></span></span></span>是激活函数的导数的最大值。<br>于是：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="normal">∥</mi><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>s</mi></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mi>s</mi><mo>+</mo><mn>1</mn></mrow><mi>t</mi></munderover><mi mathvariant="normal">∥</mi><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>i</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mo>≤</mo><mo stretchy="false">(</mo><msub><mi>σ</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub><mi>γ</mi><msup><mo stretchy="false">)</mo><mrow><mi>t</mi><mo>−</mo><mi>s</mi></mrow></msup></mrow><annotation encoding="application/x-tex">\| \frac{\partial h_t}{\partial h_{s}} \| =  \prod_{i=s+1}^t \| \frac{\partial h_i}{\partial h_{i-1}} \| \leq (\sigma_{max} \gamma)^{t-s}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.2074em;vertical-align:-0.836em;"></span><span class="mord">∥</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.1166em;vertical-align:-1.336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">s</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.336em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">∥</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8943em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0936em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.05556em;">γ</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">s</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p>这个式子说明了梯度消失的问题，梯度消失是指梯度在时间上的指数级衰减。或者梯度爆炸的问题，梯度爆炸是指梯度在时间上的指数级增长。</p><h5 id="Truncated-BPTT">Truncated BPTT</h5><img src="Pasted image 20250321140454.png" alt="" width="800"><p>这个方法是将时间上的梯度截断，这样可以减少梯度消失和梯度爆炸的问题。但是这样的方法会导致梯度的估计不准确，因为梯度的估计是基于一个截断的时间窗口的。</p><p>BPTT本质上就是将循环网络在时间维度上“展开”成一个深度前馈网络，然后应用标准的反向传播算法。计算损失函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span> 对某个较早时刻 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 的状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>s</mi></msub></mrow><annotation encoding="application/x-tex">h_s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的梯度时，链式法则要求我们连乘一系列雅可比矩阵：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>t</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>s</mi></msub></mrow></mfrac><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mi>s</mi><mo>+</mo><mn>1</mn></mrow><mi>t</mi></munderover><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mi>i</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>h</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow></mfrac><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mi>s</mi><mo>+</mo><mn>1</mn></mrow><mi>t</mi></munderover><msubsup><mi>W</mi><mi>h</mi><mi>T</mi></msubsup><mtext>diag</mtext><mo stretchy="false">(</mo><msup><mi>f</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">(</mo><msub><mi>h</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\frac{\partial h_t}{\partial h_s} = \prod_{i=s+1}^t \frac{\partial h_i}{\partial h_{i-1}} = \prod_{i=s+1}^t W_h^T \text{diag}(f&#x27;(h_{i-1}))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.2074em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.1166em;vertical-align:-1.336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">s</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.336em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8943em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.1166em;vertical-align:-1.336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">s</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.336em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.453em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">h</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord">diag</span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">))</span></span></span></span></span></p><p>这个连乘是问题的根源。如果雅可比矩阵的范数（由权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>h</mi></msub></mrow><annotation encoding="application/x-tex">W_h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和激活函数的导数决定）持续大于1，梯度会呈指数级增长，导致<strong>梯度爆炸</strong>；如果持续小于1，梯度会呈指数级消失，导致<strong>梯度消失</strong>。</p><div class="note note-info">            <ul><li><strong>问题根源</strong>: BPTT中梯度的计算涉及<strong>雅可比矩阵的长期连乘</strong>。</li><li><strong>梯度爆炸 (Exploding Gradients)</strong>: 权重过大导致梯度指数级增长。</li><li><strong>后果</strong>: 训练不稳定，参数更新过大导致NaN。<strong>解决方法</strong>: <strong>梯度裁剪 (Gradient Clipping)</strong>，即在梯度超过某个阈值时，强行将其缩放回来。</li><li><strong>梯度消失 (Vanishing Gradients)</strong>: 权重过小导致梯度指数级衰减。<strong>后果</strong>: 模型无法学习到长程依赖关系，较早时刻的信息无法影响到后面的参数更新。<strong>解决方法</strong>: <strong>门控机制 (Gating Mechanism)</strong>，如LSTM和GRU。</li></ul>          </div><h4 id="Long-Short-Term-Memory">Long Short-Term Memory</h4><ul><li><p>遗忘，将过去“没用”的信息遗忘</p></li><li><p>更新，将新的信息更新到状态变量中</p></li><li><p>输出，输出门控制一部分信息用来进行预测</p></li><li><p><strong>细胞状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">c_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></strong>: 这是LSTM的核心。可以把它想象成一条“信息高速公路”或“传送带”，信息可以在上面很顺畅地流动，只进行少量的线性操作。这使得梯度能够更容易地在时间步之间传播。</p></li><li><p><strong>门 (Gates)</strong>: LSTM有三个关键的门（遗忘门、输入门、输出门），它们都是小型的神经网络（通常是Sigmoid层），其输出在 <code>[0, 1]</code> 之间，用来控制信息的通过量。</p><ol><li><strong>遗忘门 (Forget Gate, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">f_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>: 决定从旧的细胞状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">c_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 中<strong>遗忘</strong>多少信息。</li><li><strong>输入门 (Input Gate, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>i</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">i_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>: 决定让多少“候选新信息” <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mover accent="true"><mi>c</mi><mo>~</mo></mover><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">\tilde{c}_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8179em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal">c</span></span><span style="top:-3.35em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1944em;"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> <strong>写入</strong>到当前细胞状态中。</li><li><strong>输出门 (Output Gate, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>o</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">o_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">o</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</strong>: 决定从更新后的细胞状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">c_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 中<strong>输出</strong>多少信息，作为当前时间步的隐藏状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li></ol></li></ul><img src="Pasted image 20250321141243.png" alt="" width="800"><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻的状态变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">h_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>储存的是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻的信息，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">c_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻的记忆变量，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">h_{t-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">x_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻的输入，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">f_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是遗忘门，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>i</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">i_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是输入门，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>o</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">o_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">o</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是输出门，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>g</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">g_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是更新门。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>i</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>f</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>o</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>g</mi></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow><mo>=</mo><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>σ</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>σ</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>σ</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>tanh</mi><mo>⁡</mo></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow><mrow><mo fence="true">(</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>W</mi><mi>i</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>W</mi><mi>f</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>W</mi><mi>o</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>W</mi><mi>g</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>h</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>x</mi><mi>t</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo>+</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mi>i</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mi>f</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mi>o</mi></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mi>g</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\begin{pmatrix} i \\ f \\ o \\ g \end{pmatrix} = \begin{pmatrix} \sigma \\ \sigma \\ \sigma \\ \tanh \end{pmatrix} \left( \begin{bmatrix} W_i \\ W_f \\ W_o \\ W_g \end{bmatrix} \begin{bmatrix} h_{t-1} \\ x_t \end{bmatrix} + \begin{bmatrix} b_i \\ b_f \\ b_o \\ b_g \end{bmatrix} \right) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.8em;vertical-align:-2.15em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,-36,557 l0,1284c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189l0,-1292c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">i</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">o</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,1209c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558l0,-1344c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:4.8em;vertical-align:-2.15em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,-36,557 l0,1284c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189l0,-1292c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mop">tanh</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,1209c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558l0,-1344c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,-36,557 l0,1284c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189l0,-1292c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.800em" viewBox="0 0 667 4800"><path d="M403 1759 V84 H666 V0 H319 V1759 v1200 v1759 h347 v-84H403z M403 1759 V0 H319 V1759 v1200 v1759 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">o</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.800em" viewBox="0 0 667 4800"><path d="M347 1759 V0 H0 V84 H263 V1759 v1200 v1759 H0 v84 H347zM347 1759 V0 H263 V1759 v1200 v1759 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">[</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">]</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.800em" viewBox="0 0 667 4800"><path d="M403 1759 V84 H666 V0 H319 V1759 v1200 v1759 h347 v-84H403z M403 1759 V0 H319 V1759 v1200 v1759 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">o</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.800em" viewBox="0 0 667 4800"><path d="M347 1759 V0 H0 V84 H263 V1759 v1200 v1759 H0 v84 H347zM347 1759 V0 H263 V1759 v1200 v1759 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.875em;height:4.800em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="4.800em" viewBox="0 0 875 4800"><path d="M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,1209c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558l0,-1344c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ol><li><strong>准备输入 (拼接 - Concatenation)</strong> 将上一个时间步的隐藏状态 <code>h_&#123;t-1&#125;</code> 和当前时间步的输入 <code>x_t</code> 在垂直方向上拼接成一个更长的向量。这是后续所有计算的统一输入。</li><li><strong>线性变换 (Linear Transformation)</strong>  用一个堆叠起来的巨大权重矩阵 <code>W</code> (由<code>W_i, W_f, W_o, W_g</code> 四个独立矩阵堆叠而成) 与拼接后的输入向量进行一次矩阵乘法，并加上一个同样堆叠起来的偏置向量 <code>b</code>。 * 这一步是为了计算效率，通过一次大的并行计算，得到四个组件各自的“原始得分”。</li><li><strong>非线性激活 (Element-wise Activation)</strong>  对上一步得到的“原始得分”向量进行分段处理，按元素应用不同的激活函数。</li></ol><ul><li><strong><code>i</code>, <code>f</code>, <code>o</code>, <code>g</code> 的维度是完全相同的</strong>。</li><li>它们的维度都等于LSTM层定义的一个核心超参数——<strong>隐藏维度 (<code>hidden_size</code>)</strong>。</li></ul><img src="Pasted image 20250321141234.png" alt="" width="800"><p>上述网络构造了一个信息流高速路径，使得梯度能够进行快速的传播。</p><p>遗忘门和残差网络的思想是类似的，都是将过去的信息和现在的信息进行融合。这样的网络可以更好的处理长序列的问题。[[DL Note-3 CNN#ResNet]]</p><div class="note note-info">            <ul><li><strong>核心组件</strong>: 独立的<strong>细胞状态 (Cell State) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">c_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></strong>。</li><li><strong>关键操作</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">c_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的更新主要是<strong>加法</strong> (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>t</mi></msub><mo>⊙</mo><msub><mi>c</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><msub><mi>i</mi><mi>t</mi></msub><mo>⊙</mo><msub><mover accent="true"><mi>c</mi><mo>~</mo></mover><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">f_t \odot c_{t-1} + i_t \odot \tilde{c}_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8179em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal">c</span></span><span style="top:-3.35em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1944em;"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)，而不是像简单RNN中那样的矩阵乘法和非线性激活的嵌套。</li><li><strong>效果</strong>: 加法操作使得梯度在反向传播时能够更直接、更完整地传递，避免了连乘导致的指数级衰减。遗忘门和残差网络(ResNet)中的恒等映射思想有异曲同工之妙，都为信息/梯度提供了一条“高速公路”。</li></ul>          </div><h4 id="Gradient-Clipping">Gradient Clipping</h4><p>梯度的大小是由模长决定的，如果梯度的模长过大，可以将梯度的模长进行截断。这样可以避免梯度爆炸的问题。</p><h4 id="Variational-Dropout">Variational Dropout</h4><p>在深度网络中，如果是过拟和的，也就是对于一个含有多个参数的网络。也就是说如果输入的参数小于参数的个数，那么相对应的线性方程组是欠定的。</p><p>在RNN中对应的纵向方向上是多层感知机，所以可以采用标准的Dropout方法。但是在横向方向上是一个循环网络，Dropout方法不适用。因为Dropout方法会破坏时间上的连续性，违背了参数共享的原则。<br>采用<strong>步调一致</strong>的方法进行操作，这样可以保持时间上的连续性。这样的方法是<strong>Variational Dropout</strong>。</p><h4 id="Layer-Normalization">Layer Normalization</h4><img src="Pasted image 20250322202759.png" alt="" width="800"><p>在CNN中，对于每一个通道的值进行归一化。在这样的每一个通道中计算均值和方差。还是要加入一个平移变量和伸缩变量。</p><p>在RNN中，主要的原因是门控结构是相对于每一个序列而言的，所以应该引入一种新的归一化方法<em>Layer Normalization</em>，应该在每一条样本（一个序列）在每一个时刻经过之后的值在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span>个通道上进行归一化操作。<br>最后得到的结果是：将所有的向量放在以原点为球心的单位球面上。</p><h4 id="Weight-Normalization">Weight Normalization</h4><p>对于每层的参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">w</mi></mrow><annotation encoding="application/x-tex">\mathbf{w}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4444em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">w</span></span></span></span>进行重参数化：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="bold">w</mi><mo>=</mo><mfrac><mi>g</mi><mrow><mi mathvariant="normal">∥</mi><mi>v</mi><mi mathvariant="normal">∥</mi></mrow></mfrac><mi>v</mi></mrow><annotation encoding="application/x-tex">\mathbf{w} = \frac{g}{\|v\|}v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4444em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">w</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0436em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord">∥</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span></span></p><img src="Pasted image 20250322204925.png" alt="" width="800"><p>对右边的式子<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mi>v</mi><mrow><mi mathvariant="normal">∥</mi><mi>v</mi><mi mathvariant="normal">∥</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{v}{\|v\|}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2154em;vertical-align:-0.52em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6954em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∥</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mtight">∥</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.52em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>进行优化是更为容易的，重参数化的意思是，在训练和测试的时候使用不同的参数表达形式，这样是更加容易优化的。</p><h4 id="Training-Inference-Shift">Training-Inference Shift</h4><p>滚动预测：在训练的时候，使用真实的标签进行预测；在测试的时候，使用的是推理得到的值进行预测。这是一个自回归任务。</p><h5 id="Curriculum-Learning">Curriculum Learning</h5><p>在训练的时候，可以先训练一些简单的任务，然后再训练一些复杂的任务。这样可以更好的训练模型。<br>在实际中，可以对所有的样本计算loss，先计算loss较小的样本，然后再计算loss较大的样本。这就是<strong>自步学习</strong>。<br>这里涉及到选择不同的样本顺序的问题。</p><p><em>Scheduled Sampling</em>：在学习刚开始的时候，更多地使用真实的标签进行预测；随着学习的进行，更多地使用模型预测的值进行预测。<strong>是RNN中很重要的技术</strong>。</p><hr><h3 id="RNN-with-Attention">RNN with Attention</h3><h4 id="Human-Attention">Human Attention</h4><p>人类的注意力：</p><ul><li>可持续注意力（没有实现）</li><li>选择性注意力（人类的选择性注意力复杂得多）</li><li>交替式注意力</li><li>分配式注意力</li></ul><h4 id="Attention-in-Deep-Learning">Attention in Deep Learning</h4><blockquote><p><em>Allowing the model to dynamically pay attention to only certain parts of the input that help in performing the task at hand effectively.</em></p></blockquote><p>存在时间<em>temporal Attention</em>和空间<em>Spatial Attention</em>上的注意力。一般而言指的是时间上的注意力。</p><h4 id="Auto-Regessive">Auto-Regessive</h4><p>最重要的问题是编码器和解码器之间的信息沟通太少了，存在有信息瓶颈。在翻译任务中就像必须先完整地听完一段很长的中文，然后闭上眼睛，仅凭脑中的一个模糊记忆，去完整地翻译出对应的英文。</p><p>并且在翻译任务中，输入和输出的顺序并不是一致的，大部分的语言的语序是不一样的。<br><strong>希望看到后面的信息</strong>，这和RNN的设计目的是相违背的。<strong>全连接的思想</strong>又回来了，获得全局信息的方法有很多，不只是有MLP的方法。有一种基本思想是<em><strong>Relevance</strong></em>，也就是和当前任务相关的信息。这个思想是在Attention中得到了体现。</p><h4 id="Attention">Attention</h4><img src="Pasted image 20250322222251.png" alt="" width="800"><p>计算两个东西的相似度有：计算内积、输入<em>relation network</em>。这样的模型在互联网中有很多的应用，比如推荐系统、搜索引擎等。</p><img src="Pasted image 20250323084415.png" alt="" width="800"><p>注意力的分配是符合概率分布的，所以可以使用上面计算得到的相关性<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>e</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">e_{ij}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>使用softmax函数进行归一化。这样得到的分布就是注意力的分布：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>α</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>=</mo><mfrac><mrow><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>e</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo stretchy="false">)</mo></mrow><mrow><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>T</mi><mi>x</mi></msub></munderover><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>e</mi><mrow><mi>i</mi><mi>k</mi></mrow></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T_x} \exp(e_{ik})}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.5979em;vertical-align:-1.1709em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.1288em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9812em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:-0.1389em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">exp</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">ik</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mop">exp</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1709em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>上述计算式表达的含义是，在状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>的时刻分配在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>上的注意力（对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>的求和为1）。继续计算<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>T</mi><mi>x</mi></msub></munderover><msub><mi>α</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><msub><mi>x</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_i = \sum_{j=1}^{T_x} \alpha_{ij} x_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2532em;vertical-align:-1.4138em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8394em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3111em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:-0.1389em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>这里<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是对于状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>的时刻的注意力向量，是对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>的加权和。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>y</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>c</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s_i = f(s_{i-1},y_{i-1},c_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>这里<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">s_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是状态变量，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">y_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>是前一个时刻的输出，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是当前时刻的注意力向量。这里的函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span>是一个GRU or LSTM。这个模型是一个<strong>Seq2Seq</strong>模型。</p><blockquote><p>这里的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">s_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的区别是什么，为什么和LSTM有关</p></blockquote><img src="Pasted image 20250323084332.png" alt="" width="800"><img src="Pasted image 20250323084535.png" alt="" width="800"><p>在机器翻译的过程中，使用source的上下文信息比直接使用词典来翻译更好。这样的模型可以更好的处理长序列的问题。只要是序列都会使用<strong>滑动窗口</strong>，一般设置为50~100之间。对于较短的情况，可以使用psdding的方法；对于较长的情况会使用截断的方法。希望找一个与序列的长度线性关系的模型。</p><h4 id="Attention-vs-MLP">Attention vs. MLP</h4><p>相同点：</p><ul><li>都是全局模型，是对于长序关系的建模。</li></ul><p>不同点：</p><ul><li>Attention是基于概率的，MLP是基于全连接的。</li><li>Attention引入relevance的思想，能大大减小参数量</li></ul><h4 id="Hierarchical-Attention">Hierarchical Attention</h4><p>先建模词注意力然后再建模句子注意力。</p><h4 id="Global-Attention">Global Attention</h4><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>score</mtext><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.36em" columnalign="left left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msubsup><mi>h</mi><mi>t</mi><mi>T</mi></msubsup><mover accent="true"><msub><mi>h</mi><mi>s</mi></msub><mo stretchy="true">‾</mo></mover></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msubsup><mi>h</mi><mi>t</mi><mi>T</mi></msubsup><msub><mi>W</mi><mi>a</mi></msub><mover accent="true"><msub><mi>h</mi><mi>s</mi></msub><mo stretchy="true">‾</mo></mover></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msubsup><mi>v</mi><mi>a</mi><mi>T</mi></msubsup><mi>tanh</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>W</mi><mi>a</mi></msub><mo stretchy="false">[</mo><msub><mi>h</mi><mi>t</mi></msub><mo separator="true">;</mo><mover accent="true"><msub><mi>h</mi><mi>s</mi></msub><mo stretchy="true">‾</mo></mover><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">\text{score} = \begin{cases}h_t^T \overline{h_s} \\h_t^T W_a \overline{h_s} \\v_a^T \tanh(W_a[h_t;\overline{h_s}])\end{cases}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord text"><span class="mord">score</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:4.32em;vertical-align:-1.91em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.35em;"><span style="top:-2.2em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-2.192em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.316em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.316em" style="width:0.8889em" viewBox="0 0 888.89 316" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V316 H384z M384 0 H504 V316 H384z"/></svg></span></span><span style="top:-3.15em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.292em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.316em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.316em" style="width:0.8889em" viewBox="0 0 888.89 316" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V316 H384z M384 0 H504 V316 H384z"/></svg></span></span><span style="top:-4.6em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.85em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.41em;"><span style="top:-4.41em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8144em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-2.97em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8144em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-1.53em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">tanh</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8144em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mclose">])</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.91em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>发现上面三种计算方式的效率是差不多的。</p><img src="Pasted image 20250323090740.png" alt="" width="800"><h3 id="Memory">Memory</h3><h4 id="Human-Memory">Human Memory</h4><ul><li>Sensory Memory<ul><li>计算机视觉与机器感知</li></ul></li><li>Short-term Memory<ul><li>与计算机中的内存是很相近的，LSTM是一种将短期记忆尽量变长的方法。</li></ul></li><li>Long-term Memory<ul><li>前面的模型中没有实现这个功能</li></ul></li></ul><p>在自然语言中，比较困难的任务是进行对话，这时候需要进行长期记忆。在对话中，需要对话的上下文进行理解。</p><h4 id="Neural-Turing-Machine">Neural Turing Machine</h4><img src="Pasted image 20250323092327.png" alt="" width="800"><p>在这个模型中，最重要的是对内存1进行寻址的操作，这个操作是一个注意力的操作。<br>对于读的操作，是按照注意力的大小对地址里面的内容进行加权平均。<br>对于写的操作，类似于LSTM中的Forget Gate，先进行擦除之后才进行写入。</p><p>对于Internal Memory，最大的问题是可能会遗忘，对于External Memory，是一个外部的存储器，这样的存储是比较稳定的。</p><div class="note note-info">            <ul><li><strong>解决了信息瓶颈</strong>: 不再依赖于单一的、固定长度的上下文向量，而是为解码的每一步都生成一个动态的、量身定制的上下文向量。</li><li><strong>实现了“软对齐”</strong>: 注意力权重分布直观地显示了输入和输出序列之间的对齐关系，大大增强了模型的可解释性。</li><li><strong>有效处理长序列</strong>: 由于能够直接访问所有输入状态，模型处理长程依赖的能力得到质的飞跃。Attention机制是后续Transformer等更强大模型的基础。</li></ul>          </div>]]>
    </content>
    <id>https://yima-gu.github.io/2025/07/28/Deep%20Learning/DL%20Note-5%20RNN/</id>
    <link href="https://yima-gu.github.io/2025/07/28/Deep%20Learning/DL%20Note-5%20RNN/"/>
    <published>2025-07-28T04:30:00.000Z</published>
    <summary>Recurrent Network</summary>
    <title>DL Note-5 RNN</title>
    <updated>2026-07-01T11:38:22.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/categories/Deep-Learning/"/>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/tags/Deep-Learning/"/>
    <category term="Optimization" scheme="https://yima-gu.github.io/tags/Optimization/"/>
    <content>
      <![CDATA[<h2 id="Optimization">Optimization</h2><p><strong>Objective Function</strong></p><p>在深度学习中，训练模型本质上是一个优化过程。我们的核心目标是寻找一组模型参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>，使得在给定数据集<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">D</mi></mrow><annotation encoding="application/x-tex">\mathcal{D}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">D</span></span></span></span>上的目标函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi mathvariant="script">D</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{O}(\mathcal{D}, \theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathcal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span>最小化。该目标函数通常由两部分构成：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>arg</mi><mo>⁡</mo><mi>min</mi><mo>⁡</mo><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi mathvariant="script">D</mi><mo separator="true">,</mo><mi mathvariant="script">θ</mi><mo stretchy="false">)</mo></mrow><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>+</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\arg \min \mathcal{O(D,\theta)}=  \sum_{i=1}^{N} L(y_i, f(x_i,\theta)) + \Omega(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">ar<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">min</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathcal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.106em;vertical-align:-1.2777em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span></span></p><ul><li><strong>损失项 (Loss Term)</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></msubsup><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sum_{i=1}^{N} L(y_i, f(x_i,\theta))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2809em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9812em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">))</span></span></span></span>，衡量模型在训练数据上的表现。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>是损失函数，用于计算模型预测值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x_i, \theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span>与真实标签<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">y_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>之间的差异。</li><li><strong>正则项 (Regularization Term)</strong>:  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\Omega(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span> 用于对模型复杂度进行惩罚，防止过拟合，从而提升模型的泛化能力。</li></ul><p>将目标函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi></mrow><annotation encoding="application/x-tex">\mathcal{O}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">O</span></span></span></span> 视为以参数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span> 为变量的超高维曲面，我们的任务就是找到这个曲面的最低点。然而，深度学习中的目标函数是<strong>非凸 (Non-convex)</strong> 的，这意味着它存在大量的局部极小值 (local minima) 和鞍点 (saddle points)。因此，优化算法的性能不仅取决于能否快速收敛，还取决于能否找到一个“好”的极小值——通常指那些不仅损失值低，而且所处区域较为平坦宽阔 (flat minima) 的极小值，这样的模型泛化性能更强。</p><h3 id="First-Order-Optimization">First-Order Optimization</h3><p>可以将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span>展开为泰勒级数：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mi>H</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta) = J(\theta_0) + \nabla J(\theta_0)^T(\theta - \theta_0) + \frac{1}{2}(\theta - \theta_0)^T H(\theta - \theta_0) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>沿着梯度的方向进行更新：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><mi>η</mi><mi>g</mi><mo stretchy="false">)</mo><mo>=</mo><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>−</mo><mi>η</mi><msup><mi>g</mi><mi>T</mi></msup><mi>g</mi><mo>≤</mo><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta - \eta g) = J(\theta ) -  \eta g^Tg \leq J(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0858em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span></span></p><p><strong>梯度下降的主要挑战</strong>:</p><ol><li><strong>鞍点停滞</strong>: 在高维空间中，鞍点远比局部极小值更常见。在鞍点处梯度为零，标准梯度下降会在此停滞。</li><li><strong>学习率敏感性</strong>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>η</mi></mrow><annotation encoding="application/x-tex">\eta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span></span> 的选择至关重要。过大可能导致在极小值附近震荡甚至发散；过小则收敛速度过慢。 对于学习率的调整，常见的策略是<strong>学习率衰减 (Learning Rate Decay)</strong>，例如当损失不再下降时，按比例减小学习率 (Step Strategy)。</li></ol><h4 id="Learning-Rate-Decay">Learning Rate Decay</h4><p>初始学习率较大，随着迭代次数的增加，学习率逐渐减小。有相对应的衰减策略。<br><em>Exponential decay</em>:</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>η</mi><mi>t</mi></msub><mo>=</mo><msub><mi>η</mi><mn>0</mn></msub><mo>⋅</mo><msup><mi>e</mi><mrow><mo>−</mo><mi>α</mi><mi>t</mi></mrow></msup></mrow><annotation encoding="application/x-tex">\eta_t = \eta_0 \cdot e^{-\alpha t}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8436em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight" style="margin-right:0.0037em;">α</span><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p><em>Inverse decay</em>:</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>η</mi><mi>t</mi></msub><mo>=</mo><mfrac><msub><mi>η</mi><mn>0</mn></msub><mrow><mn>1</mn><mo>+</mo><mi>α</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\eta_t = \frac{\eta_0}{1+\alpha t}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.8769em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mord mathnormal">t</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><h4 id="Warm-Restarts">Warm Restarts</h4><p>使用的策略为：<em>Cosine Annealing</em>  与其让学习率一路单调下降，不如让它<strong>周期性地“回暖”一下</strong>。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>η</mi><mi>t</mi></msub><mo>=</mo><msubsup><mi>η</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mi>i</mi></msubsup><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">(</mo><msubsup><mi>η</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow><mi>i</mi></msubsup><mo>−</mo><msubsup><mi>η</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mi>i</mi></msubsup><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>cos</mi><mo>⁡</mo><mo stretchy="false">(</mo><mfrac><msub><mi>T</mi><mrow><mi>c</mi><mi>u</mi><mi>r</mi></mrow></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mi>π</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\eta_t = \eta_{min}^i + \frac{1}{2}(\eta_{max}^i - \eta_{min}^i)(1 + \cos(\frac{T_{cur}}{T_{i}}\pi))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1217em;vertical-align:-0.247em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8747em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8747em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1247em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8747em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.1963em;vertical-align:-0.836em;"></span><span class="mop">cos</span><span class="mopen">(</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mclose">))</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mrow><mi>c</mi><mi>u</mi><mi>r</mi></mrow></msub></mrow><annotation encoding="application/x-tex">T_{cur}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为当前的迭代次数，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">T_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为当前的周期数，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>η</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mi>i</mi></msubsup></mrow><annotation encoding="application/x-tex">\eta_{min}^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0833em;vertical-align:-0.2587em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-2.4413em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>η</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow><mi>i</mi></msubsup></mrow><annotation encoding="application/x-tex">\eta_{max}^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0717em;vertical-align:-0.247em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span>分别为第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>个周期的最小和最大学习率。在每个周期结束后，学习率被重置 (Warm Restart) 为一个较大的值。这种“重启”有助于优化过程跳出当前的局部极小值，去探索更优的解空间。</p><h4 id="Convergence-Rate">Convergence Rate</h4><p>假设函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span> 是凸函数、可微，且梯度满足 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>-Lipschitz 连续条件。对于梯度下降法，可以证明其收敛速率为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mn>1</mn><mi>T</mi></mfrac><munderover><mo>∑</mo><mrow><mi>t</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>T</mi><mo>−</mo><mn>1</mn></mrow></munderover><mi>J</mi><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo><mo>−</mo><mi>J</mi><mo stretchy="false">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo stretchy="false">)</mo><mo>≤</mo><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mfrac><mn>1</mn><msqrt><mi>T</mi></msqrt></mfrac><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\frac{1}{T} \sum_{t=0}^{T-1} J(\theta^t) - J(\theta^*) \leq \mathcal{O}(\frac{1}{\sqrt{T}})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2514em;vertical-align:-0.93em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.1833em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9267em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-2.8867em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1133em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span></span></span></span></span></p><p>这表明，为了使平均损失与最优损失的差距减小10倍，需要的迭代次数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 大约要增加100倍。这是一种次线性 (sub-linear) 的收敛速率，相对较慢。</p><ul><li>We assume that <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span> is convex, differentiable and Lipchitz by constant <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>. And domain of <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span> is bounded by radius <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>. With gradient descent update:</li></ul><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><mi mathvariant="normal">∇</mi><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\theta^{t+1}=\theta^t-\eta \nabla J\left(\theta^t\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8641em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9269em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span></span></span></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left right" columnspacing="0em 1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext> (Gap btw minimum value </mtext><mrow><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo fence="true">)</mo></mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">≤</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi mathvariant="normal">∇</mi><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext> (Convexity) </mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mi>η</mi></mfrac><msup><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo fence="true">)</mo></mrow><mi mathvariant="normal">T</mi></msup><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext> (Definition of GD) </mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>−</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo fence="true">)</mo></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext> (Properties of Norm) </mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>−</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo fence="true">)</mo></mrow><mo>+</mo><mfrac><mi>η</mi><mn>2</mn></mfrac><msup><mrow><mo fence="true">∥</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo fence="true">∥</mo></mrow><mn>2</mn></msup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext> (Definition of GD) </mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">≤</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>−</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo fence="true">)</mo></mrow><mo>+</mo><mfrac><mi>η</mi><mn>2</mn></mfrac><msup><mi>L</mi><mn>2</mn></msup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext> (Lipchitz Property) </mtext></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp;J\left(\theta^t\right)-J\left(\theta^*\right)  &amp; \text { (Gap btw minimum value } \left.J\left(\theta^*\right)\right) \\\leq &amp; \nabla J\left(\theta^t\right)\left(\theta^t-\theta^*\right) &amp; \text { (Convexity) } \\= &amp; \frac{1}{\eta}\left(\theta^t-\theta^{t+1}\right)^{\mathrm{T}}\left(\theta^t-\theta^*\right)  &amp; \text { (Definition of GD) } \\=&amp; \frac{1}{2 \eta}\left(\left\|\theta^t-\theta^*\right\|^2+\left\|\theta^{t+1}-\theta^t\right\|^2-\left\|\theta^{t+1}-\theta^*\right\|^2\right) &amp; \text { (Properties of Norm) } \\= &amp; \frac{1}{2 \eta}\left(\left\|\theta^t-\theta^*\right\|^2-\left\|\theta^{t+1}-\theta^*\right\|^2\right)+\frac{\eta}{2}\left\|\nabla J\left(\theta^t\right)\right\|^2 &amp; \text { (Definition of GD) } \\\leq &amp;\frac{1}{2 \eta}\left(\left\|\theta^t-\theta^*\right\|^2-\left\|\theta^{t+1}-\theta^*\right\|^2\right)+\frac{\eta}{2} L^2 &amp;  \text { (Lipchitz Property) }\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:13.0275em;vertical-align:-6.2638em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:6.7638em;"><span style="top:-9.2352em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-7.7252em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mrel">≤</span></span></span><span style="top:-5.7438em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-3.2419em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-0.74em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:1.7619em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mrel">≤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:6.2638em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:6.7638em;"><span style="top:-9.2352em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span><span style="top:-7.7252em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span><span style="top:-5.7438em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0953em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathrm mtight">T</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span><span style="top:-3.2419em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.054em;"><span style="top:-3.3029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span></span></span><span style="top:-0.74em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.054em;"><span style="top:-3.3029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.054em;"><span style="top:-3.3029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:1.7619em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.054em;"><span style="top:-3.3029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:6.2638em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:6.7638em;"><span style="top:-9.2352em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Gap btw minimum value </span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen nulldelimiter"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span><span style="top:-7.7252em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Convexity) </span></span></span></span><span style="top:-5.7438em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Definition of GD) </span></span></span></span><span style="top:-3.2419em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Properties of Norm) </span></span></span></span><span style="top:-0.74em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Definition of GD) </span></span></span></span><span style="top:1.7619em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord text"><span class="mord"> (Lipchitz Property) </span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:6.2638em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>From previous computation, we get the following inequality for every step <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> :</li></ul><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo>≤</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>−</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo fence="true">)</mo></mrow><mo>+</mo><mfrac><mi>η</mi><mn>2</mn></mfrac><msup><mi>L</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">J\left(\theta^t\right)-J\left(\theta^*\right) \leq \frac{1}{2 \eta}\left(\left\|\theta^t-\theta^*\right\|^2-\left\|\theta^{t+1}-\theta^*\right\|^2\right)+\frac{\eta}{2} L^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2019em;vertical-align:-0.8804em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.054em;"><span style="top:-3.3029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.7936em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>Recall <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>max</mi><mo>⁡</mo></mrow><mrow><mi>θ</mi><mo separator="true">,</mo><msup><mi>θ</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></msub><mrow><mo fence="true">(</mo><mrow><mo fence="true">∥</mo><mi>θ</mi><mo>−</mo><msup><mi>θ</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo fence="true">∥</mo></mrow><mo fence="true">)</mo></mrow><mo>≤</mo><mi>R</mi></mrow><annotation encoding="application/x-tex">\max _{\theta, \theta^{\prime}}\left(\left\|\theta-\theta^{\prime}\right\|\right) \leq R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.038em;vertical-align:-0.2861em;"></span><span class="mop"><span class="mop">max</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="mpunct mtight">,</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828em;"><span style="top:-2.786em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="minner"><span class="mopen delimcenter" style="top:0em;">∥</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">∥</span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>. Assume we update parameters for <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> steps. We add all equations for all <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>T</mi><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">t \in\{0,1, \ldots, T-1\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6542em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span> :</li></ul><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><munder><mo>∑</mo><mi>t</mi></munder><mrow><mo fence="true">(</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo fence="true">)</mo></mrow><mo>≤</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mn>0</mn></msup><mo>−</mo><msubsup><mi>θ</mi><mo>∗</mo><mo>∗</mo></msubsup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo>−</mo><msup><mrow><mo fence="true">∥</mo><msup><mi>θ</mi><mi>T</mi></msup><mo>−</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">∥</mo></mrow><mn>2</mn></msup><mo fence="true">)</mo></mrow><mo>+</mo><mfrac><mrow><mi>η</mi><msup><mi>L</mi><mn>2</mn></msup><mi>T</mi></mrow><mn>2</mn></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mi>T</mi></mfrac><munder><mo>∑</mo><mi>t</mi></munder><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo>≤</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mi>η</mi><mi>T</mi></mrow></mfrac><mrow><mo fence="true">(</mo><msup><mi>R</mi><mn>2</mn></msup><mo>+</mo><mn>0</mn><mo fence="true">)</mo></mrow><mo>+</mo><mfrac><mrow><mi>η</mi><msup><mi>L</mi><mn>2</mn></msup></mrow><mn>2</mn></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mfrac><mn>1</mn><mi>T</mi></mfrac><munder><mo>∑</mo><mi>t</mi></munder><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo>≤</mo><mfrac><msup><mi>R</mi><mn>2</mn></msup><mrow><mn>2</mn><mi>η</mi><mi>T</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi>η</mi><msup><mi>L</mi><mn>2</mn></msup></mrow><mn>2</mn></mfrac></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp; \sum_t\left(J\left(\theta^t\right)-J\left(\theta^*\right)\right) \leq \frac{1}{2 \eta}\left(\left\|\theta^0-\theta_*^*\right\|^2-\left\|\theta^T-\theta^*\right\|^2\right)+\frac{\eta L^2 T}{2} \\&amp; \frac{1}{T} \sum_t J\left(\theta^t\right)-J\left(\theta^*\right) \leq \frac{1}{2 \eta T}\left(R^2+0\right)+\frac{\eta L^2}{2} \\&amp; \frac{1}{T} \sum_t J\left(\theta^t\right)-J\left(\theta^*\right) \leq \frac{R^2}{2 \eta T}+\frac{\eta L^2}{2}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:9.1233em;vertical-align:-4.3117em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.8117em;"><span style="top:-6.8117em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"></span></span><span style="top:-3.7706em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"></span></span><span style="top:-0.7294em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.3117em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.8117em;"><span style="top:-6.8117em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-2.453em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0681em;"><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-2.85em;"><span class="pstrut" style="height:3.2em;"></span><span style="width:0.556em;height:1.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.556em" height="1.200em" viewBox="0 0 556 1200"><path d="M145 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v0 v585 h43zM367 15 v585 v0 v585 c2.667,10,9.667,15,21,15c10,0,16.667,-5,20,-15 v-585 v0 v-585 c-2.667,-10,-9.667,-15,-21,-15c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v0 v585 h43z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0953em;"><span style="top:-3.3442em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.7706em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-0.7294em;"><span class="pstrut" style="height:3.4911em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.3117em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li>let <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>η</mi><mo>=</mo><mfrac><mi>R</mi><mrow><mi>L</mi><msqrt><mi>T</mi></msqrt></mrow></mfrac></mrow><annotation encoding="application/x-tex">\eta = \frac{R}{L\sqrt{T}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.4103em;vertical-align:-0.538em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8723em;"><span style="top:-2.5374em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span><span class="mord sqrt mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9323em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mtight" style="padding-left:0.833em;"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span><span style="top:-2.8923em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1077em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.538em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>:</li></ul><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mn>1</mn><mi>T</mi></mfrac><munder><mo>∑</mo><mi>t</mi></munder><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo fence="true">)</mo></mrow><mo>−</mo><mi>J</mi><mrow><mo fence="true">(</mo><msup><mi>θ</mi><mo>∗</mo></msup><mo fence="true">)</mo></mrow><mo>≤</mo><mfrac><mi>L</mi><mi>R</mi></mfrac><msqrt><mi>T</mi></msqrt></mrow><annotation encoding="application/x-tex">\frac{1}{T} \sum_t J\left(\theta^t\right)-J\left(\theta^*\right) \leq \frac{L}{R} \sqrt{T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.5714em;vertical-align:-1.25em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7387em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0463em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9755em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span><span style="top:-2.9355em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0645em;"><span></span></span></span></span></span></span></span></span></span></p><h3 id="Second-Order-Optimization">Second-Order Optimization</h3><p>二阶优化算法同时利用一阶导数（梯度）和二阶导数（海森矩阵）的信息，能够感知到损失曲面的曲率，从而进行更高效的更新。</p><p>函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span>的二阶泰勒展开为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mi>H</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">J(\theta) = J(\theta_0) + \nabla J(\theta_0)^T(\theta - \theta_0) + \frac{1}{2}(\theta - \theta_0)^T H(\theta - \theta_0) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>能感知到“地形图”中的曲率。</p><p>对于海森矩阵可以进行特征值分解：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>H</mi><mo>=</mo><mi>Q</mi><mi mathvariant="normal">Λ</mi><msup><mi>Q</mi><mi>T</mi></msup><mspace width="1em"/><mtext>and</mtext><mspace width="1em"/><msup><mi>H</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>Q</mi><msup><mi mathvariant="normal">Λ</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><msup><mi>Q</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">H = Q \Lambda Q^T \quad \text{and} \quad H^{-1} = Q \Lambda^{-1} Q^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0858em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord">Λ</span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:1em;"></span><span class="mord text"><span class="mord">and</span></span><span class="mspace" style="margin-right:1em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0858em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord">Λ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span></span></p><p>特征值中较大和较小的特征值如果相差较大，称为病态矩阵；如果从最大到最小的变化较为平缓，则较为光滑。</p><p>其中 H 是海森矩阵，其包含了损失曲面的曲率信息。通过海森矩阵的特征值，我们可以判断一个临界点（梯度为0的点）的性质：</p><ul><li><strong>正定矩阵 (所有特征值为正)</strong>: 局部极小值。</li><li><strong>负定矩阵 (所有特征值为负)</strong>: 局部极大值。</li><li><strong>不定矩阵 (特征值有正有负)</strong>: 鞍点。</li></ul><p>事实上，使用的梯度方法为局部的方法，下降是相对较慢的。</p><h4 id="Newton’s-Method">Newton’s Method</h4><p>牛顿法的计算方法为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>J</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mi>H</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\hat{J}(\theta) = J(\theta_0) + \nabla J(\theta_0)^T(\theta - \theta_0) + \frac{1}{2}(\theta - \theta_0)^T H(\theta - \theta_0)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1968em;vertical-align:-0.25em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.0833em;"><span class="mord">^</span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>求导得到：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi mathvariant="normal">∇</mi><mi>θ</mi></msub><mover accent="true"><mi>J</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi mathvariant="normal">∇</mi><mi>θ</mi></msub><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi>H</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>−</mo><msub><mi>θ</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\nabla_{\theta} \hat{J}(\theta) = \nabla_{\theta} J(\theta_0) + H(\theta - \theta_0) = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1968em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">∇</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.0833em;"><span class="mord">^</span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">∇</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></span></p><p>求解得到：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><msup><mi>H</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><msub><mi mathvariant="normal">∇</mi><mrow><mi>t</mi><mi>h</mi><mi>e</mi><mi>t</mi><mi>a</mi></mrow></msub><mi>J</mi><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta^{t+1} = \theta^{t} - H^{-1} \nabla_{theta} J(\theta^{t})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8641em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9269em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord">∇</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>牛顿法的优点在于收敛速度快，但是缺点在于计算复杂度高，需要计算海森矩阵的逆矩阵。计算复杂度为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>d</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(d^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>为参数的个数。这在深度学习模型中（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 通常是百万甚至亿级别）是完全不可接受的。<strong>在深度学习时代基本上不再使用</strong>。</p><h4 id="Quasi-Newton-Method">Quasi-Newton Method</h4><p>对于海森矩阵的逆矩阵，我们可以使用拟牛顿法进行近似：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi>H</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow><mrow><mo>−</mo><mn>1</mn></mrow></msubsup><mo>=</mo><msubsup><mi>H</mi><mi>t</mi><mrow><mo>−</mo><mn>1</mn></mrow></msubsup><mo>+</mo><mfrac><mrow><msub><mi>y</mi><mi>t</mi></msub><msubsup><mi>y</mi><mi>t</mi><mi>T</mi></msubsup></mrow><mrow><msubsup><mi>y</mi><mi>t</mi><mi>T</mi></msubsup><msub><mi>s</mi><mi>t</mi></msub></mrow></mfrac><mo>−</mo><mfrac><mrow><msubsup><mi>H</mi><mi>t</mi><mrow><mo>−</mo><mn>1</mn></mrow></msubsup><msub><mi>s</mi><mi>t</mi></msub><msubsup><mi>s</mi><mi>t</mi><mi>T</mi></msubsup><msubsup><mi>H</mi><mi>t</mi><mrow><mo>−</mo><mn>1</mn></mrow></msubsup></mrow><mrow><msubsup><mi>s</mi><mi>t</mi><mi>T</mi></msubsup><msubsup><mi>H</mi><mi>t</mi><mrow><mo>−</mo><mn>1</mn></mrow></msubsup><msub><mi>s</mi><mi>t</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">H_{t+1}^{-1} = H_t^{-1} + \frac{y_t y_t^T}{y_t^T s_t} - \frac{H_t^{-1}s_t s_t^T H_t^{-1}}{s_t^T H_t^{-1}s_t}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1789em;vertical-align:-0.3148em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-2.4436em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3148em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1111em;vertical-align:-0.247em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-2.453em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.4772em;vertical-align:-0.9589em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2869em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8231em;"><span style="top:-2.4542em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.0448em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9589em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.5212em;vertical-align:-0.99em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5312em;"><span style="top:-2.2558em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8231em;"><span style="top:-2.4542em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.0448em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8542em;"><span style="top:-2.4542em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8542em;"><span style="top:-2.4542em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8542em;"><span style="top:-2.4542em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.99em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>t</mi></msub><mo>=</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>−</mo><msub><mi>θ</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">s_t = \theta_{t+1} - \theta_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mi>t</mi></msub><mo>=</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>−</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mi>t</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y_t = \nabla J(\theta_{t+1}) - \nabla J(\theta_t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。尽管比牛顿法高效，但存储近似矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">B_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 仍需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>d</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(d^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 的空间，对于大规模模型依然有挑战 (L-BFGS通过只存储最近的若干个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>t</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">s_t, y_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 向量对解决了此问题)。</p><h2 id="Optimization-in-Deep-Learning">Optimization in Deep Learning</h2><p>[[DL Note-2 MLP#Optimization in Practice]]</p><p>在深度学习这个复杂的“非凸山区”里，我们的目标不是找到那个虚无缥缈的“全局最低点”，而是找到一个<strong>足够好</strong>的局部最低点。一个好的“山谷”通常具备两个特点：</p><ol><li><strong>足够低</strong>：即模型的损失值足够小。</li><li><strong>足够宽阔平坦</strong>：像一个“盆地”而不是一个“深坑”。这样的模型泛化能力更强，因为它对测试数据的微小变化不那么敏感。</li></ol><p>下面是一些在实践中真正被广泛使用的优化策略。</p><h3 id="mini-batch">mini-batch</h3><p><strong>mini-batch SGD</strong>：在每一轮遍历<em>epoch</em>后，对数据进行随机的打乱<em>Shuffle</em>，然后分成若干个batch，对每一个batch进行参数的更新。这样可以减少计算的时间，同时可以减少过拟合的问题。</p><ul><li>mini-batch的大小对于训练的影响，一般而言较大的mini-batch会有更好的收敛性，但是计算复杂度更高。</li><li>由于不一样的小样本选择会引入一定的随机性，这样是有利于跳出局部极值的。</li><li>由于mini-batch的选择是有随机性的，不同的batch的难度不一样，所以这时候出现Loss的规律性的震荡是很正常的。</li><li>矩阵最大奇异值与最小奇异值的比值称为矩阵的条件数，条件数越大，矩阵越病态。对于病态矩阵，SGD的收敛速度会变慢。</li></ul><h3 id="SGD-Stochastic-Gradient-Descent-with-Momentum">SGD (Stochastic Gradient Descent) with Momentum</h3><p>标准SGD在穿越狭长、陡峭的沟壑时，梯度方向会来回震荡，导致收敛缓慢。Momentum 算法引入了“惯性”的概念，模拟物理世界中物体的运动。更新时不仅考虑当前梯度，还累积了历史梯度的方向。</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msup><mi>v</mi><mi>t</mi></msup></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>β</mi><msup><mi>v</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>β</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∇</mi><mi>J</mi><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><msup><mi>v</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned} v^t &amp;= \beta v^{t-1} + (1-\beta) \nabla J(\theta^t) \\ \theta^{t+1} &amp;= \theta^t - \eta v^t \end{aligned} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.0482em;vertical-align:-1.2741em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7741em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:-2.3859em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2741em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7741em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mclose">)</span><span class="mord">∇</span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-2.3859em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2741em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>v</mi><mi>t</mi></msup></mrow><annotation encoding="application/x-tex">v^t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7936em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7936em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span> 是速度向量，是梯度指数移动平均。</li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>β</mi></mrow><annotation encoding="application/x-tex">\beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span></span></span></span>是动量系数 (通常取0.9左右)，控制“惯性”的大小。</li></ul><p><strong>Nesterov Momentum:</strong></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mover accent="true"><mi>θ</mi><mo>~</mo></mover><mi>t</mi></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>β</mi><msup><mi mathvariant="normal">Δ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup><mo>=</mo><mi>β</mi><msup><mi mathvariant="normal">Δ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>β</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mover accent="true"><mi>θ</mi><mo>~</mo></mover><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp;\tilde{\theta}^{t} = \theta^{t} - \beta \Delta^{t-1} \\&amp;\Delta^{t} = \beta \Delta^{t-1} + (1-\beta)\nabla J^t (\tilde{\theta}^t)\\&amp;\theta^{t+1} = \theta^t - \eta \Delta^t\\\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.7067em;vertical-align:-2.1034em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6034em;"><span style="top:-4.6034em;"><span class="pstrut" style="height:2.9313em;"></span><span class="mord"></span></span><span style="top:-3.0121em;"><span class="pstrut" style="height:2.9313em;"></span><span class="mord"></span></span><span style="top:-1.4879em;"><span class="pstrut" style="height:2.9313em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1034em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6034em;"><span style="top:-4.6721em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9313em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span><span style="top:-3.6134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1667em;"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.0808em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span><span class="mclose">)</span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9313em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span><span style="top:-3.6134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1667em;"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-1.5566em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1034em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>在深度学习的实现中使用的一般是这种。走动量的方向可以减少震荡，同时可以加速收敛。当到达了比较好的局部极值时候又会在这个值的附近抖动。</p><ul><li>超参数：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>β</mi></mrow><annotation encoding="application/x-tex">\beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span></span></span></span>，一般而言<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>β</mi></mrow><annotation encoding="application/x-tex">\beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05278em;">β</span></span></span></span>取0.9是比较好的，越大的值越容易进行震荡。</li><li>学习率0.01、0.003、0.001一般按照指数变化。</li></ul><p>是在每次更新完<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>之后（进行试探之后才进行计算）才进行梯度的计算，可<strong>以避免一些<em>overshoot</em></strong>。核心的思想为多获取一些二次的信息。</p><h3 id="Adaptive-Learning-Rate">Adaptive Learning Rate</h3><p>直观理解为在不同的“地形”上需要使用的学习率（步长）是不一样的。对于不同的参数使用不同的学习率。<strong>Adagrad</strong>算法的核心思想为：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>r</mi><mi>t</mi></msup><mo>=</mo><msup><mi>r</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo><mo>⊙</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>h</mi><mi>t</mi></msup><mo>=</mo><mfrac><mn>1</mn><mrow><msqrt><msup><mi>r</mi><mi>t</mi></msup></msqrt><mo>+</mo><mi>δ</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup><mo>=</mo><msup><mi>h</mi><mi>t</mi></msup><mo>⊙</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp;r^t = r^{t-1} + \nabla J^t(\theta^t) \odot \nabla J^t(\theta^t)\\&amp;h^t = \frac{1}{\sqrt{r^t} + \delta} \\&amp;\Delta^t = h^t \odot \nabla J^t(\theta^t)\\&amp;\theta^{t+1} = \theta^t - \eta \Delta^t\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.1032em;vertical-align:-3.3016em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.8016em;"><span style="top:-6.2589em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-4.2775em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-2.2039em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-0.6798em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.3016em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.8016em;"><span style="top:-6.2589em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-4.2775em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.1652em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9448em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7196em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:-2.9048em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0952em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.2039em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-0.6798em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.3016em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p><em>上述公式中的第二行为逐元素操作</em><br>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊙</mo></mrow><annotation encoding="application/x-tex">\odot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊙</span></span></span></span>为对应元素相乘，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\delta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span></span></span></span>为一个很小的数，防止分母为0。这样可以保证在不同的地形上使用不同的学习率。<strong>本质上为探索&quot;地形图&quot;</strong>。但是Adagrad的问题在于随着迭代次数的增加，分母会变得越来越大，导致学习率会变得越来越小，最终会导致学习率为0，这样就不再更新了。</p><p><strong>RMSprop</strong>算法的核心思想为：对Adagrad的分母进行指数滑动平均：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>r</mi><mi>t</mi></msup><mo>=</mo><mi>ρ</mi><msup><mi>r</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ρ</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo><mo>⊙</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>h</mi><mi>t</mi></msup><mo>=</mo><mfrac><mn>1</mn><mrow><msqrt><msup><mi>r</mi><mi>t</mi></msup></msqrt><mo>+</mo><mi>δ</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup><mo>=</mo><msup><mi>h</mi><mi>t</mi></msup><mo>⊙</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp;r^t = \rho r^{t-1} + (1-\rho)\nabla J^t(\theta^t) \odot \nabla J^t(\theta^t)\\&amp;h^t = \frac{1}{\sqrt{r^t} + \delta} \\&amp;\Delta^t = h^t \odot \nabla J^t(\theta^t)\\&amp;\theta^{t+1} = \theta^t - \eta \Delta^t\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.1032em;vertical-align:-3.3016em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.8016em;"><span style="top:-6.2589em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-4.2775em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-2.2039em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-0.6798em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.3016em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.8016em;"><span style="top:-6.2589em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">ρ</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">ρ</span><span class="mclose">)</span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-4.2775em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.1652em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9448em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7196em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:-2.9048em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0952em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.2039em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-0.6798em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.3016em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p><strong>Adam</strong>算法的核心思想为：结合了SGD with Momentum和RMSprop：</p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>r</mi><mi>t</mi></msup><mo>=</mo><mi>ρ</mi><msup><mi>r</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ρ</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo><mo>⊙</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>h</mi><mi>t</mi></msup><mo>=</mo><mfrac><mn>1</mn><mrow><msqrt><msup><mi>r</mi><mi>t</mi></msup></msqrt><mo>+</mo><mi>δ</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>s</mi><mi>t</mi></msup><mo>=</mo><mi>ε</mi><msup><mi>s</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ϵ</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∇</mi><msup><mi>J</mi><mi>t</mi></msup><mo stretchy="false">(</mo><msup><mi>θ</mi><mi>t</mi></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup><mo>=</mo><msup><mi>h</mi><mi>t</mi></msup><mo>⊙</mo><msup><mi>s</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msup><mi>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><msup><mi>θ</mi><mi>t</mi></msup><mo>−</mo><mi>η</mi><msup><mi mathvariant="normal">Δ</mi><mi>t</mi></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp; r^t = \rho r^{t-1} + (1-\rho)\nabla J^t(\theta^t) \odot \nabla J^t(\theta^t)\\&amp; h^t = \frac{1}{\sqrt{r^t} + \delta} \\&amp; s^t = \varepsilon s^{t-1} + (1-\epsilon)\nabla J^t(\theta^t)\\&amp; \Delta^t = h^t \odot s^t \\&amp; \theta^{t+1} = \theta^t - \eta \Delta^t\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:8.6273em;vertical-align:-4.0637em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.5637em;"><span style="top:-7.021em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-5.0396em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-2.9454em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:-1.4419em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span><span style="top:0.0822em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.0637em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.5637em;"><span style="top:-7.021em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">ρ</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">ρ</span><span class="mclose">)</span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-5.0396em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.1652em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9448em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7196em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:-2.9048em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0952em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.9454em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">ε</span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">ϵ</span><span class="mclose">)</span><span class="mord">∇</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-1.4419em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:0.0822em;"><span class="pstrut" style="height:3.3214em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mord">Δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8436em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.0637em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>实际使用的参数为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi><mo>=</mo><mn>0.9</mn></mrow><annotation encoding="application/x-tex">\rho=0.9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">ρ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.9</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ε</mi><mo>=</mo><mn>0.9</mn></mrow><annotation encoding="application/x-tex">\varepsilon = 0.9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">ε</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.9</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi><mo>=</mo><mn>0.999</mn></mrow><annotation encoding="application/x-tex">\rho = 0.999</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">ρ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.999</span></span></span></span><br>对于学习率的下降，还是要使用对应的算法，对于实际使用的算法，还需要对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>进行无偏修正。</p><p>Nadam算法为Adam算法的变种，对于SGD with Momentum的更新进行了修正。</p><p>在选择优化器时，Adam 通常是一个稳健的默认选项。然而，精心调参的 SGD with Momentum 在某些任务上（如计算机视觉）仍然可能达到更好或更快的收敛效果。理解每种优化器的内在机制和优缺点，是进行高效模型训练的关键。</p><h3 id="Weight-Decay"><em>Weight Decay</em></h3><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>arg</mi><mo>⁡</mo><mi>min</mi><mo>⁡</mo><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi mathvariant="script">D</mi><mo separator="true">,</mo><mi mathvariant="script">θ</mi><mo stretchy="false">)</mo></mrow><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>+</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\arg \min \mathcal{O(D,\theta)}=  \sum_{i=1}^{N} L(y_i, f(x_i,\theta)) + \Omega(\theta)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">ar<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">min</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathcal" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.106em;vertical-align:-1.2777em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span></span></p><p>加入正则项，对于参数的更新进行限制，控制假设空间的大小，可以防止过拟合。但是在深度学习中并不够。</p><p>这里的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi></mrow><annotation encoding="application/x-tex">\lambda</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">λ</span></span></span></span> 就是<strong>权重衰减系数</strong>，一个由我们自己设定的超参数，用来控制“惩罚”的强度。</p><p><strong>请注意这个公式的核心变化</strong>：</p><p>在计算“损失的梯度”并更新权重<strong>之前</strong>，<code>旧权重</code>会先乘以一个<strong>小于1的系数 <code>(1 - 学习率 * λ)</code></strong>。</p><ul><li>这个步骤独立于数据本身，它只跟权重当前的大小有关。</li><li>每一次参数更新，权重都会因为这个乘法而“自动”缩小一点点。</li><li>这就是“<strong>衰减 (Decay)</strong>”这个词的由来。它像一种阻力，持续不断地将所有权重往零的方向拉。<br>一个权重只有在“损失的梯度”提供的更新量足够大，能够抵消掉这种衰减效应时，它才能维持在一个较大的值。这意味着，<strong>模型只允许那些对于减小损失确实有巨大贡献的特征，拥有较大的权重。</strong></li></ul><p><em>L1 regularization</em></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>λ</mi><munderover><mo>∑</mo><mrow><mi>l</mi><mo>=</mo><mn>1</mn></mrow><mi>L</mi></munderover><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>n</mi><mi>l</mi></msub></munderover><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>n</mi><mrow><mi>l</mi><mo>+</mo><mn>1</mn></mrow></msub></munderover><mi mathvariant="normal">∣</mi><msubsup><mi>θ</mi><mrow><mi>i</mi><mi>j</mi></mrow><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msubsup><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">\Omega(\theta) = \lambda \sum_{l=1}^{L} \sum_{i=1}^{n_l} \sum_{j=1}^{n_{l+1}} |\theta_{ij}^{(l)}|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2421em;vertical-align:-1.4138em;"></span><span class="mord mathnormal">λ</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8479em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3021em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6683em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3169em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7099em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3585em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2107em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.413em;"><span></span></span></span></span></span></span><span class="mord">∣</span></span></span></span></span></p><p><em>L2 regularization</em></p><p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>λ</mi><munderover><mo>∑</mo><mrow><mi>l</mi><mo>=</mo><mn>1</mn></mrow><mi>L</mi></munderover><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>n</mi><mi>l</mi></msub></munderover><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>n</mi><mrow><mi>l</mi><mo>+</mo><mn>1</mn></mrow></msub></munderover><mo stretchy="false">(</mo><msubsup><mi>θ</mi><mrow><mi>i</mi><mi>j</mi></mrow><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msubsup><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">\Omega(\theta) = \lambda \sum_{l=1}^{L} \sum_{i=1}^{n_l} \sum_{j=1}^{n_{l+1}} (\theta_{ij}^{(l)})^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2421em;vertical-align:-1.4138em;"></span><span class="mord mathnormal">λ</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8479em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3021em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6683em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3169em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7099em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3585em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2107em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.413em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></p>]]>
    </content>
    <id>https://yima-gu.github.io/2025/07/21/Deep%20Learning/DL%20Note-4%20Optimization/</id>
    <link href="https://yima-gu.github.io/2025/07/21/Deep%20Learning/DL%20Note-4%20Optimization/"/>
    <published>2025-07-21T06:30:00.000Z</published>
    <summary>Optimization</summary>
    <title>DL Note-4 Optimization</title>
    <updated>2026-07-01T11:38:22.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>Yima Gu</name>
    </author>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/categories/Deep-Learning/"/>
    <category term="Deep Learning" scheme="https://yima-gu.github.io/tags/Deep-Learning/"/>
    <category term="AI" scheme="https://yima-gu.github.io/tags/AI/"/>
    <category term="李宏毅机器学习" scheme="https://yima-gu.github.io/tags/%E6%9D%8E%E5%AE%8F%E6%AF%85%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <content>
      <![CDATA[<p><strong>AI Agent</strong>：人类<mark>只给AI目标</mark>，AI自己想办法完成某个研究问题。</p><p><img src="%7B281D8726-4976-4970-BCA0-4A9C9D175927%7D.png" alt=""></p><p>整个图示清晰地展现了强化学习的核心循环：智能体观察环境的<strong>状态</strong> (棋盘布局)，基于其策略和<strong>目标</strong> (赢棋) 来选择一个<strong>行动</strong> (下一步棋)，该行动改变了环境的<strong>状态</strong>，然后智能体又观察到新的状态，如此循环往复，直到游戏结束分出胜负。<br>通过这种方式，AI的目标（图中的“赢棋”）被转化成了一个数学问题：<strong>如何选择一系列的行动（下棋），来最大化未来能获得的累积奖励（最终得到那个+1）</strong>。</p><p>强化学习 (<em>RL</em>) 就是一个让智能体 (<em>Agent</em>) 在与环境 (<em>Environment</em>) 的互动中，通过“试错” (<em>Trial-and-Error</em>) 的方式来自主学习的过程。它的学习目标是找到一个最优策略 (<em>Policy</em>)，也就是一套决策方法，使得它从长远来看能够获得的累积奖励 (<em>Cumulative Reward</em>) 最多。</p><blockquote><p>但是上面的问题在于<strong>需要为每一个任务训练特定的模型</strong>，而且需要大量的计算资源。<mark>能不能使用一个模型来完成所有的任务？</mark></p></blockquote><p><img src="%7BFC397F83-D2DE-4C4E-9F05-5329C2558432%7D.png" alt=""></p><p>上面的过程就是LLM擅长的文字接龙功能。</p><h3 id="AI-Agent-LLM">AI Agent&amp; LLM</h3><p><strong>优势</strong>：能够理解和利用“丰富的、人类可读的”反馈信息，而不仅仅是“稀疏的、数字化的”奖励信号，从而极大地提升了学习和纠错的效率。<mark>在下面过程中都不涉及AI的训练过程</mark>。</p><h4 id="Computer-Use-Operator">Computer Use Operator</h4><p><strong>Mind2Web</strong>是一个从超过100个真实网站上收集的大规模、多样化的<strong>数据集</strong>。它的核心贡献是提供了高质量的训练材料，用于教导一个通用的AI智能体如何遵循指令，在任何网站上执行任务，而不仅仅是在简化的或模拟的网站上。<sup id="fnref:1" class="footnote-ref"><a href="#fn:1" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2306.06070] Mind2Web: Towards a Generalist Agent for the Web](https://arxiv.org/abs/2306.06070)">[1]</span></a></sup></p><p><strong>WebArena</strong>是一个充满挑战的<strong>基准测试（Benchmark）</strong>，其包含功能齐全的网站和复杂的任务，旨在公平地评估和比较不同的智能体。<sup id="fnref:2" class="footnote-ref"><a href="#fn:2" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2307.13854] WebArena: A Realistic Web Environment for Building Autonomous Agents](https://arxiv.org/abs/2307.13854)">[2]</span></a></sup></p><p>WebArena主要测试基于文本的能力。<strong>VisualWebArena</strong>是一个专门测试智能体<strong>多模态能力</strong>的高级基准测试。这个环境中的任务要求智能体不仅要阅读文本，还要<strong>理解视觉信息</strong>（如图片、图标和布局）才能成功。<sup id="fnref:3" class="footnote-ref"><a href="#fn:3" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2401.13649] VisualWebArena: Evaluating Multimodal Agents on Realistic Visual Web Tasks](https://arxiv.org/abs/2401.13649)">[3]</span></a></sup></p><h4 id="AI-Agent-for-Model-Training-Scientific-Research">AI Agent for Model Training &amp; Scientific Research</h4><p><strong>AIDE</strong>，是一个<strong>单一、自主的AI智能体</strong>，它的目标是接管人类工程师繁琐、耗时的“试错”工作。将整个机器学习开发过程视为一个<strong>代码优化问题</strong>，并运用<strong>树状搜索<em>Tree Search</em></strong>等策略，独立地在众多可能性中寻找最佳解决方案。<sup id="fnref:4" class="footnote-ref"><a href="#fn:4" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2502.13138] AIDE: AI-Driven Exploration in the Space of Code](https://arxiv.org/abs/2502.13138)">[4]</span></a></sup></p><p><strong>AutoKaggle</strong>：将复杂的任务分解，由一个<strong>多智能体系统<em>Multi-Agent System</em></strong>协作完成，团队里可能有负责数据清洗、特征工程、模型训练等不同角色的“专家”。最关键的是，它强调与<strong>人类用户的协作</strong>，允许人类在各个环节介入和指导。<sup id="fnref:5" class="footnote-ref"><a href="#fn:5" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[[2410.20424] AutoKaggle: A Multi-Agent Framework for Autonomous Data Science Competitions](https://arxiv.org/abs/2410.20424)">[5]</span></a></sup></p><p><strong>Google Coscientist</strong>：是一个<strong>多智能体系统<em>Multi-agent system</em></strong>，不同的“AI智能体”扮演不同角色（比如有的负责生成假设，有的负责验证，有的负责寻找证据），它们协同工作。能主动使用外部工具，例如调用<strong>谷歌搜索</strong>来查阅最新的网络信息。<sup id="fnref:6" class="footnote-ref"><a href="#fn:6" rel="footnote"><span class="hint--top hint--rounded" aria-label="[Accelerating scientific breakthroughs with an AI co-scientist](https://research.google/blog/accelerating-scientific-breakthroughs-with-an-ai-co-scientist/)">[6]</span></a></sup></p><h3 id="AI-Agent如何根据经验调整行为">AI Agent如何根据经验调整行为</h3><p><img src="%7B22EECDE5-9FA4-41A9-A3AA-02B15F268B9A%7D.png" alt=""></p><p>当AI行动时，现实世界会发生变化（上图中的<em>obs</em>），在AI下一次行动时会根据以前的经验来作出更好的决策。</p><h4 id="RAG">RAG</h4><p><strong>RAG</strong>（<em>Retrieval-Augmented Generation</em>）通过检索相关信息来增强生成模型的能力，使得生成的内容更加准确和有针对性。</p><ul><li><strong>检索 (<em>Retrieval</em>)</strong>: 当收到用户提问时，系统不会直接让大模型回答。而是先用提问的关键词，去一个外部的知识库（比如公司的内部文档、最新的网络新闻、或者像这张幻灯片里的“智能体记忆库”）中，搜索最相关的信息片段。</li><li><strong>增强 (<em>Augmented</em>)</strong>: 将上一步检索到的相关信息，连同用户原始的提问，一起“打包”成一个新的、内容更丰富的提示（Prompt）。</li><li><strong>生成 (<em>Generation</em>)</strong>: 将这个被增强后的提示（Prompt）发送给大模型，让它基于这些新鲜、准确的参考资料来生成最终的回答。<sup id="fnref:7" class="footnote-ref"><a href="#fn:7" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2312.10997] Retrieval-Augmented Generation for Large Language Models: A Survey](https://arxiv.org/abs/2312.10997)">[7]</span></a></sup></li></ul><h4 id="Streambench">Streambench</h4><p><strong>StreamBench</strong>是<strong>第一个专门为评估LLM智能体持续改进能力而设计的基准测试</strong>。它模拟了一个在线学习环境，让智能体不断接收新的任务和反馈流，从而可以衡量其性能是否能随着时间的推移而不断增强。</p><h4 id="Write-Reflection-Read">Write &amp; Reflection &amp; Read</h4><p><img src="%7BD54BA4B1-ACDF-404C-968F-018E57CD0D26%7D.png" alt=""></p><ul><li><strong>Write</strong>: 主要是<strong>数据存储</strong>，基本不用Prompt。但在<strong>执行<code>Write</code>操作之前</strong>，可以增加一个“<strong>重要性评估</strong>”的环节。这个环节的核心就是一个精心设计的Prompt。</li><li><strong>Reflection</strong>: 核心是<strong>Prompt工程</strong>，通过Prompt引导LLM从原始数据中提炼智慧。</li><li><strong>Read</strong>: 核心是<strong>RAG</strong>，通过“检索算法 + Prompt工程”的组合，利用历史智慧指导当前决策</li></ul><p><strong>GraphRAG</strong>：标准的<strong>RAG (检索增强生成)</strong> 方法擅长回答“具体问题”，因为它可以直接从知识库中检索到包含答案的一小部分文档。但是，当面对需要理解和总结<strong>整个文档集合</strong>的“全局性问题”时，标准RAG会失效，因为它不知道该检索哪一小块信息来回答这种开放式的问题。<sup id="fnref:8" class="footnote-ref"><a href="#fn:8" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2404.16130] From Local to Global: A Graph RAG Approach to Query-Focused Summarization](https://arxiv.org/abs/2404.16130)">[8]</span></a></sup></p><ul><li><strong>构建实体知识图谱</strong>: 首先，用一个大型语言模型（LLM）通读所有源文档，提取出关键的实体（如人物、地点、概念），并建立它们之间的关系，形成一个网络状的知识图谱。</li><li><strong>预生成社群摘要</strong>: 接着，在图谱中自动识别出那些关联非常紧密的“实体社群”（可以理解为主题簇），然后再次使用LLM为<strong>每一个社群</strong>都预先生成一份高质量的摘要</li></ul><p><strong>HippoRAG</strong>：传统RAG回答复杂问题时，往往需要反复提问、多次检索（这被称为迭代式检索），就像一个新手管理员跑好几趟书架。而HippoRAG凭借其图算法，<strong>一次检索</strong>就能理清复杂的关系链，性能因此<strong>提升高达20%</strong>。<sup id="fnref:9" class="footnote-ref"><a href="#fn:9" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2405.14831] HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models](https://arxiv.org/abs/2405.14831)">[9]</span></a></sup><br>将RAG的“检索”从一个简单的“文本相似度匹配”任务，升级为了一个更深刻的“知识关系图遍历”任务，通过模仿人脑高效的索引机制。</p><h3 id="AI如何使用工具">AI如何使用工具</h3><p><strong>Tool Use</strong>：AI Agent使用工具的能力是其核心特征之一。通过调用外部工具，AI可以扩展其能力，完成更复杂的任务。</p><p><img src="Pasted%20image%2020250720102659.png" alt=""></p><p><strong>语言模型本身并不“执行”工具，而是“生成”一段代表工具调用的文本</strong>。</p><p>它生成的这串<code>&lt;tool&gt;...&lt;/tool&gt;</code>文本，只是一个结构化的“意图表达”。需要一个<strong>外部的控制程序<em>Orchestrator</em></strong>来解析这个文本，并实际执行相应的工具调用。<strong>控制程序</strong>再去<strong>真正地调用</strong>一个天气API，并将参数传递过去。<br>天气API返回结果后，控制程序再将结果封装成<code>&lt;output&gt;...&lt;/output&gt;</code>格式，发回给语言模型，让它以自然语言的形式呈现给用户。</p><p><strong>Search Engine</strong>：AI Agent可以通过调用搜索引擎来获取最新的信息和数据。这种能力使得AI能够在动态变化的环境中保持更新。可以使用搜索到的内容运行RAG后输出。</p><p>除了上述使用的搜索引擎、API等工具使用方法外，AI也可以使用更大或者有专门功能的模型（math、code）来实现更复杂的任务。</p><h4 id="Tool-Selection">Tool Selection</h4><p><strong>Tool Selection</strong>是指AI Agent在多个可用工具中选择最适合当前任务的工具。这个过程通常涉及以下几个步骤：</p><p><strong>MetaTool基准</strong><sup id="fnref:10" class="footnote-ref"><a href="#fn:10" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2310.03128] MetaTool Benchmark for Large Language Models: Deciding Whether to Use Tools and Which to Use](https://arxiv.org/abs/2310.03128)">[10]</span></a></sup></p><ul><li><strong>核心构成</strong>：MetaTool包含一个名为 <code>ToolE</code> 的数据集，里面有各种各样能够触发LLM使用工具的用户查询（Prompt），覆盖了单工具和多工具使用的场景。</li><li><strong>评测任务</strong>：它专门评估LLM的两种核心能力：<ul><li><strong>工具使用意识</strong>：判断当前问题是否真的需要使用工具。</li><li><strong>工具选择</strong>：从众多工具中选出最合适的一个或多个。这个任务还被细分为四个更具挑战性的子任务，例如：从功能相似的工具中做选择、在特定场景下做选择、考虑工具的可靠性问题，以及选择多个工具进行组合。</li></ul></li></ul><p><strong>OctoTools</strong>引入了三个关键组件来协同工作：<sup id="fnref:11" class="footnote-ref"><a href="#fn:11" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2502.11271] OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning](https://arxiv.org/abs/2502.11271)">[11]</span></a></sup></p><ol><li><strong>标准化工具卡片 (<em>Standardized Tool Cards</em>)</strong>：这是一个核心创新。它用一种标准化的格式来封装和描述任何工具的功能，使得添加新工具就像插拔模块一样简单。</li><li><strong>规划器 (<em>Planner</em>)</strong>：负责进行任务规划。它既能做宏观的“高层规划”（将复杂任务拆解成小步骤），也能做微观的“低层规划”（为每个小步骤决定具体使用哪个工具）。</li><li><strong>执行器 <em>(Executor</em>)</strong>：负责实际执行由“规划器”定下的工具调用指令。</li></ol><p>更进一步的，AI还可以自己打造工具</p><p>TROVE的核心思想是让一个擅长编程的语言模型（Code LM）来扮演“工具开发者”的角色。它采用一个动态的、自我完善的流程来构建工具箱：<sup id="fnref:12" class="footnote-ref"><a href="#fn:12" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2401.12869] TroVE: Inducing Verifiable and Efficient Toolboxes for Solving Programmatic Tasks](https://arxiv.org/abs/2401.12869)">[12]</span></a></sup></p><ol><li><strong>在使用中生成 (Generate via Using)</strong>：在解决实际问题的过程中，AI会识别出那些频繁被组合使用的基础操作，并尝试将它们打包成一个更高级、可复用的新函数。</li><li><strong>成长 (Grow)</strong>：将新创建的、被证明有用的高级函数加入到“工具箱”中，供后续解决其他问题时直接调用。</li><li><strong>定期修剪 (Trim)</strong>：为了防止工具箱变得臃肿，系统会定期清理，移除那些不常用、冗余或效果不佳的函数，始终保持工具箱小而精悍。</li></ol><p>但是使用工具带来的问题是：Agent可能会因为<strong>过度相信工具而犯错</strong>。尤其是当外部知识用冲突，或者与LLM训练时获得的知识冲突时，Agent可能会错误地依赖工具的输出，而不是自己的判断。即使所有找到的资料都是正确的，不代表AI就不会犯错。</p><p><img src="%7BBBAE77B9-5B82-4103-88B0-BEB5D20B0FA6%7D.png" alt=""><br><em>研究什么样的外部知识比较容易说服AI</em></p><h3 id="AI能不能做计划">AI能不能做计划</h3><p>AI Agent的计划能力是其智能化的重要体现。通过制定计划，AI可以更有效地组织和执行任务。但是现实世界是一直<strong>变化的</strong>，AI是否有能力根据环境的变化来调整自己的计划呢？</p><p>在开发Benchmark时，有可能一些较为常见的计划任务已经被用于训练，导致模型的泛化能力不足。新的Benchmark会构建一个新的情境用于测试AI的计划能力。<sup id="fnref:13" class="footnote-ref"><a href="#fn:13" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2305.15771] On the Planning Abilities of Large Language Models : A Critical Investigation](https://arxiv.org/abs/2305.15771)">[13]</span></a></sup></p><p>对于优化Agent的计划能力，自然的想法是利用试探回溯的搜索方法实现：当智能体需要做决策时，它不再是只选择一个“最好”的下一步行动。相反，它会在真实的环境中<strong>探索多个不同的行动分支</strong>，构建一个“决策树”。它会评估这些不同路径的潜在价值，然后优先沿着最有希望成功的路径继续深入探索，从而实现多步规划。<sup id="fnref:14" class="footnote-ref"><a href="#fn:14" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2407.01476] Tree Search for Language Model Agents](https://arxiv.org/abs/2407.01476)">[14]</span></a></sup></p><p>但是显示世界中很多操作是<strong>无法回溯</strong>的，一种想法是构建<strong>世界模型</strong>来模拟现实世界的变化。通过这种方式，AI Agent可以在虚拟环境中进行试验和调整，然后再将这些经验应用到现实世界中。<sup id="fnref:15" class="footnote-ref"><a href="#fn:15" rel="footnote"><span class="hint--top hint--rounded" aria-label="[[2411.06559] Is Your LLM Secretly a World Model of the Internet? Model-Based Planning for Web Agents](https://arxiv.org/abs/2411.06559)">[15]</span></a></sup></p><section class="footnotes"><div class="footnote-list"><ol><li><span id="fn:1" class="footnote-text"><span><a href="https://arxiv.org/abs/2306.06070">[2306.06070] Mind2Web: Towards a Generalist Agent for the Web</a><a href="#fnref:1" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:2" class="footnote-text"><span><a href="https://arxiv.org/abs/2307.13854">[2307.13854] WebArena: A Realistic Web Environment for Building Autonomous Agents</a><a href="#fnref:2" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:3" class="footnote-text"><span><a href="https://arxiv.org/abs/2401.13649">[2401.13649] VisualWebArena: Evaluating Multimodal Agents on Realistic Visual Web Tasks</a><a href="#fnref:3" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:4" class="footnote-text"><span><a href="https://arxiv.org/abs/2502.13138">[2502.13138] AIDE: AI-Driven Exploration in the Space of Code</a><a href="#fnref:4" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:5" class="footnote-text"><span>[<a href="https://arxiv.org/abs/2410.20424">[2410.20424] AutoKaggle: A Multi-Agent Framework for Autonomous Data Science Competitions</a><a href="#fnref:5" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:6" class="footnote-text"><span><a href="https://research.google/blog/accelerating-scientific-breakthroughs-with-an-ai-co-scientist/">Accelerating scientific breakthroughs with an AI co-scientist</a><a href="#fnref:6" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:7" class="footnote-text"><span><a href="https://arxiv.org/abs/2312.10997">[2312.10997] Retrieval-Augmented Generation for Large Language Models: A Survey</a><a href="#fnref:7" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:8" class="footnote-text"><span><a href="https://arxiv.org/abs/2404.16130">[2404.16130] From Local to Global: A Graph RAG Approach to Query-Focused Summarization</a><a href="#fnref:8" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:9" class="footnote-text"><span><a href="https://arxiv.org/abs/2405.14831">[2405.14831] HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models</a><a href="#fnref:9" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:10" class="footnote-text"><span><a href="https://arxiv.org/abs/2310.03128">[2310.03128] MetaTool Benchmark for Large Language Models: Deciding Whether to Use Tools and Which to Use</a><a href="#fnref:10" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:11" class="footnote-text"><span><a href="https://arxiv.org/abs/2502.11271">[2502.11271] OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning</a><a href="#fnref:11" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:12" class="footnote-text"><span><a href="https://arxiv.org/abs/2401.12869">[2401.12869] TroVE: Inducing Verifiable and Efficient Toolboxes for Solving Programmatic Tasks</a><a href="#fnref:12" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:13" class="footnote-text"><span><a href="https://arxiv.org/abs/2305.15771">[2305.15771] On the Planning Abilities of Large Language Models : A Critical Investigation</a><a href="#fnref:13" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:14" class="footnote-text"><span><a href="https://arxiv.org/abs/2407.01476">[2407.01476] Tree Search for Language Model Agents</a><a href="#fnref:14" rev="footnote" class="footnote-backref"> ↩</a></span></span></li><li><span id="fn:15" class="footnote-text"><span><a href="https://arxiv.org/abs/2411.06559">[2411.06559] Is Your LLM Secretly a World Model of the Internet? Model-Based Planning for Web Agents</a><a href="#fnref:15" rev="footnote" class="footnote-backref"> ↩</a></span></span></li></ol></div></section>]]>
    </content>
    <id>https://yima-gu.github.io/2025/07/19/ML_Lee/AI%20Agent/</id>
    <link href="https://yima-gu.github.io/2025/07/19/ML_Lee/AI%20Agent/"/>
    <published>2025-07-19T16:00:00.000Z</published>
    <summary>AI Agent：人类只给AI目标，AI自己想办法完成某个研究问题。</summary>
    <title>AI Agent Notes</title>
    <updated>2026-07-01T11:38:22.789Z</updated>
  </entry>
</feed>
