我正在建立一个句子分类模型,并在其中使用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
中。
答案 0 :(得分:0)
对于分类,您不必连接句子。通过串联,您可以合并不同类别的句子。
如果默认情况下是BERT微调,则对于分类任务,将在[CLS]
令牌的顶部学习逻辑回归层。由于其基于注意力的转换器模型,因此假定每个标记都已看到其他标记并捕获了上下文。因此,[CLS]
令牌就足够了。
但是,如果要使用嵌入,则可以学习单个向量上的分类器,即嵌入[CLS]
令牌或所有令牌的平均嵌入。或者,您可以获取每个令牌的嵌入,并形成序列以使用其他分类器(例如CNN或RNN)进行学习。