BERT嵌入应该在标记或句子上进行吗?

时间:2020-08-27 07:08:32

标签: python-3.x tensorflow keras nlp embedding

我正在建立一个句子分类模型,并在其中使用BERT词嵌入。由于数据量非常大,我将所有句子组合成一个字符串,并在这些句子生成的标记上进行嵌入。

s = " ".join(text_list)
len(s)

s是字符串,text_list包含要在其上嵌入单词的句子。

然后我将字符串标记化

stokens = tokenizer.tokenize(s)

我的问题是,BERT在一次给出的整个句子上表现会更好,还是在整个字符串的标记上嵌入也可以?

这是我的嵌入生成器的代码

pool = []
all = []
i=0
while i!=600000:
  stokens = stokens[i:i+500]
  stokens = ["[CLS]"] + stokens + ["[SEP]"]
  input_ids = get_ids(stokens, tokenizer, max_seq_length)
  input_masks = get_masks(stokens, max_seq_length)
  input_segments = get_segments(stokens, max_seq_length)
  a, b= embedd(input_ids, input_masks, input_segments)
  pool.append(a)
  all.append(b)
  print(i)
  i+=500

本质上,我在这里做的是,我的字符串长度为600000,一次获取500个令牌,并为其生成嵌入并将其附加到列表调用pool中。

1 个答案:

答案 0 :(得分:0)

对于分类,您不必连接句子。通过串联,您可以合并不同类别的句子。

如果默认情况下是BERT微调,则对于分类任务,将在[CLS]令牌的顶部学习逻辑回归层。由于其基于注意力的转换器模型,因此假定每个标记都已看到其他标记并捕获了上下文。因此,[CLS]令牌就足够了。

但是,如果要使用嵌入,则可以学习单个向量上的分类器,即嵌入[CLS]令牌或所有令牌的平均嵌入。或者,您可以获取每个令牌的嵌入,并形成序列以使用其他分类器(例如CNN或RNN)进行学习。