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 (https://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 上一个简单的文本分类任务。
任务描述 & 数据集:https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/
参考文献: 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 的 Transformers 库,该库提供了包括 BERT 和 GPT 在内的常见预训练语言模型,代码风格较好,文档详细。我们可以通过 Transformers 教程进行学习。
完成本小节任务后,如果学有余力,可尝试基于 Transformers 库,实现基于 BERT 的文本分类和 NER。
本仓库的使用说明
- 有问题就提在issues里面,同理你也可以在issues里面检索是否已经有你遇到的问题;
- main分支无法直接修改,所有修改均需要通过提交Pull requests来实现,必须选择至少一个reviewer,推荐选择大师兄Yifan-Song793来review;
- git commit的规范看这里,禁止使用意义不明的test、add等语句。
首次转载:孤飞-博客园
仓库地址:PKU-TANGENT/nlp-tutorial: NLP新手入门教程 (github.com)
NLP新手入门指南|北大-TANGENT的更多相关文章
- Flume NG Getting Started(Flume NG 新手入门指南)
		Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ... 
- OKR新手入门指南 (第一部分)
		什么是OKR? OKR(目标和关键结果)是Google和其他公司使用的目标系统.这是一个简单的工具,围绕可衡量的目标进行调整和互动. OKR:Google的目标设定方法 与传统的规划方法有何不同? O ... 
- yii2实战教程之新手入门指南-简单博客管理系统
		作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ... 
- Vue的理解:Vue.js新手入门指南----转
		最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ... 
- Vue.js新手入门指南
		最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ... 
- Wintel物联网平台-Windows IoT新手入门指南
		1. 引言 近期,微软跟进物联网的速度也在不断加速,除了微软手环,.NET MicroFramework,还有一个叫做Windows IoT的项目.该项目早在今年4月份的Build大会上就提出来了,7 ... 
- PHP 之 Composer 新手入门指南
		自2012年3月1日发布以来,Composer因提供了PHP迫切需要的东西:依赖项管理而广受欢迎.实际上,Composer是将所有第三方软件(例如CSS框架,jQuery插件等)引入你的项目的一种方法 ... 
- 新手入门指导:Vue 2.0 的建议学习顺序
		起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ... 
- 【翻译】Fluent NHibernate介绍和入门指南
		英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ... 
随机推荐
- CF333E Summer Earnings
			CF333E Summer Earnings 题目 https://codeforces.com/problemset/problem/333/E 题解 思路 知识点:枚举,图论,位运算. 题目要求从 ... 
- Java ArrayList和LinkedList
			目录 集合的概念 集合体系结构 常用list集合 list集合的特点 ArrayList LinkedList 创建对象 常用方法 遍历 ArrayList和LinkedList的区别 集合的概念  ... 
- 一张图进阶 RocketMQ - 消息发送
			前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ... 
- RASP | 远程Java应用的RASP调试教程
			远程Java应用的RASP调试教程 介绍 Java RASP是基于Java Agent技术实现的,而Java Agent代码无法独立启动,必须依赖于一个Java运行时程序才能运行. 如何调试一个Jav ... 
- 集合-List接口常用实现类的对比
			1.collection接口:单列集合,用来存储一个一个的对象 2. list接口:存储有序的.可重复的数据. --->"动态数组",替换原有的数组 (1) Arraylis ... 
- 1_day01_操作系统安装
			操作系统安装 内容介绍 1.制作U盘启动器 2.备份驱动 3.安装操作系统 4.驱动更新 5.依赖库检测 6.系统漏洞修复 7.系统布局优化 一.制作U盘启动器 1.1 下载老毛桃 下载老毛桃pe工具 ... 
- Oracle,SAP等暂停俄所有业务,国产化刻不容缓,无代码又该如何发力
			国产化刻不容缓 "如果不是自主可控的产品,我们这个行业可能有一天就瘫痪了."这句话最早是中国工程院院士倪先生预言的.然而,2022年的今天,由于俄乌战争,包括Oracle.SAP等 ... 
- 使用uart串口接收模块接收信号,控制led灯闪烁
			功能描述: 使用遵循uart协议的接收模块接收控制信号,用来控制led的闪烁. 设计输入: 1.uart输入信号 2.时钟信号 3.复位信号 4.led信号 设计思路: 总体上:前面已经写了串口接收模 ... 
- 【Kaggle】如何有效避免OOM(out of memory)和漫长的炼丹过程
			本文介绍一些避免transformers的OOM以及训练等流程太漫长的方法,主要参考了kaggle notebook Optimization approaches for Transformers ... 
- NOI / 2.1基本算法之枚举题解-1(3861字)制作不易
			目录 1.15 Counterfeit Dollarhttp://noi.openjudge.cn/ch0201/15/ 2.1749 数字方格 
