如何从训练有素的 world2vec 模型 gensim 中取回超参数?
How to get back hyperparameters from a trained world2vec model gensim?
我有一个训练有素的 word2vec 模型,我需要用更多数据进一步训练它。我也想使用在为新模型训练模型时使用的相同超参数。但我不想对其进行硬编码。有没有一种方法可以用来获取在训练现有模型时使用的超参数。
我正在使用 Gensim word2vec。
使用save
和load
方法
模型训练完成后,将模型保存到磁盘。对于重新训练,加载保存的模型,如果您的新训练数据有任何看不见的词,请更新词汇表并重新开始训练。查看官方文档 here.
工作示例(内联注释)
from gensim.models import Word2Vec
import numpy as np
# Stage 1
sentences = ["an apple on the tree".split(), "a cat on the table".split()]
model = Word2Vec(min_count=1)
model.build_vocab(sentences) # prepare the model vocabulary
model.train(sentences, total_examples=model.corpus_count, epochs=2) # Train
model.save("word2vec.model") # Save the model
s1 = np.sum(model.wv.vectors[0]) # Get the vector sum of 'a' for testing
print (model.wv.vocab)
print ("\n")
# Stage 2
sentences = ["sky is high".split(), "ocean is blue".split()]
model = Word2Vec.load("word2vec.model") # Load the last saved model
model.build_vocab(sentences, update=True) # prepare the model vocabulary
model.train(sentences, total_examples=model.corpus_count, epochs=2) # Train
# since 'a' is not in new train data its vector(word2vec)) should remain same
assert s1 == np.sum(model.wv.vectors[0])
print (model.wv.vocab)
输出:
{'a': <gensim.models.keyedvectors.Vocab at 0x7fd378f84e10>,
'an': <gensim.models.keyedvectors.Vocab at 0x7fd378fb7810>,
'apple': <gensim.models.keyedvectors.Vocab at 0x7fd378fb7e90>,
'cat': <gensim.models.keyedvectors.Vocab at 0x7fd378f84b10>,
'on': <gensim.models.keyedvectors.Vocab at 0x7fd3764695d0>,
'table': <gensim.models.keyedvectors.Vocab at 0x7fd378f84950>,
'the': <gensim.models.keyedvectors.Vocab at 0x7fd376469490>,
'tree': <gensim.models.keyedvectors.Vocab at 0x7fd376469b50>}
{'a': <gensim.models.keyedvectors.Vocab at 0x7fd3797f3850>,
'an': <gensim.models.keyedvectors.Vocab at 0x7fd376469fd0>,
'apple': <gensim.models.keyedvectors.Vocab at 0x7fd375b8efd0>,
'blue': <gensim.models.keyedvectors.Vocab at 0x7fd37649a9d0>,
'cat': <gensim.models.keyedvectors.Vocab at 0x7fd37649a450>,
'high': <gensim.models.keyedvectors.Vocab at 0x7fd37649afd0>,
'is': <gensim.models.keyedvectors.Vocab at 0x7fd37649aa90>,
'ocean': <gensim.models.keyedvectors.Vocab at 0x7fd37649a7d0>,
'on': <gensim.models.keyedvectors.Vocab at 0x7fd375b8ef50>,
'sky': <gensim.models.keyedvectors.Vocab at 0x7fd378f79ed0>,
'table': <gensim.models.keyedvectors.Vocab at 0x7fd37649a850>,
'the': <gensim.models.keyedvectors.Vocab at 0x7fd375b8eed0>,
'tree': <gensim.models.keyedvectors.Vocab at 0x7fd378e3c190>}
任何完整的 Word2Vec
模型都具有在其对象属性中某处初始创建时提供的每个元参数。
它几乎总是在模型本身上,使用与构造函数参数完全相同的名称。因此,model.window
将 return window
,等等 - 因此您可以创建一个新模型,从旧模型中提取每个值。
请注意,在已训练的模型上继续训练涉及许多棘手的权衡。
例如,现有模型上的 .build_vocab(..., update=True)
将不会始终如一地应用 min_count
来自所有先前调用的所有单词总数,但仅适用于最新 'batch' 中的单词总数。
增量更新的正确学习率(alpha
到 min_alpha
值)在理论或经验法则中没有明确定义。如果新文本中的词汇和单词平衡主要训练一些单词,而不是全部,那么那些最近更新的单词可以任意地从与没有得到更多训练的早期单词的强可比对齐中拉出来。 (mdoel 优化的基本方法,随机梯度下降,在所有训练文本都得到同等的训练注意力,而没有任何子集稍后开始密集训练时,是最好的基础。)
我有一个训练有素的 word2vec 模型,我需要用更多数据进一步训练它。我也想使用在为新模型训练模型时使用的相同超参数。但我不想对其进行硬编码。有没有一种方法可以用来获取在训练现有模型时使用的超参数。 我正在使用 Gensim word2vec。
使用save
和load
方法
模型训练完成后,将模型保存到磁盘。对于重新训练,加载保存的模型,如果您的新训练数据有任何看不见的词,请更新词汇表并重新开始训练。查看官方文档 here.
工作示例(内联注释)
from gensim.models import Word2Vec
import numpy as np
# Stage 1
sentences = ["an apple on the tree".split(), "a cat on the table".split()]
model = Word2Vec(min_count=1)
model.build_vocab(sentences) # prepare the model vocabulary
model.train(sentences, total_examples=model.corpus_count, epochs=2) # Train
model.save("word2vec.model") # Save the model
s1 = np.sum(model.wv.vectors[0]) # Get the vector sum of 'a' for testing
print (model.wv.vocab)
print ("\n")
# Stage 2
sentences = ["sky is high".split(), "ocean is blue".split()]
model = Word2Vec.load("word2vec.model") # Load the last saved model
model.build_vocab(sentences, update=True) # prepare the model vocabulary
model.train(sentences, total_examples=model.corpus_count, epochs=2) # Train
# since 'a' is not in new train data its vector(word2vec)) should remain same
assert s1 == np.sum(model.wv.vectors[0])
print (model.wv.vocab)
输出:
{'a': <gensim.models.keyedvectors.Vocab at 0x7fd378f84e10>,
'an': <gensim.models.keyedvectors.Vocab at 0x7fd378fb7810>,
'apple': <gensim.models.keyedvectors.Vocab at 0x7fd378fb7e90>,
'cat': <gensim.models.keyedvectors.Vocab at 0x7fd378f84b10>,
'on': <gensim.models.keyedvectors.Vocab at 0x7fd3764695d0>,
'table': <gensim.models.keyedvectors.Vocab at 0x7fd378f84950>,
'the': <gensim.models.keyedvectors.Vocab at 0x7fd376469490>,
'tree': <gensim.models.keyedvectors.Vocab at 0x7fd376469b50>}
{'a': <gensim.models.keyedvectors.Vocab at 0x7fd3797f3850>,
'an': <gensim.models.keyedvectors.Vocab at 0x7fd376469fd0>,
'apple': <gensim.models.keyedvectors.Vocab at 0x7fd375b8efd0>,
'blue': <gensim.models.keyedvectors.Vocab at 0x7fd37649a9d0>,
'cat': <gensim.models.keyedvectors.Vocab at 0x7fd37649a450>,
'high': <gensim.models.keyedvectors.Vocab at 0x7fd37649afd0>,
'is': <gensim.models.keyedvectors.Vocab at 0x7fd37649aa90>,
'ocean': <gensim.models.keyedvectors.Vocab at 0x7fd37649a7d0>,
'on': <gensim.models.keyedvectors.Vocab at 0x7fd375b8ef50>,
'sky': <gensim.models.keyedvectors.Vocab at 0x7fd378f79ed0>,
'table': <gensim.models.keyedvectors.Vocab at 0x7fd37649a850>,
'the': <gensim.models.keyedvectors.Vocab at 0x7fd375b8eed0>,
'tree': <gensim.models.keyedvectors.Vocab at 0x7fd378e3c190>}
任何完整的 Word2Vec
模型都具有在其对象属性中某处初始创建时提供的每个元参数。
它几乎总是在模型本身上,使用与构造函数参数完全相同的名称。因此,model.window
将 return window
,等等 - 因此您可以创建一个新模型,从旧模型中提取每个值。
请注意,在已训练的模型上继续训练涉及许多棘手的权衡。
例如,现有模型上的 .build_vocab(..., update=True)
将不会始终如一地应用 min_count
来自所有先前调用的所有单词总数,但仅适用于最新 'batch' 中的单词总数。
增量更新的正确学习率(alpha
到 min_alpha
值)在理论或经验法则中没有明确定义。如果新文本中的词汇和单词平衡主要训练一些单词,而不是全部,那么那些最近更新的单词可以任意地从与没有得到更多训练的早期单词的强可比对齐中拉出来。 (mdoel 优化的基本方法,随机梯度下降,在所有训练文本都得到同等的训练注意力,而没有任何子集稍后开始密集训练时,是最好的基础。)