NLP新手入門指南|北大-TANGENT

2022-09-23 06:00:37

開源的學習資源:《NLP 新手入門指南》,專案作者為北京大學 TANGENT 實驗室成員。 該指南主要提供了 NLP 學習入門引導、常見任務的開發實現、各大技術教學與文獻的相關推薦等內容,是一份非常全的適合新手小白初學入門的權威指南。 值得mark!

以下正文:

本教學供新加入 TANGENT 實驗室的同學入門 NLP 使用

寫在前面

相信大家經過幾年的學習,已經擁有了以下的技能:

  1. 優秀的資訊檢索能力,無論是在論文閱讀、寫程式碼、使用伺服器、寫論文等過程中都有可能遇到各種各樣的問題,在詢問他人之前,請善用搜尋
  2. 優秀的英文閱讀能力和基本的英語寫作能力
  3. 良好的程式設計能力,在 NLP 相關研究中,我們通常會使用 Python,如果你之前只學過 C 或者 C++,那麼入門 Python 對於你來說將不是一件難事。 我們一般使用 Anaconda(Miniconda)來管理個人電腦乃至 Linux 伺服器上的 Python 環境,請提前安裝並學習 conda 的使用。 此外在科研中我們經常會與他人合作,因此請保持良好的程式碼習慣,如果你不瞭解程式碼規範,請參考 Google 的 Python 程式碼規範
  4. 數學基礎,作為一名理工科的學生,你應該已經學過高等數學(數學分析)、線性代數(高等代數)、概率論與統計等基礎數學課程,在入門階段我們涉及到的數學知識較為簡單,但是紮實的數理基礎會支撐你走得更深更遠。
  5. 最好擁有 Linux 系統使用經驗,目前是深度學習的時代,對於自然語言處理領域,又是大規模預訓練語言模型的時代,個人電腦無法支撐大模型的訓練,我們將使用 Linux 伺服器進行 Coding 和實驗,提前瞭解工作流程會大大提高效率。 本教學動手實踐部分基於 CNN 和 RNN(LSTM)的模型理論上可以在個人電腦上執行,如需 GPU 資源,請聯絡實驗室伺服器管理員。

基礎知識

我們預設大家已經完成了計算機專業本科一年級和二年級的相關課程,擁有一定的數學和程式設計基礎

機器學習

雖然目前是深度學習的時代,我們也很少使用傳統機器學習的演演算法來解決問題,但是一方面一些基礎概念仍然是相通的,另一方面經典機器學習演演算法的思想,如 EM、LDA 等,在深度學習時代往往能夠歷久彌新,以另一種方式煥發出新的光彩。 對於想要快速入門的初學者來說,建議先熟悉機器學習基礎概念(什麼是機器學習,機器學習用來幹什麼,什麼是資料集,如何對機器學習演演算法進行評測等),瞭解幾種具體的經典機器學習演演算法。

對於初學者可以學習:

  • 網課:吳恩達 機器學習公開課;李宏毅 機器學習
  • 書:機器學習(周志華,西瓜書),統計學習方法(李航)

如果想更深地瞭解:

深度學習

深度學習的發展為我們的世界帶來了巨大的改變,2018的圖靈獎也頒給了對深度學習有卓越貢獻的 Yoshua Bengio、Yann LeCun、Geoffrey Hinton。

書:Deep Learning(GoodFellow, Bengio, Courville),神經網路與深度學習(邱錫鵬)

對於初學者來說,僅僅瞭解深度學習的基本概念、基本演演算法是不夠的,更應當到程式碼當中去獲得更為直觀和深入的認識。大家可能也聽說過 TensorFlow、PyTorch 這樣的深度學習框架,目前學術界通常使用 PyTorch。

PyTorch 對初學者也提供了快速入門指南tutorial,對於 tutorial,建議從簡單的影象分類演演算法學起,然後再進一步學習簡單的文字分類簡單的文字生成等自然語言處理相關教學。

PyTorch 提供了非常詳細的檔案,遇到不明白的函數、概念都可以在檔案中進行查詢和學習

自然語言處理

我們實驗室的名稱為計算語言學研究所,通常意義上計算語言學(Computational Linguistics,CL)屬於語言學的一個分支,而自然語言處理(Natural Language Processing,NLP),在現代意義上兩者往往會混為一談。

什麼是自然語言處理或者計算語言學?這裡摘抄一段 The Association for Computational Linguistics (ACL) 的介紹: "Computational linguistics is the scientific study of language from a computational perspective. Computational linguists are interested in providing computational models of various kinds of linguistic phenomena. These models may be "knowledge-based" ("hand-crafted") or "data-driven" ("statistical" or "empirical"). Work in computational linguistics is in some cases motivated from a scientific perspective in that one is trying to provide a computational explanation for a particular linguistic or psycholinguistic phenomenon; and in other cases the motivation may be more purely technological in that one wants to provide a working component of a speech or natural language system. Indeed, the work of computational linguists is incorporated into many working systems today, including speech recognition systems, text-to-speech synthesizers, automated voice response systems, web search engines, text editors, language instruction materials, to name just a few."

NLP 包含哪些 topic 呢?同樣是摘抄自 60th Annual Meeting of the Association for Computational Linguistics 的 Submissions Topics:

  • Computational Social Science and Cultural Analytics
  • Dialogue and Interactive Systems
  • Discourse and Pragmatics
  • Ethics and NLP
  • Generation
  • Information Extraction
  • Information Retrieval and Text Mining
  • Interpretability and Analysis of Models for NLP
  • Language Grounding to Vision, Robotics and Beyond
  • Linguistic Theories, Cognitive Modeling, and Psycholinguistics
  • Machine Learning for NLP
  • Machine Translation and Multilinguality
  • NLP Applications
  • Phonology, Morphology, and Word Segmentation
  • Question Answering
  • Resources and Evaluation
  • Semantics: Lexical
  • Semantics: Sentence-level Semantics, Textual Inference, and Other Areas
  • Sentiment Analysis, Stylistic Analysis, and Argument Mining
  • Speech and Multimodality
  • Summarization
  • Syntax: Tagging, Chunking and Parsing

可以看到 NLP 這個語言學和電腦科學的交叉學科實在是包含了太多的研究方向,而其中除了機器翻譯(MT)、摘要、QA 這些大家早有耳聞的應用,剩下的相信初學者大多從未聽說過,即使是一位 NLP 研究者或從業人員也只能對這個列表中的某一個或幾個方面有深入的研究。

想要對 NLP 是研究什麼的有個大致的瞭解,首先我們可以快速瞭解深度學習時代 NLP 發展歷史:A Review of the Neural History of Natural Language Processing,然後我們可以通過課程或書籍進行系統的學習:

  • 網課:
    • Stanford cs224n(強烈推薦,主講人是絕對的大牛 Christopher Manning,此課程從深度學習的角度出發對 NLP 進行全面的介紹,而其中的 talk 又涉及學術最前沿的進展,可謂廣度與深度俱全)
    • CMU CS 11-747
  • 書:
    • 統計自然語言處理(宗成慶)成書年代較早,具體方法與當下有較大距離,可瞭解 NLP 基本問題
    • 現代自然語言生成(黃民烈),關注自然語言生成(Natural Language Generation,NLG)
    • 自然語言處理:基於預訓練模型的方法(車萬翔),當今預訓練語言模型(Pretrained Language Model,PLM)儼然成為了 NLP 中的「基礎設施」(Foundation Model),「預訓練-微調」(Pretrain & Fine-tune)也成為了應用中的基本正規化,因此我們同樣需要了解基於預訓練模型的方法

文獻閱讀

Google Scholar

Google Scholar 可以理解為學術界的 Google

會議論文

我們主要閱讀國際會議論文,相關的會議有:

  • 自然語言處理相關會議:ACL, EMNLP, NAACL, COLING(按影響力排序)
  • ML 理論:ICML, NeurIPS, ICLR
  • AI 應用:AAAI, IJCAI(這兩個會議近年來影響力下降)

其中,ACL 系會議提供 anthology (https://aclweb.org/anthology/)

前沿進展

如果想了解某一個領域的前沿進展,通常會關注 arXiv(預印本),部分作者會選擇在發表前將論文上傳至 arXiv。arXiv 在工作日每日更新,便於及時追蹤前沿動態

工具

經典論文往往在 CSDN、知乎等平臺有中文讀後感,可以輔助閱讀

文獻分類整理是一個好習慣,建議根據個人喜好選擇諸如 Zotero(介面簡潔、跨平臺、免費、擴充套件豐富), Endnote, Mendeley, Papers 等文獻管理軟體

初學時做好論文筆記,可以使用 Markdown,也可以使用 Notion、Obsidian、OneNote 等筆記軟體

動手實踐

作為電腦科學的一個分支,NLP 同樣離不開程式碼,請有志加入 TANGENT 的同學完成以下練習任務。

寫在前面

在完成這些任務之前,還是需要一些說明。

一個深度學習專案的流程通常是這樣的:

  1. 資料讀取和預處理,得到 Dataset 和 DataLoader
  2. 構建 Model、Optimizer
  3. 使用隨機梯度下降迭代優化模型引數
  4. 設定 Metric,對模型進行評測

通常我們也會按照上述流程和流程中出現的各個模組組織專案檔案,一個專案往往會包含這些檔案:主函數(入口,負責以上流程的控制),資料讀取和預處理,模型,Metric。

我們針對任務二,給出了一個 ChineseNER 完整專案的原始碼。需注意,下面部分任務參考程式碼是以 Notebook 的形式組織的,在完成任務時,請參考 ChineseNER 重新組織程式碼。

任務一:基於深度學習的文字分類

文字分類是入門 NLP 的一個好的開始,同時 NLU(自然語言理解)任務本質上來說都可以歸類為文字分類。請使用 CNN 或 RNN(LSTM) 完成 Kaggle 上一個簡單的文字分類任務。

任務描述 & 資料集:https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/

Kaggle 裡也有一些程式碼可以參考,如:LSTM 實現

參考文獻: Convolutional Neural Networks for Sentence Classification (https://aclanthology.org/D14-1181/) Recurrent Convolutional Neural Networks for Text Classification (https://www.deeplearningitalia.com/wp-content/uploads/2018/03/Recurrent-Convolutional-Neural-Networks-for-Text-Classification.pdf)

任務二:基於 LSTM-CRF 的命名實體識別

在 NLP 中,結構預測(Structured Prediction)是指輸出空間為結構化物件的一類任務,包括命名實體識別、關係抽取、共指消解等子任務,命名實體識別又屬於序列標註問題。請實現簡單的基於 LSTM-CRF 的命名實體識別

任務描述:https://www.clips.uantwerpen.be/conll2003/ner/

資料集:本倉庫 CoNLL03 資料夾下

參考文獻: Neural Architectures for Named Entity Recognition (https://arxiv.org/pdf/1603.01360.pdf)

為了簡化任務難度,我們給出了基於 LSTM 的中文命名實體識別的程式碼,可參考該程式碼將其遷移至 CoNLL03 英文資料集上,進行實驗觀察初步結果,後續再增加 CRF 層。

任務三:Neural Machine Translation (NMT)

摘要和翻譯是文字生成中比較主流的兩大任務,在這裡我們選取 PyTorch tutorial 中的文字翻譯作為入門專案。

請按照 PyTorch 文字翻譯教學,一步步實現一個簡單的文字翻譯模型,注意請參考 ChineseNER 的組織方式重構程式碼。

生成任務涉及到的細節較多,如 encoder-decoder,teacher forcing,beam search 等,tutorial 中給出了深入淺出的介紹,請仔細閱讀並理解。

任務四:Transformer & PLM

以 BERT、GPT 為代表的預訓練語言模型(Pretrain Language Model,PLM)的出現使 NLP 翻開了新的一頁,目前的預訓練語言模型大多基於 Transformer,因此想要追蹤前沿 NLP 技術,我們不得不對 Transformer 有深入的理解。

請結合 Attention Is All You Need 原論文,讀懂 The Annotated Transformer

建議繼續閱讀: encoder-decoder 結構 視覺化 Transformer 關於 decode

關於預訓練語言模型,請閱讀 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 並做閱讀筆記,重點關注 BERT 是如何訓練出來的,以及如何將 BERT 應用於下游任務。

我們在實踐中通常會使用 HuggingFace