词向量的来历
Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。Distributed representation的意思是分布式表示,通常被称为“Word Representation”或“Word Embedding”,中文用词向量表示。
One-hot Representation
就是把每个词用一个很长的向量单独表示,这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
例如:苹果=[1000000000]
梨子=[0100000000]
橘子=[0010000000]
每一个词都由一个单独的向量表示,这样表示的优点是:1.扩展了样本特征特征数 2.解决了分类器不好处理离散数据的问题
缺点:向量过于稀疏且没有考虑到文本中的词汇顺序的问题
Distributed representation
Distributed representation是一种既能表示词本身又可以考虑语义距离的词向量表示方法,是一种低维实数向量。是通过
将 word映射到一个新的空间中,并以多维的连续实数向量进行表示叫做“Word Represention” 或 “Word Embedding”。采用低维
空间表示法,不但解决了维数灾难问题,并且挖掘了word之间的关联属性,从而提高了向量语义上的准确度。表现形式为:[0.712 ,-0.115, 0.321,-0.014.....]
例如上面二维向量图中的词向量,king - man +woman = queen。
神经语言网络模型
神经网络语言模型可以用来训练文本得到词向量,以下为几种神经网络语言模型:
1.Neural Network Language Model ,NNLM
2.Log-Bilinear Language Model, LBL
3.Recurrent Neural Network based Language Model,RNNLM
4.Collobert 和 Weston 在2008 年提出的 C&W 模型
5.Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型
神经语言模型与CBOW、Skip-gram
word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量取度量它们之间的关系,挖掘词之间得联系。
在word2vec出现之前,已经有用神经网络DNN来用训练词向量进而处理词与词之间的关系。此方法是:用一个三层的神经网络结构(也可以多层),分为输入层,隐藏层和输出层(softmax层)。
CBOW模型的是输入某一个特征词的上下文相关的词对应的词向量,输出是特定的一个词的词向量。(给出中心词上下文词向量,推出中心词)
比如下面这段话,我们的上下文大小取值为4,特定的这个词是 "Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。
an efficient method for learning high quality distributed vertor
这样这个CBOW的例子里,输入是8个词向量,输出是所有词的softmax 概率(训练的目标是期望训练样本特定词对应的 softmax 概率最大),对应的CBOW神经网络模型输入层有8个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数可以自己指定。通过DNN的反向传播算法,可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某8个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。
Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。(给出中心词,推出中心词上下文词)
此时以上面的句子为例,输入为learning,输出为其余的8个单词。即:输入是特定词,输出是softmax概率排名前八的单词。对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数可以自己指定。一般在实际模型中词向量维度设置越大训练效果越好,大于50以后效果起伏变得不明显。
CBOW和skip-gram的原理图如下:
以上就是基于神经语言模型的CBOW和skip-gram训练模型得到词向量的大致过程,但是这和在word2vec中使用CBOW和skip-gram训练模型得到词向量的过程还是有很多不同的。word2vec为什么不用现成的DNN模型,要继续优化出新方法呢?最主要的问题是DNN模型的这个处理过程非常耗时。词表一般都是百万级别的,这意味着DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。接下来将介绍在word2vec中使用CBOW和skip-gram。
word2vec基础之huffman树
word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。最先优化使用的数据结构是用 Huffman树 来代替隐藏层和输出层的神经元,霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。 而内部节点则起到隐藏层神经元的作用。下面详细介绍一下huffman树相关的概念-
在计算机科学中,树是一种非常重要的非线性数据结构,它的数据元素(树中称为节点)按分支关系组织起来的结构。若干棵树所构成的集合称为森林。树有几个非常重的概念分别为:
路径和路径长度:在一棵树中,从一个节点往下可以达到的孩子或者孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度,若规定根结点的层号为1,则从根结点到第L层结点的路径长度为L-1。
结点的权和带权路径长度:若为树中结点赋予一个具有某种含义的数值,则这个数值称为该节点的权。结点的带权路径长度是指,从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和。
其中经典的树为二叉树,二叉树是每个结点最多有两个子树的有序树,两个子树通常被称为"左子树" 和 “右子树”,定义中的有序是指两个子树有左右之分,顺序不能颠倒。
给定n个权值作为n个叶子结点,构造一颗二叉树,若它的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为Huffman树。
Huffman 树的构造:给定n个权值 { w1, w2, ..., wn} 作为二叉树的n个叶子结点,可通过以下算法来构造 Huffman 树。
(1) 将{w1, w2, ..., wn}看成是有 n棵树的森林 (每棵树仅有一个结点)
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和
(3) 从森林中删除选取的两棵树,并将新树加入森林
(4) 重复 (2),(3)步,直到森林中只剩一棵树为止,该树即为所求的 Huffman 树。
在数据通信中,需要将传送的文字转换成二进制的字符串,用0和1码的不同排列来表示字符,例如需要传送的报文为"AFTER DATA EAR ARE ART AREA",这里用到的字符集为“A, E, R, T, F, D”, 各字母出现的次数为 8,4,5,3,1,1,现在要求为这些字母设计编码。
要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制 (2^3 = 8 > 6), 可分别用 000, 001, 010, 011, 100, 101对 "A, E, R, T, F, D" 进行编码发送,当对方接收报文的时候再按照三位一分进行译码。
显然编码的长度取决于报文中不同字符的个数,若报文中可能出现26个不同的字符,则固定编码长度位 5 ( 2^5 = 32 > 26 )。然而,传送报文时总是希望总长度尽可能短,在实际应用中,各个字符的出现频度或者使用次数时不同的,如A, B, C使用的频率远远高于X, Y, Z,自然会想到设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。
为使不等长编码为前缀编码 (即要求一个字符的编码不能是另一个字符编码的前缀 ),可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度,效果上就是传送报文的最短长度。因此,求传送报文的最短长度问题转化为求字符集中的所有字符作为叶子结点,由字符出现频率作为其权值所产生的 Huffman树的问题。利用 Huffman 树设计的二进制前缀编码,称为 Huffman 编码,它既能满足前缀编码的条件,又能保证报文编码总长最短。
word2vec工具中实际上也有用到Huffman编码的原理,它把训练语料中的词当成叶子结点,其在语料中出现的次数当作权值,通过构造相应的Huffman树来对每一个词进行Huffman编码。
下图给出了前面例子中六个词中Huffman 编码,其中约定(词频较大的)左孩子结点编码为1,(词频较小的)右孩子编码为0,这样一来,"我", “喜欢”, “观看”, “巴西”, “足球”, “世界杯” 这六个词的Huffman编码分别为0, 111, 110, 101, 1001, 和 1000.
注意,到目前为止,关于 Huffman 树和 Huffman 编码,有两个约定:(1) 将权值大的结点作为左孩子结点,权值小的作为右孩子结点;(2) 左孩子结点编码为1, 右孩子结点编码为0. 在word2vec源码中将权值较大的孩子结点编码为1,较小的孩子结点编码为0。
补充下,Word embedding的训练方法大致可以分为两类:一类是无监督或弱监督的预训练;一类是端对端(end to end)的有监督训练。无监督或弱监督的预训练以word2vec和auto-encoder为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的embedding向量。不过因为缺少了任务导向,可能和我们要解决的问题还有一定的距离。因此,我们往往会在得到预训练的embedding向量后,用少量人工标注的样本去fine-tune整个模型。
相比之下,端对端的有监督模型在最近几年里越来越受到人们的关注。与无监督模型相比,端对端的模型在结构上往往更加复杂。同时,也因为有着明确的任务导向,端对端模型学习到的embedding向量也往往更加准确。例如,通过一个embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。
参考内容:1.https://blog.csdn.net/u012052268/article/details/77170517
2.微信公众号:自然语言处理