author:XueQiang Tong mail:niurenai@outlook.com v:txq130 算法
先引入一个例子:网络
bush这个词有灌木丛和总统两个意思。给你一句话,若是其中含有bush这个词,如何判断他的语义?机器学习
这是一个经典又古老的nlp话题。解决他的方案,有不少。其中有一个方案是这样的:在计算bush的上下文与标注语料中出现bush句子的上下文的类似度,若是与总统的上下文类似度高,就是总统的意思,若是与灌木丛的上下文类似度高,就是灌木丛的意思。这个方案最大的特色是计算语义的上下文,这是语义消歧,除此以外,汉语中有不少同义词,反义词和近义词,衡量他们的最好办法仍然是上下文。那么在汉语中,会有以下的状况:①相同语境下出现不一样的词②不一样的语境下出现相同的词,这两种状况在语料中是大量存在的。稍后深刻讨论这两种状况对语义表示的影响。学习
本文要讨论的是,从w2v的核心思想入手,探讨他的语义表示在前面提到的两种情景下会有什么问题,如何改进而后迁移到句子或者短语语义表示。优化
上面提到了经过计算上下文类似度来解决语义问题。那么问题来了,咱们可不能够把上下文的信息融合到词自己,这样就能够直接衡量词的差别了。也就是,用一个稠密的向量(相对于one-hot)把词自己,语义信息和上下文信息压缩起来,用以解决此的语义问题。在nlp中,解决语义问题的核心是语言模型,有了语言模型就能够抽象出数学模型。这个问题的语言模型是:相同语境出现的词语义相近。举例子:现有一句话由如下词构成:ABCDE。如今要用一个稠密向量表示C的语义,把他的上下文A、B与D、E融合进来,也就是这样一个数学公式:A + B + D + E = C。这个公式是一个最简单的加法,可是要转化成机器学习的数学模型才能解决问题,这个公式的含义就是输入上下文,输出词分类,是个分类模型,固然也能够倒过来。构建这样一个分类模型,从中咱们要获得词的语义表示,这是一个variable,同时还要有分类输出层的参数thelta,一共两个variable。那么,这两个变量应该是什么关系才能知足上述语言模型,也就是保证C的上下文是A,B,D,E的前提下获取到他的语义表示?很显然,这个过程当中,两个参数绝非是独立的,必须相互决定相互影响才能知足这个需求。首先获取词的语义表示变量,获取以后进入到分类层,让着两个参数是互为对称的关系。因而,咱们想到,用神经网络抽取到词的高阶语义表示,而后进行激活,把激活值的输出做为分类层的输入,完成模型的构建。说白了,就是如今有一个稠密语义表示的矩阵,这个矩阵就至关于词典,最初的时候每一个词用one-hot表示,拿到这个one-hot后,到稠密词典中进行查找,找到对应的稠密向量表示,而后去作分类映射,这是基本的想法。查找的过程属于典型的矩阵操做(请体会矩阵的本质,以及矩阵分解的意义),这个过程实际上是一层神经网络的操做,而后用y = x激活。google
上面的思考过程很重要。w2v的CBOW和Skip_Gram是两个很是经典的语言模型。关于他的优化及推导不作具体论述了,比较简单,如今回归本文的正题。以前作过siamese lstm的实验,主要用以解决句子语义类似度的计算,这个方案是2015年提出的,得到了很高的准确率。可是缺点也很明显,人工构建语料比较复杂,并且准确率难以肯定。监督学习给企业应用带来不小的困扰,探索非监督学习用以解决句子或者短语的语义表示是一个很重要的尝试。由于以前word2vector在词语义表示上已经很成功了,因此没有必要推倒了重来,咱们要作的是在此基础之上探索。为了探索w2v的语义表示问题,咱们不妨从一个经典古老的话题开始:TF-IDF。在深度学习没有出现以前,他在特征词抽取上占据主导位置,包括lucene底层的文档打分也用到他。那么他有什么闪光点吗?在深度学习产生后他是否是没用了呢?这个方法认为,若是一个词在一篇文章中出现的频率高,那么他就是重要的,同时若是有多篇文章都出现了这个词,那么他又是不那么重要了。事实上,IDF的推导是由朴素贝叶斯简化来的,也能够用信息熵来理解他,就是平均信息量。如今来探讨前面提到的两种情景。用w2v训练词嵌入时,由于他是机器学习模型,有过经验的人都知道,在机器学习模型训练中会存在数据倾斜问题。什么意思呢?以垂直搜索的文档机器学习排序为例,在listwise产生以前,占据主导的是pairwise,好比用SVM转化为二分类问题,结果就转化为了文档对儿的分类。因为不一样的文档集合文档对儿数量不同,多的会对模型训练贡献大,预测时会出现数据倾斜。那么在w2v训练时一样存在这样的数据倾斜问题。①相同语境下出现不一样的词。好比在训练语料中,上下文A,B,D,E,中间的词C,出现了100次,而一样的上下文状况下,中间的词F,只出现数次,那么在训练时C的语义表示会比F要稠密一些,会与相同的上下文联系更加紧密。可是,在汉语中,有很对相似于英文中的and,but,no等词,并且出现的频率很高,这些词对句子的语义贡献是无心义的,因而训练出来的语义表示会倾向于语义无心义方向。另外,相同的语境下出现的不一样的词,用VSM来解释的话,应该是近义词,位于一个象限内。这样汉语中众多的词,在VSM中会汇聚成不一样的簇,就像聚类同样。那么问题有来了,若是一个词有多个含义,如何表示歧义词的语义?目前的word2vector在这方面有没有问题呢,答案是有的。熟悉聚类算法的人都知道,除了kmeans还有高斯混合聚类。他们俩的区别能够这样说,前者的归类是hard,后者是soft,那么解决歧义词的语义表示,应该让他具有多重语义,也就是应该与多个上下文重叠。这个今年已经有学者改进了。②不一样的语境下出现相同的词,out of context状况。若是要预测的词的上下文在训练语料中历来没有出现过,此时的预测与上下文显然是违和的。url
上面提到的两个问题,已经有了解决方案,之因此关注这些问题,是为了解决句子语义表示的非监督学习。对于每个句子都有一个隐含的句子嵌入表示,以这个语义表示为中心,他会影响句子中每一个词的分布。也就是咱们应该找到一种解决办法,让这些词的语义表示,经过某种方式,好比加权求和以后获得最终的语义表示,与这个隐含的句子语义表示最接近,有点儿接近非监督学习的思想了吧。前面提到了TF-IDF的思想,这里很容易让人联想到:把每一个句子当作文档,每一个句子不容许重复词的状况。2017年学者提出了对w2v训练出的词嵌入进行平滑处理以及出去第一主成分的方案来解决句子向量。针对out of context的状况主要用平滑来解决,针对语义倾斜问题用去除第一主成分来解决。总结起来,这个方案就是:.net
这个方案出来后,让人很吃惊,居然这么简单并且超越了以前的siamese lstm,最大的特色是非监督学习。可是任何算法都有局限性,这个方案用在情感分析中是有问题的,由于and,but,no等词在情感分析中是有意义的。原论文链接地址:https://translate.googleusercontent.com/translate_c?depth=1&hl=zh-CN&prev=search&rurl=translate.google.de&sl=en&sp=nmt4&u=https://openreview.net/pdf%3Fid%3DSyK00v5xx&usg=ALkJrhj3hLRTIvvsJmVZz2lRkOljjVNSeA#11blog
另外,文章或者段落的语义表示,这个方案也是有局限的。获取到每一个句子向量后,不可能粗糙地累加起来,由于这不符合人脑神经元对于阅读文字的机制。本人认为最符合的模型应该是attention model。由于人在阅读一篇文章时,顺序地从第一句话开始日后阅读,首先记忆是逐渐消失的,可是有部分重要的词会造成记忆,其他的忽略掉,这些重要的词不断聚集,在这个过程当中不断揣摩文章的中心思想,当遇到中心句时咱们会比较他的上下文与中心句的关联程度,若是大的话,就认为他是中心句,就是这样的不断搜索的过程。而这个过程的解决方案,本人结合了siamese lstm和atttention model,比较符合这个机制。分别构造词级别和句子级别的两个attention model,前者从新获取每一个句子的向量,后者再此基础上获取整个上下文的语义表示,而后把中心句共同引入siamese lstm中,输出类似度得分进行训练。预测时,按照上述人脑的机制,按照时间序列t,把每一个句子看成中心句,用attention model获取上下文,而后计算t时刻的句子与上下文类似度,增长时间序列继续搜索,从中找出类似度最高的句子向量,这个句子就是中心句。这个过程完美地模拟了上述人脑寻找中心句的机制。排序