语义距离即欧几里得距离
高维向量空间
ANDREA-120M 的 8449-token 词汇表中,每个 token 都映射到 R^768 中的一个点。token 嵌入矩阵形状为 8449 × 768:8449 行,每行对应一个词汇 token;768 列,每列对应一个嵌入维度。
使之成为向量空间的三个性质
1. 加法。 v_a + v_b 落在 R^768 中。两个嵌入的和是一个有效的向量。
2. 标量乘法。 对于任意实数 alpha,alpha * v 落在 R^768 中。沿同一方向拉伸或收缩。
3. 线性。 alpha v_a + beta v_b 落在 R^768 中。线性组合仍留在该空间内。
这些性质为我们提供了几何工具:距离、角度、投影、基、正交性。
距离作为语义相似度
两个嵌入的余弦相似度衡量它们之间的夹角:cos(theta) = (v_a . v_b) / (||v_a|| * ||v_b||)。取值范围:-1(相反)到 +1(平行)。
训练后的经验规律:具有相似上下文的 token 会产生余弦相似度高的嵌入。ANDREA-120M 将 parakeet 与 monkey 放置得很近(两者均为生物、物种,现存或已灭绝类别)。它将 Fourier 与 transform 放置得很近(信号处理语境)。它将 parakeet 与 Fourier 放置得很远(跨域正交性)。
为什么是 R^768 而非 R^384
ANDREA-12M 使用 d_model = 384。ANDREA-120M 将其加倍至 768。加倍很重要:384 维空间可用的“角度”较少,跨域消歧能力受限。加倍容量让模型有空间将 bank(河岸)与 bank(金融机构)解析到嵌入空间的不同区域,避免其中一个坍缩到另一个中。
将嵌入更新视为向量平移
每一次梯度步都会向 v_token 添加 delta_v。从几何角度看:在 R^768 中进行的小平移会将每个 token 的位置推向能降低损失的邻域。经过 200K 步后,每个 token 都从随机初始化位置迁移到学习到的位置。
计算距离
三个训练好的嵌入(简化为 R^3 以便计算):
- v(parakeet) = (1.0, 0.5, 0.0)
- v(monkey) = (1.2, 0.3, 0.1)
- v(Fourier) = (0.0, 0.0, 1.5)
投影到查询子空间
注意力计算的内容
对于位置 t 处的 token,注意力计算:
<translated content> [BLOCK_TYPE SECTION/STEP]
softmax(Q K^T / sqrt(d_k)) V [BLOCK_TYPE SECTION/STEP]
<translated content> [BLOCK_TYPE SECTION/STEP]
其中 Q 是查询(当前 token 的问题),K 是键(每个过去 token 的标识符),V 是值(每个过去 token 的内容)。输出是 V 的加权混合,权重由查询与每个键的相关程度决定。 [BLOCK_TYPE SECTION/STEP]
<translated content> [BLOCK_TYPE SECTION/STEP]
几何解读
[BLOCK_TYPE SECTION/STEP]将 K 视为 R^d_k 中的向量列表。每一行代表一个过去 token 的键。Q 是 R^d_k 中的一个向量:当前 token 的问题。 [BLOCK_TYPE SECTION/STEP]
<translated content>
Q K^T 将每个键投影到 Q 上。点积 q · k_i 表示 k_i 在 q 方向上的投影长度。长投影 = 该键与查询高度相关。短投影 = 该键与查询几乎无关。
softmax 将投影值归一化为总和为 1 的权重。V 的加权和是一个单一向量:它是过去内容的混合,按与当前查询的相关性加权。
多头注意力作为多子空间投影
ANDREA-120M 使用 12 个注意力头。d_model = 768;d_k = 768 / 12 = 64。每个头将输入投影到 R^768 中不同的 64 维子空间。12 个头提供了对同一序列的 12 个独立视角:一个头可能追踪语法角色,另一个追踪语义相似性,还有一个追踪长程指代。
几何上:每个头定义了一个 64 维的有向子空间(一个“窗口”),通过它来观察过去。
因果掩码
仅解码器模型会加入因果掩码:在 softmax 之前,将 Q K^T 中对角线以上的所有条目设为 -infinity。从几何角度看:对任意未来 token 的投影权重将被置零。Token t 只能看到 token 0 到 t。
为什么这很重要:训练与推理变得对称。使用相同的正向传播、相同的掩码投影,无需额外的生成逻辑。
sqrt(d_k) 缩放
若不进行缩放,点积会随 d_k 增大而增大。较大的点积会将 softmax 推向 one-hot 区域(一个权重接近 1,其余接近 0)。除以 sqrt(d_k) 可使投影保持单位方差尺度,从而在较宽的 d_k 范围内维持 softmax 的锐度。
几何上:sqrt(d_k) 对投影长度进行归一化,使得 softmax 无论子空间维度如何,都能看到可比较的量级。
阅读投影
R^4 中的三个键与一个查询(为便于计算而简化):
- q = (1, 0, 1, 0)
- k_1 = (1, 0, 0, 0) [过去 token 1]
- k_2 = (0, 0, 1, 0) [过去 token 2]
- k_3 = (0, 1, 0, 1) [past token 3]
d_k = 4, 所以 sqrt(d_k) = 2。
梯度下降:地形上的路径
120M+1 维空间中的曲面
ANDREA-120M 的每一种权重配置都是 R^120,000,000 中的一个点。损失函数 L(w) 将每个点映射到一个实数:该配置下的训练损失。所有损失值共同构成参数空间上方的一个 (120M+1) 维曲面。
直接可视化在几何上是不可能的。概念上:它像一片地形。高山(高损失)、山谷(低损失)、鞍点、平台、山脊、盆地。
梯度:局部斜率
grad L(w) 是 R^120M 中的一个向量,指向 L 增加最快的方向。取其负值:-grad L(w) 指向最陡的下坡方向。
一次 AdamW 步骤会沿着负梯度方向推动 w(通过 m 和 v 进行自适应缩放)。几何上:沿着曲面进行一次微小下降,步长由 lr 控制。
v1 的不良盆地
v1 在 LR = 峰值(0.0003)时对刚初始化的权重进行了第一次更新。几何上:w_0 位于曲率极高的区域(随机初始化在许多方向上都有高曲率),而峰值 LR 的一次更新使其落入错误的盆地。后续步骤无法逃离该盆地。模型最终只能生成“region region region”,因为这是它从落点能找到的最低损失盆地。
v2 的预热路径
v2 在 LR 从 0 线性上升至峰值的过程中进行了 2000 次小步更新。几何上:w_0 首先沿着曲率较低的平滑方向缓慢移动。到第 2000 步时,w 已进入一个更易导航的区域;此时峰值 LR 即可将其推向更好的盆地,而不会发生过冲。
Warmup 是一种几何感知的初始化协议:先让模型找到一个安全的局部邻域,再对其施加强力训练。
宽盆地 vs 窄盆地
在第 112K 步时,ANDREA-120M 位于一个盆地中。问题:这个盆地有多宽?
宽盆地 = 许多相邻的权重配置也能达到较低的训练损失。泛化性能通常较好(盆地宽度可预测测试性能;参见 PAC-Bayes 课程,第 3 章)。
窄盆地 = 只有一组狭窄的权重能达到低损失。泛化能力往往会受影响。
v3 polish 在第 112,619 步沿曲面(未重置)将模型推向更宽的盆地,借助课程扰动:改变损失函数(不同的 bandit、不同的训练混合),让 SGD 在新策略下找到附近的平坦区域。
僵尸悬崖
第 112,080 步异常的 0.13 损失是一个悬崖:一个尖锐、狭窄的区域,其中特定输入模式(记忆的 repo-docs 子串)达到接近零的损失。模型从更宽的盆地跌入狭窄沟壑。Polish-pivot 对 repo-docs 的硬排除填平了该沟壑,使 SGD 无法再找到它。
解读地形
课程混合作为离散单纯形上的行走
什么是单纯形
一个 n 维单纯形(具体指标准 (n-1)-单纯形)是由 n 元组 (w_1, w_2, ..., w_n) 组成的集合,其中每个 w_i >= 0 且 sum(w_i) = 1。
对于 n = 2:从 (1, 0) 到 (0, 1) 的线段。对于 n = 3:顶点为 (1, 0, 0)、(0, 1, 0)、(0, 0, 1) 的三角形。对于 n = 16(ANDREA 的完整源列表):一个位于 R^16 中的 15 维单纯形。
老虎机权重作为单纯形坐标
ANDREA 的老虎机在每个阶段生成一个数据源的权重向量 w。每个分量 w_i 是采样源 i 的概率。概率非负且总和为 1:每个权重向量都位于单纯形上。
顶点 = 纯策略(仅采样一个源)。内部 = 混合策略(以正概率采样多个源)。边 = 仅两个源的混合。
源下限作为受限区域
ANDREA 施加最小权重限制:hermes3-general 的下限为 0.7(后处理后)。这在单纯形中划出一个子区域:仅当权重向量满足 w_hermes3-general >= 0.7 时才可达。
几何上:下限用一个超平面切割单纯形。可达区域是位于所有下限超平面正确一侧的单纯形部分。
上限作为另一种限制
ANDREA 也施加上限:dictionary 的上限为 0.25(后处理后)。每个上限都是另一个超平面,可达区域必须同时位于所有上限超平面的正确一侧。
将某个来源完全排除(上限 = 0.0)是最强的上限:该坐标被固定为零,使有效单纯形降维一维。
相变作为单纯形游走
每一次相变(每 7-42 步)都会产生一个新的权重向量。每个新向量都是单纯形上的一个点。在 200K 步内,bandit 在单纯形可达区域内走出一条长路径。
随机相变 = 瞬移到可达区域内的一个均匀随机点。
Bandit 控制的相变 = 朝符合下限与上限的 UCB 最优顶点迈出一步。
Polish 枢轴 = 重新绘制可达区域(新的下限、新的上限、部分源被排除),游走从新的起点继续。
为什么顶点是危险的
纯源阶段(一个 w_i = 1,其余 = 0)位于单纯形顶点。多样性为零。模型仅在一个分布上训练。v1 的崩溃部分可追溯到 bandit 停留在 repo-docs 顶点附近;样本仅再现了该源的分布。
下限可防止顶点驻留:0.7 的下限表示“任何源的权重不得低于 0.7”(或优先源对应的下限值)。
行走可达区域
三个源:hermes3-general (H)、gutenberg (G)、dictionary (D)。约束:H 下限 = 0.5,D 上限 = 0.25。(隐含:所有权重 ≥ 0,总和为 1,无其他约束。)
前 20K 步的维度限制
v2 的课程预热做了什么
v2 将 curriculum_warmup_sources 设置为七个来源:hermes3-general、hermes3-creative、hermes3-roleplay、chat、smoltalk、oasst、gutenberg。前 20K 步仅由这七个来源贡献。20K 步后,完整的 16 源数据流激活。
几何解读
完整的 16 源单纯形位于 R^16 中。限制到 7 个源会将 16 个坐标中的 9 个压缩为零。bandit 的行走发生在一个 6 维子单纯形中(比源数量少一维,由和为 1 的约束决定)。
几何上:完整单纯形的一个子流形。维度更低、更平滑、更易导航。
为什么这有助于早期训练
训练初期,模型尚未学会连贯的语言。多样化的源会使其困惑:每个源都有自己的风格、自己的词汇分布、自己的模式。在随机初始化时混合 16 个源会产生一个过于宽泛的目标分布,模型无法拟合。
限制到 7 个对话/散文源会产生更均匀的目标。模型先学习稳定的表征,然后再扩展。
训练中的几何路径
1. 第 0 至 20K 步(warmup)。 行走位于 6-D 子单纯形上。模型中出现稳定的语言模式。
2. 第 20K 至 112K 步(full firehose)。 行走扩展至 15-D 完整单纯形。领域广度开始显现。
3. 第 112K 步起(polish)。 行走再次受限:排除 repo-docs 与 repo-docstrings,提高对话下限。在完整单纯形内形成更小的多边形;对话质量得到巩固。
为什么 Polish 将 curriculum_warmup_steps 设为 0
Polish 从第 112K 步开始。此时模型已能生成连贯的语言。若现在再限制到子单纯形,将失去广度却无法获得额外收益(warmup 的好处仅针对全新初始化的模型)。将 warmup_steps 设为 0 意味着:留在完整单纯形上,但施加新的上限与下限。
三种几何,一次训练
v2 warmup:低维子单纯形。
v2 firehose:完整 15-D 单纯形。
v3 polish:完整单纯形搭配更小的多边形(更多约束)。
同一 200K 步训练,三种不同的几何模式。每种模式都针对模型成熟的不同阶段进行了调优。