NLP

NLP入门学习笔记

Posted by BUAADreamer on 2022-04-13
Words 1.4k and Reading Time 5 Minutes
Viewed Times

Part0 简介·

本文是笔者为了准备暑期实验室实习而写的NLP入门学习纲要,学习的内容和分类主要来自老师的建议和这篇原北航学姐的文章:https://mp.weixin.qq.com/s/49k1NLxfTSXK185RCoASxA

学习过程中参考了李沐老师的课程,本文仅作为一个纲要梳理学习的大致内容,以及记录一些实践练习收获。

用以下两个博客记录具体学习内容:

完成了一系列的代码实践,放在一个仓库里,作为NLP武器库nlpkiller,基本实现了本文提到的算法,大多参考或直接复制自沐神的代码。

时间节点-简要记录·

4.13-4.27·

  • 学习了动手学习深度学习前8章除了现代CNN之外的内容,大致有pytorch基本应用,mlp,cnn,rnn等。

  • 编写了nn框架 nnplayer

  • 学习d2l代码实现了基本的rnn语言模型,包含预处理与模型训练预测。

4.28-5.11·

  • 学习了动手学习深度学习第9章内容,熟悉GRU,LSTM

5.12-5.25·

  • 学习动手学习深度学习第10章内容,熟悉了注意力机制
  • 结合软件杯的摘要生成任务,学习了相关的一些seq2seq语言模型,了解了一种先抽取后生成的摘要生成模型
  • 熟悉了ACT实验室的GPU集群的用法,并在上面完整训练了2个端到端模型并做了测试,在华为云服务器上部署了摘要生成模型,提供了接口

5.26-6.8·

  • 进一步学习注意力机制和transformer
  • 结合摘要生成题目进行相关实践

6.8-7.1·

复习准备考试,没有学习

7.1-8.17·

  • 完成了中国软件杯智能创作平台的比赛

  • 学习了常见的摘要抽取算法:

    • TextRank

    • 基于Bert的句子编码+聚类/DGCNN

  • 学习了常见的NLP数据预处理方法,一般来说就是

    • 数据获取(爬虫/广泛搜索)

    • 数据清洗(去除一些句子/字词,替换一些句子/字词)

    • 数据增强(同/反义词替换,随机替换词/句,随机去除词语)

    • 分词(jieba,Bert分词器),去除停用词

  • 学习了目前比较流行的标题/摘要生成方式,发现很少那种长文本-长文本的数据集。最终采用基于T5-Pegasus的预训练模型对我们的数据集进行调整的方式。学习了利用FastT5对模型进行了onnx转换和量化压缩。

  • 完整的完成了一个NLP项目,从模型设计训练,模型压缩部署,后端构建都有所收获

8.18-8.27·

  • 复习了CNN,RNN。补充了RNN、注意力机制的代码实现和阅读理解
  • 学习了编码器-解码器架构
  • 学习预训练相关知识:Word2Vec,GloVe,BERT,并简单学习和运行了代码

Part1 基础原理·

todo·

  • 词向量
    • Word2Vec
    • GloVe
    • 子词嵌入:fastText,字节对编码
  • CNN
  • RNN
  • LSTM
  • GRU
  • BERT(简要了解GPT、ELMo)

神经网络·

词向量·

Word2Vec·

有跳元模型和连续词袋模型两种,都得到了词语作为中心词和上下文词时的向量

Glove·

对跳元模型的损失函数进行修改,得到了融合全局特征的词向量

CNN·

总的来说CNN的知识包含:

  • 卷积操作(实际用起来是互相关运算),其中会有填充,步幅等内容,多输入通道会汇合成一个输出通道(求和)
  • 汇聚(池化),其中也有填充,步幅等内容,每个输入通道单独有一个输出通道
  • 各种成熟的CNN网络结构

RNN·

基本的RNN就是对MLP加入了隐变量输出H,同时对时间步进行循环,对隐变量进行预测和更新。

LSTM·

包含输入门,遗忘门,输出门,候选记忆元,隐状态等。

BERT·

通过使⽤预训练的Transformer编码器,BERT能够基于其双向上下⽂表⽰任何词元。

image-20220823213359539

Part2 经典模型与技巧·

todo·

文本分类·

  • MLP
  • CNN
  • RNN
  • LSTM
  • Attention
  • Transformer

文本分类·

MLP·

此部分要求手写,不用现成模型。为了学习多层感知机,以及复习神经网络相关内容,笔者在参考一些博客和源码后,实现了一个微型深度学习框架,地址如下:https://github.com/BUAADreamer/nnplayer,使用方式基本和pytorch类似,之后有时间会不断完善,作为学习各种深度学习模型的一个实践方式,主要使用了numpy库进行矩阵计算和操作,采用面向对象的方式进行编写。目前使用这个框架实现基本的多层感知机demo代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import nnplayer as npl
import numpy as np

# build net
net = npl.Sequence(npl.Linear(10, 6), npl.Sigmoid(), npl.Linear(6, 4), npl.Sigmoid())
# calculate loss
loss = npl.MSELoss(net)
# optimizer
optimizer = npl.SGD(net.getParamsList())
# build the dataset
X = np.arange(40).reshape(4, 10)
Y = np.arange(16).reshape(4, 4)
# train
epoch = 100
for i in range(epoch):
Y_predict = net.forward(X)
l = loss.loss(Y_predict, Y)
print(f'epoch{i + 1} loss:{l.mean()}')
loss.backward()
optimizer.step()
l = loss.loss(net.forward(X), Y)
print(l.mean())

Attention·

注意力汇聚,注意力评分函数,Bahdanau注意力,多头注意力,自注意力和位置编码,Transformer

Transformer·

image-20220822100053869