【发布时间】:2019-12-19 11:28:25
【问题描述】:
我想在不同的语料库上训练两个 word2vec/GLoVe 模型,然后比较单个单词的向量。我知道这样做是没有意义的,因为不同的模型从不同的随机状态开始,但是如果我们使用预先训练的词向量作为起点呢?我们是否可以假设这两个模型将通过结合各自的领域特定知识继续建立在预训练向量的基础上,而不是进入完全不同的状态?
试图找到一些讨论这个问题的研究论文,但没有找到。
【问题讨论】:
我想在不同的语料库上训练两个 word2vec/GLoVe 模型,然后比较单个单词的向量。我知道这样做是没有意义的,因为不同的模型从不同的随机状态开始,但是如果我们使用预先训练的词向量作为起点呢?我们是否可以假设这两个模型将通过结合各自的领域特定知识继续建立在预训练向量的基础上,而不是进入完全不同的状态?
试图找到一些讨论这个问题的研究论文,但没有找到。
【问题讨论】:
简单地使用预训练的 bector 开始您的模型会消除一些随机性,但是在您的新语料库上的每个训练时期:
sample 参数的默认值)以及不同线程的相互作用仍然会引入随机性因此,这样做不一定能以可靠(或理论上可辩护)的方式实现您的目标,尽管它可能有点工作 - 至少比从纯粹随机初始化开始更好 - 特别是如果您的语料库很小并且您做几个训练时期。 (这通常是一个坏主意——你想要大量不同的训练数据和足够的通过次数来增加额外的通过次数,以产生很小的增量差异。但是在这种情况下,做这些“错误”的事情可能会让你的结果看起来“更好”,在这种情况下,你不想要您的训练“太多”地改变了原始坐标空间。我不会依赖这种方法。)
特别是如果您需要比较的单词只是总词汇量的一小部分,您可以考虑以下几点:
将语料库组合成一个训练语料库,混在一起,但是对于您需要比较的那些单词,将它们替换为语料库特定的标记。例如,将'sugar' 替换为'sugar_c1' 和'sugar_c2'——让周围的绝大多数单词都是相同的标记(从而在整个语料库中学习一个向量)。然后,“同一个词”的两个变体标记将学习不同的向量,基于它们仍然共享许多相同标记的不同上下文。
使用您知道(或有把握地推测)的一些“锚集”单词在两种上下文中的含义相同,或者 应该 含义相同,训练两个模型但学习一个基于这些引导词在两个空间之间进行转换。然后,当您将该转换应用于其他未用于学习转换的单词时,它们将落在彼此空间中的对比位置,也许实现您需要的比较。这是一种用于语言到语言翻译的技术,Python gensim 库中包含 helper class 和 example notebook。
可能还有其他更好的方法,这只是两个快速的想法,无需对现有库进行太多更改即可工作。像“HistWords”这样的项目,它使用词向量训练来尝试跟踪词义随时间的变化,也可能对可用技术有想法。
【讨论】: