基于bert模型的文本分类研究:“Predict the Happiness”挑战
1. 前言
在2018年10月,Google發布了新的語言表示模型BERT-“Bidirectional Encoder Representations from Transformers”。根據他們的論文所言,在文本分類、實體識別、問答系統等廣泛的自然語言處理任務上取得了最新的成果。
2017年12月,參加了Hackerreath的一個挑戰“Predict the Happiness”。在這個挑戰中,我為這個文本分類問題(Predict the Happiness)構建了一個多層全連接神經網絡通過提交的測試數據,我可以得到87.8%的準確率,排名是66。
在互聯網上圍繞BERT進行了大量的討論之后,我選擇將BERT應用到同一個Challenge中,以證明調整BERT模型是否能將我帶到這個挑戰的更好排名。
2. Bert安裝與預訓練模型
-
將BERT Github項目Copy到自己的機器上:
- 直接下載預訓練的Bert模型
Google提供了四個預訓練模型:
- BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters
- BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters
本文下載了BERT-Base, Cased第一個進行文本分類實驗。這里,我們需要以符合bert模型的格式準備文本數據。Google規定了數據的格式:
對于train.tsv or dev.tsv:
- 每行需要一個ID
- 每行需要一個整數值作為標簽?( 0,1,2,3 etc)
- 一列完全相同的字母
- 要分類的文本示例
對于test.tsv:
- 每行需要一個ID
- 想要測試的文本示例
下面的python代碼片段將讀取hackerreath訓練數據(train.csv),并根據bert模型機型數據準備:
import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from pandas import DataFramele = LabelEncoder()df = pd.read_csv("data/train.csv")# Creating train and dev dataframes according to BERT df_bert = pd.DataFrame({'user_id':df['User_ID'],'label':le.fit_transform(df['Is_Response']),'alpha':['a']*df.shape[0],'text':df['Description'].replace(r'\n',' ',regex=True)})df_bert_train, df_bert_dev = train_test_split(df_bert, test_size=0.01)# Creating test dataframe according to BERT df_test = pd.read_csv("data/test.csv") df_bert_test = pd.DataFrame({'User_ID':df_test['User_ID'],'text':df_test['Description'].replace(r'\n',' ',regex=True)})# Saving dataframes to .tsv format as required by BERT df_bert_train.to_csv('data/train.tsv', sep='\t', index=False, header=False) df_bert_dev.to_csv('data/dev.tsv', sep='\t', index=False, header=False) df_bert_test.to_csv('data/test.tsv', sep='\t', index=False, header=True)原始訓練數據格式如下:
符合Bert的訓練數據格式如下:
3. 使用BERT預訓練模型進行模型訓練
進行訓練前的檢查(太重要了):
- 所有的.tsv文件都在“data”的文件夾中
- 創建文件夾“bert_output”,保存經過微調的模型,并以“test_results.tsv”的名稱生成測試結果
-
檢查是否下載了“cased_l-12_h-768_a-12”中的預先訓練的bert模型到當前目錄
-
確保命令中的路徑是相對路徑(以“/”開頭)
在終端上運行以下命令:
python run_classifier.py --task_name=cola --do_train=true --do_eval=true --do_predict=true --data_dir=./data/ --vocab_file=./cased_L-12_H-768_A-12/vocab.txt --bert_config_file=./cased_L-12_H-768_A-12/bert_config.json --init_checkpoint=./cased_L-12_H-768_A-12/bert_model.ckpt --max_seq_length=400 --train_batch_size=8 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=./bert_output/ --do_lower_case=False在輸出目錄中生成“test_results.tsv”,作為對測試數據集的預測的結果它包含所有類在列中的預測概率值。
4. 提交結果
下面的python代碼將結果從BERT模型轉換為.csv格式,以便提交給hackerreath Challenge:
df_results = pd.read_csv("bert_output/test_results.tsv",sep="\t",header=None) df_results_csv = pd.DataFrame({'User_ID':df_test['User_ID'],'Is_Response':df_results.idxmax(axis=1)})# Replacing index with string as required for submission df_results_csv['Is_Response'].replace(0, 'happy',inplace=True) df_results_csv['Is_Response'].replace(1, 'not_happy',inplace=True)# writing into .csv df_results_csv.to_csv('data/result.csv',sep=",",index=None)下圖顯示了將概率值轉換為提交結果的過程:
BERT的威力就是可以將排名從66升到第4!!!
5. 總結
- Bert的訓練環節:
該模型使用兩個新的無監督預測任務進行預訓練:
BERT使用了一種簡單的方法:MASK輸入中15%的單詞,通過一個深度Bidirectional Transformer encoder運行整個序列,然后只預測MASK的單詞例如:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk. Labels: [MASK1] = store; [MASK2] = gallon為了學習句子之間的關系,BERT還訓練了一個可以從任何單語語料庫生成的簡單任務:給定兩個句子a和b,預測b是a之后的實際下一個句子,還是只是語料庫中的一個隨機句子。
Sentence A: the man went to the store. Sentence B: he bought a gallon of milk. Label: IsNextSentenceSentence A: the man went to the store. Sentence B: penguins are flightless. Label: NotNextSentence- 根據模型體系結構的規模,有兩個預先訓練的模型,即BASE和LARGE。
?
總結
以上是生活随笔為你收集整理的基于bert模型的文本分类研究:“Predict the Happiness”挑战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [CB]将窗体从属于主窗体
- 下一篇: 联想将推出全新系列笔记本