融合fastText与Bloom的紧凑向量嵌入技术

floret扩展了fastText,通过Bloom嵌入和多重哈希技术生成紧凑的全覆盖词向量表,支持任意词汇的向量表示,可与spaCy无缝集成。

floret: fastText + Bloom embeddings for compact, full-coverage vectors with spaCy

floret是fastText的扩展版本,能够从紧凑的向量表中为任何词汇生成词表示。它结合了:

  • fastText的子词功能,为任何词汇提供嵌入
  • Bloom嵌入(“哈希技巧”)实现紧凑的向量表

安装floret

从源码构建

1
2
3
git clone https://github.com/explosion/floret
cd floret
make

这将生成主要的二进制文件floret

Python安装

使用pip安装Python封装:

1
pip install floret

或从源码以开发者模式安装:

1
2
3
4
git clone https://github.com/explosion/floret
cd floret
pip install -r requirements.txt
pip install --no-build-isolation --editable .

使用方法

floret向fasttext添加了两个额外的命令行选项:

1
2
-mode        fasttext(默认)或floret(词汇和字符n-grams在桶中哈希)[fasttext]
-hashCount   floret模式专用:每个词汇/子词的哈希数量(1-4)[1]

使用-mode floret时,词汇条目与子词嵌入(桶)存储在同一表中,减少了保存的向量数据大小。使用-hashCount 2时,每个条目在内部子词哈希表中存储为两行的和。floret支持在嵌入表中每个条目使用1-4个哈希。通过在嵌入表中将条目存储为多个行的和,可以在对性能和速度影响相对较小的情况下大幅减少表中的行数。

以下是训练CBOW嵌入的示例,使用4-grams和5-grams子词,每个条目2个哈希,紧凑表大小为50K条目而非默认的2M条目:

1
2
floret cbow -dim 300 -minn 4 -maxn 5 -mode floret -hashCount 2 -bucket 50000 \
-input input.txt -output vectors

使用-mode floret选项时,floret将保存一个额外的向量表,文件扩展名为.floret。该格式与.vec非常相似,包含一个标题行,后跟每行一个向量。词汇标记被替换为行索引,标题扩展为包含在spaCy中加载此表所需的所有相关训练设置。

要在spaCy v3.2+中导入此向量表:

1
spacy init vectors LANG vectors.floret spacy_vectors_dir --mode floret

floret工作原理

在原始实现中,fastText将词汇和子词存储在两个单独的表中。词汇表包含词汇表中的每个词汇(通常约1M条目),子词通过将每个子词哈希到表中的一行存储在单独的固定大小表中(默认2M条目)。使用相对较大的表来减少子词之间的冲突。然而,对于1M词汇 + 2M子词,300维32位浮点向量,需要约3GB存储结果数据,这对许多用例来说是不可行的。

此外,许多导入向量的库仅支持词汇表(.vec),这将覆盖范围限制在训练数据中频率高于一定阈值的词汇。对于形态丰富的语言,即使是大向量表也可能无法为训练中见过的词汇提供良好覆盖,并且仍然可能遇到训练中完全未见过的词汇。

为了以更紧凑的格式存储词汇和子词向量,我们转向spaCy一直使用的算法:Bloom嵌入。Bloom嵌入(也称为"哈希技巧",或在spaCy的ML库thinc中称为HashEmbed)可用于通过将每个条目哈希到表中的多行来在紧凑表中存储不同的表示。通过将每个条目表示为多个行的和,其中两个条目不太可能在同一多个哈希上冲突,大多数条目最终将获得不同的表示。

使用设置-minn 4 -maxn 5 -mode floret -hashCount 2,词汇apple的嵌入在内部存储为每个词汇、4-grams和5-grams的2个哈希行的和。词汇用BOW和EOW字符<>填充,创建以下词汇和子词条目:

1
2
3
4
5
6
7
8
<apple>
<app
appl
pple
ple>
<appl
apple
pple>

为了与spaCy兼容,使用MurmurHash哈希词汇和字符n-gram字符串。apple的最终嵌入是上述每个词汇和字符n-gram的两个行(-hashCount 2)的和。

使用-mode floret时,floret将保存一个额外的向量表,扩展名为.floret,与通常的.bin.vec文件一起。该格式与.vec非常相似,包含一个标题行,后跟向量表中每个条目一行,行首是行索引而非词汇标记。标题扩展为包含在另一个应用程序或库(如spaCy)中使用此表所需的所有训练设置。

标题包含空格分隔的设置:

1
bucket dim minn maxn hashCount hashSeed BOW EOW

演示.floret表,使用-bucket 10 -dim 10 -minn 2 -maxn 3 -hashCount 2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
10 10 2 3 2 2166136261 < >
0 -2.2611 3.9302 2.6676 -11.233 0.093715 -10.52 -9.6463 -0.11853 2.101 -0.10145
1 -3.12 -1.7981 10.7 -6.171 4.4527 10.967 9.073 6.2056 -6.1199 -2.0402
2 9.5689 5.6721 -8.4832 -1.2249 2.1871 -3.0264 -2.391 -5.3308 -3.2847 -4.0382
3 3.6268 4.2759 -1.7007 1.5002 5.5266 1.8716 -12.063 0.26314 2.7645 2.4929
4 -11.683 -7.7068 2.1102 2.214 7.2202 0.69799 3.2173 -5.382 -2.0838 5.0314
5 -4.3024 8.0241 2.0714 -1.0174 -0.28369 1.7622 7.8797 -1.7795 6.7541 5.6703
6 8.3574 -5.225 8.6529 8.5605 -8.9465 3.767 -5.4636 -1.4635 -0.98947 -0.58025
7 -10.01 3.3894 -4.4487 1.1669 -11.904 6.5158 4.3681 0.79913 -6.9131 -8.687
8 -5.4576 7.1019 -8.8259 1.7189 4.955 -8.9157 -3.8905 -0.60086 -2.1233 5.892
9 8.0678 -4.4142 3.6236 4.5889 -2.7611 2.4455 0.67096 -4.2822 2.0875 4.6274

此表可以使用spaCy v3.2+中的spacy init vectors命令导入,选项--mode floret

1
spacy init vectors LANG vectors.floret spacy_vectors_dir --mode floret

注意事项

fastText和floret二进制格式(.bin)不兼容,因此必须使用训练时相同的程序加载.bin文件。有关所有其他命令和选项的详细信息,请参阅fastText文档。floret支持所有现有的fasttext命令,并且不修改任何fasttext默认值。

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