1. 语言模型

1. 语言模型

2. Attention Is All You Need(Transformer)算法原理解析

3. ELMo算法原理解析

4. OpenAI GPT算法原理解析

5. BERT算法原理解析

6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质

7. Transformer-XL原理介绍

1. 前言

在机器学习领域,语言识别和图像识别都不太需要预处理就能喂给计算机,语音识别的输入数据可以是音频频谱序列向量所构成的矩阵,图像识别的输入数据是像素点向量构成的矩阵。但是文本是一种抽象的东西,显然不能直接把文本数据喂给机器当做输入,因此这里就需要对文本数据进行处理。

2. 语言模型

语言模型是对一段文本的概率进行估计即针对文本(X),计算(P(X))的概率,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型神经网络语言模型

3. 统计语言模型

要判断一段文字是不是一句自然语言,可以通过确定这段文字的概率分布来表示其存在的可能性。语言模型中的词是有顺序的,给定m个词看这句话是不是一句合理的自然语言,关键是看这些词的排列顺序是不是正确的。所以统计语言模型的基本思想是计算条件概率。

输入:(X=(x_1,x_2,...,x_m))

输出:(P(X))的概率

[P(X)=P(x_1,x_2,x_3...,x_m)=P(x_2|x_1)P(x_3|x_1,x_2)...P(x_m|x_1,x_2,...x_{m-1}) ]

以上公式就是语言模型的基本定义。这个公式有2个问题。

假设有句子((x_1,x_2,x_3,x_4,x_5,x_6))

[P(x_6|x_1,x_2,x_3,x_4,x_5)=frac{count(x_1,x_2,x_3,x_4,x_5,x_6)}{count(x_1,x_2,x_3,x_4,x_5)} ]

  • 自由参数数目

假定字符串中字符全部来自与大小为(V)的词典,上述例子中我们需要计算所有的条件概率,对于所有的条件概率,这里的(x)都有(V)种取值,那么实际上这个模型的自由参数数目量级是(V^6),6为字符串的长度。
从上面可以看出,模型的自由参数是随着字符串长度的增加而指数级暴增的,这使我们几乎不可能正确的估计出这些参数。

  • 数据稀疏性

从上面可以看到,每一个(x)都具有(V)种取值,这样构造出了非常多的词对,但实际中训练语料是不会出现这么多种组合的,那么依据最大似然估计,最终得到的概率实际是很可能是0。

3.1 N-gram模型

大家已经知道了语言模型的定义,那首先会遇到一个问题,上面这个公式遇到长句子时计算最后一个词的概率(P(x_m|x_1,x_2,...x_{m-1}))会变得非常的麻烦,那我们是不是可以进行一定的简化呢?设想一下这句话“今天天气真是不错,现在感觉有点饿,我们去吃饭吧!”当我们预测P("吃饭")的概率时,感觉和最前面描述天气的关系不是很大,而是和比较近的“有点饿”联系比较紧密。所以我们根据一个词会和它附近的词联系比较紧密,那我们就可以简化语言模型的概率公式了。

假设我们定义一个词的概率和它前面的k个词相关,公式改写如下:

[P(x_i|x_1,x_2,...x_{i-1})=P(x_i|x_{i-(k-1)},...,x_{i-1}) ]

[P(X)=prod_{i=1}^mP(x_i|x_{i-(k-1)},...,x_{i-1}) ]

从模型的效果来看,理论上(n)的取值越大,效果越好。但随着(n)取值的增加,效果提升的幅度是在下降的。同时还涉及到一个可靠性和可区别性的问题,参数越多,可区别性越好,但同时单个参数的实例变少从而降低了可靠性。

N-gram比较好解决了自由参数多的问题,但是数据稀疏的问题还是没有呗解决。

3.2 平滑化

假设有一个词组在训练语料中没有出现过,那么它的频次就为0,但实际上能不能认为它出现的概率为0呢?显然不可以,我们无法保证训练语料的完备性。那么,解决的方法是什么?如果我们默认每一个词组都出现1次呢,无论词组出现的频次是多少,都往上加1,这就能够解决概率为0的问题了。

[P(x_6|x_1,x_2,x_3,x_4,x_5)=frac{count(x_1,x_2,x_3,x_4,x_5,x_6) + 1}{count(x_1,x_2,x_3,x_4,x_5) + 1} ]

4. 神经网络语言模型

神经网络语言模型的提出解决了N-gram模型当(n)较大时会发生数据稀疏的问题。与N-gram语言模型相同,神经网络语言模型(NNLM)也是对(n)元语言模型进行建模,估计(P(x_i|x_{i-n+1},x_{i-n+2},...x_{i-1}))的概率,与统计语言模型不同的是,神经网络语言模型不通过计数的方法对(n)元条件概率进行估计,而是直接通过一个神经网络对其建模求解。

image

神经网络语言模型的结构入上图所示,可以分为输入层、投影层、隐藏层和输出层

  1. 输入层:这里就是词(x)的上下文,如果用N-gram的方法就是词(x)的前(n-1)个词了。每一个词都作为一个长度为(V)的one-hot向量传入神经网络中.
  2. 投影层:投影层也叫embedding层,在投影层中,存在一个look-up表(C)(C)被表示成一个(V*m)的自由参数矩阵,其中(V)是词典的大小,而(m)代表每个词投影后的维度。表(C)中每一行都作为一个词向量存在,这个词向量可以理解为每一个词的另一种分布式表示。每一个one-hot向量都经过表(C)的转化变成一个词向量。(n-1)个词向量首尾相接的拼起来,转化为((n-1)m)的列向量输入到下一层。
  3. 隐藏层:隐藏层的作用是进行非线性变换。(z=tanh(WX+b))
  4. 输出层:用softmax进行概率计算,计算词表(V)的每个词的概率。(P(x_i)=softmax(z))

5. 总结

即使使用了神经网络语言模型,本质上仍然是N元语言模型,就是你要预测的当前词只和他前面的N-1个词有关,与更前面的词无关。尽管神经网络这种方法一定程度上解决了数据稀疏的问题,但还是损失了一些信息。如果想要学习前面所有的的词就要涉及s到自然语言处理中的循环神经网络(RNN),我们都知道,循环神经网络的定义是当前的输出不仅和当前的输入有关,还和上一时刻的隐藏层的输出有关,这样讲神经网络展开后就会发现他把序列从开头到结尾全连起来了,十分方便处理序列数据,而这个性质正是我们做语言模型所需要的。

原文地址:https://www.cnblogs.com/huangyc/p/9861453.html