如何使用 Bert 进行长文本分类?

Posted

技术标签:

【中文标题】如何使用 Bert 进行长文本分类?【英文标题】:How to use Bert for long text classification? 【发布时间】:2020-02-26 09:56:42 【问题描述】:

我们知道BERT有一个tokens的最大长度限制= 512,所以如果一篇文章的长度远大于512,比如文本中有10000个tokens BERT如何使用?

【问题讨论】:

【参考方案1】:

你基本上有三个选择:

    您将较长的文本剪掉,只使用前 512 个标记。最初的 BERT 实现(可能还有其他实现)会自动截断较长的序列。在大多数情况下,此选项就足够了。 您可以将文本拆分为多个子文本,对每个子文本进行分类并将结果组合在一起(例如,选择为大多数子文本预测的类别)。这个选项显然更昂贵。 您甚至可以按照this discussion 中的说明将每个子文本(如选项 2)的输出令牌提供给另一个网络(但您将无法进行微调)。

我建议尝试选项 1,但前提是这还不足以考虑其他选项。

【讨论】:

我打算用bert作为段落编码器,然后喂给lstm,可行吗? ***.com/questions/58703885/… 根据我的经验,我还必须分析大段落,而最好的结果确实是只考虑最后的 512 个标记,因为它们提供的信息最多(通常结束主题)。但我相信这在很大程度上取决于手头的域和文本。此外,此处显示的发送选项对我来说效果不佳,因为我正在处理会话文本,而单个句子对分类几乎没有提及。【参考方案2】:

本文比较了几种不同的策略:How to Fine-Tune BERT for Text Classification?。 在 IMDb 电影评论数据集上,他们实际上发现剪掉文本的中间(而不是截断开头或结尾)效果最好!它甚至优于更复杂的“分层”方法,包括将文章分成块然后重新组合结果。

作为另一个轶事,我将 BERT 应用于 Wikipedia Personal Attacks 数据集 here,发现简单截断效果很好,我没有动力尝试其他方法 :)

【讨论】:

论文的链接好像坏了。您能否向我们提供工作链接或论文的标题/作者?【参考方案3】:

除了分块数据并将其传递给 BERT 之外,还可以检查以下新方法。

长文档分析有新的研究。正如您向 Bert 询问的那样,最近 ALLEN NLP (https://arxiv.org/abs/2004.05150) 提供了一个类似的预训练变压器 Longformer。看看这篇论文的链接。

相关工作部分还提到了一些以前关于长序列的工作。谷歌他们。我建议至少通过 Transformer XL (https://arxiv.org/abs/1901.02860)。据我所知,它是长序列的初始模型之一,因此在进入“Longformers”之前将其用作基础会很好。

【讨论】:

【参考方案4】:

Defending Against Neural Fake News (https://arxiv.org/abs/1905.12616) 论文中使用了一种方法

他们的生成模型产生 1024 个令牌的输出,他们希望将 BERT 用于人类与机器生成。他们扩展了 BERT 使用的序列长度,只需初始化 512 个嵌入并在他们在数据集上微调 BERT 的同时对其进行训练。

【讨论】:

【参考方案5】:

主要有两种方法:

完全连接“短”BERT(最多包含 512 个令牌) 构建真正的长 BERT(CogLTX、Blockwise BERT、Longformer、Big Bird)

我在这篇文章中恢复了一些典型的BERT长文论文:https://lethienhoablog.wordpress.com/2020/11/19/paper-dissected-and-recap-4-which-bert-for-long-text/

您可以在那里概览所有方法。

【讨论】:

【参考方案6】:

您可以利用 HuggingFace Transformers 库,其中包含以下可处理长文本(超过 512 个标记)的 Transformer 列表:

Reformer:将 Transformer 的建模能力与可在长序列上高效执行的架构相结合。 Longformer:具有随序列长度线性扩展的注意力机制,可以轻松处理数千个标记或更长的文档。

最近提出的其他八种高效 Transformer 模型包括 Sparse Transformers (Child et al.,2019)、Linformer (Wang et al., 2020)、Sinkhorn Transformers (Tay et al., 2020b)、Performers (Choromanski et al., 2020b)、合成器 (Tay et al., 2020a)、线性变压器 (Katharopoulos et al., 2020) 和 BigBird (Zaheeret al., 2020)。

来自 Google Research 和 DeepMind 的作者的paper 试图根据 Long-Range Arena“聚合指标”对这些 Transformer 进行比较:

他们还建议在分类任务方面,Longformer 的性能优于 Reformer

【讨论】:

我会补充一点,Longformer(我不知道其他人)仍然有 4096 个令牌的限制【参考方案7】:

我最近(2021 年 4 月)发表了一篇关于此主题的论文,您可以在 arXiv (https://arxiv.org/abs/2104.07225) 上找到该论文。

在那里,表 1 允许回顾以前解决问题的方法,整个手稿是关于长文本分类并提出一种称为文本指南的新方法。这种新方法声称与该问题的先前答案之一中提到的论文 (https://arxiv.org/abs/1905.05583) 中使用的幼稚和半幼稚文本选择方法相比,可以提高性能。

关于您的选择的长话短说:

    低计算成本:使用幼稚/半幼稚的方法来选择原始文本实例的一部分。示例包括选择前 n 个标记,或从原始文本实例的开头和结尾编译一个新的文本实例。

    中到高计算成本:使用最近的转换器模型(如 Longformer),其令牌限制为 4096 而不是 512。在某些情况下,这将允许覆盖整个文本实例,修改后的注意力机制降低了计算成本,并且

    高计算成本:将文本实例划分为适合 BERT 等模型的块,每个实例的“标准”令牌限制为 512 个,分别在每个部分上部署模型,加入生成的向量表示。

现在,在我最近发表的论文中,提出了一种称为文本指南的新方法。文本指南是一种文本选择方法,与幼稚或半幼稚截断方法相比,它可以提高性能。作为一种文本选择方法,Text Guide 不会干扰语言模型,因此它可用于提高具有“标准”令牌限制(对于转换器模型为 512)或“扩展”限制(例如 4096)的模型的性能对于 Longformer 模型)。摘要:文本指南是一种低计算成本的方法,它比简单和半简单的截断方法提高了性能。如果文本实例超出了为长文本分类(如 Longformer(4096 个标记)而专门开发的模型的限制),它还可以提高它们的性能。

【讨论】:

【参考方案8】:

在将 BERT 模型下载到内核中时,您可以在配置中使用 max_position_embeddings 参数。使用此参数,您可以选择 512、1024、2048 作为最大序列长度

max_position_embeddings(int,可选,默认为 512)——此模型可能使用的最大序列长度。通常将此设置为较大的值以防万一(例如,512 或 1024 或 2048)。

https://huggingface.co/transformers/model_doc/bert.html

【讨论】:

【参考方案9】:

一个相对简单的方法是改变输入。例如,您可以截断输入或单独分类输入的多个部分并聚合结果。但是,这样可能会丢失一些有用的信息。

在长文本上应用 Bert 的主要障碍是注意力需要对n 输入标记进行O(n^2) 操作。一些较新的方法试图巧妙地改变 Bert 的架构并使其兼容更长的文本。例如,Longformer 将注意力范围限制为一个固定值,因此每个标记只与一组附近的标记相关。该表(Longformer 2020,Iz Beltagy 等人)展示了一组基于注意力的长文本分类模型:

LTR 方法从左到右按块处理输入,适用于自回归应用程序。稀疏方法主要通过避免完全二次注意将计算顺序减少到O(n) 矩阵计算。

【讨论】:

以上是关于如何使用 Bert 进行长文本分类?的主要内容,如果未能解决你的问题,请参考以下文章

如何微调 HuggingFace BERT 模型以进行文本分类 [关闭]

BERT实战:使用DistilBERT进行文本情感分类

中文情感分类任务如何对bert语言模型微调,微调后的模型如何使用

BERT 作为分类服务?

如何标准化 BERT 分类器的输出

短文本分类概述