Python 使用gensim的Word2vec培训在100K句之后开始交换

Python 使用gensim的Word2vec培训在100K句之后开始交换,python,numpy,blas,gensim,word2vec,Python,Numpy,Blas,Gensim,Word2vec,我正在尝试使用一个大约170K行的文件来训练word2vec模型,每行一句话 我想我可以代表一个特殊的用例,因为“句子”有任意的字符串,而不是字典中的单词。每个句子(行)大约有100个单词,每个“单词”大约有20个字符,包括像“/”这样的字符和数字 培训代码非常简单: # as shown in http://rare-technologies.com/word2vec-tutorial/ import gensim, logging, os logging.basicConfig(forma

我正在尝试使用一个大约170K行的文件来训练word2vec模型,每行一句话

我想我可以代表一个特殊的用例,因为“句子”有任意的字符串,而不是字典中的单词。每个句子(行)大约有100个单词,每个“单词”大约有20个字符,包括像
“/”
这样的字符和数字

培训代码非常简单:

# as shown in http://rare-technologies.com/word2vec-tutorial/
import gensim, logging, os

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.split()

current_dir = os.path.dirname(os.path.realpath(__file__))

# each line represents a full chess match
input_dir = current_dir+"/../fen_output"
output_file = current_dir+"/../learned_vectors/output.model.bin"

sentences = MySentences(input_dir)

model = gensim.models.Word2Vec(sentences,workers=8)
事情是,事情进展非常快,多达10万句(我的内存稳步上升),但我的内存用完了,我可以看到我的电脑开始交换,训练研磨停止。我没有太多可用的RAM,只有大约4GB,在开始交换之前,
word2vec
会耗尽所有内存

我想我已经将OpenBLAS正确链接到numpy:这是
numpy.show\u config()
告诉我的:

blas_info:
  libraries = ['blas']
  library_dirs = ['/usr/lib']
  language = f77
lapack_info:
  libraries = ['lapack']
  library_dirs = ['/usr/lib']
  language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
  libraries = ['openblas']
  library_dirs = ['/usr/lib']
  language = f77
openblas_info:
  libraries = ['openblas']
  library_dirs = ['/usr/lib']
  language = f77
lapack_opt_info:
  libraries = ['lapack', 'blas']
  library_dirs = ['/usr/lib']
  language = f77
  define_macros = [('NO_ATLAS_INFO', 1)]
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
  NOT AVAILABLE
atlas_info:
  NOT AVAILABLE
atlas_3_10_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE
我的问题是:在一台没有很多可用RAM的机器上(比如我的)会出现这种情况吗?我应该获得更多的RAM或者将模型训练成更小的部分?或者我的设置是否看起来配置不正确(或者我的代码效率低下)?

先谢谢你

我的设置是否没有正确配置(或者我的代码没有正确配置) 低效的

1) 一般来说,我会说不。然而,考虑到你只有少量的RAM,我会使用更少的工人。这会减慢训练速度,但也许你可以通过这种方式避免交换

2) 你可以尝试使用词干或更好的方法:柠檬化。您将减少单词的数量,因为,例如,单数和复数形式将被视为同一个单词


3) 然而,我认为4GB的RAM可能是您的主要问题(除了您的操作系统,您可能只有1-2 GB的内存可供进程/线程实际使用。我真的会考虑投资更多的RAM。例如,现在您可以以<100美元的价格获得良好的16 GB RAM套件,但是,如果您有一些钱为普通ML/数据科学投资一个像样的RAM任务,我推荐>64 GB作为首要原则,如果您的预算和机器能够管理,您应该始终获得更多的RAM。这样可以节省大量时间和麻烦

第二,不清楚你的意思是,在一个超过10万句的数据集上,训练在遇到前10万句之后开始减速,还是说使用任何超过10万句的数据集都会减速。我怀疑是后者,因为

Word2Vec内存使用量是词汇表大小(令牌计数)的函数,而不是用于训练的数据总量。因此,您可能希望使用更大的
min\u计数
,以减少跟踪的单词数,从而限制训练期间的RAM使用量。(在训练过程中,没有被模型跟踪的单词会被无声地丢弃,就好像它们不在那里一样——而对罕见的单词这样做并不会造成太大伤害,有时甚至会有帮助,因为其他单词会彼此靠近。)

最后,您可能希望避免在构造函数中提供语料库语句(自动扫描和训练),而是在构建模型后自己显式调用
build\u vocab()
train()
步骤,以检查模型的状态/大小,并根据需要调整参数

特别是,在最新版本的gensim中,您还可以将
build\u vocab(corpus)
步骤分为三个步骤
scan\u vocab(corpus)
scale\u vocab(…)
,和
finalize\u vocab()

音阶(…)步骤可以使用
dry\u run=True
参数调用,该参数预览在尝试
min\u count
sample
参数的不同值后,您的词汇表、二次抽样语料库和预期内存使用量将有多大。当您找到似乎可以管理的值时,可以调用
scale\u vocab(…)
使用这些选择的参数,而不使用
dry\u run
,将它们应用于您的模型(然后
finalize\u vocab()
初始化大型阵列)