9

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

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

谢谢!

4

2 回答 2

11

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

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

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

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

于 2019-09-27T09:44:54.113 回答
5
  1. Transformer 旨在一次获取整个输入句子。设计变压器的主要动机是能够并行处理句子中的单词。这种并行处理在 LSTM、RNN 或 GRU 中是不可能的,因为它们将输入句子的单词一个一个地作为输入。因此,在转换器的编码器部分,第一层包含的单元数等于句子中的单词数,然后每个单元将该单词转换为对应于该单词的嵌入向量。此外,执行其余的过程。更多细节可以看文章: http: //jalammar.github.io/illustrated-transformer/ 如何使用这个转换器进行文本分类- 由于在文本分类中我们的输出是单个数字而不是数字或向量序列,因此我们可以删除解码器部分并只使用编码器部分。编码器的输出是一组向量,数量与输入句子中的单词数相同。此外,我们可以将这些输出向量集输入 CNN,或者我们可以添加 LSTM 或 RNN 模型并执行分类。
  2. 输入是整个句子或一批句子,而不是逐字逐句。你肯定误会了。
于 2020-04-23T07:26:38.807 回答