在自然语言处理中,高覆盖率的词嵌入表通常体积庞大。例如,100万个300维的32位浮点向量将占用1.2GB内存。传统压缩方法包括缩减词汇量、降低向量维度或减少位宽,但本文提出了一种创新方案:利用概率数据结构实现压缩。
Bloom嵌入算法原理
常规嵌入表中,每个单词对应唯一ID作为索引。而Bloom嵌入让所有单词共享向量空间:通过多个哈希函数将单词映射到不同行,最终向量为这些行向量的和。例如:
|
|
这种设计使得20个单词可通过15个向量实现唯一表示,碰撞概率极低。实验显示,在20个词汇的小型测试中,双哈希策略实现了零碰撞。
实际应用
-
spaCy中的实现
MultiHashEmbed
架构使用4个哈希种子生成ORTH/PREFIX等属性的嵌入,12,500个96维向量仅占用5MB。关键代码:1 2
rows = ops.hash(orths, seed) % nr_hash_vector vocab_vectors = hash_vectors[rows].sum(axis=1)
-
floret扩展
改进fastText的子词机制:将单词和子词向量存入同一哈希表,双哈希策略使50K向量即可处理韩语等黏着语,性能超越传统800K向量模型:向量类型 依存分析UAS 准确率提升 无预训练 72.5 - floret(50K) 82.8 +10.3
该方法特别适合处理拼写错误、长复合词和形态丰富的语言。相关实现已开源,包含英语、芬兰语、韩语等演示项目。