以下主要介绍下几个小的知识点:
- Non-distributed Representation
- One-hot Encoding
- One-hot 的优缺点
- One-hot Encoding
- Distributed Representation
- 矩阵分解方法
- 矩阵分解的优缺点
- 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 互相独立,这是一个很强的假设,显然在有些任务中并不合适,如词语相似度方面,dog
和 cat
的相似度应当比 dog
和 not
高,但是在 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,如:
对于如下的三句话的语料:
对该共现矩阵进行 SVD 分解[6][7][8]来降维。
SVD 是一个常见的矩阵分解算法,其基本原理如下:
奇异值类似主成分,在实际应用中,往往取 top k 个奇异值就能够表示绝大部分信息量,因此 SVD 经常拿来做损失较小的有损压缩:
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 的利用很少
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于