【问题标题】:what is the difference between pooled output and sequence output in bert layer?BERT层的拉取输出和序列输出有什么区别?
【发布时间】:2020-12-02 05:48:38
【问题描述】:

大家!我正在阅读有关 Bert 的文章,并想用它的词嵌入来做 文本分类。我遇到了这行代码:

pooled_output, sequence_output = self.bert_layer([input_word_ids, input_mask, segment_ids])   

然后:

clf_output = sequence_output[:, 0, :]
out = Dense(1, activation='sigmoid')(clf_output)

但我无法理解合并输出的使用。 序列输出不包含所有信息,包括 ['CLS'] 的词嵌入吗? 如果是,为什么我们要合并输出?

提前致谢!

【问题讨论】:

    标签: python-3.x tensorflow neural-network text-classification bert-language-model


    【解决方案1】:

    序列输出是 BERT 模型最后一层输出的隐藏状态(嵌入)序列。它包括 [CLS] 令牌的嵌入。因此,对于“你在 Stackoverflow 上”这句话,它给出了 5 个嵌入:四个单词中的每一个都有一个嵌入(假设“Stackoverflow”这个词被标记为单个标记)以及 [CLS] 标记的嵌入。 池化输出是嵌入 [CLS] 令牌(来自序列输出),由线性层和 Tanh 激活函数进一步处理。线性层权重在预训练期间从下一个句子预测(分类)目标进行训练。更多细节请参考 BERT 原论文。

    【讨论】:

    • 句子的最后不应该有一个[SEP]标记吗?
    【解决方案2】:

    如果你给出了一个序列,“你在 StackOverflow 上”。 sequence_output 将给出这四个词的 768 个嵌入。但是,池化的输出只会给你一个 768 的嵌入,它将池化这四个词的嵌入。

    【讨论】:

    • 感谢您的回复!但是您如何确定要使用哪个?
    • 一般来说,人们使用句子的“池输出”并将其用于文本分类(或任何其他特定任务)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2020-09-18
    • 2014-09-14
    • 2020-05-18
    • 2019-06-24
    相关资源
    最近更新 更多