人机交互系统(2
结合上面的公式,即可算得两个字符串之间的距离是8 + 9 ? 2 × 4 = 9
。显然,字符串之间的距离越小,它们就越接近。当两个字符串完全相等的时候,它们之间的距离就是 0。
常见的如bigram
模型(N=2)和trigram
模型(N=3)。事实上,由于模型复杂度和预测精度的限制,我们很少会考虑 N>3 的模型
3.2 缺陷
参数爆炸式增长
没有考虑词与词之间的联系性
3.3 应用
S=w1,w2,…,wT
它的概率可以表示为:
P(S) = P(w1,w2,w3,…,wt)
公式的含义:“我们”这个词出现后接下来出现的词的概率,即计算
P(都),P(不),P(长),P(的)...
由于其巨大的参数空间,这样一个原始的模型在实际中并没有什么用。我们更多的是采用其简化版本——Ngram 模型:
p(wt|w1,w2,…,wt?1)≈p(wt|wt?n+1,…,wt?1)
四、分布式语义表达(Distributed representation)
Ngram 本质上是将词当做一个个孤立的原子单元(atomic unit
)去处理的。这种处理方式对应到数学上的形式是一个个离散的one-hot
向量(除了一个词典索引的下标对应的方向上是 1 ,其余方向上都是 0)。
例如,对于一个大小为 5 的词典:{“I”, “love”, “nature”, “luaguage”, “processing”},“nature”对应的 one-hot 向量为:[0,0,1,0,0] 。显然,one-hot
向量的维度等于词典的大小。这在动辄上万甚至百万词典的实际应用中,面临着巨大的维度灾难问题(The Curse of Dimensionality
)
能否用一个连续的稠密向量去刻画一个word
的特征呢?
这样,我们不仅可以直接刻画词与词之间的相似度,还可以建立一个从向量到概率的平滑函数模型,使得相似的词向量可以映射到相近的概率空间上。这个稠密连续向量也被称为word
的distributed representation
Distributed representation可
以解决One hot representation
的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。
所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。可以用 n 个维度来表示。
有了用 Distributed Representation 表示的较短的词向量,我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到 2 维,有一个有趣的研究表明,用下图的词向量表示我们的词时,我们可以发现:
可见我们只要得到了词汇表里所有词对应的词向量,那么我们就可以做很多有趣的事情了。不过,怎么训练得到合适的词向量呢?一个很常见的方法是使用神经网络语言模型。
五、Neural Network Language Model
鉴于 Ngram 等模型的不足,2003 年,Bengio 等人发表了一篇开创性的文章:A neural probabilistic language model[4]。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称 NNLM),并首次提出了 word embedding 的概念(虽然没有叫这个名字),从而奠定了包括 word2vec 在内后续研究 word representation learning 的基础。
NNLM[5]模型的基本思想可以概括如下:
假定词表中的每一个 word 都对应着一个连续的特征向量;
假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;同时学习词向量的权重和概率模型里的参数。
首先是一个线性的 Embedding 层。它将输入的 N?1 个 one-hot 词向量,通过一个共享的 D×V 的矩阵 C,映射为 N?1 个分布式的词向量(distributed vector)。其中,V 是词典的大小,D 是 Embedding 向量的维度(一个先验参数)。C 矩阵里存储了要学习的 word vector。
其次是一个简单的前向反馈神经网络 g。它由一个 tanh 隐层和一个 softmax 输出层组成。通过将 Embedding 层输出的 N?1 个词向量映射为一个长度为 V 的概率分布向量,从而对词典中的 word 在输入 context 下的条件概率做出预估。
NNLM 模型的训练其实可以拆分成两个步骤:
用一个简单模型训练出连续的词向量
基于词向量的表达,训练一个连续的 Ngram 神经网络模型
问题:
只能处理定长的序列
训练慢
如果只是想得到 word 的连续特征向量,可以对第二步里的神经网络模型进行简化。于是 Mikolov 在 2013 年一口气推出了两篇 paper,并开源了一款计算词向量的工具——至此,word2vec
横空出世,主角闪亮登场。
对原始的 NNLM 模型做如下改造:
移除前向反馈神经网络中非线性的 hidden layer,直接将中间层的 Embedding layer 与输出层的 softmax layer 连接;
忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个 Embedding layer;
将 Future words 纳入上下文环境
得到的模型称之为 CBOW 模型(Continuous Bag-of-Words Model),也是 word2vec 算法的第一个模型:
从数学上看,CBOW 模型等价于一个词袋模型的向量乘以一个 Embedding 矩阵,从而得到一个连续的 embedding 向量。这也是 CBOW 模型名称的由来。
在 word2vec 出现之前,已经有用神经网络 DNN 来用训练词向量进而处理词与词之间的关系了。采用的方法一般是一个三层的神经网络结构(当然也可以多层),分为输入层,隐藏层和输出层(softmax 层)。
这个模型是如何定义数据的输入和输出呢?一般分为 CBOW(Continuous Bag-of-Words 与 Skip-Gram 两种模型。
CBOW 模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如下面这段话,我们的上下文大小取值为 4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有 8 个,前后各 4 个,这 8 个词是我们模型的输入。由于 CBOW 使用的是词袋模型,因此这 8 个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。
这样我们这个 CBOW 的例子里,我们的输入是 8 个词向量,输出是所有词的 softmax 概率(训练的目标是期望训练样本特定词对应的 softmax 概率最大),对应的 CBOW 神经网络模型输入层有 8 个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过 DNN 的反向传播算法,我们可以求出 DNN 模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某 8 个词对应的最可能的输出中心词时,我们可以通过一次 DNN 前向传播算法并通过 softmax 激活函数找到概率最大的词对应的神经元即可。
Skip-Gram 模型和 CBOW 的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为 4, 特定的这个词"Learning"是我们的输入,而这 8 个上下文词是我们的输出。
这样我们这个 Skip-Gram 的例子里,我们的输入是特定词, 输出是 softmax 概率排前 8 的 8 个词,对应的 Skip-Gram 神经网络模型输入层有 1 个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过 DNN 的反向传播算法,我们可以求出 DNN 模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某 1 个词对应的最可能的 8 个上下文词时,我们可以通过一次 DNN 前向传播算法得到概率大小排前 8 的 softmax 概率对应的神经元所对应的词即可。
七、层次 Softmax(Hierarchical Softmax)
然而,直接对词典里的 V 个词计算相似度并归一化,显然是一件极其耗时的 impossible mission。为此,Mikolov 引入了两种优化算法:层次 Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。
层次 Softmax 的方法最早由 Bengio 在 05 年引入到语言模型中。它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:
其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对 V 个词的概率归一化问题,转化成了对 logV 个词的概率拟合问题。
比如我们有一个训练样本,中心词是 w,它周围上下文共有 2c 个词,记为 context(w)。由于这个中心词 w 的确和 context(w) 相关存在,因此它是一个真实的正例。
通过 Negative Sampling 采样,我们得到 neg 个和 w 不同的中心词 Wi,i=1,2,…neg,这样 context(w) 和 wi 就组成了 neg 个并不真实存在的负例。利用这一个正例和 neg 个负例,我们进行二元逻辑回归,得到负采样对应每个词 wi 对应的模型参数θi,和每个词的词向量。
fastTe
xt[6]是一种 Facebook AI Research 在 16 年开源的一个文本分类器。 其特点就是 fast。相对于其它文本分类模型,如 SVM,Logistic Regression 和 neural network 等模型,fastText 在保持分类效果的同时,大大缩短了训练时间。
FastText 的原理 fastText 方法包含三部分:
模型架构
层次 Softmax
N-gram 特征
评论