【动手学学学】NLP相关 [Period 2]

(这里将RNN的知识整理到了这里)
(梯度boom/下降、过/欠拟合笔记在基础部分)

* Task 2 【NLP初识】*

文本预处理

文本预处理是语言模型的基础,对后续的语言模型有着很大的影响。
文本预处理的过程时间文本中每个token(有时是word有时是char,看需求)转换为向量表示,每个token与向量一一对应(双射)即词向量。

最开始用的是one hot方法来构建这样的词向量,但这会造成数据稀疏,后续出现了很多方法来解决这一问题,例如【word2vec, ELMO, Bert, GPT等都是用于文本预处理的经典算法】

建立一个字典类,统计每个词出现的次数。

Vocab类:用于得到词与索引的一一对应关系
	idx_to_token: 根据索引搜索token
	token_to_idx: 根据token得到它所对应的索引

英文分词库常用的有spaCy/NLTK,中文分词库常用的为jieba分词/NLTK里也有中文分词包。

语言模型

一段自然语言文本可以看做一个离散的时间序列,语言模型的目标是评估该序列是否合理。
语言模型涉及到的参数是词的概率以及给定前几个词的情况下的条件概率

n-gram
该方法需计算并存储大量词频及多词相邻概率,n-gram方法即n-1阶马尔科夫链。
马尔可夫假设:一个词的出现只与前n个词有关,即n阶马尔可夫链。
实操中一般使用bi-gram/tri-gram,(不记得哪篇)论文中提到,超过四元以上的模型效果极差且无效率。

采样方法

介绍了两种对时序数据进行的采样方法。
随机采样
每个样本是原始序列上任意截取的一段序列,响铃两个随机小批量在原始序列上的位置不一定是相邻的。
相邻采样
相邻的两个随机小批量在原始序列上的位置相邻。

循环神经网络基础

目的:基于当前输入及过去的输入序列,预测序列的下一个字符。引入了隐变量H。在时间步t的隐变量H t _t t是基于当前输入X t _t t和上一个时间步的隐状态H t − 1 _{t-1} t1

H t = Φ ( X t W x h + H t − 1 W h h + b h ) H_t = \Phi(X_tW_{xh} + H_{t-1}W_{hh} + b_h) Ht=Φ(XtWxh+Ht1Whh+bh)

其中 Φ \Phi Φ为非线性激活函数, H t H_t Ht可捕捉截至当前时间步的序列的历史信息(即当前时间步的状态或记忆)。由于H t _t t的计算基于H t − 1 _{t-1} t1,这里的计算是循环的。
假设输出层变量个数为q,在时间步t的输出层的输出为 O t = H t W h q + b q O_t = H_tW_{hq} + b_q Ot=HtWhq+bq

由于隐状态 H t H_t Ht的值依赖于 H 1 H_1 H1, …, H t − 1 H_t-1 Ht1,所以对于网络中隐藏层的状态进行计算时,不能并行。

detach() : 用于切断一些分支的反向传播

在进行网络训练的时可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整;或者只训练网络中的部分分支网络,并且不让其梯度对主网络的梯度造成影响,就会使用detach()函数来切断一些分支的反向传播

detach()将返回一个新的Variable,从当前计算图中分离出来的,但仍指向原变量的存放位置,不同的是requires_grad为false,返回的这个Variable将不会计算它的梯度,没有grad属性。这样就可以在进行反向传播时,在调用了detach()后Variable就不再继续向前进行传播。

梯度剪裁(clip gradient):假设把所有模型参数的梯度拼成一个向量g,并设剪裁阈值为 θ \theta θ,这是解决梯度爆炸的一种方法
↑ 这里又涉及到梯度爆炸、梯度消失的问题 ↑ (后续会继续介绍)

困惑度 (perplexity): 是用于评价语言模型的好坏的一种方法。在对交叉熵损失函数做指数运算后得到的。

最好结果: 困惑度为1
最坏结果: 困惑度为+无穷
基线结果:所有类别概率相同,perp为类别个数

rnn实操
若使用随机采样,每个样本只包含局部的时间序列信息,因为样本不完整,所以每个批量需要重新初始化隐藏状态。

【还有一些细碎的知识点后续补充】

* Task 3 【进阶】*

随着时间序列的加深,循环神经网络可能产生梯度衰减(梯度消失)的情况,即神经元至多只能影响其附近几个时间戳下的神经元。所以出现了门控机制,为了解决梯度消失的问题。

LSTM - Long Short Term Memory

【遗忘门】控制上一时间步的记忆细胞
【输入门】控制当前时间步的输入
【输出门】控制从记忆细胞到隐藏状态
【记忆细胞】一种特殊的隐藏状态的信息的流动

模型初始化中,需要初始化的参数有「第0个循环单元的记忆细胞和循环单元的值、门控单元中用于计算遗忘门的权重与偏差、用于计算输出的权重与偏差。」
不需要初始化的参数「每个循环单元中的记忆细胞和循环单元的值」 (每个循环单元中的记忆细胞和循环单元的值为LSTM模型中的隐状态,而非参数,故不需要初始化)

GRU - Gate Recurrent Unit

【更新门】相当于LSTM里的遗忘门和输入门的作用,有助于捕捉时间序列里长期的依赖关系
【重置门】有助于捕捉时间序列里短期的依赖关系

* Task 4 *

机器翻译相关技术

机器翻译(machine translate)是指将一段文本从一种语言自动翻译为另一种语言。
其特征为输入的是单词序列;且输出序列长度与输入序列长度不一定相同。

数据清洗

将不合法的字符进行处理,否则会出现错误
空格编码 - 一般情况下'\x20', 示例数据集中拉丁字符的空格为'\xa0'

涉及到的技术有「分词」、「建立词典」
(对两种语言的数据集都进行处理)

Seq2Seq模型

输入输出不等长

典型的Encoder-Decoder模型 == 是输出的长度不确定时采用的模型,常用于机器翻译任务。
基本思想是利用两个RNN,一个RNN作为Encoder编码器,一个RNN作为Decoder解码器。

  • Encoder先将输入数据编码成一个语义编码上下文向量context vector【指定长度】
获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
  • 得到c后,用另一个RNN网络对其进行解码。

于是向量c中必须包含原始序列中的所有信息,这个向量的长度就成了限制模型性能的瓶颈。
【动手学学学】NLP相关 [Period 2]_第1张图片
【动手学学学】NLP相关 [Period 2]_第2张图片
Dense一般为一个softmax层,找到单词表中词概率最大的词。[类似分类问题]

为保证输入的句子长度相同,会对输入序列做padding至相同的长度,那么在计算损失函数时,需要将padding部分的截掉,是无效的。

即,损失函数需要计算SequenceMask,输入句子原本的有效长度,根据有效长度进行操作,一般会将向量中padding部分的value变为0或-1
超过有效长度的部分都将至设为value

损失函数需要对forward()函数进行修改 ==> MaskSoftmax

定义一个变量weight(全1),进行SequenceMask操作将padding部分的value置为0

模型训练的时候Decoder(也就是target部分)输入不包含,输出label不包含

%使用GPU时, .to_device(),将需要计算的东西放在同一个设备上。

测试部分是将模型流程再走一遍,Decoder部分与训练时会有不同。

预测过程中,每个时间步的生成会作为下一个时间步的输入

Beam Search

是贪心搜索的一种,贪心搜索是当前局部最优。

集束搜索,可以指定每一步中寻找最佳的Beam个结果(topB),再在前一步的基础上继续搜索。

最后使用维特比函数进行回溯。参考

注意力机制与Seq2Seq模型

Seq2Seq模型中,解码器在各个时间步将依赖相同的上下文变量context vector,

对于较长的输入句子,很难保证最后一个时间步的隐藏状态能够包含整个句子的语义。

在解码的时候,目标输出可能只与原输入的部分词语有关,注意力机制可显式的对关注部分进行建模。

Attention Mechanism

【动手学学学】NLP相关 [Period 2]_第3张图片
Attention是一种通用的带权池化的方法。计算一个注意力分数。
【动手学学学】NLP相关 [Period 2]_第4张图片

避免padding部分对Attention操作造成影响,将padding替换成负无穷。

在每一个decoder的时间
【动手学学学】NLP相关 [Period 2]_第5张图片

【动手学学学】NLP相关 [Period 2]_第6张图片

Transformer

既可以高效并行化,又可以捕捉长序列依赖的模型方法。使用了Attention机制,结合了CNN和RNN的优点。

Task5 【卷积神经网络及发展】

这里的内容后续会放在另一个文档中

卷积神经网络基础

卷积神经网络主要涉及到卷积层、池化层,还有一些概念,例如填充步幅输入通道输出通道

二维卷积核 常用于处理图像数据。

填充 padding, 是指在输入高和宽的两侧填充元素(通常补零)

步幅 stride,在互相关运算中,卷积核在输入数组上滑动,每次滑动的行数与列数即步幅

LeNet

分为卷积层块全连接层块两部分。
卷积层块里的基本单位是卷积层后接平均池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的平均池化层则用来降低卷积层对位置的敏感性。

卷积层块由两个这样的基本单位重复堆叠构成。例如在卷积层块中,每个卷积层都使用 5×5 的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。

卷积神经网络进阶

LeNet在大的真实数据集上的表现并不尽如⼈意,其原因有2:

1.神经网络计算复杂。
2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域。

在使用计算机进行数据学习时,传统机器学习的特征提取方法是手工定义的特征提取函数,而神经网络的特征提取是通过让计算机通过模型学习得到数据的多级表征,并逐级表⽰越来越抽象的概念或模式。

所以开始介绍进阶网络
AlexNet、VGG、NiN、GoogLeNet

AlexNet

1. 激活函数由sigmoid改成了ReLU
2. 用Dropout来控制全连接层的模型复杂度。
3. 引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

VGG
一种通过重复使用简单的基础块来构建的深度模型,由VGG block组成。

卷积层保持输入的高和宽不变,而池化层则对其减半。

NiN
“网络中的网络”,由NiN block组成。
LeNet、AlexNet和VGG都先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。
而NiN不同的是串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络。

⽤了输出通道数==标签类别数的NiN块,然后使⽤全局平均池化层对每个通道中所有元素求平均并直接⽤于分类。

其中使用1×1卷积核,

GoogLeNet
由Inception基础块组成。

最后,抄抄笔记:

“实际使用时往往不需要你来设计,基本上都是用经典结构,最多是进行一些改造。”

“不是每个卷积层后面都要池化,经常是多个卷积层后面接一个池化层。池化是为了降维,我们最终希望提取到的是一些抽象的有代表性的特征,而不是很多很多感受野非常小的细节特征,例如纹理,颜色等。而且有的网络也会不使用池化层,而是使用步长>1的卷积层来替代pool层完成降维的工作。”

你可能感兴趣的:(【动手学学学】NLP相关 [Period 2])