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解決。

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