引言
其實最近挺糾結的,有一點點焦慮,因為自己一直都期望往自然語言處理的方向發展,夢想成為一名NLP演算法工程師,也正是我喜歡的事,而不是為了生存而工作。我覺得這也是我這輩子為數不多的剩下的可以自己去追求自己喜歡的東西的機會了。然而現實很殘酷,大部分的公司演算法工程師一般都是名牌大學,碩士起招,如同一個跨不過的門檻,讓人望而卻步,即使我覺得可能這個方向以後的路並不如其他的唾手可得的路輕鬆,但我的心中卻一直有一股信念讓我義無反顧,不管怎樣,夢還是要有的,萬一實現了呢~ <br /><br />
扯得有點遠了hhh,回到文章,因為目前有在做涉及到文字分析(情感分析)的專案,也想為以後的相關專案做下知識儲備,最近開始入坑Tensorflow的一些深度學習的NLP相關實踐,同時學習了文字分類領域中基於深度學習的模型的一些應用知識(然而還是個菜鳥,半懂不懂的哈哈哈)。這裡對相關知識進行了總結,鞏固個人知識體系,同時分享給大家~<br />(提前宣告:菜雞觀點,非大佬觀點,歡迎糾正,也會不斷修正的)<br />
持續更新........
基於深度學習的文字分類
文字分類領域,目前主要可分為:
- 情感分析
- 新聞分析
- 主題分類
- 問答系統
- 自然語言推理(NLI)
五大領域(當然也有一些其他細分領域,這裡不進行討論)。近幾年隨著深度學習在自然語言處理領域的應用,文字分類也進入了由深度學習模型所導引的第三個階段,逐漸超越了基於傳統機器學習的方法。
目前,學術界針對文字分類所提出的深度學習模型大致有150多種,根據結構可分為11大類:
- 前饋網路:將文字視為詞袋
- 基於RNN的模型:將文字視為一系列單詞,旨在捕獲文字單詞依存關係和文字結構
- 基於CNN的模型:經過訓練,可以識別文字分類的文字模式(例如關鍵短語)。
- 膠囊網路(Capsule networks):解決了CNN在池化操作時所帶來的資訊丟失問題。
- 注意力機制:可有效識別文字中的相關單詞,並已成為開發DL模型的有用工具。
- 記憶體增強網路:將神經網路與某種外部儲存器結合在一起,該模型可以讀取和寫入。
- 圖神經網路:旨在捕獲自然語言的內部圖結構,例如句法和語義解析樹。
- 暹羅神經網路(Siamese):專門用於文字匹配,這是文字分類的特殊情況。
- 混合模型(Hybrid models):結合了注意力,RNN,CNN等以捕獲句子和文件的區域性和全域性特徵。
- Transformers:比RNN擁有更多並行處理,從而可以使用GPU高效的(預)訓練非常大的語言模型。
- 監督學習之外的建模技術:包括使用自動編碼器和對抗訓練的無監督學習,以及強化學習。
阿巴阿巴,如果看不太懂也沒關係,我也只認識比較經典的幾個hhh,但是可以瞭解下做儲備嘛,也許哪一天就接觸到了呢~下面這張圖是2013年至2020年釋出的一些很經典的深度學習文字嵌入和分類模型。我們可以看到入門的word2vec在2013年就已經提出來了,還有當下比較熱門的Tree-LSTM、BERT也是前幾年提出來的,的確是更新很快啊emmmm...
如何選擇合適的神經網路模型
我們在針對文字分類任務選擇最佳的神經網路結構時,常常會很迷茫,像我這種菜鳥就是百度下哪個模型社群比較火就用大佬們的程式碼來複現hhh(當然使用比較多也說明這個模型的效能和適用性不會太差)。老師常說,其實要多試,採用精度最高的。嗚嗚嗚,然而現實是前期用來做精度驗證的資料集的標註就是一個很大的工程量了,然後每一個模型的實現也.....很!復!雜!啊!超級燒腦,畢竟神經網路的構建可不是傳統機器學習演算法那樣調一兩個引數就好了~
當然,多試肯定是要多試的,但是我們應該有選擇性的試,那麼,初步的篩選、確定模型的類別就很重要了,這一點其實很靠經驗,我這個菜雞就不教壞大家了,我們來看下大佬的官方思路:
神經網路結構的選擇取決於目標任務和領域,領域內標籤的可用性,應用程式的延遲和容量限制等,這些導致選擇差異會很大。儘管毫無疑問,開發一個文字分類器是反覆試錯的過程,但通過在公共基準(例如GLUE )上分析最近的結果,我們提出了以下方法來簡化該過程,該過程包括五個步驟:
- 選擇PLM(PLM,pretraining language model預訓練語言模型):使用PLM可以顯著改善所有流行的文字分類任務,並且自動編碼的PLM(例如BERT或RoBERTa)通常比自迴歸PLM(例如OpenAI GPT)更好。Hugging face擁有為各種任務開發的豐富的PLM倉庫。
- 領域適應性:大多數PLM在通用領域的文字語料庫(例如Web)上訓練。如果目標領域與通用的領域有很大的不同,我們可以考慮使用領域內的資料,不斷地預訓練該PLM來調整PLM。對於具有大量未標記文字的領域資料,例如生物醫學,從頭開始進行語言模型的預先訓練也可能是一個不錯的選擇。
- 特定於任務的模型設計:給定輸入文字,PLM在上下文表示中產生向量序列。然後,在頂部新增一個或多個特定任務的層,以生成目標任務的最終輸出。特定任務層的體系結構的選擇取決於任務的性質,例如,需要捕獲文字的語言結構。比如,前饋神經網路將文字視為詞袋,RNN可以捕獲單詞順序,CNN擅長識別諸如關鍵短語之類的模式,注意力機制可以有效地識別文字中的相關單詞,而暹羅神經網路則可以用於文字匹配任務,如果自然語言的圖形結構(例如,分析樹)對目標任務有用,那麼GNN可能是一個不錯的選擇。
- 特定於任務的微調整:根據領域內標籤的可用性,可以使用固定的PLM單獨訓練特定任務的層,也可以與PLM一起訓練特定任務的層。如果需要構建多個相似的文字分類器(例如,針對不同領域的新聞分類器),則多工微調是利用相似領域的標記資料的好選擇。
- 模型壓縮:PLM成本很高。它們通常需要通過例如知識蒸餾進行壓縮,以滿足實際應用中的延遲和容量限制。
是不是看不懂了,我攤牌了,第一遍讀完我整個人都是懵的,然後又仔細讀了兩遍,好像懂了一點點,又百度了一些專業名詞,又懂了一丟丟了,但還是懂一半啊哈哈哈哈。估計要真正走一遍流程之後採用完全解讀吧!等之後有時間實踐一遍我再重新更新解讀一下!
模型效能分析
當下常用的用於評估文字分類模型效能的指標,以下介紹4種:
準確率和錯誤率(Accuracy and Error Rate):評估分類模型質量的主要指標,是從整體角度出發的。假設TP,FP,TN,FN分別表示真積極,假積極,真消極和假消極,為樣本總數。分類精度和錯誤率在等式中定義如下:
- Accuracy=(TP+TN)/N
- Error Rate=(FP+FN)/N
- Error Rate= 1-Accuracy
精度/召回率/ F1分數(Precision / Recall / F1 score):也是主要指標,針對於預測結果而言的。F1分數是精度和查全率的調和平均值。一般情況下用於單個分類類別樣本的驗證,對於多類別分類問題,也可以為每個類別標籤計算精度和召回率,並分析類別標籤上的各個效能,或者對這些值取平均值以獲取整體精度和召回率。F1較高說明模型比較理想。
- Precision = TP/(TP+FP)
- Recall = TP/(TP+TN)
- F1 score = 2Precision*Recall/(Precision+Recall)
Exact Match(EM):精確匹配度量標準是問答系統的一種流行度量標準,它可以測量與任何一個基本事實答案均精確匹配的預測百分比。EM是用於SQuAD的主要指標之一。
Mean Reciprocal Rank(MRR):MRR通常用於評估NLP任務中的排名演算法的效能,例如查詢文件排名和QA。是所有可能答案的集合,ranki是真相答案的排名位置。
- 其他廣泛使用的指標包括平均精度Mean Average Precision(MAP),曲線下面積 Area Under Curve(AUC),錯誤發現率False DiscoveryRate,錯誤遺漏率False Omission Rate,僅舉幾例。
相關的定義百度很多hhh,這裡有幾個點是我在學習過程中注意到的:
- 很多人會把Accuracy和Precision搞混,雖然中文轉換過來經常回混用,但切記這是兩個不同的東西,一個時相對整體的指標,一個是相對於預測結果的。
- 一般情況下,查準率(精度)和查全率(召回率)不能同時提高。這是很多人都不太會注意的點,所以解釋一下,一般當查準率比較低時,我們會提高閾值,即減少輸入的測試樣本,從而保證模型預測出的正例都是真實的正例,很明顯這個時候雖然查準率提高了,但我輸入的總測試樣本減少了,導致有些樣本你本來可以正確預測的,但你並沒有輸入。這個就是提高 Precision 而導致 Recall 降低的過程,你也可以反過來,得到的就是提高 Recall 而導致 Precision 降低的過程。所以,一般Precision高,Recall低;Recall低高,Precision低
- P-R曲線問題,這裡貼一張在網上淘到的某位大佬的筆記hhh,所以就截圖放進來了,講的很透徹:
當然深度學習模型效能分析除了使用常用的評估文字分類模型效能的指標進行評估外,還可以與傳統的機器學習演算法或其他非深度學習模型指標進行一個對比,進一步來凸顯效能的提升。
看法:機遇與挑戰
深度學習其實是一個很早前提出來的東西,卻在近幾年火得一塌糊塗,不僅源於相關理論、硬體條件的發展,當然也源於其強大的應用成效。藉助深度學習模型,CV和NLP的相關領域也取得了很大的進步。前沿、先進的新穎思路也層出不窮,如神經嵌入,注意力機制,自我注意力,Transformer,BERT和XLNet,這些思想導致了過去十年的快速發展。在這方面,國內其實做的還不夠完善,相比於國外大量成熟的落地專案和開源工具。然而,由於中文語言的特殊性,我們也看到中文自然語言處理,中文文字分析還具有很大的發展改善空間。很多公司也開拓了中文文字分析的一站式業務,並致力於 提升其適用性和精確度。
缺少大規模的中文領域資料集,這是我在中文自然語言探索時所發現的一個國內學術的重大缺失,這在一定程度上也抑制了一些相關領域的發展,同時也難以形成一個微細分通用領域的模型評測度量,這也導致了很多小型團隊的研究成果也難以推廣。在這個基礎上,針對更具挑戰性的文字分類任務構建新的資料集,例如具有多步推理的QA,針對多語言文件的文字分類,用於極長的文件的文字分類也將成為下一個中文文字分析領域飛速發展的突破口。(僅代表個人觀點hhh)
除此之外,因為目前大多數的深度學習模型是受監督型別,所以需要大量的領域標註文字,需要大量人力和時間成本的投入,雖然目前已經有了少量學習和零學習Few-Shot and Zero-Shot Learning概念的提出,但仍不夠成熟,如何更好地、較為平衡地降低模型的輸入成本是一個下一個待解決的問題。
增加對常識知識進行建模的探索。在這一點上,領域知識圖譜的構建是一個重要的分支。結合知識圖譜進行深度學習,進而提高模型效能的能力,在提高解釋性的同時,無疑也增加了機器對語義的理解,這和人的思維是很接近的,而不只是一個不可預測的黑箱模型。在此基礎上,實現以人們類似的思維方式基於對未知數的“預設”假設進行推理,而不只是依賴於數字模型。目前,知識圖譜構建的研究在國內已經有了大量的探索,趨向一個較為成熟的階段,而結合知識圖譜進行深度學習的研究卻鮮有團隊進行探索,或者說在萌芽階段(如果沒記錯大部分是基於圖資料庫的深度學習),至少還沒有較為著名的開源專案(可能是我沒發現哈哈哈)。
黑箱模型的深層探索。雖然深度學習模型在具有挑戰性的基準上取得了可喜的效能,但是其中大多數模型都是無法解釋的。例如,為什麼一個模型在一個數據集上勝過另一個模型,而在其他資料集上卻表現不佳?深度學習模型究竟學到了什麼?能在給定的資料集上達到一定精度的最小神經網路架構是什麼?儘管注意力和自我注意力機制為回答這些問題提供了一些見識,但仍缺乏對這些模型的基本行為和動力學的詳細研究。更好地瞭解這些模型的理論方面可以幫助開發針對各種文字分析場景的更好的模型。