在自然语言处理任务中,首先需要考虑词如何在计算机中表示。通常,有两种表示方式:one-hotrepresentation和distributionrepresentation。
传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号被称作one-hotrepresentation。one-hotrepresentation把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词。例如:苹果[0,0,0,1,0,0,0,0,0,……]one-hotrepresentation相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。另外,one-hotrepresentation将会导致特征空间非常大,但也带来一个好处,就是在高维空间中,很多应用任务线性可分。
wordembedding指的是将词转化成一种分布式表示,又称词向量。分布式表示将词表示成一个定长的连续的稠密向量。
分布式表示优点:(1)词之间存在相似关系:是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助。(2)包含更多信息:词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能。
本小节来简单介绍词向量的生成技术。生成词向量的方法有很多,这些方法都依照一个思想:任一词的含义可以用它的周边词来表示。生成词向量的方式可分为:基于统计的方法和基于语言模型(languagemodel)的方法。
通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前word的vector。具体来说,我们通过从大量的语料文本中构建一个共现矩阵来定义wordrepresentation。例如,有语料如下:Ilikedeeplearning.IlikeNLP.Ienjoyflying.则其共现矩阵如下:
矩阵定义的词向量在一定程度上缓解了one-hot向量相似度为0的问题,但没有解决数据稀疏性和维度灾难的问题。
既然基于co-occurrence矩阵得到的离散词向量存在着高维和稀疏性的问题,一个自然而然的解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。对2.1.1中矩阵,进行SVD分解,得到矩阵正交矩阵U,对U进行归一化得到矩阵如下:
SVD得到了word的稠密(dense)矩阵,该矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映word间的线性关系。
语言模型生成词向量是通过训练神经网络语言模型NNLM(neuralnetworklanguagemodel),词向量做为语言模型的附带产出。NNLM背后的基本思想是对出现在上下文环境里的词进行预测,这种对上下文环境的预测本质上也是一种对共现统计特征的学习。较著名的采用neuralnetworklanguagemodel生成词向量的方法有:Skip-gram、CBOW、LBL、NNLM、C&W、GloVe等。接下来,以目前使用最广泛CBOW模型为例,来介绍如何采用语言模型生成词向量。
生成word的distributionrepresentation的模型有很多,生成的向量效果差距不大(生成向量的效果更取决于良好的训练数据)。本节以CBOW模型中的层次化的softmax为例,介绍如何采用神经网络生成词向量。CBOW模型是预测上下文已知的情况下,当前词出现的概率。上下文的选取采用窗口方式,即只将当前词窗口范围内的词作为上下文。中心词概率公式如下:P(wt|wt-k,wt-(k-1)…,wt-1,wt+1,wt+2…,wt+k)=P(wt|context)
CBOW采用了一种Hierarchicalsoftmax技术,利用哈夫曼树对词表进行分类,用一连串的二分类来近似多分类。
加入哈夫曼树后,中心词的概率可表示入下:p(w_t│context)=∏(i=1)^k〖p(d_i|q_i,context)〗=∏(i=1)^k〖σ(v_context^T*q_i)〗其中,v_context^T为窗口内词的词向量的加权平均,q_i为结点i的结点向量,σ(*)为神经网络激活函数。从公式中可以看出,中心词的概率是从根节点到词所在的叶节点所走过路径概率的乘积。对中心词概率做极大似然估计,可得到模型的损失函数。损失函数如下:Loss=-Likelihood=-(1-code[j])logσ(v_context^T*q_i)-code[j]log(1-σ(v_context^T*q_i))code[j]为结点j的哈夫曼编码。有了损失函数,就可以通过梯度下降法求得词向量。注意,损失函数中有2个带求参数,分别为〖词向量(v〗_context^T)和结点向量〖(q〗_i)。可以看出,CBOW模型是一个语言模型。在训练好后,语言模型的参数v_context^T作为副产出,得到词向量。
例如,词”苹果”可以指代水果也可以指代苹果手机。在对“苹果”进行训练时,将会对其对应的词向量向两个方向拉伸,进而造成词向量歧义。词向量的歧义将会对词向量的应用效果产生影响。例如,对苹果进行序列标注,指代手机的苹果应打上品牌词标签,而指代水果的苹果对应打上产品词标签。对同一个词打上多种不同的标签而采用同一个词向量,将降低词性标注的效果。通常解决这一问题是对词向量进行聚类,以多个向量来表示同一个词。例如,在RNNs分词项目时,发现字向量的歧义问题将影响分词效果。因此,我按品类对字进行了聚类,得到的聚类效果如下:
左边是颜色中红色的红,可以看出它与其它颜色的距离较近。右边是手机品类红米手机的“红”,可以看到它最相似的词是“小”字,因为在京东的商品title里,手机品类中红米手机和小米手机出现的次数较多,进而使得“红”字和“小”字的语境相似。
还可以利用NNLM方法,将我们感兴趣的其它实体生成向量。例如,我曾利用word2vec将每个sku(商品id)embedding成向量。我们将每个用户某个月购买的母婴类商品按序进行排列做为一条训练样本,例如:
我们利用sku向量做为特征,训练模型预测用户年龄,准确率达90%。
深度学习模型具有比传统模型更强的特征抽取能力。在自然语言处理中,传统统计特征包含的信息量过少,这也一直限制着深度学习在自然语言处理中的应用。词向量由于包含了更丰富的信息,使得深度学习能够处理绝大多数自然语言处理应用。词向量虽然为深度学习在自然语言处理领域带来了希望,但目前词向量仍有许多不完善的地方,例如:虽然知道词向量比统计特征包含更多信息,但并不知道词向量包含了哪些信息(如每维特征代表的意义)。词向量的训练采用无监督方式,不能很好的利用先验信息。词向量是神经网络语言模型的副产物,其损失函数不是由具体应用构建。因此,不是词向量训练的越好,应用效果就越好。
随着词向量研究的深入,这些问题都将会得到解决。深度学习在自然语言处理领域的前景将会更加光明。