【问题标题】:How to use Transformers for text classification?如何使用 Transformers 进行文本分类?
【发布时间】:2019-09-26 19:18:15
【问题描述】:

我有两个关于如何使用变形金刚的 Tensorflow 实现进行文本分类的问题。

  • 首先,似乎人们大多只使用编码器层来完成文本分类任务。然而,编码器层为每个输入单词生成一个预测。根据我对转换器的理解,每次输入到编码器的都是输入句子中的一个单词。然后,使用当前输入词计算注意力权重和输出。我们可以对输入句子中的所有单词重复这个过程。结果,我们最终会得到输入句子中每个单词的成对(注意力权重,输出)。那是对的吗?那么你将如何使用这些对来执行文本分类呢?
  • 第二,基于transformerhere的Tensorflow实现,他们将整个输入句子嵌入到一个向量中,并将这些向量中的一批输入到Transformer中。但是,根据我从The Illustrated Transformer 学到的知识,我希望输入是一批单词而不是句子

谢谢!

【问题讨论】:

    标签: tensorflow nlp transformer bert-language-model


    【解决方案1】:

    有两种方法,你可以采取:

    1. 只需平均从编码器获得的状态即可;
    2. 在前面添加一个特殊标记 [CLS](或任何您喜欢的名称)并将特殊标记的隐藏状态用作分类器的输入。

    BERT 使用了第二种方法。预训练时,用这个特殊token对应的隐藏状态来预测两个句子是否连续。在下游任务中,也用于句子分类。然而,我的经验是,有时,平均隐藏状态会产生更好的结果。

    与其从头开始训练 Transformer 模型,不如使用(并最终微调)来自 transformers package 的预训练模型(BERT、XLNet、DistilBERT...)可能更方便。它具有可在 PyTorch 和 TensorFlow 2.0 中使用的预训练模型。

    【讨论】:

    • 使用编码序列中的单个标记似乎很奇怪,丢弃其余部分。为什么不添加一个额外的注意力层来参与编码序列并输出单个值?
    • 你的建议基本上发生在最后一层,所以从某种意义上说,最后一层可能会浪费剩余隐藏状态的计算。 [CLS] 令牌背后的直觉是它从所有隐藏层动态收集信息,而不仅仅是最后一个,这是通过残差连接传递的。此外,为分类收集的信息也会影响层中的自我关注。因此,与您的建议相比,该模型应该能够更轻松地学习更复杂的模式。
    【解决方案2】:
    1. Transformers 旨在一次获取整个输入句子。设计变压器的主要动机是能够并行处理句子中的单词。这种并行处理在 LSTM 或 RNN 或 GRU 中是不可能的,因为它们将输入句子的单词一一作为输入。 因此,在转换器的编码器部分,第一层包含的单元数等于句子中的单词数,然后每个单元将该单词转换为对应于该单词的嵌入向量。此外,执行其余的过程。更多详情可以浏览文章:http://jalammar.github.io/illustrated-transformer/ 如何使用这个转换器进行文本分类 - 由于在文本分类中我们的输出是单个数字而不是数字或向量序列,因此我们可以移除解码器部分并只使用编码器部分。编码器的输出是一组向量,数量与输入句子中的单词数相同。此外,我们可以将这些输出向量集输入 CNN,或者我们可以添加 LSTM 或 RNN 模型并执行分类。
    2. 输入是整句或整批句子,不是逐字逐句的。你肯定误会了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2019-12-06
      • 2011-09-04
      • 2020-03-10
      • 2018-09-13
      • 2019-09-05
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多