- 下面是语言模型的简介
1. 学习语言模型
- 使用计数来建模
- N元语法:这里的元可以理解为我们之前的时间变量。对于 N 元语法,我们可以把所有长度为 N 的子序列存下来。其中 1 元语法用的很少。这里其实就是算概率的时候我们不往前看所有的概率,只往前看 N-1 个词的概率
- 总结
2. 自然语言统计
- 语言模型与数据集:可以看到停词的出现是很多的,但是它们对于文本的理解作用较小
- 我们画出词频图看一下:可以看到在log上是差不多线性的
- 尝试其他词元组合:二元语法,三元语法等又会如何呢
- 可以看到两个词元还是没什么有效信息,下面我们看看三个词元会不会好一点
- 最后我们直观对比三种模型中的词元频率:
- 这张图很令人振奋,其中原因有:
- 虽然还是大致呈现按照取对数线性,但是斜率小了很多,这就意味着:多数的词频出现在少数的词中的情况有所改善
- 词表中 n 元组的数量没有那么大,说明语言中存在相当多的结构,这些结构给了我们应用的希望
- 很多 n 元组很少出现,这使得拉普拉斯平滑非常不适合语言建模。 作为代替,我们将使用基于深度学习的模型。
4. 读取长序列数据
- 总体策略: 假设我们将使用神经网络来训练语言模型, 模型中的网络一次处理具有预定义长度 (例如 n 个时间步)的一个小批量序列。 现在的问题是如何随机生成一个小批量数据的特征和标签以供读取。
- 任意长的序列可以被我们划分为具有相同时间步数的子序列。 当训练我们的神经网络时,这样的小批量子序列将被输入到模型中。
- 我们可以选择任意偏移量来指示初始位置,所以我们有相当大的自由度。
- 如果我们只选择一个偏移量(从文本开始的偏移), 那么用于训练网络的、所有可能的子序列的覆盖范围将是有限的。
- 因此,我们可以从随机偏移量开始划分序列, 以同时获得覆盖性(coverage)和随机性(randomness)。下面,我们将描述如何实现随机采样(random sampling)和 顺序分区(sequential partitioning)策略。
4.1 随机采样
- 下面的代码每次可以从数据中随机生成一个小批量。 在这里,参数batch_size指定了每个小批量中子序列样本的数目, 参数num_steps是每个子序列中预定义的时间步数。
- 这里的 Y 的意义是给一个23 可以以 24 为标签,给一个 23 24 可以以 25为标签。最多可以预测五个长度。这种方法在一个batch里面不是相邻的而是有随机性的,它们的分布是独立的,无论是batch里面还是batch之间
4.2 顺序分区
-
现在提到的方法在一个batch和下一个batch的序列是相接的
-
最后我们把它包起来以做以后的使用