任何一个文本,都可以看作一个词库 中词语的排列组合。从概率的角度来看,观测到不同文本序列的概率是不同的。统计语言模型就是用来计算一个句子的概率模型。
上面公式计算的时间复杂度为O(N^m),是指数级别。
根据概率的链式法则就能得到上面的公式,语言模型的主要任务就是估计上述概率,其中 就是统计语言模型的变量参数。给定一个语料集(数据集)
,其中每个
都是一个自然语言序列(样本句子),接下来可以通过最大似然估计(MLE Maximum Likelihood Estimation)来估计模型参数,即调整模型参数使得观测数据的出现概率最大。
该模型的参数是一些概率值,这里求解的概率值是通过统计词序列的频率的方法来进行的(公式3中,#()为计数函数,意思是在那个位置填w_i的样本个数除以填其他所有w tokens的个数和),理论基础是大数定理,只要统计量足够(语料库够大),相对频率就等于概率。
根据上式去计算(1)中的各个概率值,假设词库大小为N, 需要计算
次,
需要计
次,依此类推,如果自然语言序列很长的话,(1)式总计算量会达到一个非常恐怖的指数量级。另一方面,因为语料集的限制,当历史信息越来越长的时候,某些序列#(·)的频率急剧降低趋于零,会造成计算上的问题。
由于(1)的算法时间复杂度过高,训练花费对我们来说是不可接受的。因此引入了n元文法(n-gram)假设,即每个词出现的频率仅仅依赖于其前面出现的n-1个词,这么做的理论基础叫做马尔科夫假设,当然正如其名,这只是个假设,不过事实证明,it works。因此(1)的式子就变为下面的式(4)(也就是从原来的N元文法转变成了现在的n元, n<N):
一般设置n为3。
为了防止公式一求解链断掉(其中一项为0导致全为0),需要加入平滑算法。
分子分母都加入额外项,每个项的概率值整体都减小了一些,但永远不可能为。
上面的传统方法都是基于传统的概率统计,记数(也就是观察),这样的方法无法计算那些没有在语料库里出现的句子,为了提高泛化性,采取创建一个损失函数来优化学习参数的方法,也就是机器学习或者神经网络的 做法,这么做可以通过相似的句子表达来估算那些语料库中没有的句子概率。
其中,函数 的两个输入变量为上文
和当前词
,
代表模型的参数。可以使用的模型有很多种,比如前馈神经网络语言模型、基于循环神经网络的神经语言模型、基于Transformer的神经语言模型都可以抽象为上述形式。
中间的词预测周围的词。
获取训练样本:按照上下文窗口的大小从训练文本中提取出词汇对,下面以句子The quick brown fox jumps over the lazy dog为例提取用于训练的词汇对,然后将词汇对的两个单词使用one-hot编码就得到了训练用的train_data和target_data。 下面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)示意图如下:
其中T为token个数,m为窗口宽度。