语言模型和数据集
语言模型
假设长度为\(T\)的文本序列中的词元依次为\(x_1, x_2, \cdots, x_T\)。于是,\(x_t\ (1\leq t\leq T)\)可以被认为是文本序列在时间步\(t\)处的观测或标签。在给定这样的文本序列时,语言模型(language model)的目标是估计序列的联合概率 \[ P(x_1, x_2, \cdots, x_T) \] 语言模型在语音识别和输入法中都是非常有用的。比如语音识别系统输入人类语音后得到两个读音非常相似的句子,概率都比较高,这很容易通过语言模型来解决,语言模型会选择在语言文本上更有可能出现的那一个。拼音输入法在输入拼音时,会根据拼音得到各种文字的组合,然后根据语言模型得到概率,然后根据概率进行排序,让排在前面的是人们更有可能选择的内容。
学习语言模型
基于基本的概率规则,联合概率可以分解为条件概率的乘积 \[ P(x_1, x_2, \cdots, x_T) = \prod_{t=1}^TP(x_t|x_1, \cdots, x_{t-1}) \] 词频估计:
词的概率可以根据其在数据集中的词频来估计。例如: \[ \hat P(x) = \frac{n(x)}{n} \] 其中\(n(x)\)是单词\(x\)的出现次数,\(n\)是语料库中单词的总数
条件概率估计:
给定前面几个单词后出现后出现某个单词的条件概率可以类似地估计: \[ \hat P(x'|x) = \frac{n(x, x')}{n(x)} \] 其中\(n(x, x')\)是连续单词对\(x, x'\)的出现次数
在语料库不是很大的情况下,单词对出现的频率并不高,特别是对于一些不常见的单词组合,其出现的频率更低或者频率为零。而对于三个或者更多的单词组合,其出现的频率会更低。许多合理的三个单词的组合可能是存在的,但是在数据集中却找不到。一种常见的策略是使用拉普拉斯平滑,也就是在所有的计数中添加一个小常量: \[ \begin{aligned} &\hat P(x) = \frac{n(x)+\frac{\epsilon_1}{m}}{n+\epsilon_1}\\ &\hat P(x'|x) = \frac{n(x, x') + \epsilon_2\hat P(x')}{n(x) + \epsilon_2}\\ &\hat P(x''|x, x') = \frac{n(x, x', x'') + \epsilon_3\hat P(x'')}{n(x, x') +\epsilon_3} \end{aligned} \] 其中,\(\epsilon_1, \epsilon_2, \epsilon_3\)是超参数:
- \(\epsilon_1\)代表让所有单词出现的次数增加(不一定是整数次),\(m\)是不同单词的数量,\(\frac{\epsilon_1}{m}\)代表一种单词增加的次数
- \(\epsilon_2\)代表让所有单词对出现的次数增加,
马尔可夫模型与N元语法
不同阶数的马尔可夫模型对应着不同元的语法:
- 一元语法(unigram):\(P(x_1, x_2, x_3, x_4) = P(x_1)P(x_2)P(x_3)P(x_4)\)
- 二元语法(bigram):\(P(x_1, x_2, x_3, x_4) = P(x_1)P(x_2|x_1)P(x_3|x_2)P(x_4|x_3)\)
- 三元语法(trigram):\(P(x_1,x_2,x_3,x_4)=P(x_1)P(x_2|x_1)P(x_3|x_1,x_2)P(x_4|x_2,x_3)\)
- \(n\)元语法:依此类推
应用:比如拼音输入法中,可以使用\(n\)元语法模型,给用户提供更有可能的结果。
缺点:随着\(n\)的增大,模型需要存储的词频和相邻多词频率的数量呈指数级增长。这会导致数据稀疏问题,即许多可能的词组组合在训练数据中从未出现过,无法得到有效的概率估计。\(n\)元语法模型无法处理未见过的词组,只能考虑固定长度\(n\)的上下文信息。无法处理词之间的语义关系(比如cat
(猫)和feline
(猫科动物))
自然语言统计
词频衰减:单词的频率满足齐普夫定律(Zipf's law),即第\(i\)个最常用单词的频率\(n_i\)为: \[ n_i\propto\frac{1}{i^\alpha} \] 等价于 \[ \log n_i = -\alpha\log i + c \] 其中\(\alpha\)是刻画分布的指数,\(c\)是常数
除了一元语法词,单词序列(\(n\)元语法频率)也遵循齐普夫定律。
词表中的\(n\)元组的数量并没有那么大,这说明语言中存在相当多的结构,这些结构给了我们应用模型的希望。
很多\(n\)元组很少出现,这使得拉普拉斯平滑非常不适合语言建模。
读取长序列数据
当文本长度很长时,我们无法一次性读取全部的序列,而序列本身是连续的,我们也无法随机打乱数据然后获取小批量。
有两种常见的策略:
- 随机采样: