Performance 将Word2Vec模型高效地投入生产服务

Performance 将Word2Vec模型高效地投入生产服务,performance,production,data-science,word2vec,dimensionality-reduction,Performance,Production,Data Science,Word2vec,Dimensionality Reduction,这有点遥不可及,但我希望有人也遇到过类似的情况,因为我正在寻找一些建议,如何有效地将一组大型word2vec模型引入到生产环境中 我们有一系列训练有素的w2v模型,维数为300。由于潜在的数据-庞大的语料库和词性标记词;具有多达一百万个单词的专业词汇表——这些模型变得相当大,我们目前正在寻找有效的方法,如何向我们的用户公开这些词汇表,而不必在基础设施方面付出太高的代价 除了试图更好地控制词汇量之外,显然,对特征向量进行降维也是一种选择。有人知道这方面的出版物吗,特别是关于这将如何影响模型质量的出

这有点遥不可及,但我希望有人也遇到过类似的情况,因为我正在寻找一些建议,如何有效地将一组大型word2vec模型引入到生产环境中

我们有一系列训练有素的w2v模型,维数为300。由于潜在的数据-庞大的语料库和词性标记词;具有多达一百万个单词的专业词汇表——这些模型变得相当大,我们目前正在寻找有效的方法,如何向我们的用户公开这些词汇表,而不必在基础设施方面付出太高的代价

除了试图更好地控制词汇量之外,显然,对特征向量进行降维也是一种选择。有人知道这方面的出版物吗,特别是关于这将如何影响模型质量的出版物,以及如何最好地衡量这一点

另一个选项是预先计算每个词汇表单词的前X个最相似单词,并提供查找表。由于型号太大,目前效率也很低。是否有任何已知的启发式方法可用于将必要的距离计算数量从nxn-1减少到较低的数量


多谢各位

在高维空间中有用于相似性搜索的预索引技术,可以加快最近邻发现,但通常以绝对准确性为代价。(索引也需要更多内存。)

一个例子是。gensim项目包括一个项目

我曾经在Word2Vec模型中使用16位(而不是32位)浮点值做过一些实验。它在空闲状态下节省了内存,最近邻top-N结果几乎没有变化。但是,可能是因为在“一对一”距离计算过程中仍发生了一些到32位浮点的幕后上转换,操作速度实际上降低了。(这表明每次距离计算都可能导致临时内存扩展,抵消了任何空闲状态的节省。)因此这不是一个快速解决方案,但进一步的研究——可能涉及为float16阵列操作找到/实现正确的例程——可能意味着模型尺寸节省50%,速度相当甚至更好

对于许多应用程序来说,丢弃最不频繁的单词不会造成太大的伤害,甚至在训练之前丢弃,也可以提高剩余向量的质量。由于包括gensim在内的许多实现都以从高到低的频率对单词向量数组进行排序,因此可以放弃数组的尾部以节省内存,或者将
most_simular()
搜索限制为前N个条目以加快计算

在最小化词汇表大小后,您需要确保完整的集合在RAM中,并且在(典型的)完整扫描距离计算期间不会触发交换。如果需要多个进程来提供来自同一向量集的答案,就像在多核机器上的web服务中一样,gensim的内存映射操作可以防止每个进程加载自己的向量冗余副本。您可以在本文中看到有关此技术的讨论


最后,虽然为较大的词汇表预计算top-N邻居既耗时又占用大量内存,但如果您的访问模式使得某些令牌的检查次数远远超过其他令牌,缓存N个最近请求或M个最频繁请求的top-N可以极大地提高感知性能——仅使请求频率较低的邻居列表需要计算到每个其他令牌的完整距离

非常感谢您的详细回答、想法以及到烦恼库的链接和相关问题!不幸的是,我们在生产中受到Java的限制,无法运行Python服务。不过,我将调查浮动16操作的想法。就我们的目的而言,我们实际上对低频相似词非常感兴趣,所以过滤是我只会犹豫应用的东西。我将尝试一些想法,我在本文中发现:。我认为我们需要建立自己的评估数据集来评估模型质量的变化。