1

我刚刚阅读了论文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 如何将任意文档与标签相关联,但它隐藏了幕后的实现。我的问题是:逻辑回归也这样做吗?如果不是,那是什么?我怎样才能通过逻辑回归来做到这一点?

4

1 回答 1

1

我不熟悉 DL4J 的方法,但在核心“段落向量”/“Doc2Vec”级别,文档通常具有用户分配的标识符——最常见的是单个唯一 ID。但是,有时,这些(提供的)ID 被称为“标签”,此外,有时重用已知标签可能很有用,就好像它们是每个文档的 doc-tokens 一样,这可能会导致混淆。在 Python gensim 库中,我们将这些用户提供的标记称为“标签”,以区别于可能来自完全不同的下游词汇表的“标签”。

因此,在像“文档嵌入段落向量”这样的后续论文中,每个文档都有一个唯一的 ID——它在维基百科或 Arxiv 中的标题或标识符。但是随后生成的 doc-vectors 会通过它们将具有相同类别标签的文档彼此之间的距离比第三个文档更接近来评估。因此,既有学习的 doc-tag 空间,也有基于其他标签的下游评估(没有以任何方式提供给无监督的段落向量算法)。

同样,您可以为所有训练文档提供唯一 ID,但随后训练一个单独的分类器(任何算法)以使用 doc=vectors 作为输入,并学习预测其他标签。这就是我对原始“段落向量”论文中 IMDB 实验的理解:每条评论在训练期间都有一个唯一的 ID,因此得到了自己的 doc-vector。但是随后训练了一个下游分类器,以根据这些文档向量预测正面/负面评论情绪。因此,标签的评估/预测(“正面”/“负面”)是一个单独的下游步骤。

如前所述,有时将已知的类别标签重新用作 doc-id(作为唯一的 doc-ID 或作为每个文档唯一 ID 之外的额外 ID)可能很有用。在某种程度上,它创建了用于训练的合成组合文档,由具有相同标签的所有文档组成。这可能会影响最终的空间/坐标,使其对已知标签更具辨别力,从而使生成的文档向量对下游分类器更有帮助。但是,您已经用已知标签影响训练的类似半监督方法替换了经典的“段落向量”,每个文档只有一个 ID。

于 2019-08-14T02:27:20.230 回答