bert模型的简单调用方法

本文主要介绍了bert模型的简单调用方式,不去深究bert模型的内部原理,只讲解bert模型的pytorch调用方法,直接调用bert需要安装 pytorch-pretrained-bert,直接用pip就可以安装:

pip install pytorch-pretrained-bert

   bert模型的结构图:

    

       如上图,bert模型是由多个transformer的encoder部分组成的,严格的来说是transformer的encoder的一层,每一层由于首尾的输入输出的shape是一样的,所以可以直接首尾相连,我们在使用bert 的时候只需要将输入的文本转换为bert模型的字典中对应的字序号直接输入就可以了,但是由于训练的时候是批量训练的,会遇到一个padding的问题,也就是每一个batch的数据不会每一句话长度都相等,那么就需要对短的句子的字序号序列进行补0的操作,但是这样会加大模型的训练量,所以需要输入一个mask,mask中为0的地方代表字序号序列补了0的地方,bert模型会自动处理,另外还有一个seg,这个是针对于预训练中句子A和句子B的识别的,一般如果我们没有和预训练相同的任务,即预测B句是否是正确的A句的下一句这样的任务的话,可以直接全部设置为0,所以bert模型需要我们输入的向量就为以下三个 :

    

那么问题来了,如何将本地的文本变为这三个input呢,注意,这三个inputs和其他文章所说的input_embed,seg_mebed,position_emebed不一样哦,这三个input是我们需要输入到框架中的向量,编码好的向量是由模型自己在框架中编码的,注意不要混淆。

   转换代码:

        

如上图,转换结果如下:

如图,tokenize函数对句子进行分词的操作,注意看到KunMing被分为了两个部分,后面一个部分还添加了##,这是bert模型预处理的一部分,会对英语中的组合词进行拆分,因为字典不可能收录到每一个 词,所以将一些组合词分开,并且做了加##的处理

得到了所需要的输入之后,建立模型,将处理好的向量输入到模型中得到bert的输出,代码如下:

输出如下:

如图,经过了bert编码之后,输出的数据的shape为[batch_size,seq_length,768],

bert会输出一个三维矩阵,维度1为batch_size的大小,维度2为输入句子的长度,维度3为bert的hidden_size,这里使用的是最小的模型,所以输出维度为768,这样的话,bert的调用和前向传播就可以了,如果只是希望bert做前向传播,不参与模型的训练的话,只需要加上如下代码即可:

这样模型在反向传播的过程中就不会对bert模型进行参数调优,此时的bert模型就相当于一个底层的编码器,将输入的字按照其所在的句子中的寓意语义编码为一个向量。

会遇到的问题:

  由于pytorch-pretrained-bert中的模型下载及其缓慢,有的时候会因为下载过于缓慢而停止程序,这个的解决办法是进入到pytorch-pretrained-bert的源码中,就在bert模型的定义和bert_tokenizer 的定义文件中的顶部,有一个字典,对应着把字典中的你所想要是使用的网址改成本地模型文件的绝对路径就可以,至于模型的下载地址,可以直接把字典中的地址复杂出来,用谷歌浏览器下载会快很多,假如还是很慢的话,推荐vpn解决。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章