针对文本预处理的认识
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,文本数据预处理通常包括四个步骤:
- 读入文本
- 分词
- 建立字典,将每个词映射到一个唯一的索引(index)
- 将文本从词的序列转换为索引的序列,方便输入模型
用现有工具进行分词
这里单纯划分
和其他如’ '等分词方式非常简单,它至少有以下几个缺点:
- 标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
- 类似“shouldn’t", "doesn’t"这样的词会被错误地处理
- 类似"Mr.", "Dr."这样的词会被错误地处理
我们可以通过引入更复杂的规则来解决这些问题,但是事实上,有一些现有的工具可以很好地进行分词,我们在这里简单介绍其中的两个:spaCy和NLTK。
针对语言模型的认识
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为
的词的序列
,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
本节我们介绍基于统计的语言模型,主要是
元语法(
-gram)。
n 元语法可能有哪些缺陷?
- 参数空间过大
- 数据稀疏
课后错题
给定训练数据
,批量大小为batch_size=2,时间步数为2,使用本节课的实现方法进行相邻采样,第二个批量为______。
正确答案:
和
答案解析:在相邻采样中,相邻的两个随机小批量在原始序列上的位置相毗邻。因为训练数据中总共有11个样本,而批量大小为2,所以数据集会被拆分成2段,每段包含5个样本:
和
,而时间步数为2,所以第二个批量为
和
。
针对循环神经网路基础的认识
下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量
,用
表示
在时间步
的值。
的计算基于
和
,可以认为
记录了到当前字符为止的序列信息,利用
对序列的下一个字符进行预测。
循环神经网络的具体构造
假设
是时间步
的小批量输入,
是该时间步的隐藏变量,则:
其中,
,
,
,
函数是非线性激活函数。由于引入了
,
能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。由于
的计算基于
,上式的计算是循环的,使用循环计算的网络即循环神经网络(recurrent neural network)。
在时间步
,输出层的输出为:
其中
,
。
裁剪梯度
循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量
,并设裁剪的阈值是
。裁剪后的梯度
的
范数不超过
。
困惑度
我们通常使用困惑度(perplexity)来评价语言模型的好坏。跟softmax回归中交叉熵损失函数不同的是。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,
- 最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
- 最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
- 基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。
定义模型训练函数
这里的模型训练函数有以下几点不同:
- 使用困惑度评价模型。
- 在迭代模型参数前裁剪梯度。
- 对时序数据采用不同采样方法将导致隐藏状态初始化的不同。
课后错题
关于采样方法和隐藏状态初始化的描述错误的是:
- 采用的采样方法不同会导致隐藏状态初始化方式发生变化
- 采用相邻采样仅在每个训练周期开始的时候初始化隐藏状态是因为相邻的两个批量在原始数据上是连续的
- 采用随机采样需要在每个小批量更新前初始化隐藏状态是因为每个样本包含完整的时间序列信息
正确答案:选项3错误
答案解析:随机采样中每个样本只包含局部的时间序列信息,因为样本不完整所以每个批量需要重新初始化隐藏状态。