使用Bloom嵌入压缩词向量

本文介绍了一种利用Bloom嵌入技术压缩词向量的方法,通过哈希函数将词汇映射到共享的向量空间,显著减小模型体积,同时保持语义表达能力。

在自然语言处理中,高覆盖率的词嵌入表通常体积庞大。例如,100万个300维的32位浮点向量将占用1.2GB内存。传统压缩方法包括缩减词汇量、降低向量维度或减少位宽,但本文提出了一种创新方案:利用概率数据结构实现压缩

Bloom嵌入算法原理

常规嵌入表中,每个单词对应唯一ID作为索引。而Bloom嵌入让所有单词共享向量空间:通过多个哈希函数将单词映射到不同行,最终向量为这些行向量的和。例如:

1
2
3
4
def get_vector(table, word):
    hash1 = mmh3.hash(word, seed=0) % table.shape[0]
    hash2 = mmh3.hash(word, seed=1) % table.shape[0]
    return table[row1] + table[row2]

这种设计使得20个单词可通过15个向量实现唯一表示,碰撞概率极低。实验显示,在20个词汇的小型测试中,双哈希策略实现了零碰撞。

实际应用

  1. 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)
    
  2. floret扩展
    改进fastText的子词机制:将单词和子词向量存入同一哈希表,双哈希策略使50K向量即可处理韩语等黏着语,性能超越传统800K向量模型:

    向量类型 依存分析UAS 准确率提升
    无预训练 72.5 -
    floret(50K) 82.8 +10.3

该方法特别适合处理拼写错误、长复合词和形态丰富的语言。相关实现已开源,包含英语、芬兰语、韩语等演示项目。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计