NLP新手入門指南|北大-TANGENT
開源的學習資源:《NLP 新手入門指南》,項目作者為北京大學 TANGENT 實驗室成員。 該指南主要提供了 NLP 學習入門引導、常見任務的開發實現、各大技術教程與文獻的相關推薦等內容,是一份非常全的適合新手小白初學入門的權威指南。 值得mark!
以下正文:
本教程供新加入 TANGENT 實驗室的同學入門 NLP 使用
- PKU-TANGENT nlp-tutorial
寫在前面
相信大家經過幾年的學習,已經擁有了以下的技能:
- 優秀的資訊檢索能力,無論是在論文閱讀、寫程式碼、使用伺服器、寫論文等過程中都有可能遇到各種各樣的問題,在詢問他人之前,請善用搜索
- 優秀的英文閱讀能力和基本的英語寫作能力
- 良好的編程能力,在 NLP 相關研究中,我們通常會使用 Python,如果你之前只學過 C 或者 C++,那麼入門 Python 對於你來說將不是一件難事。 我們一般使用 Anaconda(Miniconda)來管理個人電腦乃至 Linux 伺服器上的 Python 環境,請提前安裝並學習 conda 的使用。 此外在科研中我們經常會與他人合作,因此請保持良好的程式碼習慣,如果你不了解程式碼規範,請參考 Google 的 Python 程式碼規範
- 數學基礎,作為一名理工科的學生,你應該已經學過高等數學(數學分析)、線性代數(高等代數)、概率論與統計等基礎數學課程,在入門階段我們涉及到的數學知識較為簡單,但是紮實的數理基礎會支撐你走得更深更遠。
- 最好擁有 Linux 系統使用經驗,目前是深度學習的時代,對於自然語言處理領域,又是大規模預訓練語言模型的時代,個人電腦無法支撐大模型的訓練,我們將使用 Linux 伺服器進行 Coding 和實驗,提前了解工作流程會大大提高效率。 本教程動手實踐部分基於 CNN 和 RNN(LSTM)的模型理論上可以在個人電腦上運行,如需 GPU 資源,請聯繫實驗室伺服器管理員。
基礎知識
我們默認大家已經完成了電腦專業本科一年級和二年級的相關課程,擁有一定的數學和編程基礎
機器學習
雖然目前是深度學習的時代,我們也很少使用傳統機器學習的演算法來解決問題,但是一方面一些基礎概念仍然是相通的,另一方面經典機器學習演算法的思想,如 EM、LDA 等,在深度學習時代往往能夠歷久彌新,以另一種方式煥發出新的光彩。 對於想要快速入門的初學者來說,建議先熟悉機器學習基礎概念(什麼是機器學習,機器學慣用來幹什麼,什麼是數據集,如何對機器學習演算法進行評測等),了解幾種具體的經典機器學習演算法。
對於初學者可以學習:
- 網課:吳恩達 機器學習公開課;李宏毅 機器學習
- 書:機器學習(周志華,西瓜書),統計學習方法(李航)
如果想更深地了解:
- 網課:機器學習白板推導
- 書
- Pattern Recognition And Machine Learning (PRML),以貝葉斯的視角介紹機器學習演算法。本書成書於2012年,由於近年來深度學習飛速發展,該作者又相繼推出了 Probabilistic Machine Learning: An Introduction 和 Probabilistic Machine Learning: Advanced Topics
- Machine Learning: A Probabilistic Prospective (MLAPP),機器學習的百科全書,同樣偏重貝葉斯視角
- The Elements of Statistical Learning (ESL),頻率派
深度學習
深度學習的發展為我們的世界帶來了巨大的改變,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 (//aclweb.org/anthology/)
前沿進展
如果想了解某一個領域的前沿進展,通常會關注 arXiv(預印本),部分作者會選擇在發表前將論文上傳至 arXiv。arXiv 在工作日每日更新,便於及時追蹤前沿動態
工具
經典論文往往在 CSDN、知乎等平台有中文讀後感,可以輔助閱讀
文獻分類整理是一個好習慣,建議根據個人喜好選擇諸如 Zotero(介面簡潔、跨平台、免費、擴展豐富), Endnote, Mendeley, Papers 等文獻管理軟體
初學時做好論文筆記,可以使用 Markdown,也可以使用 Notion、Obsidian、OneNote 等筆記軟體
動手實踐
作為電腦科學的一個分支,NLP 同樣離不開程式碼,請有志加入 TANGENT 的同學完成以下練習任務。
寫在前面
在完成這些任務之前,還是需要一些說明。
一個深度學習項目的流程通常是這樣的:
- 數據讀取和預處理,得到 Dataset 和 DataLoader
- 構建 Model、Optimizer
- 使用隨機梯度下降迭代優化模型參數
- 設置 Metric,對模型進行評測
通常我們也會按照上述流程和流程中出現的各個模組組織項目文件,一個項目往往會包含這些文件:主函數(入口,負責以上流程的控制),數據讀取和預處理,模型,Metric。
我們針對任務二,給出了一個 ChineseNER 完整項目的源程式碼。需注意,下面部分任務參考程式碼是以 Notebook 的形式組織的,在完成任務時,請參考 ChineseNER 重新組織程式碼。
任務一:基於深度學習的文本分類
文本分類是入門 NLP 的一個好的開始,同時 NLU(自然語言理解)任務本質上來說都可以歸類為文本分類。請使用 CNN 或 RNN(LSTM) 完成 Kaggle 上一個簡單的文本分類任務。
任務描述 & 數據集://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/
參考文獻: Convolutional Neural Networks for Sentence Classification (//aclanthology.org/D14-1181/) Recurrent Convolutional Neural Networks for Text Classification (//www.deeplearningitalia.com/wp-content/uploads/2018/03/Recurrent-Convolutional-Neural-Networks-for-Text-Classification.pdf)
任務二:基於 LSTM-CRF 的命名實體識別
在 NLP 中,結構預測(Structured Prediction)是指輸出空間為結構化對象的一類任務,包括命名實體識別、關係抽取、共指消解等子任務,命名實體識別又屬於序列標註問題。請實現簡單的基於 LSTM-CRF 的命名實體識別
任務描述://www.clips.uantwerpen.be/conll2003/ner/
數據集:本倉庫 CoNLL03 文件夾下
參考文獻: Neural Architectures for Named Entity Recognition (//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🤗 的 Transformers 庫,該庫提供了包括 BERT 和 GPT 在內的常見預訓練語言模型,程式碼風格較好,文檔詳細。我們可以通過 Transformers 教程進行學習。
完成本小節任務後,如果學有餘力,可嘗試基於 Transformers 庫,實現基於 BERT 的文本分類和 NER。
本倉庫的使用說明
- 有問題就提在issues裡面,同理你也可以在issues裡面檢索是否已經有你遇到的問題;
- main分支無法直接修改,所有修改均需要通過提交
Pull requests來實現,必須選擇至少一個reviewer,推薦選擇大師兄Yifan-Song793來review; - git commit的規範看這裡,禁止使用意義不明的test、add等語句。
首次轉載:孤飛-部落格園
個人部落格://blog.onefly.top
倉庫地址:PKU-TANGENT/nlp-tutorial: NLP新手入門教程 (github.com)
