bert不说了,用它主要是公司客户先把客户拉进公众号,然后写好了问答卷子给我,让公众号自己先回答问题。具体思路就是直接用bert的transformer做特征提取,也不fine tune,直接把他的输出接着往下面贯,具体如下:
1 用哈工大训练好的bert,这样程序自动拉pretrained
from transformers import BertTokenizer, BertModel, BertForMaskedLM
mod_name="hfl/chinese-roberta-wwm-ext-large"
tokenizer=BertTokenizer.from_pretrained(mod_name)
model=BertModel.from_pretrained(mod_name)
2 因为一个回答对应的问题表述有很多种,把问题分类别,相同答案的是一类,那么nlp就成分类问题。把bert的cls输出直接套分类(比如直连接)模型。此外加个什么都不是类别。这个类别样本那多了去。
3 接着来了个问题,发现模型给了两个输出,last hidden 和pooler_output。 last的第一个向量是cls我是知道的,那么这个pooler_output是啥?
encoded_input = tokenizer(s4, return_tensors='pt')
output = model(**encoded_input)
print (output["last_hidden_state"][0])
print (output["pooler_output"])
4 找梯子谷歌了,这个pooler是cls做线性变化接着再tan来的。那么到底用哪个?其实两个都可以,但是看了几个回答,说hidden的第一个效果可能更好。
特此记录。