删除 Bert 中的 SEP 令牌以进行文本分类
Posted
技术标签:
【中文标题】删除 Bert 中的 SEP 令牌以进行文本分类【英文标题】:Removing SEP token in Bert for text classification 【发布时间】:2020-04-30 07:49:15 【问题描述】:给定一个情感分类数据集,我想微调 Bert。
如您所知,BERT 创建的目的是在给定当前句子的情况下预测下一个句子。因此,为了让网络意识到这一点,他们在第一句的开头插入了一个[CLS]
标记,然后他们添加了[SEP]
标记以将第一句与第二句分开,最后在结尾添加另一个[SEP]
第二句(我不清楚他们为什么在末尾附加另一个标记)。
无论如何,对于文本分类,我在网上的一些示例(参见BERT in Keras with Tensorflow hub)中注意到的是,它们添加了[CLS]
标记,然后是句子,最后是另一个[SEP]
标记。
在其他研究工作中(例如Enriching Pre-trained Language Model with Entity Information for Relation Classification),他们删除了最后一个[SEP]
令牌。
当我的任务仅使用单个句子时,为什么在输入文本的末尾添加 [SEP]
标记是/无益的?
【问题讨论】:
.@user_007 有趣的问题,你有什么进一步的见解吗? @MJimitater 不幸的是没有。 我在下面的回答中提出了我的一些(不幸的是相当不令人满意)的想法,请让我知道您对此的想法,这样我们就可以朝着真相更进一步 【参考方案1】:我不太清楚为什么 BERT 在单句任务的末尾需要分隔标记 [SEP]
,但我猜 BERT 是一种自动编码模型,如前所述,最初是为语言建模和下一句预测设计的.所以 BERT 是这样训练的,总是期待 [SEP]
令牌,这意味着令牌涉及 BERT 在训练期间建立的底层知识。
后来的下游任务,例如单句用例(例如文本分类),结果证明也可以与 BERT 一起使用,但是 [SEP]
是 BERT 正常工作的遗留物,因此是必需的即使是这些任务。
如果在单个句子的末尾附加[SEP]
,BERT 可能会学得更快,因为它在该标记中编码了一些知识,这标志着输入的结束。没有它,BERT 仍然会知道句子在哪里结束(由于填充标记),这解释了前面提到的研究留下了标记,但这可能会稍微减慢训练速度,因为 BERT 可能能够通过附加 @987654325 更快地学习@ 标记,尤其是在截断的输入中没有填充标记时。
【讨论】:
谢谢@MJimitater .. 我认为这是最可能的答案。我仍然不知道为什么它在有和没有它的情况下都有效(科学地)?我觉得没有人会回答这个问题,那么你的答案就会被接受;) 我想这接近事实。模型总是看到它并且它可能期望它。【参考方案2】:如BERT's paper 中所述,BERT 使用两个新颖的无监督预测任务进行预训练:Masked Language Model 和 Next Sentence Prediction。在 Next Sentence Prediction 任务中,模型以一对句子作为输入,学习预测第二个句子是否是原始文档中的下一个序列。
因此,我认为 BERT 模型在文本分类任务以及其他任务中使用了两个文本句子之间的关系。这种关系可以用来预测这两个句子是否属于同一类。因此,需要[SEP]
token来合并这两个句子并确定它们之间的关系。
【讨论】:
这并没有回答我的问题:为什么当有一个句子进行分类时,一些作品/论文在该句子的末尾添加了 SEP 而其他则没有? 我不知道为什么有些作品/论文没有在句尾添加 [SEP] 标记。但我认为下面是其他人这样做的原因:假设有一组句子要分类,例如句子 A、句子 B、句子 C 和句子 D。在第一阶段,BERT 将 A 和 B 标记为理解它们之间的关系并预测它们是否属于同一类。所以合并后的序列将是这样的:[CLS]A[SEP]B[SEP] 并且应该对 AC、AD、BC 等重复此步骤。在我看来,这就是使用 [SEP] 令牌的原因每个句子的结尾。 谢谢,但我知道这一点..这是 BERT 的核心思想。请再读一遍我的问题,尤其是最后一句(when my task uses only single sentence
)。
分类任务不能应用于单个句子。它应该是一组句子。我不明白你的意思。能举个例子吗?
如果你的任务是分类任务,那么举个例子。如果不是,请解释你的任务。以上是关于删除 Bert 中的 SEP 令牌以进行文本分类的主要内容,如果未能解决你的问题,请参考以下文章
文本分类基于BERT预训练模型的灾害推文分类方法基于BERT和RNN的新闻文本分类对比