六、特征编码

我们在前面简单讲过一些编码的方法,比如独热向量、tf-idf 值等等,现在我们来介绍各种各样的编码方式,量大管饱。我反正是吃撑了。

1. 词的意义以及关联

我们之前介绍过 WordNet,它使用同义词集合(synset)表示词义,并依据语义关系,包括同义词(synonym)、相似性(similarity,比如 car 和 bike)、相关性(relatedness,比如 car 和 tire)、反义词(antonym)以及情感(connotation),来连接各个词义。除此之外还有各种用于评估语义的数据集,例如 WordSim353 用于评估相似性和相关性,SimLex-999 用于评估更严格的相似性,等等。

还有个语义场(semantic field)的概念,就是涵盖了一整个场景的词语合集,它们之间的相关性会很强,比如 hospital, surgeon, nurse 等等。

2. 词的表示法

独热向量也是我们之前说过的,假如词汇表中有 $V$ 个词,那么每个词都表示成一个 $V$ 维向量,其中只有一个 1,其他都是 0。这个表示法的问题很明显,首先向量太长了,其次完全不展示词与词之间的关联,最后也不能传递语义的信息。

因此我们就会想:那怎么获取一个词的语义信息呢?分布式语义学(distributional semantics)是基于语境来表示单词意义的技术,这基于一个很重要的假设叫 Firth 定律:”You shall know a word by the company it keeps.” 说白了就是,我们要从上下文来获取语义。

分布式语义学的一个重要定义是共现(co-occurrence)。分为一阶共现二阶共现。一阶共现是句子中彼此相邻,比如 read 和 book 是一阶共现的;而二阶共现就是共现的共现,比如 write 和 book 是一阶共现的,因此 read 和 write 是二阶共现。利用这种定义我们构建了词聚类模型,公式是:

\[P(w_i|w_1,\cdots,w_{i-1})\approx P(C(w_i)|C(w_{i-1}))P(w_i|C(w_i))\]

类似于 Bigram 模型,但加入了聚类的概念,$C(w)$ 表示词 $w$ 所属的类别。简单来说,这个公式的意思就是,先根据前一个词的类别 $C(w_{i-1})$ 来预测当前词的类别,再根据当前词的类别预测这个词。这个优化是明显的,因为我们可以把大量词压缩成类别,再在类别里面挑选合适的词。当然问题在于,类别的划分比较麻烦。

把向量表示与分布式语义结合起来,就变成了词向量空间模型(Vector Space Models, VSM)。独热向量当然也属于一种向量空间模型,但是它的缺点我们已经知道了,因此我们的目标就是设计词向量,使得相关的词语距离近一些,并且向量的维度最好也能压低一点。

3. 向量表示

第一个思路就是基于统计的思想。依旧假设词汇表的大小为 $V$,依旧用一个 $V$ 维向量表示一个词,不过这一回向量中不只有一个 1 了,只要在训练句子中,在这个词前后 $w$ 个词出现过的词,我们都标为 1。非常朴实无华的思路。

这个思路的问题依旧明显:谁说的在前后文就一定相关了,还是得赋一定权重的。因此我们定义 $PMI$ 指数(pointwise mutual information),用于衡量两个词同时出现的“意外程度”。公式是:

\[PMI(X,Y)=\log\frac{P(X,Y)}{P(X)P(Y)}\]

其中 $P(X,Y)$ 是指这两个词一起出现的概率。这个值越大就说明两个词越相关。如果把所有负的值都置零,那就叫 PPMI 指数(Positive PMI),比 PMI 指数更常用。这个指数有什么用呢,我们之前说只要在上下文中,就都标为 1,现在用 PPMI 指数就好了。那 $P$ 怎么算呢,只要我们给定一个矩阵,其中每个元素表示两个词同时出现的次数,那么就可以用频率表示概率了。请看下面这个例子:

` ` computer data pinch result sugar
apricot 0 0 1 0 1
pineapple 0 0 1 0 1
digital 2 1 0 1 0
information 1 6 0 4 0

这个表中每个数字表示两个词一块出现的次数,加起来总共有 19 次。然后我们算 PPMI(information, data),首先分子是 $6/19$,其次看两个词单独出现的次数,$P$(information)$=11/19,P$(data)$=7/19$,最后代入公式就好了。

PPMI 指数也可以与拉普拉斯平滑联动,因为 PPMI 会特别奖励出现频次小的组合,因此可以给上述矩阵的所有值全部加一,然后再算。当然我们也能利用这个特性,比如互联网公司会利用它发现网络上的新造词。

有了 PPMI 表示的词向量后,就可以计算两个词的相似度了。在向量的意义上,两个词的相似度可以用夹角表示。因此有 Cosine Similarity:

\[\cos(u,v)=\frac{u^T v}{\|u\|\cdot\|v\|}\]

这个值越接近 1 说明越相似,越接近 0 说明越不相似。

然后是 tf-idf,我们前面讲过了,这里搬过来:

补充一下 tf-idf 值,对于词 $t$ 和文档 $d$,$tf=1+\log_{10}count(t,d)$,其中 $count$ 是词在文档中的出现次数;$idf=\log_{10}(N/DF_t)$,其中 $N$ 是总文档数,$DF_t$ 是出现过词 $t$ 的文档数,tf-idf 值就是上述两个值相乘。

4. 向量压缩

有多种压缩方法,比如 PCA,Factor Analysis,LSA 等等,我们重点讲 LSA(Latent Semantic Analysis)。它利用的是奇异值分解,核心的公式是:

\[A\approx M\cdot\text{diag}(s)\cdot C^T\]

其中 $A$ 是原始的 PPMI 矩阵,$M$ 是词向量,$C$ 是上下文向量,$s$ 是权重。这个公式就是奇异值分解的过程,但是为什么分解出的三个矩阵能够有这样独特的意义呢?我们知道 $A$ 的每行对应着一个词,因此进行分解后,$M$ 的每一行也代表一个词;而 $A$ 的每列对应一个上下文,因此 $C$ 的每一行也对应一个上下文向量。

然而,这样变化以后,每个词的向量长度都等于总词数了,哪里变短了?我们还有一步重要的操作:截断(truncated)。请看下图:

诶?图片怎么不见了?

因为奇异值,也就是权重,是从大到小排列的,所以后面这些权重小的都可以丢掉,只留前面这些,因此就能让向量变短了,每个词向量都变成了 $M$ 的一个行向量。那到底只保留多少维呢,这是个超参数,看着调吧。

这个方法的好处是:

  • 向量映射到了低维空间;
  • 可以处理 $A$ 中的稀疏性甚至噪声;
  • 在相似的上下文中出现的单词有相似的意思,可以在某种程度上处理同义词。

但是:

  • 它仍然是词袋假设,不能处理新词

5. 基于神经网络的 word2vec

Word2vec 有两个模型。

i. CBOW

CBOW(Continuous Bag of Words)的思路是用上下文预测当前词,即求 $p(\text{word}\vert\text{context})$。这个的公式其实和前馈语言模型一模一样:给定前几个词和后几个词,预测中间的词,那么:

\[\begin{align*} &p(w_n|w_{n-2},w_{n-1},w_{n+1},w_{n+2})\\ =&softmax(b+\sum_{j=n-2,j\ne n}^{n+2}m_{w_j}A_j+W\tanh(u+\sum_{j=n-2,j\ne n}^{n+2}m_{w_j}T_j)) \end{align*}\]

ii. Skip-gram Model

完全相反,求的是 $p(\text{context}\vert\text{word})$。公式如下:

\[p(\text{context}=c|\text{word}=w)=\frac{1}{Z_w}\exp c^T w\]

$Z_w$ 其实是个归一项,写全以后是 $\sum_c \exp c^Tw$,因此得把所有的可能的 $c$ 都试一遍,这个计算量是非常大的。

6. 评估词向量

不管你用上面哪种方法,我们都需要评价这个方法的效果。内在评估(Intrinsic Evaluation)直接评估向量本身的质量,比如:

  • 相似度相关性:先计算 Cosine similarity,再利用前面说过的 WordSim353 这种数据对比。
  • 同义词测试:看模型能不能从一堆词里面选出同义词。
  • 类比(analogy):比如 king - man + woman 能不能等于 queen 之类的。

外在评估将 embedding 用到任务里,看效果。

Leave a comment