{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "lecture_migration": {
   "project_id": "c0b185e7-d7e3-48b6-a605-8f1acdfe243c",
   "notebook_id": "bc9e14b3e30641e496d8ebd352a630cb",
   "destination": "L2",
   "cloud_run": false
  },
  "title": "CLS 07 · 设备、自动设计与动态计算"
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "0d3bf2c9217a4ce68e6ec290f1bab348",
     "type": "text-cell-h1",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-1"
   },
   "source": "CLS 07 · 设备、自动设计与动态计算",
   "id": "0d3bf2c9217a4ce68e6ec290f1bab348"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "79880e96139b4a91bed365992563a4bd",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-2"
   },
   "source": [
    "[返回第二讲 · 成本、选网与动态执行](https://codingai-lec02.pages.dev/#/frontier-end-to-end-latency/0) · [网页阅读版](https://codingai-lec02.pages.dev/course/c08.html) · [第二讲导读](https://codingai-lec02.pages.dev/course/guide.html) · [问卷作业 ↗](https://tally.so/r/VLroVv)（右键在新标签页打开，保留当前材料）\n",
    "\n",
    "这本讲义从**计算账本为什么不等于设备等待**，走到**谁在什么时候选择计算**。不需要一次读完；顺着课堂正在讨论的问题选一条即可。\n",
    "\n",
    "| 课堂问题 | 阅读位置 | 可以接着做什么 |\n",
    "|---|---|---|\n",
    "| 少算是否更快 | 第 1–4 节 | LAB10：比较两种 shape 的 MAC 与计时排序 |\n",
    "| 设备怎样影响选网 | 第 5–8 节 | 区分成本目标、搜索空间、部署前选择 |\n",
    "| 本次输入能否少算 | 第 9–10 节 | LAB11：把动态阈值与固定浅出口一起比较 |\n",
    "| 路径、状态和参数谁变了 | 第 11–12 节 | 对着 MoE／Loop／TTT 图逐项指出变化对象 |\n",
    "\n",
    "[第二讲 LAB10 · 成本目标与结构选择](https://codingai-lec02.pages.dev/course/lab12.html)与[第二讲 LAB11 · 何时继续计算](https://codingai-lec02.pages.dev/course/lab13.html)都可先读保存结果，再决定是否在自己的副本运行。Source／Norm／Tent 留在可靠性参考中，与原始视觉 TTT 的辅助任务不同。"
   ],
   "id": "79880e96139b4a91bed365992563a4bd"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "a9d98224eb804978b1b5d021f56fc260",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-3"
   },
   "source": "## 1. 卷积究竟同时完成哪两件事？",
   "id": "a9d98224eb804978b1b5d021f56fc260"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "aa8e81abd9c64d8590a999a8c5366c09",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-4"
   },
   "source": "普通卷积用每个输入通道的空间邻域共同产生每个输出通道。若核为 $k\\times k$、输入通道 $M$、输出通道 $N$，忽略 bias，每个输出位置需要 $k^2MN$ 次乘加。MobileNet 的 depthwise 先在每个输入通道内做空间过滤，再用 $1\\times1$ pointwise 在通道间混合；账目成为 $k^2M+MN$。[MobileNet，2017](https://arxiv.org/abs/1704.04861)。\n\n取 $k=3,M=32,N=64$，普通卷积为 18,432 MAC，分解后是 $288+2,048=2,336$ MAC，约相差 7.89 倍。若输出有 $H_oW_o$ 个位置，再共同乘上该位置数。各自的参数数目恰等于各自每输出位置的 MAC 数；两种结构的参数数目并不相同，激活大小也不能从参数量推出。\n\n![空间过滤与通道混合：精确成本算例](https://codingai-lec02.pages.dev/frontier/diagrams/frontier-depthwise-convolution-cost.svg)\n\n分解限制了可表达的核形式，因此不是任意普通卷积的无损等价变形。7.89 是算术工作之比，绝不是已经测得的手机加速倍数。返回 [卷积分解](https://codingai-lec02.pages.dev/#/frontier-depthwise-convolution-cost/0)。",
   "id": "aa8e81abd9c64d8590a999a8c5366c09"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "cebb1a21c9e2496291b16b4117a8f21d",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-5"
   },
   "source": "## 2. 为什么先扩展，又线性压回去？",
   "id": "cebb1a21c9e2496291b16b4117a8f21d"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "3603195d0d614ded8a254679f5a50be6",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-6"
   },
   "source": "MobileNetV2 的 inverted residual 先把较窄输入扩到更宽的中间通道，在其中做 depthwise 处理，再线性投影回窄空间。低维瓶颈里的非线性可能丢掉信息：例如标量 −1 与 −2 经 ReLU 都变成 0，无法从输出恢复差异。这是数学直觉，不是对真实高维数据流形的完整证明。[MobileNetV2](https://arxiv.org/abs/1801.04381)。\n\n“线性瓶颈”不意味着整个块没有非线性，而是窄输出投影后不再加同样的截断。shortcut 也只在步幅、通道等形状条件允许时使用。复用 LAB03 的 $1\\times1$ 和残差模块时，应保持这些接口明确，不能仅凭图上画一条跳线就默认可相加。",
   "id": "3603195d0d614ded8a254679f5a50be6"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "f1121678593746fe9c422aa2f6e98b83",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-7"
   },
   "source": "## 3. 少算乘法，为什么仍可能更慢？",
   "id": "f1121678593746fe9c422aa2f6e98b83"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "a78fab79d91742c18ac6494ddcf5d486",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-8"
   },
   "source": [
    "![两支来源A与B各四个通道，拼接A1到A4、B1到B4；转置两行四列后读出A1、B1、A2、B2、A3、B3、A4、B4，颜色与编号随通道保持。](https://codingai-lec02.pages.dev/course/visuals/deepnote-final/shuffle-channel-identities.png)\n",
    "\n",
    "[查看矢量图](https://codingai-lec02.pages.dev/course/visuals/deepnote-final/shuffle-channel-identities.svg)\n",
    "\n",
    "**先追踪 A2。** 拼接后它在第 2 槽，重排后在第 3 槽；编号与来源不变，改变的是位置。再写出下一次等分前四槽和后四槽各能接触哪些来源。\n",
    "\n",
    "这张图解释 channel shuffle 的排列，不使用分类结果：两行分别对应支路 A、B，将 2×4 排列转置为 4×2，再按行读出。下面的吞吐表研究另一个问题——通道比例与执行效率；它不是直接测量这次排列带来多少提速。\n",
    "\n",
    "FLOPs 或乘加次数（multiply–accumulate count）统计算术工作，设备还要读取权重、搬运激活、调度算子与同步。分支很多的网络可能把运算切碎；小算子可能无法填满硬件；逐元素算子虽然 MAC 很少，仍需读写大量数据。ShuffleNetV2 将这些因素带回网络设计。[ShuffleNetV2原文](https://arxiv.org/abs/1807.11164)。\n",
    "\n",
    "下表保留 arXiv:1807.11164v1（2018-07-30）Sec.2、Table 1 的 GPU ×1 列：GTX 1080 Ti、cuDNN 7.0，输入空间为 $56\\times56$，十个重复双 $1\\times1$ 卷积块。指标为 batches/s，属于论文报告的算子微基准。Table 1 没有单独重述 batch size，因此不把 Figure 1 的 batch=8 无条件补成该表元数据；也不换算单图延迟。它与主讲采用的 ARM 列是不同设备的结果，分别读表。[Table 1 版本入口](https://arxiv.org/html/1807.11164v1)。\n",
    "\n",
    "| 输入∶输出通道比例 | 通道数 | 吞吐（batches/s） |\n",
    "|---|---|---:|\n",
    "| 1∶1 | 128→128 | 1480 |\n",
    "| 1∶2 | 90→180 | 1296 |\n",
    "| 1∶6 | 52→312 | 876 |\n",
    "| 1∶12 | 36→432 | 748 |\n",
    "\n",
    "这些近似匹配算术量的配置仍有速度差异，足以反驳“只看 FLOPs 就能确定实际速度”。它没有告诉我们在当前硬件上同样会快多少。\n",
    "\n",
    "**同一张原表，不同设备列。** 主讲选用 Table 1 的 ARM ×1 列：Snapdragon 810、单线程、Neon 实现，四个通道比例对应 **76.2、72.9、69.1、57.6 images/s**；本节上表保留 GPU ×1 列的 **batches/s**。两组数字的单位、设备和通道规模不同，不直接横比，也不把它们改称延迟。\n",
    "\n",
    "**术语核对：MAC 的两种词义。** ShuffleNetV2 原文的 MAC 是 **memory access cost（内存访问成本）**；本课 LAB11 的 conv/linear MAC 是 **multiply–accumulate count（卷积／线性的乘加次数）**。前者描述访存，后者记算术账，不能互换。[原文 Sec.2 与 Table 1](https://arxiv.org/pdf/1807.11164)。"
   ],
   "id": "a78fab79d91742c18ac6494ddcf5d486"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "85c0801231834f0d88e1f82193a3e8a9",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-9"
   },
   "source": "## 4. 实际计时到底量了什么？",
   "id": "85c0801231834f0d88e1f82193a3e8a9"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "94446dea201940ed9b6224f8cecf94e5",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-10"
   },
   "source": [
    "![端侧视觉使用情境：摄像机、端侧设备与显示屏构成视觉交互；概念插画，不是测量记录。](https://codingai-lec02.pages.dev/course/visuals/v26/edge-vision-context.png)\n",
    "\n",
    "情境插画用于辨认摄像、计算与显示设备；下面的区间图不含测量值，长度也不代表耗时比例。\n",
    "\n",
    "![端侧视觉流程：摄像、预处理、模型执行、显示；模型计时与用户等待用不同起止边界标明。](https://codingai-lec02.pages.dev/course/visuals/v26/edge-timing-intervals.png)\n",
    "\n",
    "**先看什么。** 把模型计时的两个端点圈出来，再指出用户从哪里开始等、到哪里才得到可见结果。\n",
    "\n",
    "**改变一个条件。** 若只把模型执行部分缩短，而采集、排队和显示不变，整段等待会同比缩短吗？先用区间解释，不猜具体毫秒数。\n",
    "\n",
    "[查看清晰矢量图](https://codingai-lec02.pages.dev/course/visuals/v26/edge-timing-intervals.svg)\n",
    "\n",
    "计时前写明输入 shape、batch、dtype、线程、设备、后端、warmup 次数、重复次数及同步方式。异步设备若不等待操作完成，计到的可能是提交任务时间。报告 median 与 p95 时保留重复记录，不仅写一个最小值。参数、MAC、峰值激活、延迟、能耗分别回答不同问题；没有能耗仪或可信计量就不画 J/image。\n",
    "\n",
    "还要分开预处理、模型推理与端到端响应。用户等待包含采集、排队、传输、预处理、推理和显示，任何一段都可能成为瓶颈。本讲 LAB 10 使用实际可用设备测量并记录环境；即便在 CPU 上顺利运行，也不能改名为移动端实测。延迟分布用于比较当前条件，不是模型永久属性。"
   ],
   "id": "94446dea201940ed9b6224f8cecf94e5"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "887514b0b8b243689b62697d54bd7614",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-11"
   },
   "source": "## 5. MobileNetV4：在指定设备上选择卷积块",
   "id": "887514b0b8b243689b62697d54bd7614"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "6361023da9e840f5ba4dbe9c0ac7d83a",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-12"
   },
   "source": "MobileNetV4 的 Universal Inverted Bottleneck（UIB）把可选的空间 depthwise 操作放在通道扩展之前或扩展之后，再用 pointwise 投影回输出通道；搜索空间据此表达多种卷积块。它沿用本课空间混合与通道混合的语言。哪些组合值得用，仍取决于设备、算子实现和训练条件。[MobileNetV4，ECCV 2024](https://arxiv.org/html/2404.10518v2)。\n\n论文在指定硬件上分别报告模块与整网成本。本课未重测其设备结果。百分比必须先交代分母：某个新增模块的延迟减少比例，不等于整网或用户响应同样减少。原稿涉及 MHSA/MQA 的具体比较与数值保留在 [完整历史记录](https://codingai-lec02.pages.dev/course/archive/c08.html)，完整 Attention 机制暂存 [第五讲材料](https://codingai-lec02.pages.dev/course/reference.html#lecture05)。\n\n设备约束给出成本目标后，还要确定可选网络的规模范围；这一步定义搜索能选择什么。",
   "id": "6361023da9e840f5ba4dbe9c0ac7d83a"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "c4d464b07c9e4082b5409d15eccf8121",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": "v17-c08-scaling-title"
    },
    "html_anchor": "cell-13"
   },
   "source": "## 6. 深、宽、分辨率：先明确可用的规模旋钮",
   "id": "c4d464b07c9e4082b5409d15eccf8121"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "fe8bd04ba0954412ad19fe951edf7a17",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": "v17-c08-scaling-body"
    },
    "html_anchor": "cell-14"
   },
   "source": "加深网络会增加串行层数；加宽会增加通道混合与激活；提高输入分辨率会扩大空间计算。三者对计算、内存和表示能力的影响不同，不能用参数量一项替代全部成本。\n\nEfficientNet 的 compound scaling 在给定放大预算时协调深度、宽度和输入分辨率；搜索 baseline 与随后放大规模是不同步骤。[EfficientNet，ICML 2019](https://proceedings.mlr.press/v97/tan19a.html)。论文经验告诉我们应比较协同扩展，而不是只把某个轴不断拉长；它不保证每台设备具有相同最优比例。\n\n到这里，结构候选与设备目标都已明确。下一问是怎样训练、评价并选择候选：搜索算法处在这套人为定义的协议之内。",
   "id": "fe8bd04ba0954412ad19fe951edf7a17"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "f3592f1e64964d95a8079c0ce1d08084",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-15"
   },
   "source": "## 7. NAS 自动选择之前，人已经选择了什么？",
   "id": "f3592f1e64964d95a8079c0ce1d08084"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "04bfd6a3d12e49f7acd54cc43f2e619f",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-16"
   },
   "source": "一层循环给定结构 $m$ 训练参数；外层提出结构，再依据验证表现与设备成本选择下个候选。MnasNet 的软目标同时评价准确率 $ACC(m)$ 与目标设备实测延迟 $LAT(m)$：\n\n$$R(m)=ACC(m)\\left[\\frac{LAT(m)}{T}\\right]^{w},\\qquad w=\\begin{cases}\\alpha,&LAT(m)\\leq T,\\\\ \\beta,&LAT(m)>T.\\end{cases}$$\n\n$T$ 是目标延迟，$\\alpha,\\beta$ 是人为设定的折衷强度。原文主要实验取 $\\alpha=\\beta=-0.07$：超出 $T$ 的候选仍有连续的 reward，不会被自动剔除。其经验依据是延迟翻倍时，约 5% 的**相对**准确率增益可相抵；令 $1.05\\times2^\\beta=1$ 得 $\\beta=-\\log(1.05)/\\log2\\approx-0.0704$。这是作者选择折衷权重的经验规则，不是所有设备与任务的定律。\n\n在一段固定 $w$ 的区间内，$d\\log R=d\\log ACC+w\\,d\\log LAT$，说明目标比较相对变化。把它直接改成“只有 $LAT\\leq T$ 才合格”会变成另一个硬约束协议。[MnasNet，Sec.3、式2–3](https://arxiv.org/html/1807.11626v3)。\n\n搜索空间、训练代理、验证划分、设备目标、搜索预算仍由研究者定义。随机搜索是有意义的基线：在相同候选空间与试验次数下，复杂策略是否真的找到更好的配置？ProxylessNAS 追问代理任务与目标执行条件的错位，MobileNetV3 体现自动搜索与人工调整可以协作；都不意味着目标一写出，人就退出研究。[ProxylessNAS](https://arxiv.org/abs/1812.00332)、[MobileNetV3](https://arxiv.org/abs/1905.02244)。返回 [搜索中的两层循环](https://codingai-lec02.pages.dev/#/frontier-nas-inner-outer-loops/0)。",
   "id": "04bfd6a3d12e49f7acd54cc43f2e619f"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "e335140efb8e4d36b04676a19455d825",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-17"
   },
   "source": "## 8. OFA：部署前选网，当前输入仍执行固定子网",
   "id": "e335140efb8e4d36b04676a19455d825"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "56b8c616e7204ae48bf64e654b383122",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-18"
   },
   "source": [
    "OFA 训练可裁出不同深度、宽度、核与分辨率子网的共享权重网络，再按部署条件选择配置。[Once-for-All，ICLR 2020](https://arxiv.org/abs/1908.09791)。\n",
    "\n",
    "如果为手机选好子网后每张图都用它，这仍是部署阶段选型。共享权重下候选排序能否代表独立训练结果，也是需要检查的假设。不能看到“子网”就把 OFA 称为逐样本早退。返回 [部署选网](https://codingai-lec02.pages.dev/#/frontier-once-for-all-deployment/0)。\n",
    "\n",
    "部署前已经确定的一套网络仍把所有输入送到相同深度。下一节保持任务不变，只问本次输入能否提前给出足够可靠的答案：决策时点从部署前移到了本次前向执行中。\n",
    "\n",
    "![OFA按设备和预算在部署前选择共享权重子网；早退按当前输入的出口分数决定停止或继续。](https://codingai-lec02.pages.dev/course/visuals/v26/ofa-versus-early-exit.png)\n",
    "\n",
    "**先看什么。** 对照两行的决策时点：上行先选网络再接收输入，下行在本次前向过程中判断出口。\n",
    "\n",
    "**改变一个条件。** 先只换设备，再只换输入。分别指出图中哪一个选择可能改变、哪一项保持固定。\n",
    "\n",
    "[查看清晰矢量图](https://codingai-lec02.pages.dev/course/visuals/v26/ofa-versus-early-exit.svg)"
   ],
   "id": "56b8c616e7204ae48bf64e654b383122"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "8f7baa6546c94af398fb381f27ca2520",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-19"
   },
   "source": "## 9. 逐输入早退需要谁来承担错停风险？",
   "id": "8f7baa6546c94af398fb381f27ca2520"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "51fc8ab3afa24fbeb50953a201eb33a8",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-20"
   },
   "source": [
    "多出口网络让中间表示也接分类头，再按规则决定停止或继续。例如用浅出口最大类别概率与阈值比较；阈值由验证集确定，在线判断不读取类别答案。[MSDNet](https://arxiv.org/abs/1703.09844) 是多出口研究的一个例子，本课的保存实验则使用下面这台独立 digits 模型。\n",
    "\n",
    "### 先让最简单的基线参加比较\n",
    "\n",
    "| 固定的 digits 测试集：360 张 | 正确数／准确率 | 每图平均 conv/linear MAC |\n",
    "|---|---:|---:|\n",
    "| 直接全深度 | 350 / 360 · 97.22% | 20032 |\n",
    "| 固定浅出口 | 345 / 360 · 95.83% | 2944 |\n",
    "| 验证选择的动态阈值 τ=0.50 | 345 / 360 · 95.83% | 3091.73 |\n",
    "\n",
    "**先看后两行。** 动态规则在准确率相同的情况下多算了什么？请先用 LAB11 的三条路径账本解释，再谈是否值得换一种停止分数。\n",
    "\n",
    "这次 357/360 张图早退，14 张被错停，其中 6 张若继续深出口会答对。验证选择使用“相对全深最多下降 1 个百分点”，测试却下降 1.39 个百分点；选择条件没有变成测试保证。负结果限定于这个模型、规则和成本口径，不能推成动态计算普遍无用。\n",
    "\n",
    "实验先算出两只出口，再离线选择，因此只支持准确率与乘加账本的比较，没有真实跳过尾部的延迟证据。实际加速还需实现跳过、计入出口头、门控及调度。anytime 的“随时中断时交付当前预测”与 budgeted batch 的“分配整批预算”是不同协议，需分别说明。\n",
    "\n",
    "[LAB11：阈值、错停与完整保存结果](https://codingai-lec02.pages.dev/course/lab13.html) · [返回主讲：简单基线的比较](https://codingai-lec02.pages.dev/#/frontier-adaptive-early-exits/4)"
   ],
   "id": "51fc8ab3afa24fbeb50953a201eb33a8"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "2b10f9af852b4dff9d4ac13b41fc1d64",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-21"
   },
   "source": "## 10. 计算省下之后，还要检查哪一层？",
   "id": "2b10f9af852b4dff9d4ac13b41fc1d64"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "1a2f6f9ca3ba4ac38450c9bfd8914f9d",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-22"
   },
   "source": "一个精确但完全构造的调度例：三张图固定执行各 10 ms，总计 30 ms；按需执行为 4、8、10 ms，总工作 22 ms；再计门控与分组重排共 9 ms，总计 31 ms。它证明“少做算术”不逻辑蕴含“更短响应”，不报告任何真实硬件。真正执行还要检查并行、等待和尾延迟，不能把这个串行加法模型当完整调度器。\n\n2021 年的动态网络综述归纳按实例、空间及时间改变计算的研究；这是综述公开时间，不是动态网络概念出生年份。本课只展开与图像识别相关的实例与空间部分。条件化参数可能随输入改变，却不必在测试时执行梯度更新。[动态网络综述](https://arxiv.org/abs/2102.04906)。\n\n从这些成本检查出发，下面继续区分三种动作：调用哪些参数路径、同一参数执行几轮、是否根据当前输入更新参数。它们分别提出新的额外成本与验证条件。\n\n### 教师示范：把早退写成可失败的研究判断\n\n下面是一份**设计示例，不是新完成的实验**。它承接既有早退结果，但是否成立要靠新实现和新测量决定。\n\n| 研究计划 | 具体写法 |\n|---|---|\n| 真正关心的问题 | 在固定设备、输入尺寸、batch、运行环境和数据划分下，逐输入早退能否在允许的精度损失内缩短实际等待？ |\n| 待检验判断 | 只有浅出口可靠地处理一部分输入，且省下的后续计算超过出口头、门控与调度开销时，早退才可能更快。事先约定精度约束，并明确主要看平均延迟还是尾延迟；不能看完结果再换指标。 |\n| 最小对照 | 固定同一模型、设备和输入，比较全深度、固定浅出口与动态早退。阈值只在验证集选择；实现中必须真的跳过后续计算，不能先算全部出口再离线挑答案。 |\n| 必须观察 | 同时报告精度、退出比例、平均与尾延迟，并记录浅头、门控、batch重组和调度成本。区分理论MAC减少、真实跳过计算与端到端延迟变化。 |\n| 什么会使方案不成立 | 超过事先约定的精度损失；事先约定的主要延迟指标未改善，或约定的尾延迟约束被破坏；动态方案不优于固定浅出口；或者成本记录发现只是离线选答案而没有跳过计算。出现这些结果就修正判断，不把指标换成更有利的一项。 |\n| 第一个里程碑 | 先在固定小批输入上跑通三个对照，检查执行轨迹确实跳过了尾部，得到同一测量范围的精度、退出比例和延迟表，再决定是否扩大实验。 |\n\n[教师示例与空白研究卡](https://codingai-lec02.pages.dev/course/research-card.html) · [返回主讲：教师的早退研究示例](https://codingai-lec02.pages.dev/#/frontier-student-research-card/0)。",
   "id": "1a2f6f9ca3ba4ac38450c9bfd8914f9d"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "e766a386115d4620ae12dcdac4ecb39a",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-23"
   },
   "source": "## 11. 选支路与重复同一块，改变的不是同一个对象",
   "id": "e766a386115d4620ae12dcdac4ecb39a"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "71cea716b61644faaf54987e50121645",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-24"
   },
   "source": [
    "### MoE：路径身份由当前输入决定\n",
    "\n",
    "![MoE推理示意：router选择E1与E3，数据只进入被选专家，随后按权重合并同形输出；实线是前向数据，虚线是选择信号。](https://codingai-lec02.pages.dev/course/visuals/v26/moe-select-experts.png)\n",
    "\n",
    "**先看什么。** 先按虚线找到本次选中的编号，再沿实线数清实际调用的专家；专家的输出维度必须允许加权相加。\n",
    "\n",
    "**改变一个条件。** 把选中集合从 {1,3} 换成 {2,4}，仍令 k=2。路径身份变了吗？专家调用数是否必然减少？\n",
    "\n",
    "[查看清晰矢量图](https://codingai-lec02.pages.dev/course/visuals/v26/moe-select-experts.svg)\n",
    "\n",
    "早退选择停止深度；稀疏专家层选择调用哪些专家。同一维度的表示被 router 打分后，仅送往少数专家，各专家返回同形结果，最后加权合并。未选专家可以不执行。课堂的四专家 top-2 图是精确构造，用于核对“选中→调用→合并”；它不是训练得到的语义专家证据。[稀疏 MoE §2](https://arxiv.org/html/1701.06538v1)\n",
    "\n",
    "在这样的固定 top-2 图中，输入 A 和 B 可以调用不同专家，却仍然各调用两个。所谓动态先表现在路径身份上，不能立刻推成每个输入拥有不同 MAC。V-MoE 将路由落在视觉 patch 的表示上；其归一化与 top-k 次序还与本课堂构造不同。关于 patch、容量和路由损失的细节留后续材料，不作为理解这张通用图的前置。[V-MoE §2](https://arxiv.org/html/2106.05974v1)\n",
    "\n",
    "[返回主讲：稀疏专家](https://codingai-lec02.pages.dev/#/architecture-sparse-experts/0)"
   ],
   "id": "71cea716b61644faaf54987e50121645"
  },
  {
   "cell_type": "markdown",
   "id": "d7126dcc07a946c29e93b167fa585534",
   "metadata": {
    "html_anchor": "block-d7126dcc07a946c29e93b167fa585534",
    "deepnote": {
     "block_id": "d7126dcc07a946c29e93b167fa585534",
     "type": "markdown"
    }
   },
   "source": [
    "### MoE 的解释层：router 梯度与负载平衡\n",
    "\n",
    "**router 的分数从哪里学来？**它也有参数。先看本课无噪声的 top-2 构造：对输入表示 $x$，router 产生分数 $s=xW_g$；选中集合 $S$ 中的两个分数再做 softmax，得到连续合并权重。若专家参数记为 $\\theta_i$，则\n",
    "\n",
    "$\\alpha_i=\\frac{\\exp s_i}{\\sum_{j\\in S}\\exp s_j}\\;(i\\in S),\\qquad z=\\sum_{i\\in S}\\alpha_iE_i(x;\\theta_i).$\n",
    "\n",
    "训练时把 $z$ 接分类头，与类别标签计算任务损失 $\\mathcal L$。损失能沿两条路径反馈：经专家输出到被调用专家的 $\\theta_i$；经连续权重 $\\alpha_i$ 到 router 的 $W_g$。这里只在选中集合暂时不变的局部区域求导，并不对“选中了哪个编号”假装做连续求导。令 $q=\\partial\\mathcal L/\\partial z$，按链式法则可得\n",
    "\n",
    "$\\frac{\\partial\\mathcal L}{\\partial s_j}=\\alpha_j\\,q^\\top(E_j-z),\\qquad j\\in S.$\n",
    "\n",
    "这是课堂机制的局部推导：当两个专家给出的结果影响损失不同时，合并权重提供调整打分的方向；它不保证每一步梯度都非零。该样本未调用的专家不从这条任务路径得到直接反馈。分数跨过 top-2 边界时，专家身份可能跳变。若只保留一个分数再做 softmax，所选权重恒为 1，这条局部梯度就消失；这只说明本处归一化方式的边界，不能据此说所有 top-1 方法都无法训练。原文 §2.1 对 $k>1$ 的门控梯度作了说明，训练门控还加入可学习尺度的噪声；本课简图没有复现该噪声机制。[稀疏 MoE §2.1](https://arxiv.org/html/1701.06538v1#S2.SS1)\n",
    "\n",
    "**任务损失之外，还要检查谁一直没有被用到。** 输入若集中到少数专家，会使训练机会和设备负载失衡。原文区分两种量：importance 是一个 batch 内各专家合并权重的总和；load 关心各专家收到的样本数。权重总和接近不代表派发数量接近，因此它分别加入 importance 与 load 的平衡项；离散计数无法直接提供普通梯度，load 项使用噪声门控下的平滑概率估计。这是该论文的训练办法，不能概括为所有 MoE 的统一配方。推理时使用学到的固定参数为当前输入选支路，并不现场重新训练 router。[稀疏 MoE §4 与附录 A](https://arxiv.org/html/1701.06538v1#S4)\n",
    "\n",
    "[返回主讲：MoE 训练反馈](https://codingai-lec02.pages.dev/#/architecture-sparse-experts/3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b304bdb72d146769e3371ddc4e667a0",
   "metadata": {
    "html_anchor": "block-9b304bdb72d146769e3371ddc4e667a0",
    "deepnote": {
     "block_id": "9b304bdb72d146769e3371ddc4e667a0",
     "type": "markdown"
    }
   },
   "source": [
    "### Loop：共享参数，重复更新状态\n",
    "\n",
    "![Loop展开图：同一组theta重复执行三次，依次将h0变为h1、h2和h3，参数相同而状态不同。](https://codingai-lec02.pages.dev/course/visuals/v26/loop-shared-parameters.png)\n",
    "\n",
    "**先看什么。** 在三个 Bθ 框上确认 θ 是同一份，再沿 h₀→h₁→h₂→h₃ 数执行次数。\n",
    "\n",
    "**改变一个条件。** 把固定三轮改为固定五轮，参数份数和执行次数各怎样变化？若希望按输入停止，还缺哪项规则？\n",
    "\n",
    "[查看清晰矢量图](https://codingai-lec02.pages.dev/course/visuals/v26/loop-shared-parameters.svg)\n",
    "\n",
    "另一种选择是不换参数，重复调用同一块：`h1=Bθ(h0)`、`h2=Bθ(h1)`、`h3=Bθ(h2)`。θ 是同一份，h 是三次前向产生的不同状态。把这三个框折成一个循环箭头，不会使三次运算消失。若固定循环三次，每个输入仍是三次；自适应停止需要额外规则。Huginn 是近期共享深度的语言模型例子，借用它的架构思想不等于获得视觉分类实测结论。[Huginn 架构 §3](https://arxiv.org/html/2502.05171v1)\n",
    "\n",
    "因此，设计对照时可以先用简单问题拆分解释：固定相同展开次数，比较共享与非共享参数；固定同一组共享参数，再改变执行轮数。二者不是同一次单变量比较，更不能把性能差异全部归因于“多思考了一会儿”。\n",
    "\n",
    "[返回主讲：共享参数重复计算](https://codingai-lec02.pages.dev/#/architecture-shared-loop/0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "6b8e3a7574fa4d869184901c2b66cbdb",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-25"
   },
   "source": "## 12. 现场学习还需要一个反馈闭环",
   "id": "6b8e3a7574fa4d869184901c2b66cbdb"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "3665783bafb748b38ea92533a6b006d5",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-26"
   },
   "source": [
    "![视觉TTT先在训练期建立共享提取器与类别、旋转两只头；测试时类别未知，使用已知旋转目标更新选定提取器参数，再对原图分类。](https://codingai-lec02.pages.dev/course/visuals/v26/visual-ttt-update.png)\n",
    "\n",
    "**先看什么。** 先看上方的训练期准备，再沿下方虚线找到测试时真正被更新的 θ；两只头保持固定。\n",
    "\n",
    "**改变一个条件。** 若省去训练期的辅助任务准备，只给任意分类器临时加一个旋转头，图中哪条已建立的关系不再成立？\n",
    "\n",
    "[查看清晰矢量图](https://codingai-lec02.pages.dev/course/visuals/v26/visual-ttt-update.svg)\n",
    "\n",
    "重复前向不必更新权重。原始视觉 TTT 则在训练期准备一个 Y 形模型：共享提取器接类别头和旋转辅助头；类别标签训练主任务，已知的旋转操作训练辅助任务。测试时类别答案不可见，但施加的旋转角度可知，于是标准协议只根据旋转损失更新共享提取器，固定两只头，再对原图分类。[原始 TTT §2](https://proceedings.mlr.press/v119/sun20b/sun20b.pdf)\n",
    "\n",
    "这与“拿任意分类器临时装上一个旋转头”有本质差别：共享表示和辅助任务的关系在训练时已经建立。主讲采用单样本重置协议，避免暗中继承上张图的更新。评价还要同时计算更新成本、随后分类前向，以及类别是否改善。辅助损失下降只能证明代理目标改善；若目标线索与类别没有帮助，冻结源模型就可能是更合理的选择。\n",
    "\n",
    "现在可以回收全讲的变化对象：早退改执行深度，MoE 改被调用参数的路径，Loop 改状态和重复次数，原始视觉 TTT 改选定参数。前三者的通用推理图不需要参数梯度更新；TTT 的图包含反向传播。它们可以组合，但组合之后更需要知道哪个环节解释了结果。\n",
    "\n",
    "[返回主讲：视觉 TTT](https://codingai-lec02.pages.dev/#/architecture-visual-ttt/0)"
   ],
   "id": "3665783bafb748b38ea92533a6b006d5"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "6c546018940e4a029aaa6c035762df70",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-27"
   },
   "source": [
    "## 研究选读：相似名称，可能在更新不同对象"
   ],
   "id": "6c546018940e4a029aaa6c035762df70"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "7ca1d6e9a1a447f28741b9db6146c8ad",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-28"
   },
   "source": [
    "TTT layers（2024）在序列层内部用小模型权重充当 hidden state，用学习步骤更新这份状态；它与上述分类适应不是同一问题设置。[TTT layers §2.1](https://arxiv.org/html/2407.04620v1) In-Place TTT（2026）进一步研究 fast weights 放在哪里、目标怎样服务下一词预测。[In-Place TTT](https://arxiv.org/html/2604.06169v1) DeepLoop（2026）检查共享参数被反复访问时的训练稳定性和缩放。[DeepLoop v2](https://arxiv.org/html/2607.13491v2) 这些工作只说明设计问题仍在推进，不为本课程的构造图提供未经运行的性能保证。\n",
    "\n",
    "**用四句话收束本册。** 固定一个识别任务，写出：我允许改变的对象是____；与____基线比较；期待改善____指标；若出现____结果，就撤回或修改判断。\n",
    "\n",
    "可以先用本册已有图回答：MoE 的选中专家、Loop 的中间状态和 TTT 的选定参数，哪一个需要在测试时求参数梯度？请以图中的连线与更新位置为依据。"
   ],
   "id": "7ca1d6e9a1a447f28741b9db6146c8ad"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "bcf9d93e37ee4ed08fc1e1a977bc4ac4",
     "type": "text-cell-h2",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-29"
   },
   "source": "## 选读去向：第五讲的图像 token 路径",
   "id": "bcf9d93e37ee4ed08fc1e1a977bc4ac4"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deepnote": {
     "block_id": "97e6af75e4f240eaa202108b1b7dcdb3",
     "type": "markdown",
     "source_block_id": null,
     "logical_key": null
    },
    "html_anchor": "cell-30"
   },
   "source": "DynamicViT 与 MoNE 的完整 token 机制、原论文数值与条件保存在 [第五讲暂存 / 动态研究参考](https://codingai-lec02.pages.dev/course/reference.html#lecture05)。它们不作为第二讲主线的 Attention 前置。\n\n关键边界仍保留：给定固定保留比例时，动态的可能是哪些 token，而非每张图的 token 数；论文吞吐、单请求延迟和精确教学构造不能互相替代。[v16 完整归档](https://codingai-lec02.pages.dev/course/archive/c08.html)。",
   "id": "97e6af75e4f240eaa202108b1b7dcdb3"
  }
 ]
}