自然语言处理:基础

阅读量 ,评论量

nlp_development

术语

basic

自监督学习

self-supervised learning

困惑度

切词

tockenization / segmentation:

基于词表的切词算法:正向最大匹配法、反向最大匹配法、双向最大匹配算法等。

基于统计模型的切词算法:n-gram模型的切词算法、HMM模型切词算法等。

基于序列标注模型的切词算法:基于CRF的切词算法、基于深度学习的端到端的切词算法等。

汉语自动切词研究评述

一句话介绍切词原理与算法

基于词表的切词

正向最大匹配

反向最大匹配

双向最大匹配

基于词的语言模型的切词

n-gram的切词算法

Byte-Pair-Encoding

BPE的两种编码方式:一种是源语言词汇和目标语言词汇分别编码,另一种是双语词汇联合编码。前者的优势是让词表和文本的表示更紧凑,后者则可以尽可能保证原文和译文的子词切分方式统一。从实验结果来看,在音译或简单复制较多的情形下(比如英德)翻译,联合编码的效果更佳。

通过subword来表示开放词表,以解决OOV和罕见词的问题。

基于字的序列标注模型的切词

HMM模型切词

基于CRF的切词

image-20201015142058969

基于深度学习的端到端的切词

中文切词原则

  1. 切词的结果颗粒度(单个词所包含的字符长度)越大越好。
  2. 最小化 OOV 和单字。
  3. 最小化词语长度方差。

统计语言模型

统计语言模型(statistical language model)目标是得到一个能够计算一个词串的联合概率的函数。作用是检测一句话是正常人说出来的概率是多少。词向量是训练语言模型过程中的『意外之物』。

统计语言模型是基于大数定律,结合贝叶斯公式,利用语料库来计算一个句子(或词串)的概率的。n 个词串共现的概率为: \[ P(W) = P(w_1)P(w_2|w_1)...P(w_n|w_1,w_2,...,w_{n-1}) \\ where, \quad P(w_i) = \frac{count(w_i)}{count(\mathcal{C})} \\ P(w_i|w_1,...,w_{i-1}) = \frac{count(w_1,...,w_{i-1},w_i)}{count(w_1,...,w_{i-1})} \] 求解该模型的方法有很多,n-gram 模型、决策树、最大熵模型、最大熵马尔科夫模型、条件随机场、神经网络等。

当所有的概率值都计算好之后便存储起来,下次需要计算一个词串的概率时,只需找到相关的概率参数,将之连乘即可。

n-gram

添加 n-1 阶马尔科夫假设,得到 n-gram 模型(假设为 3-gram): \[ P(w_i|w_1,...,w_{i-1}) = \frac{count(w_{i-2},w_{i-1},w_i)}{count(w_{i-2},w_{i-1})} \]

当 n 越大:

  1. 模型对历史词的关联性越强,故可区别性越好(模型复杂度越高);
  2. 因模型复杂度呈指数级增高,大数定理的可靠性便越来越差(可理解为一种过拟合现象,因为模型复杂度相对于样本复杂度过高)。

数据稀疏问题

产生该问题的根本原因是采用了统计语言模型。

  1. 语料库中可能出现\(count(w_1,...,w_{i-1},w_i) = 0\)的情况,即该词串永远不会出现,但不应认为\(P(w_i|w_1,...,w_{i-1})=0\)
  2. 语料库中可能出现\(count(w_1,...,w_{i-1}) = count(w_1,...,w_{i-1},w_i)\)的情况,但不应认为$P(w_i|w_1,…,w_{i-1})=$1。

这两种问题称为数据稀疏问题,该问题的出现与语料库的大小无关,由Zipf定律知,在自然语言的语料库里,一个单词出现的频率与它在频率表里的排名成反比,故增大语料库依然无法解决数据稀疏问题。

在 n-gram 模型中,当 n 达到一定值后,即使样本复杂度足够,由于数据稀疏问题,n 越大,性能反而越差。

平滑技术

平滑技术是针对数据稀疏问题引入的技术,常用的有:

NNLM

A Neural Probabilistic Language Model, Bengio et. al(2003)

image-20200609162119122

E:(|V|*m),一行对应一个单词的词向量表示。

FF:全连接。

RNNLM

Recurrent neural network based language model

优势在于没有指定固定的语境,而是使用隐藏层的状态概括之前所有的语境信息。

词符表示

tocken representation

discrete representation

独热(one-hot representation):可认为是一种基于符号的词表示方法。

distributed representation

distributional similarity:通过理解单词出现的上下文来描述词汇意思。

You shall know a word by the company it keeps. – J.R.Firth 1957:11

word vectors 或 word embeddings 含义相同,均指基于分布式相似性来构建的词符表示(distributed representation)。

embedding 是指在一个更低维空间(相较词符的one-hot表示的空间)里编码词符含义。

共现矩阵

用上下文来表示一个单词的方法。有两种计算方法:

one-hot的词表示方法类似于原始人类对新事物起名字,即创建一个全新的概念,概念内没有存储任何知识,可以说是一种符号表示; 共现矩阵的词表示方法类似于字典(用多个相近含义的词来解释一个词),不过它是用常共同出现在同一个窗口内的词来解释一个词。共现矩阵的词表示也可以用来进行语义距离的测量。

共现矩阵缺点是维度灾难(向量维度为词符数量),常用 SVD 来压缩矩阵以实现降维。

词向量

模型将会从每对单词出现的次数中习得统计结果。

word2vec

Efficient Estimation of Word Representations in Vector Space

通过完形填空的假任务来做词向量的学习。embedding层为词向量,后接的层为上下文环境,认为相同上下文环境下的词语义应相近。

模型

Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,如下图所示,从直观上理解,CBOW是『多对一』;Skip-Gram是『一对一』,故CBOW 比 Skip-Gram 训练快,但 Skip-Gram 对生僻词训练效果更好。

固定输入,换label的方式考虑:CBOW模型中,FF获得的矩阵为各个word的上下文语义向量,E获得的矩阵为各个word的自身语义向量。通过FF与E的互相制约,同一个单词的上下文语义向量使得,凑在一起具有相同上下文语义的单词的自身语义向量,加起来能够与同一个上下文语义向量的内积最大。倾向于得到适用于求和的分布式语义,其向量语义含义为它所能构成的上下文语义的子向量

固定label,换输入的方式考虑:Skip-Gram模型中,FF获得的矩阵为在不同位置的各个word上下文语义向量(各个FF不共享),E获得的矩阵为各个word的自身语义向量。通过FF与E的互相制约,在不同位置的上下文语义向量使得,在某一位置具有相同上下文语义的单词的自身语义向量,能够与该位置的同一个上下文语义向量内积最大。skip-gram之所以叫skip,是与n-gram相比,skip-gram为非连续的gram。倾向于得到适用于表示单一单词的分布式语义,其向量语义含义为skip-gram。

word2vec-CBOW

word2vec-skip_gram

相较NNLM,word2vec通过删掉了NNLM的隐藏层降低了计算复杂度,计算复杂度如下图所示:

word2vec-computation

对于Skip-Gram的具体实现,为了更有效地利用缓存,训练得更快,改变词对顺序,以采用NNLM的结构形式:

word2vec-skip_gram-implement

Skip-Gram的数据集本质是窗口内的『一对一』词对,故和计算共现矩阵一样,改变词对顺序最终获得的数据集是一样的,对训练本身没有影响:

word_pair-in-window

作者解释1,2如下:

Tomas Mikolov 12/3/14 This is only for the computational efficiency reasons, it can be shown that both implementations of skip-gram are almost equal (just write on a paper what sequence of training pairs will you obtain for some sentence - it will be just shuffled differently if you predict the middle word given context versus predicting context words given the middle one).

On Wednesday, December 3, 2014 12:54:00 AM UTC-5, Quan Liu wrote: Hi I review the word2vec code many times, i find CBOW and Skipgram models are in the same framework, the sole difference between them is just: CBOW uses the average of the context words to predict the core word, while Skipgram uses each of the context words to predict the core word (sequentially). However, in Tomas’s paper at ICLR-2013, the Skipgram model should use the core word to predict the context words, i wonder there maybe some special considerations for implementing the Skipgram model. Can anyone answer me the question? Quan

Tomas Mikolov 1/30/15 If I got your question correctly, then this issue has been discussed here already several times before. Basically, the different order does not change the updates you do for the whole sentence, just changes the order.. the motivation was to use cache memory more efficiently, and have faster training.

hierarchical softmax

hierarchical-softmax

negative sampling

负采样的方式由模型(希望模型学到的东西)决定。

word2vec模型学到的词向量为上下文特征,故任何一个词都应该成为负例;同时又考虑到一个词在整篇文本中出现的频率越高,它出现在core word周围的概率自然也相对较高,故采用如下的负采样方式(加权采样)。

类似于hierarchical softmax用sigmod做预测,不同的是将树打平,并只取正例和几个负例做梯度反传,其中的几个负例通过negative sampling确定。

【图】

具体的 negative sampling 方法为:将一段长度为1的线段分成\(|V|\)份,每份对应词汇表中的一个词,每个词对应的线段长度由下式确定: \[ len(w) = \frac{count(w)^{3/4}}{\sum\limits_{u \in vocab} count(u)^{3/4}}. \] 然后将这段长度为1的线段划分成\(|M|\)等份,这里\(|M|>>|V|\) ,从而保证每个词对应的线段都会划分成对应的若干小块。最后从\(|M|\)个位置中采样出neg个位置,从而得到neg个负例。

对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。

通过 negative sampling 方式构建的loss可以大大减少计算量,加快训练速度。举例,如果模型的输出层参数量为10000 * 300,我们选取neg为5,那么对于该网络层,我们只要更新(5+1) * 300 = 1800个权重值,是10000 * 300 = 3M总数据量的0.06%,计算资源可以大大节约。

subsampling
将词组对加入词典

考虑到存在合起来和分开的意思大相径庭的词组,所以最好把它当作一个单词,不管是在上下文中还是在word vector中。可以基于词频的统计,找到那些在一起经常出现而在其他上下文中不常出现的词组。

训练策略

Strategies for Training Large Scale Neural Network Language Models

BAIDU-NLP 学习

image-20200529110900009

粒度分析