Skip to content

Commit f590ddb

Browse files
committed
refactor(noise-ops-demo): 面板参数独立并改手动采样,文档补 RMSNorm 原理
1 parent 107e7b2 commit f590ddb

7 files changed

Lines changed: 373 additions & 240 deletions

File tree

web-tools/noise-ops-demo/README.md

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
两个面板:
77

8-
1. **按元素运算**:同一批样本对 x、y 逐元素做 x、x+y、c·x、x∘y、x² 五种运算
9-
五条精确理论密度同图对比,选中项叠加蒙特卡洛直方图。直观看:
10-
加/数乘保持正态;按元素乘变成尖峰重尾的乘积正态;平方把质量压到正半轴、均值漂离 0。
11-
2. **求和:点积与长度**:点积(双方随机 / 一方固定 ±1)与 ‖x‖² 三个模式,
8+
1. **按元素运算**(标量视角):同一批样本对 x、y 逐元素做 x、x+y、x∘y、x² 四种运算
9+
四条精确理论密度同图对比,选中项叠加蒙特卡洛直方图。直观看:
10+
相加保持正态;按元素乘变成尖峰重尾的乘积正态;平方把质量压到正半轴、均值漂离 0。
11+
2. **求和:点积与长度**(向量视角):点积(双方随机 / 一方固定 ±1)与 ‖x‖² 三个模式,
1212
直方图 + 精确理论曲线。拖 D 从 1 到 4096 可看乘积正态 → Laplace → 正态的
1313
中心极限过程,以及 ‖x‖² 的长度集中(RMSNorm 的前提);
1414
两种点积模式的理论/样本方差对比即回答"σ²=1/D 能否让点积方差为 1"。
@@ -17,8 +17,12 @@
1717

1818
直接用浏览器打开 `index.html` 即可(ECharts 走 CDN,需要联网)。
1919

20-
- 维数 D:滑块走 2 的幂(1~4096),输入框可给任意 1~8192;
21-
- σ² 预设 1 / 1/D / 1/√D 随 D 联动,也可输入自定义值。
20+
- 两个面板参数各自独立、互不影响:面板一有分量方差 σ²、样本量 N;
21+
面板二有维数 D(滑块走 2 的幂 1~4096,输入框可给任意 1~8192)与分量方差 σ²
22+
(预设 1 / 1/D / 1/√D 随 D 联动,也可自定义);
23+
- 全局仅共享随机种子(影响复现性,不影响分布结论);
24+
- 理论曲线随参数即时更新;蒙特卡洛不自动采样——点各面板参数行的「采样」
25+
才生成样本并叠加直方图,参数变更后旧样本失效(按钮高亮提示重新采样)。
2226

2327
## 文件结构
2428

@@ -41,7 +45,6 @@
4145
|---|---|---|---|---|
4246
| x | N(0, σ²) | 0 | σ² ||
4347
| x+y | N(0, 2σ²) | 0 | σx²+σy² | 是(独立正态之和仍正态,方差相加) |
44-
| c·x | N(0, c²σ²) | 0 | c²σ² | 是(标准差按 \|c\| 缩放) |
4548
| x∘y | 乘积正态 | 0 | σx²σy² | **** |
4649
|| σ²χ²₁ | σ² | 2σ⁴ | **** |
4750

@@ -64,6 +67,14 @@ $$f(z) = \frac{1}{\sigma\sqrt{2\pi z}}\,e^{-z/(2\sigma^2)},\quad z>0$$
6467

6568
### 2. 点积:先按元素乘,再求和
6669

70+
速览(推导见下文):
71+
72+
| 运算 | 分布 | 均值 | 方差 | 仍为正态? |
73+
|---|---|---|---|---|
74+
| x·y(双方随机) | Bessel-K 型,ν=(D−1)/2 | 0 | D·σx²σy² | 否(D=1 乘积正态、D=2 Laplace;D 大由 CLT 趋近正态) |
75+
| x·v(一方固定,v_i=±1) | N(0, Dσ²) | 0 | Dσ² | ****(精确正态) |
76+
| ‖x‖²(长度平方) | σ²χ²(D) | Dσ² | 2Dσ⁴ | 否(只有正半轴;D 大趋近正态) |
77+
6778
**双方随机** z = Σ x_i y_i:特征函数 φ(t) = (1 + a²t²)^{-D/2}(a = σxσy),反演得
6879

6980
$$f(z) = \frac{(|z|/2a)^{\nu}\,K_\nu(|z|/a)}{\sqrt{\pi}\,\Gamma(D/2)\,a},
@@ -87,8 +98,7 @@ $$z \sim \mathcal N(0,\ \sigma^2\|v\|^2)$$
8798
固定向量的分量只是把独立噪音重新线性组合。
8899

89100
**长度平方** ‖x‖² = Σ x_i² ~ σ²χ²(D):均值 Dσ²,方差 2Dσ⁴,
90-
相对涨落 √(2/D)。高维时 ‖x‖ 集中到 σ√D 附近——RMSNorm
91-
(除以 RMS = ‖x‖/√D)正是利用这个集中性。
101+
相对涨落 √(2/D)。高维时 ‖x‖ 集中到 σ√D 附近——这是 RMSNorm 能工作的前提(§4 详解)。
92102

93103
### 3. 关键问题:σ² = 1/D 时点积方差是不是 1?
94104

@@ -108,3 +118,37 @@ $$\mathrm{Var}(x\cdot y) = D\,\sigma_x^2\sigma_y^2$$
108118

109119
两种缩放因子 1/D 与 1/√D 的分野,本质就是点积中"一方固定还是双方皆随机";
110120
面板二的两种点积模式可直接对比这两种情形(理论方差与蒙特卡洛实测同屏显示)。
121+
122+
### 4. 附:RMSNorm 为什么能工作
123+
124+
RMSNorm 把 D 维向量除以其均方根(再乘可学增益 g):
125+
126+
$$\mathrm{RMSNorm}(x) = \frac{x}{\mathrm{RMS}(x)}\,g, \qquad
127+
\mathrm{RMS}(x) = \sqrt{\frac{\|x\|^2}{D}}$$
128+
129+
它能成立依赖 §2 长度平方给出的两个数字:
130+
131+
**① 校准性(期望层面,精确)**:RMS 是分量方差的良好估计,
132+
因为 E[‖x‖²/D] = σ²(长度平方的均值 = 分量方差 × D)。
133+
更进一步,归一化后分量的方差**精确**为 1,不需要任何近似——
134+
由分量的交换对称性(E[x_i²/‖x‖²] 对 i 相同,且对 i 求和为 1):
135+
136+
$$E\!\left[\frac{x_i^2}{\|x\|^2}\right] = \frac{1}{D}
137+
\;\Longrightarrow\;
138+
E\!\left[\left(\frac{x_i}{\mathrm{RMS}(x)}\right)^{\!2}\right] = 1$$
139+
140+
注意 RMS(x) 本身是随机变量,但对称性使该恒等式与分布细节无关
141+
(各分量 iid 即可,甚至不需要高斯假设)。
142+
143+
**② 稳定性(单样本层面,渐近)**:RMS 逐样本几乎恒定。
144+
由 Var(‖x‖²) = 2Dσ⁴,‖x‖²/D 的相对标准差为 √(2/D);
145+
开方传到 RMS 上(delta 方法)再减半,相对标准差 ≈ 1/√(2D):
146+
147+
| D | 64 | 1024 | 4096 |
148+
|---|---|---|---|
149+
| RMS 相对涨落 | 8.8% | 2.2% | 1.1% |
150+
151+
D 越大,每个样本被除以的因子越接近同一个常数 σ——这就是
152+
"高维向量长度集中"(‖x‖ ≈ σ√D)在归一化中的表现:
153+
RMSNorm 在高维几乎等价于除以一个常数,却又对分量尺度的真实变化
154+
(σ 漂移)保持自校准——这正是它比"固定除数"更鲁棒的原因。

web-tools/noise-ops-demo/css/style.css

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,58 @@ main {
200200
font-size: 12px;
201201
}
202202

203+
/* 面板内参数行:浅色底与全局控制区区分,强调"仅本面板" */
204+
.panel-controls {
205+
display: flex;
206+
flex-wrap: wrap;
207+
align-items: center;
208+
gap: 8px 12px;
209+
padding: 8px 10px;
210+
margin: 4px 0 8px;
211+
background: #f8fafc;
212+
border: 1px solid #e2e8f0;
213+
border-radius: 6px;
214+
font-size: 13px;
215+
}
216+
217+
.panel-controls label {
218+
font-size: 13px;
219+
white-space: nowrap;
220+
}
221+
222+
.panel-controls input[type="number"] {
223+
width: 72px;
224+
padding: 3px 6px;
225+
border: 1px solid #d0d7de;
226+
border-radius: 6px;
227+
font-size: 13px;
228+
}
229+
230+
.panel-controls input[type="range"] {
231+
width: 180px;
232+
}
233+
234+
.controls-hint {
235+
font-size: 12px;
236+
color: #8c959f;
237+
}
238+
239+
/* 采样按钮:样本失效/未采样时高亮提示 */
240+
button.need-sample {
241+
background: #2563eb;
242+
border-color: #2563eb;
243+
color: #fff;
244+
}
245+
246+
button.need-sample:hover:not(:disabled) {
247+
background: #1d4ed8;
248+
}
249+
250+
/* 统计行中"未采样"提示 */
251+
.stat-dim {
252+
color: #8c959f;
253+
}
254+
203255
.chart {
204256
width: 100%;
205257
height: 420px;

web-tools/noise-ops-demo/index.html

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,81 +13,85 @@
1313
<h1>噪音向量的基本运算:分布视角</h1>
1414
</div>
1515
<p class="subtitle">
16-
x、y 为 D 维向量,各分量独立同分布 N(0, σ²)。LLM 的线性部分不外三种运算:<strong></strong><strong>数乘</strong><strong>点积</strong>
17-
(矩阵投影 = 每行一个点积,组成新向量)。本页从概率密度、均值、方差三个视角演示
18-
<strong class="legend-note note-blue">加 / 数乘保持正态</strong>
16+
LLM 的线性部分不外三种运算:<strong></strong><strong>数乘</strong><strong>点积</strong>
17+
(矩阵投影 = 每行一个点积,组成新向量)。本页从概率密度、均值、方差三个视角演示高斯噪音经历这些运算后的分布变化
18+
<strong class="legend-note note-blue">相加保持正态</strong>
1919
<strong class="legend-note note-orange">按元素乘变成"乘积正态"(尖峰重尾)</strong>
2020
<strong class="legend-note note-red">平方变成卡方(均值漂离 0)</strong>
2121
</p>
2222
</header>
2323

2424
<section class="controls">
25-
<div class="control control-slider">
26-
<label for="sliderD">维数 D</label>
27-
<input id="sliderD" type="range" min="0" max="12" step="1" value="4" />
28-
<input id="inputD" type="number" min="1" max="8192" step="1" value="16" />
29-
</div>
30-
<div class="control">
31-
<label>分量方差 σ²</label>
32-
<div class="preset-group">
33-
<button type="button" data-preset="1">1</button>
34-
<button type="button" data-preset="1/D" class="active">1/D</button>
35-
<button type="button" data-preset="1/sqrtD">1/√D</button>
36-
</div>
37-
<input id="inputSigma2" type="number" step="any" title="自定义 σ²" />
38-
</div>
39-
<div class="control">
40-
<label for="inputC">数乘 c</label>
41-
<input id="inputC" type="number" step="any" value="2" />
42-
</div>
43-
<div class="control">
44-
<label for="inputN">样本量 N</label>
45-
<input id="inputN" type="number" min="1000" max="2000000" step="1000" value="200000" />
46-
</div>
4725
<div class="control control-mc">
48-
<button id="btnResample" type="button">重新采样</button>
4926
<label for="chkSeed">
5027
<input id="chkSeed" type="checkbox" checked />
5128
固定种子
5229
</label>
5330
<input id="inputSeed" type="number" value="42" step="1" />
5431
</div>
32+
<span class="controls-hint">
33+
理论曲线随参数即时更新;蒙特卡洛不自动采样——点各面板参数行的「采样」叠加直方图(参数变更后按钮高亮提示重新采样)
34+
</span>
5535
</section>
5636

5737
<main>
5838
<div class="chart-wrap">
5939
<div class="panel-head">
60-
<h2>按元素运算(逐分量分布)</h2>
40+
<h2>按元素运算:标量分布</h2>
6141
<div class="op-radios">
6242
<label><input type="radio" name="elementOp" value="x" /> x</label>
6343
<label><input type="radio" name="elementOp" value="add" /> x+y</label>
64-
<label><input type="radio" name="elementOp" value="scale" /> c·x</label>
6544
<label><input type="radio" name="elementOp" value="product" checked /> x∘y</label>
6645
<label><input type="radio" name="elementOp" value="square" /></label>
6746
<span class="radio-hint">(选中项叠加蒙特卡洛直方图)</span>
6847
</div>
6948
</div>
49+
<div class="panel-controls">
50+
<label for="inputSigmaElem">分量方差 σ²</label>
51+
<input id="inputSigmaElem" type="number" step="any" value="1" />
52+
<label for="inputN">样本量 N</label>
53+
<input id="inputN" type="number" min="1000" max="2000000" step="1000" value="200000" />
54+
<button id="btnSampleElem" type="button">采样</button>
55+
<span class="radio-hint">仅作用于本面板(逐分量标量分布,与维数 D 无关)</span>
56+
</div>
7057
<div id="chartElement" class="chart"></div>
7158
<p class="chart-note" id="elementStats"></p>
7259
<p class="chart-note">
73-
加与数乘保持正态(方差相加 / 乘 c²);按元素乘是乘积正态 f(z) = K₀(|z|/σ²)/(πσ²),
60+
本面板演示<strong>标量</strong>:x、y 为独立噪音标量,x, y ~ N(0, σ²)
61+
(也可理解为向量的任意一个分量——按元素运算后各分量仍 iid,单分量分布即整体)。
62+
相加仍是正态(方差相加);按元素乘是乘积正态 f(z) = K₀(|z|/σ²)/(πσ²),
7463
0 处对数尖峰、重尾(峰度 9),方差 = σ⁴(方差的乘积);平方是缩放卡方 σ²χ²₁,
7564
只有正半轴且均值从 0 漂到 σ²——"能量"不再关于 0 对称。曲线为精确理论密度。
7665
</p>
7766
</div>
7867

7968
<div class="chart-wrap">
8069
<div class="panel-head">
81-
<h2>求和:点积与长度</h2>
70+
<h2>向量求和:点积与长度分布</h2>
8271
<div class="op-radios">
8372
<label><input type="radio" name="sumMode" value="dotRandom" checked /> 点积 x·y(双方随机)</label>
8473
<label><input type="radio" name="sumMode" value="dotFixed" /> 点积 x·v(一方固定 ±1)</label>
8574
<label><input type="radio" name="sumMode" value="norm2" /> 长度平方 ‖x‖²</label>
8675
</div>
8776
</div>
77+
<div class="panel-controls">
78+
<label for="sliderD">维数 D</label>
79+
<input id="sliderD" type="range" min="0" max="12" step="1" value="4" />
80+
<input id="inputD" type="number" min="1" max="8192" step="1" value="16" />
81+
<label>分量方差 σ²</label>
82+
<div class="preset-group">
83+
<button type="button" data-preset="1">1</button>
84+
<button type="button" data-preset="1/D" class="active">1/D</button>
85+
<button type="button" data-preset="1/sqrtD">1/√D</button>
86+
</div>
87+
<input id="inputSigmaSum" type="number" step="any" title="自定义 σ²" />
88+
<button id="btnSampleSum" type="button">采样</button>
89+
<span class="radio-hint">仅作用于本面板</span>
90+
</div>
8891
<div id="chartSum" class="chart"></div>
8992
<p class="chart-note" id="sumStats"></p>
9093
<p class="chart-note">
94+
本面板演示<strong>向量</strong>:x、y 为 D 维向量,各分量独立同分布 N(0, σ²),考察把 D 个分量求和压成标量的运算。
9195
点积 = 先按元素乘再求和:D=1 即乘积正态(尖峰),D=2 恰为 Laplace 分布,D 增大由中心极限定理趋于正态(拖 D 滑杆看全过程)。
9296
双方随机时 Var = D·σ⁴;一方固定(v 分量 ±1,‖v‖² = D)时是精确正态 N(0, Dσ²),Var = D·σ²——
9397
故 σ²=1/D 时前者方差为 1/D、后者恰为 1:<strong>"1/D 让点积方差为 1"只在一方固定时成立</strong>

0 commit comments

Comments
 (0)