接文章《NLP系列文章(一)——按照学习思路整理发展史》《NLP系列文章(二)——NLP领域任务分类、NNLM语言模型》继续讲述NLP预训练的那些事

word embedding

在互联网中,每天都海量的文本信息。而NLP就是使用计算机处理自然语言的过程。

众所周知,computer只能处理数值,因此自然语言需要以一定的形式转化为数值,以供computer处理。
word embedding就是将词语(word)映射为数值的方式。使用单个实数表示所能包含的信息太少,所以一般将word映射为一个数值向量或者tensor。

那么问题来了,①如何才能把word转换为数值向量?②如何在转换过程中保留自然语言本身所蕴含的语义和句法等抽象的特征?这很重要!!如果没有将自然语言这些抽象的特征有效的保留下来,那么建模所使用的信息是无意义的,那么最终train的模型也没有很好效果。

纵观NLP的发展史【虽然目前本人的知识素质并不能实现这样的理论总结】,很多革命性的成果都是word embedding发展的成果,如Word2Vec、ELMo、BERT等等,都是通过对转换过程中自然语言特征的高效保留,而实现的发展。

什么是word embedding?

Word embedding就是文本预处理的一种形式;

简言之,word embedding就是把一个word converted into numbers;

形象化讲,有个dictionary存word to vector的map,即{word:vector;word:vector;……}。

Eg:

 

NLP英文文本生成 nlp word embedding_预训练

word embedding有什么类型?
可分为2种类型,Frequency besed embedding 和Prediction based embedding,即频率和预测。

frequency based embedding

常用的有count vector和TF-IDF vector。

1> count vector

句子中单词出现的频数,形成一个metric [行:unique word;列:句子],规模:全部文本的唯一单词数*句子个数。

 

NLP英文文本生成 nlp word embedding_机器学习_02

缺点:当文本很大的时候,unique word基数会变的很大,count vector metric的列数暴增【维度暴增、最终会导致形成稀疏矩阵】,而每个句子Si不一定都会用到这些unique word,最后形成sparse metric【也就是这个metric里面存在很多0,也就是无意义值】,这就会导致我们后续计算中不会很高效,我们都明白efficiency在当下是多么重要。

弥补缺点方法: 为了提高efficiency,最直观的方式是改变metric维度,也就是“降维”。
即 删除一些单词,即 nlp的一个term——停止词stopword。
那什么样子的词算作stopword? 一般来讲,对于 经常出现,且 删掉也不会对句子的理解有很大的影响的词 都算作停止词。比如,英语中的“is are were a also”;中文中的“的 是”。

2> TF-IDF vector
按照删除掉一些词的思路,引出一个新的方式TF-IDF vector,在某种程度上,TF-IDF vector能够发现corpus中哪些词是不重要的词。
原理:
TF == 同一文本中,哪些词出现的越多,哪些词就重要。
IDF == 解决有的词经常出现,但并不表示他们很重要的问题。
如,这些词在很多document都有,检索信息的时候我们一定是使用想要信息特有的key word,IDF计算的是这个word在document中出现了,并将这个word的词频和其他文本中这个word的词频作比较,如果这个word的词频都很高,那就说明这个word对于本document 并不重要,其他document的词频很小说明这个word对于本document很重要。

;也就是说,如果某个word在一篇document中出现的频率TF高,并且在其他document中很少出现,则认为此word或者短语具有很好的类别区分能力(特有),适合用来分类。

公式:

 

NLP英文文本生成 nlp word embedding_nlp_03


以上操作就实现了 去掉了经常出现且没有意义的词汇。

缺点:没有考虑到word和word之间的关系。一直在纠结word在document中的出现次数的关系。所以要看prediction based embedding是怎么做。

3> 词共现向量

词共现向量的关键是词共现矩阵,词共现矩阵结构类似count vector的词频矩阵。

共现:给定语料中,word1和word2在给定上下文窗口中共同出现的次数。

上下文窗口:计算共现时所指定的窗口大小,由距离和方向共同指定。

eg:

 

NLP英文文本生成 nlp word embedding_NLP英文文本生成_04

缺点:词共现矩阵和count vector很相似,随着语料库的增大,unique词典也在增大,但是并不是所用的word 之间都存在共现关系,导致vector稀疏且高维,不利于高效计算。
实践中,使用PCA或者SVD等技术,将共现矩阵降维为V*k(k<<V),那么每个维度都由V降到k。

prediction based embedding
就是使用预训练机器学习的方法的得到predicted vector,一般是用神经网络。
常见的有 word2vec(2013 google)和fast text(facebook)

1> word2vec
Word2vec是很popular的技术,主要是使用shallow neural network去学习word embedding,主要有
两种方式去train这个模型:CBOW(common bag of word)和skip-gram model。
①CBOW:使用context去预测current word,也就是周围词预测中心词。【cbow和后面要讲的bert似乎有些不可描述的渊源,虽然bert的论文中有讲灵感来源,不过可以头脑风暴一下】
②skip-gram:使用current word去预测context,也就是中心词预测周围词。用中心词去看哪些词在它周围更能出现【use probability】,概率越高,是周围词的可能性越高。

主要是使用了slide window(滑动窗口),如果slide window = 2,那表示中心词前后各两个word,一共四个是中心词的周围词,即context或train samples。通过将train samples全都coalesce到一起,feed到neural network中,最后看output中的probability,确定哪些词最有可能出现在中心词周围。这样最终实现的是意思相同的词在空间上的vector也是相近的。

 

NLP英文文本生成 nlp word embedding_机器学习_05

回头看看NNLM的训练过程,NNLM是输入一个单词的上文,去预测这个单词。这是有显著差异的。为什么Word2Vec这么处理?原因很简单,因为Word2Vec和NNLM不一样,NNLM的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,在这里word embedding只是无心插柳的一个副产品。但是Word2Vec目标不一样,它单纯就是要word embedding的,这是主产品,所以它完全可以随性地去训练网络,只要最后的word embedding效果好。


当然从这里的分析我们也能知道在以后的学习中,无论面对什么任务,embedding是基础【当然不光是word还有char、position、token等等很多类型,但是他们的角色基本是差不多的】,embedding可以是自己模型训练的一部分,也能直接借用已经使用大量文本训练好的embedding,“主要专业对口,那么最后lookup就可以获得想要的embedding”。
在这我们可以想一下为什么X embedding被叫做X嵌入呢?其实很直观,任何语言、任务上,run模型的时候,模型的输入是数字型的,这个输入可以是借鉴来的,也能是自己开辟一块任务空间训练出来再插入主模型的,整体上讲,本质就是一个随插随用的工具,可能唯一值得我们记住和挖掘它的点就是 embedding是模型run的关键,没有它整个模型就是一个摆设。

所以问题来了,word embedding这种做法能算是预训练吗?

接下来通过讲word embedding在下游任务中的应用来 点明它就是一个标准的预训练过程。

假设有一个问答任务(QA):给一个问题X,给定另外一个句子,判断句子Y是否是问题X的正确答案。

假设设计如下网络结构,结构不细说,我们看如何使用embedding,这里句子中的每个单词转成one-hot,然后和已训练好的word embedding矩阵Q相乘取得 单词的word embedding,看起来像是lookup操作,其实这里的隐藏操作是:矩阵Q是one-hot编码层到embedding层映射的一个网络参数矩阵。所以在下游任务中使用embedding就相当于将one-hot编码层到embedding层的参数用预训练的Q初始化。这里和图像有些区别就是图像的预训练结果能初始化新任务网络的浅层(可能不光一层),但是NLP中embedding只能初始化第一层网络参数。当然下游任务在训练的时候也有两种方式:fine-tuning和frozen,原理一致。

NLP英文文本生成 nlp word embedding_发展史_06

上图中所示的网络模型是18年之前NLP领域的预训练做法。word embedding的出现并没带来技术上里程碑式的创新,为什么这样训练及使用Word Embedding的效果没有期待中那么好?→Word Embedding存在什么问题?

其实不难想到,多义词是语言灵活性和高效性的体现,那么Word2vec是如何处理多义词呢?我们知道,多义词在不同的语境中有不同的含义,按理说他们的embedding是不一样的,占据不同的参数空间,可是word2vec却将全部的信息都编码到同一参数空间,导致不同的上下文信息都会编码到同一个word embedding空间中。

综上,我们发现word embedding无法区分多义词的不同语义,这就是一个致命的问题。为了解决这个问题

有很多研究人员提出很多方法,但是从今天往回看,这些方法看上去都成本太高或者太繁琐了,有没有简单优美的解决方案呢?【具体有什么方法后期需要继续补充】

NLP英文文本生成 nlp word embedding_nlp_07


这就要引出ELMO了。

2> Fast text

Fast text是使用word 和它的subword去train,如果给了新词,fast text能预测出贴近的一个vector。Text representation是NLP中的基础技术,text classification是NLP的重要应用。Fast text是Facebook于2016年开源的一个word embedding和text classification工具,典型的应用场景是“带监督的文本分类问题”,提供简单高效的文本分类和表征学习的方法,性能堪比深度学习且速度更快。与基于神经网络的分类算法相比有以下优点:1、fastText在保持高精度的情况下,加快了训练速度和测试速度2、fastText不需要预训练的词向量,会自己训练词向量3、fastText两个重要的优化:Hierarchical Softmax(层softmax)、N-gram

提问:

①自然语言的特征是非常抽象的,如何将word的语义以数值向量的方式体现出来是非常有挑战性的。 count vector和TF-IDF vector都是站在word和document关系的角度完成词到向量的转换。而词共现矩阵则是从word与word之间的关系角度去抽取词语的含义。
是否可以将word映射到向量空间之后仍保留word之间的关系?
②基于统计的词嵌入方法在什么样的任务中可以取得好的结果呢?
同样从特征的角度出发,什么样的任务需要word对document重要性的特征呢?
如垃圾邮件识别,一些垃圾邮件一般有经常出现的“垃圾”词语,就可以使用基于统计的词嵌入方法;
如关键词提取,就可以使用TF-IDF。
而一些需要复杂语义和句法特征的任务,如机器阅读理解,机器翻译等,就无法使用这些word embedding 方法。
基于统计的词嵌入方法和基于预测的词嵌入方法(如Word2Vec)有什么区别?,为什么深度学习中要使用后者。
个人观点是,一个方面,基于统计的词嵌入方法一旦在数据确定之后,词的向量便就确定,在不同的NLP任务中都要使用相同的词向量,无法根据不同任务进行调整。而基于预测的词嵌入可以在不同的任务和模型中更新词向量,使词向量逐步地适应这项任务;另一方面则是基于统计的词嵌入方法提取的语义信息实在太少,无法取到比较好的结果。