feat: add superderive child and open phase-2 routing
Attach the stepwise derivation toolkit as a submodule and default SUPERPAPER_PHASE to 2 so rewrite-figure can use superderive. Notes still keep align for short expansions without cancel or subst.
This commit is contained in:
@@ -4,3 +4,7 @@
|
|||||||
[submodule "supertensor"]
|
[submodule "supertensor"]
|
||||||
path = supertensor
|
path = supertensor
|
||||||
url = ssh://git@ssh.gitea.mygoband.com:2222/carrydela/SuperTensor.git
|
url = ssh://git@ssh.gitea.mygoband.com:2222/carrydela/SuperTensor.git
|
||||||
|
|
||||||
|
[submodule "superderive"]
|
||||||
|
path = superderive
|
||||||
|
url = ssh://git@ssh.gitea.mygoband.com:2222/carrydela/SuperDerive.git
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ superpaper/ this repo (orchestration)
|
|||||||
├── SKILL.md document-layer skill
|
├── SKILL.md document-layer skill
|
||||||
├── superfig/ submodule — architecture / pipeline / flow
|
├── superfig/ submodule — architecture / pipeline / flow
|
||||||
├── supertensor/ submodule — tensor faces / axes / shards
|
├── supertensor/ submodule — tensor faces / axes / shards
|
||||||
└── superderive/ later — stepwise rewrite figures
|
└── superderive/ submodule — stepwise rewrite figures
|
||||||
```
|
```
|
||||||
|
|
||||||
| 子仓库 | 画什么 | 远程 |
|
| 子仓库 | 画什么 | 远程 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| [`superfig`](superfig/) | 节点、边、分组、机制框图 | `carrydela/SuperFig` |
|
| [`superfig`](superfig/) | 节点、边、分组、机制框图 | `carrydela/SuperFig` |
|
||||||
| [`supertensor`](supertensor/) | 形状对齐的张量公式图 | `carrydela/SuperTensor` |
|
| [`supertensor`](supertensor/) | 形状对齐的张量公式图 | `carrydela/SuperTensor` |
|
||||||
| `superderive` | 逐步代数改写图 | 尚未建 |
|
| [`superderive`](superderive/) | 逐步代数改写图 | `carrydela/SuperDerive` |
|
||||||
|
|
||||||
## Clone
|
## Clone
|
||||||
|
|
||||||
@@ -41,13 +41,14 @@ symlinks into this repo:
|
|||||||
skills/superpaper/ SuperPaper
|
skills/superpaper/ SuperPaper
|
||||||
skills/superfig -> superpaper/superfig
|
skills/superfig -> superpaper/superfig
|
||||||
skills/supertensor -> superpaper/supertensor
|
skills/supertensor -> superpaper/supertensor
|
||||||
|
skills/superderive -> superpaper/superderive
|
||||||
```
|
```
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
v1 notes scaffold is in this repo: ledger schema, router, lint, ingest,
|
v1 notes scaffold plus v2 `superderive` (phase default 2). Examples:
|
||||||
and three `--work` examples (`excerpt-toy`, `pipeline-delegate`,
|
`excerpt-toy` (`align`), `pipeline-delegate`, `tensor-delegate`,
|
||||||
`tensor-delegate`). `superderive` is still phase 2.
|
`derive-delegate`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
|
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ video.
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 架构 / 流水线 / 数据流 / 状态 / 依赖 / 谁吃谁 | `superfig` | `superfig/SKILL.md` |
|
| 架构 / 流水线 / 数据流 / 状态 / 依赖 / 谁吃谁 | `superfig` | `superfig/SKILL.md` |
|
||||||
| 轴、形状、转置、broadcast、gather、分片、收缩 | `supertensor` | `supertensor/SKILL.md` |
|
| 轴、形状、转置、broadcast、gather、分片、收缩 | `supertensor` | `supertensor/SKILL.md` |
|
||||||
| 必须被看见的逐步改写 | v1:笔记 `align`;v2:`superderive` | — |
|
| 必须被看见的逐步改写 | `superderive`(≤4 步且无 cancel/subst 仍用 `align`) | `superderive/SKILL.md` |
|
||||||
| 数值曲线 / 柱状 / 散点 | screenshot 或 matplotlib | 本家族不画 |
|
| 数值曲线 / 柱状 / 散点 | screenshot 或 matplotlib | 本家族不画 |
|
||||||
| 表 / 照片 / 装置 / UI | screenshot | — |
|
| 表 / 照片 / 装置 / UI | screenshot | — |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
schema: superpaper.ledger/v1
|
||||||
|
retired_ids: []
|
||||||
|
paper:
|
||||||
|
id: derive-delegate
|
||||||
|
title: Scaled attention
|
||||||
|
authors: ["Fixture"]
|
||||||
|
notes_language: zh
|
||||||
|
source: {kind: excerpt}
|
||||||
|
coverage:
|
||||||
|
mode: excerpt
|
||||||
|
questions:
|
||||||
|
- {id: Q1, text: "缩放从哪来?", source: "excerpt"}
|
||||||
|
claims:
|
||||||
|
- id: C1
|
||||||
|
text: "1/√d_k 是改写,不是新算子"
|
||||||
|
kind: theoretical
|
||||||
|
status: core
|
||||||
|
supports: [Q1]
|
||||||
|
definitions: []
|
||||||
|
assumptions: []
|
||||||
|
lemmas: []
|
||||||
|
symbols:
|
||||||
|
- {name: Q, latex: "Q", meaning: "query", kind: value}
|
||||||
|
- {name: K, latex: "K", meaning: "key", kind: value}
|
||||||
|
- {name: dk, latex: "d_k", meaning: "key 维", kind: "shape parameter"}
|
||||||
|
derivations:
|
||||||
|
- id: DER1
|
||||||
|
claim: C1
|
||||||
|
title: "缩放"
|
||||||
|
expand: true
|
||||||
|
figure: F3
|
||||||
|
steps:
|
||||||
|
- {id: S1, from: "QK^{\\top}", to: "QK^{\\top}/\\sqrt{d_k}", rule: scale}
|
||||||
|
figures:
|
||||||
|
- id: F3
|
||||||
|
claim: C1
|
||||||
|
title: "缩放来自方差"
|
||||||
|
grammar: derivation
|
||||||
|
toolkit: superderive
|
||||||
|
signals: [rewrite-figure]
|
||||||
|
request: figures/F3/F3.request.md
|
||||||
|
include: figures/F3/build/F3.pdf
|
||||||
|
status: included
|
||||||
|
evidence: []
|
||||||
|
terms: []
|
||||||
|
source_assets: []
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$QK^\top \to QK^\top/\sqrt{d_k}$。缩放压方差,避免 softmax 饱和。
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Figure request F3
|
||||||
|
toolkit: superderive
|
||||||
|
language: cjk
|
||||||
|
claim: 1/√d_k 是改写,不是新算子
|
||||||
|
grammar: derivation
|
||||||
|
work_rel_dir: figures/F3
|
||||||
|
|
||||||
|
## Flow
|
||||||
|
stage: {name: D1, text: "缩放来自方差,不是装饰"}
|
||||||
|
row: {name: R1}
|
||||||
|
in_row:
|
||||||
|
- {macro: sdstep, name: s1, role: rewrite,
|
||||||
|
lhs: "QK^{\\top}", rhs: "QK^{\\top}/\\sqrt{d_k}"}
|
||||||
|
- {macro: sdreason, name: s1, text: "§3.2.1,避免 softmax 饱和"}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
% Golden example -- a scale rewrite that must be seen, not just aligned.
|
||||||
|
% ../scripts/build.sh rewrite-cancel.tex
|
||||||
|
\documentclass[border=10pt]{standalone}
|
||||||
|
\usepackage[cjk]{superderive}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\sdstage{D1}{缩放来自方差,不是装饰}
|
||||||
|
\sdrow{R1}
|
||||||
|
\sdstep[role=rewrite]{s1}{QK^{\top}}{QK^{\top}/\sqrt{d_k}}
|
||||||
|
\sdreason{s1}{§3.2.1,避免 softmax 饱和}
|
||||||
|
\sdrowend
|
||||||
|
\sdbbox{all}
|
||||||
|
\sdtopformula{F}{$\mathrm{Attention}(Q,K,V)=\mathrm{softmax}(QK^{\top}/\sqrt{d_k})V$}
|
||||||
|
\sdmeaningbox{mb}{120mm}{all}
|
||||||
|
{点积方差随 $d_k$ 线性涨}
|
||||||
|
{缩放是改写,不是新算子}
|
||||||
|
{没有缩放,softmax 进饱和区,梯度消失}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 238 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
\documentclass[a4paper]{article}
|
||||||
|
\input{notes-macros}
|
||||||
|
\renewcommand{\notetitle}{缩放来自方差}
|
||||||
|
\renewcommand{\notepaper}{Scaled attention}
|
||||||
|
\begin{document}
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
\input{sections/sec-01.tex}
|
||||||
|
\input{sections/sec-02.tex}
|
||||||
|
\input{sections/sec-03.tex}
|
||||||
|
\appendix
|
||||||
|
\section{符号表}
|
||||||
|
\input{sections/symbols.tex}
|
||||||
|
\end{document}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
\section{这篇论文在问什么}
|
||||||
|
注意力里的 $1/\sqrt{d_k}$ 是装饰,还是一次必须看见的改写?
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
\section{主张与贡献}
|
||||||
|
\splabel{C1}
|
||||||
|
点积方差随 $d_k$ 涨。除掉 $\sqrt{d_k}$ 是改写,不是新算子。
|
||||||
|
|
||||||
|
\spfig{F3}{缩放来自方差。}{fixture;toolkit: \texttt{superderive};ledger id: F3。}
|
||||||
|
|
||||||
|
\subsection{本章小结}
|
||||||
|
这一步必须被看见,所以走 superderive,而不是笔记里的 \texttt{align}。
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
\section{总结与延伸}
|
||||||
|
四步以内、没有消项或代入要画出来时,仍然用 \texttt{align}。
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Outline: Scaled attention
|
||||||
|
|
||||||
|
## Lecture map
|
||||||
|
|
||||||
|
| file | lecture_title | paper_sections | ledger_ids |
|
||||||
|
|---|---|---|---|
|
||||||
|
| sec-01.tex | 这篇论文在问什么 | 1 | Q1 |
|
||||||
|
| sec-02.tex | 主张与贡献 | 1 | C1, F3 |
|
||||||
|
| sec-03.tex | 总结与延伸 | 1 | C1 |
|
||||||
|
| sec-app-a.tex | 符号表 | — | |
|
||||||
|
|
||||||
|
## Locked
|
||||||
|
- 首节标题必须是「这篇论文在问什么」
|
||||||
|
- 末节(appendix 前)必须是「总结与延伸」
|
||||||
@@ -4,6 +4,8 @@ Sibling figure agents see only `notes/figures/F*/F*.request.md` plus that siblin
|
|||||||
|
|
||||||
- superfig: `\sfnode` keys `role, level, gap, bracket, at=`. `\sfconn` has no endpoints. `at` must be TikZ calc with `($…$)`.
|
- superfig: `\sfnode` keys `role, level, gap, bracket, at=`. `\sfconn` has no endpoints. `at` must be TikZ calc with `($…$)`.
|
||||||
- supertensor: every `ststack` / `stface` / `stglyph` has `coord: ""`.
|
- supertensor: every `ststack` / `stface` / `stglyph` has `coord: ""`.
|
||||||
|
- superderive: `\sdstep` / `\sdreason` / `\sdcancel` / `\sdsubst`; one `\sdcol` max.
|
||||||
|
|
||||||
- `allow-raw-tikz` must also appear as `% superfig-lint: allow-raw-tikz` in the `.tex`.
|
- `allow-raw-tikz` must also appear as `% superfig-lint: allow-raw-tikz` in the `.tex`.
|
||||||
- Build: `superfig/scripts/build.sh F1.tex F1/build` (second arg is the outdir).
|
- Build: `superfig/scripts/build.sh F1.tex F1/build` (second arg is the outdir).
|
||||||
- Screenshots: `scripts/screenshot.sh --work <work> --id F2` (`pdftoppm -r 200`, then optional `crop_bbox`).
|
- Screenshots: `scripts/screenshot.sh --work <work> --id F2` (`pdftoppm -r 200`, then optional `crop_bbox`).
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Authority: `scripts/router.py`. `suggest()` returns a **class**, not a toolkit.
|
|||||||
| `raster` | table, photo, apparatus, ui | screenshot |
|
| `raster` | table, photo, apparatus, ui | screenshot |
|
||||||
| `tensor` | axis, shape, transpose, broadcast, gather, shard, contraction, face | supertensor |
|
| `tensor` | axis, shape, transpose, broadcast, gather, shard, contraction, face | supertensor |
|
||||||
| `fig` | architecture, pipeline, data-flow, state, time, dependency, what-eats-what, argument-map | superfig |
|
| `fig` | architecture, pipeline, data-flow, state, time, dependency, what-eats-what, argument-map | superfig |
|
||||||
| `derive` | rewrite-figure, cancel-visual, subst-visual | v1: align |
|
| `derive` | rewrite-figure, cancel-visual, subst-visual | align, superderive (phase ≥ 2) |
|
||||||
| `none` | otherwise | none |
|
| `none` | otherwise | none |
|
||||||
|
|
||||||
Mixed classes on one row → `SP011`. Split with the next integer ids. Default: do not draw.
|
Mixed classes on one row → `SP011`. Split with the next integer ids. Default: do not draw.
|
||||||
|
|||||||
+1
-1
@@ -171,7 +171,7 @@ def lint(
|
|||||||
if code:
|
if code:
|
||||||
errors.append(f"{code} {fid}")
|
errors.append(f"{code} {fid}")
|
||||||
if toolkit == "superderive" and phase < 2:
|
if toolkit == "superderive" and phase < 2:
|
||||||
errors.append(f"SP022 {fid} toolkit superderive is v2; use align")
|
errors.append(f"SP022 {fid} toolkit superderive is off; set SUPERPAPER_PHASE=2 or use align")
|
||||||
if toolkit in SIBLING and status != "dropped" and disk:
|
if toolkit in SIBLING and status != "dropped" and disk:
|
||||||
req = fig.get("request")
|
req = fig.get("request")
|
||||||
req_path = (work / "notes" / req) if (work and req) else None
|
req_path = (work / "notes" / req) if (work and req) else None
|
||||||
|
|||||||
+2
-2
@@ -93,8 +93,8 @@ def check_row(
|
|||||||
|
|
||||||
def phase_from_env() -> int:
|
def phase_from_env() -> int:
|
||||||
import os
|
import os
|
||||||
raw = os.environ.get("SUPERPAPER_PHASE", "1")
|
raw = os.environ.get("SUPERPAPER_PHASE", "2")
|
||||||
try:
|
try:
|
||||||
return int(raw)
|
return int(raw)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return 1
|
return 2
|
||||||
|
|||||||
+2
-2
@@ -42,7 +42,6 @@ for spec in \
|
|||||||
"align-has-include.yaml:SP014" \
|
"align-has-include.yaml:SP014" \
|
||||||
"included-null-include.yaml:SP015" \
|
"included-null-include.yaml:SP015" \
|
||||||
"screenshot-bad-include.yaml:SP016" \
|
"screenshot-bad-include.yaml:SP016" \
|
||||||
"superderive-v1.yaml:SP022" \
|
|
||||||
"retired-reuse.yaml:SP023" \
|
"retired-reuse.yaml:SP023" \
|
||||||
"dangling-claim.yaml:SP024"
|
"dangling-claim.yaml:SP024"
|
||||||
do
|
do
|
||||||
@@ -73,7 +72,8 @@ for dir in \
|
|||||||
"$ROOT/tests/notes-smoke" \
|
"$ROOT/tests/notes-smoke" \
|
||||||
"$ROOT/examples/excerpt-toy" \
|
"$ROOT/examples/excerpt-toy" \
|
||||||
"$ROOT/examples/pipeline-delegate" \
|
"$ROOT/examples/pipeline-delegate" \
|
||||||
"$ROOT/examples/tensor-delegate"
|
"$ROOT/examples/tensor-delegate" \
|
||||||
|
"$ROOT/examples/derive-delegate"
|
||||||
do
|
do
|
||||||
name="$(basename "$dir")"
|
name="$(basename "$dir")"
|
||||||
if "$ROOT/scripts/build.sh" --work "$dir" >/dev/null 2>&1; then
|
if "$ROOT/scripts/build.sh" --work "$dir" >/dev/null 2>&1; then
|
||||||
|
|||||||
Submodule
+1
Submodule superderive added at 9f635d358b
@@ -22,6 +22,7 @@ expect(
|
|||||||
)
|
)
|
||||||
expect(check_row({"rewrite-figure"}, "align", phase=1) is None, "align ok")
|
expect(check_row({"rewrite-figure"}, "align", phase=1) is None, "align ok")
|
||||||
expect(check_row({"rewrite-figure"}, "superderive", phase=1) == "SP010", "derive v1")
|
expect(check_row({"rewrite-figure"}, "superderive", phase=1) == "SP010", "derive v1")
|
||||||
|
expect(check_row({"rewrite-figure"}, "superderive", phase=2) is None, "derive v2")
|
||||||
expect(suggest(set()) == "none", "empty")
|
expect(suggest(set()) == "none", "empty")
|
||||||
expect(suggest({"notation"}) == "none", "notation")
|
expect(suggest({"notation"}) == "none", "notation")
|
||||||
expect(check_row(set(), "none", status="included") == "SP013", "none included")
|
expect(check_row(set(), "none", status="included") == "SP013", "none included")
|
||||||
|
|||||||
Reference in New Issue
Block a user