词向量(one-hot/SVD/NNLM/Word2Vec/GloVe)

词向量简介

无论是是机器学习还是深度学习在处理不同任务时都需要对对象进行向量化表示,词向量(Word Vector)或称为词嵌入(Word Embedding)做的事情就是将词表中的单词映射为实数向量。(长文预警)

基于one-hot编码的词向量方法

简单方法就是将词向量用one-hot向量来表征。

在训练词向量之前,我们都有一个包含我们需要的所有词的词表。首先,我们对每个词进行编号,假设词表的长度为n,则对于每一个词的表征向量均为一个n维向量,且只在其对应位置上的值为1,其他位置都是0。

词向量(one-hot/SVD/NNLM/Word2Vec/GloVe)_第1张图片

one-hot向量将每个单词表示为完全独立的实体,这样的表征方法主要有两个问题:

  1. 有序性问题:它无法反映文本的有序性。因为语言并不是一个完全无序的随机序列。比如说,一个字之后只有接特定的字还能组成一个有意义的词,特定的一系列词按特定的顺序组合在一起才能组成一个有意义的句子。
  2. 语义鸿沟:其无法通过词向量来衡量相关词之间的距离关系,即这样的表征方法无法反映词之间的相似程度,因为任意两个向量的距离是相同的。
    $$(w^{hotel})^Tw^{motel}=(w^{hotel})^Tw^{cat}=0$$
  3. 维度灾难:高维情形下将导致数据样本稀疏,距离计算困难,这对下游模型的负担是很重的。
    就这样,我们有了语言模型,语言模型的出现是我得以判断一个句子的合理性的置信度,最经典的就是N-gram模型和神经网络语言模型(Neural Network Language Model)。

统计语言模型

我们从统计语言模型开始,来解决无序性的这个问题。
在自然语言处理中有一个基本问题:如何计算一段文本序列在某种语言下出现的概率? 为什么将其称为一个基本问题呢?在问答系统中,对于一个问题句,如果我们能计算出每个候选句作为答案的概率,则我们只需要选取概率最大的文本作为答案。
统计语言模型给出了这一类问题的一个基本解决框架。对于一段文本序列
$$S=w_1,w_2,...,w_T$$
他们的概率可以表示为:
$$P(S)=P(w_1,w_2,...,w_T)=∏_{t=1}^Tp(w_t|w_1,w_2,...,w_{t−1})$$
即将序列的联合概率转化为一系列条件概率的乘积。这样,要求出一段文本的联合概率,仅需要计算出每个词或者每段文本在给定previous words下的条件概率:
$$p(w_t|w_1,w_2,...,w_{t-1})$$
由于其巨大的参数空间(或说过长的上文文本),这样一个原始的模型在实际中并没有什么用,比如文中的词与文档开头的词并没有什么相关性。我们更多的是仅用之前的n个文本来计算当前文本的条件概率,即我们常说的N-gram模型
$$p(w_t|w_1, w_2, ..., w_{t-1}) \approx p(w_t|w_{t-n+1}, ..., w_{t-1})$$
当我们假设一个词的出现不依赖于其他任何词时,称为unigram;当一个词的出现依赖于上一个词时,我们称为bigram...
我们可以用最大似然法去求解Ngram模型的参数,即等价于去统计每个Ngram的条件词频。事实上,由于模型复杂度和预测精度的限制,我们很少会考虑N>3的模型。

从分布式表征到SVD分解

分布式表征(Distribution)

但是,Ngram模型仍有其局限性。

  1. 由于参数空间的爆炸式增长,它无法处理更长程的context(N>3);
  2. 其次,它虽然可以描述上下文之间的概率关系,但这种处理方式本质的数学的形式仍是一个个离散的one-hot向量,或者说Ngram仅仅解决了文本之间的转移概率的问题,并没有解决文本本身的表征问题。例如,假设我们在训练语料中看到了很多类似“the dog is walking in the bedroom”或是“the cat is running in the bedroom”这样的句子,那么,即使我们看不懂英文,也可以明白“cat”和“dog”(“walking”和“running”)之间是相似的。然而,Ngram模型能描述的只有running出现在“cat”和“dog”之后的概率都很高,但是无法表述“cat”与“dog”是这两个词是相似的。
  3. 我们知道one-hot向量的长度对应于整个词表的长度。在动辄上完甚至上百万的实际应用中,这样的表征方法将面临巨大的维度灾难问题。

我们怎样取解决这样一个维度灾难的问题呢。我们可以这样来思考,one-hot编码方式之所以简单,是因为这样的方式完美地表述了每个对象之间的个性,或者说假设每个对象之间是完全独立的。要描述对象之间的共性,我们只需要将表征对象的维度进行压缩,在较小的空间中用连续的稠密向量来描述每个对象的抽象特征,这个稠密向量的为一个维度对应一个特定的抽象属性。比如说我们要描述100个人的身体素质特征,最简单的方法是对其进行one-hot编码,我们将对每个人得到一个长度为100的向量,但是如果我们用第一维来表示身高,第二维来表示体重,第三维...这样我们可以用长度远远小于100的向量来表征一个人。相似的,我们可以用相同的方法来刻画一段文本的特征,同时,我们还可以建立一个从向量到概率的平滑函数模型,使得相似的词向量可以映射到相近的概率空间上,从而将Ngram模型得到的概率信息也整合到向量之中。这样一个稠密连续向量也就是所谓的词向量的分布式表征。

事实上,这个概念在信息检索(Information Retrieval)领域早就已经被广泛地使用了,当时,这个方法被称为向量空间模型(Vector Space Model,以下简称VSM)。VSM主要基于两个假说:词袋假说(Bag of Words Hypothesis)和分布假说(Distributional Hypothesis)。前者是说,一篇文档的词频(而不是词序)代表了文档的主题;后者是说,上下文环境相似的两个词有着相近的语义。

基于Bag of Words Hypothesis,我们可以构造一个term-document矩阵$A$,矩阵的行$A_i$,:对应词典里的一个word;矩阵的列$A_{:,j}$对应训练语料里的一篇文档;矩阵里的元素$A_{i,j}$代表着word $w_i$ 在文档 $D_j$ 中出现的次数(或频率)。那么,我们就可以提取行向量做为word的语义向量,或者提取列向量作为文档的主题向量。

类似地,我们可以基于Distributional Hypothesis构造一个word-context的矩阵。此时,矩阵的列变成了context里的word,矩阵的元素也变成了一个context窗口里word的共现次数。

后面我们会看到,用SVD算法表征的词向量就是Bag of Words Hypothesis,而word2vec算法是基于Distributional Hypothesis的。

你可能感兴趣的:(算法,python,机器学习,人工智能,深度学习)