使用手动功能扩展 BERT 或任何变压器模型

Rya*_*ren 5 text-classification bert-language-model huggingface-transformers

我一直在做一篇关于我的引文分类的论文。我刚刚实现了用于引文分类的 Bert 模型。我有 4 个输出类,我给出一个输入句子,我的模型返回一个输出,告诉引用的类别。现在我的主管给了我另一项任务。

您必须搜索是否可以使用手动功能扩展 BERT 或任何变压器模型。例如,您当前给出一个句子作为唯一输入,后跟其类别。如果你可以给出一个句子和一些其他特征作为输入怎么办?就像我们在其他分类器中所做的那样?

我需要一些关于这个问题的指导。我怎样才能在我的 Bert 模型中添加额外的特征,并且该特征将是分类的而不是数字的。

cro*_*oik 5

有几种方法可以实现这一目标。我将在以下答案中仅解释两点:

  1. 添加类别作为标记:
    这种方法的想法相当简单,当像 BERT 这样的转换器模型能够为给定的句子生成上下文嵌入时,为什么我们不能将分类特征也合并为文本呢?例如,您使用引用论文的标题作为输入,并且还希望合并论文的研究领域以提供更多背景信息:
"Attention is all you need. [Computer Science] [Machine Translation]" -> BERT
Run Code Online (Sandbox Code Playgroud)

为此,我会将新功能的类别作为单独的标记添加到 BERT(这不是必需的,但会减少序列长度),并针对几个时期对其进行微调:

"Attention is all you need. [Computer Science] [Machine Translation]" -> BERT
Run Code Online (Sandbox Code Playgroud)

输出:

18
12
Embedding(28998, 768, padding_idx=0)
Run Code Online (Sandbox Code Playgroud)
  1. 单独的嵌入层:
    更传统的方法是为每个类别保存一个嵌入,并将其与 BERT 的上下文输出连接(或任何其他组合特征的方法),然后再将其输入分类层。对于这种方法,您可以简单地从 Huggingfaces BertForSequenceClassification类(或您正在使用的任何类)复制代码并进行所需的更改:
from transformers import BertTokenizer, BertForSequenceClassification

my_categories = ["[Computer Science]", "[Machine Translation]"]
sentence="Attention is all you need. [Computer Science] [Machine Translation]"

t= BertTokenizer.from_pretrained("bert-base-cased")
m=BertForSequenceClassification.from_pretrained("bert-base-cased")
# tokenized without separate tokens
print(len(t(sentence)["input_ids"]))

# tokenized without separate tokens
t.add_tokens(my_categories)
print(len(t(sentence)["input_ids"]))

# Extend embedding layer of model
m.resize_token_embeddings(len(t.get_vocab()))

# Training...
Run Code Online (Sandbox Code Playgroud)

您可以像 BertForSerquenceClassification 类一样使用此类,唯一的区别是,它需要categorical_feature_ids额外的输入:

18
12
Embedding(28998, 768, padding_idx=0)
Run Code Online (Sandbox Code Playgroud)

输出:

{'loss': None, 
'logits': tensor([[ 0.6069, -0.1878], [ 0.6347, -0.2608]], grad_fn=<AddmmBackward0>), 
'hidden_states': None, 
'attentions': None}
Run Code Online (Sandbox Code Playgroud)