我想训练一个单词可预测性任务以生成单词嵌入。文档集合包含243K文档。代码实现在火炬中。我正在为数据集的巨大规模而苦苦挣扎,并且需要关于如何在如此大的数据集中培训单词嵌入的想法,该数据集是24.3万张全文文档的集合。研究计算资源是定时的,因此可以简短访问GPU节点,因此选择了增量模型培训:

  1. 增量模型培训:在整个数据集上培训的一种方法是使用增量模型培训,该模型训练是在数据的一部分上训练模型并保存它。后来,选择了相同的预训练模型,然后开始对其进行培训。我在这种方法中面临的问题是,我如何维护单词的词汇/字典。在单词嵌入方法中,词典/词汇词起着重要的作用。我们浏览所有文档,并创建数量大于最小设置频率的单词词汇。现在,实际上,此词汇是一张哈希地图,它与每个单词相关联,在训练样本中,我们在词汇中替换了单词,以使模型的简单性替换为词汇。在逐步培训的情况下,如何逐步创建字典?我是否必须在整个文档上创建词汇/字典,然后逐步训练?还是在增量训练中扩展词汇的一种方法?
  2. 另一个问题是对词汇数据结构大小的内存限制。我正在基于LUA的火炬中实施我的模型。因此,Lua对桌子的尺寸限制了,我无法在单个表中加载整个文档的词汇。如何克服此类记忆问题?
  3. 从手套向量中汲取灵感。他们在论文中说,他们“我们对五个不同尺寸的公司进行了训练:2010年的Wikipedia垃圾场,带有10亿个令牌; 2014年的Wikipedia垃圾场,有16亿个to-kens; Gigaword 5具有43亿个令牌; Gigaword5 + Wikipedia2014的组合,具有60亿个令牌;以及来自Common Crawl5的Web数据的420亿个令牌。我们用斯坦福标记器来代币和镇压每个语料库,构建400,000个最常见单词的词汇6,然后构建一个共同发生的矩阵计数x”。关于如何在如此大的语料库和大型词汇训练的手套媒介以及他们案件中的记忆限制如何处理的任何想法?纸参考 - http://nlp.stanford.edu/pubs/glove.pdf
  4. 关于如何限制数据集的大小以生成单词嵌入的任何想法?它将如何影响文档数量增加或减少单词嵌入的性能或覆盖范围?使用采样技术从数据集采样文档是一个好主意吗?如果是,请建议一些采样技术。
有帮助吗?

解决方案

您也许可以通过TDS库克服内置的内存限制,该库使您可以构建不受LUA的内存帽的限制或无限的等效结构。这无助于硬件的限制,但是您将能够拥有大于2 GB的桌子。

https://github.com/torch/tds

另外,如果所有其他方法都失败了,则可以考虑将词汇划分为较小的桌子。然后,当您需要访问它时,您将拥有某种主表,其中您可以在其中查找正确的词汇表,以了解所需的元素。这需要对您的词汇进行排序,因此您仍然必须立即将其全部存储在记忆中(或者我猜是实现自己的狡猾分类算法),但是只要您的词汇表,您只需要一次执行此操作保持恒定。然后,您将所有词汇表序列化,然后将它们从所需的磁盘上加载,这将很慢,但比填充身体记忆并吃掉交换空间的速度更快。大概。

其他提示

我不熟悉火炬,但是由于基本上考虑了Word2Vec和doc2vec,因此这些模型从每个句子中学习,因此无需在内存中拥有所有句子。您可以通过语料库中的每个句子迭代,并让模型从每个句子中学习。这可能就是人们在具有或没有高计算机的大型语料库上训练的方式。

Python中的一个简短例子:

class SentenceIterator(object):
   def __iter__(file_name):
      for line in open(file_name)
         yield line

sentences = SentenceIterator("path/to/file")
for line in sentences:
    model.train(line)

这样,内存一次仅加载一个句子,完成后,内存加载下一个句子。为了构建词汇,您可以通过所有文档进行整个迭代,以首先构建词汇,然后根据实现的单词插件函数来训练数据。

许可以下: CC-BY-SA归因
scroll top