哈希嵌入压缩
嵌入矩阵的参数量与词表大小线性耦合,是大模型参数效率与端侧部署的根本瓶颈之一;哈希嵌入通过共享参数表和多重哈希组合,从信息论角度解耦了"词表规模"与"参数规模"。
Weinberger、Dasgupta、Langford 等人在 ICML 2009 提出 Feature Hashing(又称 Hashing Trick),将高维稀疏特征通过哈希函数映射到固定大小的向量空间。其核心洞察是:对于线性模型,只要哈希函数满足 2-universal 性质,内积的期望就不会因碰撞而产生系统偏差。这一工作源自垃圾邮件过滤和大规模文本分类的实际需求——当特征空间达到数百万维时,显式维护特征索引既浪费内存又增加工程复杂度。Hashing Trick 将 $O(|V|)$ 的索引空间压缩到 $O(B)$($B$ 为桶数),代价仅是少量随机碰撞带来的方差增大。这一思想后来被 Vowpal Wabbit、scikit-learn 的 HashingVectorizer 等工具广泛采纳,成为工业界处理高维稀疏特征的标准手段。
Svenstrup、Winther 和 Hansen 在论文 "Hash Embeddings for Efficient Word Representations" 中首次将哈希思想系统性地引入神经网络嵌入层。他们的关键创新是使用 $k$ 个独立哈希函数,每个函数将 token 映射到一个共享嵌入表的不同行,然后通过可学习的重要性权重对 $k$ 个查找结果加权求和。这种设计的精妙之处在于:单个哈希函数的碰撞率为 $1/B$,但 $k$ 个独立哈希函数同时碰撞的概率降至 $(1/B)^k$,指数级降低了碰撞对表达能力的损害。实验表明,在情感分析等任务上,Hash Embeddings 用不到标准嵌入十分之一的参数即可达到相当的性能。
Facebook(现 Meta)在推荐系统 DLRM 中面临极端的嵌入瓶颈——类别特征的词表可达数十亿。Shi 等人提出 Compositional Embedding(商余分解法),将 token ID 分解为商和余数,分别查两个小表再组合,本质上是一种结构化哈希。同期,Google 的 ALBERT(Lan 等人,2019)采用嵌入矩阵分解 $V \times d \to V \times e + e \times d$($e \ll d$),从矩阵低秩近似角度压缩嵌入。这些工作与哈希嵌入殊途同归,都在探索"如何用远少于 $V \times d$ 的参数表达 $V$ 个可区分的嵌入向量"。
Kang 等人提出 DHE(Deep Hash Embedding),用多层 MLP 将哈希编码映射为嵌入向量,进一步增强了哈希嵌入的表达能力。理论方面,研究者开始从 Johnson-Lindenstrauss 引理和压缩感知的角度分析哈希嵌入的信息保持能力,证明在一定条件下,$O(\log V)$ 量级的哈希维度即可近似保持词间距离关系。
MultiHashFormer 证明哈希嵌入不仅适用于判别任务,在自回归生成中同样有效。通过精心设计的多哈希组合策略和输出层高效共享机制,生成质量与全参数嵌入模型相当,而嵌入参数量减少一个数量级以上,为大词表生成模型的轻量化部署开辟了新路径。
标准嵌入层为每个 token $t \in \{1,...,V\}$ 维护独立向量 $\mathbf{e}_t \in \mathbb{R}^d$,参数量为 $V \times d$。当 $V = 256{,}000$、$d = 4096$ 时,仅嵌入层就占约 4GB(FP32)。哈希嵌入的核心构造:维护一个共享参数表 $\mathbf{T} \in \mathbb{R}^{B \times d}$($B \ll V$),以及 $k$ 个独立哈希函数 $h_i: \{1,...,V\} \to \{1,...,B\}$。对 token $t$,其嵌入为:$\mathbf{e}(t) = \sum_{i=1}^{k} w_i(t) \cdot \mathbf{T}[h_i(t)]$,其中 $w_i(t)$ 是可学习的标量权重,$\mathbf{T}[h_i(t)]$ 表示从共享表中查找第 $h_i(t)$ 行。参数量从 $V \times d$ 降至 $B \times d + k \times V$(权重部分),当 $B \ll V$ 且 $k$ 较小时压缩比显著。碰撞分析:两个不同 token $t_1 \neq t_2$ 在单个哈希函数下碰撞的概率为 $P(h_i(t_1) = h_i(t_2)) = 1/B$。若 $k$ 个哈希函数相互独立,则所有函数同时碰撞的概率为 $P(\forall i: h_i(t_1) = h_i(t_2)) = (1/B)^k$。例如 $B = 1024, k = 3$ 时,完全碰撞概率约 $10^{-9}$。这意味着即使两个 token 在某个哈希函数上碰撞,它们在其他哈希函数上大概率映射到不同行,加权组合后的嵌入向量仍然可区分。梯度流方面,反向传播时 $\partial L / \partial \mathbf{T}[j]$ 累积来自所有映射到第 $j$ 行的 token 的梯度,这种梯度共享起到隐式正则化作用,防止低频 token 的嵌入过拟合。
哈希嵌入的整体逻辑是:用哈希函数将"token → 嵌入"的一一映射替换为"token → 多个共享槽位 → 加权组合"的多对多映射,通过组合的唯一性恢复表达能力。
选择 $k$ 个相互独立的哈希函数 $h_1, ..., h_k$,每个将 token ID 映射到 $\{1, ..., B\}$。实践中常用 MurmurHash、xxHash 等非密码学哈希函数,因为它们计算极快(纳秒级)且分布均匀。关键设计选择在于 $k$ 和 $B$ 的取值:$k$ 越大碰撞概率越低,但计算和内存开销线性增长;$B$ 越大共享程度越低,压缩比下降。经验法则是 $k \in [2, 4]$,$B$ 取 $V$ 的 1/10 到 1/100。为什么不用一个大表?因为多个小表通过组合产生的有效容量为 $B^k$(组合爆炸),远大于单个大小为 $kB$ 的表。
对输入 token $t$,并行计算 $k$ 个哈希值 $h_1(t), ..., h_k(t)$,从共享表 $\mathbf{T}$ 中查找 $k$ 个向量。组合方式有多种选择:(a) 加权求和 $\sum_i w_i \cdot \mathbf{T}[h_i(t)]$,最常用,保持维度不变;(b) 拼接后投影 $\text{Linear}([\mathbf{T}[h_1(t)]; ...; \mathbf{T}[h_k(t)]])$,表达能力更强但增加参数;(c) 逐元素乘积 $\prod_i \mathbf