• 请不要在回答技术问题时复制粘贴 AI 生成的内容
KaiWuBOSS
V2EX  ›  程序员

用 72 小时系统性地否定自己的假设:从几何代数到因子注意力的踩坑记录

  •  
  •   KaiWuBOSS · 2h 20m ago · 118 views

    最近花了三天时间做了一个实验项目,核心问题是:能不能找到比 token embedding 更好的语义传送单元? 结果是把自己的三个假设依次否定了,但在否定过程中挖出来一个还没被否定的信号。把过程和数据分享出来,也许对做 NLP/表示学习的朋友有参考价值。

    设备:双卡 4090 ( 24GB×2 ),在 VPS 上跑。

    背景:我们在试图解决什么 现有 LLM 的 token embedding 是一张静态查表。"苹果"无论出现在"吃苹果"还是"苹果发布会",进入模型的初始向量都是同一个。模型要靠后续十几层 Transformer 来修正这个歧义起点。 有没有更好的办法?我沿着三条路走了一遍:

    BIIC (几何代数) → SFE (动态调制) → BIF (因子化低维交互)
    

    每条路都是前一条被实验否定后的精炼。

    第一条路:BIIC ,用几何代数做语义表示

    想法- Clifford 几何代数 Cl(4,1) 里的多向量可以按"grade"分解:

    Grade-0 (标量):在旋转变换下严格不变——不管坐标系怎么转,这个值不变

    Grade-2 (双向量):在旋转变换下会跟着变

    设想:把 token 映射到这个代数结构里,grade-0 作为词的稳定身份锚点,grade-2 携带随上下文变化的语法/语义关系。用 sandwich 积 R·x·R_rev 做 token 间变换,数学上保证 grade-0 严格不变、grade-2 按规律协变。

    Phase 1-2:代数基础验证

    先花了两天验证代数运算是否正确,结果全部通过:

    测试 结果 关键数据

    Grade-0 不变性 PASS 100 次变换后误差 < 1e-5

    Grade-2 等变性 PASS 两种计算方式误差 < 1e-6

    10 层梯度流 PASS 梯度比 = 0.55 ,健康

    全链路训练 50 步 PASS loss 10.57 → 0.72

    踩坑:

    Cl(4,1) 的 e5²=-1 (负度规)导致 sandwich 积不保范数,多次变换后数值溢出。解决:对每个 grade 分别归一化,不能统一缩放(否则破坏等变性)

    Taylor 展开 exp(B) 需要 16 项,12 项精度不够

    Phase 3-5:在真实语料上训练,等变分量不活跃

    开始在 WikiText-103 上训练完整的语言模型,同时设计了 13 个实验,系统尝试激活 grade-2 等变分量:相对不变注意力、分段 Eraser 、Cohesin 门控、长序列、深网络、全机制叠加…… 13 个实验全部失败。

    核心数据:

    Phase 3 消融:
    
      完整 BIIC loss = 10.8285
      
      仅 grade-0 loss = 10.8271
      
      差距 = 0.0014 (等变分量贡献几乎为零)
      
    
    Phase 5 RelAttn 10k 步:
      alpha: 0.018 → 0.029 (微升,远不足以说明激活)
    
    Transformer baseline PPL = 53.9 ( 52M 参数)
    BIIC PPL = 390+(远差)
    

    为什么等变分量不活跃?

    根本原因是任务不匹配。等变分量在分子设计( SE(3) 等变)、DNA 建模(互补链对称)中有效,是因为那些领域有明确的物理对称性作为监督信号。语言中没有这样的对称性。next-token prediction 只需要知道"下一个词更可能是什么",不需要知道"token A 和 B 的几何对称关系"。

    这个教训概括起来就是:在借鉴前人工作之前,先检查前人的成功条件在你的场景里是否存在。

    Phase 6:依存句法任务,直接测试

    LM 方向失败后,尝试在有明确句法监督的任务上测试:依存句法分析。如果 grade-2 真的编码了句法,这里应该有优势。

    结果:

    模型 UAS LAS 参数

    BIIC + Biaffine 0.279 0.225 2.5M

    Transformer + Biaffine 0.752 0.681 2.3M

    差距 47pp ,任意数据量下 BIIC 均远差于 Transformer ,无交叉点。

    判决性实验 M-v2:测试 grade-2 几何积能否区分不同依存关系类型:

    统计显著:p < 1e-15 (样本量足够大)

    但 Cohen's d = -0.157 (效应极小,方向还是反的)

    探针准确率 = 0.439 (勉强高于随机基线 0.25 )

    有一个矛盾值得记录:线性探针从 grade-2 预测词性 POS = 0.789 ,依存关系 DEP = 0.823 。信息确实存在,但几何积无法提取它。

    解释:grade-2 的线性子空间里有句法信息,但这些信息不是通过几何积的代数结构组织的。"信息存在"≠"可被代数操作提取"。

    BIIC 方向关闭。


    中间插曲:PCA 有效秩分析

    在决定下一个方向之前,对 BIIC 的 checkpoint 做了一次 PCA 分析( 51 个多义词,正确加载 50/50 参数),结果很清晰:

    层 PR 中位数 rank_90 中位数 同词不同语境的 cos

    embed_grade0 1.0 1 ≈0 (完全正交)

    embed_grade2 1.0 1 1.0 (完全相同)

    grade2 ( 6 层后) 45.6 53 -0.02 (近乎正交)

    hidden_layer3 44.7 55 -0.03

    hidden_final 1.05 1 0.82

    几个关键发现:

    embed_grade2 cos=1.0:embedding 层出来的 grade-2 ,在不同语境下完全相同。原因很简单:encoder 的输入只有 token ID ,没有上下文,所以无法产生上下文分化。这个数字后来成为否定 SFE 的提前预警。

    grade2 (深层) PR≈46 ,cos≈-0.02:经过 6 层 blocks 之后,grade-2 变成了高维、相互近乎正交的表示。上下文分化发生在中间层,不在 embedding 层。

    hidden_final PR≈1:最后一层把信息压缩回接近一维。这是正常 LM 行为——预测下一个词只需要极少维度。

    grade-2 PR p95=49.6:95% 的多义词,语义变化的有效维度不超过 50 。这个数字后来成为 BIF 中 k=64 的实证依据。

    第二条路:SFE ,动态调制 embedding 想法 如果 embedding 层本身能根据上下文调整,同一个词在不同语境下就会有不同的初始向量,后续 Transformer 就不需要修正歧义起点。

    e_i = (alpha_static_i + g(ctx_i)) @ B
    

    B ∈ ℝ^{64×256}:全局共享语义基矩阵

    alpha_i ∈ ℝ^{64}:每个 token 的静态配方系数

    g(ctx_i):上下文修正网络,输入前 4 个位置的 embedding ,输出系数偏移

    低秩约束( k=64 )有 PCA 数据的支持,防止 g 退化成复杂查表。

    三轮实验,三轮失败

    实验 核心改动 alpha_cos_min alpha_cos_final 结论

    v1.0 g 零初始化 0.85 0.90 g 未激活

    v1.1 随机初始化 + 10x lr + 辅助损失 0.61 0.85 激活但被压制

    FAM v1 + FAM 层直接依赖 α 0.49 0.86 压制不变

    FAM v2 FAM 梯度直连 g 0.50 0.86 压制不变

    v1.1 的结果是最有信息量的:alpha_cos 在 step 400 降到 0.61 ( g 确实学到了分化),然后单调上升到 0.85 (被压回去)。探针准确率:完整版 SFE 0.6316 ,静态版 0.6475 ,完整版反而更差。

    压制机制的本质:Transformer 的 attention 本身就是一个强大的消歧工具。它发现"自己处理消歧"比"利用 embedding 层传来的分化信号"更高效,通过梯度反传系统性地将 g(ctx) 归零。

    这不是梯度路径的问题(我们试过直连),不是学习率的问题(给了 10 倍),不是辅助损失的问题(加了显式分化损失)。这是优化景观决定的:在有 Transformer attention 的架构中,embedding 层的上下文调制没有生存空间。

    SFE 动态路线关闭。

    意外发现

    FAM v1 里,把第一层 attention 换成 FAM (在 α 空间做 token 间交互)后,PPL 从 179.34 降到 175.44 ,少了 3.9 点,参数量还更少( 18.7M vs 19.4M )。

    这个增益跟 g(ctx) 的动态调制无关(两组 alpha_cos 都反弹到 0.86 ),来自 FAM 层本身的结构化聚合。这个发现是 BIF 假设的直接来源。


    第三条路:BIF ,在低维空间做 token 交互

    想法

    把 token 交互的计算场所从 256 维搬到 64 维配方空间:

    # Token 表示
    e_i = alpha_i @ B   # [k] @ [k, d] = [d],alpha 是 64 维配方系数,B 是共享零件库
    
    
    # FAM 层:在配方空间做 token 间交互
    S[i,j] = alpha_i @ W @ alpha_j^T   # 双线性相似度,参数量 k×k=4096
    out_i = softmax(S_i + causal_mask) @ X   # 按相似度聚合
    

    参数量对比:

    传统 embedding:50257×256 ≈ 12.9M

    BIF embedding:50257×64 + 64×256 ≈ 3.2M (节省 75%)

    FAM 层:64×64 = 4096 个参数(标准 attention 约 262144 )

    BIF 不解决一词多义,α 是静态的,语境消歧仍由后续 Transformer 处理。它只做一件事:在更低维的空间里做交互。

    当前状态

    FAM 实验给出了初步正向信号:-3.9 PPL ,参数更少。

    但这个信号还不干净:两组模型参数量差了 0.7M ( 18.7M vs 19.4M ),无法排除参数量差异是增益来源。

    BIF Phase 1 的目标是在参数量和 FLOPs 精确对齐的条件下,用三组对比给出干净的答案:

    Baseline:标准 embedding + 全部标准 attention

    BIF:α配方 embedding + FAM 第一层 + 标准 attention 后续层

    BIF-ablation:α配方 embedding + 压缩版第一层 attention (参数量≈FAM )

    如果 BIF 比 Baseline 低 >2 点,且比 BIF-ablation 低 >1 点,才算 FAM 有独立贡献。

    这个实验还没跑完,是目前唯一开放的假设。


    方法论:这三天最重要的东西不是结论,是筛选假设的框架

    做完这些实验,觉得最有价值的不是任何具体的实验结果,而是在失败里总结出来的一套假设验证流程。写出来供参考。

    五道闸门,提出新假设前先自我攻击

    闸门 1:计算成本

    假设的核心操作比现有方案贵多少? BIIC 的 sandwich 积比标准 attention 贵约 360 倍,这是架构级问题,工程优化解决不了。这个数字应该在提出假设时就估算,不是等实验跑完。

    闸门 2:成功条件迁移

    前人类似工作的成功,依赖哪些前提条件?这些条件在当前场景下是否存在? Geometric Hyena 在蛋白质结构上成功,因为有 SE(3) 物理等变性——这在语言中不存在。

    闸门 3:消融预判

    能否在实验前写下"完整版应该比简化版好 X 点"?如果写不出来,说明对假设的机理理解不够,还没有被精确定义。

    闸门 4:任务适配性

    数学上的优美不等于任务需要。Grade-2 几何积在数学上很漂亮,但 next-token prediction 不需要几何关系。区分"数学上可以"和"任务上需要"这两个问题。

    闸门 5:最小可证伪点

    这个假设最可能在哪里第一个失败?失败的量化标准是什么?用多少时间可以测到第一个信号?无法回答这三个问题就不允许启动实验。

    附加规则:通过标准在实验开始前写死,不允许实验中修改。如果核心指标在 2000 步时仍不达标且无收敛趋势,停止,不要继续烧资源。

    这套流程最大的价值是:它让失败变得信息密度更高。每次否定一个假设,都能精确地说"在哪里失败的",而不是模糊地说"效果不好"。


    已确认的结论(有数据支撑)

    总结一下这三天确认的事情,方便后来人不重复踩坑:

    成立的:

    Grade-0 是真实的代数不变量,数学保证,任意语境下对同一 token 完全相同( cos ≈ 0 )

    Grade-2 携带句法信息(线性探针 POS=0.789 ,DEP=0.823 ),但不在几何积结构中

    语义变化的有效维度约 46-57 ( PCA 实证,PR p95=49.6 )

    上下文分化发生在 Transformer 的中间层,不在 embedding 层

    不成立的:

    等变分量在语言 LM 任务中自发激活( 13 个实验确认)

    Sandwich 积能提取句法关系( Cohen's d=-0.157 )

    BIIC 在依存句法上有优势( UAS 差 47pp )

    动态 embedding 调制在标准 Transformer 中存活( 4 轮实验一致)

    待验证的:

    FAM 的 PPL 增益在参数对齐后是否保持( BIF Phase 1 )


    代码和踩坑 几个容易犯的 PyTorch 错误(调试了很久才发现):

    # 错误:inplace 操作报 autograd 错误
    result[:, :, c, :] = mv_c_transformed
    
    # 正确:用 stack 收集
    results.append(mv_c_transformed)
    result = torch.stack(results, dim=2)
    
    # 错误:MultiheadAttention 的 is_causal 需要同时传 attn_mask
    attn(h, h, h, is_causal=True)  # 报错
    
    # 正确
    mask = nn.Transformer.generate_square_subsequent_mask(L, device=x.device)
    attn(h, h, h, attn_mask=mask, is_causal=True)
    
    # 错误:unfold 产生 L+1 个窗口
    windows = padded.unfold(1, ctx_window, 1)
    
    # 正确:裁掉多余的一个
    windows = padded.unfold(1, ctx_window, 1)[:, :L, :, :]
    

    SFE 的信息泄漏问题(调试了很久):

    # 错误:位置 i 看到了自己的 embedding
    ctx = sfe(input_ids, ctx=None)  # 包含位置 i 自己
    
    # 正确:错位一个位置
    static = sfe(input_ids, ctx=None).detach()
    shifted = torch.zeros_like(static)
    shifted[:, 1:, :] = static[:, :-1, :]  # 位置 i 只看 i-1 之前
    x = sfe(input_ids, ctx=shifted)
    

    最后

    这个项目最初的想法是"找一个颠覆性的 token embedding 替代方案"。

    三天下来,BIIC 的几何代数路线关闭,SFE 的动态调制路线关闭,BIF 是唯一还没被否定的信号,但也还没有干净的验证数据。

    回头看,这段路走得比较值的地方不是任何具体的架构,而是:每次否定一个假设,都对"为什么这条路不通"有了更精确的理解。

    Grade-2 的信息存在但不能被代数操作提取,等变分量在没有物理对称群的任务里永远休眠,embedding 层的动态调制在 attention 面前永远被压制——这些是可以直接被后来者复用的地图,不需要再走一遍。

    BIF Phase 1 的结果出来后会补充更新。


    之前有帖子批评我说,做的项目都不能用都是 vibe 还在抖音上被说是民科。好吧 确实没找到突破性的成果。我不好说什么。

    还是希望多交流这方面的优化方向。感谢拜读。 实验过程代码和结果,陆续更新至仓库: https://github.com/val1813/BIIC

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5595 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 09:06 · PVG 17:06 · LAX 02:06 · JFK 05:06
    ♥ Do have faith in what you're doing.