0%

字向量的产生

one hot

比如有7个字,红橙黄绿青蓝紫,它们用onehot的表示形式如下:
红:(1,0,0,0,0,0,0)
橙:(0,1,0,0,0,0,0)
黄:(0,0,1,0,0,0,0)
绿:(0,0,0,1,0,0,0)
青:(0,0,0,0,1,0,0)
蓝:(0,0,0,0,0,1,0)
紫:(0,0,0,0,0,0,1)

这是最初的字(词)向量的表示方式,有多少字就需要多少维度,造成维度过高,表示过于稀疏。并且字与字之间的距离都相等,这不符合实际情况,比如,红橙的距离小于红绿的距离,onehot表示法无法体现这一特征,也即缺乏语义信息。

Word2Vec

由于OneHot编码方式的缺陷,所以诞生了诸如Word2Vec这类新的编码算法。
原来的编码是(vocabSize,dimension)。以七色前个字为例,oneHot的编码后的矩阵为H = (2,7),第一个2是输入字的个数,第二个7是一个字表示的维度,在onehot表示方法中也是词汇表中字的总个数。现在通过新的一种办法将字的表示维度降低到3,也就是(2,7)*(7,3)=>(7,3)。这里矩阵(7,3)是参数矩阵,onehot矩阵将会通过这个参数矩阵映射到新的维度中,也是降维。(7,3)第一个位置依然是词汇表字的个数,3表示一个字的表示维度。当然这个3是调控的。

(10000000100000)(w11w12w13w21w22w23w31w32w33w41w42w43w51w52w53w61w62w63w71w72w73)=(w11w12w13w21w22w23)\left(\begin{array}{cccccc} 1&0&0&0&0&0&0 \\ 0&1&0&0&0&0&0 \end{array}\right)\left(\begin{array}{lll} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33} \\ w_{41} & w_{42} & w_{43} \\ w_{51} & w_{52} & w_{53} \\ w_{61} & w_{62} & w_{63} \\ w_{71} & w_{72} & w_{73} \end{array}\right)=\left(\begin{array}{lllll} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \end{array}\right)

到这里,你会发现一个有趣的现象,第一个字映射后的字向量就是参数矩阵的第一行,依此类推,第二个字映射后的字向量就是参数矩阵的第二行。有这样的一种性质存在,矩阵乘法都不用做了,直接都过索引查找参数矩阵就可以了。

到这里也就发现了,其实字向量的获取就是通过语言模型的训练得到的一组参数阵。语言模型的训练有很多种,比如,通过预测前后两句话是否是连续。则模型通过onehot=>全连接参数阵w=>…=>softmax,通过训练这样的一种任务来更新参数阵,最终,参数阵将会承受着表示字向量的任务。

为什么这样表示的字向量可以正确表示字之间的距离。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道