如何使用 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 模型以进行文本分类 [关闭]