深度學習實戰篇-基于RNN的中文分詞探索
近年來,深度學習在人工智能的多個領域取得了顯著成績。微軟使用的152層深度神經網絡在ImageNet的比賽上斬獲多項***,同時在圖像識別中超過了人類的識別水平。百度在中文語音識別上取得了97%的準確率,已經超過了人類的識別能力。
隨著深度學習在越來越多的領域中取得了突破性進展,自然語言處理這一人工智能的重要領域吸引了大批的研究者的注意力。最近谷歌發布了基于深度學習的機器翻譯(GNMT),和基于短語的機器翻譯相比,錯誤率降低了55%-85%以上,從而又引發了深度學習在自然語言處理上的熱潮。
自然語言處理是人工智能和語言學的交叉學科,在搜索引擎,問答系統,機器翻譯等人工智能領域發揮著重要作用。分詞,詞性標注,命名實體識別作為自然語言處理的基礎領域,同樣吸引著大批研究者的注意力,本篇就結合我們近期的一些探索從中文分詞角度探索深度學習在自然語言處理中的應用。
中文分詞是將自然語言文本劃分成詞語序列,目前主流方法為序列標注,即用BMES這個四個標簽去標注句子中的每一個字(B是詞首,M是詞中,E是詞尾,S是單字詞)。
對于 { 京東 搜索 與 大數據 平臺 數據挖掘 算法部 }
其標注為{ BE BE S BME BE BMME BME }
使用Keras實現了基于RNN的中文分詞,接下來就分別介紹一下Keras和中文分詞實戰。
1. Keras介紹
Keras 是一個高度模塊化的深度學習框架,使用python編寫,封裝了大量的函數接口,可支持CPU和GPU訓練。Keras提供了一系列模塊,這樣我們在實驗模型的時候只需要調用這些模塊就可以完成模型搭建,不用自己在去實現各層網絡。
主要模塊有Optimizers(優化函數模塊),常用的有SGD(隨機梯度下降)、 Adam;Objectives(目標函數模塊),常用的有均方誤差,交差熵;Activations(激活函數模塊),sigmoid用來做二分類、relu可解決梯度消失問題、softmax常用來做多分類;Layers(網絡層模塊),提供了CNN(卷積層)、RNN(LSTM、GRU)、embeddings;Initializations(初始化模塊),主要用于模型參數的初始化,常用的有均勻分布初始化,高斯分布初始化。
使用Keras進行模型試驗,可分為四個步驟(數據準備,模型構建, 模型訓練, 模型測試),本文也將基于這四個步驟探索基于RNN的中文分詞。
2. 中文分詞實戰
數據準備
訓練數據使用的是bakeoff2005中的北京大學的標注語料,train作為訓練樣本,test作為測試樣本。
統計訓練樣本中出現的字符并生成字典,同時將訓練樣本中字符全部映射成對應的字典索引(為了處理未登錄詞,將出現次數低于2次的字符映射為未登錄詞)。在序列標注分詞中,一個字的標簽受到上下文的影響,因而取該字的前后3個字作為特征。
模型構建
本文模型由一層Embedding層,2層LSTM,一個Dense輸出層構成,目標函數為交叉熵,優化函數選擇adam。為了驗證方法的有效性,本文未采用外部語料預訓練詞向量,而是在訓練數據上訓練詞向量。
Embedding層完成從詞典索引到詞向量的映射過程,即輸入一個詞典索引,輸出該索引對應的詞向量,***層LSTM層輸入為詞向量序列,輸出為隱層輸出序列,第二層LSTM層輸入為前一層輸出序列,輸出為隱層個數,Dense輸出層輸入為第二層LSTM輸出,輸出為類別數。
在這里embeddingDim設為128,RNN序列長度設為7,LSTM隱層個數設為100,outputDims設為4,batch_size設為128。
模型訓練
分別在CPU和GPU(使用單卡)上進行模型訓練,使用單卡GPU的速度為CPU的4.7倍,未來還會測試單機多卡和多機多卡的性能。
CPU
GPU
模型測試
使用北京大學test進行測試,并使用bakeoff2005的測試腳本進行測試,結果如下所示:
3.總結和展望
深度學習的優點是可以自動發現特征,大大減少了特征工程的工作量。目前深度學習已經在語音和圖像等領域取得重大進展,自然語言與語音、圖像不同,是抽象符號,因而如何將深度學習應用于自然語言處理需要進行更多的研究和探索:針對不同任務的不同字詞表示、將先驗知識和深度學習相結合、Attention機制的運用。同時相對于標注數據,未標注數據量更多,如何運用未標注數據也是目前自然語言處理探索的熱點和難點。