為了參加一項比賽,作為nlp和deep learning小白的我不得不使用google的bert模型。
比賽類似與SQuAD2.0,只不過數據都是中文的。
首先,從github上下載了bert模型和代碼,發現google發布了run_squad.py文件,也就是google用來對SQuAD2.0的數據集進行訓練的文件。
這個文件可以說是很典型的利用bert的例子了。
我粗淺地認為bert就是一套生成好的embedding的工具,所以不是針對某一項具體的nlp任務。舉個例子,如果想做句子分類,只要輸入一部分帶有標記的句子進行訓練,fine-tuning后的bert模型就是一個良好的句子分類器。
Google的代碼非常精致,雖然run_squad.py文件有一千多行,但是認真看起來并不費力。
除去一堆flags相關的設置部分,代碼的主體就是下面這些函數。
image.png
image.png
并且只有其中
class SquadExample()
class InputFeature()
def read_squad_examples()
def convert_example_to_features()
這些部分,已經predictions的輸出部分需要自己重寫(改寫),至于別的代碼,都是google提供給我們的如何讀取和使用pre-trained模型的現成代碼。
class SquadExample()
def read_squad_examples()
上面這兩是緊密聯系的。read_squad_examples()的返回值是一個list,每一項代表一個input data,而每個data都轉化為了SquadExample()的一個實例儲存。
class InputFeature()
def convert_example_to_features()
上面這兩個也是緊密聯系的,在convert_example_to_features()中,每個input data都以InputFeature()的一個實例的形式放進了模型中。