一、文本预处理
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,预处理通常包括四个步骤:
1、读入文本
2、分词:对每个句子进行分词,也就是将一个句子划分成若干个词(token),转换为一个词的序列。
3、建立字典:将每个词映射到一个唯一的索引(index)。为了方便模型处理,我们需要将字符串转换为数字。因此我们需要先构建一个字典(vocabulary),将每个词映射到一个唯一的索引编号。
4、将词转为索引:使用字典,我们可以将原文本中的句子从单词序列转换为索引序列
前面介绍的分词方式非常简单,它至少有以下几个缺点:
a、标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
b、类似“shouldn’t", “doesn’t"这样的词会被错误地处理
c、类似"Mr.”, "Dr."这样的词会被错误地处理
5、用现有工具进行分词:spaCy和NLTK。
二、语言模型
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为 T 的词的序列 ,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
介绍基于统计的语言模型,主要是 n 元语法( n -gram)
1、n 元语法:
概念:通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面 n 个词相关,即 n 阶马尔可夫链(Markov chain of order n )
当 n 分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。
当 n 较小时, n 元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当 n 较大时, n 元语法需要计算并存储大量的词频和多词相邻频率。
缺点:参数空间过大;数据稀疏
2、时序数据的采样
在训练中我们需要每次随机读取小批量样本和标签。与之前章节的实验数据不同的是,时序数据的一个样本通常包含连续的字符。
如果序列的长度为 T ,时间步数为 n ,那么一共有 T−n 个合法的样本,但是这些样本有大量的重合。有更加高效的采样方式,分别是随机采样和相邻采样。
随机采样:在随机采样中,每个样本是原始序列上任意截取的一段序列,相邻的两个随机小批量在原始序列上的位置不一定相毗邻。
相邻采样:在相邻采样中,相邻的两个随机小批量在原始序列上的位置相毗邻
三、循环神经网络基础
下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量,用表示在时间步的值。的计算基于和,可以认为记录了到当前字符为止的序列信息,利用对序列的下一个字符进行预测。
1、循环神经网络的构造
2、one-hot向量
将字符表示成向量。假设词典大小是 N ,每次字符对应一个从 0 到 N−1 的唯一的索引,则该字符的向量是一个长度为 N 的向量,若字符的索引是 i ,则该向量的第 i 个位置为 1 ,其他位置为 0
3、裁剪梯度
循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量,并设裁剪的阈值是。裁剪后的梯度
的范数不超过。
4、困惑度
通常使用困惑度(perplexity)来评价语言模型的好坏。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,
最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。