回覆列表
  • 1 # 機器之心Pro

    去年,我寫了一篇關於使用詞嵌入如 word2vec 或 GloVe 進行文字分類的文章(http://nadbordrozd.github.io/blog/2016/05/20/text-classification-with-word2vec/)。在我的基準測試中,嵌入的使用比較粗糙,平均文件中所有單詞的詞向量,然後將結果放進隨機森林。不幸的是,最後得出的分類器在一些特殊情況(極少的訓練樣本,大量的未標註資料)下不如優秀的 SVM,儘管它比較老。

    當然有比平均詞向量更好的使用詞嵌入的方式,上個月我終於著手去做這件事。我對 arXiv 上的論文進行了簡單的調查,發現大部分先進的文字分類器使用嵌入作為神經網路的輸入。但是哪種神經網路效果最好呢?LSTM、CNN,還是雙向長短期記憶(BLSTM)CNN?網上有大量教程展示如何實現神經分類器,並在某個資料集上進行測試。問題在於它們給出的指標通常沒有上下文。有人說他們在某個資料集上的準確率達到了 0.85。這就是好嗎?它比樸素貝葉斯、SVM 還要好嗎?比其他神經架構都好?這是偶然嗎?在其他資料集上的效果也會一樣好嗎?

    為了回答這些問題,我在 Keras 中實現了多個神經網路架構,並建立了一個基準,使這些演算法與經典演算法,如 SVM、樸素貝葉斯等,進行比較。地址:https://github.com/nadbordrozd/text-top-model。

    模型

    該 repository 中所有模型都用.fit(X, y)、.predict(X)、.get_params(recursive) 封裝在一個 scikit-learn 相容類中,所有的層大小、dropout 率、n-gram 區間等都被引數化。為清晰起見,下面的程式碼已經簡化。

    由於我本來想做一個分類器基準,而不是預處理方法基準,因此所有的資料集都已被符號化,分類器得到一個符號 id 列表,而不是字串。

    樸素貝葉斯

    樸素貝葉斯分為兩種:伯努利(Bernoulli)和多項式(Multinomial)。我們還可以使用 tf-idf 加權或簡單的計數推斷出 n-gram。由於 sklearn 的向量器期待字串,並給它一個整數符號 id 列表,因此我們必須重寫預設預處理器和分詞器。

    SVM

    SVM 是所有文字分類任務的強大基線。我們可以對此重用同樣的向量器。

    多層感知器

    又叫作 vanilla 前饋神經網路。該模型不使用詞嵌入,輸入是詞袋。

    該模型的輸入需要和標籤一樣進行獨熱編碼。

    (雙向)長短期記憶

    從這裡開始事情就變得有趣了。該模型的輸入不是詞袋而是一個詞 id 序列。首先需要構建一個嵌入層將該序列轉換成 d 維向量矩陣。

    以下適用於該模型:

    該模型以及其他使用嵌入的模型都需要獨熱編碼的標籤,詞 id 序列用零填充至固定長度:

    François Chollet 的 cnn

    該架構(稍作修改)來自 Keras 教程(https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html),專門為長度為 1000 的文字設計,因此我使用它進行文字分類,而不用於語句分類。

    Yoon Kim 的 cnn

    該架構來自 Yoon Kim 的論文(https://arxiv.org/abs/1408.5882v2.pdf),我基於 Alexander Rakhlin 的 GitHub 頁面(https://github.com/alexander-rakhlin/CNN-for-Sentence-Classification-in-Keras)實現該架構。這個架構不依賴於恰好 1000 詞長的文字,更適合語句分類。

    BLSTM2DCNN

    論文作者稱,結合 BLSTM 和 CNN 將比使用任意一個效果要好(論文地址:https://arxiv.org/abs/1611.06639v1)。但是很奇怪,這個架構與前面兩個模型不同,它使用的是 2D 卷積。這意味著神經元的感受野不只是在文字中的近鄰詞之間執行,還在嵌入向量的近鄰座標中執行。這有些可疑,因為他們使用的嵌入如 GloVe 的連續座標沒有關係。如果一個神經元學習一個座標 5 和 6 的圖案,那麼我們沒有理由認為同樣的圖案可以生成座標 22 和 23,這樣卷積就失去意義。但是我又知道些什麼呢!(攤手)

    堆疊

    除了那些基礎模型外,我還實現了堆疊分類器,來連線不同模型之間的預測。我使用 2 個版本的堆疊。一個是基礎模型返回機率,機率由一個簡單的 logistic 迴歸連線;另一個是基礎模型返回標籤,使用 XGBoost 連線標籤。

    資料集

    對於文件分類基準,我使用的所有資料集均來自:http://www.cs.umb.edu/~smimarog/textmining/datasets/,包括 20 個新聞組、不同版本的 Reuters-21578 和 WebKB 資料集。

    對於語句分類基準,我使用的是影評兩極化資料集(http://www.cs.cornell.edu/people/pabo/movie-review-data/)和斯坦福情緒樹庫資料集(http://nlp.stanford.edu/~socherr/stanfordSentimentTreebank.zip)。

    結果

    一些模型僅用於文件分類或語句分類,因為它們要麼在另一個任務中表現太差,要麼訓練時間太長。神經模型的超引數在基準中測試之前,會在一個數據集上進行調整。訓練測試樣本的比例是 0.7 : 0.3。每個資料集上進行 10 次分割,每個模型接受 10 次測試。下表展示了 10 次分割的平均準確率。言歸正傳:

    文件分類基準

    語句分類基準

    結論

    這很平庸。

    帶嵌入的神經網路沒有一個打敗樸素貝葉斯和 SVM,至少沒有持續打敗。只有一層的簡單前饋神經網路比任何其他架構效果都好。

    我怪我的超引數。它們沒有得到足夠的調整。尤其是訓練的 epoch 數量。每個模型只訓練 1 個 epoch,但是不同的資料集和分割可能需要不同的設定。

    但是,神經模型顯然在做正確的事,因為將它們新增至整體或者堆疊能夠大大提高準確率。

  • 2 # 熊貓半夜不睡覺29678659

    主要看語料,文字層面一般的機器學習演算法都是n-gram為基礎,主要看統計特徵,所以看你的問題是不是依靠統計就能解決主要問題了,比如常見的話題分類,或者不同的主題文字,類似體育 財經這類的。對於這類問題可能NB SVM都可以很好的Work。

    神經網路的話,sentence-level如果不知道選哪個模型比較好,Attention-BILSTM通常是比較好的選擇,document-level可以選擇 層級的CNN/LSTM—LSTM+Attention。

  • 中秋節和大豐收的關聯?
  • 淮揚地區著名麵點是什麼情況?