如何通过训练参数减少gensim fasttext模型的RAM消耗?
How to reduce RAM consumption of gensim fasttext model through training parameters?
在训练 gensim fasttext 模型时,什么 parameters 对生成的模型在内存中的大小影响最大?
gojomos 对 的回答提到了在训练期间减少模型大小的方法,除了减少嵌入维度。
似乎有几个参数可能会产生影响:尤其是在词汇表中包含单词的阈值。其他参数是否也影响模型大小,例如 ngram 范围,哪些参数影响最大?
我希望这个问题不会太懒:-)
影响FastText
模型大小的主要参数有:
vector_size
(维度)——模型的大小绝大多数是这个长度的一系列向量(包括全词和 n-gram)。因此,减少 vector_size
对总模型大小有直接的、很大的影响。
min_count
and/or max_final_vocab
- 通过影响有多少完整的单词被认为是模型 'known'(词汇表中),这些直接影响有多少批量向量在模型中。特别是如果你有足够大的训练数据,模型大小是一个问题 - 并且正在使用 FastText
- 你应该考虑 比默认值 min_count=5
更高的 值。只有少数用法示例的非常罕见的单词通常 不会 在类似 word2vec 的模型中学习良好的可概括表示。 (好的向量来自许多微妙对比的用法示例。)但是由于 Zipfian 分布,自然语言数据中通常有很多这样的词,它们 do 最终占用了大量训练时间,& tug against 其他词的训练,& 将更频繁的词从彼此的上下文中推出 windows。因此,在这种情况下,与许多人的直觉相反,丢弃一些数据(最稀有的词)通常可以改进最终模型。
bucket
——它准确地指定了模型学习 n-gram 向量的可能性,因为它们都共享一个无碰撞哈希映射。也就是说,无论训练数据中确实有多少独特的 n-gram,它们都将被强制放入恰好这么多的向量中。 (本质上,稀有的 n-gram 经常会与更频繁的 n-gram 发生冲突,并且只是背景噪音。)
值得注意的是,由于 bucket
大小的 hashmap 可以容忍冲突,参数 min_n
& max_n
实际上 不会 完全影响模型大小。无论它们允许大量的多种大小的 n-gram,还是更少的 single/smaller 大小范围,它们都会被塞进相同数量的 bucket
中。 (如果使用更多的 n-grams,更大的 bucket
值可能有助于减少碰撞,并且使用更多的 n-grams,训练时间会更长。但是模型只会随着更大的 bucket
增长,没有不同的 min_n
和 max_n
值。)
您可以通过使用 .save()
将模型保存到磁盘来了解模型的 RAM 大小 - 创建的多个相关文件(未压缩)的大小大致与 RAM 大小相似模型所需要的。因此,您可以通过 运行 较小模型的可变参数实验,并观察它们不同的 .save()
尺寸,来提高您对不同参数如何改变模型尺寸的直觉。 (请注意,您实际上不必 .train()
这些模型 - 一旦 .build_vocab()
步骤完成,它们将占用全部分配的大小。)
在训练 gensim fasttext 模型时,什么 parameters 对生成的模型在内存中的大小影响最大?
gojomos 对
似乎有几个参数可能会产生影响:尤其是在词汇表中包含单词的阈值。其他参数是否也影响模型大小,例如 ngram 范围,哪些参数影响最大?
我希望这个问题不会太懒:-)
影响FastText
模型大小的主要参数有:
vector_size
(维度)——模型的大小绝大多数是这个长度的一系列向量(包括全词和 n-gram)。因此,减少vector_size
对总模型大小有直接的、很大的影响。min_count
and/ormax_final_vocab
- 通过影响有多少完整的单词被认为是模型 'known'(词汇表中),这些直接影响有多少批量向量在模型中。特别是如果你有足够大的训练数据,模型大小是一个问题 - 并且正在使用FastText
- 你应该考虑 比默认值min_count=5
更高的 值。只有少数用法示例的非常罕见的单词通常 不会 在类似 word2vec 的模型中学习良好的可概括表示。 (好的向量来自许多微妙对比的用法示例。)但是由于 Zipfian 分布,自然语言数据中通常有很多这样的词,它们 do 最终占用了大量训练时间,& tug against 其他词的训练,& 将更频繁的词从彼此的上下文中推出 windows。因此,在这种情况下,与许多人的直觉相反,丢弃一些数据(最稀有的词)通常可以改进最终模型。bucket
——它准确地指定了模型学习 n-gram 向量的可能性,因为它们都共享一个无碰撞哈希映射。也就是说,无论训练数据中确实有多少独特的 n-gram,它们都将被强制放入恰好这么多的向量中。 (本质上,稀有的 n-gram 经常会与更频繁的 n-gram 发生冲突,并且只是背景噪音。)
值得注意的是,由于 bucket
大小的 hashmap 可以容忍冲突,参数 min_n
& max_n
实际上 不会 完全影响模型大小。无论它们允许大量的多种大小的 n-gram,还是更少的 single/smaller 大小范围,它们都会被塞进相同数量的 bucket
中。 (如果使用更多的 n-grams,更大的 bucket
值可能有助于减少碰撞,并且使用更多的 n-grams,训练时间会更长。但是模型只会随着更大的 bucket
增长,没有不同的 min_n
和 max_n
值。)
您可以通过使用 .save()
将模型保存到磁盘来了解模型的 RAM 大小 - 创建的多个相关文件(未压缩)的大小大致与 RAM 大小相似模型所需要的。因此,您可以通过 运行 较小模型的可变参数实验,并观察它们不同的 .save()
尺寸,来提高您对不同参数如何改变模型尺寸的直觉。 (请注意,您实际上不必 .train()
这些模型 - 一旦 .build_vocab()
步骤完成,它们将占用全部分配的大小。)