语言模型【入门干货】

前言

在机器学习领域,语音识别和图像识别都不太需要预处理就能直接“喂”给计算机,这是因为,语音识别的输入数据可以是音频频谱序列向量所构成的矩阵,图像识别的输入是像素点向量构成的矩阵,即它们本身就是计算机可以识别的“二进制”数据。但是文本是一种非常抽象的东西,显然计算机是不能直接识别出来的,也就是说不能直接把文本数据喂给计算机当做输入,而是需要对文本数据进行一定的处理,使得处理后的文本可以直接作为计算机的输入,也就是我们说的词嵌入或者词向量技术。

要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的。

语言模型

语言模型是对一段文本的概率进行估计,即针对文本 X X X,计算 P ( X ) P(X) P(X)的概率,对信息检索,机器翻译,语音识别,文本分类等任务都有着重要的作用。在历史的发展中,语言模型经历了专家语法规则模型(至80年代),统计语言模型(至00年),神经网络语言模型(到目前)。

专家语法规则模型

在计算机初始阶段,随着计算机编程语言的发展,归纳出的针对自然语言的语法规则。但是自然语言本身的多样性、口语化,在时间、空间上的演化,及人本身强大的纠错能力,导致语法规则急剧膨胀,不可持续。

统计语言模型

统计语言模型基本定义

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

输入: X = ( x 1 , x 2 , . . . , x m ) X=(x_{1},x_{2},...,x_{m}) X=(x1,x2,...,xm),由m个词构成的一段文字序列
输出: P ( X ) P(X) P(X)的概率”,这段文字序列是一句自然语言的概率
语言模型的基本定义(计算公式)如下:
P ( X ) = P ( x 1 , x 2 , . . . , x m ) = P ( x 1 ) P ( x 2 ∣ x 1 ) P ( x 3 ∣ x 1 , x 2 ) . . . P ( x m ∣ x 1 , x 2 , . . . , x m − 1 ) P(X)=P(x_{1},x_{2},...,x_{m})\\=P(x_{1})P(x_{2}|x_{1})P(x_{3}|x_{1},x_{2})...P(x_{m}|x_{1},x_{2},...,x_{m-1}) P(X)=P(x1,x2,...,xm)=P(x1)P(x2x1)P(x3x1,x2)...P(xmx1,x2,...,xm1)
以上公式是基于链式法则的

为了计算语言模型,我们需要计算词的概率,以及一个词在给定前几个词的情况下的条件概率,即语言模型参数。设训练数据集为一个大型文本语料库,如维基百科的所有条目。词的概率可以通过该词在训练数据集中的相对词频来计算。例如, P ( w 1 ) P(w_1) P(w1) 可以计算为 w 1 w_1 w1 在训练数据集中的词频(即词出现的次数)与训练数据集的总词数之比。因此,根据条件概率定义,一个词在给定前几个词的情况下的条件概率也可以通过训练数据集中的相对词频计算。例如, P ( w 2 ∣ w 1 ) P(w_2∣w_1) P(w2w1) 可以计算为 w 1 , w 2 w_1,w_2 w1,w2 两词相邻的频率与 w 1 w_1 w1 词频的比值,因此该比值即为$ P(w_1,w_2)$ 与 P ( w 1 ) P(w_1) P(w1) 之比;而 P ( w 3 ∣ w 1 , w 2 ) P(w_3∣w_1,w_2) P(w3w1,w2) 同理可以计算为 w 1 、 w 2 w_1、w_2 w1w2 w 3 w_3 w3 三词相邻的频率与 w 1 、 w 2 w_1 、 w_2 w1w2 两词相邻的频率的比值。以此类推。

统计语言模型的问题

  • 自由参数的数目
    假设有句子 ( x 1 , x 2 , x 3 , . . . , x m ) (x_{1},x_{2},x_{3},...,x_{m}) (x1,x2,x3,...,xm)
    那么 P ( x 6 ∣ x 1 , x 2 , x 3 , x 4 , x 5 ) = c o u n t ( x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ) x o u n t ( x 1 , x 2 , x 3 , x 4 , x 5 ) 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)}{xount(x_{1},x_2,x_3,x_4,x_5)} P(x6x1,x2,x3,x4,x5)=xount(x1,x2,x3,x4,x5)count(x1,x2,x3,x4,x5,x6)
    假定字符串中的字符全部来自于大小为 V V V的词典,上述例子中我们需要计算所有的条件概率,对于所有的条件概率,这里的 x x x都有 V V V中可能取值,那么实际上这个模型的自由参数的数目量级是 V 6 V^6 V6,6为字符串的长度。
  • 数据稀疏性
  • 从上面可以看到,每一个x都具有 V V V中取值,这样造出了非常多的词对,但实际中训练语料是不会出现这么多种组合的,那么一句最大似然估计,最终得到的概率实际很可能是0。

实际上,计算机是借助于统计语言模型的概率参数,可以估计出自然语言中每个句子出现的可能性,而不是简单的判断该句子是否合法。统计语言模型用简单的方式,加上大量的语料,产生了比较好的结果。统计语言模型通过对句子的概率分布进行建模,概率高的语句比概率低的语句更为合理。在实现中,通过给定的上文来预测句子的下一个词, 如果预测的词和下一个词是一致(该词在上文的前提下出现的概率比其它词概率要高),那么上文+该词出现的概率就会比上文+其他词词的概率要更大,上文+该词更为合理

N-gram模型

大家已经知道了统计语言模型的定义,那么首先会遇到一个问题:当遇到长句子的时候,利用统计语言模型的计算公式,在计算最后一个词语的概率 P ( x m ∣ x 1 , x 2 , . . . , x m − 1 ) P(x_{m}|x_{1},x_{2},...,x_{m-1}) P(xmx1,x2,...,xm1)会变得非常麻烦,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。那我们是不是可以进行一定的简化呢?

设想一下这句话:“今天天气真不错,感觉有点饿,我们去吃饭吧!”,当我们预测P(“吃饭”)的概率时,感觉和最前面描述天气的关系不是很大,而是和比较近的"有点饿"联系比较紧密,所以我们根据 一个词会和它附近的词联系比较紧密这样的一个假设(本质上是马尔可夫假设),进行简化语言模型的概率公式,。
假设我们定义一个词的概率和它前面的k个词相关(即k-gram),公式改写如下:
P ( x i ∣ x 1 , x 2 , . . . x i − 1 ) = P ( x i ∣ x i − ( k − 1 ) , . . . , x i − 1 ) P ( X ) = ∏ i = 1 m P ( x i ∣ x i − ( k − 1 ) , . . . , x i − 1 ) 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}) P(xix1,x2,...xi1)=P(xixi(k1),...,xi1)P(X)=i=1mP(xixi(k1),...,xi1)

同样也采用极大似然估计法来计算每一个条件概率,即:
p ^ M L E ( w i + 1 = m ∣ w i − k : i ) = # ( w i − k : i + 1 ) # ( w i − k : i ) \hat{p}_{\mathrm{MLE}}\left(w_{i+1}=m | w_{i-k : i}\right)=\frac{\#\left(w_{i-k : i+1}\right)}{\#\left(w_{i-k : i}\right)} p^MLE(wi+1=mwik:i)=#(wik:i)#(wik:i+1)

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

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

统计语言模型就是计算一个句子的概率值大小,整句的概率就是各个词出现概率的乘积,概率值越大表明该句子越合理。N-gram是典型的统计语言模型,它做出了一种假设,当前词的出现只与前面N-1个词相关,而与其他任何词都不相关,整句的概率就是各个词出现概率乘积。它存在很多问题:在求每一个词出现的概率是,随着n的提升,能够拥有更多的前置信息,可以使得当前词的预测更加准确,但是当N过大的时候,会出现稀疏问题,某些n-gram从未出现过,导致很多词的概率值为0,为了避免这样的问题,因此常用bigram或者trigram,然而这样就又会使得N-gram模型无法获得上文的长时依赖。另一方面,N-gram只是基于频次进行统计,没有足够的泛化能力。也就是说,简单的统计语言模型计算方法只能精确计算h的概率(因为是通过词匹配和词统计),而无法对相似的文本h’得到相近的概率值。

平滑处理

假设有一个词组在训练语料中没有出现过,那么它的频次就是0,但是实际上能不能认为它出现的概率为0呢?这显然是不可以的,因为我们无法保证训练语料的完备性。那么我们可以通过平滑处理来解决这样的问题。通过默认每个词组都出现1次,那么无论词组出现的频次是多少,我们都往上加1,这就可以避免出现0频次的问题。
P ( x 6 ∣ x 1 , x 2 , x 3 , x 4 , x 5 ) = c o u n t ( x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ) + 1 c o u n t ( x 1 , x 2 , x 3 , x 4 , x 5 ) + ∣ V ∣ 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) + |V|} P(x6x1,x2,x3,x4,x5)=count(x1,x2,x3,x4,x5)+Vcount(x1,x2,x3,x4,x5,x6)+1

常用的平滑技术还有:

Add α \alpha α 平滑
上述的加一平滑其实就是 α = 1 \alpha=1 α=1的情况。
p ^ a d d − α ( w i + 1 = m ∣ w i − k : i ) = # ( w i − k : i + 1 ) + α # ( w i − k : i ) + α ∣ V ∣ , 0 < α ≤ 1 \hat{p}_{\mathrm{add}-\alpha}\left(w_{i+1}=m | w_{i-k : i}\right)=\frac{\#\left(w_{i-k : i+1}\right)+\alpha}{\#\left(w_{i-k : i}\right)+\alpha|V|},0<\alpha \leq 1 p^addα(wi+1=mwik:i)=#(wik:i)+αV#(wik:i+1)+α,0<α1

BACK-OFF
假设为:如果k-gram没有观测值的话,就计算(k-1)-gram的值,来代替:
p ^  int  ( w i + 1 = m ∣ w i − k : i ) = λ w i − k : i # ( w i − k : i + 1 ) # ( w i − k : i ) + ( 1 − λ w i − k : i ) p ^  int  ( w i + 1 = m ∣ w i − ( k − 1 ) : i ) \hat{p}_{\text { int }}\left(w_{i+1}=m | w_{i-k : i}\right)=\\\lambda_{w_{i-k : i}} \frac{\#\left(w_{i-k : i+1}\right)}{\#\left(w_{i-k : i}\right)}+\left(1-\lambda_{w_{i-k : i}}\right) \hat{p}_{\text { int }}\left(w_{i+1}=m | w_{i-(k-1) : i}\right) p^ int (wi+1=mwik:i)=λwik:i#(wik:i)#(wik:i+1)+(1λwik:i)p^ int (wi+1=mwi(k1):i)

神经网络语言模型

传统的语言模型具有一定的局限性,比如:平滑技术复杂、计算量大、泛化性比较差。随之而出的就是基于神经网络的语言模型了。
2003年Bengio提出神经网络语言模型(Neural Network Languge Model,NNLM)的思想是提出词向量的概念(这时才是词向量真正的被正式提出来),采用连续变量(具有一定维度的实数向量)来进行单词的分布式表示,代替了n-gram使用的高维的离散变量,解决了维度爆炸的问题,同时通过词向量可获取词之间的相似性。
神经网络语言模型的提出解决了基于统计的 N − g r a m N-gram Ngram模型,当 n n n取较大值的时候会发生的数据稀疏的问题。与N-gram语言模型相同,神经网络语言模型(NNLM)也是对 n n n元语言模型进行建模,估计 P ( x i ∣ x i − n + 1 , x i − n + 2 , . . . x i − 1 ) P(x_i|x_{i-n+1},x_{i-n+2},...x_{i-1}) P(xixin+1,xin+2,...xi1)的概率,与统计语言模型不同的是,神经网络语言模型不通过计数的方式对 n n n元条件概率进行估计,而是直接通过一个神经网络对其建模求解。

Bengio 用了一个三层的神经网络来构建语言模型,同样也是 n-gram 模型。如下图所示:
在这里插入图片描述
结合上图可知,它所建立的语言模型的任务是根据窗口大小内的上文来预测下一个词,因此从另一个角度看它就是一个使用神经网络编码的n-gram模型。
神经网络语言模型的结构如上图所示,可以分为输入层、投影层、隐藏层和输出层。

1、输入层:这里就是词 x x x的上下文,如果用N-gram的方法就是词x的前n-1个词了。每一个词都为长度为V的one-hot向量传入神经网络中。
2、投影层:投影层也叫embedding层,在投影层中,存在一个look-up表C,C被表示为一个 V ∗ m V*m Vm的自由参数矩阵,其中 V V V表示词典的大小, m m m表示每个词投影后的维度。表C中每一行都作为一个词向量存在,这个词向量可以理解为每一个词的另一种分布式表示。每一个one-hot向量都经过表C的转化变成一个词向量。n-1个词向量收尾相接的拼起来,转化为 ( n − 1 ) m (n-1)m (n1)m的列向量输入到下一层
3、隐藏层:隐藏层的作用是进行非线性变化: z = t a n h ( W X + b ) z=tanh(WX+b) z=tanh(WX+b)
4、输出层:用softmax进行概率计算,计算词表V的每个词的概率。 P ( x i ) = s o f t m a x ( z ) P(x_{i})=softmax(z) P(xi)=softmax(z)
优化的目标是使得待预测词其对应的softmax值最大,值得注意的是,该神经网络结构,输入层的 x x x(即词向量)也是参数,也是需要进行不断优化的,在优化结束之后,词向量有了,语言模型也有了。

缺点:因为这是通过前馈神经网络来训练语言模型,缺点显而易见就是其中的参数过多计算量较大,同时softmax那部分计算量也过大。另一方面NNLM直观上看就是使用神经网络编码的 n-gram 模型,也无法解决长期依赖的问题。 可以通过RNNLM语言模型来解决。

RNNLM

它是基于RNN及其变种网络来训练语言模型,任务是通过上文来预测下一个词,它相比于NNLM的优势在于所使用的为RNN,RNN在处理序列数据方面具有天然优势,RNN 网络打破了上下文窗口的限制,使用隐藏层的状态概括历史全部语境信息,对比 NNLM 可以捕获更长的依赖,在实验中取得了更好的效果。RNNLM 超参数少,通用性更强;但由于 RNN 存在梯度弥散问题,使得其很难捕获更长距离的依赖信息。

几种常见的预训练语言模型

Word2vec中的CBOW 以及skip-gram,其中CBOW是通过窗口大小内的上下文预测中心词,而skip-gram恰恰相反,是通过输入的中心词预测窗口大小内的上下文。

Glove 是属于统计语言模型,通过统计学知识来训练词向量

ELMO 通过使用多层双向的LSTM(一般都是使用两层)来训练语言模型,任务是利用上下文来预测当前词,上文信息通过正向的LSTM获得,下文信息通过反向的LSTM获得,这种双向是一种弱双向性,因此获得的不是真正的上下文信息。

GPT是通过Transformer来训练语言模型,它所训练的语言模型是单向的,通过上文来预测下一个单词

BERT通过Transformer来训练MLM这种真正意义上的双向的语言模型,它所训练的语言模型是根据上下文来预测当前词。

语言模型的评判指标

具体参考:这里

Perplexity可以认为是average branch factor(平均分支系数),即预测下一个词时可以有多少种选择。别人在作报告时说模型的PPL下降到90,可以直观地理解为,在模型生成一句话时下一个词有90个合理选择,可选词数越少,我们大致认为模型越准确。这样也能解释,为什么PPL越小,模型越好。
一般用困惑度Perplexity(PPL)衡量语言模型的好坏,困惑度越小则模型生成一句话时下一个词的可选择性越少,句子越确定则语言模型越好。

参考资料

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱科研的徐博士

请各位看官赏赐,小仙女笔芯笔芯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值