1

我对 Doc2Vec 的一个方面有点困惑。基本上,我不确定我所做的是否有意义。我有以下数据集:

train_doc_0      --> label_0
    ...               ...
train_doc_99     --> label_0
train_doc_100    --> label_1
    ...               ...
train_doc_199    --> label_1
    ...               ...
    ...               ...
train_doc_239999 --> label_2399

eval_doc_0
    ...
eval_doc_29

wheretrain_doc_n是一个简短的文档,属于某个标签。有 2400 个标签,每个标签有 100 个训练文档。eval_doc_0是评估文档,我想最终预测它们的标签(使用分类器)。

我用这些训练文档和标签训练了一个 Doc2Vec 模型。训练模型后,我使用infer_vector.

结果是一个矩阵:

X_train (240000,300) # doc2vec vectors for training documents
y_train (240000,)    # corresponding labels
y_eval  (30, 300)    # doc2vec vectors for evaluation documents

我的问题如下:如果我在 and 上运行一个简单的交叉验证X_trainy_train我有一个不错的准确性。一旦我尝试对我的评估文档进行分类(即使只使用 50 个随机抽样的标签),我的准确度就会非常差,这让我质疑我解决这个问题的方式。

我按照本教程进行文档培训。

我的方法是否有意义,尤其是在使用 重新投影所有培训文档时infer_vector

4

1 回答 1

1

我看不出有什么明显的错误。

评估文档在长度、词汇等方面是否与训练文档相似?理想情况下,它们将是所有可用标记示例的随机选择子集。(如果完全不同,这可能是交叉验证与保留评估准确性不同的原因。)

在训练 Doc2Vec 模型时,您是否给每个文档一个唯一的 ID 作为其唯一的条目tags?或者您是否使用label_n标签作为tags您的训练示例?或者两者兼而有之?(其中任何一个都是合理的选择,尽管我发现将已知标签混合到通常“无监督”的 Doc2Vec 训练中,使其成为半监督训练,通常有助于 mdoels 的向量作为后来显式监督分类器的输入变得更有用。 )

当我在一个意想不到的步骤中获得前所未有的“超差”准确性时,通常是因为测试示例发生了一些错误的改组或重新排序——随机化了真实的关系。因此,在代码中并通过详细查看一些示例来对此进行双重检查是值得的。

为训练中使用的示例重新推断向量,而不是简单地要求模型中保留的训练好的向量,有时会产生更好的向量。然而,许多人已经观察到,不同于默认的参数infer_vector(),尤其是更多的参数,steps并且可能开始alpha更接近训练期间使用的参数,可能会改善结果。dm=0(此外,在更简单的 PV-DBOW, , 模式中,推理似乎在更少的步骤中工作得更好。PV -DM, dm=1, 可能尤其需要更多的步骤。)

您链接的教程显示了一种练习,train()在调整自己时多次调用alpha,这通常是不必要的并且容易出错 - 特别是在最新的 gensim 版本中不太可能做正确的事情。您可以保留默认值alpha/min_alpha并在初始化期间提供首选iterDoc2Vec- 然后一次调用train()将自动执行那么多遍,并正确降低学习率。而且由于默认iter值为 5,如果您设置它,则每次调用train()都会执行 5 次传递 - 所以执行您自己的 10 次外部循环将意味着 50 次传递,并且该教程中的代码有两次调用train()出于某种奇怪的原因,每个循环意味着 100 次传球。

于 2017-02-08T17:31:37.807 回答