大家好,我是對白。
今天給大家介紹一個超強大的NLP標注工具Prodigy,不僅可以應用在實體關系抽取和文本分類等NLP任務上,還可以應用到CV和音視頻任務中,來源:知乎@沉默的路人甲。
一、Prodigy是什么
Prodigy是一種款由Explosion AI開發的支持腳本編寫的數據標注工具,用於為機器學習模型創建訓練集和驗證集,方便用戶可以快速獨立的迭代自己的機器學習模型。此外,Prodigy可以幫助使用者檢查和清理數據,進行錯誤分析。
二、Prodigy在NLP中的優勢
自然語言處理大部分的任務都屬於監督學習類型,並且NER是NLP中一個子問題。NER的准確度是保證實現信息提取、問答系統、句法分析、機器翻譯等眾多高級NLP任務的重要基礎。在NER任務中,需要大量需要標注的數據進行訓練。深度學習大行其道的今天,基於深度學習的 NLP 模型更是數據飢渴。談到自然語言中的數據,首先腦海中會想起語料庫。然而,最前沿的的NLP技術往往首先針對於英文語料,這點導致了中文NLP生態沒有英文NLP生態好,中文的開源語料庫相對於英文品種和數量都少。此外,NLP對一些垂直領域方面,如醫療、金融、法律等,專有名詞和特有需求甚多,因此,這些場景很難移植使用一般語料庫訓練出來的模型。遇到上述的情景,自然語言處理的開發者就要自己選擇相關數據並標注去訓練模型。因此在NLP中,一個好用的數據標注工具是非常重要的,它可以幫助使用者更快的預處理機器學習模型所需的數據,加速產品的落地。
傳統的標記方法往往繁瑣且效率低。Prodigy的強大之處在於它有一套智能算法,可以減少人工的重復勞動。並且Prodigy的標注UI易於上手,可以幫助使用者高效進行標注。並且在UI界面還有標注進度顯示和標注接受率,這個功能可以讓標注者更好地規划自己的標注速度,改變自己的標注策略。
Prodigy 的簡單架構圖
上圖是Prodigy的一個簡單架構圖,Web app即為Prodigy提供給使用者高效標注的界面。在用戶標注一部分數據后,這些數據可自動或手動的傳入數據庫中。REST API為用戶操作數據提供了極大地便利,它還能連接SpaCy的接口去處理數據。而Recipe類似於method的意思,通過不同的recipe可以在command line上進行想要的操作。並且可以自定義recipe來使用任何框架插入自定義模型。
三、主動學習的智能標注算法
通過查閱相關文檔發現,Prodigy將主動學習的后台算法分為了online和offline兩部分。
其主要流程如下:
-
用戶標注一個label。
-
online部分是通過用戶的標注即時更新模型,這個階段采取的是傳統方法。由於Prodigy是閉源工具,尚不了解它的具體算法。我最初想法是想要用bag-of-word模型或者是使用BIO表示法結合SVM的one-vs-one或one-vs-rest進行快速冷啟動。不過后來在看到Prodigy的Co-Founder Ines對該工具的NER功能的tutorial中提到了“即使有單詞拼寫錯誤,也可能被正確的標注出來”,我覺得在這一階段使用了word2vec的方法,因為拼寫錯誤的詞和正確的詞的詞向量是非常接近的。因為Prodigy和著名NLP開源軟件庫-SpaCY是一個團隊,Prodigy用了很多SpaCy的接口。不過我發現SpaCy不能生成自定義詞向量,所以如果在訓練時想要使用自定義詞向量,需要使用其他庫。spaCy的官方文檔也建議使用其他庫,例如用Gensim來生成詞向量。
-
offline 部分是當標注數據積累到一定數量時更新模型(當然也可以使用左上角保存鍵提前訓練),然后使用准確度較高的復雜的深度學習模型(如LSTM+CRF,Bert+CRF或CNN+CRF等模型)。當然,很多常用類別可以直接調用SpaCy訓練好的的常用類別模型進行冷啟動,然后再開始進行step 2。
-
模型更新后,對盡可能多的 example 做預測,將確信度排序,取確信度最低的一個 example 作為待標注例子。重復 step 1 的過程。在確信度排序里,Prodigy采用了Beam Search的方法,這個方法可以解決每步預測都預測當前概率最大的元素,最后的序列卻可能不是概率最大的序列的問題。通過確定光束的寬度來得到同等數量的最優路徑,這可以增加找到概率最大的預測序列的可能。
-
在最終標注任務完成之后,offline 模型可以重新在所有標注數據上重新訓練,以達到最好的模型效果。
通過online 與 offline 模型互相協作,與用戶手動標注的過程一起不斷迭代,如果模型訓練得好,這個過程將直接忽略掉確信度最大的那些例子,而把所有重點放在分類邊界上的那些確信度小的例子。這樣可以盡算法所能減少用戶端的人工工作量。
四、標注前端用戶友好
Prodigy在NER任務中有三種處理方式,這提供給了用戶不同的操作選擇,大大增加了操作的多樣化。在Manual模式中,用戶只需要雙擊單詞就可以將單個詞高亮,並且也可以使用鼠標拖動選擇多個詞。此外在鼠標拖動這個功能里,它會自動識別邊界,用戶不必像素精確到詞的尾部。例如school這個詞,即便拖動到h這個字符,那么這整個詞也會高亮,這大大簡化了標注難度,提高標注的准確度。如果用戶需要標注到單個字符,這時候可以選擇character- based模式。如果在已經有一個模型,並希望在更多數據上對其進行微調,還可以使用binary模式進行快速判斷,這樣可以更快速讓模型得到反饋,提高了模型后期的訓練速度。
五、可編寫腳本且可擴展
Prodigy是完全可編寫腳本的,並且可以整齊地插入基於Python的數據科學工作流的其余部分。Prodigy具有豐富的Python API、優雅的命令行集成和高效的Jupyter擴展。通過使用自定義配方腳本,用戶可以讓Prodigy以您喜歡的方式讀寫數據,並使用用戶喜歡的任何框架插入自定義模型。其中,我在Demo中了解到了強大的patterns參數支持模式匹配,模式匹配可以使用正則表達式寫成jsonl的文件建立模式或者直接使用Spacy庫里早就存在的types的模型進行預訓練,這些方法可以幫助模型克服冷啟動,並確保它以足夠多的積極示例開始,從而提出有意義的建議。這可以用於性能非常差的實體類型,甚至可以將新實體類型添加到現有模型中。
六、Prodigy命名識別任務流程
下面的流程圖詳細的介紹了在NER任務中,不同階段應該使用的recipes(左上角的Legend是所用到的recipes的簡單介紹),具體的recipe介紹可以查詢Prodigy官方recipes文檔。
七、Prodigy支持其它任務類型
Prodigy不僅有強大的算法支持命名體識別的標注,它還支持多種其他任務。Prodigy為每個任務都提供了一個用戶友好且多樣性的標注方式,如:
-
實體關系抽取:從文檔中提取較長的短語和嵌套表達式是應用自然語言處理中的常見任務。Prodigy允許用戶通過手動高亮顯示單詞文本來標記關系。關系任務最困難的是,沒有兩個問題是完全相同的,因此添加一點自定義邏輯很重要。而Prodigy可以使用spaCy強大的規則引擎或用戶自定義的recipe輕松添加規則以自動合並短語或關系。
-
文本分類:文本分類任務通常有多個類別可供選擇,這些類別可能不排他性,也可能不具有互不排他性。Prodigy完全支持所有這些問題類型。它通過提出“是或否”的問題,來讓用戶選擇。結合Prodigy的學習算法,這種二進制方法特別強大,因為這可以讓模型只選擇它最不確定的問題從而不斷增加模型信息。
-
CV問題:在運行對象檢測、圖像分割或圖像分類模型時,Prodigy可以輕松創建注釋訓練數據並糾正模型的錯誤。用戶可以使用繪制多邊形等多種方式處理圖片。並且對注釋可以導出為帶有像素坐標的簡單JSON文件,從而可以輕松地將數據集成到pipeline。
-
音頻和視頻:高亮顯示音頻或視頻文件的切片,並用所需要的任何標簽標記它們。Prodigy支持放大和縮小音視頻,使注釋更精確。並輕松啟動、停止和重播輸入音視頻,以確保處理正確。
技術交流群邀請函
已建立CV/NLP/推薦系統/多模態/內推求職等交流群!想要進交流群學習的同學,可以直接掃下方二維碼進群。
加的時候備注一下:昵稱+學校/公司。群里聚集了很多學術界和工業界大佬,歡迎一起交流算法心得,日常還可以嘮嗑~
后台回復關鍵詞【人工智能】
領取整理最全面的人工智能學習禮包
后台回復關鍵詞【對比學習】
獲取最新對比學習
在各大頂會上的論文合集!
往期精彩回顧
[
一年級阿里算法工程師的工作總結
[
一位字節朋友的2021年終總結
[
Facebook AI研究員田淵棟:2021年年終總結
最后歡迎大家關注我的微信公眾號:對白的算法屋(duibainotes),跟蹤NLP、推薦系統和對比學習等機器學習領域前沿,日常還會分享我的創業心得和人生感悟。想進一步交流的同學也可以通過公眾號加我的微信,和我一同探討技術問題,謝謝!