本文首发于雷锋网
前言
在NLP领域中,为了能表示人类的语言符号,一般会把这些符号转成一种数学向量形式以方便处理,我们把语言单词嵌入到向量空间中就叫词嵌入(word embedding)。
比如有比较流行的谷歌开源的 word2vec ,它能生成词向量,通过该词向量在一定程度上还可以用来度量词与词之间的相似性。word2vec采用的模型包含了连续词袋模型(CBOW)和Skip-Gram模型,并通过神经网络来训练。
但这篇文章不深入讲 word2vec 的内容,而是看看另外一种词向量生成方式——基于典型相关分析的词向量。
one-hot形式的词向量
说到词向量就必须先看词向量的形式,一般有两类,分别是 one-hot 形式和分布式形式。前面我们说过词向量就是用来表示人类语言的一种数学化的方式,最简单的向量方式即是one-hot形式。
它的处理方式简单粗暴,一般就是统计词库包含的所有V个词,然后将这V个词固定好顺序,然后每个词就可以用一个V维的稀疏向量来表示,向量中只有在该词出现的位置的元素才为1,其它元素全为0。比如下面这几个词,第一个元素为1的表示中国,第六个元素为1的表示美国,第五个元素为1的表示日本。
中国 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]
美国 [0,0,0,0,0,1,0,0,0,……,0,0,0,0,0,0,0]
日本 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
从中可以看到one-hot形式的维数通常会很大,因为词数量一般在10W级别,这会导致训练时难度大大增加,造成维数灾难。另外这么多维只以顺序信息并且只用1和0来表示单词,很浪费空间。再一个是这种方式的任意两个词都是孤立的,没法看出两个词之间的相似性。于是看看有没有改进的方法。
分布式词向量
鉴于one-hot形式词向量的缺点,出现了另外一种词向量表示方式——分布式词向量(distributed word representation)。 分布式词向量则干脆直接用普通的向量来表示词向量,而元素的值为任意实数,该向量的维数可以在事前确定,一般可以为50维或100维。这时的词向量类似如下(这里假设用5维来表示):
中国 [1.25, 0.2, 0.3, 0.5, 0.6]
美国 [0.1, 0.3, 0.5, 0.1, 1.5]
日本 [2.2, 0.2, 0.4, 0.6, 1.0]
其中每个元素的具体数值则由训练来确定。这样一来就克服了在深度学习中可能的维度灾难,而且充分利用了空间,如果使用适当的训练方法训练出来的词向量还可以直接根据两个词之间的距离来计算相似性。
典型相关分析
典型相关分析主要用于分析两组变量之间的关系,通过该方法能有效分析相关关系。
传统简单的分析方式是直接用协方差矩阵,比如我们有两组变量$X=[X_1,X_2,...,X_m]$和$Y=[Y_1,Y_2,...,Y_n]$,那么最原始的方法就是直接计算X和Y的协方差矩阵,矩阵有m*n个值。有了协方差矩阵就得到了两两变量之间的相关性,比如$c_{ij}$就是变量$X_i$和$Y_j$的相关性。但这种方式存在缺点,只考虑了变量之间单个维度之间的相关性,于是可采用经典相关分析改进。
经典相关分析是分别在两组变量中找出第一对线性组合,使他们具有最大相关性;接着再分别在两组变量中找出第二对线性组合,使他们具有第二大的相关性,并且它们分别与本组内的第一线性组合不相关。以此类推找出其他线性组合。
该方法的思想与主成分分析的思想相似,而其本质就是从两组变量中选取若干个有代表性的变量线性组合,用这些线性组合的相关性来表示原来两组变量的相关性。
核心思想
基于典型相关分析的词向量的核心思想,它认为一段文字中某个词的左右两边指定长度的窗口内的词组应该具有关联,也就是说某个词的左边若干单词组成上文,右边若干单词组成下文,从而应该让上下文的关系尽可能紧密。如图,假设窗口大小为2,则 w4 的左右两窗口包含的词组为上下文,类似的 w5 也有对应的上下文,每个词都有一个对应的词向量,那么要做的事就是最大化上下文两个矩阵的协方差。
模型训练
假设我们的语料包含了 n 个单词,表示为{w1,w2,...wn},我们的词典大小为 v,窗口大小为 h,再设词向量的维度为 k。单词左右两边的上下文组成的矩阵我们分别定义为,$L_{n \times vh}$ 和 $R_{n \times vh}$,而整个语料的矩阵定义为$W_{n \times v}$。
现在我们要做的就是找出两个分别能最好代表左边窗口的矩阵 L 和右边窗口矩阵 R 的方向$\Phi _l$和$\Phi _r$,这两个方向应该使得这两个矩阵分别在对应方向上的投影的协方差最大,投影可以看成是在这两个方向保留了两个窗口矩阵的最具代表性的信息。于是最大化目标可以表示为,
$$ \underset {\Phi _l,\Phi _r}{max} \frac{E [ ] }{\sqrt{E [ ^2^2 ] }} $$
其中 E 表示经验期望,另外我们用 $C_{lr}$ 表示矩阵 L 和矩阵 R 的协方差矩阵,用 $C_{ll}$ 表示矩阵 L 和矩阵 L 之间的协方差矩阵,用 $C_{rr}$ 表示矩阵 R 和矩阵 R 之间的协方差矩阵,则有 $C_{lr}=L^TR$,$C_{ll}=L^TL$,$C_{rr}=R^TR$,
通过转换,上述最大化目标的解可以由下面等式给出,
$$ C_{ll}^{-1}C_{lr}C_{rr}^{-1}C_{rl}\Phi_l = \lambda \Phi_l \\ C_{rr}^{-1}C_{rl}C_{ll}^{-1}C_{lr}\Phi_r = \lambda \Phi_r $$
解上述方程,分别取得 k 个最大特征值的特征向量,组成左右窗口两个方向向量$\Phi _L \Phi _R$,它们的结构为(vh × k)。然后将左窗口矩阵 L 和右窗口矩阵 R 分别投影到两个方向向量上,即$S= [L\Phi_lR\Phi_r]$,得到单词对应的隐状态 S 矩阵,S 则是用 k 个最相关的成分来表示单词。最后再对 S 和语料矩阵 W 做典型相关分析,即 CCA(S,W),得到最终的词向量嵌入矩阵,结构为(v × k),此即为用 k 维向量表示原来的 v 个单词,实现词嵌入。
-------------推荐阅读------------
------------------广告时间----------------
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。
欢迎关注: