word representation trivials 有更新!

  |   0 评论   |   175 浏览

以下主要介绍下几个小的知识点:

  • Non-distributed Representation
    1. One-hot Encoding
      • One-hot的优缺点
  • Distributed Representation
    1. 矩阵分解方法
      • 矩阵分解的优缺点
    2. NNLM 以及 word2vec

Non-distributed Representation

One-hot Encoding

最简单的编码方式当然是one hot 形式,每个词独占一个维度,每个词向量 有一个维度是1,其他为0,词向量的维度是vocabulary的长度。
如句子’a dog is not a cat’中,按照one hot encoding,有:

vocab = ('a', 'dog', 'is', 'not', 'cat') 
a = [1, 0, 0, 0, 0]
dog = [0, 1, 0, 0, 0]
is = [0, 0, 1, 0, 0]
not = [0, 0, 0, 1, 0]
cat = [0, 0, 0, 0, 1]

One hot 编码的特点是假设所有的word互相独立,这是一个很强的假设,显然在有些任务中并不合适,如词语相似度方面,dogcat的相似度应当比dognot高,但是在one hot中,他们都是0。

One-hot的优缺点

One hot encoding的优点:

  • 至少让word 有了一个向量表示,让语言可以计算
  • one hot encoding 很稀疏,在一些对稀疏数据友好的问题(如部分分类问题)有比较不错的效果

One hot encoding的缺点:

  • 假设太强,许多NLP task不适用
  • 对大词库的language建模,向量维度太大,难以储存
  • 无法加入新词

在One hot encoding的缺点中,无法加入新词的原因是,一个维度只表达一个word的信息,一个word的信息也只由一个维度表达,满足这个映射特性的word representation叫做Non-distributed Representation, 也叫做Localist Representation。

Distributed Representation

与Non-distributed Representation相对地,有Distributed Representation的概念。Distributed Representation的意思是,描述language的向量是定长的(fix-length),在定长的向量中,一个语义信息可能由多个维度共同决定,一个维度也可能决定着多方面的语义信息。此时,word vector就比较稠密(dense),不再像one-hot encoding一样稀疏。

在这种表示方法下,word vector可以大大缩短向量长度,因此,通常得到Distributed Representation的word vectors的方法也叫做word embedding方法(直译即词嵌入,将word的语义信息嵌入fix-length的向量中)。

矩阵分解方法

以下内容需要线性代数和矩阵分解的相关知识
对推荐系统的矩阵分解算法有了解会更有利于理解这部分内容

Word都出现在document中,应用bag-of-words[5]或者sliding window,可以得到cooccurence matrix,如:
对于如下的三句话的语料:

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning. 有 共现矩阵:

对该共现矩阵进行SVD分解[6][7][8]来降维。
SVD是一个常见的矩阵分解算法,其基本原理如下:

27b5eb000c2342cc8cf8da863bd83e51-image.png

奇异值类似主成分,在实际应用中,往往取top k个奇异值就能够表示绝大部分信息量,因此SVD经常拿来做损失较小的有损压缩:

5c9c8f1792134a2099219b1858d26347-image.png

SVD的几何意义实际上是通过线性变换来找到最能表达矩阵信息的一组正交基,原1n维词向量在取得top k 奇异值后,可以用1k维向量来表示该word,进而实现word embedding的效果。

如果想更深入理解SVD,推荐[6][7][8]三篇文章

用代码来实际跑一下:

import numpy as np  
import matplotlib.pyplot as plt  
la = np.linalg  
words = ["I","like","enjoy","deep","learning","NLP","flying","."]    
X=np.array([[0,2,1,0,0,0,0,0],
            [2,0,0,1,0,1,0,0],
            [1,0,0,0,0,0,1,0],
            [0,1,0,0,1,0,0,0],
            [0,0,0,1,0,0,0,1],
            [0,1,0,0,0,0,0,1],
            [0,0,1,0,0,0,0,1],
            [0,0,0,0,1,1,1,0]])    
U,s,Vh=la.svd(X,full_matrices=False)    
plt.axis([-0.8,0.2,-0.8,0.8])    
for i in xrange(len(words)):  
    plt.text(U[i,0],U[i,1],words[i])  
plt.show()  

结果如图下,可以看到,对三个句子的语料,已经有一点点语义距离的关系在里面了,比如enjoy和like在方向上是一致的,两个动词距离比较接近等等。

矩阵分解的优缺点

矩阵分解方法的优点是:

  • 训练速度很快
  • 能够实现word embedding

其缺点也很明显:

  • 因为仅关注cooccurence,word vector包含的词向量语义信息有限,仅仅能进行词语相似度计算等有限的任务。

NNLM 以及 word2vec

于是发展到了用language model来搞事情的时代。
word vectors是LM的副产品,本来LM是用来做language modeling的。
这个方法出奇的好,因为lm相当于做了sentence粒度的modeling,对词语在语义空间上的建模更充分。
更多的话题不详细展开了,也不是本文重点,注意nnlm和word2vec的几个关键:

  • 求解max log likelihood作为object func
  • pair-wise应用SGD的求解过程

他们的好处是:

  • 有了更多语言学层面的支撑,在更多NLP task上表现更好
  • pair-wise的求解对计算资源很友好

但是,也有一些缺点:

  • context 很小,没有使用全局的cooccur,所以实际上对cooccur的利用很少

评论

发表评论

validate