我刚刚读过论文Distributed Representations of Sentences and Documents。在情感分析实验部分中,它说:“在学习了训练句子及其子短语的矢量表示后,我们将它们送入了逻辑回归,以了解电影收视率的预测因子。”因此,它使用逻辑回归算法作为分类器来确定标签是什么。
然后我进入dl4j,我阅读了示例“ ParagraphVectorsClassifierExample”,代码显示如下:
void makeParagraphVectors() throws Exception {
ClassPathResource resource = new ClassPathResource("paravec/labeled");
// build a iterator for our dataset
iterator = new FileLabelAwareIterator.Builder()
.addSourceFolder(resource.getFile())
.build();
tokenizerFactory = new DefaultTokenizerFactory();
tokenizerFactory.setTokenPreProcessor(new CommonPreprocessor());
// ParagraphVectors training configuration
paragraphVectors = new ParagraphVectors.Builder()
.learningRate(0.025)
.minLearningRate(0.001)
.batchSize(1000)
.epochs(20)
.iterate(iterator)
.trainWordVectors(true)
.tokenizerFactory(tokenizerFactory)
.build();
// Start model training
paragraphVectors.fit();
}
void checkUnlabeledData() throws IOException {
/*
At this point we assume that we have model built and we can check
which categories our unlabeled document falls into.
So we'll start loading our unlabeled documents and checking them
*/
ClassPathResource unClassifiedResource = new ClassPathResource("paravec/unlabeled");
FileLabelAwareIterator unClassifiedIterator = new FileLabelAwareIterator.Builder()
.addSourceFolder(unClassifiedResource.getFile())
.build();
/*
Now we'll iterate over unlabeled data, and check which label it could be assigned to
Please note: for many domains it's normal to have 1 document fall into few labels at once,
with different "weight" for each.
*/
MeansBuilder meansBuilder = new MeansBuilder(
(InMemoryLookupTable<VocabWord>)paragraphVectors.getLookupTable(),
tokenizerFactory);
LabelSeeker seeker = new LabelSeeker(iterator.getLabelsSource().getLabels(),
(InMemoryLookupTable<VocabWord>) paragraphVectors.getLookupTable());
while (unClassifiedIterator.hasNextDocument()) {
LabelledDocument document = unClassifiedIterator.nextDocument();
INDArray documentAsCentroid = meansBuilder.documentAsVector(document);
List<Pair<String, Double>> scores = seeker.getScores(documentAsCentroid);
/*
please note, document.getLabel() is used just to show which document we're looking at now,
as a substitute for printing out the whole document name.
So, labels on these two documents are used like titles,
just to visualize our classification done properly
*/
log.info("Document '" + document.getLabels() + "' falls into the following categories: ");
for (Pair<String, Double> score: scores) {
log.info(" " + score.getFirst() + ": " + score.getSecond());
}
}
}
它演示了doc2vec如何将任意文档与标签相关联,但将实现隐藏在幕后。我的问题是:是否也通过逻辑回归进行分析?如果没有,那是什么?以及如何通过逻辑回归来做到这一点?
答案 0 :(得分:0)
我对DL4J的方法不熟悉,但是在核心“段落向量” /“ Doc2Vec”级别,文档通常具有由用户分配的标识符-最通常是单个唯一ID。但是,有时这些(提供的)ID被称为“标签”,而且有时,重用已知标签就好像它们是按文档的文档令牌一样有用,这可能导致混乱。在Python gensim库中,我们将这些用户提供的标记称为“标签”,以区别于可能来自完全不同的下游词汇的“标签”。
因此,在诸如“ Document Embedding with Paragraph Vectors”之类的后续文件中,每个文档都有唯一的ID-Wikpedia或Arxiv中的标题或标识符。但是,然后根据生成的文档向量通过它们将具有相同类别标签的文档放置得比第三文档彼此更近的程度来评估。因此,既有一个学习的文档标签空间,又有一个基于其他标签的下游评估(没有以任何方式提供给无监督的Paragraph Vector算法)。
类似地,您可以为所有培训文档提供唯一的ID,但随后再训练一个单独的(任何算法的)分类器,以使用doc = vector作为输入,并学习预测 other 标签。这就是我在原始的“段落向量”论文中对IMDB实验的理解:每个评论在培训期间都有唯一的ID,因此有自己的文档向量。但是随后,对下游分类器进行了训练,以基于这些文档向量预测正面/负面的评论情绪。因此,标签(“正” /“负”)的评估/预测是一个单独的下游步骤。
如前所述,有时将已知的类别标签重新用作doc-id(作为唯一的doc-ID或除每个文档唯一ID之外的额外ID)很有用。在某种程度上,它创建了用于培训的综合合并文档,由具有相同标签的所有文档组成。该 可能倾向于影响最终空间/坐标,从而相对于已知标签更具区分性,从而使生成的doc-vector对下游分类器更有用。但是,然后您用一种类似的半监督方法替换了经典的“段落向量”(每个文档一个ID),在已知的标签会影响训练的情况下,这种方法类似于半监督方法。