【Transformer 与注意力机制】17|Causal Mask:让模型只看过去不看未来
自回归模型训练要并行、生成不能偷看未来。本文从 teacher forcing 推到 mask 矩阵,对比 causal、prefix LM、滑窗与 packing 文档掩码,结合 KV cache 对齐、FlashAttention 跳块与 GPT-2 实测 attention sink,说明 mask 决定训练并行性、推理对齐方式和 sink 落点。
自回归模型训练要并行、生成不能偷看未来。本文从 teacher forcing 推到 mask 矩阵,对比 causal、prefix LM、滑窗与 packing 文档掩码,结合 KV cache 对齐、FlashAttention 跳块与 GPT-2 实测 attention sink,说明 mask 决定训练并行性、推理对齐方式和 sink 落点。
从 Fraser(2004)的三个 limbo list 出发,推导 EBR 为什么要等两个纪元、垃圾该打哪个纪元的标签;对照 crossbeam-epoch 0.9.18 源码,实测两个变异体、pin 的指令选择、每节点开销、回收速率上限,以及一个被抢占或睡住的读者让垃圾涨到多少。
跳表插删要改多个指针,靠标记删除或乐观加锁把它们变成一次线性化操作。对照 Pugh、Harris、Fraser、HLLS 与 JDK 21、LevelDB、RocksDB 源码,并用 TSan 与对拍验证实现,实测独占 CPU 与超额订阅两种情形下的吞吐。
按 Michael(TPDS 2004)的条件拆解 hazard pointers:发布后为何要复读、StoreLoad 栅栏防哪种重排、未回收节点的上界从哪来;实测两个变异体、x86 store buffering 和每个指针的开销,对照 Folly、C++26 与乐观遍历之争。
按 PODC 1996 原文复原 Michael-Scott 无锁队列:线性化点、计数指针防 ABA、计数器为何不解决内存回收、每条 CAS 的 C11 内存序,并用 TSan 与线性化检查器实测。
ML-KEM(FIPS 203)与 ML-DSA(FIPS 204)都建立在 Module-LWE 上。本文从 LWE 归约讲到 KeyGen/Encaps/Sign 流程、NTT 实现(附与朴素乘法对拍过的 Python 代码)、FO 变换与拒绝采样,说明参数集怎么选、core-SVP 估计为何不能直接和 NIST 级别相减,以及 TLS、Signal 等部署现状。
比较下界只约束比较模型,基数排序把代价转移到键长和内存访问上。本文推导代价模型,用缓存模拟与绑核实测解释位宽为何停在 8 到 11 位,并对照 ska_sort、ClickHouse、DuckDB 与 IPS²Ra 说明它何时赢、何时输。
对照 CPython 与 OpenJDK 源码拆解 TimSort 的 run 检测、minrun、galloping 与合并,梳理 2015 年栈不变量 bug 和改用 Powersort 的原因;比较次数来自与 CPython 逐次一致的 C 移植。
对照 orlp/pdqsort 源码与 Peters 论文,拆解 pdqsort 在 introsort 上的四处改动;用与参考实现比较次数逐次一致的 C 移植和 McIlroy 对抗输入实测,并梳理 Boost、Rust、Go、libc++ 各自采用了哪些部分。
Treiber 栈只靠一次 CAS,却要分别处理 ABA、内存回收和争用三件事。本文用确定性复现、守恒测试和 sanitizer 区分前两者,在 4 个逻辑 CPU 上实测指数退避与消除数组,并对照 Linux llist、Windows SList、Boost.Lockfree 的取舍。