如何使用经过训练的模型创建模型?
How to create a model using trained models?
我使用 gensim word2vec 创建了两个模型。现在我想合并这两个模型,以得到这两个模型的联合。
例如:
1. 模型一有以下词汇
{"Hi", "Hello", "World"}
2. 模型二有以下词汇
{"Hi", "King", "Hello", "Human"}
现在我想使用这两个模型并创建一个具有以下词汇表的新模型
{"Hi", "Hello", "World", "King", "Human"}
word2vec 模型将为您提供单词的向量表示(在其词汇表中)。向量表示使得向量之间的距离对于相似的词(语义上)是最小的。
你有两个模型在两个不同的语料库上训练(所以你有两个不同的词汇表)。没有办法在不失去表征能力的情况下将两个模型组合成一个模型(即相似的词在向量形式上彼此更接近)。
唯一的办法就是获取两个语料库,追加它们并训练一个新的word2vec模型。
常见的 word2vec 库,如 gensim,不提供这种合并模型的功能。本质上,模型内单词的坐标仅在距离和方向方面与同一模型中的其他单词具有可比性——只有通过将增量训练放在一起,它们才能被推到有意义的相对位置。
正如@mujiga 的回答所暗示的那样,最直接的方法是将包含所有所需单词的两个训练语料库结合起来,并在结合后的文本上训练一个新模型。 (理想情况下,您可以将两个语料库混合在一起,而不是简单地将它们连接起来,这样就不会出现只出现在整套文本的开头或结尾的单词。)
当有很多重叠词时,可以采用更复杂的方法。您可以选择两个 "spaces" 之一作为您想要保留的坐标系——可能是单词更多的那个,已经接受了更多文本的训练。称之为 'reference' 模型。
您将获取两个模型之间共享的大量单词(可能是全部),并学习一个 'translation' 操作,将这些单词在较小模型中的坐标投影到大致正确的位置对于参考模型中的那些相同的词。 (这本身就是一个典型的数学优化问题。)最后,您将对非共享词使用该翻译操作,将较小模型的坐标转换为参考模型坐标 space – 然后构造一个包含所有原始参考向量以及翻译向量的新数据结构。
这是 one of the original word2vec papers for machine translation. It's also mentioned in section 2.2 of the skip-thoughts paper as a way to leverage words from another source when they don't appear in a local corpus. There's currently (August 2017) some work-in-progress to add a facility for learning-the-translation 在 gensim 中使用的技术,但尚未 fully-tested/documented 或任何正式版本的一部分。
但实际上:安全和直接的做法是在通用语料库上训练新模型。
创建合并模型的一种方法是使用在线 Word2vec 扩展其中一个经过训练的模型。假设您训练有素的 word2vec 模型在其词汇表中包含以下单词:
{"Hi", "Hello", "World"}
现在在模型中包含新词
model.build_vocab(new_sentences, update=True)
model.train(new_sentences)
使用 model.save(model_name)
保存模型以保存和加载以进一步训练它。
我使用 gensim word2vec 创建了两个模型。现在我想合并这两个模型,以得到这两个模型的联合。
例如:
-
1. 模型一有以下词汇
{"Hi", "Hello", "World"}
-
2. 模型二有以下词汇
{"Hi", "King", "Hello", "Human"}
现在我想使用这两个模型并创建一个具有以下词汇表的新模型
{"Hi", "Hello", "World", "King", "Human"}
word2vec 模型将为您提供单词的向量表示(在其词汇表中)。向量表示使得向量之间的距离对于相似的词(语义上)是最小的。
你有两个模型在两个不同的语料库上训练(所以你有两个不同的词汇表)。没有办法在不失去表征能力的情况下将两个模型组合成一个模型(即相似的词在向量形式上彼此更接近)。
唯一的办法就是获取两个语料库,追加它们并训练一个新的word2vec模型。
常见的 word2vec 库,如 gensim,不提供这种合并模型的功能。本质上,模型内单词的坐标仅在距离和方向方面与同一模型中的其他单词具有可比性——只有通过将增量训练放在一起,它们才能被推到有意义的相对位置。
正如@mujiga 的回答所暗示的那样,最直接的方法是将包含所有所需单词的两个训练语料库结合起来,并在结合后的文本上训练一个新模型。 (理想情况下,您可以将两个语料库混合在一起,而不是简单地将它们连接起来,这样就不会出现只出现在整套文本的开头或结尾的单词。)
当有很多重叠词时,可以采用更复杂的方法。您可以选择两个 "spaces" 之一作为您想要保留的坐标系——可能是单词更多的那个,已经接受了更多文本的训练。称之为 'reference' 模型。
您将获取两个模型之间共享的大量单词(可能是全部),并学习一个 'translation' 操作,将这些单词在较小模型中的坐标投影到大致正确的位置对于参考模型中的那些相同的词。 (这本身就是一个典型的数学优化问题。)最后,您将对非共享词使用该翻译操作,将较小模型的坐标转换为参考模型坐标 space – 然后构造一个包含所有原始参考向量以及翻译向量的新数据结构。
这是 one of the original word2vec papers for machine translation. It's also mentioned in section 2.2 of the skip-thoughts paper as a way to leverage words from another source when they don't appear in a local corpus. There's currently (August 2017) some work-in-progress to add a facility for learning-the-translation 在 gensim 中使用的技术,但尚未 fully-tested/documented 或任何正式版本的一部分。
但实际上:安全和直接的做法是在通用语料库上训练新模型。
创建合并模型的一种方法是使用在线 Word2vec 扩展其中一个经过训练的模型。假设您训练有素的 word2vec 模型在其词汇表中包含以下单词:
{"Hi", "Hello", "World"}
现在在模型中包含新词
model.build_vocab(new_sentences, update=True)
model.train(new_sentences)
使用 model.save(model_name)
保存模型以保存和加载以进一步训练它。