如何使用 Transformers 进行文本分类?

khe*_*edi 8 nlp transformer-model tensorflow bert-language-model

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

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

谢谢!

Jin*_*ich 10

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

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

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

与从头开始训练 Transformer 模型相比,使用(并最终微调)来自Transformers 包的预训练模型(BERT、XLNet、DistilBERT 等)可能更方便。它具有可在 PyTorch 和 TensorFlow 2.0 中使用的预训练模型。


小智 5

  1. Transformer 的设计目的是一次性获取整个输入句子。设计变压器的主要动机是能够并行处理句子中的单词。这种并行处理在 LSTM、RNN 或 GRU 中是不可能的,因为它们将输入句子的单词一一作为输入。因此,在 Transformer 的编码器部分中,第一层包含的单元数量等于句子中单词的数量,然后每个单元将该单词转换为与该单词对应的嵌入向量。进一步地,进行其余的处理。有关更多详细信息,您可以浏览文章: http: //jalammar.github.io/illusterated-transformer/ 如何使用此转换器进行文本分类- 由于在文本分类中我们的输出是单个数字而不是数字序列或向量,因此我们可以删除解码器部分并仅使用编码器部分。编码器的输出是一组向量,其数量与输入句子中的单词数量相同。此外,我们可以将这些输出向量集输入 CNN,或者添加 LSTM 或 RNN 模型并执行分类。
  2. 输入是整个句子或一批句子,而不是逐字输入。肯定是你理解错了。