Huggingface中的BERT模型的使用方法

  1. 安装Huggingface的transformers库,安装该库之前要确保下载了pytorch或者tensorflow2.0的框架。
pip install transformers
  1. transformers库安装好之后我们就可以使用其提供的预训练模型进行使用了。使用之前先介绍一些相关的内容:一个完整的transformer模型主要包含三个部分,分别是Config,Tokenizer和Model。
    其中Config是配置类,控制模型的名称,最终输出的样式,隐藏层的宽度和深度,激活函数的类别等。Tokenizer是一个将纯文本转换为编码的过程,其并不涉及将词转化为词向量的过程,仅仅是将纯文本分词并添加一些标记,比如MASK,CLS,SEP等。Model也就是各种各样的模型。
  2. 使用模型之前一般需要下载该模型对应的一些文件,可以直接采用from_pretrained方法内指定模型的名称,然后运行之后就会自动进行下载,不过一般这种方法在国内并不可行,因为需要到对方的服务器上下载对应的文件,下载速度也是很慢。一般情况下我们直接去官网下载对应模型的相关文件保存到本地,然后使用即可,主要保存文件的时候不要将其名称改变。
  3. 下面主要介绍一点有关BERT模型的使用方法。
    首先就是Tokenizer的使用方法,使用tokenizer = BertTokenizer.from_pretrained('./bert-base-uncased')该方式创建一个tokenizer。该工具主要是用于将文本进行分词并转换为对应的索引值,以便于方便输入BERT模型,该工具提供了很多方法,比如tokenize,encode和encode_plus等,在这里就不再赘述,主要介绍一些__call__方法的使用,因为官方也推荐使用该方法。
  4. 对于BERT模型的输入,一般需要对于句子加一些特殊符号标记,比如[CLS]用于句子的开头,[SEP]用于句子的结尾,当我们直接使用tokenizer(text)方法的时候,它默认会为其添加这两种标记,如果不需要的话,可以利用参数add_special_tokens=False来控制。
  5. 我们可以将句子形式处理为[text1,text2,....textn]的形式,这可以表示为一个batch的句子,调用上面的方法之后就会返回其分词后的结果,返回的结果是一个字典,主要包括input_ids,token_type_ids,attention_mask,其中input_ids表示的就是分词后其对应的索引id,token_type_ids用来表示属于哪个句子,因为BERT允许输入句子对的形式,值为0表示为一个句子,值为1表示为另一个句子,attention_mask表示是否需要被mask掉,因为该方法可以添加padding参数,用来进行pad补齐。
  6. 上面说到BERT可以接受句子对的输入形式,则我们可以将句子处理为[[句子1,句子2],[句子1,句子2],....[句子1,句子2]]的形式,经过该方法之后,他会将两个句子对合在一起,中间用一个[SEP]标记进行分割;该方法还有很多参数可以使用,比如return_tensors表示返回tensor类型,默认为普通类型,'pt'表示返回pytorch中的tensor等。一般需要跟着padding参数一起使用。
  7. 分完词之后就可以将其结果输入模型中了,模型的输出结果一般有last_hidden_state,pooler_output,hidden_states,attentions四类,默认情况下只有前两个,后两个需要手动设置参数。具体使用代码如下所示:
model_out = bert_model(**token_out,output_hidden_states=True,output_attentions=True)

其中last_hidden_state表示BERT模型最后一层的输出,包括[CLS]和[SEP],可以将其用作命名实体识别之类的任务。大小为[batch,seq_len,hidden_state]
pooler_output表示的是将[CLS]这个标记的编码经过处理后的结果,可以用来处理分类任务。大小为[batch,hidden_state]
hidden_states是一个元组,它的第一个元素表示embedding,其余的元素表示各个层的输出结果,大小为[batch,seq_len_state]。
attentions表示每一层的注意力权重,大小为[batch_size, num_heads, sequence_length, sequence_length]

posted @ 2021-09-21 15:53  万物小白  阅读(3425)  评论(0编辑  收藏  举报