前言
在我看来NLP的所有思想都是基于统计学来的,不管是HMM,CRF还是说目前火热的神经网络,而目前入行NLP领域的同学可能大部分都没有接触过其中的统计学原理,所谓的神经网络没可解释性也导致大家没兴趣去研究为什么NLP的神经网络要这么去设计。
在接下来的一系列文章中,我将会给大家从统计学的角度来揭开NLP原理的神秘面纱。
温馨提示,本系列文章需要屏幕前的您对贝叶斯有一定的了解。
机器翻译
说到机器翻译,目前大部分都是采用seq2seq的模型,如果你是一个不懂ai的coder,leader需要你开发一个中英翻译系统,你会怎么做呢?
假如,我们手上已经有了一个中英词典,在不考虑语法的情况下,对于一个句子,首先对其进行分词,然后查阅词典,找到每个词对应的英文,即可翻译完成,这个模块我们成为TM(Translation Model)。
例如,我们有这样一个句子CSDN的博客有意思
,分词后CSDN|的|博客|有|意思
,对照词典后翻译结果为CSDN|of|the blog|intresting
,我们把这种直译的结果叫做Broken English,可以看到,如果采用1-1对应的方式来进行直接翻译,那么在语序方面肯定是由问题的。
为了解决语序的问题,有一个最笨的办法,我们统计出所有词的排列方式,例如在上面的例子中,还有可能是
of|CSDN|the blog|intresting
intresting|CSDN|of|the blog
the blog|CSDN|of|intresting
...
等等,一共有24种排列方式即4!
拿到所有的排列方式后,我们需要一个工具,而这个工具呢,他能计算出所有的排列是正常语序的概率,最后我们选择出概率最高的句子作为我们的翻译结果。这里提到的工具,就是NLP的核心LM(Language Model),LM有很多包括HMM、CRF还有目前热门的BERT等等。LM我们之后再说,先回过头来继续看咋们的翻译,对于这个模型有没有什么缺点呢?很明显,在第二个阶段,时间复杂度很高,如果序列的长度是N,那么时间复杂度就是O(N!),并且还分成了两个任务,有没有什么办法能提高效率呢?这就是在NLP领域中最出名的vertbi维特比算法,这里我们简单介绍下其原理,之后还会再详细介绍。
Vertbi维特比简介
我们设c表示的是中文,e表示的是英文,那么翻译任务的目标就是最大化
p
(
e
∣
c
)
p(e|c)
p(e∣c),而我们的TM主要是用来进行翻译,可以表示为
p
(
c
∣
e
)
p(c|e)
p(c∣e),LM是用来判断当前的组合是不是人话,可以表示为
p
(
e
)
p(e)
p(e),根据贝叶斯定理我们可以得到
p
(
e
∣
c
)
=
p
(
c
∣
e
)
p
(
e
)
p
(
c
)
p(e|c) = \frac{p(c|e)p(e)}{p(c)}
p(e∣c)=p(c)p(c∣e)p(e)
因为我们是把中文翻译成英文,所以不管是什么句子,
p
(
c
)
p(c)
p(c)都是一样的,可以看做一个常数项,因此我们可以把目标简化为最大化
p
(
e
∣
c
)
=
p
(
c
∣
e
)
p
(
e
)
p(e|c) = p(c|e)p(e)
p(e∣c)=p(c∣e)p(e)
总结一下,维特比算法就是给定TM与LM找出最优值的使得
p
(
c
∣
e
)
p
(
e
)
p(c|e)p(e)
p(c∣e)p(e)最大,维特比算法把上面提到方法合二为一,让时间复杂度从指数级别降低到了多项式级别。
语言模型
还是以翻译为例子,一个好的语言模型,要考虑到语序问题,例如下面的两个句子,好的语言模型左边的句子概率应该要比右边大。
p(I like studing nlp) > p(I like nlp studing)
那么如何计算这个p()呢,根据联合概率我们可以计算出
p(I like studing nlp) = p(I)·p(like|I)·p(studing|I,like)·p(nlp|I,like,studing)
对于第一项p(I)很好计算,但是对于句子越后面的项p(nlp|I,like,studing)其条件概率是很难计算的,因此为了简化计算过程,NLP界的大佬们采用了markov assumption马尔科夫假设,即用以下的方式来近似表示联合概率
- Unigram,如果我们让每个词都是相互独立的,p(I like studing nlp) = p(I)·p(like)·p(studing)·p(nlp)
- Bigram,如果我们让每个词和它的前一个词有关系,p(I like studing nlp) = p(I)·p(like|I)·p(studing|like)·p(nlp|studing)
- Trigram,如果我们让每个词和它的前两个词有关系,p(I like studing nlp) = p(I)·p(like|I)·p(studing|I,like)·p(nlp|like,studing)
上面的方法统称为n-gram,考虑了几个词就是几gram。
总结
本文主要给大家介绍了一个NLP常见的任务机器翻译,其中包括翻译模型与语言模型,如果我们把翻译场景改变为分词场景,只需要把翻译模型变为分词模型即可,然后用语言模型判断一下哪一种分词是最合理的,同理词性标注也是一样的道理。在下一篇文章中,我们会以分词任务再来详细介绍下维特比算法。
To be continue…