词共现矩阵:
import numpy as np
words = ["I", "like", "enjoy","deep" ,"learnig" , "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]])
la = np.linalg
U,s, Vh = la.svd(X,full_matrices=False)
# SVD 降维
import matplotlib.pyplot as plt
for i in range( len (words) ) :
plt.text(U[i,0],U[i,1], words [i])
plt.xlim(-0.8,0.2)
plt.ylim(-0.75,0.75)
plt.show()
NNLM模型
输入层
文本序列长度为N,由前N-1个词决定第N个词。比如:由前3个词,决定第4个词。词库大小假设为V=10W
词向量W:
one-hot矩阵,维度={10W*1},W(t)表示文本的第t个单词的one-hot embedding,比如(0,0,0,1,0)
矩阵C:
词库V大小为10W,C(w)表示词w对应的词向量(特征向量=one hot矩阵),就整个词库而言,存在投影矩阵C{ m * |V| },m表示词向量的维度。
假设每个词都是300维(D=300),那么C={300*10W}==投影矩阵。C*W=300*1,相当于从投影矩阵C中取出来一列,这也就是称之为投影层的原因。
前3个词,会经过三次投射,从矩阵C中抽取处3个{300*1}特征向量,进行拼接后就是{900*1}
隐藏层:
假设隐藏层的词向量维度是{ 500 * 1 },H=500,那么隐藏层和输入层就需要有一个全连接来转换,其主要目的就是将900和500对应起来,完成数据从输入-->隐藏层的传输,连接线上存在一个权重。其中向量矩阵由{900*1}-->{500*1}
输出层:
由于词库大小为10W,故要将{500*1}转为{10W*1},得到词库中每个词的“词向量情况”,因为NNLM的目的是根据前3个词得到第四个词的one-hot(10W*1),之后经过softmax激活函数,将one-hot通过激活函数得到每个词在第四位应该出现的概率值,得到预测值。
每个训练样本的计算复杂度:N*D+N*D*H+H*V(文本序列长度N、投影矩阵维度D、隐藏层维度H、词库大小为V)
.相关参考资料:
https://zh.wikipedia.org/wiki/%E5%8F%8D%E5%90%91%E4%BC%A0%E6%92%AD%E7%AE%97%E6%B3%95
https://zhuanlan.zhihu.com/p/20918580?refer=intelligentunit
https://zhuanlan.zhihu.com/p/21102293?refer=intelligentunit
https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit
Word2vec-浅层的神经网络模型
两种网络结构分别是CBOW和Skip-gram
CBOW(连续词袋)
“我喜欢学习机器学习!”,jieba分词后为:“我/ 喜欢/ 学习/ 机器学习!”
CBOW主要用于通过“我”+“喜欢”+“机器学习”来预测中间的“学习”。
NNLM模型中,分词向量之间通过“拼接”的手段,“我”={300*1}、“喜欢”={300*1}、“机器学习”={300*1}。将会拼接成{900*1}向量。
CBOW模型中,分词向量之间通过“求和sum”后平均的手段,去掉了NNLM模型中的隐藏层,直接到达输出层进行softmax激活函数来归一化。
但是呢?最终得到的10W有点大,我们需要将10W再弄得小一点,方法有:1、层次化。2、负例采样。
CBOW:负例采样
词表大小为10W,最终得到概率向量{ 10W * 1 },比如1个正样本,10W-1个负样本,我们可以只取出部分的负样本来进行计算。如何选择呢?
线段长度为1,区间【0,1】划分为10^8等分,根据分词列表中词频大小的不同得到不同权重,权重的大小与分配到的的等分线段数量成正比。
在后面的采样过程中,每次随机生成一个【1,M-1】间的整数,取出对应线条区间中的那个词。如果落在正样本线条间,那就选择新的随机数。
Skip-Gram模型
隐藏层、投影层也可忽略、每个词向量作为log-linear里训练
Word2Vec存在的问题
1、对每个local context window单独训练,没有利用包含在global co-currence矩阵中的统计信息
2、对多义词无法很好的表示和处理,因为使用了唯一的词向量
比如:Apple说的是“苹果”水果,还是“苹果”公司。
总结:
离散表示
One-hot representation, Bag Of Words Unigram语言模型
N-gram词向量表示和语言模型
Co-currence矩阵的行(列)向量作为词向量
分布式连续表示
Co-currence矩阵的SVD降维的低维词向量表示
Word2Vec: Continuous Bag of Words Model
Word2Vec: Skip-Gram Model